Merge lp:~dpm/music-app/enable-translations into lp:music-app/trusty
- enable-translations
- Merge into trusty
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Victor Thompson | ||||
Approved revision: | 145 | ||||
Merged at revision: | 223 | ||||
Proposed branch: | lp:~dpm/music-app/enable-translations | ||||
Merge into: | lp:music-app/trusty | ||||
Diff against target: |
758 lines (+545/-14) 14 files modified
.bzrignore (+2/-0) MusicAlbums.qml (+1/-1) MusicArtists.qml (+4/-3) MusicPlaylists.qml (+9/-2) MusicStart.qml (+1/-1) README.translations (+36/-0) debian/changelog (+7/-1) debian/compat (+1/-1) debian/control (+20/-4) debian/rules (+12/-0) music-app.desktop (+0/-1) music-app.qmlproject (+15/-0) po/music-app.pot (+379/-0) po/po.pro (+58/-0) |
||||
To merge this branch: | bzr merge lp:~dpm/music-app/enable-translations | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu Phone Apps Jenkins Bot | continuous-integration | Approve | |
Daniel Holm | Approve | ||
Review via email: mp+187691@code.launchpad.net |
Commit message
Enable the translations infrastructure: expose translations in Launchpad and build/ship them in the Debian package.
Description of the change
Enable the translations infrastructure: expose translations in Launchpad and build/ship them in the Debian package.
Victor Thompson (vthompson) wrote : | # |
David Planella (dpm) wrote : | # |
On Thu, Sep 26, 2013 at 1:58 PM, Victor Thompson
<email address hidden>wrote:
> Looks great. Feel free to update the 'appVersion' property in
> music-app.qml since we'll certainly have time before Jenkins wakes up. (I
> think we're wearing him out--he's due a vacation in October)
>
Done, thanks for the hint. Yeah, it seems Jenkins has gone for a nap, we'll
get fginther to wake him up and make sure he can serve also past October :)
> --
> https:/
> You are the owner of lp:~dpm/music-app/enable-translations.
>
Daniel Holm (danielholm) wrote : | # |
It's time to get this started as well, so thanks for that, David :)
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
FAILED: Autolanding.
More details in the following jenkins job:
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
FAILED: Continuous integration, rev:135
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
FAILED: Continuous integration, rev:136
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Victor Thompson (vthompson) wrote : | # |
David, are these failing because of Autopilot? Did Nicholas or someone turn on Autopilot verification for commits? Tests will be broken until he has a solution to fake out grilo--he was optimistic today...
Also is this branch still needed after who/what pushed commit #132 to this project? Can we do anything for you?
David Planella (dpm) wrote : | # |
Hi Victor,
I meant to talk to Nick yesterday to see what's going on with the tests. Not sure exactly why these were failing, as the only changes in the code were comments. I did update the packaging, though, but those changes were minimal and I tested them to work locally before pushing.
I'll check with him on Monday, as these changes have got no urgency for now.
To give you some context on where the r132 commit comes from: generally, the way translations work in Launchpad is that a music-app.pot file is committed to the code and then LP scans that and exposes the translatable messages from there in the Translations web UI [1]. This is the automated way and it's how the music app is set up.
However, there is a way to do a one-time manual upload of the music-app.pot file and get the translations exposed in the web UI as well. That's what I did: as there is little time available, I opened translations so that translators could do their work without having to wait for this MP to land.
As per the commit on r132, it came from Launchpad: I set up the project so that whenever there are new translations done on the web UI, they will be automatically committed to trunk once a day. I did some translations for Catalan to test the setup after I enabled translations in LP, so that's why you see the po/ca.po being automatically committed by Launchpad.
This branch essentially adds the .pot file to the code, so that it can be imported into Launchpad, and adds support for the Debian package to build the textual po/*.po files we'll get from Launchpad into the binary *.mo message catalogues that are used by gettext and the SDK to load translations at runtime.
So yes, the branch still needs to land in trunk. The README.translations file I included in the MP should also provide more info. For anything else that's not clear, please feel free to ask!
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
FAILED: Continuous integration, rev:137
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
FAILED: Autolanding.
More details in the following jenkins job:
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
David Planella (dpm) wrote : | # |
This one needs merging with trunk after all the other landings that have
been happening. I'll take care of that.
On Wed, Oct 2, 2013 at 6:25 PM, Ubuntu Phone Apps Jenkins Bot <
<email address hidden>> wrote:
> Review: Needs Fixing continuous-
>
> FAILED: Autolanding.
> More details in the following jenkins job:
> http://
> Executed test runs:
> FAILURE:
> http://
> FAILURE:
> http://
> FAILURE:
> http://
> FAILURE:
> http://
>
> --
> https:/
> You are the owner of lp:~dpm/music-app/enable-translations.
>
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
FAILED: Continuous integration, rev:138
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
FAILED: Autolanding.
More details in the following jenkins job:
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
- 139. By David Planella
-
Merge from trunk
- 140. By David Planella
-
Merge from trunk again
- 141. By David Planella
-
Updated translation template
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
PASSED: Continuous integration, rev:141
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 142. By David Planella
-
Some i18n improvements on plurals
- 143. By David Planella
-
Fixed duplicate messages typos
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
PASSED: Continuous integration, rev:143
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 144. By David Planella
-
Merged from trunk
- 145. By David Planella
-
Updated translation template
David Planella (dpm) wrote : | # |
I've rebased to trunk again and updated the translation template. Would someone help with a review and top-approval if appropriate? Thanks!
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
PASSED: Continuous integration, rev:145
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Preview Diff
1 | === modified file '.bzrignore' |
2 | --- .bzrignore 2013-05-14 12:20:03 +0000 |
3 | +++ .bzrignore 2013-10-18 07:11:59 +0000 |
4 | @@ -1,2 +1,4 @@ |
5 | *.qmlproject.user |
6 | |
7 | +.build |
8 | +po/Makefile |
9 | |
10 | === modified file 'MusicAlbums.qml' |
11 | --- MusicAlbums.qml 2013-10-17 01:19:31 +0000 |
12 | +++ MusicAlbums.qml 2013-10-18 07:11:59 +0000 |
13 | @@ -225,7 +225,7 @@ |
14 | anchors.right: parent.right |
15 | anchors.rightMargin: units.gu(1.5) |
16 | elide: Text.ElideRight |
17 | - text: mainpage.year + " | " + albumTracksModel.model.count + i18n.tr(" songs") |
18 | + text: i18n.tr("%1 | %2 song", "%1 | %2 songs", albumTracksModel.model.count).arg(mainpage.year, albumTracksModel.model.count) |
19 | } |
20 | } |
21 | |
22 | |
23 | === modified file 'MusicArtists.qml' |
24 | --- MusicArtists.qml 2013-10-15 23:39:22 +0000 |
25 | +++ MusicArtists.qml 2013-10-18 07:11:59 +0000 |
26 | @@ -144,7 +144,8 @@ |
27 | anchors.right: parent.right |
28 | anchors.rightMargin: units.gu(1.5) |
29 | elide: Text.ElideRight |
30 | - text: Library.getArtistCovers(artist).length + i18n.tr(" albums") // model for number of albums? |
31 | + // model for number of albums? |
32 | + text: i18n.tr("%1 album", "%1 albums", Library.getArtistCovers(artist).length).arg(Library.getArtistCovers(artist).length) |
33 | } |
34 | |
35 | Label { |
36 | @@ -159,7 +160,7 @@ |
37 | anchors.right: parent.right |
38 | anchors.rightMargin: units.gu(1.5) |
39 | elide: Text.ElideRight |
40 | - text: Library.getArtistTracks(artist).length + i18n.tr(" songs") //fix |
41 | + text: i18n.tr("%1 song", "%1 songs", Library.getArtistTracks(artist).length).arg(Library.getArtistTracks(artist).length) |
42 | } |
43 | onFocusChanged: { |
44 | } |
45 | @@ -235,7 +236,7 @@ |
46 | anchors.right: parent.right |
47 | anchors.rightMargin: units.gu(1.5) |
48 | elide: Text.ElideRight |
49 | - text: artistTracksModel.model.count + i18n.tr(" songs") |
50 | + text: i18n.tr("%1 song", "%1 songs", artistTracksModel.model.count).arg(artistTracksModel.model.count) |
51 | } |
52 | Label { |
53 | id: albumArtist |
54 | |
55 | === modified file 'MusicPlaylists.qml' |
56 | --- MusicPlaylists.qml 2013-10-15 23:39:22 +0000 |
57 | +++ MusicPlaylists.qml 2013-10-18 07:11:59 +0000 |
58 | @@ -50,6 +50,7 @@ |
59 | id: removePlaylistDialog |
60 | Dialog { |
61 | id: dialogueRemovePlaylist |
62 | + // TRANSLATORS: this is a title of a dialog with a prompt to delete a playlist |
63 | title: i18n.tr("Are you sure?") |
64 | text: i18n.tr("This will delete your playlist.") |
65 | |
66 | @@ -79,6 +80,7 @@ |
67 | id: editPlaylistDialog |
68 | Dialog { |
69 | id: dialogueEditPlaylist |
70 | + // TRANSLATORS: this is a title of a dialog with a prompt to rename a playlist |
71 | title: i18n.tr("Change name") |
72 | text: i18n.tr("Enter the new name of the playlist.") |
73 | TextField { |
74 | @@ -139,6 +141,8 @@ |
75 | // page for the playlists |
76 | Page { |
77 | id: listspage |
78 | + // TRANSLATORS: this is the name of the playlists page shown in the tab header. |
79 | + // Remember to keep the translation short to fit the screen width |
80 | title: i18n.tr("Playlists") |
81 | |
82 | onVisibleChanged: { |
83 | @@ -237,7 +241,7 @@ |
84 | elide: Text.ElideRight |
85 | fontSize: "x-small" |
86 | height: units.gu(1) |
87 | - text: playlist.count + i18n.tr(" songs") |
88 | + text: i18n.tr("%1 song", "%1 songs", playlist.count).arg(playlist.count) |
89 | } |
90 | // playlist name |
91 | Label { |
92 | @@ -344,6 +348,7 @@ |
93 | anchors.leftMargin: units.gu(0.5) |
94 | color: styleMusic.common.white |
95 | fontSize: "small" |
96 | + // TRANSLATORS: this refers to editing a playlist |
97 | text: i18n.tr("Edit") |
98 | } |
99 | MouseArea { |
100 | @@ -385,6 +390,7 @@ |
101 | anchors.leftMargin: units.gu(0.5) |
102 | color: styleMusic.common.white |
103 | fontSize: "small" |
104 | + // TRANSLATORS: this refers to deleting a playlist |
105 | text: i18n.tr("Delete") |
106 | } |
107 | MouseArea { |
108 | @@ -428,6 +434,7 @@ |
109 | anchors.leftMargin: units.gu(0.5) |
110 | color: styleMusic.common.white |
111 | fontSize: "small" |
112 | + // TRANSLATORS: this refers to sharing a playlist |
113 | text: i18n.tr("Share") |
114 | } |
115 | MouseArea { |
116 | @@ -564,7 +571,7 @@ |
117 | |
118 | Label { |
119 | id: playlistInfoCount |
120 | - text: playlistlist.count + i18n.tr(" songs") |
121 | + text: i18n.tr("%1 song", "%1 songs", playlist.count).arg(playlist.count) |
122 | color: styleMusic.common.white |
123 | fontSize: "medium" |
124 | anchors.left: parent.left |
125 | |
126 | === modified file 'MusicStart.qml' |
127 | --- MusicStart.qml 2013-10-17 00:55:46 +0000 |
128 | +++ MusicStart.qml 2013-10-18 07:11:59 +0000 |
129 | @@ -232,7 +232,7 @@ |
130 | anchors.rightMargin: units.gu(1) |
131 | color: styleMusic.nowPlaying.labelSecondaryColor |
132 | elide: Text.ElideRight |
133 | - text: model.total + i18n.tr(" songs") |
134 | + text: i18n.tr("%1 song", "%1 songs", model.total).arg(model.total) |
135 | fontSize: "x-small" |
136 | } |
137 | } |
138 | |
139 | === added file 'README.translations' |
140 | --- README.translations 1970-01-01 00:00:00 +0000 |
141 | +++ README.translations 2013-10-18 07:11:59 +0000 |
142 | @@ -0,0 +1,36 @@ |
143 | +# Updating translations |
144 | + |
145 | +Translations for the Music app happen in [Launchpad Translations][] and |
146 | +are automatically committed daily on the trunk branch in the po/ folder. |
147 | + |
148 | +They are then built and installed as part of the package build, so that |
149 | +developers don't really need to worry about them. |
150 | + |
151 | +However, there is one task that needs to be taken care of: exposing new |
152 | +translatable messages to translators. So whenever you add new translatable |
153 | +messages in the code, make sure to follow these steps: |
154 | + |
155 | + 1. Change directory to the po/ folder: `cd po` |
156 | + 2. Update the translations template: `qmake && make pot` |
157 | + 3. Commit the generated .pot file: `bzr commit -m"Updated translation template"` |
158 | + 4. Push the branch and send a merge proposal as usual |
159 | + |
160 | +And that's it, once the branch lands Launchpad should take care of all the rest! |
161 | + |
162 | +# Behind the scenes |
163 | + |
164 | +Behind the scenes, whenever the po/*.pot file (also known as translations template) |
165 | +is committed to trunk Launchpad reads it and updates the translatable strings |
166 | +exposed in the web UI. This will enable translators to work on the new strings. |
167 | +The translations template contains all translatable strings that have been |
168 | +extracted from the source code files. |
169 | + |
170 | +Launchpad will then store translations in its database and will commit them daily |
171 | +in the form of textual po/*.po files to trunk. The PO files are also usually |
172 | +referred to as the translations files. You'll find a translation file for each |
173 | +language the app has got at least a translated message available for. |
174 | + |
175 | +Translations for core apps follow the standard [gettext format]. |
176 | + |
177 | + [Launchpad Translations]: https://translations.launchpad.net/music-app |
178 | + [gettext format]: https://www.gnu.org/software/gettext/ |
179 | |
180 | === modified file 'debian/changelog' |
181 | --- debian/changelog 2013-10-11 04:22:29 +0000 |
182 | +++ debian/changelog 2013-10-18 07:11:59 +0000 |
183 | @@ -10,6 +10,12 @@ |
184 | |
185 | -- Daniel Holm <d.holmen@gmail.com> Thur, 10 Oct 2013 00:39:50 +0200 |
186 | |
187 | +music-app (0.8) saucy; urgency=low |
188 | + |
189 | + * Added support for building and shipping translations |
190 | + |
191 | + -- David Planella <david.planella@ubuntu.com> Thu, 26 Sep 2013 09:52:47 +0200 |
192 | + |
193 | music-app (0.7) raring; urgency=low |
194 | |
195 | * Now uses mediascanner. |
196 | @@ -24,7 +30,7 @@ |
197 | * Fixed issue with toolbar not showing up in Playlists tab. |
198 | * Clean up and smaller fixes. |
199 | |
200 | - -- Daniel Holm <d.holmen@gmail.com> Tat, 21 Sep 2013 14:41:50 +0200 |
201 | + -- Daniel Holm <d.holmen@gmail.com> Sat, 21 Sep 2013 14:41:50 +0200 |
202 | |
203 | music-app (0.6) raring; urgency=low |
204 | |
205 | |
206 | === modified file 'debian/compat' |
207 | --- debian/compat 2013-05-24 00:33:36 +0000 |
208 | +++ debian/compat 2013-10-18 07:11:59 +0000 |
209 | @@ -1,1 +1,1 @@ |
210 | -8 |
211 | +9 |
212 | |
213 | === modified file 'debian/control' |
214 | --- debian/control 2013-10-16 22:14:53 +0000 |
215 | +++ debian/control 2013-10-18 07:11:59 +0000 |
216 | @@ -1,20 +1,36 @@ |
217 | Source: music-app |
218 | Section: misc |
219 | Priority: extra |
220 | -Maintainer: Michael <mhall119@ubuntu.com> |
221 | -Build-Depends: debhelper (>= 8.0.0) |
222 | +Maintainer: Ubuntu App Cats <ubuntu-touch-coreapps@lists.launchpad.net> |
223 | +Build-Depends: debhelper (>= 9), |
224 | + qtdeclarative5-dev-tools, |
225 | + qt5-default, |
226 | + qtdeclarative5-qtquick2-plugin, |
227 | Standards-Version: 3.9.4 |
228 | Homepage: https://launchpad.net/music-app |
229 | +Vcs-Bzr: https://code.launchpad.net/~music-app-dev/music-app/trunk |
230 | |
231 | Package: music-app |
232 | Architecture: all |
233 | -Depends: ${misc:Depends},grilo-plugins-0.2-mediascanner,qtdeclarative5-qtgrilo0.1,qtdeclarative5-qtpowerd0.1 (>= 0.2~),qtdeclarative5-localstorage-plugin,qtdeclarative5-particles-plugin,qtdeclarative5-qtmultimedia-plugin,qtdeclarative5-qtquick2-plugin,qtdeclarative5-ubuntu-ui-toolkit-plugin|qt-components-ubuntu,qtdeclarative5-window-plugin,qtdeclarative5-xmllistmodel-plugin,${shlibs:Depends},qmlscene |
234 | +Depends: ${misc:Depends}, |
235 | + grilo-plugins-0.2-mediascanner, |
236 | + qtdeclarative5-qtgrilo0.1, |
237 | + qtdeclarative5-qtpowerd0.1 (>= 0.2~), |
238 | + qtdeclarative5-localstorage-plugin, |
239 | + qtdeclarative5-particles-plugin, |
240 | + qtdeclarative5-qtmultimedia-plugin, |
241 | + qtdeclarative5-qtquick2-plugin, |
242 | + qtdeclarative5-ubuntu-ui-toolkit-plugin, |
243 | + qtdeclarative5-window-plugin, |
244 | + qtdeclarative5-xmllistmodel-plugin, |
245 | + qmlscene |
246 | Description: Music player for Ubuntu Touch |
247 | Touch enabled music player for Ubuntu |
248 | |
249 | Package: music-app-autopilot |
250 | Architecture: all |
251 | -Depends: libautopilot-qt, |
252 | +Depends: ${misc:Depends}, |
253 | + libautopilot-qt, |
254 | libqt5test5, |
255 | python-mock, |
256 | music-app (= ${source:Version}), |
257 | |
258 | === modified file 'debian/rules' |
259 | --- debian/rules 2013-10-14 14:24:55 +0000 |
260 | +++ debian/rules 2013-10-18 07:11:59 +0000 |
261 | @@ -11,3 +11,15 @@ |
262 | |
263 | %: |
264 | dh $@ |
265 | + |
266 | +override_dh_install: |
267 | + dh_install --fail-missing |
268 | + appname=music-app; \ |
269 | + for pofile in $(shell find ./po -name "*.po"); do \ |
270 | + pofilename="$${pofile##*/}"; \ |
271 | + langcode="$${pofilename%.*}"; \ |
272 | + localedir="debian/$$appname/usr/share/locale/$$langcode/LC_MESSAGES"; \ |
273 | + mkdir -p $$localedir; \ |
274 | + mofile="$$localedir/$$appname.mo"; \ |
275 | + msgfmt -o $$mofile $$pofile; \ |
276 | + done |
277 | |
278 | === modified file 'music-app.desktop' |
279 | --- music-app.desktop 2013-10-11 15:03:54 +0000 |
280 | +++ music-app.desktop 2013-10-18 07:11:59 +0000 |
281 | @@ -9,4 +9,3 @@ |
282 | StartupNotify=true |
283 | X-Ubuntu-Single-Instance=true |
284 | X-Ubuntu-Touch=true |
285 | -Name[sv_SE]=Musik |
286 | |
287 | === modified file 'music-app.qmlproject' |
288 | --- music-app.qmlproject 2013-06-08 00:56:58 +0000 |
289 | +++ music-app.qmlproject 2013-10-18 07:11:59 +0000 |
290 | @@ -15,6 +15,21 @@ |
291 | ImageFiles { |
292 | directory: "." |
293 | } |
294 | + /* Shows the desktop file in the project view */ |
295 | + Files { |
296 | + filter: "*.desktop" |
297 | + } |
298 | + /* Shows the README files in the project view */ |
299 | + Files { |
300 | + filter: "README*" |
301 | + } |
302 | + /* Shows the translation files and the .pro file used to generate the .pot template */ |
303 | + Files { |
304 | + filter: "*.po*" |
305 | + } |
306 | + Files { |
307 | + filter: "*.pro" |
308 | + } |
309 | /* List of plugin directories passed to QML runtime */ |
310 | // importPaths: [ "../exampleplugin" ] |
311 | } |
312 | |
313 | === added file 'po/music-app.pot' |
314 | --- po/music-app.pot 1970-01-01 00:00:00 +0000 |
315 | +++ po/music-app.pot 2013-10-18 07:11:59 +0000 |
316 | @@ -0,0 +1,379 @@ |
317 | +# SOME DESCRIPTIVE TITLE. |
318 | +# Copyright (C) YEAR Canonical Ltd. |
319 | +# This file is distributed under the same license as the PACKAGE package. |
320 | +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. |
321 | +# |
322 | +#, fuzzy |
323 | +msgid "" |
324 | +msgstr "" |
325 | +"Project-Id-Version: music-app\n" |
326 | +"Report-Msgid-Bugs-To: \n" |
327 | +"POT-Creation-Date: 2013-10-18 09:09+0200\n" |
328 | +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
329 | +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
330 | +"Language-Team: LANGUAGE <LL@li.org>\n" |
331 | +"Language: \n" |
332 | +"MIME-Version: 1.0\n" |
333 | +"Content-Type: text/plain; charset=CHARSET\n" |
334 | +"Content-Transfer-Encoding: 8bit\n" |
335 | +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" |
336 | + |
337 | +#: ../LoginLastFM.qml:41 ../MusicSettings.qml:145 ../MusicSettings.qml:153 |
338 | +msgid "Last.fm" |
339 | +msgstr "" |
340 | + |
341 | +#: ../LoginLastFM.qml:47 |
342 | +msgid "Login to be able to scrobble." |
343 | +msgstr "" |
344 | + |
345 | +#: ../LoginLastFM.qml:55 |
346 | +msgid "Username" |
347 | +msgstr "" |
348 | + |
349 | +#: ../LoginLastFM.qml:65 |
350 | +msgid "Password" |
351 | +msgstr "" |
352 | + |
353 | +#: ../LoginLastFM.qml:87 |
354 | +msgid "Login" |
355 | +msgstr "" |
356 | + |
357 | +#: ../LoginLastFM.qml:94 |
358 | +msgid "Trying to login..." |
359 | +msgstr "" |
360 | + |
361 | +#: ../LoginLastFM.qml:108 |
362 | +msgid "Login Successful" |
363 | +msgstr "" |
364 | + |
365 | +#: ../LoginLastFM.qml:114 |
366 | +msgid "Login Failed" |
367 | +msgstr "" |
368 | + |
369 | +#: ../LoginLastFM.qml:120 |
370 | +msgid "You forgot to set your username and/or password" |
371 | +msgstr "" |
372 | + |
373 | +#: ../MusicAlbums.qml:33 ../music-app.qml:919 |
374 | +msgid "Albums" |
375 | +msgstr "" |
376 | + |
377 | +#: ../MusicAlbums.qml:228 |
378 | +#, qt-format |
379 | +msgid "%1 | %2 song" |
380 | +msgid_plural "%1 | %2 songs" |
381 | +msgstr[0] "" |
382 | +msgstr[1] "" |
383 | + |
384 | +#: ../MusicAlbums.qml:368 ../MusicArtists.qml:429 ../MusicNowPlaying.qml:643 |
385 | +#: ../MusicTracks.qml:279 ../music-app.qml:804 |
386 | +msgid "Add to playlist" |
387 | +msgstr "" |
388 | + |
389 | +#: ../MusicAlbums.qml:386 ../MusicArtists.qml:447 ../MusicNowPlaying.qml:660 |
390 | +#: ../MusicTracks.qml:297 ../MusicaddtoPlaylist.qml:38 ../music-app.qml:815 |
391 | +msgid "Select playlist" |
392 | +msgstr "" |
393 | + |
394 | +#: ../MusicAlbums.qml:414 ../MusicArtists.qml:475 ../MusicNowPlaying.qml:33 |
395 | +#: ../MusicTracks.qml:325 |
396 | +msgid "Queue" |
397 | +msgstr "" |
398 | + |
399 | +#: ../MusicArtists.qml:39 ../music-app.qml:906 |
400 | +msgid "Artists" |
401 | +msgstr "" |
402 | + |
403 | +#: ../MusicArtists.qml:148 |
404 | +#, qt-format |
405 | +msgid "%1 album" |
406 | +msgid_plural "%1 albums" |
407 | +msgstr[0] "" |
408 | +msgstr[1] "" |
409 | + |
410 | +#: ../MusicArtists.qml:163 ../MusicArtists.qml:239 ../MusicPlaylists.qml:244 |
411 | +#: ../MusicPlaylists.qml:574 ../MusicStart.qml:235 |
412 | +#, qt-format |
413 | +msgid "%1 song" |
414 | +msgid_plural "%1 songs" |
415 | +msgstr[0] "" |
416 | +msgstr[1] "" |
417 | + |
418 | +#: ../MusicArtists.qml:190 |
419 | +msgid "Tracks" |
420 | +msgstr "" |
421 | + |
422 | +#. TRANSLATORS: this refers to sharing a playlist |
423 | +#: ../MusicNowPlaying.qml:688 ../MusicPlaylists.qml:438 |
424 | +#: ../MusicPlaylists.qml:719 ../MusicTracks.qml:363 |
425 | +msgid "Share" |
426 | +msgstr "" |
427 | + |
428 | +#. TRANSLATORS: this is a title of a dialog with a prompt to delete a playlist |
429 | +#: ../MusicPlaylists.qml:54 |
430 | +msgid "Are you sure?" |
431 | +msgstr "" |
432 | + |
433 | +#: ../MusicPlaylists.qml:55 |
434 | +msgid "This will delete your playlist." |
435 | +msgstr "" |
436 | + |
437 | +#: ../MusicPlaylists.qml:58 |
438 | +msgid "Remove" |
439 | +msgstr "" |
440 | + |
441 | +#: ../MusicPlaylists.qml:71 ../MusicPlaylists.qml:114 ../music-app.qml:866 |
442 | +msgid "Cancel" |
443 | +msgstr "" |
444 | + |
445 | +#. TRANSLATORS: this is a title of a dialog with a prompt to rename a playlist |
446 | +#: ../MusicPlaylists.qml:84 |
447 | +msgid "Change name" |
448 | +msgstr "" |
449 | + |
450 | +#: ../MusicPlaylists.qml:85 |
451 | +msgid "Enter the new name of the playlist." |
452 | +msgstr "" |
453 | + |
454 | +#: ../MusicPlaylists.qml:96 |
455 | +msgid "Change" |
456 | +msgstr "" |
457 | + |
458 | +#: ../MusicPlaylists.qml:109 |
459 | +msgid "You didn't type in a name." |
460 | +msgstr "" |
461 | + |
462 | +#. TRANSLATORS: this is the name of the playlists page shown in the tab header. |
463 | +#. Remember to keep the translation short to fit the screen width |
464 | +#: ../MusicPlaylists.qml:146 ../music-app.qml:946 |
465 | +msgid "Playlists" |
466 | +msgstr "" |
467 | + |
468 | +#. TRANSLATORS: this refers to editing a playlist |
469 | +#: ../MusicPlaylists.qml:352 ../MusicPlaylists.qml:643 |
470 | +msgid "Edit" |
471 | +msgstr "" |
472 | + |
473 | +#. TRANSLATORS: this refers to deleting a playlist |
474 | +#: ../MusicPlaylists.qml:394 ../MusicPlaylists.qml:680 |
475 | +msgid "Delete" |
476 | +msgstr "" |
477 | + |
478 | +#: ../MusicPlaylists.qml:480 |
479 | +msgid "Playlist" |
480 | +msgstr "" |
481 | + |
482 | +#: ../MusicSettings.qml:30 ../music-app.qml:103 |
483 | +msgid "Settings" |
484 | +msgstr "" |
485 | + |
486 | +#: ../MusicSettings.qml:81 |
487 | +msgid "Equaliser" |
488 | +msgstr "" |
489 | + |
490 | +#: ../MusicSettings.qml:82 |
491 | +msgid "Default" |
492 | +msgstr "" |
493 | + |
494 | +#: ../MusicSettings.qml:83 |
495 | +msgid "Accoustic" |
496 | +msgstr "" |
497 | + |
498 | +#: ../MusicSettings.qml:84 |
499 | +msgid "Classical" |
500 | +msgstr "" |
501 | + |
502 | +#: ../MusicSettings.qml:85 |
503 | +msgid "Electronic" |
504 | +msgstr "" |
505 | + |
506 | +#: ../MusicSettings.qml:86 |
507 | +msgid "Flat" |
508 | +msgstr "" |
509 | + |
510 | +#: ../MusicSettings.qml:87 |
511 | +msgid "Hip Hop" |
512 | +msgstr "" |
513 | + |
514 | +#: ../MusicSettings.qml:88 |
515 | +msgid "Jazz" |
516 | +msgstr "" |
517 | + |
518 | +#: ../MusicSettings.qml:89 |
519 | +msgid "Metal" |
520 | +msgstr "" |
521 | + |
522 | +#: ../MusicSettings.qml:90 |
523 | +msgid "Pop" |
524 | +msgstr "" |
525 | + |
526 | +#: ../MusicSettings.qml:91 |
527 | +msgid "Rock" |
528 | +msgstr "" |
529 | + |
530 | +#: ../MusicSettings.qml:92 |
531 | +msgid "Custom" |
532 | +msgstr "" |
533 | + |
534 | +#: ../MusicSettings.qml:112 |
535 | +msgid "" |
536 | +"Snap to current song \n" |
537 | +"when opening toolbar" |
538 | +msgstr "" |
539 | + |
540 | +#: ../MusicSettings.qml:132 |
541 | +msgid "Accounts" |
542 | +msgstr "" |
543 | + |
544 | +#: ../MusicSettings.qml:146 |
545 | +msgid "Login to scrobble and import playlists" |
546 | +msgstr "" |
547 | + |
548 | +#: ../MusicSettings.qml:169 |
549 | +msgid "Music Streaming" |
550 | +msgstr "" |
551 | + |
552 | +#: ../MusicSettings.qml:179 |
553 | +msgid "Ubuntu One" |
554 | +msgstr "" |
555 | + |
556 | +#: ../MusicSettings.qml:180 |
557 | +msgid "Sign in to stream your cloud music" |
558 | +msgstr "" |
559 | + |
560 | +#: ../MusicSettings.qml:196 |
561 | +msgid "Stream only on Wi-Fi" |
562 | +msgstr "" |
563 | + |
564 | +#: ../MusicSettings.qml:230 |
565 | +msgid "Clean everything!" |
566 | +msgstr "" |
567 | + |
568 | +#: ../MusicStart.qml:32 ../MusicTracks.qml:40 ../music-app.qml:209 |
569 | +#: ../music-app.qml:893 ../.build/music-app.desktop.js:1 |
570 | +msgid "Music" |
571 | +msgstr "" |
572 | + |
573 | +#: ../MusicStart.qml:43 |
574 | +msgid "Recent" |
575 | +msgstr "" |
576 | + |
577 | +#: ../MusicStart.qml:157 |
578 | +msgid "Genres" |
579 | +msgstr "" |
580 | + |
581 | +#: ../MusicToolbar.qml:284 |
582 | +msgid "No songs queued" |
583 | +msgstr "" |
584 | + |
585 | +#: ../MusicToolbar.qml:294 |
586 | +msgid "Tap on a song to start playing" |
587 | +msgstr "" |
588 | + |
589 | +#: ../MusicaddtoPlaylist.qml:160 |
590 | +msgid "New playlist" |
591 | +msgstr "" |
592 | + |
593 | +#: ../music-app.qml:65 |
594 | +msgid "Next" |
595 | +msgstr "" |
596 | + |
597 | +#: ../music-app.qml:66 |
598 | +msgid "Next Track" |
599 | +msgstr "" |
600 | + |
601 | +#: ../music-app.qml:72 |
602 | +msgid "Pause" |
603 | +msgstr "" |
604 | + |
605 | +#: ../music-app.qml:72 |
606 | +msgid "Play" |
607 | +msgstr "" |
608 | + |
609 | +#: ../music-app.qml:74 |
610 | +msgid "Pause Playback" |
611 | +msgstr "" |
612 | + |
613 | +#: ../music-app.qml:74 |
614 | +msgid "Continue or start playback" |
615 | +msgstr "" |
616 | + |
617 | +#: ../music-app.qml:85 |
618 | +msgid "Previous" |
619 | +msgstr "" |
620 | + |
621 | +#: ../music-app.qml:86 |
622 | +msgid "Previous Track" |
623 | +msgstr "" |
624 | + |
625 | +#: ../music-app.qml:91 |
626 | +msgid "Stop" |
627 | +msgstr "" |
628 | + |
629 | +#: ../music-app.qml:92 |
630 | +msgid "Stop Playback" |
631 | +msgstr "" |
632 | + |
633 | +#: ../music-app.qml:97 |
634 | +msgid "Back" |
635 | +msgstr "" |
636 | + |
637 | +#: ../music-app.qml:98 |
638 | +msgid "Go back to last page" |
639 | +msgstr "" |
640 | + |
641 | +#: ../music-app.qml:104 |
642 | +msgid "Music Settings" |
643 | +msgstr "" |
644 | + |
645 | +#: ../music-app.qml:112 |
646 | +msgid "Quit" |
647 | +msgstr "" |
648 | + |
649 | +#: ../music-app.qml:113 |
650 | +msgid "Close application" |
651 | +msgstr "" |
652 | + |
653 | +#: ../music-app.qml:252 |
654 | +msgid "Debug: " |
655 | +msgstr "" |
656 | + |
657 | +#: ../music-app.qml:790 |
658 | +msgid "Add to queue" |
659 | +msgstr "" |
660 | + |
661 | +#: ../music-app.qml:828 |
662 | +msgid "New Playlist" |
663 | +msgstr "" |
664 | + |
665 | +#: ../music-app.qml:829 |
666 | +msgid "Name your playlist." |
667 | +msgstr "" |
668 | + |
669 | +#: ../music-app.qml:832 |
670 | +msgid "Name" |
671 | +msgstr "" |
672 | + |
673 | +#: ../music-app.qml:840 |
674 | +msgid "Create" |
675 | +msgstr "" |
676 | + |
677 | +#: ../music-app.qml:855 |
678 | +msgid "Error: " |
679 | +msgstr "" |
680 | + |
681 | +#: ../music-app.qml:860 |
682 | +msgid "Error: You didn't type a name." |
683 | +msgstr "" |
684 | + |
685 | +#: ../music-app.qml:932 |
686 | +msgid "Songs" |
687 | +msgstr "" |
688 | + |
689 | +#: ../common/LoadingSpinnerComponent.qml:43 |
690 | +msgid "Loading..." |
691 | +msgstr "" |
692 | + |
693 | +#: ../common/SwipeDelete.qml:60 ../common/SwipeDelete.qml:81 |
694 | +msgid "Clear" |
695 | +msgstr "" |
696 | |
697 | === added file 'po/po.pro' |
698 | --- po/po.pro 1970-01-01 00:00:00 +0000 |
699 | +++ po/po.pro 2013-10-18 07:11:59 +0000 |
700 | @@ -0,0 +1,58 @@ |
701 | +## This .pro file is used to create a Makefile with the necessary rules |
702 | +## to create an initial translations template and to update it whenever |
703 | +## there are new translatable strings in the project that are ready to be |
704 | +## exposed to translators |
705 | +## |
706 | +## See the ../README.translations file for more information |
707 | + |
708 | +TEMPLATE = subdirs |
709 | + |
710 | +PROJECTNAME = $$system(basename ../*.qmlproject) |
711 | +PROJECTNAME = $$replace(PROJECTNAME,.qmlproject,) |
712 | + |
713 | +DESKTOPFILE = ../$${PROJECTNAME}.desktop |
714 | + |
715 | +SOURCECODE = ../*.qml \ |
716 | + ../*.js \ |
717 | + ../common/*.qml |
718 | + |
719 | +BUILDDIR = ../.build |
720 | +DESKTOPFILETEMP = $${BUILDDIR}/$${PROJECTNAME}.desktop.js |
721 | + |
722 | +message("") |
723 | +message(" Project Name: $$PROJECTNAME ") |
724 | +message(" Source Code: $$SOURCECODE ") |
725 | +message("") |
726 | +message(" Run 'make pot' to generate the pot file from source code. ") |
727 | +message("") |
728 | + |
729 | +## Generate pot file 'make pot' |
730 | +potfile.target = pot |
731 | +potfile.commands = xgettext \ |
732 | + -o $${PROJECTNAME}.pot \ |
733 | + --copyright=\"Canonical Ltd. \" \ |
734 | + --package-name $${PROJECTNAME} \ |
735 | + --qt --c++ --add-comments=TRANSLATORS \ |
736 | + --keyword=tr --keyword=tr:1,2 \ |
737 | + $${SOURCECODE} $${DESKTOPFILETEMP} |
738 | +potfile.depends = desktopfile |
739 | +QMAKE_EXTRA_TARGETS += potfile |
740 | + |
741 | +## Do not use this rule directly. It's a dependency rule to |
742 | +## generate an intermediate .js file to extract translatable |
743 | +## strings from the .desktop file |
744 | +desktopfile.target = desktopfile |
745 | +desktopfile.commands = awk \'BEGIN { FS=\"=\" }; /Name/ {print \"var s = i18n.tr(\42\" \$$2 \"\42);\"}\' $${DESKTOPFILE} > $${DESKTOPFILETEMP} |
746 | +desktopfile.depends = makebuilddir |
747 | +QMAKE_EXTRA_TARGETS += desktopfile |
748 | + |
749 | +## Dependency rule to create the temporary build dir |
750 | +makebuilddir.target = makebuilddir |
751 | +makebuilddir.commands = mkdir -p $${BUILDDIR} |
752 | +QMAKE_EXTRA_TARGETS += makebuilddir |
753 | + |
754 | +## Rule to clean the products of the build |
755 | +clean.target = clean |
756 | +clean.commands = rm -Rf $${BUILDDIR} |
757 | +QMAKE_EXTRA_TARGETS += clean |
758 | + |
Looks great. Feel free to update the 'appVersion' property in music-app.qml since we'll certainly have time before Jenkins wakes up. (I think we're wearing him out--he's due a vacation in October)