i18n support

This commit is contained in:
David Sansome 2010-02-23 18:33:09 +00:00
parent 3975234566
commit e117b7eb15
30 changed files with 2365 additions and 138 deletions

View File

@ -8,7 +8,7 @@ About::About(QWidget *parent)
{
ui_.setupUi(this);
setWindowTitle("About " + QCoreApplication::applicationName());
setWindowTitle(tr("About %1").arg(QCoreApplication::applicationName()));
ui_.title->setText(QCoreApplication::applicationName());
ui_.version->setText("Version " + QCoreApplication::applicationVersion());
ui_.version->setText(tr("Version %1").arg(QCoreApplication::applicationVersion()));
}

BIN
src/clementine_el.qm Normal file

Binary file not shown.

724
src/clementine_el.ts Normal file
View File

@ -0,0 +1,724 @@
<!DOCTYPE TS><TS>
<context>
<name>About</name>
<message>
<source>#line {
color: lightgrey;
}
#title {
font-weight: bold;
font-size: 16px;
}
#version {
font-style: italic;
font-size: 10px;
}
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://code.google.com/p/clementine-player/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;http://code.google.com/p/clementine-player/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Authors:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;David Sansome &amp;lt;&lt;a href=&quot;mailto:me@davidsansome.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;me@davidsansome.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Thanks to:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Mark Kretschmann &amp;lt;&lt;a href=&quot;mailto:markey@web.de&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;markey@web.de&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Max Howell &amp;lt;&lt;a href=&quot;mailto:max.howell@methylblue.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;max.howell@methylblue.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;... and all the Amarok contributors&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>About %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Version %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditTagDialog</name>
<message>
<source>Edit track information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Album</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Artist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Genre</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Year</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>QLineEdit {
<byte value="x9"/>background-color: transparent;
}</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[click to edit]</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileView</name>
<message>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileViewList</name>
<message>
<source>Add to playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy to library...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Move to library...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMConfig</name>
<message>
<source>Enter your Last.fm details below:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last.fm username</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last.fm password</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Scrobble tracks that I listen to</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note that you must be a &lt;span style=&quot; font-weight:600;&quot;&gt;paid subscriber&lt;/span&gt; to listen to Last.fm radio from within Clementine.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Authenticating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Authentication failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Your Last.fm credentials were incorrect</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMConfigDialog</name>
<message>
<source>Last,fm</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMService</name>
<message>
<source>Add to playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Play artist radio...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Play tag radio...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure Last.fm...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Recommendations</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Radio Station</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Loved Tracks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Neighbourhood</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Artist radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tag radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Neighbours</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Radio Station</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Loved Tracks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Neighborhood</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Recommended Radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Neighbour Radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Similar Artists to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tag Radio: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid method</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Authentication failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid resource specified</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid session key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid API key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Service offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This stream is for paid subscribers only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last.fm is currently busy, please try again in a few minutes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough content</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough members</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough fans</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough neighbours</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Malformed response</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMStationDialog</name>
<message>
<source>Play Artist or Tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an &lt;b&gt;artist&lt;/b&gt; or &lt;b&gt;tag&lt;/b&gt; to start listening to Last.fm radio.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Artist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tag</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Library</name>
<message>
<source>Various Artists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LibraryConfig</name>
<message>
<source>These folders will be scanned for music to make up your library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add new folder...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add directory...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LibraryConfigDialog</name>
<message>
<source>Music Library</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LibraryView</name>
<message>
<source>Your library is empty!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Click here to add some music</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>Clementine</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Music</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Previous track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Play</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Next track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stop after this track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Entire collection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added today</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added this week</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added within three months</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added this year</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added this month</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Love</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Edit track information...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure Clementine...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>About Clementine...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Shuffle playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure library...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiLoadingIndicator</name>
<message>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading audio engine</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updating library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Getting channels</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading stream</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading Last.fm radio</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OSD</name>
<message>
<source>Paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Playlist finished</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Volume %1%</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Playlist</name>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Artist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Album</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Year</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Genre</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>BPM</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bit rate</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sample rate</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File size</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PlaylistHeader</name>
<message>
<source>Hide...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show section</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RadioPlaylistItem</name>
<message>
<source>Radio service couldn&apos;t be loaded :-(</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Playback</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Music Library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last.fm</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fadeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No fadeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fadeout duration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> ms</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clementine can show a message when the track changes.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Don&apos;t show notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a native desktop notification</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a popup from the system tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Popup duration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> seconds</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SomaFMService</name>
<message>
<source>Add to playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open somafm.com in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Refresh channels</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TrackSlider</name>
<message>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>0:00:00</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

BIN
src/clementine_es.qm Normal file

Binary file not shown.

737
src/clementine_es.ts Normal file
View File

@ -0,0 +1,737 @@
<!DOCTYPE TS><TS>
<defaultcodec>UTF-8</defaultcodec>
<context>
<name>About</name>
<message>
<source>Title</source>
<translation>Título</translation>
</message>
<message>
<source>Version</source>
<translation>Versión</translation>
</message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://code.google.com/p/clementine-player/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;http://code.google.com/p/clementine-player/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Authors:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;David Sansome &amp;lt;&lt;a href=&quot;mailto:me@davidsansome.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;me@davidsansome.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Thanks to:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Mark Kretschmann &amp;lt;&lt;a href=&quot;mailto:markey@web.de&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;markey@web.de&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Max Howell &amp;lt;&lt;a href=&quot;mailto:max.howell@methylblue.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;max.howell@methylblue.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;... and all the Amarok contributors&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://code.google.com/p/clementine-player/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;http://code.google.com/p/clementine-player/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Autores:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;David Sansome &amp;lt;&lt;a href=&quot;mailto:me@davidsansome.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;me@davidsansome.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Gracias a:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Mark Kretschmann &amp;lt;&lt;a href=&quot;mailto:markey@web.de&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;markey@web.de&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Max Howell &amp;lt;&lt;a href=&quot;mailto:max.howell@methylblue.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;max.howell@methylblue.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;... y todos los que contribuyeron con Amarok&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>#line {
color: lightgrey;
}
#title {
font-weight: bold;
font-size: 16px;
}
#version {
font-style: italic;
font-size: 10px;
}
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>About %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Version %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditTagDialog</name>
<message>
<source>Edit track information</source>
<translation>Editar información de la pista</translation>
</message>
<message>
<source>Title</source>
<translation>Título</translation>
</message>
<message>
<source>Album</source>
<translation>Álbum</translation>
</message>
<message>
<source>Artist</source>
<translation>Artista</translation>
</message>
<message>
<source>Genre</source>
<translation>Género</translation>
</message>
<message>
<source>Track</source>
<translation>Pista</translation>
</message>
<message>
<source>Year</source>
<translation>Año</translation>
</message>
<message>
<source>Comment</source>
<translation>Comentario</translation>
</message>
<message>
<source>QLineEdit {
<byte value="x9"/>background-color: transparent;
}</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[click to edit]</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileView</name>
<message>
<source>Form</source>
<translation>Form</translation>
</message>
<message>
<source>...</source>
<translation>...</translation>
</message>
</context>
<context>
<name>FileViewList</name>
<message>
<source>Add to playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy to library...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Move to library...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMConfig</name>
<message>
<source>Enter your Last.fm details below:</source>
<translation>Ingrese su información de Last.fm debajo:</translation>
</message>
<message>
<source>Last.fm username</source>
<translation>Usuario</translation>
</message>
<message>
<source>Last.fm password</source>
<translation>Contraseña</translation>
</message>
<message>
<source>Scrobble tracks that I listen to</source>
<translation>Enviar las pistas que reproduzco</translation>
</message>
<message>
<source>Note that you must be a &lt;span style=&quot; font-weight:600;&quot;&gt;paid subscriber&lt;/span&gt; to listen to Last.fm radio from within Clementine.</source>
<translation>Recuerda que tienes que tener una &lt;span style=&quot; font-weight:600;&quot;&gt;suscripcion paga&lt;/span&gt; para escuchar la radio de Last.fm desde Clementine.</translation>
</message>
<message>
<source>Authenticating...</source>
<translation>Autenticando...</translation>
</message>
<message>
<source>Authentication failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Your Last.fm credentials were incorrect</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMConfigDialog</name>
<message>
<source>Last,fm</source>
<translation>Last.fm</translation>
</message>
</context>
<context>
<name>LastFMService</name>
<message>
<source>Add to playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Play artist radio...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Play tag radio...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure Last.fm...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Recommendations</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Radio Station</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Loved Tracks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Neighbourhood</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Artist radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tag radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Neighbours</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Radio Station</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Loved Tracks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Neighborhood</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Recommended Radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Neighbour Radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Similar Artists to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tag Radio: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid method</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Authentication failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid resource specified</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid session key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid API key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Service offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This stream is for paid subscribers only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last.fm is currently busy, please try again in a few minutes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough content</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough members</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough fans</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough neighbours</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Malformed response</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMStationDialog</name>
<message>
<source>Play Artist or Tag</source>
<translation>Reproducir Artista o Género</translation>
</message>
<message>
<source>Enter an &lt;b&gt;artist&lt;/b&gt; or &lt;b&gt;tag&lt;/b&gt; to start listening to Last.fm radio.</source>
<translation>Ingrese un &lt;b&gt;artista&lt;/b&gt; o &lt;b&gt;género&lt;/b&gt; para escuchar la radio de Last.fm.</translation>
</message>
<message>
<source>Artist</source>
<translation>Artista</translation>
</message>
<message>
<source>Tag</source>
<translation>Género</translation>
</message>
</context>
<context>
<name>Library</name>
<message>
<source>Various Artists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LibraryConfig</name>
<message>
<source>These folders will be scanned for music to make up your library</source>
<translation>Estas carpetas seran analizadas en busca de medios para crear su colección</translation>
</message>
<message>
<source>Add new folder...</source>
<translation>Añadir nueva carpeta...</translation>
</message>
<message>
<source>Remove folder</source>
<translation>Remover carpeta</translation>
</message>
<message>
<source>Add directory...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LibraryConfigDialog</name>
<message>
<source>Music Library</source>
<translation>Colección de Música</translation>
</message>
</context>
<context>
<name>LibraryView</name>
<message>
<source>Your library is empty!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Click here to add some music</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>Clementine</source>
<translation>Clementine</translation>
</message>
<message>
<source>Library</source>
<translation>Colección</translation>
</message>
<message>
<source>Radio</source>
<translation>Radio</translation>
</message>
<message>
<source>Files</source>
<translation>Archivos</translation>
</message>
<message>
<source>Music</source>
<translation>Música</translation>
</message>
<message>
<source>Playlist</source>
<translation>Lista de reproducción</translation>
</message>
<message>
<source>Settings</source>
<translation>Preferencias</translation>
</message>
<message>
<source>Help</source>
<translation>Ayuda</translation>
</message>
<message>
<source>Previous track</source>
<translation>Pista Anterior</translation>
</message>
<message>
<source>Play</source>
<translation>Reproducir</translation>
</message>
<message>
<source>Stop</source>
<translation>Detener</translation>
</message>
<message>
<source>Next track</source>
<translation>Pista siguiente</translation>
</message>
<message>
<source>&amp;Quit</source>
<translation>&amp;Salir</translation>
</message>
<message>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
<message>
<source>Stop after this track</source>
<translation>Detener reproducción al finalizar la pista</translation>
</message>
<message>
<source>Entire collection</source>
<translation>Colección completa</translation>
</message>
<message>
<source>Added today</source>
<translation>Añadido hoy</translation>
</message>
<message>
<source>Added this week</source>
<translation>Añadido la última semana</translation>
</message>
<message>
<source>Added within three months</source>
<translation>Añadido los últimos tres meses</translation>
</message>
<message>
<source>Added this year</source>
<translation>Añadido el último año</translation>
</message>
<message>
<source>Added this month</source>
<translation>Añadido el último mes</translation>
</message>
<message>
<source>Love</source>
<translation>Agregar a Favoritos</translation>
</message>
<message>
<source>Ban</source>
<translation>Quitar de Favoritos</translation>
</message>
<message>
<source>Clear playlist</source>
<translation>Limpiar lista de reproducción</translation>
</message>
<message>
<source>Edit track information...</source>
<translation>Editar información de la pista...</translation>
</message>
<message>
<source>Configure Clementine...</source>
<translation>Configurar Clementine...</translation>
</message>
<message>
<source>About Clementine...</source>
<translation>Sobre Clementine...</translation>
</message>
<message>
<source>Shuffle playlist</source>
<translation>Barajar lista de reproducción</translation>
</message>
<message>
<source>Configure library...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiLoadingIndicator</name>
<message>
<source>Form</source>
<translation></translation>
</message>
<message>
<source>Loading audio engine</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updating library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Getting channels</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading stream</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading Last.fm radio</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OSD</name>
<message>
<source>Paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Playlist finished</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Volume %1%</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Playlist</name>
<message>
<source>Title</source>
<translation type="unfinished">Título</translation>
</message>
<message>
<source>Artist</source>
<translation type="unfinished">Artista</translation>
</message>
<message>
<source>Album</source>
<translation type="unfinished">Álbum</translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Track</source>
<translation type="unfinished">Pista</translation>
</message>
<message>
<source>Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Year</source>
<translation type="unfinished">Año</translation>
</message>
<message>
<source>Genre</source>
<translation type="unfinished">Género</translation>
</message>
<message>
<source>BPM</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bit rate</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sample rate</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File size</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PlaylistHeader</name>
<message>
<source>Hide...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show section</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RadioPlaylistItem</name>
<message>
<source>Radio service couldn&apos;t be loaded :-(</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<source>Settings</source>
<translation>Preferencias</translation>
</message>
<message>
<source>Playback</source>
<translation>Reproducción</translation>
</message>
<message>
<source>Notifications</source>
<translation>Notificaciones</translation>
</message>
<message>
<source>Music Library</source>
<translation>Colección</translation>
</message>
<message>
<source>Last.fm</source>
<translation>Last.fm</translation>
</message>
<message>
<source>Fadeout</source>
<translation>Fundido</translation>
</message>
<message>
<source>No fadeout</source>
<translation>Sin fundido</translation>
</message>
<message>
<source>Fadeout duration</source>
<translation>Duración del fundido</translation>
</message>
<message>
<source> ms</source>
<translation>ms</translation>
</message>
<message>
<source>Clementine can show a message when the track changes.</source>
<translation>Clementine puede mostrar un mensaje cuando la pista cambia.</translation>
</message>
<message>
<source>Don&apos;t show notifications</source>
<translation>No mostrar notificaciones</translation>
</message>
<message>
<source>Show a native desktop notification</source>
<translation>Mostrar la notificacion propia del escritorio</translation>
</message>
<message>
<source>Show a popup from the system tray</source>
<translation>Mostrar la notificación en la bandeja de sistema</translation>
</message>
<message>
<source>Popup duration</source>
<translation>Duracion de la notificación</translation>
</message>
<message>
<source> seconds</source>
<translation>segundos</translation>
</message>
</context>
<context>
<name>SomaFMService</name>
<message>
<source>Add to playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open somafm.com in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Refresh channels</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TrackSlider</name>
<message>
<source>Form</source>
<translation></translation>
</message>
<message>
<source>0:00:00</source>
<translation></translation>
</message>
</context>
</TS>

BIN
src/clementine_ru.qm Normal file

Binary file not shown.

724
src/clementine_ru.ts Normal file
View File

@ -0,0 +1,724 @@
<!DOCTYPE TS><TS>
<context>
<name>About</name>
<message>
<source>#line {
color: lightgrey;
}
#title {
font-weight: bold;
font-size: 16px;
}
#version {
font-style: italic;
font-size: 10px;
}
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://code.google.com/p/clementine-player/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;http://code.google.com/p/clementine-player/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Authors:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;David Sansome &amp;lt;&lt;a href=&quot;mailto:me@davidsansome.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;me@davidsansome.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Thanks to:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Mark Kretschmann &amp;lt;&lt;a href=&quot;mailto:markey@web.de&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;markey@web.de&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Max Howell &amp;lt;&lt;a href=&quot;mailto:max.howell@methylblue.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;max.howell@methylblue.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;... and all the Amarok contributors&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>About %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Version %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditTagDialog</name>
<message>
<source>Edit track information</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Album</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Artist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Genre</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Year</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>QLineEdit {
<byte value="x9"/>background-color: transparent;
}</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[click to edit]</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileView</name>
<message>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>FileViewList</name>
<message>
<source>Add to playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy to library...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Move to library...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMConfig</name>
<message>
<source>Enter your Last.fm details below:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last.fm username</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last.fm password</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Scrobble tracks that I listen to</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Note that you must be a &lt;span style=&quot; font-weight:600;&quot;&gt;paid subscriber&lt;/span&gt; to listen to Last.fm radio from within Clementine.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Authenticating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Authentication failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Your Last.fm credentials were incorrect</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMConfigDialog</name>
<message>
<source>Last,fm</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMService</name>
<message>
<source>Add to playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Play artist radio...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Play tag radio...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure Last.fm...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Recommendations</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Radio Station</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Loved Tracks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>My Neighbourhood</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Artist radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tag radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Neighbours</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Radio Station</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Loved Tracks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Neighborhood</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Recommended Radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Neighbour Radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1&apos;s Library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Similar Artists to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tag Radio: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid method</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Authentication failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid format</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid parameters</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid resource specified</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid session key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Invalid API key</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Service offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>This stream is for paid subscribers only</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last.fm is currently busy, please try again in a few minutes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough content</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough members</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough fans</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Not enough neighbours</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Malformed response</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown error</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LastFMStationDialog</name>
<message>
<source>Play Artist or Tag</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enter an &lt;b&gt;artist&lt;/b&gt; or &lt;b&gt;tag&lt;/b&gt; to start listening to Last.fm radio.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Artist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tag</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Library</name>
<message>
<source>Various Artists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LibraryConfig</name>
<message>
<source>These folders will be scanned for music to make up your library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add new folder...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add directory...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LibraryConfigDialog</name>
<message>
<source>Music Library</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LibraryView</name>
<message>
<source>Your library is empty!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Click here to add some music</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>Clementine</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Radio</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Music</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Previous track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Play</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Next track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stop after this track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Entire collection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added today</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added this week</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added within three months</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added this year</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added this month</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Love</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Edit track information...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure Clementine...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>About Clementine...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Shuffle playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure library...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MultiLoadingIndicator</name>
<message>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading audio engine</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updating library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Getting channels</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading stream</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Loading Last.fm radio</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OSD</name>
<message>
<source>Paused</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Playlist finished</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Volume %1%</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Playlist</name>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Artist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Album</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Track</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Year</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Genre</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>BPM</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Bit rate</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sample rate</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File size</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PlaylistHeader</name>
<message>
<source>Hide...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show section</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hide %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RadioPlaylistItem</name>
<message>
<source>Radio service couldn&apos;t be loaded :-(</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Playback</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Music Library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last.fm</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fadeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No fadeout</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fadeout duration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> ms</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clementine can show a message when the track changes.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Don&apos;t show notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a native desktop notification</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show a popup from the system tray</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Popup duration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> seconds</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SomaFMService</name>
<message>
<source>Add to playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open somafm.com in browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Refresh channels</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TrackSlider</name>
<message>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>0:00:00</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -8,10 +8,10 @@ EditTagDialog::EditTagDialog(QWidget* parent)
{
ui_.setupUi(this);
static const char* kHintText = "[click to edit]";
ui_.album->SetHint(kHintText);
ui_.artist->SetHint(kHintText);
ui_.genre->SetHint(kHintText);
QString hint_text(tr("[click to edit]"));
ui_.album->SetHint(hint_text);
ui_.artist->SetHint(hint_text);
ui_.genre->SetHint(hint_text);
}
bool EditTagDialog::SetSongs(const SongList &s) {
@ -70,7 +70,7 @@ bool EditTagDialog::SetSongs(const SongList &s) {
ui_.genre->setText(genre);
ui_.year->setValue(year);
ui_.filename->setText("Editing " + QString::number(songs.count()) + " tracks");
ui_.filename->setText(tr("Editing %n tracks", "", songs.count()));
}
return true;

View File

@ -9,12 +9,12 @@ FileViewList::FileViewList(QWidget* parent)
: QListView(parent),
menu_(new QMenu(this))
{
menu_->addAction(QIcon(":media-playback-start.png"), "Add to playlist",
menu_->addAction(QIcon(":media-playback-start.png"), tr("Add to playlist"),
this, SLOT(AddToPlaylistSlot()));
menu_->addSeparator();
menu_->addAction(QIcon(":copy.png"), "Copy to library...",
menu_->addAction(QIcon(":copy.png"), tr("Copy to library..."),
this, SLOT(CopyToLibrarySlot()));
menu_->addAction(QIcon(":move.png"),"Move to library...",
menu_->addAction(QIcon(":move.png"), tr("Move to library..."),
this, SLOT(MoveToLibrarySlot()));
}

View File

@ -37,7 +37,7 @@ void LastFMConfig::AuthenticationComplete(bool success) {
ui_.username->setText(lastfm::ws::Username);
ui_.password->clear();
} else {
QMessageBox::warning(this, "Authentication failed", "Your Last.fm credentials were incorrect");
QMessageBox::warning(this, tr("Authentication failed"), tr("Your Last.fm credentials were incorrect"));
}
emit ValidationComplete(success);

View File

@ -14,7 +14,6 @@
const char* LastFMService::kServiceName = "Last.fm";
const char* LastFMService::kSettingsGroup = "Last.fm";
const char* LastFMService::kLoadingText = "Loading Last.fm radio";
const char* LastFMService::kAudioscrobblerClientId = "tng";
const char* LastFMService::kApiKey = "75d20fb472be99275392aefa2760ea09";
const char* LastFMService::kSecret = "d3072b60ae626be12be69448f5c46e70";
@ -38,13 +37,17 @@ LastFMService::LastFMService(QObject* parent)
ReloadSettings();
play_action_ = context_menu_->addAction(QIcon(":media-playback-start.png"), "Add to playlist", this, SLOT(AddToPlaylist()));
remove_action_ = context_menu_->addAction(QIcon(":list-remove.png"), "Remove", this, SLOT(Remove()));
play_action_ = context_menu_->addAction(
QIcon(":media-playback-start.png"), tr("Add to playlist"), this, SLOT(AddToPlaylist()));
remove_action_ = context_menu_->addAction(
QIcon(":list-remove.png"), tr("Remove"), this, SLOT(Remove()));
context_menu_->addSeparator();
add_artist_action_ = context_menu_->addAction(QIcon(":last.fm/icon_radio.png"), "Play artist radio...", this, SLOT(AddArtistRadio()));
add_tag_action_ = context_menu_->addAction(QIcon(":last.fm/icon_tag.png"), "Play tag radio...", this, SLOT(AddTagRadio()));
context_menu_->addAction(QIcon(":configure.png"), "Configure Last.fm...",
this, SLOT(ShowConfig()));
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()));
context_menu_->addAction(
QIcon(":configure.png"), tr("Configure Last.fm..."), this, SLOT(ShowConfig()));
remove_action_->setEnabled(false);
add_artist_action_->setEnabled(false);
@ -89,27 +92,27 @@ void LastFMService::LazyPopulate(RadioItem *item) {
switch (item->type) {
case RadioItem::Type_Service:
// Normal radio types
CreateStationItem(Type_MyRecommendations, "My Recommendations", ":last.fm/recommended_radio.png", item);
CreateStationItem(Type_MyRadio, "My Radio Station", ":last.fm/personal_radio.png", item);
CreateStationItem(Type_MyLoved, "My Loved Tracks", ":last.fm/loved_radio.png", item);
CreateStationItem(Type_MyNeighbourhood, "My Neighbourhood", ":last.fm/neighbour_radio.png", item);
CreateStationItem(Type_MyRecommendations, tr("My Recommendations"), ":last.fm/recommended_radio.png", item);
CreateStationItem(Type_MyRadio, tr("My Radio Station"), ":last.fm/personal_radio.png", item);
CreateStationItem(Type_MyLoved, tr("My Loved Tracks"), ":last.fm/loved_radio.png", item);
CreateStationItem(Type_MyNeighbourhood, tr("My Neighbourhood"), ":last.fm/neighbour_radio.png", item);
// Types that have children
artist_list_ = new RadioItem(this, Type_ArtistRadio, "Artist radio", item);
artist_list_ = new RadioItem(this, Type_ArtistRadio, tr("Artist radio"), item);
artist_list_->icon = QIcon(":last.fm/icon_radio.png");
artist_list_->lazy_loaded = true;
tag_list_ = new RadioItem(this, Type_TagRadio, "Tag radio", item);
tag_list_ = new RadioItem(this, Type_TagRadio, tr("Tag radio"), item);
tag_list_->icon = QIcon(":last.fm/icon_tag.png");
tag_list_->lazy_loaded = true;
RestoreList("artists", Type_Artist, QIcon(":last.fm/icon_radio.png"), artist_list_);
RestoreList("tags", Type_Tag, QIcon(":last.fm/icon_tag.png"), tag_list_);
friends_list_ = new RadioItem(this, Type_MyFriends, "Friends", item);
friends_list_ = new RadioItem(this, Type_MyFriends, tr("Friends"), item);
friends_list_->icon = QIcon(":last.fm/my_friends.png");
neighbours_list_ = new RadioItem(this, Type_MyNeighbours, "Neighbours", item);
neighbours_list_ = new RadioItem(this, Type_MyNeighbours, tr("Neighbours"), item);
neighbours_list_->icon = QIcon(":last.fm/my_neighbours.png");
if (!IsAuthenticated())
@ -129,11 +132,11 @@ void LastFMService::LazyPopulate(RadioItem *item) {
case Type_OtherUser:
CreateStationItem(Type_OtherUserRadio, item->key, ":last.fm/recommended_radio.png", item)
->display_text = item->key + "'s Radio Station";
->display_text = tr("%1's Radio Station").arg(item->key);
CreateStationItem(Type_OtherUserLoved, item->key, ":last.fm/loved_radio.png", item)
->display_text = item->key + "'s Loved Tracks";
->display_text = tr("%1's Loved Tracks").arg(item->key);
CreateStationItem(Type_OtherUserNeighbourhood, item->key, ":last.fm/neighbour_radio.png", item)
->display_text = item->key + "'s Neighbourhood";
->display_text = tr("%1's Neighborhood").arg(item->key);
break;
default:
@ -232,16 +235,16 @@ QString LastFMService::TitleForItem(const RadioItem* item) const {
const QString me(lastfm::ws::Username);
switch (item->type) {
case Type_MyRecommendations: return me + "'s Recommended Radio";
case Type_MyLoved: return me + "'s Loved Tracks";
case Type_MyNeighbourhood: return me + "'s Neighbour Radio";
case Type_MyRadio: return me + "'s Library";
case Type_MyRecommendations: return tr("%1's Recommended Radio").arg(me);
case Type_MyLoved: return tr("%1's Loved Tracks").arg(me);
case Type_MyNeighbourhood: return tr("%1's Neighbour Radio").arg(me);
case Type_MyRadio: return tr("%1's Library").arg(me);
case Type_OtherUser:
case Type_OtherUserRadio: return item->key + "'s Library";
case Type_OtherUserLoved: return item->key + "'s Loved Tracks";
case Type_OtherUserNeighbourhood: return item->key + "'s Neighbour Radio";
case Type_Artist: return "Similar artists to " + item->key;
case Type_Tag: return "Tag radio: " + item->key;
case Type_OtherUserRadio: return tr("%1's Library").arg(item->key);
case Type_OtherUserLoved: return tr("%1's Loved Tracks").arg(item->key);
case Type_OtherUserNeighbourhood: return tr("%1's Neighbour Radio").arg(item->key);
case Type_Artist: return tr("Similar Artists to %1").arg(item->key);
case Type_Tag: return tr("Tag Radio: %1").arg(item->key);
}
return QString();
}
@ -252,7 +255,7 @@ void LastFMService::StartLoading(const QUrl& url) {
if (!IsAuthenticated())
return;
emit TaskStarted(kLoadingText);
emit TaskStarted(MultiLoadingIndicator::LoadingLastFM);
delete tuner_;
@ -284,7 +287,7 @@ void LastFMService::TunerError(lastfm::ws::Error error) {
if (!initial_tune_)
return;
emit TaskFinished(kLoadingText);
emit TaskFinished(MultiLoadingIndicator::LoadingLastFM);
if (error == lastfm::ws::NotEnoughContent) {
emit StreamFinished();
@ -296,36 +299,36 @@ void LastFMService::TunerError(lastfm::ws::Error error) {
QString LastFMService::ErrorString(lastfm::ws::Error error) const {
switch (error) {
case lastfm::ws::InvalidService: return "Invalid service";
case lastfm::ws::InvalidMethod: return "Invalid method";
case lastfm::ws::AuthenticationFailed: return "Authentication failed";
case lastfm::ws::InvalidFormat: return "Invalid format";
case lastfm::ws::InvalidParameters: return "Invalid parameters";
case lastfm::ws::InvalidResourceSpecified: return "Invalid resource specified";
case lastfm::ws::OperationFailed: return "Operation failed";
case lastfm::ws::InvalidSessionKey: return "Invalid session key";
case lastfm::ws::InvalidApiKey: return "Invalid API key";
case lastfm::ws::ServiceOffline: return "Service offline";
case lastfm::ws::SubscribersOnly: return "This stream is for paid subscribers only";
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 "Last.fm is currently busy, please try again in a few minutes";
case lastfm::ws::TryAgainLater: return tr("Last.fm is currently busy, please try again in a few minutes");
case lastfm::ws::NotEnoughContent: return "Not enough content";
case lastfm::ws::NotEnoughMembers: return "Not enough members";
case lastfm::ws::NotEnoughFans: return "Not enough fans";
case lastfm::ws::NotEnoughNeighbours: return "Not enough neighbours";
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 neighbours");
case lastfm::ws::MalformedResponse: return "Malformed response";
case lastfm::ws::MalformedResponse: return tr("Malformed response");
case lastfm::ws::UnknownError:
default:
return "Unknown error";
return tr("Unknown error");
}
}
void LastFMService::TunerTrackAvailable() {
if (initial_tune_) {
emit TaskFinished(kLoadingText);
emit TaskFinished(MultiLoadingIndicator::LoadingLastFM);
LoadNext(last_url_);
initial_tune_ = false;

View File

@ -21,7 +21,6 @@ class LastFMService : public RadioService {
static const char* kServiceName;
static const char* kSettingsGroup;
static const char* kLoadingText;
static const char* kAudioscrobblerClientId;
static const char* kApiKey;
static const char* kSecret;

View File

@ -118,7 +118,7 @@ LibraryItem* Library::CreateCompilationArtistNode(bool signal) {
beginInsertRows(ItemToIndex(parent), parent->children.count(), parent->children.count());
compilation_artist_node_ =
new LibraryItem(LibraryItem::Type_CompilationArtist, "Various Artists", parent);
new LibraryItem(LibraryItem::Type_CompilationArtist, tr("Various Artists"), parent);
compilation_artist_node_->sort_text = " various";
if (signal)
@ -382,7 +382,7 @@ void Library::Reset() {
QString Library::PrettyArtist(QString artist) const {
if (artist.isEmpty()) {
artist = "Unknown";
artist = tr("Unknown");
}
return artist;
@ -400,7 +400,7 @@ QString Library::SortTextForArtist(QString artist) const {
QString Library::PrettyAlbum(QString album) const {
if (album.isEmpty()) {
album = "Unknown";
album = tr("Unknown");
}
return album;

View File

@ -37,7 +37,7 @@ void LibraryConfig::Add() {
settings.beginGroup(kSettingsGroup);
QString path(settings.value("last_path", QDir::homePath()).toString());
path = QFileDialog::getExistingDirectory(this, "Add directory...", path);
path = QFileDialog::getExistingDirectory(this, tr("Add directory..."), path);
if (!path.isNull()) {
model_->AddDirectory(path);

View File

@ -106,13 +106,13 @@ void LibraryView::paintEvent(QPaintEvent* event) {
QFontMetrics metrics(bold_font);
QRect title_rect(0, image_rect.bottom() + 20, rect.width(), metrics.height());
p.drawText(title_rect, Qt::AlignHCenter, "Your library is empty!");
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, "Click here to add some music");
p.drawText(text_rect, Qt::AlignHCenter, tr("Click here to add some music"));
}
}

View File

@ -10,6 +10,8 @@
#include <QtSingleApplication>
#include <QtDebug>
#include <QLibraryInfo>
#include <QTranslator>
int main(int argc, char *argv[]) {
QCoreApplication::setApplicationName("Clementine");
@ -29,6 +31,17 @@ int main(int argc, char *argv[]) {
// Couldn't send the message so start anyway
}
// Translations
QTranslator qt_translator;
qt_translator.load("qt_" + QLocale::system().name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
a.installTranslator(&qt_translator);
QTranslator clementine_translator;
clementine_translator.load("clementine_" + QLocale::system().name(), ":/translations");
a.installTranslator(&clementine_translator);
// Window
MainWindow w;
a.setActivationWindow(&w);

View File

@ -63,7 +63,7 @@ MainWindow::MainWindow(QWidget *parent)
connect(track_position_timer_, SIGNAL(timeout()), SLOT(UpdateTrackPosition()));
// Start initialising the player
multi_loading_indicator_->TaskStarted("Loading audio engine");
multi_loading_indicator_->TaskStarted(MultiLoadingIndicator::LoadingAudioEngine);
player_->Init();
// Models
@ -187,21 +187,21 @@ MainWindow::MainWindow(QWidget *parent)
QMenu* library_menu = new QMenu(this);
library_menu->addActions(filter_age_group->actions());
library_menu->addSeparator();
library_menu->addAction("Configure library...", library_config_dialog_, SLOT(show()));
library_menu->addAction(tr("Configure library..."), library_config_dialog_, SLOT(show()));
ui_.library_options->setMenu(library_menu);
// Playlist menu
playlist_play_pause_ = playlist_menu_->addAction("Play", this, SLOT(PlaylistPlay()));
playlist_play_pause_ = playlist_menu_->addAction(tr("Play"), this, SLOT(PlaylistPlay()));
playlist_menu_->addAction(ui_.action_stop);
playlist_stop_after_ = playlist_menu_->addAction(QIcon(":media-playback-stop.png"), "Stop after this track", this, SLOT(PlaylistStopAfter()));
playlist_stop_after_ = playlist_menu_->addAction(QIcon(":media-playback-stop.png"), tr("Stop after this track"), this, SLOT(PlaylistStopAfter()));
playlist_menu_->addAction(ui_.action_edit_track);
playlist_menu_->addSeparator();
playlist_menu_->addAction(ui_.action_clear_playlist);
playlist_menu_->addAction(ui_.action_shuffle);
// Radio connections
connect(radio_model_, SIGNAL(TaskStarted(QString)), multi_loading_indicator_, SLOT(TaskStarted(QString)));
connect(radio_model_, SIGNAL(TaskFinished(QString)), multi_loading_indicator_, SLOT(TaskFinished(QString)));
connect(radio_model_, SIGNAL(TaskStarted(MultiLoadingIndicator::TaskType)), multi_loading_indicator_, SLOT(TaskStarted(MultiLoadingIndicator::TaskType)));
connect(radio_model_, SIGNAL(TaskFinished(MultiLoadingIndicator::TaskType)), multi_loading_indicator_, SLOT(TaskFinished(MultiLoadingIndicator::TaskType)));
connect(radio_model_, SIGNAL(StreamError(QString)), SLOT(ReportError(QString)));
connect(radio_model_, SIGNAL(StreamFinished()), player_, SLOT(NextItem()));
connect(radio_model_, SIGNAL(StreamReady(QUrl,QUrl)), player_, SLOT(StreamReady(QUrl,QUrl)));
@ -296,7 +296,7 @@ void MainWindow::MediaStopped() {
ui_.action_stop->setEnabled(false);
ui_.action_stop_after_this_track->setEnabled(false);
ui_.action_play_pause->setIcon(QIcon(":media-playback-start.png"));
ui_.action_play_pause->setText("Play");
ui_.action_play_pause->setText(tr("Play"));
ui_.action_play_pause->setEnabled(true);
@ -312,7 +312,7 @@ void MainWindow::MediaPaused() {
ui_.action_stop->setEnabled(true);
ui_.action_stop_after_this_track->setEnabled(true);
ui_.action_play_pause->setIcon(QIcon(":media-playback-start.png"));
ui_.action_play_pause->setText("Play");
ui_.action_play_pause->setText(tr("Play"));
ui_.action_play_pause->setEnabled(true);
@ -323,7 +323,7 @@ void MainWindow::MediaPlaying() {
ui_.action_stop->setEnabled(true);
ui_.action_stop_after_this_track->setEnabled(true);
ui_.action_play_pause->setIcon(QIcon(":media-playback-pause.png"));
ui_.action_play_pause->setText("Pause");
ui_.action_play_pause->setText(tr("Pause"));
ui_.action_play_pause->setEnabled(
! (player_->GetCurrentItemOptions() & PlaylistItem::PauseDisabled));
@ -478,10 +478,10 @@ void MainWindow::PlaylistRightClick(const QPoint& global_pos, const QModelIndex&
playlist_menu_index_ = index;
if (playlist_->current_index() == index.row() && player_->GetState() == Engine::Playing) {
playlist_play_pause_->setText("Pause");
playlist_play_pause_->setText(tr("Pause"));
playlist_play_pause_->setIcon(QIcon(":media-playback-pause.png"));
} else {
playlist_play_pause_->setText("Play");
playlist_play_pause_->setText(tr("Play"));
playlist_play_pause_->setIcon(QIcon(":media-playback-start.png"));
}
@ -547,13 +547,13 @@ void MainWindow::EditTracks() {
}
void MainWindow::LibraryScanStarted() {
multi_loading_indicator_->TaskStarted("Updating library");
multi_loading_indicator_->TaskStarted(MultiLoadingIndicator::UpdatingLibrary);
}
void MainWindow::LibraryScanFinished() {
multi_loading_indicator_->TaskFinished("Updating library");
multi_loading_indicator_->TaskFinished(MultiLoadingIndicator::UpdatingLibrary);
}
void MainWindow::PlayerInitFinished() {
multi_loading_indicator_->TaskFinished("Loading audio engine");
multi_loading_indicator_->TaskFinished(MultiLoadingIndicator::LoadingAudioEngine);
}

View File

@ -6,18 +6,18 @@ MultiLoadingIndicator::MultiLoadingIndicator(QWidget *parent)
ui_.setupUi(this);
}
void MultiLoadingIndicator::TaskStarted(const QString &name) {
if (tasks_.contains(name))
void MultiLoadingIndicator::TaskStarted(TaskType type) {
if (tasks_.contains(type))
return;
tasks_ << name;
tasks_ << type;
UpdateText();
show();
}
void MultiLoadingIndicator::TaskFinished(const QString &name) {
tasks_.removeAll(name);
void MultiLoadingIndicator::TaskFinished(TaskType type) {
tasks_.removeAll(type);
UpdateText();
if (tasks_.count() == 0)
@ -26,10 +26,8 @@ void MultiLoadingIndicator::TaskFinished(const QString &name) {
void MultiLoadingIndicator::UpdateText() {
QStringList strings;
foreach (QString task, tasks_) {
if (task.isEmpty())
continue;
foreach (TaskType type, tasks_) {
QString task(TaskTypeToString(type));
task[0] = task[0].toLower();
strings << task;
}
@ -41,3 +39,15 @@ void MultiLoadingIndicator::UpdateText() {
ui_.text->setText(text + "...");
}
QString MultiLoadingIndicator::TaskTypeToString(TaskType type) {
switch (type) {
case LoadingAudioEngine: return tr("Loading audio engine");
case UpdatingLibrary: return tr("Updating library");
case GettingChannels: return tr("Getting channels");
case LoadingStream: return tr("Loading stream");
case LoadingLastFM: return tr("Loading Last.fm radio");
default: return QString::null;
}
}

View File

@ -11,17 +11,26 @@ class MultiLoadingIndicator : public QWidget {
public:
MultiLoadingIndicator(QWidget* parent = 0);
enum TaskType {
LoadingAudioEngine,
UpdatingLibrary,
GettingChannels,
LoadingStream,
LoadingLastFM,
};
public slots:
void TaskStarted(const QString& name);
void TaskFinished(const QString& name);
void TaskStarted(MultiLoadingIndicator::TaskType type);
void TaskFinished(MultiLoadingIndicator::TaskType type);
private:
void UpdateText();
static QString TaskTypeToString(TaskType type);
private:
Ui::MultiLoadingIndicator ui_;
QStringList tasks_;
QList<TaskType> tasks_;
};
#endif // MULTILOADINGINDICATOR_H

View File

@ -43,15 +43,15 @@ void OSD::SongChanged(const Song &song) {
}
void OSD::Paused() {
ShowMessage(QCoreApplication::applicationName(), "Paused");
ShowMessage(QCoreApplication::applicationName(), tr("Paused"));
}
void OSD::Stopped() {
ShowMessage(QCoreApplication::applicationName(), "Playlist finished");
ShowMessage(QCoreApplication::applicationName(), tr("Playlist finished"));
}
void OSD::VolumeChanged(int value) {
ShowMessage(QCoreApplication::applicationName(), QString("Volume %1%").arg(value));
ShowMessage(QCoreApplication::applicationName(), tr("Volume %1%").arg(value));
}
void OSD::ShowMessage(const QString& summary,

View File

@ -36,20 +36,20 @@ QVariant Playlist::headerData(int section, Qt::Orientation, int role) const {
return QVariant();
switch (section) {
case Column_Title: return "Title";
case Column_Artist: return "Artist";
case Column_Album: return "Album";
case Column_Length: return "Length";
case Column_Track: return "Track";
case Column_Disc: return "Disc";
case Column_Year: return "Year";
case Column_Genre: return "Genre";
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_BPM: return "BPM";
case Column_Bitrate: return "Bit rate";
case Column_Samplerate: return "Sample rate";
case Column_Filename: return "File name";
case Column_Filesize: return "File size";
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_Filesize: return tr("File size");
}
return QVariant();

View File

@ -11,8 +11,8 @@ PlaylistHeader::PlaylistHeader(Qt::Orientation orientation, QWidget* parent)
show_menu_(new QMenu(this)),
show_mapper_(new QSignalMapper(this))
{
hide_action_ = menu_->addAction("Hide...", this, SLOT(HideCurrent()));
QAction* show_action = menu_->addAction("Show section");
hide_action_ = menu_->addAction(tr("Hide..."), this, SLOT(HideCurrent()));
QAction* show_action = menu_->addAction(tr("Show section"));
show_action->setMenu(show_menu_);
connect(show_mapper_, SIGNAL(mapped(int)), SLOT(ToggleVisible(int)));
@ -28,7 +28,7 @@ void PlaylistHeader::contextMenuEvent(QContextMenuEvent* e) {
hide_action_->setVisible(true);
QString title(model()->headerData(menu_section_, Qt::Horizontal).toString());
hide_action_->setText("Hide " + title);
hide_action_->setText(tr("Hide %1").arg(title));
}
show_menu_->clear();

View File

@ -24,8 +24,8 @@ void RadioModel::AddService(RadioService *service) {
sServices[service->name()] = service;
service->CreateRootItem(root_);
connect(service, SIGNAL(TaskStarted(QString)), SIGNAL(TaskStarted(QString)));
connect(service, SIGNAL(TaskFinished(QString)), SIGNAL(TaskFinished(QString)));
connect(service, SIGNAL(TaskStarted(MultiLoadingIndicator::TaskType)), SIGNAL(TaskStarted(MultiLoadingIndicator::TaskType)));
connect(service, SIGNAL(TaskFinished(MultiLoadingIndicator::TaskType)), SIGNAL(TaskFinished(MultiLoadingIndicator::TaskType)));
connect(service, SIGNAL(StreamReady(QUrl,QUrl)), SIGNAL(StreamReady(QUrl,QUrl)));
connect(service, SIGNAL(StreamFinished()), SIGNAL(StreamFinished()));
connect(service, SIGNAL(StreamError(QString)), SIGNAL(StreamError(QString)));

View File

@ -3,6 +3,7 @@
#include "radioitem.h"
#include "simpletreemodel.h"
#include "multiloadingindicator.h"
class RadioService;
class LastFMService;
@ -36,8 +37,8 @@ class RadioModel : public SimpleTreeModel<RadioItem> {
void ReloadSettings();
signals:
void TaskStarted(const QString&);
void TaskFinished(const QString&);
void TaskStarted(MultiLoadingIndicator::TaskType);
void TaskFinished(MultiLoadingIndicator::TaskType);
void StreamReady(const QUrl& original_url, const QUrl& media_url);
void StreamFinished();
void StreamError(const QString& message);

View File

@ -3,6 +3,7 @@
#include "radiomodel.h"
#include <QSettings>
#include <QApplication>
RadioPlaylistItem::RadioPlaylistItem()
: service_(NULL)
@ -37,7 +38,7 @@ void RadioPlaylistItem::Restore(const QSettings& settings) {
void RadioPlaylistItem::InitMetadata() {
if (!service_)
metadata_.set_title("Radio service couldn't be loaded :-(");
metadata_.set_title(QApplication::translate("RadioPlaylistItem", "Radio service couldn't be loaded :-("));
else if (!title_.isEmpty())
metadata_.set_title(title_);
else

View File

@ -6,6 +6,7 @@
#include <QUrl>
#include "radioitem.h"
#include "multiloadingindicator.h"
class Song;
@ -37,8 +38,8 @@ class RadioService : public QObject {
virtual void ReloadSettings() {}
signals:
void TaskStarted(const QString& name);
void TaskFinished(const QString& name);
void TaskStarted(MultiLoadingIndicator::TaskType);
void TaskFinished(MultiLoadingIndicator::TaskType);
void StreamReady(const QUrl& original_url, const QUrl& media_url);
void StreamFinished();

View File

@ -12,8 +12,6 @@
#include <QtDebug>
const char* SomaFMService::kServiceName = "SomaFM";
const char* SomaFMService::kLoadingChannelsText = "Getting channels";
const char* SomaFMService::kLoadingStreamText = "Loading stream";
const char* SomaFMService::kChannelListUrl = "http://somafm.com/channels.xml";
const char* SomaFMService::kHomepage = "http://somafm.com";
@ -23,10 +21,10 @@ SomaFMService::SomaFMService(QObject* parent)
context_menu_(new QMenu),
network_(new QNetworkAccessManager(this))
{
context_menu_->addAction(QIcon(":media-playback-start.png"), "Add to playlist", this, SLOT(AddToPlaylist()));
context_menu_->addAction(QIcon(":media-playback-start.png"), tr("Add to playlist"), this, SLOT(AddToPlaylist()));
context_menu_->addSeparator();
context_menu_->addAction(QIcon(":web.png"), "Open somafm.com in browser", this, SLOT(Homepage()));
context_menu_->addAction(QIcon(":refresh.png"), "Refresh channels", this, SLOT(RefreshChannels()));
context_menu_->addAction(QIcon(":web.png"), tr("Open somafm.com in browser"), this, SLOT(Homepage()));
context_menu_->addAction(QIcon(":refresh.png"), tr("Refresh channels"), this, SLOT(RefreshChannels()));
}
SomaFMService::~SomaFMService() {
@ -66,12 +64,12 @@ void SomaFMService::StartLoading(const QUrl& url) {
QNetworkReply* reply = network_->get(request);
connect(reply, SIGNAL(finished()), SLOT(LoadPlaylistFinished()));
emit TaskStarted(kLoadingStreamText);
emit TaskStarted(MultiLoadingIndicator::LoadingStream);
}
void SomaFMService::LoadPlaylistFinished() {
QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
emit TaskFinished(kLoadingStreamText);
emit TaskFinished(MultiLoadingIndicator::LoadingStream);
if (reply->error() != QNetworkReply::NoError) {
// TODO: Error handling
@ -99,12 +97,12 @@ void SomaFMService::RefreshChannels() {
QNetworkReply* reply = network_->get(request);
connect(reply, SIGNAL(finished()), SLOT(RefreshChannelsFinished()));
emit TaskStarted(kLoadingChannelsText);
emit TaskStarted(MultiLoadingIndicator::GettingChannels);
}
void SomaFMService::RefreshChannelsFinished() {
QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
emit TaskFinished(kLoadingChannelsText);
emit TaskFinished(MultiLoadingIndicator::GettingChannels);
if (reply->error() != QNetworkReply::NoError) {
// TODO: Error handling

View File

@ -20,8 +20,6 @@ class SomaFMService : public RadioService {
};
static const char* kServiceName;
static const char* kLoadingChannelsText;
static const char* kLoadingStreamText;
static const char* kChannelListUrl;
static const char* kHomepage;

View File

@ -116,18 +116,22 @@ FORMS += mainwindow.ui \
libraryconfigdialog.ui \
lastfmconfigdialog.ui \
about.ui
RESOURCES += ../data/data.qrc
RESOURCES += ../data/data.qrc \
translations.qrc
OTHER_FILES += ../data/schema.sql \
../data/mainwindow.css
RC_FILE += ../dist/windres.rc
TRANSLATIONS = clementine_ru.ts \
clementine_es.ts \
clementine_el.ts
# Xine on unix, phonon on windows
win32|fedora-win32-cross {
win32|fedora-win32-cross {
QT += phonon
SOURCES += phononengine.cpp
HEADERS += phononengine.h
}
!win32:!fedora-win32-cross {
!win32:!fedora-win32-cross {
SOURCES += xine-engine.cpp \
xine-scope.c
HEADERS += xine-engine.h \
@ -161,11 +165,9 @@ win32|fedora-win32-cross:LIBS += -ltag \
-lpthreadGC2
# OSD
unix:!macx:!fedora-win32-cross {
nolibnotify {
SOURCES += osd_win.cpp
}
!nolibnotify {
unix:!macx:!fedora-win32-cross {
nolibnotify:SOURCES += osd_win.cpp
!nolibnotify {
SOURCES += osd_x11.cpp
QMAKE_CXXFLAGS += $$system(pkg-config --cflags libnotify)
LIBS += $$system(pkg-config --libs libnotify)
@ -201,8 +203,8 @@ win32|fedora-win32-cross:SOURCES += ../3rdparty/qtsingleapplication/qtlockedfile
# Hide the console on windows
win32|fedora-win32-cross:LIBS += -Wl,-subsystem,windows
#CONFIG += console
# CONFIG += console
# Installs
target.path = $${install_prefix}/bin/
desktop.path = dummy

7
src/translations.qrc Normal file
View File

@ -0,0 +1,7 @@
<RCC>
<qresource prefix="/translations">
<file>clementine_el.qm</file>
<file>clementine_es.qm</file>
<file>clementine_ru.qm</file>
</qresource>
</RCC>