on xenial help sign in
merge trunk
e1cfe32Andrea Cimitan
CMakeLists.txt+5−2
@@ -64,13 +64,13 @@ if(SHELL_INSTALL_QML STREQUAL "")
64 message(FATAL_ERROR "Could not determine plugin installation dir.")
64 message(FATAL_ERROR "Could not determine plugin installation dir.")
65endif()
65endif()
66
66
67+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
68+
67execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugindir unity-shell-api OUTPUT_VARIABLE SHELL_PLUGINDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
69execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugindir unity-shell-api OUTPUT_VARIABLE SHELL_PLUGINDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
68if(SHELL_PLUGINDIR STREQUAL "")
70if(SHELL_PLUGINDIR STREQUAL "")
69 message(FATAL_ERROR "Could not determine plugin import dir.")
71 message(FATAL_ERROR "Could not determine plugin import dir.")
70endif()
72endif()
71
73
72−set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
73−
74set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-permissive -pedantic -Wall -Wextra")
74set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-permissive -pedantic -Wall -Wextra")
75
75
76if ("${CMAKE_BUILD_TYPE}" STREQUAL "release" OR "${CMAKE_BUILD_TYPE}" STREQUAL "relwithdebinfo")
76if ("${CMAKE_BUILD_TYPE}" STREQUAL "release" OR "${CMAKE_BUILD_TYPE}" STREQUAL "relwithdebinfo")
@@ -87,6 +87,9 @@ endif()
87# "signals" and "slots"
87# "signals" and "slots"
88add_definitions(-DQT_NO_KEYWORDS)
88add_definitions(-DQT_NO_KEYWORDS)
89
89
90+# Save a few container detach and conversions
91+add_definitions(-DQT_STRICT_ITERATORS)
92+
90# Tests
93# Tests
91include(CTest)
94include(CTest)
92enable_testing()
95enable_testing()
CODING+4
@@ -154,6 +154,10 @@ So, for the DragHandle component that would be:
154
154
155$ make testDragHandle
155$ make testDragHandle
156
156
157+To run the tests for a single component/class under gdb (so you can catch SEGFAULTS)
158+
159+$ make gdbtestComponentName
160+
157To run a test application that allow you to manually test or to simply try out
161To run a test application that allow you to manually test or to simply try out
158a given component:
162a given component:
159
163
cmake/modules/QmlTest.cmake+8
@@ -12,6 +12,7 @@
12# Two targets will be created:
12# Two targets will be created:
13# - testComponentName - Runs the test with qmltestrunner
13# - testComponentName - Runs the test with qmltestrunner
14# - tryComponentName - Runs the test with uqmlscene, for manual interaction
14# - tryComponentName - Runs the test with uqmlscene, for manual interaction
15+# - gdbtestComponentName - Runs the test with qmltestrunner under gdb
15#
16#
16# To change/set a default value for the whole test suite, prior to calling add_qml_test, set:
17# To change/set a default value for the whole test suite, prior to calling add_qml_test, set:
17# qmltest_DEFAULT_NO_ADD_TEST (default: FALSE)
18# qmltest_DEFAULT_NO_ADD_TEST (default: FALSE)
@@ -81,6 +82,7 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
81 cmake_parse_arguments(qmltest_default "${options}" "" "${multi_value_keywords}" ${qmltest_DEFAULT_PROPERTIES})
82 cmake_parse_arguments(qmltest_default "${options}" "" "${multi_value_keywords}" ${qmltest_DEFAULT_PROPERTIES})
82
83
83 set(qmltest_TARGET test${COMPONENT_NAME})
84 set(qmltest_TARGET test${COMPONENT_NAME})
85+ set(qmltest_gdb_TARGET gdbtest${COMPONENT_NAME})
84 set(qmltest_xvfb_TARGET xvfbtest${COMPONENT_NAME})
86 set(qmltest_xvfb_TARGET xvfbtest${COMPONENT_NAME})
85 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
87 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
86
88
@@ -138,8 +140,14 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
138 ${function_ARGS}
140 ${function_ARGS}
139 )
141 )
140
142
143+ set(qmltest_gdb_command
144+ env ${test_env} ${qmltest_ENVIRONMENT} ${LD_PRELOAD_PATH}
145+ gdb -e ${qmltestrunner_exe} -ex \"run -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml ${qmltestrunner_imports} ${ITERATIONS_STRING}\"
146+ )
147+
141 add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
148 add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
142 add_qmltest_target(${qmltest_xvfb_TARGET} "${qmltest_xvfb_command}" ${qmltest_NO_TARGETS} TRUE)
149 add_qmltest_target(${qmltest_xvfb_TARGET} "${qmltest_xvfb_command}" ${qmltest_NO_TARGETS} TRUE)
150+ add_qmltest_target(${qmltest_gdb_TARGET} "${qmltest_gdb_command}" TRUE TRUE)
143 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
151 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
144endmacro(add_qml_test_internal)
152endmacro(add_qml_test_internal)
145
153
data/unity8.conf+5−1
@@ -34,11 +34,15 @@ pre-start script
34 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
34 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
35 fi
35 fi
36
36
37− # Remove the socket if still there
37+ # Remove the normal and trusted sockets if still there
38 if [ -S "$MIR_SERVER_FILE" ]; then
38 if [ -S "$MIR_SERVER_FILE" ]; then
39 rm "$MIR_SERVER_FILE"
39 rm "$MIR_SERVER_FILE"
40 fi
40 fi
41
41
42+ if [ -S "${MIR_SERVER_FILE}_trusted" ]; then
43+ rm "${MIR_SERVER_FILE}_trusted"
44+ fi
45+
42 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
46 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
43
47
44 initctl emit --no-wait indicator-services-start
48 initctl emit --no-wait indicator-services-start
debian/changelog+138
@@ -1,3 +1,141 @@
1+unity8 (8.00+14.10.20141009.4-0ubuntu1) utopic; urgency=low
2+
3+ [ Michał Sawicz ]
4+ * Rename datetime indicator in test
5+
6+ [ Albert Astals ]
7+ * Close overview temp scope on show dash (LP: #1373819)
8+ * Enable QT_STRICT_ITERATORS
9+ * Make Base not clickable, since we don't use it in anywhere clickable
10+ (we only use it for Category delegates in the LVWPH) (LP: #1300709)
11+ * Hide preview if it was visible when going to a scope (LP: #1374548)
12+ * Remove contentScale variable
13+
14+ [ Andrea Cimitan ]
15+ * Fix card implicitHeight when summary is declared, but its text is
16+ empty. Also fixes vertical journal height and clipping (LP:
17+ #1362160)
18+ * Redesign for pinned apps. Remove thindivider on top of ubuntu dash
19+ button (not needed anymore) (LP: #1377100)
20+
21+ [ Ying-Chun Liu ]
22+ * Fix run_on_device.sh to let it run again.
23+
24+ [ Nick Dedekind ]
25+ * Fixed indicator menu bindings to server toggle value broken by user
26+ interaction. (LP: #1336715)
27+ * Force rendering so we don't get stuck in "waitForRendering" loop in
28+ tests.
29+
30+ [ Daniel d'Andrada ]
31+ * PhoneStage: focus the new topmost app after the current one closes
32+ itself (LP: #1375267)
33+
34+ [ Michael Terry ]
35+ * Fix some security issues with the tablet greeter, which allowed the
36+ lockscreen to be bypassed. (LP: #1367715) (LP: #1367715)
37+
38+ [ Michael Zanetti ]
39+ * scale down errorText label if necessary (LP: #1378848)
40+
41+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 09 Oct 2014 14:05:54 +0000
42+
43+unity8 (8.00+14.10.20141008-0ubuntu1) utopic; urgency=low
44+
45+ [ Michael Zanetti ]
46+ * Dual SIM pin unlocking. Hook up the UI to the backend. (LP:
47+ #1267135)
48+
49+ [ Antti Kaijanmäki ]
50+ * Dual SIM pin unlocking. Hook up the UI to the backend. (LP:
51+ #1267135)
52+
53+ [ Ubuntu daily release ]
54+ * New rebuild forced
55+
56+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 08 Oct 2014 09:41:32 +0000
57+
58+unity8 (8.00+14.10.20141006-0ubuntu1) utopic; urgency=low
59+
60+ [ Andrea Cimitan ]
61+ * Tweak card header to match the spec
62+ * Add preview image slideshow (LP: #1351537)
63+
64+ [ Michał Sawicz ]
65+ * Cache more things in memory, so flicking scopes should be faster
66+ (LP: #1336724)
67+ * Tweak card header to match the spec
68+ * Save texture memory by limiting sourceSize (LP: #1338430)
69+
70+ [ Ying-Chun Liu ]
71+ * Add attributes to Preview. (LP: #1282460)
72+
73+ [ Albert Astals ]
74+ * Update pot
75+ * Cache more things in memory, so flicking scopes should be faster
76+ (LP: #1336724)
77+ * Save texture memory by limiting sourceSize (LP: #1338430)
78+ * Clip the settings list
79+ * Fix unlocking from the left again
80+ * Add wait_ makes tests more reliable
81+
82+ [ Michael Zanetti ]
83+ * fix fading out the launcher instead of sliding it out on left-edge
84+ minimizing an app.
85+ * Make the DashCommunicator async and more flexible to handle a
86+ lifecycle-suspended dash (LP: #1339883)
87+
88+ [ Michael Terry ]
89+ * Retry unlock-device script if it fails, as there is always a risk of
90+ a small race with boot-up. (LP: #1370644)
91+ * Add pull-to-refresh functionality to scopes. (LP: #1368336)
92+
93+ [ CI bot ]
94+ * Resync trunk
95+
96+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 06 Oct 2014 08:03:23 +0000
97+
98+unity8 (8.00+14.10.20140930.2-0ubuntu1) utopic; urgency=low
99+
100+ [ Alexandros Frantzis ]
101+ * Remove stale trusted socket before starting unity8 from upstart (LP:
102+ #1371597) (LP: #1371597)
103+
104+ [ CI bot ]
105+ * Resync trunk
106+
107+ [ Andrea Cimitan ]
108+ * Move activity indicator on top of keyboard (LP: #1354519)
109+
110+ [ Gerry Boland ]
111+ * Cleanup: Remove unused member and fix small syntax error in
112+ OrientationLock
113+
114+ [ josharenson ]
115+ * Fix lp:1367894 by correcting how the minute value is calculated in
116+ the panel. (LP: #1367894)
117+
118+ [ Nick Dedekind ]
119+ * Fixed DefaultIndicatorPage test. Fixed warnings from test.
120+
121+ [ Ying-Chun Liu ]
122+ * Remove maxLineCount in preview. (LP: 1328513) (LP: #1328513)
123+
124+ [ Michael Terry ]
125+ * Fix some code that accidentally landed in trunk before it got
126+ cleaned up. The current code just has some duplication to it that
127+ should be unified.
128+ * Implement latest visual designs for passphrase lockscreen.
129+ * Make it easier to use the Lockscreen component from the welcome
130+ wizard.
131+ * Limit how much memory we reserve for the greeter background image,
132+ allowing giant images to appear correctly.
133+
134+ [ Daniel d'Andrada ]
135+ * Add gdbTestComponentName build targets
136+
137+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 30 Sep 2014 16:57:28 +0000
138+
1unity8 (8.00+14.10.20140926-0ubuntu1) utopic; urgency=low
139unity8 (8.00+14.10.20140926-0ubuntu1) utopic; urgency=low
2
140
3 [ CI bot ]
141 [ CI bot ]
debian/control+1−1
@@ -25,7 +25,7 @@ Build-Depends: cmake,
25 libpulse-dev,
25 libpulse-dev,
26 libqmenumodel-dev (>= 0.2.8),
26 libqmenumodel-dev (>= 0.2.8),
27 libqt5xmlpatterns5-dev,
27 libqt5xmlpatterns5-dev,
28− libunity-api-dev (>= 7.91),
28+ libunity-api-dev (>= 7.92),
29 libusermetricsoutput1-dev,
29 libusermetricsoutput1-dev,
30 libxcb1-dev,
30 libxcb1-dev,
31 pkg-config,
31 pkg-config,
debian/unity8-private.install+1
@@ -1,3 +1,4 @@
1+usr/lib/*/libunity8-private.*
1usr/lib/*/unity8/qml/AccountsService
2usr/lib/*/unity8/qml/AccountsService
2usr/lib/*/unity8/qml/Dash
3usr/lib/*/unity8/qml/Dash
3usr/lib/*/unity8/qml/HudClient
4usr/lib/*/unity8/qml/HudClient
plugins/Dash/CardAttributes.qml+1−1
@@ -59,7 +59,7 @@ GridLayout {
59 text: "value" in modelData && modelData["value"] || "";
59 text: "value" in modelData && modelData["value"] || "";
60 elide: Text.ElideRight
60 elide: Text.ElideRight
61 maximumLineCount: 1
61 maximumLineCount: 1
62− font.weight: "style" in modelData && modelData["style"] == "highlighted" ? Font.DemiBold : Font.Light
62+ font.weight: "style" in modelData && modelData["style"] === "highlighted" ? Font.Bold : Font.Light
63 fontSize: "small"
63 fontSize: "small"
64 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
64 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
65 color: grid.color
65 color: grid.color
plugins/Dash/CardCreator.js+11−15
@@ -82,13 +82,13 @@ var kArtShapeHolderCode = 'Item { \n\
82 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height }); \n\
82 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height }); \n\
83 } \n\
83 } \n\
84 } \n\
84 } \n\
85− image: Image { \n\
85+ image: CroppedImageMinimumSourceSize { \n\
86 objectName: "artImage"; \n\
86 objectName: "artImage"; \n\
87 property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
87 property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
88 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; } \n\
88 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; } \n\
89 cache: true; \n\
89 cache: true; \n\
90 asynchronous: root.asynchronous; \n\
90 asynchronous: root.asynchronous; \n\
91− fillMode: Image.PreserveAspectCrop; \n\
91+ visible: false; \n\
92 width: %2; \n\
92 width: %2; \n\
93 height: %3; \n\
93 height: %3; \n\
94 } \n\
94 } \n\
@@ -191,17 +191,14 @@ var kMascotShapeLoaderCode = 'Loader { \n\
191
191
192// %1 is used as anchors of mascotImage
192// %1 is used as anchors of mascotImage
193// %2 is used as visible of mascotImage
193// %2 is used as visible of mascotImage
194−var kMascotImageCode = 'Image { \n\
194+var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
195 id: mascotImage; \n\
195 id: mascotImage; \n\
196 objectName: "mascotImage"; \n\
196 objectName: "mascotImage"; \n\
197 anchors { %1 } \n\
197 anchors { %1 } \n\
198− readonly property int maxSize: Math.max(width, height) * 4; \n\
199 property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
198 property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
200 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; } \n\
199 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; } \n\
201 width: units.gu(6); \n\
200 width: units.gu(6); \n\
202 height: units.gu(5.625); \n\
201 height: units.gu(5.625); \n\
203− sourceSize { width: maxSize; height: maxSize } \n\
204− fillMode: Image.PreserveAspectCrop; \n\
205 horizontalAlignment: Image.AlignHCenter; \n\
202 horizontalAlignment: Image.AlignHCenter; \n\
206 verticalAlignment: Image.AlignVCenter; \n\
203 verticalAlignment: Image.AlignVCenter; \n\
207 visible: %2; \n\
204 visible: %2; \n\
@@ -222,13 +219,13 @@ var kTitleLabelCode = 'Label { \n\
222 color: %2; \n\
219 color: %2; \n\
223 visible: showHeader %3; \n\
220 visible: showHeader %3; \n\
224 text: root.title; \n\
221 text: root.title; \n\
225− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal; \n\
222+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal; \n\
226− horizontalAlignment: root.headerAlignment; \n\
223+ horizontalAlignment: root.titleAlignment; \n\
227 }\n';
224 }\n';
228
225
229// %1 is used as extra anchors of emblemIcon
226// %1 is used as extra anchors of emblemIcon
230// %2 is used as color of emblemIcon
227// %2 is used as color of emblemIcon
231−var kEmblemIconCode = 'Icon { \n\
228+var kEmblemIconCode = 'StatusIcon { \n\
232 id: emblemIcon; \n\
229 id: emblemIcon; \n\
233 objectName: "emblemIcon"; \n\
230 objectName: "emblemIcon"; \n\
234 anchors { \n\
231 anchors { \n\
@@ -238,7 +235,6 @@ var kEmblemIconCode = 'Icon { \n\
238 } \n\
235 } \n\
239 source: cardData && cardData["emblem"] || ""; \n\
236 source: cardData && cardData["emblem"] || ""; \n\
240 color: %2; \n\
237 color: %2; \n\
241− width: height; \n\
242 height: source != "" ? titleLabel.font.pixelSize : 0; \n\
238 height: source != "" ? titleLabel.font.pixelSize : 0; \n\
243 }\n';
239 }\n';
244
240
@@ -260,13 +256,12 @@ var kSubtitleLabelCode = 'Label { \n\
260 anchors { %1 } \n\
256 anchors { %1 } \n\
261 anchors.topMargin: units.dp(2); \n\
257 anchors.topMargin: units.dp(2); \n\
262 elide: Text.ElideRight; \n\
258 elide: Text.ElideRight; \n\
263− fontSize: "small"; \n\
259+ fontSize: "x-small"; \n\
264 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
260 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
265 color: %2; \n\
261 color: %2; \n\
266 visible: titleLabel.visible && titleLabel.text; \n\
262 visible: titleLabel.visible && titleLabel.text; \n\
267 text: cardData && cardData["subtitle"] || ""; \n\
263 text: cardData && cardData["subtitle"] || ""; \n\
268 font.weight: Font.Light; \n\
264 font.weight: Font.Light; \n\
269− horizontalAlignment: root.headerAlignment; \n\
270 }\n';
265 }\n';
271
266
272// %1 is used as anchors of attributesRow
267// %1 is used as anchors of attributesRow
@@ -312,7 +307,7 @@ function cardString(template, components) {
312 property var artShapeBorderSource: undefined; \n\
307 property var artShapeBorderSource: undefined; \n\
313 property real fontScale: 1.0; \n\
308 property real fontScale: 1.0; \n\
314 property var scopeStyle: null; \n\
309 property var scopeStyle: null; \n\
315− property int headerAlignment: Text.AlignLeft; \n\
310+ property int titleAlignment: Text.AlignLeft; \n\
316 property int fixedHeaderHeight: -1; \n\
311 property int fixedHeaderHeight: -1; \n\
317 property size fixedArtShapeSize: Qt.size(-1, -1); \n\
312 property size fixedArtShapeSize: Qt.size(-1, -1); \n\
318 readonly property string title: cardData && cardData["title"] || ""; \n\
313 readonly property string title: cardData && cardData["title"] || ""; \n\
@@ -438,7 +433,7 @@ function cardString(template, components) {
438 mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors);
433 mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors);
439 }
434 }
440
435
441− var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
436+ var mascotImageVisible = useMascotShape ? 'false' : 'showHeader && resized';
442 mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible);
437 mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible);
443 }
438 }
444
439
@@ -629,7 +624,7 @@ function cardString(template, components) {
629
624
630 var implicitHeight = 'implicitHeight: ';
625 var implicitHeight = 'implicitHeight: ';
631 if (hasSummary) {
626 if (hasSummary) {
632− implicitHeight += 'summary.y + summary.height + (summary.text ? units.gu(1) : 0);\n';
627+ implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
633 } else if (hasHeaderRow) {
628 } else if (hasHeaderRow) {
634 implicitHeight += 'row.y + row.height + units.gu(1);\n';
629 implicitHeight += 'row.y + row.height + units.gu(1);\n';
635 } else if (hasMascot) {
630 } else if (hasMascot) {
@@ -657,6 +652,7 @@ function cardString(template, components) {
657function createCardComponent(parent, template, components) {
652function createCardComponent(parent, template, components) {
658 var imports = 'import QtQuick 2.2; \n\
653 var imports = 'import QtQuick 2.2; \n\
659 import Ubuntu.Components 1.1; \n\
654 import Ubuntu.Components 1.1; \n\
655+ import Ubuntu.Settings.Components 0.1; \n\
660 import Ubuntu.Connectivity 1.0; \n\
656 import Ubuntu.Connectivity 1.0; \n\
661 import Dash 0.1;\n\
657 import Dash 0.1;\n\
662 import Utils 0.1;\n';
658 import Utils 0.1;\n';
plugins/Dash/CroppedImageMinimumSourceSize.qmlnew file+38
@@ -0,0 +1,38 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.3
18+
19+Image {
20+ property bool resized: false
21+ property bool resizing: false
22+ fillMode: Image.PreserveAspectCrop
23+ visible: resized
24+ onSourceSizeChanged: {
25+ if (!resized && !resizing) {
26+ resizing = true;
27+ var ar = width / height;
28+ var ssar = sourceSize.width / sourceSize.height;
29+ if (ar > ssar) {
30+ sourceSize = Qt.size(width, 0);
31+ } else {
32+ sourceSize = Qt.size(0, height);
33+ }
34+ resizing = false;
35+ resized = true;
36+ }
37+ }
38+}
plugins/Dash/qmldir+2−1
@@ -3,4 +3,5 @@ plugin Dash-qml
3typeinfo Dash.qmltypes
3typeinfo Dash.qmltypes
4singleton CardCreatorCache 0.1 CardCreatorCache.qml
4singleton CardCreatorCache 0.1 CardCreatorCache.qml
5ScopeStyle 0.1 ScopeStyle.qml
5ScopeStyle 0.1 ScopeStyle.qml
6−CardAttributes 0.1 CardAttributes.qml
6+CardAttributes 0.1 CardAttributes.qml
7+CroppedImageMinimumSourceSize 0.1 CroppedImageMinimumSourceSize.qml
plugins/LightDM/DBusGreeter.h−1
@@ -21,7 +21,6 @@
21#include <QObject>
21#include <QObject>
22
22
23class Greeter;
23class Greeter;
24−class QDBusInterface;
25
24
26/** This is an internal class used to talk with the indicators.
25/** This is an internal class used to talk with the indicators.
27 */
26 */
plugins/LightDM/DBusGreeterList.h−1
@@ -21,7 +21,6 @@
21#include <QObject>
21#include <QObject>
22
22
23class Greeter;
23class Greeter;
24−class QDBusInterface;
25
24
26/** This is an internal class used to talk with the indicators.
25/** This is an internal class used to talk with the indicators.
27 */
26 */
plugins/Unity/DashCommunicator/CMakeLists.txt+8−2
@@ -1,5 +1,6 @@
1include_directories(
1include_directories(
2 ${CMAKE_CURRENT_SOURCE_DIR}
2 ${CMAKE_CURRENT_SOURCE_DIR}
3+ ${libunity8-private_SOURCE_DIR}
3)
4)
4
5
5set(QMLDASHCOMMUNICATORPLUGIN_SRC
6set(QMLDASHCOMMUNICATORPLUGIN_SRC
@@ -7,13 +8,18 @@ set(QMLDASHCOMMUNICATORPLUGIN_SRC
7 dbusdashcommunicatorservice.cpp
8 dbusdashcommunicatorservice.cpp
8 dashcommunicatorservice.cpp
9 dashcommunicatorservice.cpp
9 dashcommunicator.cpp
10 dashcommunicator.cpp
11+ dashconnection.cpp
10− )
12+)
11
13
12add_library(DashCommunicator-qml MODULE
14add_library(DashCommunicator-qml MODULE
13 ${QMLDASHCOMMUNICATORPLUGIN_SRC}
15 ${QMLDASHCOMMUNICATORPLUGIN_SRC}
14− )
16+)
15
17
16qt5_use_modules(DashCommunicator-qml DBus Qml)
18qt5_use_modules(DashCommunicator-qml DBus Qml)
17
19
20+target_link_libraries(DashCommunicator-qml
21+ unity8-private
22+)
23+
18# export the qmldir and qmltypes files
24# export the qmldir and qmltypes files
19add_unity8_plugin(Unity.DashCommunicator 0.1 Unity/DashCommunicator TARGETS DashCommunicator-qml)
25add_unity8_plugin(Unity.DashCommunicator 0.1 Unity/DashCommunicator TARGETS DashCommunicator-qml)
plugins/Unity/DashCommunicator/dashcommunicator.cpp+22−13
@@ -15,29 +15,38 @@
15 */
15 */
16
16
17#include "dashcommunicator.h"
17#include "dashcommunicator.h"
18+#include "dashconnection.h"
18
19
19#include <QObject>
20#include <QObject>
20−#include <QDBusConnection>
21−#include <QDBusInterface>
22−#include <QDebug>
23
21
24DashCommunicator::DashCommunicator(QObject *parent):
22DashCommunicator::DashCommunicator(QObject *parent):
25− QObject(parent)
23+ QThread(parent),
24+ m_dashConnection(nullptr),
25+ m_created(false)
26{
26{
27+ start();
27}
28}
28
29
29−DashCommunicator::~DashCommunicator()
30+void DashCommunicator::setCurrentScope(const QString &scopeId, bool animate, bool isSwipe)
30{
31{
32+ m_mutex.lock();
33+ if (m_created) {
34+ QMetaObject::invokeMethod(m_dashConnection, "setCurrentScope",
35+ Q_ARG(QString, scopeId),
36+ Q_ARG(bool, animate),
37+ Q_ARG(bool, isSwipe));
38+ }
39+ m_mutex.unlock();
31}
40}
32
41
33−
34−void DashCommunicator::setCurrentScope(const QString &scopeId, bool animate, bool isSwipe)
42+void DashCommunicator::run()
35{
43{
36− QDBusConnection connection = QDBusConnection::sessionBus();
37− QDBusInterface dashIface ("com.canonical.UnityDash",
44+ m_dashConnection = new DashConnection("com.canonical.UnityDash",
38− "/com/canonical/UnityDash",
45+ "/com/canonical/UnityDash",
39− "",
46+ "", this);
40− connection);
47+ m_mutex.lock();
48+ m_created = true;
49+ m_mutex.unlock();
41
50
42− dashIface.call("SetCurrentScope", scopeId, animate, isSwipe);
51+ exec();
43}
52}
plugins/Unity/DashCommunicator/dashcommunicator.h+16−6
@@ -17,19 +17,29 @@
17#ifndef DASHCOMMUNICATOR_H
17#ifndef DASHCOMMUNICATOR_H
18#define DASHCOMMUNICATOR_H
18#define DASHCOMMUNICATOR_H
19
19
20+// Qt
20−#include <QObject>
21+#include <QThread>
22+#include <QMutex>
21
23
24+class DashConnection;
25+
22−class DashCommunicator: public QObject
26+class DashCommunicator: public QThread
23{
27{
24 Q_OBJECT
28 Q_OBJECT
25− Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity.DashCommunicator")
26−
27public:
29public:
28− DashCommunicator(QObject *parent = 0);
30+ explicit DashCommunicator(QObject *parent = 0);
29− ~DashCommunicator();
31+ ~DashCommunicator() = default;
30
32
31public Q_SLOTS:
33public Q_SLOTS:
32 void setCurrentScope(const QString &scopeId, bool animate, bool isSwipe);
34 void setCurrentScope(const QString &scopeId, bool animate, bool isSwipe);
35+
36+protected:
37+ void run() override;
38+
39+private:
40+ DashConnection *m_dashConnection;
41+ bool m_created;
42+ QMutex m_mutex;
33};
43};
34
44
35#endif
45#endif
plugins/Unity/DashCommunicator/dashconnection.cppnew file+33
@@ -0,0 +1,33 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "dashconnection.h"
18+
19+#include <QDBusInterface>
20+#include <QDBusPendingCall>
21+
22+DashConnection::DashConnection(const QString &service, const QString &path, const QString &interface, QObject *parent):
23+ AbstractDBusServiceMonitor(service, path, interface, SessionBus, parent)
24+{
25+
26+}
27+
28+void DashConnection::setCurrentScope(const QString &scopeId, bool animate, bool isSwipe)
29+{
30+ if (dbusInterface()) {
31+ dbusInterface()->asyncCall("SetCurrentScope", scopeId, animate, isSwipe);
32+ }
33+}
plugins/Unity/DashCommunicator/dashconnection.hnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef THREADEDDASHCONNECTION_H
18+#define THREADEDDASHCONNECTION_H
19+
20+// local
21+#include "abstractdbusservicemonitor.h"
22+
23+
24+class DashConnection: public AbstractDBusServiceMonitor
25+{
26+ Q_OBJECT
27+public:
28+ DashConnection(const QString &service, const QString &path, const QString &interface, QObject *parent = 0);
29+
30+public Q_SLOTS:
31+ void setCurrentScope(const QString &scopeId, bool animate, bool isSwipe);
32+};
33+
34+#endif
plugins/Unity/Launcher/CMakeLists.txt+1−1
@@ -1,6 +1,6 @@
1include(FindPkgConfig)
1include(FindPkgConfig)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=4)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=4)
3−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=4)
3+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=5)
4pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
4pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
5
5
6add_definitions(-DSM_BUSNAME=systemBus)
6add_definitions(-DSM_BUSNAME=systemBus)
plugins/Unity/Session/orientationlock.cpp+6−6
@@ -24,16 +24,16 @@ OrientationLock::OrientationLock(QObject *parent)
24 , m_enabled(false)
24 , m_enabled(false)
25 , m_savedOrientation(Qt::PortraitOrientation)
25 , m_savedOrientation(Qt::PortraitOrientation)
26{
26{
27− systemSettings = g_settings_new("com.ubuntu.touch.system");
27+ m_systemSettings = g_settings_new("com.ubuntu.touch.system");
28− g_signal_connect(systemSettings, "changed::rotation-lock",
28+ g_signal_connect(m_systemSettings, "changed::rotation-lock",
29 G_CALLBACK(OrientationLock::onEnabledChangedProxy), this);
29 G_CALLBACK(OrientationLock::onEnabledChangedProxy), this);
30− m_enabled = g_settings_get_boolean(systemSettings, "rotation-lock");
30+ m_enabled = g_settings_get_boolean(m_systemSettings, "rotation-lock");
31}
31}
32
32
33OrientationLock::~OrientationLock()
33OrientationLock::~OrientationLock()
34{
34{
35− g_signal_handlers_disconnect_by_data(systemSettings, this);
35+ g_signal_handlers_disconnect_by_data(m_systemSettings, this);
36− g_object_unref(systemSettings);
36+ g_object_unref(m_systemSettings);
37}
37}
38
38
39bool OrientationLock::enabled() const
39bool OrientationLock::enabled() const
@@ -54,7 +54,7 @@ void OrientationLock::onEnabledChangedProxy(GSettings */*settings*/, const gchar
54
54
55void OrientationLock::onEnabledChanged()
55void OrientationLock::onEnabledChanged()
56{
56{
57− const bool enabled = g_settings_get_boolean(systemSettings, "rotation-lock");
57+ const bool enabled = g_settings_get_boolean(m_systemSettings, "rotation-lock");
58 if (m_enabled != enabled) {
58 if (m_enabled != enabled) {
59 m_enabled = enabled;
59 m_enabled = enabled;
60 Q_EMIT enabledChanged();
60 Q_EMIT enabledChanged();
plugins/Unity/Session/orientationlock.h+1−3
@@ -19,7 +19,6 @@
19
19
20#include <gio/gio.h>
20#include <gio/gio.h>
21#include <QtCore/QObject>
21#include <QtCore/QObject>
22−#include <QtDBus/QDBusInterface>
23
22
24/**
23/**
25 * @brief The OrientationLock class exports orientation lock related properties to QML
24 * @brief The OrientationLock class exports orientation lock related properties to QML
@@ -52,8 +51,7 @@ private Q_SLOTS:
52 void onEnabledChanged();
51 void onEnabledChanged();
53
52
54private:
53private:
55− QDBusInterface *dbusInterface;
54+ GSettings *m_systemSettings;
56− GSettings *systemSettings;
57
55
58 bool m_enabled;
56 bool m_enabled;
59 Qt::ScreenOrientation m_savedOrientation;
57 Qt::ScreenOrientation m_savedOrientation;
po/am.po+39−5
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-28 14:37+0000\n"
11+"PO-Revision-Date: 2014-10-08 00:48+0000\n"
12"Last-Translator: samson <Unknown>\n"
12"Last-Translator: samson <Unknown>\n"
13"Language-Team: Amharic <am@li.org>\n"
13"Language-Team: Amharic <am@li.org>\n"
14+"Language: am\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n > 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -359,5 +361,37 @@ msgstr ""
359"የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
361"የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
360"ይጠፋል"
362"ይጠፋል"
361
363
362−#~ msgid "Manage Dash"
364+#~ msgid "Device Locked"
363−#~ msgstr "የ ዳሽ አስተዳዳሪ"
365+#~ msgstr "አካሉ ተቆልፏል"
366+
367+#~ msgid "You have been locked out due to too many failed passphrase attempts."
368+#~ msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ሀረግ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
369+
370+#~ msgid "You have been locked out due to too many failed passcode attempts."
371+#~ msgstr "ብዙ ጊዜ የተሳሳተ የ ማለፊያ ኮድ ለማስገባት በ መሞከር ምክንያት ስልኩ ተቆልፏል"
372+
373+#~ msgid "Please wait %1 minute and then try again…"
374+#~ msgid_plural "Please wait %1 minutes and then try again…"
375+#~ msgstr[0] "እባክዎን ይቆዩ %1 ደቂቃ እና ከዛ እንደ ገና ይምክሩ…"
376+#~ msgstr[1] "እባክዎን ይቆዩ %1 ደቂቃዎች እና ከዛ እንደ ገና ይምክሩ…"
377+
378+#~ msgid "Pull to refresh…"
379+#~ msgstr "ይሳቡ ለማነቃቃት…"
380+
381+#~ msgid "Release to refresh…"
382+#~ msgstr "ይልቀቁ ለማነቃቃት…"
383+
384+#~ msgid "Unlock"
385+#~ msgstr "መክፈቻ"
386+
387+#~ msgid "Enter passphrase"
388+#~ msgstr "የ ማለፊያ ሀረግ ያስገቡ"
389+
390+#~ msgid "Please re-enter"
391+#~ msgstr "እባክዎን እንደገና-ያስገቡ"
392+
393+#~ msgid "Enter passcode"
394+#~ msgstr "የ ማለፊያ ኮድ ያስገቡ"
395+
396+#~ msgid "Enter %1"
397+#~ msgstr "ማስገቢያ %1"
po/ar.po+6−4
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-05-22 08:22+0000\n"
11"PO-Revision-Date: 2014-05-22 08:22+0000\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13"Language-Team: Arabic <ar@li.org>\n"
13"Language-Team: Arabic <ar@li.org>\n"
14+"Language: ar\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
19+"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
@@ -120,8 +123,7 @@ msgstr "الحافة اليسرى"
120
123
121#: qml/Components/EdgeDemo.qml:199
124#: qml/Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
125msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
124−"اسحب أصبعك من الحافة اليسرى لإظهار شريط يونتي للوصول السريع للتطبيقات"
126+msgstr "اسحب أصبعك من الحافة اليسرى لإظهار شريط يونتي للوصول السريع للتطبيقات"
125
127
126#: qml/Components/EdgeDemo.qml:226
128#: qml/Components/EdgeDemo.qml:226
127msgid "Well done"
129msgid "Well done"
po/ast.po+41−5
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-28 09:02+0000\n"
11+"PO-Revision-Date: 2014-10-09 09:49+0000\n"
12"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
12"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
13"Language-Team: Asturian <ast@li.org>\n"
13"Language-Team: Asturian <ast@li.org>\n"
14+"Language: ast\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -362,5 +364,39 @@ msgstr ""
362"Si s'inxerta'l códigu incorreutamente, el teléfonu va volver a la "
364"Si s'inxerta'l códigu incorreutamente, el teléfonu va volver a la "
363"configuración de fábrica y van perdese tolos datos personales."
365"configuración de fábrica y van perdese tolos datos personales."
364
366
365−#~ msgid "Manage Dash"
367+#~ msgid "Device Locked"
366−#~ msgstr "Xestionar tableru"
368+#~ msgstr "Preséu bloquiáu"
369+
370+#~ msgid "You have been locked out due to too many failed passphrase attempts."
371+#~ msgstr ""
372+#~ "Quedasti bloquiáu polos escesivos intentos fallíos de frase de pasu."
373+
374+#~ msgid "You have been locked out due to too many failed passcode attempts."
375+#~ msgstr ""
376+#~ "Quedasti bloquiáu polos escesivos intentos fallíos de códigu de pasu."
377+
378+#~ msgid "Please wait %1 minute and then try again…"
379+#~ msgid_plural "Please wait %1 minutes and then try again…"
380+#~ msgstr[0] "Espera %1 minutu y vuelvi a intentalo…"
381+#~ msgstr[1] "Espera %1 minutos y vuelvi a intentalo…"
382+
383+#~ msgid "Pull to refresh…"
384+#~ msgstr "Tirar p'anovar..."
385+
386+#~ msgid "Release to refresh…"
387+#~ msgstr "Soltar p'anovar..."
388+
389+#~ msgid "Unlock"
390+#~ msgstr "Desbloquiar"
391+
392+#~ msgid "Enter passphrase"
393+#~ msgstr "Escribi la frase contraseña"
394+
395+#~ msgid "Please re-enter"
396+#~ msgstr "Vuelvi a escribila"
397+
398+#~ msgid "Enter passcode"
399+#~ msgstr "Escribi'l códigu de pasu"
400+
401+#~ msgid "Enter %1"
402+#~ msgstr "Escribi %1"
po/az.po+5−4
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
14+"Language: az\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -120,8 +122,7 @@ msgstr "Sol künc"
120
122
121#: qml/Components/EdgeDemo.qml:199
123#: qml/Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
124msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
124−"Applikasiyalara sürətli keçid üçün paneli açmaq üçün sol küncdən çəkin"
125+msgstr "Applikasiyalara sürətli keçid üçün paneli açmaq üçün sol küncdən çəkin"
125
126
126#: qml/Components/EdgeDemo.qml:226
127#: qml/Components/EdgeDemo.qml:226
127msgid "Well done"
128msgid "Well done"
po/be.po+56−48
@@ -7,14 +7,16 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-24 17:12+0000\n"
11"PO-Revision-Date: 2014-09-24 17:12+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Belarusian <be@li.org>\n"
13"Language-Team: Belarusian <be@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -30,6 +32,25 @@ msgstr ""
30msgid "Unpin shortcut"
32msgid "Unpin shortcut"
31msgstr ""
33msgstr ""
32
34
35+#: qml/Components/DelayedLockscreen.qml:47
36+msgid "Device Locked"
37+msgstr ""
38+
39+#: qml/Components/DelayedLockscreen.qml:62
40+msgid "You have been locked out due to too many failed passphrase attempts."
41+msgstr ""
42+
43+#: qml/Components/DelayedLockscreen.qml:63
44+msgid "You have been locked out due to too many failed passcode attempts."
45+msgstr ""
46+
47+#: qml/Components/DelayedLockscreen.qml:72
48+#, qt-format
49+msgid "Please wait %1 minute and then try again…"
50+msgid_plural "Please wait %1 minutes and then try again…"
51+msgstr[0] ""
52+msgstr[1] ""
53+
33#: qml/Components/Dialogs.qml:70
54#: qml/Components/Dialogs.qml:70
34msgid "Log out"
55msgid "Log out"
35msgstr ""
56msgstr ""
@@ -132,40 +153,23 @@ msgid ""
132"phone<br><br>Tap on the screen to start"
153"phone<br><br>Tap on the screen to start"
133msgstr ""
154msgstr ""
134
155
135−#: qml/Components/Lockscreen.qml:167
156+#: qml/Components/Lockscreen.qml:220
136−msgid "Please wait"
137−msgstr ""
138−
139−#: qml/Components/Lockscreen.qml:172
140−msgid "Too many incorrect attempts"
141−msgstr ""
142−
143−#: qml/Components/Lockscreen.qml:206
144msgid "Emergency Call"
157msgid "Emergency Call"
145msgstr ""
158msgstr ""
146
159
147−#: qml/Components/Lockscreen.qml:226
160+#: qml/Components/Lockscreen.qml:252
148msgid "OK"
161msgid "OK"
149msgstr ""
162msgstr ""
150
163
151−#: qml/Components/PassphraseLockscreen.qml:61
152−#, qt-format
153−msgid "Hello %1"
154−msgstr ""
155−
156−#: qml/Components/PassphraseLockscreen.qml:61
157−msgid "Hello"
158−msgstr ""
159−
160−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
161msgid "See less"
165msgid "See less"
162msgstr ""
166msgstr ""
163
167
164−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
165msgid "See all"
169msgid "See all"
166msgstr ""
170msgstr ""
167
171
168−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
169#: qml/Panel/SearchIndicator.qml:27
173#: qml/Panel/SearchIndicator.qml:27
170msgid "Search"
174msgid "Search"
171msgstr ""
175msgstr ""
@@ -202,6 +206,14 @@ msgstr ""
202msgid "Send"
206msgid "Send"
203msgstr ""
207msgstr ""
204
208
209+#: qml/Dash/PullToRefreshScopeStyle.qml:55
210+msgid "Pull to refresh…"
211+msgstr ""
212+
213+#: qml/Dash/PullToRefreshScopeStyle.qml:60
214+msgid "Release to refresh…"
215+msgstr ""
216+
205#: qml/Dash/ScopesOverview.qml:206
217#: qml/Dash/ScopesOverview.qml:206
206msgid "Manage Scopes"
218msgid "Manage Scopes"
207msgstr ""
219msgstr ""
@@ -223,7 +235,7 @@ msgid "All"
223msgstr ""
235msgstr ""
224
236
225#: qml/Greeter/Greeter.qml:157
237#: qml/Greeter/Greeter.qml:157
226−msgid "Swipe to unlock"
238+msgid "Unlock"
227msgstr ""
239msgstr ""
228
240
229#: qml/Hud/HudParametrizedActionsPage.qml:139
241#: qml/Hud/HudParametrizedActionsPage.qml:139
@@ -246,18 +258,10 @@ msgstr ""
246msgid "Speaking..."
258msgid "Speaking..."
247msgstr ""
259msgstr ""
248
260
249−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
250msgid "Show password"
262msgid "Show password"
251msgstr ""
263msgstr ""
252
264
253−#: qml/Notifications/NotificationMenuItemFactory.qml:124
254−msgid "Enter SIM PIN"
255−msgstr ""
256−
257−#: qml/Notifications/NotificationMenuItemFactory.qml:125
258−msgid "Sorry, incorrect PIN"
259−msgstr ""
260−
261#: qml/Panel/ActiveCallHint.qml:77
265#: qml/Panel/ActiveCallHint.qml:77
262msgid "Tap to return to call..."
266msgid "Tap to return to call..."
263msgstr ""
267msgstr ""
@@ -302,51 +306,55 @@ msgstr ""
302msgid "Roaming"
306msgid "Roaming"
303msgstr ""
307msgstr ""
304
308
305−#: qml/Shell.qml:320
309+#: qml/Shell.qml:346
306−msgid "Enter your passphrase"
310+msgid "Enter passphrase"
307msgstr ""
311msgstr ""
308
312
309−#: qml/Shell.qml:321
313+#: qml/Shell.qml:347
310msgid "Sorry, incorrect passphrase"
314msgid "Sorry, incorrect passphrase"
311msgstr ""
315msgstr ""
312
316
313−#: qml/Shell.qml:323
317+#: qml/Shell.qml:348
318+msgid "Please re-enter"
319+msgstr ""
320+
321+#: qml/Shell.qml:350
314−msgid "Enter your passcode"
322+msgid "Enter passcode"
315msgstr ""
323msgstr ""
316
324
317−#: qml/Shell.qml:324
325+#: qml/Shell.qml:351
318msgid "Sorry, incorrect passcode"
326msgid "Sorry, incorrect passcode"
319msgstr ""
327msgstr ""
320
328
321−#: qml/Shell.qml:327
329+#: qml/Shell.qml:354
322#, qt-format
330#, qt-format
323−msgid "Enter your %1"
331+msgid "Enter %1"
324msgstr ""
332msgstr ""
325
333
326−#: qml/Shell.qml:328
334+#: qml/Shell.qml:355
327#, qt-format
335#, qt-format
328msgid "Sorry, incorrect %1"
336msgid "Sorry, incorrect %1"
329msgstr ""
337msgstr ""
330
338
331−#: qml/Shell.qml:363
339+#: qml/Shell.qml:390
332msgid "Sorry, incorrect passphrase."
340msgid "Sorry, incorrect passphrase."
333msgstr ""
341msgstr ""
334
342
335−#: qml/Shell.qml:364
343+#: qml/Shell.qml:391
336msgid "Sorry, incorrect passcode."
344msgid "Sorry, incorrect passcode."
337msgstr ""
345msgstr ""
338
346
339−#: qml/Shell.qml:365
347+#: qml/Shell.qml:392
340msgid "This will be your last attempt."
348msgid "This will be your last attempt."
341msgstr ""
349msgstr ""
342
350
343−#: qml/Shell.qml:367
351+#: qml/Shell.qml:394
344msgid ""
352msgid ""
345"If passphrase is entered incorrectly, your phone will conduct a factory "
353"If passphrase is entered incorrectly, your phone will conduct a factory "
346"reset and all personal data will be deleted."
354"reset and all personal data will be deleted."
347msgstr ""
355msgstr ""
348
356
349−#: qml/Shell.qml:368
357+#: qml/Shell.qml:395
350msgid ""
358msgid ""
351"If passcode is entered incorrectly, your phone will conduct a factory reset "
359"If passcode is entered incorrectly, your phone will conduct a factory reset "
352"and all personal data will be deleted."
360"and all personal data will be deleted."
po/bg.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-04-01 14:08+0000\n"
11"PO-Revision-Date: 2014-04-01 14:08+0000\n"
12"Last-Translator: Atanas Kovachki <Unknown>\n"
12"Last-Translator: Atanas Kovachki <Unknown>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
14+"Language: bg\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/br.po+46−8
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-26 08:28+0000\n"
11+"PO-Revision-Date: 2014-10-07 07:03+0000\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
13"Language-Team: Breton <br@li.org>\n"
13"Language-Team: Breton <br@li.org>\n"
14+"Language: br\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n > 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +84,7 @@ msgstr "Lazhañ"
82
84
83#: qml/Components/Dialogs.qml:157
85#: qml/Components/Dialogs.qml:157
84msgid "Restart"
86msgid "Restart"
85−msgstr ""
87+msgstr "Adloc'hañ"
86
88
87#: qml/Components/Dialogs.qml:167
89#: qml/Components/Dialogs.qml:167
88msgid "Cancel"
90msgid "Cancel"
@@ -213,7 +215,7 @@ msgstr "Kas"
213
215
214#: qml/Dash/ScopesOverview.qml:206
216#: qml/Dash/ScopesOverview.qml:206
215msgid "Manage Scopes"
217msgid "Manage Scopes"
216−msgstr ""
218+msgstr "Merañ ar c'hefluskerioù enklask"
217
219
218#: qml/Dash/ScopesOverview.qml:428
220#: qml/Dash/ScopesOverview.qml:428
219msgid "Done"
221msgid "Done"
@@ -277,7 +279,7 @@ msgstr "Kendiviz"
277
279
278#: qml/Panel/Indicators/MenuItemFactory.qml:600
280#: qml/Panel/Indicators/MenuItemFactory.qml:600
279msgid "Nothing is playing"
281msgid "Nothing is playing"
280−msgstr ""
282+msgstr "Ne lenner netra bremañ"
281
283
282#: qml/Panel/Indicators/MenuItemFactory.qml:748
284#: qml/Panel/Indicators/MenuItemFactory.qml:748
283msgid "In queue…"
285msgid "In queue…"
@@ -365,5 +367,41 @@ msgstr ""
365"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
367"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
366"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
368"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
367
369
368−#~ msgid "Manage Dash"
370+#~ msgid "Device Locked"
369−#~ msgstr "Merañ an daolenn-vourzh"
371+#~ msgstr "Benveg prennet"
372+
373+#~ msgid "You have been locked out due to too many failed passphrase attempts."
374+#~ msgstr ""
375+#~ "Prennet eo bet ho penveg abalamour da re a daolioù-esae c'hwitet evit "
376+#~ "merkañ ho frazenn-dremen."
377+
378+#~ msgid "You have been locked out due to too many failed passcode attempts."
379+#~ msgstr ""
380+#~ "Prennet eo bet ho penveg abalamour da re a daolioù-esae evit merkañ ho "
381+#~ "kod-tremen."
382+
383+#~ msgid "Please wait %1 minute and then try again…"
384+#~ msgid_plural "Please wait %1 minutes and then try again…"
385+#~ msgstr[0] "Gortozit %1 vunutenn, mar plij, hag esaeit en-dro..."
386+#~ msgstr[1] "Gortozit %1 a vunutoù, mar plij, hag esaeit en-dro..."
387+
388+#~ msgid "Pull to refresh…"
389+#~ msgstr "Tennañ evit freskaat..."
390+
391+#~ msgid "Release to refresh…"
392+#~ msgstr "Lezel da vont evit freskaat..."
393+
394+#~ msgid "Unlock"
395+#~ msgstr "Dibrennañ"
396+
397+#~ msgid "Enter passphrase"
398+#~ msgstr "Merkañ ar frazenn-dremen"
399+
400+#~ msgid "Please re-enter"
401+#~ msgstr "Adverkañ, mar plij"
402+
403+#~ msgid "Enter passcode"
404+#~ msgstr "Merkañ ar c'hod-tremen"
405+
406+#~ msgid "Enter %1"
407+#~ msgstr "Merkañ %1"
po/bs.po+5−2
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-16 22:33+0000\n"
11"PO-Revision-Date: 2014-01-16 22:33+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
14+"Language: bs\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
19+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
po/ca.po+50−12
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 06:27+0000\n"
11+"PO-Revision-Date: 2014-10-07 10:51+0000\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@li.org>\n"
14+"Language: ca\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -98,8 +100,7 @@ msgstr "Vora dreta"
98
100
99#: qml/Components/EdgeDemo.qml:113
101#: qml/Components/EdgeDemo.qml:113
100msgid "Try swiping from the right edge to unlock the phone"
102msgid "Try swiping from the right edge to unlock the phone"
101−msgstr ""
102−"Proveu de lliscar el dit des de la vora dreta per desblocar el telèfon"
103+msgstr "Proveu de lliscar el dit des de la vora dreta per desblocar el telèfon"
103
104
104#: qml/Components/EdgeDemo.qml:144
105#: qml/Components/EdgeDemo.qml:144
105msgid "Top edge"
106msgid "Top edge"
@@ -214,7 +215,7 @@ msgstr "Envia"
214
215
215#: qml/Dash/ScopesOverview.qml:206
216#: qml/Dash/ScopesOverview.qml:206
216msgid "Manage Scopes"
217msgid "Manage Scopes"
217−msgstr ""
218+msgstr "Gestioneu les lents"
218
219
219#: qml/Dash/ScopesOverview.qml:428
220#: qml/Dash/ScopesOverview.qml:428
220msgid "Done"
221msgid "Done"
@@ -278,7 +279,7 @@ msgstr "Conferència"
278
279
279#: qml/Panel/Indicators/MenuItemFactory.qml:600
280#: qml/Panel/Indicators/MenuItemFactory.qml:600
280msgid "Nothing is playing"
281msgid "Nothing is playing"
281−msgstr ""
282+msgstr "No s'està reproduint res"
282
283
283#: qml/Panel/Indicators/MenuItemFactory.qml:748
284#: qml/Panel/Indicators/MenuItemFactory.qml:748
284msgid "In queue…"
285msgid "In queue…"
@@ -344,7 +345,7 @@ msgstr "La contrasenya és incorrecta"
344
345
345#: qml/Shell.qml:364
346#: qml/Shell.qml:364
346msgid "Sorry, incorrect passcode."
347msgid "Sorry, incorrect passcode."
347−msgstr "La clau és incorrecta"
348+msgstr "El codi d'accés no és correcte"
348
349
349#: qml/Shell.qml:365
350#: qml/Shell.qml:365
350msgid "This will be your last attempt."
351msgid "This will be your last attempt."
@@ -364,8 +365,45 @@ msgid ""
364"If passcode is entered incorrectly, your phone will conduct a factory reset "
365"If passcode is entered incorrectly, your phone will conduct a factory reset "
365"and all personal data will be deleted."
366"and all personal data will be deleted."
366msgstr ""
367msgstr ""
367−"Si la clau s'introdueix de manera incorrecta, el telèfon es reinicialitzarà "
368+"Si el codi d'accés s'introdueix de manera incorrecta, el telèfon es "
368−"a l'estat de fàbrica i se suprimiran totes les dades personals."
369+"reinicialitzarà a l'estat de fàbrica i se suprimiran totes les dades "
370+"personals."
371+
372+#~ msgid "Device Locked"
373+#~ msgstr "Dispositiu bloquejat"
374+
375+#~ msgid "You have been locked out due to too many failed passphrase attempts."
376+#~ msgstr ""
377+#~ "Se us ha bloquejat l'accés al dispositiu. Heu sobrepassat el nombre "
378+#~ "d'intents d'introducció de la contrasenya."
379+
380+#~ msgid "You have been locked out due to too many failed passcode attempts."
381+#~ msgstr ""
382+#~ "Se us ha bloquejat l'accés al dispositiu. Heu sobrepassat el nombre "
383+#~ "d'intents d'introducció del codi d'accés."
384+
385+#~ msgid "Please wait %1 minute and then try again…"
386+#~ msgid_plural "Please wait %1 minutes and then try again…"
387+#~ msgstr[0] "Espereu %1 minut i torneu-ho a intentar..."
388+#~ msgstr[1] "Espereu %1 minuts i torneu-ho a intentar..."
389+
390+#~ msgid "Pull to refresh…"
391+#~ msgstr "Estireu per actualitzar..."
392+
393+#~ msgid "Release to refresh…"
394+#~ msgstr "Deixeu anar per actualitzar..."
395+
396+#~ msgid "Unlock"
397+#~ msgstr "Desbloca"
398+
399+#~ msgid "Enter passphrase"
400+#~ msgstr "Introduïu la contrasenya"
401+
402+#~ msgid "Please re-enter"
403+#~ msgstr "Torneu-ho a introduir"
404+
405+#~ msgid "Enter passcode"
406+#~ msgstr "Introduïu el codi d'accés"
369
407
370−#~ msgid "Manage Dash"
408+#~ msgid "Enter %1"
371−#~ msgstr "Gestiona el tauler"
409+#~ msgstr "Introduïu: %1"
po/ckb.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
14+"Language: \n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/cs.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-08 10:11+0000\n"
11"PO-Revision-Date: 2014-01-08 10:11+0000\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
13"Language-Team: Czech <cs@li.org>\n"
13"Language-Team: Czech <cs@li.org>\n"
14+"Language: cs\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/da.po+4−2
@@ -7,15 +7,17 @@
7msgid ""
7msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"POT-Creation-Date: 2014-09-24 10:43+0100\n"
12"PO-Revision-Date: 2014-07-30 12:37+0000\n"
12"PO-Revision-Date: 2014-07-30 12:37+0000\n"
13"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
13"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
14"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
14"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
15+"Language: da\n"
15"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
19+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
20
22
21#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
po/de.po+8−9
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 08:31+0000\n"
11+"PO-Revision-Date: 2014-09-29 06:33+0000\n"
12−"Last-Translator: Martin Pitt <martin.pitt@ubuntu.com>\n"
12+"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
14+"Language: de\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -211,7 +213,7 @@ msgstr "Senden"
211
213
212#: qml/Dash/ScopesOverview.qml:206
214#: qml/Dash/ScopesOverview.qml:206
213msgid "Manage Scopes"
215msgid "Manage Scopes"
214−msgstr ""
216+msgstr "Filter verwalten"
215
217
216#: qml/Dash/ScopesOverview.qml:428
218#: qml/Dash/ScopesOverview.qml:428
217msgid "Done"
219msgid "Done"
@@ -275,7 +277,7 @@ msgstr "Konferenz"
275
277
276#: qml/Panel/Indicators/MenuItemFactory.qml:600
278#: qml/Panel/Indicators/MenuItemFactory.qml:600
277msgid "Nothing is playing"
279msgid "Nothing is playing"
278−msgstr ""
280+msgstr "Nichts wird abgespielt"
279
281
280#: qml/Panel/Indicators/MenuItemFactory.qml:748
282#: qml/Panel/Indicators/MenuItemFactory.qml:748
281msgid "In queue…"
283msgid "In queue…"
@@ -362,6 +364,3 @@ msgid ""
362msgstr ""
364msgstr ""
363"Wird die PIN falsch eingegeben, wird das Telefon auf den Werkszustand "
365"Wird die PIN falsch eingegeben, wird das Telefon auf den Werkszustand "
364"zurückgesetzt und alle Daten werden gelöscht."
366"zurückgesetzt und alle Daten werden gelöscht."
365−
366−#~ msgid "Manage Dash"
367−#~ msgstr "Dash verwalten"
po/el.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-08-21 12:06+0000\n"
11"PO-Revision-Date: 2014-08-21 12:06+0000\n"
12"Last-Translator: Chris Taklis (aka Kailor) <ctaklis@gmail.com>\n"
12"Last-Translator: Chris Taklis (aka Kailor) <ctaklis@gmail.com>\n"
13"Language-Team: Greek <el@li.org>\n"
13"Language-Team: Greek <el@li.org>\n"
14+"Language: el\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/en_AU.po+4−5
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-09-23 01:24+0000\n"
11"PO-Revision-Date: 2014-09-23 01:24+0000\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
14+"Language: \n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -359,6 +361,3 @@ msgid ""
359msgstr ""
361msgstr ""
360"If passcode is entered incorrectly, your phone will conduct a factory reset "
362"If passcode is entered incorrectly, your phone will conduct a factory reset "
361"and all personal data will be deleted."
363"and all personal data will be deleted."
362−
363−#~ msgid "Manage Dash"
364−#~ msgstr "Manage Dash"
po/en_GB.po+41−6
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-23 13:48+0000\n"
11+"PO-Revision-Date: 2014-10-03 12:46+0000\n"
12−"Last-Translator: Alan Pope ( ͡° ͜ʖ ͡°) <alan@ubuntu.com>\n"
12+"Last-Translator: Andi Chandler <Unknown>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
14+"Language: \n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,38 @@ msgstr ""
360"If passcode is entered incorrectly, your phone will conduct a factory reset "
362"If passcode is entered incorrectly, your phone will conduct a factory reset "
361"and all personal data will be deleted."
363"and all personal data will be deleted."
362
364
363−#~ msgid "Manage Dash"
365+#~ msgid "Device Locked"
364−#~ msgstr "Manage Dash"
366+#~ msgstr "Device Locked"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
369+#~ msgstr ""
370+#~ "You have been locked out due to too many failed passphrase attempts."
371+
372+#~ msgid "You have been locked out due to too many failed passcode attempts."
373+#~ msgstr "You have been locked out due to too many failed passcode attempts."
374+
375+#~ msgid "Please wait %1 minute and then try again…"
376+#~ msgid_plural "Please wait %1 minutes and then try again…"
377+#~ msgstr[0] "Please wait %1 minute and then try again…"
378+#~ msgstr[1] "Please wait %1 minutes and then try again…"
379+
380+#~ msgid "Pull to refresh…"
381+#~ msgstr "Pull to refresh…"
382+
383+#~ msgid "Release to refresh…"
384+#~ msgstr "Release to refresh…"
385+
386+#~ msgid "Unlock"
387+#~ msgstr "Unlock"
388+
389+#~ msgid "Enter passphrase"
390+#~ msgstr "Enter passphrase"
391+
392+#~ msgid "Please re-enter"
393+#~ msgstr "Please re-enter"
394+
395+#~ msgid "Enter passcode"
396+#~ msgstr "Enter passcode"
397+
398+#~ msgid "Enter %1"
399+#~ msgstr "Enter %1"
po/eo.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
14+"Language: eo\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/es.po+47−10
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 04:06+0000\n"
11+"PO-Revision-Date: 2014-10-09 07:43+0000\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@li.org>\n"
14+"Language: es\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -66,7 +68,7 @@ msgstr "¿Esta seguro de que quiere reiniciar?"
66
68
67#: qml/Components/Dialogs.qml:144
69#: qml/Components/Dialogs.qml:144
68msgid "Power"
70msgid "Power"
69−msgstr "Encendido"
71+msgstr "Apagar"
70
72
71#: qml/Components/Dialogs.qml:145
73#: qml/Components/Dialogs.qml:145
72msgid ""
74msgid ""
@@ -106,8 +108,7 @@ msgstr "Borde superior"
106
108
107#: qml/Components/EdgeDemo.qml:145
109#: qml/Components/EdgeDemo.qml:145
108msgid "Try swiping from the top edge to access the indicators"
110msgid "Try swiping from the top edge to access the indicators"
109−msgstr ""
110−"Deslice el dedo desde el borde superior para acceder a los indicadores"
111+msgstr "Deslice el dedo desde el borde superior para acceder a los indicadores"
111
112
112#: qml/Components/EdgeDemo.qml:170
113#: qml/Components/EdgeDemo.qml:170
113msgid "Close"
114msgid "Close"
@@ -211,7 +212,7 @@ msgstr "Enviar"
211
212
212#: qml/Dash/ScopesOverview.qml:206
213#: qml/Dash/ScopesOverview.qml:206
213msgid "Manage Scopes"
214msgid "Manage Scopes"
214−msgstr ""
215+msgstr "Administrar ámbitos"
215
216
216#: qml/Dash/ScopesOverview.qml:428
217#: qml/Dash/ScopesOverview.qml:428
217msgid "Done"
218msgid "Done"
@@ -275,7 +276,7 @@ msgstr "Conferencia"
275
276
276#: qml/Panel/Indicators/MenuItemFactory.qml:600
277#: qml/Panel/Indicators/MenuItemFactory.qml:600
277msgid "Nothing is playing"
278msgid "Nothing is playing"
278−msgstr ""
279+msgstr "Ningún contenido en reproducción"
279
280
280#: qml/Panel/Indicators/MenuItemFactory.qml:748
281#: qml/Panel/Indicators/MenuItemFactory.qml:748
281msgid "In queue…"
282msgid "In queue…"
@@ -363,5 +364,41 @@ msgstr ""
363"Si se introduce el código incorrectamente, el teléfono volverá a la "
364"Si se introduce el código incorrectamente, el teléfono volverá a la "
364"configuración de fábrica y se perderán todos los datos personales."
365"configuración de fábrica y se perderán todos los datos personales."
365
366
366−#~ msgid "Manage Dash"
367+#~ msgid "Device Locked"
368+#~ msgstr "Dispositivo bloqueado"
369+
370+#~ msgid "You have been locked out due to too many failed passphrase attempts."
371+#~ msgstr ""
372+#~ "Se ha proporcionado una contraseña errónea demasiadas veces. Se ha "
373+#~ "bloqueado el dispositivo."
374+
375+#~ msgid "You have been locked out due to too many failed passcode attempts."
367−#~ msgstr "Gestionar tablero"
376+#~ msgstr ""
377+#~ "Se ha bloqueado el dispositivo debido al gran número de intentos fallidos "
378+#~ "de desbloqueo."
379+
380+#~ msgid "Please wait %1 minute and then try again…"
381+#~ msgid_plural "Please wait %1 minutes and then try again…"
382+#~ msgstr[0] "Espere %1 minuto e inténtelo de nuevo..."
383+#~ msgstr[1] "Espere %1 minutos e inténtelo de nuevo..."
384+
385+#~ msgid "Pull to refresh…"
386+#~ msgstr "Deslice para actualizar…"
387+
388+#~ msgid "Release to refresh…"
389+#~ msgstr "Suelte para actualizar…"
390+
391+#~ msgid "Unlock"
392+#~ msgstr "Desbloquear"
393+
394+#~ msgid "Enter passphrase"
395+#~ msgstr "Introduzca la contraseña"
396+
397+#~ msgid "Please re-enter"
398+#~ msgstr "Reintroduzca"
399+
400+#~ msgid "Enter passcode"
401+#~ msgstr "Introduzca el código"
402+
403+#~ msgid "Enter %1"
404+#~ msgstr "Introduzca %1"
po/eu.po+44−7
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-27 12:47+0000\n"
11+"PO-Revision-Date: 2014-10-07 19:21+0000\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
13"Language-Team: Basque <eu@li.org>\n"
13"Language-Team: Basque <eu@li.org>\n"
14+"Language: eu\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -96,8 +98,7 @@ msgstr "Eskuineko ertza"
96
98
97#: qml/Components/EdgeDemo.qml:113
99#: qml/Components/EdgeDemo.qml:113
98msgid "Try swiping from the right edge to unlock the phone"
100msgid "Try swiping from the right edge to unlock the phone"
99−msgstr ""
100−"Pasatu hatza eskuineko ertzetik ezkerrerantz telefonoa desblokeatzeko"
101+msgstr "Pasatu hatza eskuineko ertzetik ezkerrerantz telefonoa desblokeatzeko"
101
102
102#: qml/Components/EdgeDemo.qml:144
103#: qml/Components/EdgeDemo.qml:144
103msgid "Top edge"
104msgid "Top edge"
@@ -361,5 +362,41 @@ msgstr ""
361"Okerreko pasakodea sartzen baduzu, telefonoaren jatorrizko ezarpenak "
362"Okerreko pasakodea sartzen baduzu, telefonoaren jatorrizko ezarpenak "
362"berrezarri eta datu pertsonal guztiak ezabatuko dira."
363"berrezarri eta datu pertsonal guztiak ezabatuko dira."
363
364
364−#~ msgid "Manage Dash"
365+#~ msgid "Device Locked"
366+#~ msgstr "Gailua blokeatuta"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
369+#~ msgstr ""
370+#~ "Gailua blokeatu da, pasaesaldia sartzeko saiakera gehiegi hutsegin "
371+#~ "dituzulako."
372+
373+#~ msgid "You have been locked out due to too many failed passcode attempts."
365−#~ msgstr "Kudeatu abio-leihoa"
374+#~ msgstr ""
375+#~ "Gailua blokeatu da, pasakodea sartzeko saiakera gehiegi hutsegin "
376+#~ "dituzulako."
377+
378+#~ msgid "Please wait %1 minute and then try again…"
379+#~ msgid_plural "Please wait %1 minutes and then try again…"
380+#~ msgstr[0] "Itxaron minutu %1ez eta saiatu berriro…"
381+#~ msgstr[1] "Itxaron %1 minutuz eta saiatu berriro…"
382+
383+#~ msgid "Pull to refresh…"
384+#~ msgstr "Tiratu freskatzeko…"
385+
386+#~ msgid "Release to refresh…"
387+#~ msgstr "Askatu freskatzeko…"
388+
389+#~ msgid "Unlock"
390+#~ msgstr "Desblokeatu"
391+
392+#~ msgid "Enter passphrase"
393+#~ msgstr "Sartu pasaesaldia"
394+
395+#~ msgid "Please re-enter"
396+#~ msgstr "Errepikatu"
397+
398+#~ msgid "Enter passcode"
399+#~ msgstr "Sartu pasakodea"
400+
401+#~ msgid "Enter %1"
402+#~ msgstr "Sartu %1"
po/fa.po+35−7
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-21 10:43+0000\n"
11+"PO-Revision-Date: 2014-10-02 23:07+0000\n"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
13"Language-Team: Persian <fa@li.org>\n"
13"Language-Team: Persian <fa@li.org>\n"
14+"Language: fa\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -208,7 +210,7 @@ msgstr "ارسال"
208
210
209#: qml/Dash/ScopesOverview.qml:206
211#: qml/Dash/ScopesOverview.qml:206
210msgid "Manage Scopes"
212msgid "Manage Scopes"
211−msgstr ""
213+msgstr "مدیریت حوزه‌ها"
212
214
213#: qml/Dash/ScopesOverview.qml:428
215#: qml/Dash/ScopesOverview.qml:428
214msgid "Done"
216msgid "Done"
@@ -272,7 +274,7 @@ msgstr "کنفرانس"
272
274
273#: qml/Panel/Indicators/MenuItemFactory.qml:600
275#: qml/Panel/Indicators/MenuItemFactory.qml:600
274msgid "Nothing is playing"
276msgid "Nothing is playing"
275−msgstr ""
277+msgstr "هیچ چیزی در حال پخش نیست"
276
278
277#: qml/Panel/Indicators/MenuItemFactory.qml:748
279#: qml/Panel/Indicators/MenuItemFactory.qml:748
278msgid "In queue…"
280msgid "In queue…"
@@ -360,5 +362,31 @@ msgstr ""
360"اگر رمزعبور نادرست وارد شود، تلفن شما بازنشانی کارخانه خواهد شد و تمامی "
362"اگر رمزعبور نادرست وارد شود، تلفن شما بازنشانی کارخانه خواهد شد و تمامی "
361"اطّلاعات شخصی حذف خواهند شد."
363"اطّلاعات شخصی حذف خواهند شد."
362
364
363−#~ msgid "Manage Dash"
365+#~ msgid "Device Locked"
364−#~ msgstr "مدیریت دش"
366+#~ msgstr "دستگاه قفل شد"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
369+#~ msgstr ""
370+#~ "شما به دلیل تلاش‌های بسیار زیاد شکست خورده برای عبارت‌عبور قفل شده‌اید."
371+
372+#~ msgid "You have been locked out due to too many failed passcode attempts."
373+#~ msgstr "شما به دلیل تلاش‌های بسیار زیاد شکست خورده برای رمزعبور قفل شده‌اید."
374+
375+#~ msgid "Please wait %1 minute and then try again…"
376+#~ msgid_plural "Please wait %1 minutes and then try again…"
377+#~ msgstr[0] "لطفاُ %1 دقیقه صبر نموده و سپس مجدّداً تلاش نمایید…"
378+
379+#~ msgid "Unlock"
380+#~ msgstr "بازکردن قفل"
381+
382+#~ msgid "Enter passphrase"
383+#~ msgstr "عبارت‌عبور را وارد کنید"
384+
385+#~ msgid "Please re-enter"
386+#~ msgstr "لطفاً دوباره وارد کنید"
387+
388+#~ msgid "Enter passcode"
389+#~ msgstr "رمزعبور را وارد کنید"
390+
391+#~ msgid "Enter %1"
392+#~ msgstr "%1 را وارد کنید"
po/fi.po+42−6
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-28 13:47+0000\n"
11+"PO-Revision-Date: 2014-10-07 13:10+0000\n"
12−"Last-Translator: Timo Jyrinki <timo.jyrinki@canonical.com>\n"
12+"Last-Translator: Jiri Grönroos <Unknown>\n"
13"Language-Team: Finnish <fi@li.org>\n"
13"Language-Team: Finnish <fi@li.org>\n"
14+"Language: fi\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,39 @@ msgstr ""
360"Jos kirjoitat suojakoodin virheellisesti, puhelimesi palautetaan "
362"Jos kirjoitat suojakoodin virheellisesti, puhelimesi palautetaan "
361"tehdastilaan ja kaikki henkilökohtaiset tietosi poistetaan."
363"tehdastilaan ja kaikki henkilökohtaiset tietosi poistetaan."
362
364
363−#~ msgid "Manage Dash"
365+#~ msgid "Device Locked"
364−#~ msgstr "Unityn hallinta"
366+#~ msgstr "Laite on lukittu"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
369+#~ msgstr ""
370+#~ "Laite on lukittu liian monen virheellisen tunnuslauseyrityksen jälkeen."
371+
372+#~ msgid "You have been locked out due to too many failed passcode attempts."
373+#~ msgstr ""
374+#~ "Laite on lukittu liian monen virheellisen suojakoodiyrityksen jälkeen."
375+
376+#~ msgid "Please wait %1 minute and then try again…"
377+#~ msgid_plural "Please wait %1 minutes and then try again…"
378+#~ msgstr[0] "Odota %1 minuutti ja yritä sitten uudelleen…"
379+#~ msgstr[1] "Odota %1 minuuttia ja yritä sitten uudelleen…"
380+
381+#~ msgid "Pull to refresh…"
382+#~ msgstr "Vedä päivittääksesi…"
383+
384+#~ msgid "Release to refresh…"
385+#~ msgstr "Vapauta päivittääksesi…"
386+
387+#~ msgid "Unlock"
388+#~ msgstr "Avaa lukitus"
389+
390+#~ msgid "Enter passphrase"
391+#~ msgstr "Anna tunnuslause"
392+
393+#~ msgid "Please re-enter"
394+#~ msgstr "Anna uudelleen"
395+
396+#~ msgid "Enter passcode"
397+#~ msgstr "Anna suojakoodi"
398+
399+#~ msgid "Enter %1"
400+#~ msgstr "Anna %1"
po/fo.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
13"Language-Team: Faroese <fo@li.org>\n"
13"Language-Team: Faroese <fo@li.org>\n"
14+"Language: fo\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/fr.po+47−10
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-29 10:31+0000\n"
11+"PO-Revision-Date: 2014-10-09 19:00+0000\n"
12−"Last-Translator: Sébastien Maes <nautilussebastien@gmail.com>\n"
12+"Last-Translator: Anne <anneonyme017@gmail.com>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
14+"Language: fr\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n > 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -98,8 +100,7 @@ msgstr "Bord droit"
98
100
99#: qml/Components/EdgeDemo.qml:113
101#: qml/Components/EdgeDemo.qml:113
100msgid "Try swiping from the right edge to unlock the phone"
102msgid "Try swiping from the right edge to unlock the phone"
101−msgstr ""
102−"Faites glisser votre doigt à partir du bord droit pour déverrouiller."
103+msgstr "Faites glisser votre doigt à partir du bord droit pour déverrouiller."
103
104
104#: qml/Components/EdgeDemo.qml:144
105#: qml/Components/EdgeDemo.qml:144
105msgid "Top edge"
106msgid "Top edge"
@@ -215,7 +216,7 @@ msgstr "Envoyer"
215
216
216#: qml/Dash/ScopesOverview.qml:206
217#: qml/Dash/ScopesOverview.qml:206
217msgid "Manage Scopes"
218msgid "Manage Scopes"
218−msgstr ""
219+msgstr "Gérer les moteurs de recherche"
219
220
220#: qml/Dash/ScopesOverview.qml:428
221#: qml/Dash/ScopesOverview.qml:428
221msgid "Done"
222msgid "Done"
@@ -279,7 +280,7 @@ msgstr "Conférence"
279
280
280#: qml/Panel/Indicators/MenuItemFactory.qml:600
281#: qml/Panel/Indicators/MenuItemFactory.qml:600
281msgid "Nothing is playing"
282msgid "Nothing is playing"
282−msgstr ""
283+msgstr "Rien n'est en cours de lecture"
283
284
284#: qml/Panel/Indicators/MenuItemFactory.qml:748
285#: qml/Panel/Indicators/MenuItemFactory.qml:748
285msgid "In queue…"
286msgid "In queue…"
@@ -369,5 +370,41 @@ msgstr ""
369"réinitialisation aux paramètres d'usine et toutes les données personnelles "
370"réinitialisation aux paramètres d'usine et toutes les données personnelles "
370"seront supprimées."
371"seront supprimées."
371
372
372−#~ msgid "Manage Dash"
373+#~ msgid "Device Locked"
373−#~ msgstr "Gérer le tableau de bord"
374+#~ msgstr "Périphérique verrouillé"
375+
376+#~ msgid "You have been locked out due to too many failed passphrase attempts."
377+#~ msgstr ""
378+#~ "Vous avez été bloqué suite à un trop grand nombre de tentatives de saisie "
379+#~ "d'une phrase de passe erronée."
380+
381+#~ msgid "You have been locked out due to too many failed passcode attempts."
382+#~ msgstr ""
383+#~ "Vous avez été bloqué suite à un trop grand nombre de tentatives de saisie "
384+#~ "d'un mot de passe erroné."
385+
386+#~ msgid "Please wait %1 minute and then try again…"
387+#~ msgid_plural "Please wait %1 minutes and then try again…"
388+#~ msgstr[0] "Veuillez patienter %1 minute et réessayer..."
389+#~ msgstr[1] "Veuillez patienter %1 minutes et réessayer..."
390+
391+#~ msgid "Pull to refresh…"
392+#~ msgstr "Tirer pour actualiser..."
393+
394+#~ msgid "Release to refresh…"
395+#~ msgstr "Relâcher pour actualiser..."
396+
397+#~ msgid "Unlock"
398+#~ msgstr "Déverrouiller"
399+
400+#~ msgid "Enter passphrase"
401+#~ msgstr "Saisissez la phrase de passe"
402+
403+#~ msgid "Please re-enter"
404+#~ msgstr "Veuillez ressaisir"
405+
406+#~ msgid "Enter passcode"
407+#~ msgstr "Saisissez le mot de passe"
408+
409+#~ msgid "Enter %1"
410+#~ msgstr "Saisissez %1"
po/gd.po+48−8
@@ -6,17 +6,19 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-25 12:40+0000\n"
11+"PO-Revision-Date: 2014-10-09 18:09+0000\n"
12"Last-Translator: GunChleoc <Unknown>\n"
12"Last-Translator: GunChleoc <Unknown>\n"
13"Language-Team: Fòram na Gàidhlig\n"
13"Language-Team: Fòram na Gàidhlig\n"
14+"Language: gd\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
19+"(n > 2 && n < 20) ? 2 : 3;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19−"Language: gd\n"
20
22
21#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
22msgid "Password: "
24msgid "Password: "
@@ -215,7 +217,7 @@ msgstr "Cuir"
215
217
216#: qml/Dash/ScopesOverview.qml:206
218#: qml/Dash/ScopesOverview.qml:206
217msgid "Manage Scopes"
219msgid "Manage Scopes"
218−msgstr ""
220+msgstr "Stiùirich na sgòpaichean"
219
221
220#: qml/Dash/ScopesOverview.qml:428
222#: qml/Dash/ScopesOverview.qml:428
221msgid "Done"
223msgid "Done"
@@ -279,7 +281,7 @@ msgstr "Gairm co-labhairt"
279
281
280#: qml/Panel/Indicators/MenuItemFactory.qml:600
282#: qml/Panel/Indicators/MenuItemFactory.qml:600
281msgid "Nothing is playing"
283msgid "Nothing is playing"
282−msgstr ""
284+msgstr "Chan eil dad 'ga chluich"
283
285
284#: qml/Panel/Indicators/MenuItemFactory.qml:748
286#: qml/Panel/Indicators/MenuItemFactory.qml:748
285msgid "In queue…"
287msgid "In queue…"
@@ -369,5 +371,43 @@ msgstr ""
369"shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta pearsanta "
371"shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta pearsanta "
370"a sguabadh às."
372"a sguabadh às."
371
373
372−#~ msgid "Manage Dash"
374+#~ msgid "Device Locked"
373−#~ msgstr "Stiùirich an deas-bhòrd"
375+#~ msgstr "Tha glas air an uidheam"
376+
377+#~ msgid "You have been locked out due to too many failed passphrase attempts."
378+#~ msgstr ""
379+#~ "Chaidh do glasadh a-mach às an uidheam on a chuir thu abairt-fhaire "
380+#~ "chearr a-steach cus tursan."
381+
382+#~ msgid "You have been locked out due to too many failed passcode attempts."
383+#~ msgstr ""
384+#~ "Chaidh do glasadh a-mach às an uidheam on a chuir thu còd-faire cearr a-"
385+#~ "steach cus tursan."
386+
387+#~ msgid "Please wait %1 minute and then try again…"
388+#~ msgid_plural "Please wait %1 minutes and then try again…"
389+#~ msgstr[0] "Fuirich ort %1 diog 's feuch ris a-rithist an uairsin…"
390+#~ msgstr[1] "Fuirich ort %1 dhiog 's feuch ris a-rithist an uairsin…"
391+#~ msgstr[2] "Fuirich ort %1 diogan 's feuch ris a-rithist an uairsin…"
392+#~ msgstr[3] "Fuirich ort %1 diog 's feuch ris a-rithist an uairsin…"
393+
394+#~ msgid "Pull to refresh…"
395+#~ msgstr "Tarraing airson ath-nuadhachadh…"
396+
397+#~ msgid "Release to refresh…"
398+#~ msgstr "Leig às airson ath-nuadhachadh…"
399+
400+#~ msgid "Unlock"
401+#~ msgstr "Thoir a' ghlas dheth"
402+
403+#~ msgid "Enter passphrase"
404+#~ msgstr "Cuir abairt-fhaire a-steach"
405+
406+#~ msgid "Please re-enter"
407+#~ msgstr "Cuir a-steach e a-rithist"
408+
409+#~ msgid "Enter passcode"
410+#~ msgstr "Cuir còd-faire a-steach"
411+
412+#~ msgid "Enter %1"
413+#~ msgstr "Cuir a-steach %1"
po/gl.po+39−5
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-28 13:57+0000\n"
11+"PO-Revision-Date: 2014-10-07 10:01+0000\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
13"Language-Team: Galician <gl@li.org>\n"
13"Language-Team: Galician <gl@li.org>\n"
14+"Language: gl\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,37 @@ msgstr ""
360"Se a clave introducida é incorrecta, o teléfono restabelecerá os valores de "
362"Se a clave introducida é incorrecta, o teléfono restabelecerá os valores de "
361"fábrica e perderá todos os datos persoais."
363"fábrica e perderá todos os datos persoais."
362
364
363−#~ msgid "Manage Dash"
365+#~ msgid "Device Locked"
364−#~ msgstr "Xestión do Panel"
366+#~ msgstr "Dispositivo bloqueado"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
369+#~ msgstr "Bloqueouse o dispositivo polos intentos fallidos da frase secreta."
370+
371+#~ msgid "You have been locked out due to too many failed passcode attempts."
372+#~ msgstr "Bloqueouse o dispositivo polos intentos fallidos da clave."
373+
374+#~ msgid "Please wait %1 minute and then try again…"
375+#~ msgid_plural "Please wait %1 minutes and then try again…"
376+#~ msgstr[0] "Agarde %1 minuto e ténteo de novo…"
377+#~ msgstr[1] "Agarde %1 minutos e ténteo de novo…"
378+
379+#~ msgid "Pull to refresh…"
380+#~ msgstr "Tirar para actualizar..."
381+
382+#~ msgid "Release to refresh…"
383+#~ msgstr "Soltar para actualizar"
384+
385+#~ msgid "Unlock"
386+#~ msgstr "Desbloquear"
387+
388+#~ msgid "Enter passphrase"
389+#~ msgstr "Introduza a frase secreta"
390+
391+#~ msgid "Please re-enter"
392+#~ msgstr "Introducir de novo"
393+
394+#~ msgid "Enter passcode"
395+#~ msgstr "Introduza a clave"
396+
397+#~ msgid "Enter %1"
398+#~ msgstr "Introducir %1"
po/he.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-08-23 14:19+0000\n"
11"PO-Revision-Date: 2014-08-23 14:19+0000\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
13"Language-Team: Hebrew <he@li.org>\n"
13"Language-Team: Hebrew <he@li.org>\n"
14+"Language: he\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/hi.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
12"Last-Translator: Siddhanathan S. <Unknown>\n"
12"Last-Translator: Siddhanathan S. <Unknown>\n"
13"Language-Team: Hindi <hi@li.org>\n"
13"Language-Team: Hindi <hi@li.org>\n"
14+"Language: hi\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/hr.po+5−2
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Croatian <hr@li.org>\n"
13"Language-Team: Croatian <hr@li.org>\n"
14+"Language: hr\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
19+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
po/hu.po+42−7
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-28 09:02+0000\n"
11+"PO-Revision-Date: 2014-10-08 08:13+0000\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
14+"Language: hu\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -135,8 +137,8 @@ msgid ""
135"You have now mastered the edge gestures and can start using the "
137"You have now mastered the edge gestures and can start using the "
136"phone<br><br>Tap on the screen to start"
138"phone<br><br>Tap on the screen to start"
137msgstr ""
139msgstr ""
138−"Elsajátította a gesztusokat, és megkezdheti a telefon "
140+"Elsajátította a gesztusokat, és megkezdheti a telefon használatát."
139−"használatát.<br><br>Koppintson a képernyőre a kezdéshez."
141+"<br><br>Koppintson a képernyőre a kezdéshez."
140
142
141#: qml/Components/Lockscreen.qml:167
143#: qml/Components/Lockscreen.qml:167
142msgid "Please wait"
144msgid "Please wait"
@@ -362,5 +364,38 @@ msgstr ""
362"Ha helytelen jelkódot ad meg, a telefonja visszaállítja a gyári "
364"Ha helytelen jelkódot ad meg, a telefonja visszaállítja a gyári "
363"beállításokat és törli minden személyes adatát."
365"beállításokat és törli minden személyes adatát."
364
366
365−#~ msgid "Manage Dash"
367+#~ msgid "Device Locked"
368+#~ msgstr "Eszköz lezárva"
369+
370+#~ msgid "You have been locked out due to too many failed passphrase attempts."
366−#~ msgstr "Dash kezelése"
371+#~ msgstr ""
372+#~ "A túl sok hibás jelmondat próbálkozás miatt le lett zárva az eszköz."
373+
374+#~ msgid "You have been locked out due to too many failed passcode attempts."
375+#~ msgstr "A túl sok hibás jelkód próbálkozás miatt le lett zárva az eszköz."
376+
377+#~ msgid "Please wait %1 minute and then try again…"
378+#~ msgid_plural "Please wait %1 minutes and then try again…"
379+#~ msgstr[0] "Kérjük várjon %1 percet és próbálja újra…"
380+#~ msgstr[1] "Kérjük várjon %1 percet és próbálja újra…"
381+
382+#~ msgid "Pull to refresh…"
383+#~ msgstr "Húzza a frissítéshez…"
384+
385+#~ msgid "Release to refresh…"
386+#~ msgstr "Engedje el a frissítéshez…"
387+
388+#~ msgid "Unlock"
389+#~ msgstr "Feloldás"
390+
391+#~ msgid "Enter passphrase"
392+#~ msgstr "Jelmondat megadása"
393+
394+#~ msgid "Please re-enter"
395+#~ msgstr "Kérjük adja meg újra"
396+
397+#~ msgid "Enter passcode"
398+#~ msgstr "Jelkód megadása"
399+
400+#~ msgid "Enter %1"
401+#~ msgstr "Adja meg: %1"
po/hy.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
13"Language-Team: Armenian <hy@li.org>\n"
13"Language-Team: Armenian <hy@li.org>\n"
14+"Language: hy\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/id.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Indonesian <id@li.org>\n"
13"Language-Team: Indonesian <id@li.org>\n"
14+"Language: id\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/is.po+41−14
@@ -8,17 +8,18 @@
8msgid ""
8msgid ""
9msgstr ""
9msgstr ""
10"Project-Id-Version: po_unity8-is\n"
10"Project-Id-Version: po_unity8-is\n"
11−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11+"Report-Msgid-Bugs-To: \n"
12"POT-Creation-Date: 2014-09-24 10:43+0100\n"
12"POT-Creation-Date: 2014-09-24 10:43+0100\n"
13−"PO-Revision-Date: 2014-09-21 12:07+0000\n"
13+"PO-Revision-Date: 2014-10-09 10:49+0000\n"
14"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
14"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
15"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
15"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
16+"Language: is\n"
16"MIME-Version: 1.0\n"
17"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
19"Content-Transfer-Encoding: 8bit\n"
20+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
21+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
22"X-Generator: Launchpad (build 17196)\n"
21−"Language: is\n"
22
23
23#: plugins/LightDM/Greeter.cpp:130
24#: plugins/LightDM/Greeter.cpp:130
24msgid "Password: "
25msgid "Password: "
@@ -39,7 +40,7 @@ msgstr "Útskráning"
39
40
40#: qml/Components/Dialogs.qml:71
41#: qml/Components/Dialogs.qml:71
41msgid "Are you sure you want to log out?"
42msgid "Are you sure you want to log out?"
42−msgstr ""
43+msgstr "Ertu viss um að þú viljir skrá þig út?"
43
44
44#: qml/Components/Dialogs.qml:73 qml/Components/Dialogs.qml:97
45#: qml/Components/Dialogs.qml:73 qml/Components/Dialogs.qml:97
45#: qml/Components/Dialogs.qml:122
46#: qml/Components/Dialogs.qml:122
@@ -57,7 +58,7 @@ msgstr "Slökkva á tölvunni"
57
58
58#: qml/Components/Dialogs.qml:95
59#: qml/Components/Dialogs.qml:95
59msgid "Are you sure you want to shut down?"
60msgid "Are you sure you want to shut down?"
60−msgstr ""
61+msgstr "Ertu viss um að þú viljir slökkva á símanum?"
61
62
62#: qml/Components/Dialogs.qml:119
63#: qml/Components/Dialogs.qml:119
63msgid "Reboot"
64msgid "Reboot"
@@ -65,7 +66,7 @@ msgstr "Endurræsa"
65
66
66#: qml/Components/Dialogs.qml:120
67#: qml/Components/Dialogs.qml:120
67msgid "Are you sure you want to reboot?"
68msgid "Are you sure you want to reboot?"
68−msgstr ""
69+msgstr "Ertu viss að þú viljir enduræsa?"
69
70
70#: qml/Components/Dialogs.qml:144
71#: qml/Components/Dialogs.qml:144
71msgid "Power"
72msgid "Power"
@@ -76,6 +77,8 @@ msgid ""
76"Are you sure you would like\n"
77"Are you sure you would like\n"
77"to power off?"
78"to power off?"
78msgstr ""
79msgstr ""
80+"Ertu viss um að þú viljir\n"
81+"slökkva á símanum?"
79
82
80#: qml/Components/Dialogs.qml:147
83#: qml/Components/Dialogs.qml:147
81msgid "Power off"
84msgid "Power off"
@@ -306,7 +309,7 @@ msgstr "Aflæsa SIM-korti"
306
309
307#: qml/Panel/Indicators/RoamingIndication.qml:27
310#: qml/Panel/Indicators/RoamingIndication.qml:27
308msgid "Roaming"
311msgid "Roaming"
309−msgstr ""
312+msgstr "Ráphamur"
310
313
311#: qml/Shell.qml:320
314#: qml/Shell.qml:320
312msgid "Enter your passphrase"
315msgid "Enter your passphrase"
@@ -314,7 +317,7 @@ msgstr ""
314
317
315#: qml/Shell.qml:321
318#: qml/Shell.qml:321
316msgid "Sorry, incorrect passphrase"
319msgid "Sorry, incorrect passphrase"
317−msgstr ""
320+msgstr "Því miður, rangt lykilorð"
318
321
319#: qml/Shell.qml:323
322#: qml/Shell.qml:323
320msgid "Enter your passcode"
323msgid "Enter your passcode"
@@ -322,7 +325,7 @@ msgstr ""
322
325
323#: qml/Shell.qml:324
326#: qml/Shell.qml:324
324msgid "Sorry, incorrect passcode"
327msgid "Sorry, incorrect passcode"
325−msgstr ""
328+msgstr "Því miður, rangur aðgangskóði"
326
329
327#: qml/Shell.qml:327
330#: qml/Shell.qml:327
328#, qt-format
331#, qt-format
@@ -332,28 +335,52 @@ msgstr ""
332#: qml/Shell.qml:328
335#: qml/Shell.qml:328
333#, qt-format
336#, qt-format
334msgid "Sorry, incorrect %1"
337msgid "Sorry, incorrect %1"
335−msgstr ""
338+msgstr "Því miður, rangt %1"
336
339
337#: qml/Shell.qml:363
340#: qml/Shell.qml:363
338msgid "Sorry, incorrect passphrase."
341msgid "Sorry, incorrect passphrase."
339−msgstr ""
342+msgstr "Því miður, rangt lykilorð."
340
343
341#: qml/Shell.qml:364
344#: qml/Shell.qml:364
342msgid "Sorry, incorrect passcode."
345msgid "Sorry, incorrect passcode."
343−msgstr ""
346+msgstr "Því miður, rangur aðgangskóði."
344
347
345#: qml/Shell.qml:365
348#: qml/Shell.qml:365
346msgid "This will be your last attempt."
349msgid "This will be your last attempt."
347−msgstr ""
350+msgstr "Þetta mun verða síðasta tilraunin þín."
348
351
349#: qml/Shell.qml:367
352#: qml/Shell.qml:367
350msgid ""
353msgid ""
351"If passphrase is entered incorrectly, your phone will conduct a factory "
354"If passphrase is entered incorrectly, your phone will conduct a factory "
352"reset and all personal data will be deleted."
355"reset and all personal data will be deleted."
353msgstr ""
356msgstr ""
357+"Ef lykilorð er rangt, mun síminn frumstilla allt á verksmiðjustillingar og "
358+"öllum einkagögnum verður eytt."
354
359
355#: qml/Shell.qml:368
360#: qml/Shell.qml:368
356msgid ""
361msgid ""
357"If passcode is entered incorrectly, your phone will conduct a factory reset "
362"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"and all personal data will be deleted."
363"and all personal data will be deleted."
359msgstr ""
364msgstr ""
365+"Ef aðgangskóði er rangur, mun síminn frumstilla allt á verksmiðjustillingar "
366+"og öllum einkagögnum verður eytt."
367+
368+#~ msgid "Device Locked"
369+#~ msgstr "Tæki læst"
370+
371+#~ msgid "Please wait %1 minute and then try again…"
372+#~ msgid_plural "Please wait %1 minutes and then try again…"
373+#~ msgstr[0] "Bíddu í %1 mínútu og reyndu svo aftur"
374+#~ msgstr[1] "Bíddu í %1 mínútur og reyndu svo aftur"
375+
376+#~ msgid "Release to refresh…"
377+#~ msgstr "Slepptu til að endurlesa..."
378+
379+#~ msgid "Unlock"
380+#~ msgstr "Aflæsa"
381+
382+#~ msgid "Please re-enter"
383+#~ msgstr "Settu aftur inn"
384+
385+#~ msgid "Enter %1"
386+#~ msgstr "Settu inn %1"
po/it.po+9−11
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-28 15:31+0000\n"
11+"PO-Revision-Date: 2014-09-30 10:56+0000\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@li.org>\n"
14+"Language: it\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +84,7 @@ msgstr "Spegni"
82
84
83#: qml/Components/Dialogs.qml:157
85#: qml/Components/Dialogs.qml:157
84msgid "Restart"
86msgid "Restart"
85−msgstr ""
87+msgstr "Riavvia"
86
88
87#: qml/Components/Dialogs.qml:167
89#: qml/Components/Dialogs.qml:167
88msgid "Cancel"
90msgid "Cancel"
@@ -106,8 +108,7 @@ msgstr "Bordo superiore"
106
108
107#: qml/Components/EdgeDemo.qml:145
109#: qml/Components/EdgeDemo.qml:145
108msgid "Try swiping from the top edge to access the indicators"
110msgid "Try swiping from the top edge to access the indicators"
109−msgstr ""
110−"Provare a far scorrere dal bordo in alto per accedere agli indicatori"
111+msgstr "Provare a far scorrere dal bordo in alto per accedere agli indicatori"
111
112
112#: qml/Components/EdgeDemo.qml:170
113#: qml/Components/EdgeDemo.qml:170
113msgid "Close"
114msgid "Close"
@@ -213,7 +214,7 @@ msgstr "Invia"
213
214
214#: qml/Dash/ScopesOverview.qml:206
215#: qml/Dash/ScopesOverview.qml:206
215msgid "Manage Scopes"
216msgid "Manage Scopes"
216−msgstr ""
217+msgstr "Gestisci Scope"
217
218
218#: qml/Dash/ScopesOverview.qml:428
219#: qml/Dash/ScopesOverview.qml:428
219msgid "Done"
220msgid "Done"
@@ -277,7 +278,7 @@ msgstr "Conferenza"
277
278
278#: qml/Panel/Indicators/MenuItemFactory.qml:600
279#: qml/Panel/Indicators/MenuItemFactory.qml:600
279msgid "Nothing is playing"
280msgid "Nothing is playing"
280−msgstr ""
281+msgstr "Niente in riproduzione"
281
282
282#: qml/Panel/Indicators/MenuItemFactory.qml:748
283#: qml/Panel/Indicators/MenuItemFactory.qml:748
283msgid "In queue…"
284msgid "In queue…"
@@ -364,6 +365,3 @@ msgid ""
364msgstr ""
365msgstr ""
365"Se verrà inserito una passcode errato, il telefono eseguirà un ripristino "
366"Se verrà inserito una passcode errato, il telefono eseguirà un ripristino "
366"delle impostazioni di fabbrica e tutti i dati personali verranno eliminati."
367"delle impostazioni di fabbrica e tutti i dati personali verranno eliminati."
367−
368−#~ msgid "Manage Dash"
369−#~ msgstr "Gestione della Dash"
po/ja.po+14−9
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-09-18 09:47+0000\n"
11"PO-Revision-Date: 2014-09-18 09:47+0000\n"
12"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
12"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
13"Language-Team: Japanese <ja@li.org>\n"
13"Language-Team: Japanese <ja@li.org>\n"
14+"Language: ja\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -120,7 +122,8 @@ msgstr "左端"
120
122
121#: qml/Components/EdgeDemo.qml:199
123#: qml/Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
124msgid "Swipe from the left to reveal the launcher for quick access to apps"
125+msgstr ""
123−msgstr "アプリに素早くアクセスできるLauncherを表示するには左からスワイプしてください"
126+"アプリに素早くアクセスできるLauncherを表示するには左からスワイプしてください"
124
127
125#: qml/Components/EdgeDemo.qml:226
128#: qml/Components/EdgeDemo.qml:226
126msgid "Well done"
129msgid "Well done"
@@ -131,7 +134,8 @@ msgid ""
131"You have now mastered the edge gestures and can start using the "
134"You have now mastered the edge gestures and can start using the "
132"phone<br><br>Tap on the screen to start"
135"phone<br><br>Tap on the screen to start"
133msgstr ""
136msgstr ""
137+"これでスマートフォンの操作に必要な、画面端を用いたジェスチャーを習得できまし"
134−"これでスマートフォンの操作に必要な、画面端を用いたジェスチャーを習得できました。<br><br>利用を開始するなら画面をタップしてください"
138+"た。<br><br>利用を開始するなら画面をタップしてください"
135
139
136#: qml/Components/Lockscreen.qml:167
140#: qml/Components/Lockscreen.qml:167
137msgid "Please wait"
141msgid "Please wait"
@@ -345,13 +349,14 @@ msgstr "これが最後のチャンスです。"
345msgid ""
349msgid ""
346"If passphrase is entered incorrectly, your phone will conduct a factory "
350"If passphrase is entered incorrectly, your phone will conduct a factory "
347"reset and all personal data will be deleted."
351"reset and all personal data will be deleted."
352+msgstr ""
348−msgstr "パスフレーズが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
353+"パスフレーズが間違っている場合、ファクトリーリセットを実施し、すべての個人"
354+"データは削除されます。"
349
355
350#: qml/Shell.qml:368
356#: qml/Shell.qml:368
351msgid ""
357msgid ""
352"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
353"and all personal data will be deleted."
359"and all personal data will be deleted."
360+msgstr ""
354−msgstr "パスコードが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
361+"パスコードが間違っている場合、ファクトリーリセットを実施し、すべての個人デー"
355−
362+"タは削除されます。"
356−#~ msgid "Manage Dash"
357−#~ msgstr "Dashの管理"
po/km.po+11−17
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-08-20 02:48+0000\n"
11"PO-Revision-Date: 2014-08-20 02:48+0000\n"
12−"Last-Translator: Sok Sophea <sksophea@gmail.com>\n"
12+"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
13"Language-Team: Khmer <km@li.org>\n"
13"Language-Team: Khmer <km@li.org>\n"
14+"Language: \n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -122,9 +124,7 @@ msgstr "គែមឆ្វេង"
122
124
123#: qml/Components/EdgeDemo.qml:199
125#: qml/Components/EdgeDemo.qml:199
124msgid "Swipe from the left to reveal the launcher for quick access to apps"
126msgid "Swipe from the left to reveal the launcher for quick access to apps"
125−msgstr ""
126−"អូស​ពី​គែម​ឆ្វេង "
127−"ដើម្បី​បង្ហាញ​កម្មវិធី​ចាប់ផ្ដើម​សម្រាប់​ចូល​ដំណើរ​ការ​កម្មវិធី​រហ័ស"
127+msgstr "អូស​ពី​គែម​ឆ្វេង ដើម្បី​បង្ហាញ​កម្មវិធី​ចាប់ផ្ដើម​សម្រាប់​ចូល​ដំណើរ​ការ​កម្មវិធី​រហ័ស"
128
128
129#: qml/Components/EdgeDemo.qml:226
129#: qml/Components/EdgeDemo.qml:226
130msgid "Well done"
130msgid "Well done"
@@ -135,8 +135,7 @@ msgid ""
135"You have now mastered the edge gestures and can start using the "
135"You have now mastered the edge gestures and can start using the "
136"phone<br><br>Tap on the screen to start"
136"phone<br><br>Tap on the screen to start"
137msgstr ""
137msgstr ""
138−"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
139−"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
138+"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
140
139
141#: qml/Components/Lockscreen.qml:167
140#: qml/Components/Lockscreen.qml:167
142msgid "Please wait"
141msgid "Please wait"
@@ -351,18 +350,13 @@ msgid ""
351"If passphrase is entered incorrectly, your phone will conduct a factory "
350"If passphrase is entered incorrectly, your phone will conduct a factory "
352"reset and all personal data will be deleted."
351"reset and all personal data will be deleted."
353msgstr ""
352msgstr ""
354−"បើ​បញ្ចូល​ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ "
355−"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
353+"បើ​បញ្ចូល​ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​"
356−"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
354+"របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
357
355
358#: qml/Shell.qml:368
356#: qml/Shell.qml:368
359msgid ""
357msgid ""
360"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
361"and all personal data will be deleted."
359"and all personal data will be deleted."
362msgstr ""
360msgstr ""
363−"បើ​បញ្ចូល​កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ "
364−"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
361+"បើ​បញ្ចូល​កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​"
365−"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
362+"របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
366−
367−#~ msgid "Manage Dash"
368−#~ msgstr "គ្រប់គ្រង​ផ្ទាំង"
po/kn.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kannada <kn@li.org>\n"
13"Language-Team: Kannada <kn@li.org>\n"
14+"Language: kn\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/ko.po+45−7
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-08-19 13:02+0000\n"
11"PO-Revision-Date: 2014-08-19 13:02+0000\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
13"Language-Team: Korean <ko@li.org>\n"
13"Language-Team: Korean <ko@li.org>\n"
14+"Language: ko\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -131,7 +133,8 @@ msgid ""
131"You have now mastered the edge gestures and can start using the "
133"You have now mastered the edge gestures and can start using the "
132"phone<br><br>Tap on the screen to start"
134"phone<br><br>Tap on the screen to start"
133msgstr ""
135msgstr ""
134−"여러분은 가장자리에서 끌어오기 제스쳐를 완벽히 익히셨고 휴대 전화를 사용할 수 있습니다. <br><br> 스크린을 터치해서 시작하세요."
136+"여러분은 가장자리에서 끌어오기 제스쳐를 완벽히 익히셨고 휴대 전화를 사용할 "
137+"수 있습니다. <br><br> 스크린을 터치해서 시작하세요."
135
138
136#: qml/Components/Lockscreen.qml:167
139#: qml/Components/Lockscreen.qml:167
137msgid "Please wait"
140msgid "Please wait"
@@ -345,13 +348,48 @@ msgstr "마지막 시도입니다."
345msgid ""
348msgid ""
346"If passphrase is entered incorrectly, your phone will conduct a factory "
349"If passphrase is entered incorrectly, your phone will conduct a factory "
347"reset and all personal data will be deleted."
350"reset and all personal data will be deleted."
351+msgstr ""
348−msgstr "이번에도 올바르지 않은 패스프레이즈를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
352+"이번에도 올바르지 않은 패스프레이즈를 입력하면 휴대 전화를 공장 초기화하여 모"
353+"든 개인 정보를 삭제합니다."
349
354
350#: qml/Shell.qml:368
355#: qml/Shell.qml:368
351msgid ""
356msgid ""
352"If passcode is entered incorrectly, your phone will conduct a factory reset "
357"If passcode is entered incorrectly, your phone will conduct a factory reset "
353"and all personal data will be deleted."
358"and all personal data will be deleted."
359+msgstr ""
354−msgstr "이번에도 올바르지 않은 패스코드를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
360+"이번에도 올바르지 않은 패스코드를 입력하면 휴대 전화를 공장 초기화하여 모든 "
361+"개인 정보를 삭제합니다."
362+
363+#~ msgid "Device Locked"
364+#~ msgstr "장치가 잠김"
365+
366+#~ msgid "You have been locked out due to too many failed passphrase attempts."
367+#~ msgstr "올바르지 않은 패스프레이즈를 너무 많이 입력해 장치가 잠겼습니다."
368+
369+#~ msgid "You have been locked out due to too many failed passcode attempts."
370+#~ msgstr "올바르지 않은 패스코드를 너무 많이 입력해 장치가 잠겼습니다."
371+
372+#~ msgid "Please wait %1 minute and then try again…"
373+#~ msgid_plural "Please wait %1 minutes and then try again…"
374+#~ msgstr[0] "%1분 정도 기다린 후 다시 시독해주십시오..."
375+
376+#~ msgid "Pull to refresh…"
377+#~ msgstr "당기면 새로 고침..."
378+
379+#~ msgid "Release to refresh…"
380+#~ msgstr "놓으면 새로 고침..."
381+
382+#~ msgid "Unlock"
383+#~ msgstr "잠금 해제"
384+
385+#~ msgid "Enter passphrase"
386+#~ msgstr "패스프레이즈를 입력해주십시오."
387+
388+#~ msgid "Please re-enter"
389+#~ msgstr "다시 입력해주십시오."
390+
391+#~ msgid "Enter passcode"
392+#~ msgstr "패스코드를 입력해주십시오."
355
393
356−#~ msgid "Manage Dash"
394+#~ msgid "Enter %1"
357−#~ msgstr "대시 관리"
395+#~ msgstr "%1 입력"
po/ku.po+65−52
@@ -7,14 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-10 13:14+0000\n"
11"PO-Revision-Date: 2014-09-10 13:14+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Kurdish <ku@li.org>\n"
13"Language-Team: Kurdish <ku@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
19
20
20#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -30,6 +31,25 @@ msgstr "Kurteriyê pêveke"
30msgid "Unpin shortcut"
31msgid "Unpin shortcut"
31msgstr "Derzîdanka kurteriyê rake"
32msgstr "Derzîdanka kurteriyê rake"
32
33
34+#: qml/Components/DelayedLockscreen.qml:47
35+msgid "Device Locked"
36+msgstr ""
37+
38+#: qml/Components/DelayedLockscreen.qml:62
39+msgid "You have been locked out due to too many failed passphrase attempts."
40+msgstr ""
41+
42+#: qml/Components/DelayedLockscreen.qml:63
43+msgid "You have been locked out due to too many failed passcode attempts."
44+msgstr ""
45+
46+#: qml/Components/DelayedLockscreen.qml:72
47+#, qt-format
48+msgid "Please wait %1 minute and then try again…"
49+msgid_plural "Please wait %1 minutes and then try again…"
50+msgstr[0] ""
51+msgstr[1] ""
52+
33#: qml/Components/Dialogs.qml:70
53#: qml/Components/Dialogs.qml:70
34msgid "Log out"
54msgid "Log out"
35msgstr "Derkeve"
55msgstr "Derkeve"
@@ -135,40 +155,23 @@ msgid ""
135msgstr ""
155msgstr ""
136"Tu tevgerên kêlekê fêr bûyî<br><br>Ji bo destpêkirinê ekranê bipelîne"
156"Tu tevgerên kêlekê fêr bûyî<br><br>Ji bo destpêkirinê ekranê bipelîne"
137
157
138−#: qml/Components/Lockscreen.qml:167
158+#: qml/Components/Lockscreen.qml:220
139−msgid "Please wait"
140−msgstr "Tika ye li bendê bimîne"
141−
142−#: qml/Components/Lockscreen.qml:172
143−msgid "Too many incorrect attempts"
144−msgstr "Te gelek caran ceribandinên çewt kirin"
145−
146−#: qml/Components/Lockscreen.qml:206
147msgid "Emergency Call"
159msgid "Emergency Call"
148msgstr "Lêgerîna Lezgîn"
160msgstr "Lêgerîna Lezgîn"
149
161
150−#: qml/Components/Lockscreen.qml:226
162+#: qml/Components/Lockscreen.qml:252
151msgid "OK"
163msgid "OK"
152msgstr "BAŞ E"
164msgstr "BAŞ E"
153
165
154−#: qml/Components/PassphraseLockscreen.qml:61
155−#, qt-format
156−msgid "Hello %1"
157−msgstr "Silav %1"
158−
159−#: qml/Components/PassphraseLockscreen.qml:61
160−msgid "Hello"
161−msgstr "Silav"
162−
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
167msgid "See less"
165msgstr "Hindiktir bibîne"
168msgstr "Hindiktir bibîne"
166
169
167−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
171msgid "See all"
169msgstr "Tevî bibîne"
172msgstr "Tevî bibîne"
170
173
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
175#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
176msgid "Search"
174msgstr "Lêgerîn"
177msgstr "Lêgerîn"
@@ -205,6 +208,14 @@ msgstr "Binirxîne"
205msgid "Send"
208msgid "Send"
206msgstr "Bişîne"
209msgstr "Bişîne"
207
210
211+#: qml/Dash/PullToRefreshScopeStyle.qml:55
212+msgid "Pull to refresh…"
213+msgstr ""
214+
215+#: qml/Dash/PullToRefreshScopeStyle.qml:60
216+msgid "Release to refresh…"
217+msgstr ""
218+
208#: qml/Dash/ScopesOverview.qml:206
219#: qml/Dash/ScopesOverview.qml:206
209msgid "Manage Scopes"
220msgid "Manage Scopes"
210msgstr ""
221msgstr ""
@@ -226,8 +237,8 @@ msgid "All"
226msgstr "Hemû"
237msgstr "Hemû"
227
238
228#: qml/Greeter/Greeter.qml:157
239#: qml/Greeter/Greeter.qml:157
229−msgid "Swipe to unlock"
240+msgid "Unlock"
230−msgstr "Ji bo vekirinê kaş bike"
241+msgstr ""
231
242
232#: qml/Hud/HudParametrizedActionsPage.qml:139
243#: qml/Hud/HudParametrizedActionsPage.qml:139
233msgid "Confirm"
244msgid "Confirm"
@@ -249,18 +260,10 @@ msgstr "Niha biaxive..."
249msgid "Speaking..."
260msgid "Speaking..."
250msgstr "Diaxive..."
261msgstr "Diaxive..."
251
262
252−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
253msgid "Show password"
264msgid "Show password"
254msgstr "Şîfreyê nîşan bide"
265msgstr "Şîfreyê nîşan bide"
255
266
256−#: qml/Notifications/NotificationMenuItemFactory.qml:124
257−msgid "Enter SIM PIN"
258−msgstr "PINa SIMê binivîse"
259−
260−#: qml/Notifications/NotificationMenuItemFactory.qml:125
261−msgid "Sorry, incorrect PIN"
262−msgstr "Bibore, PIN çewt e"
263−
264#: qml/Panel/ActiveCallHint.qml:77
267#: qml/Panel/ActiveCallHint.qml:77
265msgid "Tap to return to call..."
268msgid "Tap to return to call..."
266msgstr "Ji bo vegerî lêgerînê bipelîne..."
269msgstr "Ji bo vegerî lêgerînê bipelîne..."
@@ -305,45 +308,49 @@ msgstr "Kilîda SIMê veke"
305msgid "Roaming"
308msgid "Roaming"
306msgstr "Geriyan"
309msgstr "Geriyan"
307
310
308−#: qml/Shell.qml:320
311+#: qml/Shell.qml:346
309−msgid "Enter your passphrase"
312+msgid "Enter passphrase"
310−msgstr "Parolaya xwe binivîse"
313+msgstr ""
311
314
312−#: qml/Shell.qml:321
315+#: qml/Shell.qml:347
313msgid "Sorry, incorrect passphrase"
316msgid "Sorry, incorrect passphrase"
314msgstr "Bibore, parola çewt e"
317msgstr "Bibore, parola çewt e"
315
318
316−#: qml/Shell.qml:323
319+#: qml/Shell.qml:348
320+msgid "Please re-enter"
321+msgstr ""
322+
323+#: qml/Shell.qml:350
317−msgid "Enter your passcode"
324+msgid "Enter passcode"
318−msgstr "Parolaya xwe binivîse"
325+msgstr ""
319
326
320−#: qml/Shell.qml:324
327+#: qml/Shell.qml:351
321msgid "Sorry, incorrect passcode"
328msgid "Sorry, incorrect passcode"
322msgstr "Bibore, parola çewrt e"
329msgstr "Bibore, parola çewrt e"
323
330
324−#: qml/Shell.qml:327
331+#: qml/Shell.qml:354
325#, qt-format
332#, qt-format
326−msgid "Enter your %1"
333+msgid "Enter %1"
327−msgstr "%1a xwe binivîse"
334+msgstr ""
328
335
329−#: qml/Shell.qml:328
336+#: qml/Shell.qml:355
330#, qt-format
337#, qt-format
331msgid "Sorry, incorrect %1"
338msgid "Sorry, incorrect %1"
332msgstr "Bibore, %1 çewt e"
339msgstr "Bibore, %1 çewt e"
333
340
334−#: qml/Shell.qml:363
341+#: qml/Shell.qml:390
335msgid "Sorry, incorrect passphrase."
342msgid "Sorry, incorrect passphrase."
336msgstr "Bibore, parola çewt e."
343msgstr "Bibore, parola çewt e."
337
344
338−#: qml/Shell.qml:364
345+#: qml/Shell.qml:391
339msgid "Sorry, incorrect passcode."
346msgid "Sorry, incorrect passcode."
340msgstr "Bibore, parola çewt e."
347msgstr "Bibore, parola çewt e."
341
348
342−#: qml/Shell.qml:365
349+#: qml/Shell.qml:392
343msgid "This will be your last attempt."
350msgid "This will be your last attempt."
344msgstr "Ev ê ceribandina dawiyê be."
351msgstr "Ev ê ceribandina dawiyê be."
345
352
346−#: qml/Shell.qml:367
353+#: qml/Shell.qml:394
347msgid ""
354msgid ""
348"If passphrase is entered incorrectly, your phone will conduct a factory "
355"If passphrase is entered incorrectly, your phone will conduct a factory "
349"reset and all personal data will be deleted."
356"reset and all personal data will be deleted."
@@ -351,10 +358,16 @@ msgstr ""
351"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
358"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
352"hemû daneyên te yên taybet dê bên jêbirin."
359"hemû daneyên te yên taybet dê bên jêbirin."
353
360
354−#: qml/Shell.qml:368
361+#: qml/Shell.qml:395
355msgid ""
362msgid ""
356"If passcode is entered incorrectly, your phone will conduct a factory reset "
363"If passcode is entered incorrectly, your phone will conduct a factory reset "
357"and all personal data will be deleted."
364"and all personal data will be deleted."
358msgstr ""
365msgstr ""
359"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
366"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
360"hemû daneyên te yên taybet dê bên jêbirin."
367"hemû daneyên te yên taybet dê bên jêbirin."
368+
369+#~ msgid "Sorry, incorrect PIN"
370+#~ msgstr "Bibore, PIN çewt e"
371+
372+#~ msgid "Enter SIM PIN"
373+#~ msgstr "PINa SIMê binivîse"
po/ky.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
14+"Language: ky\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/lo.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
13"Language-Team: Lao <lo@li.org>\n"
13"Language-Team: Lao <lo@li.org>\n"
14+"Language: \n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/lt.po+5−2
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
14+"Language: lt\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
19+"%100<10 || n%100>=20) ? 1 : 2;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
po/lv.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-08-21 09:46+0000\n"
11"PO-Revision-Date: 2014-08-21 09:46+0000\n"
12"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
12"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
13"Language-Team: Latvian <lv@li.org>\n"
13"Language-Team: Latvian <lv@li.org>\n"
14+"Language: lv\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/ml.po+5−4
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
12"Last-Translator: ST Alfas <Unknown>\n"
12"Last-Translator: ST Alfas <Unknown>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
14+"Language: ml\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -121,8 +123,7 @@ msgstr "ഇടത് വശം"
121#: qml/Components/EdgeDemo.qml:199
123#: qml/Components/EdgeDemo.qml:199
122msgid "Swipe from the left to reveal the launcher for quick access to apps"
124msgid "Swipe from the left to reveal the launcher for quick access to apps"
123msgstr ""
125msgstr ""
124−"പ്രയോഗങ്ങള്‍ പെട്ടെന്ന് ലഭ്യമാക്കുന്ന വിക്ഷേപിക ലഭ്യമാക്കാന്‍ ഇടതു വശത്ത് "
126+"പ്രയോഗങ്ങള്‍ പെട്ടെന്ന് ലഭ്യമാക്കുന്ന വിക്ഷേപിക ലഭ്യമാക്കാന്‍ ഇടതു വശത്ത് നിന്നും സ്വൈപ് ചെയ്യുക"
125−"നിന്നും സ്വൈപ് ചെയ്യുക"
126
127
127#: qml/Components/EdgeDemo.qml:226
128#: qml/Components/EdgeDemo.qml:226
128msgid "Well done"
129msgid "Well done"
po/mr.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
13"Language-Team: Marathi <mr@li.org>\n"
13"Language-Team: Marathi <mr@li.org>\n"
14+"Language: mr\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/ms.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
12"Last-Translator: abuyop <Unknown>\n"
12"Last-Translator: abuyop <Unknown>\n"
13"Language-Team: Malay <ms@li.org>\n"
13"Language-Team: Malay <ms@li.org>\n"
14+"Language: ms\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/my.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
13"Language-Team: Burmese <my@li.org>\n"
13"Language-Team: Burmese <my@li.org>\n"
14+"Language: my\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/nb.po+43−7
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-20 12:02+0000\n"
11+"PO-Revision-Date: 2014-10-07 10:32+0000\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
14+"Language: nb\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -208,7 +210,7 @@ msgstr "Send"
208
210
209#: qml/Dash/ScopesOverview.qml:206
211#: qml/Dash/ScopesOverview.qml:206
210msgid "Manage Scopes"
212msgid "Manage Scopes"
211−msgstr ""
213+msgstr "Håndter virkefelt"
212
214
213#: qml/Dash/ScopesOverview.qml:428
215#: qml/Dash/ScopesOverview.qml:428
214msgid "Done"
216msgid "Done"
@@ -272,7 +274,7 @@ msgstr "Konferanse"
272
274
273#: qml/Panel/Indicators/MenuItemFactory.qml:600
275#: qml/Panel/Indicators/MenuItemFactory.qml:600
274msgid "Nothing is playing"
276msgid "Nothing is playing"
275−msgstr ""
277+msgstr "Ingenting spilles nå"
276
278
277#: qml/Panel/Indicators/MenuItemFactory.qml:748
279#: qml/Panel/Indicators/MenuItemFactory.qml:748
278msgid "In queue…"
280msgid "In queue…"
@@ -360,5 +362,39 @@ msgstr ""
360"Hvis du skriver feil kode en gang til, tilbakestilles telefonen til "
362"Hvis du skriver feil kode en gang til, tilbakestilles telefonen til "
361"fabrikkinnstillinger, og alle personlige data slettes."
363"fabrikkinnstillinger, og alle personlige data slettes."
362
364
363−#~ msgid "Manage Dash"
365+#~ msgid "Device Locked"
364−#~ msgstr "Håndter dashbord"
366+#~ msgstr "Enheten er låst"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
369+#~ msgstr ""
370+#~ "Du har skrevet inn feil passordfrase for mange ganger, og er derfor "
371+#~ "utestengt."
372+
373+#~ msgid "You have been locked out due to too many failed passcode attempts."
374+#~ msgstr "Du har tastet feil kode for mange ganger, og er derfor utestengt."
375+
376+#~ msgid "Please wait %1 minute and then try again…"
377+#~ msgid_plural "Please wait %1 minutes and then try again…"
378+#~ msgstr[0] "Vent i %1 minutt, og prøv deretter på nytt …"
379+#~ msgstr[1] "Vent i %1 minutter, og prøv deretter på nytt …"
380+
381+#~ msgid "Pull to refresh…"
382+#~ msgstr "Dra for å oppdatere …"
383+
384+#~ msgid "Release to refresh…"
385+#~ msgstr "Slipp for å oppdatere …"
386+
387+#~ msgid "Unlock"
388+#~ msgstr "Lås opp"
389+
390+#~ msgid "Enter passphrase"
391+#~ msgstr "Skriv inn passordfrase"
392+
393+#~ msgid "Please re-enter"
394+#~ msgstr "Skriv inn på nytt"
395+
396+#~ msgid "Enter passcode"
397+#~ msgstr "Tast kode"
398+
399+#~ msgid "Enter %1"
400+#~ msgstr "Skriv inn %1"
po/nl.po+43−5
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-28 16:19+0000\n"
11+"PO-Revision-Date: 2014-10-08 19:53+0000\n"
12"Last-Translator: rob <linuxned@gmail.com>\n"
12"Last-Translator: rob <linuxned@gmail.com>\n"
13"Language-Team: Dutch <nl@li.org>\n"
13"Language-Team: Dutch <nl@li.org>\n"
14+"Language: nl\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,41 @@ msgstr ""
360"Wanneer de toegangscode nu opnieuw onjuist wordt ingevoerd, zal uw telefoon "
362"Wanneer de toegangscode nu opnieuw onjuist wordt ingevoerd, zal uw telefoon "
361"teruggaan naar de fabrieksinstellingen en zal al uw eigen data verloren gaan."
363"teruggaan naar de fabrieksinstellingen en zal al uw eigen data verloren gaan."
362
364
363−#~ msgid "Manage Dash"
365+#~ msgid "Device Locked"
366+#~ msgstr "Apparaat vergrendeld"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
364−#~ msgstr "Snelzoeker-beheer"
369+#~ msgstr ""
370+#~ "U werd de toegang geweigerd omdat u te vaak een onjuiste wachtwoordzin "
371+#~ "heeft ingevoerd."
372+
373+#~ msgid "You have been locked out due to too many failed passcode attempts."
374+#~ msgstr ""
375+#~ "U werd de toegang geweigerd omdat u te vaak een onjuiste toegangscode "
376+#~ "heeft ingevoerd."
377+
378+#~ msgid "Please wait %1 minute and then try again…"
379+#~ msgid_plural "Please wait %1 minutes and then try again…"
380+#~ msgstr[0] "Wacht a.u.b. %1 minuut en probeer het dan opnieuw…"
381+#~ msgstr[1] "Wacht a.u.b. %1 minuten en probeer het dan opnieuw…"
382+
383+#~ msgid "Pull to refresh…"
384+#~ msgstr "Trekken om te verversen…"
385+
386+#~ msgid "Release to refresh…"
387+#~ msgstr "Loslaten om te verversen…"
388+
389+#~ msgid "Unlock"
390+#~ msgstr "Ontgrendelen"
391+
392+#~ msgid "Enter passphrase"
393+#~ msgstr "Voer wachtwoordzin in"
394+
395+#~ msgid "Please re-enter"
396+#~ msgstr "Herhaal deze a.u.b."
397+
398+#~ msgid "Enter passcode"
399+#~ msgstr "Voer toegangscode in"
400+
401+#~ msgid "Enter %1"
402+#~ msgstr "Voer %1 in"
po/pl.po+7−4
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-08-18 20:25+0000\n"
11"PO-Revision-Date: 2014-08-18 20:25+0000\n"
12"Last-Translator: Paweł Stroka <pawstr@gmail.com>\n"
12"Last-Translator: Paweł Stroka <pawstr@gmail.com>\n"
13"Language-Team: Polish <pl@li.org>\n"
13"Language-Team: Polish <pl@li.org>\n"
14+"Language: pl\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
19+"|| n%100>=20) ? 1 : 2;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
@@ -133,8 +136,8 @@ msgid ""
133"You have now mastered the edge gestures and can start using the "
136"You have now mastered the edge gestures and can start using the "
134"phone<br><br>Tap on the screen to start"
137"phone<br><br>Tap on the screen to start"
135msgstr ""
138msgstr ""
136−"Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do "
139+"Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do pracy."
137−"pracy.<br><br>Dotknij ekranu by rozpocząć"
140+"<br><br>Dotknij ekranu by rozpocząć"
138
141
139#: qml/Components/Lockscreen.qml:167
142#: qml/Components/Lockscreen.qml:167
140msgid "Please wait"
143msgid "Please wait"
po/pt.po+39−5
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-28 18:52+0000\n"
11+"PO-Revision-Date: 2014-10-07 08:31+0000\n"
12"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
12"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
14+"Language: pt\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -361,5 +363,37 @@ msgstr ""
361"Se a senha for introduzida incorretamente, o seu telemóvel vai apagar todos "
363"Se a senha for introduzida incorretamente, o seu telemóvel vai apagar todos "
362"os seus dados pessoais."
364"os seus dados pessoais."
363
365
364−#~ msgid "Manage Dash"
366+#~ msgid "Device Locked"
365−#~ msgstr "Gerir o Dash"
367+#~ msgstr "Dispositivo bloqueado"
368+
369+#~ msgid "You have been locked out due to too many failed passphrase attempts."
370+#~ msgstr "Foi bloqueado devido a muitas tentativas falhadas da frase-senha."
371+
372+#~ msgid "You have been locked out due to too many failed passcode attempts."
373+#~ msgstr "Foi bloqueado devido a muitas tentativas falhadas da senha."
374+
375+#~ msgid "Please wait %1 minute and then try again…"
376+#~ msgid_plural "Please wait %1 minutes and then try again…"
377+#~ msgstr[0] "Por favor, aguarde %1 minuto e tente novamente…"
378+#~ msgstr[1] "Por favor, aguarde %1 minutos e tente novamente…"
379+
380+#~ msgid "Pull to refresh…"
381+#~ msgstr "Puxe para atualizar..."
382+
383+#~ msgid "Release to refresh…"
384+#~ msgstr "Solte para atualizar..."
385+
386+#~ msgid "Unlock"
387+#~ msgstr "Desbloquear"
388+
389+#~ msgid "Enter passphrase"
390+#~ msgstr "Indique a frase-senha"
391+
392+#~ msgid "Please re-enter"
393+#~ msgstr "Por favor, volte a introduzir"
394+
395+#~ msgid "Enter passcode"
396+#~ msgstr "Introduza senha"
397+
398+#~ msgid "Enter %1"
399+#~ msgstr "Introduziu %1"
po/pt_BR.po+8−9
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-27 19:23+0000\n"
11+"PO-Revision-Date: 2014-09-30 17:37+0000\n"
12"Last-Translator: Rafael Neri <Unknown>\n"
12"Last-Translator: Rafael Neri <Unknown>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
14+"Language: pt_BR\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n > 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +84,7 @@ msgstr "Desligar"
82
84
83#: qml/Components/Dialogs.qml:157
85#: qml/Components/Dialogs.qml:157
84msgid "Restart"
86msgid "Restart"
85−msgstr ""
87+msgstr "Reiniciar"
86
88
87#: qml/Components/Dialogs.qml:167
89#: qml/Components/Dialogs.qml:167
88msgid "Cancel"
90msgid "Cancel"
@@ -210,7 +212,7 @@ msgstr "Enviar"
210
212
211#: qml/Dash/ScopesOverview.qml:206
213#: qml/Dash/ScopesOverview.qml:206
212msgid "Manage Scopes"
214msgid "Manage Scopes"
213−msgstr ""
215+msgstr "Gerenciar Plugins"
214
216
215#: qml/Dash/ScopesOverview.qml:428
217#: qml/Dash/ScopesOverview.qml:428
216msgid "Done"
218msgid "Done"
@@ -274,7 +276,7 @@ msgstr "Conferência"
274
276
275#: qml/Panel/Indicators/MenuItemFactory.qml:600
277#: qml/Panel/Indicators/MenuItemFactory.qml:600
276msgid "Nothing is playing"
278msgid "Nothing is playing"
277−msgstr ""
279+msgstr "Nada está tocando"
278
280
279#: qml/Panel/Indicators/MenuItemFactory.qml:748
281#: qml/Panel/Indicators/MenuItemFactory.qml:748
280msgid "In queue…"
282msgid "In queue…"
@@ -361,6 +363,3 @@ msgid ""
361msgstr ""
363msgstr ""
362"Se o código de acesso for digitado incorretamente, o telefone será "
364"Se o código de acesso for digitado incorretamente, o telefone será "
363"restaurado aos padrões de fábrica e todos os dados pessoais serão apagados."
365"restaurado aos padrões de fábrica e todos os dados pessoais serão apagados."
364−
365−#~ msgid "Manage Dash"
366−#~ msgstr "Gerencia painel"
po/ro.po+45−7
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-28 13:24+0000\n"
11+"PO-Revision-Date: 2014-10-07 15:54+0000\n"
12"Last-Translator: Marian Vasile <marianvasile1972@gmail.com>\n"
12"Last-Translator: Marian Vasile <marianvasile1972@gmail.com>\n"
13"Language-Team: Romanian <ro@li.org>\n"
13"Language-Team: Romanian <ro@li.org>\n"
14+"Language: ro\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
19+"== 0) && (n != 0))) ? 2: 1));\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
@@ -106,8 +109,7 @@ msgstr "Marginea de sus"
106
109
107#: qml/Components/EdgeDemo.qml:145
110#: qml/Components/EdgeDemo.qml:145
108msgid "Try swiping from the top edge to access the indicators"
111msgid "Try swiping from the top edge to access the indicators"
109−msgstr ""
110−"Glisați de la marginea de sus a ecranului pentru a accesa indicatorii"
112+msgstr "Glisați de la marginea de sus a ecranului pentru a accesa indicatorii"
111
113
112#: qml/Components/EdgeDemo.qml:170
114#: qml/Components/EdgeDemo.qml:170
113msgid "Close"
115msgid "Close"
@@ -365,5 +367,41 @@ msgstr ""
365"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
367"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
366"șterse."
368"șterse."
367
369
368−#~ msgid "Manage Dash"
370+#~ msgid "Device Locked"
369−#~ msgstr "Administrare Panou principal"
371+#~ msgstr "Dispozitiv blocat"
372+
373+#~ msgid "You have been locked out due to too many failed passphrase attempts."
374+#~ msgstr ""
375+#~ "Dispozitivul este blocat din cauza utilizării mai multor fraze parolă "
376+#~ "greșite."
377+
378+#~ msgid "You have been locked out due to too many failed passcode attempts."
379+#~ msgstr ""
380+#~ "Dispozitivul este blocat din cauza utilizării mai multor parole greșite."
381+
382+#~ msgid "Please wait %1 minute and then try again…"
383+#~ msgid_plural "Please wait %1 minutes and then try again…"
384+#~ msgstr[0] "Așteptați %1 minut și apoi încercați din nou..."
385+#~ msgstr[1] "Așteptați %1 minute și apoi încercați din nou..."
386+#~ msgstr[2] "Așteptați %1 de minute și apoi încercați din nou..."
387+
388+#~ msgid "Pull to refresh…"
389+#~ msgstr "Trageți pentru a actualiza..."
390+
391+#~ msgid "Release to refresh…"
392+#~ msgstr "Eliberați pentru a actualiza..."
393+
394+#~ msgid "Unlock"
395+#~ msgstr "Deblocare"
396+
397+#~ msgid "Enter passphrase"
398+#~ msgstr "Introduceți fraza parolă"
399+
400+#~ msgid "Please re-enter"
401+#~ msgstr "Introduceți din nou"
402+
403+#~ msgid "Enter passcode"
404+#~ msgstr "Introduceți parola"
405+
406+#~ msgid "Enter %1"
407+#~ msgstr "Introducere %1"
po/ru.po+6−3
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-08-29 08:06+0000\n"
11"PO-Revision-Date: 2014-08-29 08:06+0000\n"
12"Last-Translator: Jay ZDLin <Unknown>\n"
12"Last-Translator: Jay ZDLin <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@li.org>\n"
14+"Language: ru\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
19+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
@@ -80,7 +83,7 @@ msgstr "Отключить"
80
83
81#: qml/Components/Dialogs.qml:157
84#: qml/Components/Dialogs.qml:157
82msgid "Restart"
85msgid "Restart"
83−msgstr ""
86+msgstr "Перезагрузить"
84
87
85#: qml/Components/Dialogs.qml:167
88#: qml/Components/Dialogs.qml:167
86msgid "Cancel"
89msgid "Cancel"
po/shn.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Shan <shn@li.org>\n"
13"Language-Team: Shan <shn@li.org>\n"
14+"Language: shn\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/si.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
14+"Language: \n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/sl.po+44−6
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 12:35+0000\n"
11+"PO-Revision-Date: 2014-10-07 09:28+0000\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
14+"Language: sl\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
19+"%100==4 ? 3 : 0);\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
@@ -274,7 +277,7 @@ msgstr "Konferenca"
274
277
275#: qml/Panel/Indicators/MenuItemFactory.qml:600
278#: qml/Panel/Indicators/MenuItemFactory.qml:600
276msgid "Nothing is playing"
279msgid "Nothing is playing"
277−msgstr ""
280+msgstr "Nič se ne predvaja"
278
281
279#: qml/Panel/Indicators/MenuItemFactory.qml:748
282#: qml/Panel/Indicators/MenuItemFactory.qml:748
280msgid "In queue…"
283msgid "In queue…"
@@ -362,5 +365,40 @@ msgstr ""
362"Če je vneseno nepravilno geslo, bo telefon ponastavljen na tovarniške "
365"Če je vneseno nepravilno geslo, bo telefon ponastavljen na tovarniške "
363"nastavitve ter vsi osebni podatki bodo izbrisani."
366"nastavitve ter vsi osebni podatki bodo izbrisani."
364
367
365−#~ msgid "Manage Dash"
368+#~ msgid "Device Locked"
366−#~ msgstr "Upravljaj s pregledno ploščo"
369+#~ msgstr "Naprava je zaklenjena"
370+
371+#~ msgid "You have been locked out due to too many failed passphrase attempts."
372+#~ msgstr ""
373+#~ "Telefon ste zaklenili zaradi preveč napačnih vnosov šifrirnih rekel."
374+
375+#~ msgid "You have been locked out due to too many failed passcode attempts."
376+#~ msgstr "Telefon ste zaklenili zaradi preveč napačnih vnosov gesla."
377+
378+#~ msgid "Please wait %1 minute and then try again…"
379+#~ msgid_plural "Please wait %1 minutes and then try again…"
380+#~ msgstr[0] "Počakajte %1 minut ter poskusite ponovno ..."
381+#~ msgstr[1] "Počakajte %1 minuto ter poskusite ponovno ..."
382+#~ msgstr[2] "Počakajte %1 minuti ter poskusite ponovno ..."
383+#~ msgstr[3] "Počakajte %1 minute ter poskusite ponovno ..."
384+
385+#~ msgid "Pull to refresh…"
386+#~ msgstr "Povlecite za osvežitev ..."
387+
388+#~ msgid "Release to refresh…"
389+#~ msgstr "Spustite za osvežitev ..."
390+
391+#~ msgid "Unlock"
392+#~ msgstr "Odkleni"
393+
394+#~ msgid "Enter passphrase"
395+#~ msgstr "Vnesite šifrirno reklo"
396+
397+#~ msgid "Please re-enter"
398+#~ msgstr "Ponovno vnesite"
399+
400+#~ msgid "Enter passcode"
401+#~ msgstr "Vnesite geslo"
402+
403+#~ msgid "Enter %1"
404+#~ msgstr "Vnesite %1"
po/sq.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-15 13:51+0000\n"
11"PO-Revision-Date: 2014-01-15 13:51+0000\n"
12"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
12"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
13"Language-Team: Albanian <sq@li.org>\n"
13"Language-Team: Albanian <sq@li.org>\n"
14+"Language: sq\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/sr.po+5−5
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-09-24 13:29+0000\n"
11"PO-Revision-Date: 2014-09-24 13:29+0000\n"
12"Last-Translator: Данило Шеган <Unknown>\n"
12"Last-Translator: Данило Шеган <Unknown>\n"
13"Language-Team: Serbian <sr@li.org>\n"
13"Language-Team: Serbian <sr@li.org>\n"
14+"Language: sr\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
19+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
@@ -359,6 +362,3 @@ msgid ""
359msgstr ""
362msgstr ""
360"Ако се унесе погрешан код, ваш телефон ће се ресетовати и сви лични подаци "
363"Ако се унесе погрешан код, ваш телефон ће се ресетовати и сви лични подаци "
361"ће бити обрисани."
364"ће бити обрисани."
362−
363−#~ msgid "Manage Dash"
364−#~ msgstr "Управљај Полицом"
po/sv.po+39−6
@@ -6,17 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 08:37+0000\n"
11+"PO-Revision-Date: 2014-10-07 14:28+0000\n"
12"Last-Translator: Josef Andersson <Unknown>\n"
12"Last-Translator: Josef Andersson <Unknown>\n"
13"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
13"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
14+"Language: sv\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19−"Language: sv\n"
20
21
21#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
22msgid "Password: "
23msgid "Password: "
@@ -361,5 +362,37 @@ msgstr ""
361"Om lösenkoden anges felaktigt kommer telefonen att fabrikåterställas och all "
362"Om lösenkoden anges felaktigt kommer telefonen att fabrikåterställas och all "
362"personlig data kommer att tas bort."
363"personlig data kommer att tas bort."
363
364
364−#~ msgid "Manage Dash"
365+#~ msgid "Device Locked"
365−#~ msgstr "Hantera Dash"
366+#~ msgstr "Enhet låst"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
369+#~ msgstr "Du har blivit utlåst efter för många misslyckade lösenfrasförsök."
370+
371+#~ msgid "You have been locked out due to too many failed passcode attempts."
372+#~ msgstr "Du har blivit utlåst efter för många misslyckade lösenkodsförsök."
373+
374+#~ msgid "Please wait %1 minute and then try again…"
375+#~ msgid_plural "Please wait %1 minutes and then try again…"
376+#~ msgstr[0] "Vänta %1 minut och prova sedan igen..."
377+#~ msgstr[1] "Vänta %1 minuter och prova sedan igen..."
378+
379+#~ msgid "Pull to refresh…"
380+#~ msgstr "Dra för att uppdatera..."
381+
382+#~ msgid "Release to refresh…"
383+#~ msgstr "Släpp för uppdatera..."
384+
385+#~ msgid "Unlock"
386+#~ msgstr "Lås upp"
387+
388+#~ msgid "Enter passphrase"
389+#~ msgstr "Ange lösenfras"
390+
391+#~ msgid "Please re-enter"
392+#~ msgstr "Ange igen"
393+
394+#~ msgid "Enter passcode"
395+#~ msgstr "Ange lösenkod"
396+
397+#~ msgid "Enter %1"
398+#~ msgstr "Ange %1"
po/sw.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-14 19:28+0000\n"
11"PO-Revision-Date: 2014-01-14 19:28+0000\n"
12"Last-Translator: Damas <Unknown>\n"
12"Last-Translator: Damas <Unknown>\n"
13"Language-Team: Swahili <sw@li.org>\n"
13"Language-Team: Swahili <sw@li.org>\n"
14+"Language: sw\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/ta.po+5−5
@@ -6,17 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
14+"Language: ta\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19−"Language: ta\n"
20
21
21#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
22msgid "Password: "
23msgid "Password: "
@@ -122,8 +123,7 @@ msgstr "இடது விளிம்பு"
122#: qml/Components/EdgeDemo.qml:199
123#: qml/Components/EdgeDemo.qml:199
123msgid "Swipe from the left to reveal the launcher for quick access to apps"
124msgid "Swipe from the left to reveal the launcher for quick access to apps"
124msgstr ""
125msgstr ""
125−"பயன்பாடுகளின் விரைவான அணுகலை பெறத்தேவையான தொடக்கியை இடமிருந்து தேய்த்தால் "
126+"பயன்பாடுகளின் விரைவான அணுகலை பெறத்தேவையான தொடக்கியை இடமிருந்து தேய்த்தால் வெளிப்படும்"
126−"வெளிப்படும்"
127
127
128#: qml/Components/EdgeDemo.qml:226
128#: qml/Components/EdgeDemo.qml:226
129msgid "Well done"
129msgid "Well done"
po/te.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
13"Language-Team: Telugu <te@li.org>\n"
13"Language-Team: Telugu <te@li.org>\n"
14+"Language: te\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/th.po+245−105
@@ -1,220 +1,360 @@
1−# Thai translation for unity
1+# Thai translation for unity8
2−# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3−# This file is distributed under the same license as the unity package.
3+# This file is distributed under the same license as the unity8 package.
4−# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5#
5#
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8−"Project-Id-Version: unity\n"
8+"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-06-26 22:58+0200\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2013-06-28 15:34+0000\n"
11+"PO-Revision-Date: 2014-10-02 04:55+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Thai <th@li.org>\n"
13"Language-Team: Thai <th@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2013-06-30 07:12+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 16692)\n"
19+"X-Generator: Launchpad (build 17196)\n"
19
20
20−#: Applications/applications.js:23
21+#: plugins/LightDM/Greeter.cpp:130
21−msgid "Phone"
22+msgid "Password: "
22msgstr ""
23msgstr ""
23
24
24−#: Applications/applications.js:29
25+#: plugins/Unity/Launcher/launcheritem.cpp:45
25−msgid "Camera"
26+#: plugins/Unity/Launcher/launcheritem.cpp:91
27+msgid "Pin shortcut"
26msgstr ""
28msgstr ""
27
29
28−#: Applications/applications.js:35
30+#: plugins/Unity/Launcher/launcheritem.cpp:91
29−msgid "Gallery"
31+msgid "Unpin shortcut"
30msgstr ""
32msgstr ""
31
33
32−#: Applications/applications.js:40
34+#: qml/Components/DelayedLockscreen.qml:47
33−msgid "Facebook"
35+msgid "Device Locked"
34msgstr ""
36msgstr ""
35
37
36−#: Applications/applications.js:46
38+#: qml/Components/DelayedLockscreen.qml:62
37−msgid "Browser"
39+msgid "You have been locked out due to too many failed passphrase attempts."
38msgstr ""
40msgstr ""
39
41
40−#: Applications/applications.js:51
42+#: qml/Components/DelayedLockscreen.qml:63
41−msgid "Twitter"
43+msgid "You have been locked out due to too many failed passcode attempts."
42msgstr ""
44msgstr ""
43
45
44−#: Applications/applications.js:57
46+#: qml/Components/DelayedLockscreen.qml:72
45−msgid "GMail"
47+#, qt-format
48+msgid "Please wait %1 minute and then try again…"
49+msgid_plural "Please wait %1 minutes and then try again…"
50+msgstr[0] ""
51+msgstr[1] ""
52+
53+#: qml/Components/Dialogs.qml:70
54+msgid "Log out"
46msgstr ""
55msgstr ""
47
56
48−#: Applications/applications.js:62
57+#: qml/Components/Dialogs.qml:71
49−msgid "Weather"
58+msgid "Are you sure you want to log out?"
50msgstr ""
59msgstr ""
51
60
52−#: Applications/applications.js:68
61+#: qml/Components/Dialogs.qml:73 qml/Components/Dialogs.qml:97
62+#: qml/Components/Dialogs.qml:122
53−msgid "Notepad"
63+msgid "No"
54msgstr ""
64msgstr ""
55
65
56−#: Applications/applications.js:74
66+#: qml/Components/Dialogs.qml:80 qml/Components/Dialogs.qml:104
67+#: qml/Components/Dialogs.qml:129
57−msgid "Calendar"
68+msgid "Yes"
58msgstr ""
69msgstr ""
59
70
60−#: Applications/applications.js:80
71+#: qml/Components/Dialogs.qml:94
61−msgid "Media Player"
72+msgid "Shut down"
62msgstr ""
73msgstr ""
63
74
64−#: Applications/applications.js:86
75+#: qml/Components/Dialogs.qml:95
65−msgid "Evernote"
76+msgid "Are you sure you want to shut down?"
66msgstr ""
77msgstr ""
67
78
68−#: Applications/applications.js:91
79+#: qml/Components/Dialogs.qml:119
69−msgid "Map"
80+msgid "Reboot"
70msgstr ""
81msgstr ""
71
82
72−#: Applications/applications.js:96
83+#: qml/Components/Dialogs.qml:120
73−msgid "Pinterest"
84+msgid "Are you sure you want to reboot?"
74msgstr ""
85msgstr ""
75
86
76−#: Applications/applications.js:101
87+#: qml/Components/Dialogs.qml:144
77−msgid "SoundCloud"
88+msgid "Power"
78msgstr ""
89msgstr ""
79
90
80−#: Applications/applications.js:106
91+#: qml/Components/Dialogs.qml:145
81−msgid "Wikipedia"
92+msgid ""
93+"Are you sure you would like\n"
94+"to power off?"
82msgstr ""
95msgstr ""
83
96
84−#: Applications/applications.js:111
97+#: qml/Components/Dialogs.qml:147
85−msgid "YouTube"
98+msgid "Power off"
86msgstr ""
99msgstr ""
87
100
88−#: Components/PageHeader.qml:300
101+#: qml/Components/Dialogs.qml:157
89−msgid "Recent searches"
102+msgid "Restart"
90msgstr ""
103msgstr ""
91
104
92−#: Dash/DashApps.qml:65
105+#: qml/Components/Dialogs.qml:167
93−msgid "Running apps"
106+msgid "Cancel"
94msgstr ""
107msgstr ""
95
108
96−#: Dash/DashApps.qml:68
109+#: qml/Components/EdgeDemoOverlay.qml:151
97−msgid "Frequently used"
110+msgid "Skip intro"
98msgstr ""
111msgstr ""
99
112
100−#: Dash/DashApps.qml:71
113+#: qml/Components/EdgeDemo.qml:112
101−msgid "Installed"
114+msgid "Right edge"
102msgstr ""
115msgstr ""
103
116
104−#: Dash/DashApps.qml:74
117+#: qml/Components/EdgeDemo.qml:113
105−msgid "Available for download"
118+msgid "Try swiping from the right edge to unlock the phone"
106msgstr ""
119msgstr ""
107
120
108−#: Dash/DashApps.qml:178
121+#: qml/Components/EdgeDemo.qml:144
109−msgid "Apps"
122+msgid "Top edge"
110msgstr ""
123msgstr ""
111
124
112−#: Dash/DashHome.qml:40
125+#: qml/Components/EdgeDemo.qml:145
113−msgid "Frequent Apps"
126+msgid "Try swiping from the top edge to access the indicators"
114msgstr ""
127msgstr ""
115
128
116−#: Dash/DashHome.qml:43
129+#: qml/Components/EdgeDemo.qml:170
117−msgid "Recent Music"
130+msgid "Close"
118msgstr ""
131msgstr ""
119
132
120−#: Dash/DashHome.qml:46
133+#: qml/Components/EdgeDemo.qml:171
121−msgid "Videos Popular Online"
134+msgid "Swipe up again to close the settings screen"
122msgstr ""
135msgstr ""
123
136
124−#: Dash/DashHome.qml:175
137+#: qml/Components/EdgeDemo.qml:198
125−msgid "Home"
138+msgid "Left edge"
126msgstr ""
139msgstr ""
127
140
128−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
141+#: qml/Components/EdgeDemo.qml:199
129−msgid "Featured"
142+msgid "Swipe from the left to reveal the launcher for quick access to apps"
130msgstr ""
143msgstr ""
131
144
132−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
145+#: qml/Components/EdgeDemo.qml:226
133−msgid "Recent"
146+msgid "Well done"
134msgstr ""
147msgstr ""
135
148
136−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
149+#: qml/Components/EdgeDemo.qml:227
137−msgid "New Releases"
150+msgid ""
151+"You have now mastered the edge gestures and can start using the "
152+"phone<br><br>Tap on the screen to start"
138msgstr ""
153msgstr ""
139
154
140−#: Dash/DashMusic.qml:30
155+#: qml/Components/Lockscreen.qml:220
141−msgid "Top Charting"
156+msgid "Emergency Call"
142msgstr ""
157msgstr ""
143
158
144−#: Dash/DashMusic.qml:99
159+#: qml/Components/Lockscreen.qml:252
145−msgid "Music"
160+msgid "OK"
146msgstr ""
161msgstr ""
147
162
148−#: Dash/DashVideos.qml:31
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
149−msgid "Popular Online"
164+msgid "See less"
150msgstr ""
165msgstr ""
151
166
152−#: Dash/DashVideos.qml:155
167+#: qml/Dash/GenericScopeView.qml:434
153−msgid "Videos"
168+msgid "See all"
154msgstr ""
169msgstr ""
155
170
156−#: Dash/Video/VideoPreview.qml:98
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
157−msgid "Directed by:"
172+#: qml/Panel/SearchIndicator.qml:27
173+msgid "Search"
158msgstr ""
174msgstr ""
159
175
160−#: Dash/Video/VideoPreview.qml:121
176+#: qml/Dash/PageHeader.qml:268
161−msgid "Starring:"
177+msgid "Settings"
162msgstr ""
178msgstr ""
163
179
164−#: Dash/Video/VideoPreview.qml:144
180+#: qml/Dash/PageHeader.qml:275
165−msgid "Author:"
181+msgid "Remove from Favorites"
166msgstr ""
182msgstr ""
167
183
168−#: Greeter/Lockscreen.qml:133
184+#: qml/Dash/PageHeader.qml:275
169−msgid "Emergency call"
185+msgid "Add to Favorites"
170msgstr ""
186msgstr ""
171
187
172−#: Greeter/PassphraseLockscreen.qml:59
188+#: qml/Dash/Previews/PreviewActionCombo.qml:35
173−#, qt-format
189+msgid "More..."
174−msgid "Hello %1"
190+msgstr ""
191+
192+#: qml/Dash/Previews/PreviewActionCombo.qml:35
193+msgid "Less..."
194+msgstr ""
195+
196+#: qml/Dash/Previews/PreviewRatingInput.qml:81
197+msgid "Rate this"
198+msgstr ""
199+
200+#: qml/Dash/Previews/PreviewRatingInput.qml:126
201+msgid "Add a review"
202+msgstr ""
203+
204+#: qml/Dash/Previews/PreviewRatingInput.qml:166
205+msgid "Send"
206+msgstr ""
207+
208+#: qml/Dash/PullToRefreshScopeStyle.qml:55
209+msgid "Pull to refresh…"
210+msgstr ""
211+
212+#: qml/Dash/PullToRefreshScopeStyle.qml:60
213+msgid "Release to refresh…"
175msgstr ""
214msgstr ""
176
215
177−#: Greeter/PassphraseLockscreen.qml:59
216+#: qml/Dash/ScopesOverview.qml:206
178−msgid "Hello"
217+msgid "Manage Scopes"
179msgstr ""
218msgstr ""
180
219
220+#: qml/Dash/ScopesOverview.qml:428
221+msgid "Done"
222+msgstr ""
223+
224+#: qml/Dash/ScopesOverview.qml:454
225+msgid "Store"
226+msgstr ""
227+
228+#: qml/Dash/ScopesOverviewTab.qml:36
229+msgid "Favorites"
230+msgstr ""
231+
232+#: qml/Dash/ScopesOverviewTab.qml:54
233+msgid "All"
234+msgstr ""
235+
236+#: qml/Greeter/Greeter.qml:157
237+msgid "Unlock"
238+msgstr ""
239+
181−#: Hud/HudParametrizedActionsPage.qml:132
240+#: qml/Hud/HudParametrizedActionsPage.qml:139
182msgid "Confirm"
241msgid "Confirm"
183msgstr ""
242msgstr ""
184
243
185−#: Hud/Hud.qml:61 Hud/Hud.qml:99 Hud/Hud.qml:372
244+#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
186msgid "Type or say a command"
245msgid "Type or say a command"
187msgstr ""
246msgstr ""
188
247
189−#: Hud/Hud.qml:84
248+#: qml/Hud/Hud.qml:84
190msgid "Loading. Please Wait..."
249msgid "Loading. Please Wait..."
191msgstr ""
250msgstr ""
192
251
193−#: Hud/Hud.qml:89
252+#: qml/Hud/Hud.qml:89
194msgid "Speak Now..."
253msgid "Speak Now..."
195msgstr ""
254msgstr ""
196
255
197−#: Hud/Hud.qml:94
256+#: qml/Hud/Hud.qml:94
198msgid "Speaking..."
257msgid "Speaking..."
199msgstr ""
258msgstr ""
200
259
201−#: Panel/MenuContent.qml:192
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
202−msgid "Device"
261+msgid "Show password"
203msgstr ""
262msgstr ""
204
263
205−#: Panel/Menus/Overview/FlightModeWidget.qml:42
264+#: qml/Panel/ActiveCallHint.qml:77
206−msgid "Flight mode"
265+msgid "Tap to return to call..."
207msgstr ""
266msgstr ""
208
267
209−#: Panel/SearchIndicator.qml:26
268+#: qml/Panel/ActiveCallHint.qml:90
210−msgid "Search"
269+msgid "Conference"
270+msgstr ""
271+
272+#: qml/Panel/Indicators/MenuItemFactory.qml:600
273+msgid "Nothing is playing"
274+msgstr ""
275+
276+#: qml/Panel/Indicators/MenuItemFactory.qml:748
277+msgid "In queue…"
278+msgstr ""
279+
280+#: qml/Panel/Indicators/MenuItemFactory.qml:752
281+msgid "Downloading"
211msgstr ""
282msgstr ""
212
283
213−#: plugins/Unity/scope.cpp:268
284+#: qml/Panel/Indicators/MenuItemFactory.qml:754
214−msgid "Sorry, there is nothing that matches your search."
285+msgid "Paused, tap to resume"
215msgstr ""
286msgstr ""
216
287
288+#: qml/Panel/Indicators/MenuItemFactory.qml:756
289+msgid "Canceled"
290+msgstr ""
291+
292+#: qml/Panel/Indicators/MenuItemFactory.qml:758
293+msgid "Finished"
294+msgstr ""
295+
296+#: qml/Panel/Indicators/MenuItemFactory.qml:760
297+msgid "Failed, tap to retry"
298+msgstr ""
299+
300+#: qml/Panel/Indicators/ModemInfoItem.qml:105
301+msgid "Unlock SIM"
302+msgstr ""
303+
304+#: qml/Panel/Indicators/RoamingIndication.qml:27
305+msgid "Roaming"
306+msgstr ""
307+
308+#: qml/Shell.qml:346
309+msgid "Enter passphrase"
310+msgstr ""
311+
217−#: Shell.qml:383
312+#: qml/Shell.qml:347
313+msgid "Sorry, incorrect passphrase"
314+msgstr ""
315+
316+#: qml/Shell.qml:348
317+msgid "Please re-enter"
318+msgstr ""
319+
320+#: qml/Shell.qml:350
321+msgid "Enter passcode"
322+msgstr ""
323+
324+#: qml/Shell.qml:351
325+msgid "Sorry, incorrect passcode"
326+msgstr ""
327+
328+#: qml/Shell.qml:354
329+#, qt-format
330+msgid "Enter %1"
331+msgstr ""
332+
333+#: qml/Shell.qml:355
218#, qt-format
334#, qt-format
219−msgid "Please enter %1"
335+msgid "Sorry, incorrect %1"
336+msgstr ""
337+
338+#: qml/Shell.qml:390
339+msgid "Sorry, incorrect passphrase."
340+msgstr ""
341+
342+#: qml/Shell.qml:391
343+msgid "Sorry, incorrect passcode."
344+msgstr ""
345+
346+#: qml/Shell.qml:392
347+msgid "This will be your last attempt."
348+msgstr ""
349+
350+#: qml/Shell.qml:394
351+msgid ""
352+"If passphrase is entered incorrectly, your phone will conduct a factory "
353+"reset and all personal data will be deleted."
354+msgstr ""
355+
356+#: qml/Shell.qml:395
357+msgid ""
358+"If passcode is entered incorrectly, your phone will conduct a factory reset "
359+"and all personal data will be deleted."
220msgstr ""
360msgstr ""
po/tr.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-07-16 17:58+0000\n"
11"PO-Revision-Date: 2014-07-16 17:58+0000\n"
12"Last-Translator: Volkan Gezer <Unknown>\n"
12"Last-Translator: Volkan Gezer <Unknown>\n"
13"Language-Team: Turkish <tr@li.org>\n"
13"Language-Team: Turkish <tr@li.org>\n"
14+"Language: tr\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/ug.po+38−5
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-29 00:52+0000\n"
11+"PO-Revision-Date: 2014-10-07 09:00+0000\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
14+"Language: \n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,36 @@ msgstr ""
360"ئەگەر ئىم كودى توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن "
362"ئەگەر ئىم كودى توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن "
361"چىققان ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
363"چىققان ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
362
364
363−#~ msgid "Manage Dash"
365+#~ msgid "Device Locked"
364−#~ msgstr "باش تاختىنى باشقۇرۇش"
366+#~ msgstr "ئۈسكۈنە قۇلۇپلانغان"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
369+#~ msgstr "خاتا ئىم جۈملىسى كۆپ قېتىم كىرگۈزۈلگەنلىكى ئۈچۈن قۇلۇپلاندى."
370+
371+#~ msgid "You have been locked out due to too many failed passcode attempts."
372+#~ msgstr "خاتا ئىم كودى(passcode) كۆپ قېتىم كىرگۈزۈلگەنلىكى ئۈچۈن قۇلۇپلاندى."
373+
374+#~ msgid "Please wait %1 minute and then try again…"
375+#~ msgid_plural "Please wait %1 minutes and then try again…"
376+#~ msgstr[0] "%1 مىنۇت كۈتۈپ ئاندىن قايتا سىناڭ…"
377+
378+#~ msgid "Pull to refresh…"
379+#~ msgstr "تارتسا يېڭىلىنىدۇ…"
380+
381+#~ msgid "Release to refresh…"
382+#~ msgstr "قويۇۋەتسە يېڭىلىنىدۇ…"
383+
384+#~ msgid "Unlock"
385+#~ msgstr "قۇلۇپسىزلا"
386+
387+#~ msgid "Enter passphrase"
388+#~ msgstr "ئىم كىرگۈزۈڭ"
389+
390+#~ msgid "Please re-enter"
391+#~ msgstr "قايتا كىرگۈزۈڭ"
392+
393+#~ msgid "Enter passcode"
394+#~ msgstr "ئىم كودى(passcode)نى كىرگۈزۈڭ"
395+
396+#~ msgid "Enter %1"
397+#~ msgstr "%1 نى كىرگۈزۈڭ"
po/uk.po+45−5
@@ -6,15 +6,18 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-26 19:06+0000\n"
11+"PO-Revision-Date: 2014-10-08 12:02+0000\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
14+"Language: uk\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
19+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
19
22
20#: plugins/LightDM/Greeter.cpp:130
23#: plugins/LightDM/Greeter.cpp:130
@@ -363,5 +366,42 @@ msgstr ""
363"Якщо код-пароль буде вказано неправильно, телефон повернеться до початкового "
366"Якщо код-пароль буде вказано неправильно, телефон повернеться до початкового "
364"стану, усі особисті дані буде вилучено."
367"стану, усі особисті дані буде вилучено."
365
368
366−#~ msgid "Manage Dash"
369+#~ msgid "Device Locked"
367−#~ msgstr "Керування панеллю"
370+#~ msgstr "Пристрій заблоковано"
371+
372+#~ msgid "You have been locked out due to too many failed passphrase attempts."
373+#~ msgstr ""
374+#~ "Ваш пристрій було заблоковано через перевищення граничної кількості спроб "
375+#~ "введення пароля."
376+
377+#~ msgid "You have been locked out due to too many failed passcode attempts."
378+#~ msgstr ""
379+#~ "Ваш пристрій було заблоковано через перевищення граничної кількості спроб "
380+#~ "введення коду-пароля."
381+
382+#~ msgid "Please wait %1 minute and then try again…"
383+#~ msgid_plural "Please wait %1 minutes and then try again…"
384+#~ msgstr[0] "Зачекайте %1 хвилину і повторіть спробу…"
385+#~ msgstr[1] "Зачекайте %1 хвилини і повторіть спробу…"
386+#~ msgstr[2] "Зачекайте %1 хвилин і повторіть спробу…"
387+
388+#~ msgid "Pull to refresh…"
389+#~ msgstr "Потягніть для оновлення…"
390+
391+#~ msgid "Release to refresh…"
392+#~ msgstr "Відпустіть для оновлення…"
393+
394+#~ msgid "Unlock"
395+#~ msgstr "Розблокувати"
396+
397+#~ msgid "Enter passphrase"
398+#~ msgstr "Введіть пароль"
399+
400+#~ msgid "Please re-enter"
401+#~ msgstr "Ввведіть ще раз"
402+
403+#~ msgid "Enter passcode"
404+#~ msgstr "Введіть код"
405+
406+#~ msgid "Enter %1"
407+#~ msgstr "Введіть %1"
po/unity8.pot+54−47
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: \n"
10"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,6 +16,7 @@ msgstr ""
16"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
19+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
19
20
20#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
21msgid "Password: "
22msgid "Password: "
@@ -30,6 +31,25 @@ msgstr ""
30msgid "Unpin shortcut"
31msgid "Unpin shortcut"
31msgstr ""
32msgstr ""
32
33
34+#: qml/Components/DelayedLockscreen.qml:47
35+msgid "Device Locked"
36+msgstr ""
37+
38+#: qml/Components/DelayedLockscreen.qml:62
39+msgid "You have been locked out due to too many failed passphrase attempts."
40+msgstr ""
41+
42+#: qml/Components/DelayedLockscreen.qml:63
43+msgid "You have been locked out due to too many failed passcode attempts."
44+msgstr ""
45+
46+#: qml/Components/DelayedLockscreen.qml:72
47+#, qt-format
48+msgid "Please wait %1 minute and then try again…"
49+msgid_plural "Please wait %1 minutes and then try again…"
50+msgstr[0] ""
51+msgstr[1] ""
52+
33#: qml/Components/Dialogs.qml:70
53#: qml/Components/Dialogs.qml:70
34msgid "Log out"
54msgid "Log out"
35msgstr ""
55msgstr ""
@@ -132,40 +152,23 @@ msgid ""
132"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
133msgstr ""
153msgstr ""
134
154
135−#: qml/Components/Lockscreen.qml:167
155+#: qml/Components/Lockscreen.qml:220
136−msgid "Please wait"
137−msgstr ""
138−
139−#: qml/Components/Lockscreen.qml:172
140−msgid "Too many incorrect attempts"
141−msgstr ""
142−
143−#: qml/Components/Lockscreen.qml:206
144msgid "Emergency Call"
156msgid "Emergency Call"
145msgstr ""
157msgstr ""
146
158
147−#: qml/Components/Lockscreen.qml:226
159+#: qml/Components/Lockscreen.qml:252
148msgid "OK"
160msgid "OK"
149msgstr ""
161msgstr ""
150
162
151−#: qml/Components/PassphraseLockscreen.qml:61
152−#, qt-format
153−msgid "Hello %1"
154−msgstr ""
155−
156−#: qml/Components/PassphraseLockscreen.qml:61
157−msgid "Hello"
158−msgstr ""
159−
160−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:533
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
161msgid "See less"
164msgid "See less"
162msgstr ""
165msgstr ""
163
166
164−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
165msgid "See all"
168msgid "See all"
166msgstr ""
169msgstr ""
167
170
168−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
169#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
170msgid "Search"
173msgid "Search"
171msgstr ""
174msgstr ""
@@ -202,6 +205,14 @@ msgstr ""
202msgid "Send"
205msgid "Send"
203msgstr ""
206msgstr ""
204
207
208+#: qml/Dash/PullToRefreshScopeStyle.qml:55
209+msgid "Pull to refresh…"
210+msgstr ""
211+
212+#: qml/Dash/PullToRefreshScopeStyle.qml:60
213+msgid "Release to refresh…"
214+msgstr ""
215+
205#: qml/Dash/ScopesOverview.qml:206
216#: qml/Dash/ScopesOverview.qml:206
206msgid "Manage Scopes"
217msgid "Manage Scopes"
207msgstr ""
218msgstr ""
@@ -223,7 +234,7 @@ msgid "All"
223msgstr ""
234msgstr ""
224
235
225#: qml/Greeter/Greeter.qml:157
236#: qml/Greeter/Greeter.qml:157
226−msgid "Swipe to unlock"
237+msgid "Unlock"
227msgstr ""
238msgstr ""
228
239
229#: qml/Hud/HudParametrizedActionsPage.qml:139
240#: qml/Hud/HudParametrizedActionsPage.qml:139
@@ -246,18 +257,10 @@ msgstr ""
246msgid "Speaking..."
257msgid "Speaking..."
247msgstr ""
258msgstr ""
248
259
249−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
250msgid "Show password"
261msgid "Show password"
251msgstr ""
262msgstr ""
252
263
253−#: qml/Notifications/NotificationMenuItemFactory.qml:124
254−msgid "Enter SIM PIN"
255−msgstr ""
256−
257−#: qml/Notifications/NotificationMenuItemFactory.qml:125
258−msgid "Sorry, incorrect PIN"
259−msgstr ""
260−
261#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
262msgid "Tap to return to call..."
265msgid "Tap to return to call..."
263msgstr ""
266msgstr ""
@@ -302,51 +305,55 @@ msgstr ""
302msgid "Roaming"
305msgid "Roaming"
303msgstr ""
306msgstr ""
304
307
305−#: qml/Shell.qml:320
308+#: qml/Shell.qml:346
306−msgid "Enter your passphrase"
309+msgid "Enter passphrase"
307msgstr ""
310msgstr ""
308
311
309−#: qml/Shell.qml:321
312+#: qml/Shell.qml:347
310msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
311msgstr ""
314msgstr ""
312
315
313−#: qml/Shell.qml:323
316+#: qml/Shell.qml:348
317+msgid "Please re-enter"
318+msgstr ""
319+
320+#: qml/Shell.qml:350
314−msgid "Enter your passcode"
321+msgid "Enter passcode"
315msgstr ""
322msgstr ""
316
323
317−#: qml/Shell.qml:324
324+#: qml/Shell.qml:351
318msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
319msgstr ""
326msgstr ""
320
327
321−#: qml/Shell.qml:327
328+#: qml/Shell.qml:354
322#, qt-format
329#, qt-format
323−msgid "Enter your %1"
330+msgid "Enter %1"
324msgstr ""
331msgstr ""
325
332
326−#: qml/Shell.qml:328
333+#: qml/Shell.qml:355
327#, qt-format
334#, qt-format
328msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
329msgstr ""
336msgstr ""
330
337
331−#: qml/Shell.qml:363
338+#: qml/Shell.qml:390
332msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
333msgstr ""
340msgstr ""
334
341
335−#: qml/Shell.qml:364
342+#: qml/Shell.qml:391
336msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
337msgstr ""
344msgstr ""
338
345
339−#: qml/Shell.qml:365
346+#: qml/Shell.qml:392
340msgid "This will be your last attempt."
347msgid "This will be your last attempt."
341msgstr ""
348msgstr ""
342
349
343−#: qml/Shell.qml:367
350+#: qml/Shell.qml:394
344msgid ""
351msgid ""
345"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
346"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
347msgstr ""
354msgstr ""
348
355
349−#: qml/Shell.qml:368
356+#: qml/Shell.qml:395
350msgid ""
357msgid ""
351"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
352"and all personal data will be deleted."
359"and all personal data will be deleted."
po/vi.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
14+"Language: vi\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/xh.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
14+"Language: xh\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/zh_CN.po+6−6
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-08-12 14:09+0000\n"
11"PO-Revision-Date: 2014-08-12 14:09+0000\n"
12"Last-Translator: Anthony Wong <anthony.wong@ubuntu.com>\n"
12"Last-Translator: Anthony Wong <anthony.wong@ubuntu.com>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
14+"Language: \n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -130,7 +132,8 @@ msgstr "做得好"
130msgid ""
132msgid ""
131"You have now mastered the edge gestures and can start using the "
133"You have now mastered the edge gestures and can start using the "
132"phone<br><br>Tap on the screen to start"
134"phone<br><br>Tap on the screen to start"
135+msgstr ""
133−msgstr "您现在已经掌握了边缘滑动手势,可以开始使用手机了<br><br>请点击屏幕开始使用"
136+"您现在已经掌握了边缘滑动手势,可以开始使用手机了<br><br>请点击屏幕开始使用"
134
137
135#: qml/Components/Lockscreen.qml:167
138#: qml/Components/Lockscreen.qml:167
136msgid "Please wait"
139msgid "Please wait"
@@ -351,6 +354,3 @@ msgid ""
351"If passcode is entered incorrectly, your phone will conduct a factory reset "
354"If passcode is entered incorrectly, your phone will conduct a factory reset "
352"and all personal data will be deleted."
355"and all personal data will be deleted."
353msgstr ""
356msgstr ""
354−
355−#~ msgid "Manage Dash"
356−#~ msgstr "管理 Dash"
po/zh_HK.po+4−2
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-08-10 11:45+0000\n"
11"PO-Revision-Date: 2014-08-10 11:45+0000\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
14+"Language: zh_HK\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
po/zh_TW.po+29−8
@@ -6,15 +6,17 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
10"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11"PO-Revision-Date: 2014-07-26 16:21+0000\n"
11"PO-Revision-Date: 2014-07-26 16:21+0000\n"
12"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
12"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
14+"Language: \n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
18"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
19
21
20#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -80,7 +82,7 @@ msgstr "關閉電源"
80
82
81#: qml/Components/Dialogs.qml:157
83#: qml/Components/Dialogs.qml:157
82msgid "Restart"
84msgid "Restart"
83−msgstr ""
85+msgstr "重新啟動"
84
86
85#: qml/Components/Dialogs.qml:167
87#: qml/Components/Dialogs.qml:167
86msgid "Cancel"
88msgid "Cancel"
@@ -316,7 +318,7 @@ msgstr "輸入密碼"
316
318
317#: qml/Shell.qml:324
319#: qml/Shell.qml:324
318msgid "Sorry, incorrect passcode"
320msgid "Sorry, incorrect passcode"
319−msgstr "抱歉,密碼不對"
321+msgstr "抱歉,passcode 不對"
320
322
321#: qml/Shell.qml:327
323#: qml/Shell.qml:327
322#, qt-format
324#, qt-format
@@ -334,7 +336,7 @@ msgstr "抱歉,密語不對"
334
336
335#: qml/Shell.qml:364
337#: qml/Shell.qml:364
336msgid "Sorry, incorrect passcode."
338msgid "Sorry, incorrect passcode."
337−msgstr "抱歉,密碼不對。"
339+msgstr "抱歉,passcode 不對。"
338
340
339#: qml/Shell.qml:365
341#: qml/Shell.qml:365
340msgid "This will be your last attempt."
342msgid "This will be your last attempt."
@@ -350,7 +352,26 @@ msgstr "如輸入的密語不對,本電話會進行重設,所有個人資料
350msgid ""
352msgid ""
351"If passcode is entered incorrectly, your phone will conduct a factory reset "
353"If passcode is entered incorrectly, your phone will conduct a factory reset "
352"and all personal data will be deleted."
354"and all personal data will be deleted."
353−msgstr "如輸入的密碼不對,本電話會進行重設,所有個人資料都會刪除。"
355+msgstr "如輸入的 passcode 不對,本電話會進行重設,所有個人資料都會刪除。"
356+
357+#~ msgid "Device Locked"
358+#~ msgstr "裝置已鎖定"
359+
360+#~ msgid "Please wait %1 minute and then try again…"
361+#~ msgid_plural "Please wait %1 minutes and then try again…"
362+#~ msgstr[0] "請等候 %1 分鐘再試…"
363+
364+#~ msgid "Unlock"
365+#~ msgstr "解鎖"
366+
367+#~ msgid "Enter passphrase"
368+#~ msgstr "輸入密語"
369+
370+#~ msgid "Please re-enter"
371+#~ msgstr "請再輸入"
372+
373+#~ msgid "Enter passcode"
374+#~ msgstr "輸入 passcode"
354
375
355−#~ msgid "Manage Dash"
376+#~ msgid "Enter %1"
356−#~ msgstr "管理 Dash"
377+#~ msgstr "輸入 %1"
qml/Components/DelayedLockscreen.qmlnew file+92
@@ -0,0 +1,92 @@
1+/*
2+ * Copyright (C) 2013,2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../Components"
20+
21+Item {
22+ id: root
23+ anchors.fill: parent
24+
25+ property int delayMinutes
26+ property bool alphaNumeric
27+
28+ function clear(playAnimation) {}
29+
30+ Column {
31+ anchors.left: parent.left
32+ anchors.right: parent.right
33+ anchors.leftMargin: units.gu(4)
34+ anchors.rightMargin: units.gu(4)
35+ anchors.verticalCenter: parent.verticalCenter
36+ spacing: units.gu(2)
37+
38+ Label {
39+ id: deviceLockedLabel
40+ objectName: "deviceLockedLabel"
41+ anchors.left: parent.left
42+ anchors.right: parent.right
43+ horizontalAlignment: Text.AlignHCenter
44+ wrapMode: Text.Wrap
45+ fontSize: "x-large"
46+ color: "#f3f3e7"
47+ text: i18n.tr("Device Locked")
48+ }
49+
50+ Item { // spacer
51+ width: units.gu(1)
52+ height: units.gu(1)
53+ }
54+
55+ Label {
56+ anchors.left: parent.left
57+ anchors.right: parent.right
58+ horizontalAlignment: Text.AlignHCenter
59+ wrapMode: Text.Wrap
60+ color: "#f3f3e7"
61+ text: alphaNumeric ?
62+ i18n.tr("You have been locked out due to too many failed passphrase attempts.") :
63+ i18n.tr("You have been locked out due to too many failed passcode attempts.")
64+ }
65+
66+ Label {
67+ anchors.left: parent.left
68+ anchors.right: parent.right
69+ horizontalAlignment: Text.AlignHCenter
70+ wrapMode: Text.Wrap
71+ color: "#f3f3e7"
72+ text: i18n.tr("Please wait %1 minute and then try again…",
73+ "Please wait %1 minutes and then try again…",
74+ root.delayMinutes).arg(root.delayMinutes)
75+ }
76+
77+ Item { // spacer
78+ width: units.gu(1)
79+ height: units.gu(1)
80+ }
81+
82+ Icon {
83+ // It would be nice to use a less network-specific name,
84+ // but this is the only lock icon we have.
85+ name: "network-secure"
86+ color: "#f3f3e7"
87+ height: units.gu(4)
88+ width: units.gu(4)
89+ anchors.horizontalCenter: parent.horizontalCenter
90+ }
91+ }
92+}
qml/Components/ListItems/Base.qml+2−11
@@ -17,7 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19
19
20−AbstractButton {
20+Item {
21 id: emptyListItem
21 id: emptyListItem
22 width: parent ? parent.width : units.gu(31)
22 width: parent ? parent.width : units.gu(31)
23 height: body.height + bottomDividerLine.height
23 height: body.height + bottomDividerLine.height
@@ -28,15 +28,6 @@ AbstractButton {
28 */
28 */
29 property bool selected: false
29 property bool selected: false
30
30
31− /*!
32− \preliminary
33− Highlight the list item when it is pressed.
34− This is used to disable the highlighting of the full list item
35− when custom highlighting needs to be implemented (for example in
36− ListItem.Standard which can have a split).
37− */
38− property bool highlightWhenPressed: true
39−
40 /*!
31 /*!
41 \preliminary
32 \preliminary
42 Set to show or hide the thin bottom divider line (drawn by the \l ThinDivider component).
33 Set to show or hide the thin bottom divider line (drawn by the \l ThinDivider component).
@@ -119,7 +110,7 @@ AbstractButton {
119 right: parent.right
110 right: parent.right
120 bottom: bottomDividerLine.top
111 bottom: bottomDividerLine.top
121 }
112 }
122− pressed: (emptyListItem.selected || (emptyListItem.highlightWhenPressed && emptyListItem.pressed)) ? "pressed" : ""
113+ pressed: emptyListItem.selected
123 }
114 }
124 }
115 }
125}
116}
qml/Components/Lockscreen.qml+129−103
@@ -24,17 +24,24 @@ Showable {
24 // Determine if a numeric or alphanumeric pad is used.
24 // Determine if a numeric or alphanumeric pad is used.
25 property bool alphaNumeric: false
25 property bool alphaNumeric: false
26
26
27+ // Whether to show an emergency call button
28+ property bool showEmergencyCallButton: true
29+
30+ // Whether to show a cancel button (not all lockscreen types normally do anyway)
31+ property bool showCancelButton: true
32+
27 // Informational text. (e.g. some text to tell which domain this is pin is entered for)
33 // Informational text. (e.g. some text to tell which domain this is pin is entered for)
28 property string infoText: ""
34 property string infoText: ""
29
35
30 // Retries text (e.g. 3 retries left)
36 // Retries text (e.g. 3 retries left)
37+ // (This is not currently used, but will be necessary for SIM unlock screen)
31 property string retryText: ""
38 property string retryText: ""
32
39
33 // The text to be displayed in case the login failed
40 // The text to be displayed in case the login failed
34 property string errorText: ""
41 property string errorText: ""
35
42
36− // In case the Lockscreen can show a greeter message, this is the username
43+ // If > 0, a forced delay is happening
37− property string username: ""
44+ property int delayMinutes: 0
38
45
39 // Set those to a value greater 0 to restrict the pin length.
46 // Set those to a value greater 0 to restrict the pin length.
40 // If both are unset, the Lockscreen will show a confirm button and allow typing any length of pin before
47 // If both are unset, the Lockscreen will show a confirm button and allow typing any length of pin before
@@ -54,16 +61,7 @@ Showable {
54 signal emergencyCall()
61 signal emergencyCall()
55 signal infoPopupConfirmed()
62 signal infoPopupConfirmed()
56
63
57− onRequiredChanged: {
64+ onActiveFocusChanged: if (activeFocus && pinPadLoader.item) pinPadLoader.item.forceActiveFocus()
58− if (required && pinPadLoader.item) {
59− clear(false)
60− }
61− }
62−
63− function forceDelay(delay) {
64− forcedDelayTimer.interval = delay
65− forcedDelayTimer.start()
66− }
67
65
68 function reset() {
66 function reset() {
69 // This causes the loader below to destry and recreate the source
67 // This causes the loader below to destry and recreate the source
@@ -80,19 +78,17 @@ Showable {
80 }
78 }
81
79
82 function showInfoPopup(title, text) {
80 function showInfoPopup(title, text) {
83− PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
81+ var popup = PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
84− }
82+ // FIXME: SDK will do this internally soonish
85−
83+ popup.z = Number.MAX_VALUE
86− Timer {
87− id: forcedDelayTimer
88− onTriggered: pinPadLoader.showWrongText = false
89 }
84 }
90
85
91 Rectangle {
86 Rectangle {
92− // In case background fails to load or is undefined
87+ // In case background fails to load
93 id: backgroundBackup
88 id: backgroundBackup
94 anchors.fill: parent
89 anchors.fill: parent
95 color: "black"
90 color: "black"
91+ visible: root.background.toString() !== ""
96 }
92 }
97
93
98 Image {
94 Image {
@@ -107,111 +103,141 @@ Showable {
107
103
108 MouseArea {
104 MouseArea {
109 anchors.fill: root
105 anchors.fill: root
106+ onClicked: {
107+ if (pinPadLoader.item)
108+ pinPadLoader.item.forceActiveFocus()
109+ }
110 }
110 }
111
111
112+ FocusScope {
113+ id: loaderScope
114+ anchors.fill: parent
115+
112− Loader {
116+ Loader {
113− id: pinPadLoader
117+ id: pinPadLoader
114− objectName: "pinPadLoader"
118+ objectName: "pinPadLoader"
115− anchors {
119+ anchors.fill: parent
116− left: parent.left
117− right: parent.right
118− verticalCenter: parent.verticalCenter
119− verticalCenterOffset: root.alphaNumeric ? -units.gu(10) : 0
120− }
121− property bool resetting: false
120+ property bool resetting: false
122− property bool waiting: false
121+ property bool waiting: false
123− property bool showWrongText: false
122+ property bool showWrongText: false
124−
123+
124+ source: {
125+ if (resetting || !root.required) {
126+ return ""
127+ } else if (root.delayMinutes > 0) {
128+ return "DelayedLockscreen.qml"
129+ } else if (root.alphaNumeric) {
125− source: (!resetting && root.required) ? (root.alphaNumeric ? "PassphraseLockscreen.qml" : "PinLockscreen.qml") : ""
130+ return "PassphraseLockscreen.qml"
131+ } else {
132+ return "PinLockscreen.qml"
133+ }
134+ }
126− onSourceChanged: {
135+ onSourceChanged: {
127− waiting = false
136+ waiting = false
128− showWrongText = false
137+ showWrongText = false
129− }
138+ if (loaderScope.activeFocus && pinPadLoader.item)
130− onLoaded: {
131− if (forcedDelayTimer.running) {
132− pinPadLoader.item.clear(true)
139+ pinPadLoader.item.forceActiveFocus()
133 }
140 }
134− }
135
141
136− Connections {
142+ Connections {
137− target: pinPadLoader.item
143+ target: pinPadLoader.item
138
144
139− onEntered: {
145+ onEntered: {
140− pinPadLoader.waiting = true
146+ pinPadLoader.waiting = true
141− root.entered(passphrase);
147+ root.entered(passphrase);
142− }
148+ }
143
149
144− onCancel: {
150+ onCancel: {
145− root.cancel()
151+ root.cancel()
152+ }
146 }
153 }
147− }
148
154
149− Binding {
155+ Binding {
150− target: pinPadLoader.item
156+ target: pinPadLoader.item
151− property: "minPinLength"
157+ property: "minPinLength"
152− value: root.minPinLength
158+ value: root.minPinLength
153− }
159+ }
154− Binding {
160+ Binding {
155− target: pinPadLoader.item
161+ target: pinPadLoader.item
156− property: "maxPinLength"
162+ property: "maxPinLength"
157− value: root.maxPinLength
163+ value: root.maxPinLength
158− }
164+ }
159− Binding {
165+ Binding {
160− target: pinPadLoader.item
166+ target: pinPadLoader.item
161− property: "infoText"
167+ property: "infoText"
162− value: root.infoText
168+ value: root.infoText
163− }
169+ }
164− Binding {
170+ Binding {
165− target: pinPadLoader.item
171+ target: pinPadLoader.item
166− property: "retryText"
172+ property: "retryText"
167− value: forcedDelayTimer.running ? i18n.tr("Please wait") : root.retryText
173+ value: root.retryText
168− }
174+ }
169− Binding {
175+ Binding {
170− target: pinPadLoader.item
176+ target: pinPadLoader.item
171− property: "errorText"
177+ property: "errorText"
172− value: forcedDelayTimer.running ? i18n.tr("Too many incorrect attempts") :
173− (pinPadLoader.showWrongText ? root.errorText : "")
178+ value: pinPadLoader.showWrongText ? root.errorText : ""
174− }
179+ }
175− Binding {
180+ Binding {
181+ target: pinPadLoader.item
182+ property: "entryEnabled"
183+ value: !pinPadLoader.waiting
184+ }
185+ Binding {
176− target: pinPadLoader.item
186+ target: pinPadLoader.item
177− property: "username"
187+ property: "alphaNumeric"
188+ value: root.alphaNumeric
189+ }
190+ Binding {
191+ target: pinPadLoader.item
192+ property: "delayMinutes"
178− value: root.username
193+ value: root.delayMinutes
194+ }
179 }
195 }
180 Binding {
196 Binding {
181 target: pinPadLoader.item
197 target: pinPadLoader.item
182− property: "entryEnabled"
198+ property: "showCancelButton"
183− value: !pinPadLoader.waiting && !forcedDelayTimer.running
199+ value: root.showCancelButton
184 }
200 }
185 }
201 }
186
202
187− Label {
203+ Item {
188− id: emergencyCallLabel
204+ id: emergencyCallRow
189− objectName: "emergencyCallLabel"
190
205
191− // FIXME: We *should* show emergency dialer if there is a SIM present,
206+ visible: showEmergencyCallButton
192− // regardless of whether the side stage is enabled. But right now,
193− // the assumption is that narrow screens are phones which have SIMs
194− // and wider screens are tablets which don't. When we do allow this
195− // on devices with a side stage and a SIM, work should be done to
196− // ensure that the main stage is disabled while the dialer is present
197− // in the side stage.
198− visible: !shell.sideStageEnabled
199
207
200 anchors {
208 anchors {
201 bottom: parent.bottom
209 bottom: parent.bottom
202− bottomMargin: units.gu(4)
210+ bottomMargin: units.gu(7) + (Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0)
203− horizontalCenter: parent.horizontalCenter
211+ left: parent.left
212+ right: parent.right
204 }
213 }
205
214
206− text: i18n.tr("Emergency Call")
215+ Label {
207− color: "#f3f3e7"
216+ id: emergencyCallLabel
208− opacity: 0.6
217+ objectName: "emergencyCallLabel"
209− }
218+ anchors.horizontalCenter: parent.horizontalCenter
210
219
220+ text: i18n.tr("Emergency Call")
221+ color: "#f3f3e7"
222+ }
223+
224+ Icon {
225+ id: emergencyCallIcon
226+ anchors.left: emergencyCallLabel.right
227+ anchors.leftMargin: units.gu(1)
228+ width: emergencyCallLabel.height
229+ height: emergencyCallLabel.height
230+ name: "call-start"
231+ color: "#f3f3e7"
232+ }
233+
211− MouseArea {
234+ MouseArea {
235+ anchors.top: emergencyCallLabel.top
236+ anchors.bottom: emergencyCallLabel.bottom
212− anchors.fill: emergencyCallLabel
237+ anchors.left: emergencyCallLabel.left
238+ anchors.right: emergencyCallIcon.right
213− onClicked: root.emergencyCall()
239+ onClicked: root.emergencyCall()
214− enabled: emergencyCallLabel.visible
240+ }
215 }
241 }
216
242
217 Component {
243 Component {
qml/Components/PassphraseLockscreen.qml+96−43
@@ -20,10 +20,12 @@ import "../Components"
20
20
21Item {
21Item {
22 id: root
22 id: root
23+ anchors.top: parent.top
24+ anchors.topMargin: units.gu(4)
23− height: highlightItem.height
25+ height: shakeContainer.height
24
26
25 property string infoText
27 property string infoText
26− property string username: ""
28+ property string errorText
27 property bool entryEnabled: true
29 property bool entryEnabled: true
28
30
29 signal entered(string passphrase)
31 signal entered(string passphrase)
@@ -31,64 +33,115 @@ Item {
31
33
32 function clear(playAnimation) {
34 function clear(playAnimation) {
33 pinentryField.text = "";
35 pinentryField.text = "";
36+ pinentryField.incorrectOverride = false;
37+ pinentryField.forceActiveFocus();
34 if (playAnimation) {
38 if (playAnimation) {
35 wrongPasswordAnimation.start();
39 wrongPasswordAnimation.start();
36− pinentryField.forceActiveFocus();
37− } else {
38− pinentryField.focus = false
39 }
40 }
40 }
41 }
41
42
42− Rectangle {
43+ onActiveFocusChanged: if (activeFocus) pinentryField.forceActiveFocus()
43− id: highlightItem
44+
44− width: units.gu(32)
45+ Column {
45− height: units.gu(10)
46+ id: shakeContainer
46− anchors.centerIn: parent
47+ anchors.horizontalCenter: parent.horizontalCenter
47− color: Qt.rgba(0.1, 0.1, 0.1, 0.4)
48+ width: parent.width
48− border.color: Qt.rgba(0.4, 0.4, 0.4, 0.4)
49− border.width: units.dp(1)
50− radius: units.gu(1.5)
49+ spacing: units.gu(2)
51− antialiasing: true
52
50
53 Label {
51 Label {
52+ id: infoField
54− objectName: "greeterLabel"
53+ objectName: "infoTextLabel"
55− anchors {
54+ fontSize: "x-large"
56− left: parent.left
55+ color: "#f3f3e7"
57− top: parent.top
56+ anchors.horizontalCenter: parent.horizontalCenter
58− right: parent.right
57+ text: root.infoText
59− margins: units.gu(1.5)
60− }
61− text: root.username.length > 0 ? i18n.tr("Hello %1").arg(root.username) : i18n.tr("Hello")
62− color: "white"
63 }
58 }
64
59
65− TextField {
60+ Item {
61+ id: entryContainer
62+ anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
63+ height: units.gu(4)
64+
65+ TextInput {
66− id: pinentryField
66+ id: pinentryField
67− objectName: "pinentryField"
67+ objectName: "pinentryField"
68+
69+ property bool incorrectOverride: false
70+
68− anchors {
71+ anchors {
69− horizontalCenter: parent.horizontalCenter
72+ top: parent.top
70− bottom: parent.bottom
73+ left: parent.left
71− margins: units.gu(1)
74+ right: parent.right
75+ }
76+ horizontalAlignment: Text.AlignHCenter
77+ font.pixelSize: FontUtils.sizeToPixels("large")
78+ echoMode: TextInput.Password
79+ inputMethodHints: Qt.ImhHiddenText | Qt.ImhSensitiveData |
80+ Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
81+ color: "#f3f3e7"
82+ cursorDelegate: Item {} // disable cursor
83+ onCursorPositionChanged: {
84+ // And because we don't show the cursor, always position the
85+ // cursor at the end of the string (so backspace works like
86+ // the user expects, even if they've clicked on us and
87+ // thus accidentally moved the cursor)
88+ if (cursorPosition !== length) {
89+ cursorPosition = length
90+ }
91+ }
92+ clip: true
93+
94+ // This is so that we can draw our own dots, for we want
95+ // complete control over the pixel sizes. (The ubuntu font
96+ // has oddly sized password characters that don't scale right)
97+ opacity: 0
98+
99+ // simulate being disabled, but without removing OSK focus
100+ maximumLength: root.entryEnabled ? 32767 : length
101+
102+ onTextChanged: incorrectOverride = true
103+
104+ onAccepted: {
105+ if (pinentryField.text) {
106+ root.entered(pinentryField.text);
107+ }
108+ }
72 }
109 }
73− height: units.gu(4.5)
110+
74− width: parent.width - units.gu(2)
111+ Row {
75− echoMode: TextInput.Password
112+ id: dotRow
76− opacity: 0.9
113+ anchors.centerIn: entryContainer
77− hasClearButton: false
114+
78− enabled: root.entryEnabled
115+ property real dotSize: Math.min(units.gu(2), entryContainer.width / pinentryField.length)
79− placeholderText: root.infoText
116+ spacing: Math.min(units.gu(2), Math.max(0, (entryContainer.width / pinentryField.length) - dotSize))
80−
117+
81− onAccepted: {
118+ Repeater {
82− if (pinentryField.text) {
119+ model: pinentryField.length
83− root.entered(pinentryField.text);
120+ delegate: Rectangle {
121+ color: "#f3f3e7"
122+ width: dotRow.dotSize
123+ height: width
124+ radius: width / 2
125+ }
84 }
126 }
85 }
127 }
128+
129+ Label {
130+ id: wrongNoticeLabel
131+ objectName: "wrongNoticeLabel"
132+ fontSize: "large"
133+ color: "#f3f3e7"
134+ anchors.horizontalCenter: parent.horizontalCenter
135+ horizontalAlignment: Text.AlignHCenter
136+ text: root.errorText
137+ visible: pinentryField.text.length == 0 && !pinentryField.incorrectOverride
138+ }
86 }
139 }
87 }
140 }
88
141
89 WrongPasswordAnimation {
142 WrongPasswordAnimation {
90 id: wrongPasswordAnimation
143 id: wrongPasswordAnimation
91 objectName: "wrongPasswordAnimation"
144 objectName: "wrongPasswordAnimation"
92− target: pinentryField
145+ target: shakeContainer
93 }
146 }
94}
147}
qml/Components/PinLockscreen.qml+11−5
@@ -21,7 +21,9 @@ import "../Components"
21
21
22Column {
22Column {
23 id: root
23 id: root
24− anchors.centerIn: parent
24+ anchors.top: parent.top
25+ anchors.topMargin: units.gu(4)
26+ anchors.horizontalCenter: parent.horizontalCenter
25 spacing: units.gu(2)
27 spacing: units.gu(2)
26
28
27 property string infoText
29 property string infoText
@@ -31,6 +33,7 @@ Column {
31 property int padHeight: units.gu(28)
33 property int padHeight: units.gu(28)
32 property int minPinLength: -1
34 property int minPinLength: -1
33 property int maxPinLength: -1
35 property int maxPinLength: -1
36+ property bool showCancelButton: true
34
37
35 signal entered(string passphrase)
38 signal entered(string passphrase)
36 signal cancel()
39 signal cancel()
@@ -49,7 +52,7 @@ Column {
49 id: shakeContainer
52 id: shakeContainer
50 anchors.horizontalCenter: parent.horizontalCenter
53 anchors.horizontalCenter: parent.horizontalCenter
51 width: parent.width
54 width: parent.width
52− spacing: units.gu(2)
55+ spacing: units.gu(1)
53
56
54 Label {
57 Label {
55 id: infoField
58 id: infoField
@@ -108,8 +111,10 @@ Column {
108 fontSize: "x-large"
111 fontSize: "x-large"
109 color: "#f3f3e7"
112 color: "#f3f3e7"
110 anchors.horizontalCenter: parent.horizontalCenter
113 anchors.horizontalCenter: parent.horizontalCenter
114+ horizontalAlignment: Text.AlignHCenter
111 text: root.errorText
115 text: root.errorText
112 visible: pinentryField.incorrectOverride
116 visible: pinentryField.incorrectOverride
117+ scale: Math.min(1, parent.width / width)
113 }
118 }
114
119
115 AbstractButton {
120 AbstractButton {
@@ -193,19 +198,20 @@ Column {
193 }
198 }
194 PinPadButton {
199 PinPadButton {
195 iconName: "close"
200 iconName: "close"
196− height: numbersGrid.buttonHeight
201+ height: units.gu(5) // visual spec has this row a little closer in
197 width: numbersGrid.buttonWidth
202 width: numbersGrid.buttonWidth
198
203
199 onClicked: root.cancel()
204 onClicked: root.cancel()
205+ visible: root.showCancelButton
200 }
206 }
201 Item {
207 Item {
202− height: numbersGrid.buttonHeight
208+ height: units.gu(5)
203 width: numbersGrid.buttonWidth
209 width: numbersGrid.buttonWidth
204 }
210 }
205 PinPadButton {
211 PinPadButton {
206 iconName: "tick"
212 iconName: "tick"
207 objectName: "confirmButton"
213 objectName: "confirmButton"
208− height: numbersGrid.buttonHeight
214+ height: units.gu(5)
209 width: numbersGrid.buttonWidth
215 width: numbersGrid.buttonWidth
210 enabled: root.enabled && pinentryField.text.length >= root.minPinLength
216 enabled: root.enabled && pinentryField.text.length >= root.minPinLength
211 visible: root.minPinLength == -1 || root.minPinLength !== root.maxPinLength
217 visible: root.minPinLength == -1 || root.minPinLength !== root.maxPinLength
qml/Components/ResponsiveVerticalJournal.qml+3−2
@@ -47,7 +47,9 @@ Item {
47 property alias delegate: verticalJournalView.delegate
47 property alias delegate: verticalJournalView.delegate
48 property alias displayMarginBeginning: verticalJournalView.displayMarginBeginning
48 property alias displayMarginBeginning: verticalJournalView.displayMarginBeginning
49 property alias displayMarginEnd: verticalJournalView.displayMarginEnd
49 property alias displayMarginEnd: verticalJournalView.displayMarginEnd
50+
50− implicitHeight: verticalJournalView.implicitHeight
51+ implicitHeight: verticalJournalView.implicitHeight + rowSpacing
52+ clip: height < implicitHeight
51
53
52 VerticalJournal {
54 VerticalJournal {
53 id: verticalJournalView
55 id: verticalJournalView
@@ -59,7 +61,6 @@ Item {
59 topMargin: rowSpacing / 2
61 topMargin: rowSpacing / 2
60 bottomMargin: rowSpacing / 2
62 bottomMargin: rowSpacing / 2
61 }
63 }
62− clip: parent.height != implicitHeight
63
64
64 function px2gu(pixels) {
65 function px2gu(pixels) {
65 return Math.floor(pixels / units.gu(1))
66 return Math.floor(pixels / units.gu(1))
qml/Dash/CardGrid.qml+1−1
@@ -69,7 +69,7 @@ DashRenderer {
69 item.cardData = Qt.binding(function() { return model; });
69 item.cardData = Qt.binding(function() { return model; });
70 item.template = Qt.binding(function() { return cardTool.template; });
70 item.template = Qt.binding(function() { return cardTool.template; });
71 item.components = Qt.binding(function() { return cardTool.components; });
71 item.components = Qt.binding(function() { return cardTool.components; });
72− item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
72+ item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
73 item.scopeStyle = root.scopeStyle;
73 item.scopeStyle = root.scopeStyle;
74 }
74 }
75 Connections {
75 Connections {
qml/Dash/CardHorizontalList.qml+1−1
@@ -50,7 +50,7 @@ DashRenderer {
50 item.cardData = Qt.binding(function() { return model; });
50 item.cardData = Qt.binding(function() { return model; });
51 item.template = Qt.binding(function() { return cardTool.template; });
51 item.template = Qt.binding(function() { return cardTool.template; });
52 item.components = Qt.binding(function() { return cardTool.components; });
52 item.components = Qt.binding(function() { return cardTool.components; });
53− item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
53+ item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
54 item.scopeStyle = root.scopeStyle;
54 item.scopeStyle = root.scopeStyle;
55 }
55 }
56 Connections {
56 Connections {
qml/Dash/CardTool.qml+18−13
@@ -131,21 +131,26 @@ Item {
131 property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
131 property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
132
132
133 /*!
133 /*!
134− \brief Desired alignment of header components.
134+ \brief Desired alignment of title
135 */
135 */
136− readonly property int headerAlignment: {
136+ readonly property int titleAlignment: {
137− var subtitle = components["subtitle"];
137+ if (template["card-layout"] === "horizontal"
138− var price = components["price"];
138+ || (typeof components["title"] !== "object" &&
139− var summary = components["summary"];
139+ components["title"]["align"] !== "center")) return Text.AlignLeft;
140−
140+
141− var hasSubtitle = subtitle && (typeof subtitle === "string" || subtitle["field"])
141+ var keys = ["mascot", "emblem", "subtitle", "attributes", "summary"];
142− var hasPrice = price && (typeof price === "string" || subtitle["field"]);
142+
143− var hasSummary = summary && (typeof summary === "string" || summary["field"])
143+ for (var key in keys) {
144−
144+ key = keys[key];
145− var isOnlyTextComponent = !hasSubtitle && !hasPrice && !hasSummary;
145+ try {
146− if (!isOnlyTextComponent) return Text.AlignLeft;
146+ if (typeof components[key] === "string"
147+ || typeof components[key]["field"] === "string") return Text.AlignLeft;
148+ } catch (e) {
149+ continue;
150+ }
151+ }
147
152
148− return (template["card-layout"] === "horizontal") ? Text.AlignLeft : Text.AlignHCenter;
153+ return Text.AlignHCenter;
149 }
154 }
150
155
151 QtObject {
156 QtObject {
qml/Dash/CardVerticalJournal.qml+1−1
@@ -57,7 +57,7 @@ DashRenderer {
57 item.cardData = Qt.binding(function() { return model; });
57 item.cardData = Qt.binding(function() { return model; });
58 item.template = Qt.binding(function() { return cardTool.template; });
58 item.template = Qt.binding(function() { return cardTool.template; });
59 item.components = Qt.binding(function() { return cardTool.components; });
59 item.components = Qt.binding(function() { return cardTool.components; });
60− item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
60+ item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
61 item.scopeStyle = root.scopeStyle;
61 item.scopeStyle = root.scopeStyle;
62 }
62 }
63 Connections {
63 Connections {
qml/Dash/Dash.qml+4−4
@@ -29,7 +29,6 @@ Showable {
29 visible: shown
29 visible: shown
30
30
31 property string showScopeOnLoaded: "clickscope"
31 property string showScopeOnLoaded: "clickscope"
32− property real contentScale: 1.0
33
32
34 DashCommunicatorService {
33 DashCommunicatorService {
35 objectName: "dashCommunicatorService"
34 objectName: "dashCommunicatorService"
@@ -41,8 +40,9 @@ Showable {
41 if (window.active) {
40 if (window.active) {
42 dashContentCache.scheduleUpdate();
41 dashContentCache.scheduleUpdate();
43 }
42 }
44− overviewController.enableAnimation = window.active;
43+ overviewController.enableAnimation = window.active && !scopesOverview.showingNonFavoriteScope;
45 overviewController.progress = 0;
44 overviewController.progress = 0;
45+ scopesOverview.closeTempScope();
46 }
46 }
47 }
47 }
48 }
48 }
@@ -190,7 +190,6 @@ Showable {
190 dash.showScopeOnLoaded = ""
190 dash.showScopeOnLoaded = ""
191 }
191 }
192 }
192 }
193− scale: dash.contentScale
194 clip: scale != 1.0 || scopeItem.visible || overviewController.progress != 0
193 clip: scale != 1.0 || scopeItem.visible || overviewController.progress != 0
195 Behavior on x {
194 Behavior on x {
196 UbuntuNumberAnimation {
195 UbuntuNumberAnimation {
@@ -245,7 +244,7 @@ Showable {
245 y: overviewController.progress == 0 ? dashContent.y : overviewProgressY
244 y: overviewController.progress == 0 ? dashContent.y : overviewProgressY
246 width: parent.width
245 width: parent.width
247 height: parent.height
246 height: parent.height
248− scale: dash.contentScale * overviewProgressScale
247+ scale: overviewProgressScale
249 enabled: opacity == 1
248 enabled: opacity == 1
250 opacity: 1 - overviewController.progress
249 opacity: 1 - overviewController.progress
251 clip: scale != 1.0
250 clip: scale != 1.0
@@ -275,6 +274,7 @@ Showable {
275 left: parent.left
274 left: parent.left
276 right: parent.right
275 right: parent.right
277 bottom: parent.bottom
276 bottom: parent.bottom
277+ bottomMargin: Qt.inputMethod.keyboardRectangle.height
278 }
278 }
279 height: units.dp(3)
279 height: units.dp(3)
280 color: scopeStyle.backgroundLuminance > 0.7 ? "#50000000" : "#50ffffff"
280 color: scopeStyle.backgroundLuminance > 0.7 ? "#50000000" : "#50ffffff"
qml/Dash/DashRenderer.qml+2−2
@@ -17,9 +17,9 @@
17import QtQuick 2.0
17import QtQuick 2.0
18
18
19Item {
19Item {
20− property int collapsedHeight
20+ property real collapsedHeight
21
21
22− property int expandedHeight
22+ property real expandedHeight
23
23
24 property int collapsedItemCount: -1
24 property int collapsedItemCount: -1
25
25
qml/Dash/GenericScopeView.qml+36−23
@@ -15,7 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18−import Ubuntu.Components 0.1
18+import Ubuntu.Components 1.1
19import Utils 0.1
19import Utils 0.1
20import Unity 0.2
20import Unity 0.2
21import Dash 0.1
21import Dash 0.1
@@ -213,7 +213,6 @@ FocusScope {
213 delegate: ListItems.Base {
213 delegate: ListItems.Base {
214 id: baseItem
214 id: baseItem
215 objectName: "dashCategory" + category
215 objectName: "dashCategory" + category
216− highlightWhenPressed: false
217 showDivider: false
216 showDivider: false
218
217
219 property Item seeAllButton: seeAll
218 property Item seeAllButton: seeAll
@@ -349,27 +348,6 @@ FocusScope {
349 }
348 }
350 Connections {
349 Connections {
351 target: categoryView
350 target: categoryView
352− onExpandedCategoryItemChanged: {
353− collapseAllButExpandedCategory();
354− }
355− function collapseAllButExpandedCategory() {
356− var item = rendererLoader.item;
357− if (baseItem.expandable) {
358− var shouldExpand = baseItem === categoryView.expandedCategoryItem;
359− if (shouldExpand != baseItem.expanded) {
360− // If the filter animation will be seen start it, otherwise, just flip the switch
361− var shrinkingVisible = !shouldExpand && y + item.collapsedHeight + seeAll.height < categoryView.height;
362− var growingVisible = shouldExpand && y + height < categoryView.height;
363− if (!subPageLoader.open || shouldExpand) {
364− var animate = shrinkingVisible || growingVisible;
365− baseItem.expand(shouldExpand, animate)
366− if (shouldExpand && !subPageLoader.open) {
367− categoryView.maximizeVisibleArea(index, item.expandedHeight + seeAll.height);
368− }
369− }
370− }
371− }
372− }
373 onOriginYChanged: rendererLoader.updateRanges();
351 onOriginYChanged: rendererLoader.updateRanges();
374 onContentYChanged: rendererLoader.updateRanges();
352 onContentYChanged: rendererLoader.updateRanges();
375 onHeightChanged: rendererLoader.updateRanges();
353 onHeightChanged: rendererLoader.updateRanges();
@@ -540,6 +518,41 @@ FocusScope {
540 }
518 }
541 }
519 }
542
520
521+ Item {
522+ id: pullToRefreshClippingItem
523+ anchors.left: parent.left
524+ anchors.right: parent.right
525+ anchors.bottom: parent.bottom
526+ height: parent.height - pullToRefresh.contentY + (pageHeaderLoader.item ? pageHeaderLoader.item.bottomItem[0].height - pageHeaderLoader.item.height : 0)
527+ clip: true
528+
529+ PullToRefresh {
530+ id: pullToRefresh
531+ objectName: "pullToRefresh"
532+ target: categoryView
533+
534+ readonly property real contentY: categoryView.contentY - categoryView.originY
535+ y: -contentY - units.gu(5)
536+
537+ onRefresh: {
538+ refreshing = true
539+ scopeView.scope.refresh()
540+ }
541+ anchors.left: parent.left
542+ anchors.right: parent.right
543+
544+ Connections {
545+ target: scopeView
546+ onProcessingChanged: if (!scopeView.processing) pullToRefresh.refreshing = false
547+ }
548+
549+ style: PullToRefreshScopeStyle {
550+ anchors.fill: parent
551+ activationThreshold: units.gu(14)
552+ }
553+ }
554+ }
555+
543 AbstractButton {
556 AbstractButton {
544 id: floatingSeeLess
557 id: floatingSeeLess
545 objectName: "floatingSeeLess"
558 objectName: "floatingSeeLess"
qml/Dash/Previews/PreviewHeader.qml+13−1
@@ -16,12 +16,14 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19+import Dash 0.1
19import "../"
20import "../"
20
21
21/*! This preview widget shows a header
22/*! This preview widget shows a header
22 * The title comes in widgetData["title"]
23 * The title comes in widgetData["title"]
23 * The mascot comes in widgetData["mascot"]
24 * The mascot comes in widgetData["mascot"]
24 * The subtitle comes in widgetData["subtitle"]
25 * The subtitle comes in widgetData["subtitle"]
26+ * The attributes comes in widgetData["attributes"]
25 */
27 */
26
28
27PreviewWidget {
29PreviewWidget {
@@ -35,6 +37,7 @@ PreviewWidget {
35 readonly property url mascot: root.widgetData["mascot"] || ""
37 readonly property url mascot: root.widgetData["mascot"] || ""
36 readonly property string title: root.widgetData["title"] || ""
38 readonly property string title: root.widgetData["title"] || ""
37 readonly property string subtitle: root.widgetData["subtitle"] || ""
39 readonly property string subtitle: root.widgetData["subtitle"] || ""
40+ readonly property var attributes: root.widgetData["attributes"] || null
38 readonly property color fontColor: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText
41 readonly property color fontColor: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText
39
42
40 implicitHeight: row.height + row.margins * 2
43 implicitHeight: row.height + row.margins * 2
@@ -97,7 +100,6 @@ PreviewWidget {
97 font.weight: Font.Normal
100 font.weight: Font.Normal
98 fontSize: "large"
101 fontSize: "large"
99 wrapMode: Text.Wrap
102 wrapMode: Text.Wrap
100− maximumLineCount: 2
101 color: headerRoot.fontColor
103 color: headerRoot.fontColor
102 text: headerRoot.title
104 text: headerRoot.title
103 }
105 }
@@ -115,6 +117,16 @@ PreviewWidget {
115 text: headerRoot.subtitle
117 text: headerRoot.subtitle
116 }
118 }
117 }
119 }
120+
121+ Loader {
122+ active: titleLabel.text && headerRoot.attributes
123+ anchors { left: parent.left; right: parent.right }
124+ sourceComponent: CardAttributes {
125+ id: previewAttributes
126+ objectName: "previewAttributes"
127+ model: headerRoot.attributes
128+ }
129+ }
118 }
130 }
119 }
131 }
120 }
132 }
qml/Dash/PullToRefreshScopeStyle.qmlnew file+82
@@ -0,0 +1,82 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.3
18+import Ubuntu.Components 1.1
19+import Ubuntu.Components.Styles 1.1
20+
21+/**
22+ * TODO: Once the SDK version of PullToRefreshStyle doesn't have bug 1375799
23+ * (https://launchpad.net/bugs/1375799) anymore, we should switch to using a
24+ * a subclass of the Ambiance version with a hidden ActivityIndicator.
25+ */
26+PullToRefreshStyle {
27+ releaseToRefresh: styledItem.target.originY - styledItem.target.contentY > activationThreshold
28+
29+ Connections {
30+ property bool willRefresh: false
31+
32+ target: styledItem.target
33+ onDraggingChanged: {
34+ if (!styledItem.target.dragging && releaseToRefresh) {
35+ willRefresh = true
36+ }
37+ }
38+ onContentYChanged: {
39+ if (styledItem.target.originY - styledItem.target.contentY == 0 && willRefresh) {
40+ styledItem.refresh()
41+ willRefresh = false
42+ }
43+ }
44+ }
45+
46+ Label {
47+ id: pullLabel
48+ anchors.horizontalCenter: parent.horizontalCenter
49+ horizontalAlignment: Text.AlignHCenter
50+ verticalAlignment: Text.AlignVCenter
51+ states: [
52+ State {
53+ name: "pulling"
54+ when: styledItem.target.dragging && !releaseToRefresh
55+ PropertyChanges { target: pullLabel; text: i18n.tr("Pull to refresh…") }
56+ },
57+ State {
58+ name: "releasable"
59+ when: styledItem.target.dragging && releaseToRefresh
60+ PropertyChanges { target: pullLabel; text: i18n.tr("Release to refresh…") }
61+ }
62+ ]
63+ transitions: Transition {
64+ SequentialAnimation {
65+ UbuntuNumberAnimation {
66+ target: pullLabel
67+ property: "opacity"
68+ to: 0.0
69+ }
70+ PropertyAction {
71+ target: pullLabel
72+ property: "text"
73+ }
74+ UbuntuNumberAnimation {
75+ target: pullLabel
76+ property: "opacity"
77+ to: 1.0
78+ }
79+ }
80+ }
81+ }
82+}
qml/Dash/ScopeSettingsPage.qml+1
@@ -50,6 +50,7 @@ Item {
50 right: parent.right
50 right: parent.right
51 }
51 }
52 model: root.scope ? root.scope.settings : null
52 model: root.scope ? root.scope.settings : null
53+ clip: true
53
54
54 delegate: ScopeSettingsWidgetFactory {
55 delegate: ScopeSettingsWidgetFactory {
55 objectName: "scopeSettingItem" + index
56 objectName: "scopeSettingItem" + index
qml/Dash/ScopesOverview.qml+9−1
@@ -89,6 +89,7 @@ Item {
89 } else {
89 } else {
90 root.allFavoriteSelected(scopeId);
90 root.allFavoriteSelected(scopeId);
91 }
91 }
92+ previewListView.open = false;
92 }
93 }
93 }
94 }
94
95
@@ -98,6 +99,14 @@ Item {
98 value: progress === 1
99 value: progress === 1
99 }
100 }
100
101
102+ function closeTempScope() {
103+ if (tempScopeItem.scope) {
104+ root.scope.closeScope(tempScopeItem.scope);
105+ tempScopeItem.scope = null;
106+ tempScopeItem.backClicked()
107+ }
108+ }
109+
101 function animateDashFromAll(scopeId) {
110 function animateDashFromAll(scopeId) {
102 var currentScopePos = allScopeCardPosition(scopeId);
111 var currentScopePos = allScopeCardPosition(scopeId);
103 if (currentScopePos) {
112 if (currentScopePos) {
@@ -531,7 +540,6 @@ Item {
531
540
532 width: parent.width
541 width: parent.width
533 height: parent.height
542 height: parent.height
534− scale: dash.contentScale
535 clip: scale != 1.0
543 clip: scale != 1.0
536 visible: scope != null
544 visible: scope != null
537 hasBackAction: true
545 hasBackAction: true
qml/Dash/ScopesOverviewFavorites.qml+1−1
@@ -63,7 +63,7 @@ Flickables.Flickable {
63 item.cardData = Qt.binding(function() { return model; });
63 item.cardData = Qt.binding(function() { return model; });
64 item.template = Qt.binding(function() { return cardTool.template; });
64 item.template = Qt.binding(function() { return cardTool.template; });
65 item.components = Qt.binding(function() { return cardTool.components; });
65 item.components = Qt.binding(function() { return cardTool.components; });
66− item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
66+ item.titleAlignment = Qt.binding(function() { return cardTool.titleAlignment; });
67 }
67 }
68
68
69 Connections {
69 Connections {
qml/Greeter/Greeter.qml+14−2
@@ -36,7 +36,7 @@ Showable {
36
36
37 property alias dragHandleWidth: dragHandle.width
37 property alias dragHandleWidth: dragHandle.width
38 property alias model: greeterContentLoader.model
38 property alias model: greeterContentLoader.model
39− property bool locked: shown && !LightDM.Greeter.promptless
39+ property bool locked: true
40
40
41 readonly property bool narrowMode: !multiUser && height > width
41 readonly property bool narrowMode: !multiUser && height > width
42 readonly property bool multiUser: LightDM.Users.count > 1
42 readonly property bool multiUser: LightDM.Users.count > 1
@@ -57,6 +57,18 @@ Showable {
57 }
57 }
58 }
58 }
59
59
60+ function tryToUnlock() {
61+ if (created) {
62+ greeterContentLoader.item.tryToUnlock()
63+ }
64+ }
65+
66+ function reset() {
67+ if (created) {
68+ greeterContentLoader.item.reset()
69+ }
70+ }
71+
60 onRequiredChanged: {
72 onRequiredChanged: {
61 // Reset hide animation to default once we're finished with it
73 // Reset hide animation to default once we're finished with it
62 if (required) {
74 if (required) {
@@ -154,7 +166,7 @@ Showable {
154 anchors.horizontalCenter: parent.horizontalCenter
166 anchors.horizontalCenter: parent.horizontalCenter
155 anchors.bottom: parent.bottom
167 anchors.bottom: parent.bottom
156 anchors.bottomMargin: units.gu(5)
168 anchors.bottomMargin: units.gu(5)
157− text: i18n.tr("Swipe to unlock")
169+ text: "《 " + i18n.tr("Unlock") + " 》"
158 color: "white"
170 color: "white"
159 font.weight: Font.Light
171 font.weight: Font.Light
160
172
qml/Greeter/GreeterContent.qml+15
@@ -29,6 +29,18 @@ Item {
29 signal selected(int uid)
29 signal selected(int uid)
30 signal unlocked(int uid)
30 signal unlocked(int uid)
31
31
32+ function tryToUnlock() {
33+ if (loginLoader.item) {
34+ loginLoader.item.tryToUnlock()
35+ }
36+ }
37+
38+ function reset() {
39+ if (loginLoader.item) {
40+ loginLoader.item.reset()
41+ }
42+ }
43+
32 Rectangle {
44 Rectangle {
33 // In case background fails to load
45 // In case background fails to load
34 id: backgroundBackup
46 id: backgroundBackup
@@ -47,6 +59,9 @@ Item {
47 topMargin: backgroundTopMargin
59 topMargin: backgroundTopMargin
48 }
60 }
49 fillMode: Image.PreserveAspectCrop
61 fillMode: Image.PreserveAspectCrop
62+ // Limit how much memory we'll reserve for this image
63+ sourceSize.height: height
64+ sourceSize.width: width
50 }
65 }
51
66
52 // See Shell.qml's backgroundSettings treatment for why we need a separate
67 // See Shell.qml's backgroundSettings treatment for why we need a separate
qml/Greeter/LoginList.qml+19−6
@@ -36,6 +36,22 @@ Item {
36 signal selected(int uid)
36 signal selected(int uid)
37 signal unlocked(int uid)
37 signal unlocked(int uid)
38
38
39+ function tryToUnlock() {
40+ if (LightDM.Greeter.promptless) {
41+ if (LightDM.Greeter.authenticated) {
42+ root.unlocked(userList.currentIndex)
43+ } else {
44+ root.resetAuthentication()
45+ }
46+ } else {
47+ passwordInput.forceActiveFocus()
48+ }
49+ }
50+
51+ function reset() {
52+ root.resetAuthentication()
53+ }
54+
39 Keys.onEscapePressed: root.resetAuthentication()
55 Keys.onEscapePressed: root.resetAuthentication()
40
56
41 Rectangle {
57 Rectangle {
@@ -229,14 +245,11 @@ Item {
229 }
245 }
230
246
231 MouseArea {
247 MouseArea {
248+ id: passwordMouseArea
249+ objectName: "passwordMouseArea"
232 anchors.fill: passwordInput
250 anchors.fill: passwordInput
233 enabled: LightDM.Greeter.promptless
251 enabled: LightDM.Greeter.promptless
234− onClicked: {
252+ onClicked: root.tryToUnlock()
235− if (LightDM.Greeter.authenticated)
236− root.unlocked(userList.currentIndex);
237− else
238− root.resetAuthentication();
239− }
240 }
253 }
241
254
242 function resetAuthentication() {
255 function resetAuthentication() {
qml/Launcher/Launcher.qml+1
@@ -92,6 +92,7 @@ Item {
92 // machine and switch to the final state in the next event loop run
92 // machine and switch to the final state in the next event loop run
93 Timer {
93 Timer {
94 id: animateTimer
94 id: animateTimer
95+ objectName: "animateTimer"
95 interval: 1
96 interval: 1
96 property string nextState: ""
97 property string nextState: ""
97 onTriggered: {
98 onTriggered: {
qml/Launcher/LauncherDelegate.qml+20−33
@@ -27,7 +27,7 @@ Item {
27 property bool itemFocused: false
27 property bool itemFocused: false
28 property real maxAngle: 0
28 property real maxAngle: 0
29 property bool inverted: false
29 property bool inverted: false
30− property bool clipCorner: false
30+ property alias pinned: pin.visible
31
31
32 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
32 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
33 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
33 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
@@ -71,14 +71,31 @@ Item {
71 height: root.itemHeight - units.gu(1)
71 height: root.itemHeight - units.gu(1)
72 }
72 }
73
73
74+ Rectangle {
75+ id: pin
76+ anchors {
77+ left: iconShape.left
78+ top: iconShape.top
79+ topMargin: -units.dp(2)
80+ }
81+ width: units.gu(1)
82+ height: width
83+ radius: width / 2
84+ color: "white"
85+ }
86+
74 UbuntuShape {
87 UbuntuShape {
88+ id: countEmblem
75 objectName: "countEmblem"
89 objectName: "countEmblem"
90+
91+ readonly property real pinMargin: pin.visible ? pin.width + units.gu(1) - anchors.leftMargin : 0
92+
76 anchors {
93 anchors {
77 right: parent.right
94 right: parent.right
78 top: parent.top
95 top: parent.top
79 margins: units.dp(3)
96 margins: units.dp(3)
80 }
97 }
81− width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
98+ width: Math.min(root.itemWidth - pinMargin, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
82 height: units.gu(2)
99 height: units.gu(2)
83 color: UbuntuColors.orange
100 color: UbuntuColors.orange
84 visible: root.countVisible
101 visible: root.countVisible
@@ -92,7 +109,7 @@ Item {
92 // FIXME: verticalCenter seems to be off wee bit and QML doesn't have a centerLine
109 // FIXME: verticalCenter seems to be off wee bit and QML doesn't have a centerLine
93 // property for Text: https://bugreports.qt-project.org/browse/QTBUG-40479
110 // property for Text: https://bugreports.qt-project.org/browse/QTBUG-40479
94 anchors.verticalCenterOffset: -units.dp(.5)
111 anchors.verticalCenterOffset: -units.dp(.5)
95− width: root.itemWidth - units.gu(1)
112+ width: root.itemWidth - units.gu(1) - countEmblem.pinMargin
96 horizontalAlignment: Text.AlignHCenter
113 horizontalAlignment: Text.AlignHCenter
97 elide: Text.ElideRight
114 elide: Text.ElideRight
98 color: "white"
115 color: "white"
@@ -149,24 +166,6 @@ Item {
149 }
166 }
150 }
167 }
151
168
152− Item {
153− id: clipper
154− anchors.centerIn: parent
155− width: iconItem.width
156− height: iconItem.height
157− Rectangle {
158− anchors {
159− fill: parent
160− topMargin: -units.gu(2)
161− leftMargin: -units.gu(2)
162− rightMargin: -units.gu(2)
163− bottomMargin: units.gu(1.2)
164− }
165− color: "red"
166− rotation: root.rotation + 45
167− }
168− }
169−
170 ShaderEffect {
169 ShaderEffect {
171 id: transformEffect
170 id: transformEffect
172 anchors.centerIn: parent
171 anchors.centerIn: parent
@@ -176,7 +175,6 @@ Item {
176 property real itemOpacity: root.itemOpacity
175 property real itemOpacity: root.itemOpacity
177 property real brightness: Math.max(-1, root.brightness)
176 property real brightness: Math.max(-1, root.brightness)
178 property real angle: root.angle
177 property real angle: root.angle
179− property bool clipCorner: root.clipCorner
180 rotation: root.inverted ? 180 : 0
178 rotation: root.inverted ? 180 : 0
181
179
182 property variant source: ShaderEffectSource {
180 property variant source: ShaderEffectSource {
@@ -185,11 +183,6 @@ Item {
185 hideSource: true
183 hideSource: true
186 }
184 }
187
185
188− property var mask: ShaderEffectSource {
189− sourceItem: clipper
190− hideSource: true
191− }
192−
193 transform: [
186 transform: [
194 // Rotating 3 times at top/bottom because that increases the perspective.
187 // Rotating 3 times at top/bottom because that increases the perspective.
195 // This is a hack, but as QML does not support real 3D coordinates
188 // This is a hack, but as QML does not support real 3D coordinates
@@ -224,19 +217,13 @@ Item {
224 fragmentShader: "
217 fragmentShader: "
225 varying highp vec2 qt_TexCoord0;
218 varying highp vec2 qt_TexCoord0;
226 uniform sampler2D source;
219 uniform sampler2D source;
227− uniform sampler2D mask;
228 uniform lowp float brightness;
220 uniform lowp float brightness;
229 uniform lowp float itemOpacity;
221 uniform lowp float itemOpacity;
230− uniform bool clipCorner;
231 void main(void)
222 void main(void)
232 {
223 {
233 highp vec4 sourceColor = texture2D(source, qt_TexCoord0);
224 highp vec4 sourceColor = texture2D(source, qt_TexCoord0);
234− highp vec4 maskColor = texture2D(mask, qt_TexCoord0);
235 sourceColor.rgb = mix(sourceColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
225 sourceColor.rgb = mix(sourceColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
236 sourceColor *= itemOpacity;
226 sourceColor *= itemOpacity;
237− if (clipCorner) {
238− sourceColor *= maskColor.a;
239− }
240 gl_FragColor = sourceColor;
227 gl_FragColor = sourceColor;
241 }"
228 }"
242 }
229 }
qml/Launcher/LauncherPanel.qml+5−14
@@ -66,15 +66,6 @@ Rectangle {
66 }
66 }
67 }
67 }
68
68
69− ThinDivider {
70− anchors {
71− left: parent.left
72− right: parent.right
73− margins: -mainColumn.anchors.leftMargin
74− }
75− rotation: root.rotation
76− }
77−
78 Item {
69 Item {
79 anchors.left: parent.left
70 anchors.left: parent.left
80 anchors.right: parent.right
71 anchors.right: parent.right
@@ -159,7 +150,7 @@ Rectangle {
159 count: model.count
150 count: model.count
160 countVisible: model.countVisible
151 countVisible: model.countVisible
161 progress: model.progress
152 progress: model.progress
162− clipCorner: model.pinned
153+ pinned: model.pinned
163 itemFocused: model.focused
154 itemFocused: model.focused
164 inverted: root.inverted
155 inverted: root.inverted
165 z: -Math.abs(offset)
156 z: -Math.abs(offset)
@@ -470,10 +461,10 @@ Rectangle {
470 width: itemWidth
461 width: itemWidth
471 rotation: root.rotation
462 rotation: root.rotation
472 itemOpacity: 0.9
463 itemOpacity: 0.9
473− clipCorner: dndArea.draggedIndex > -1 &&
464+ pinned: dndArea.draggedIndex > -1 &&
474− LauncherModel.get(dndArea.draggedIndex).pinned &&
465+ LauncherModel.get(dndArea.draggedIndex).pinned &&
475− !dndArea.preDragging &&
466+ !dndArea.preDragging &&
476− !dndArea.dragging
467+ !dndArea.dragging
477
468
478 function flatten() {
469 function flatten() {
479 fakeDragItemAnimation.start();
470 fakeDragItemAnimation.start();
qml/Notifications/NotificationMenuItemFactory.qml+77−5
@@ -19,6 +19,7 @@
19
19
20import QtQuick 2.0
20import QtQuick 2.0
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22+import QMenuModel 0.1
22import "../Components"
23import "../Components"
23
24
24Loader {
25Loader {
@@ -26,7 +27,7 @@ Loader {
26
27
27 property QtObject menuModel: null
28 property QtObject menuModel: null
28 property QtObject menuData: null
29 property QtObject menuData: null
29− property int menuIndex
30+ property int menuIndex : -1
30 property int maxHeight
31 property int maxHeight
31 readonly property bool fullscreen: menuData.type === "com.canonical.snapdecision.pinlock"
32 readonly property bool fullscreen: menuData.type === "com.canonical.snapdecision.pinlock"
32
33
@@ -46,6 +47,13 @@ Loader {
46 }
47 }
47 }
48 }
48
49
50+ function getExtendedProperty(object, propertyName, defaultValue) {
51+ if (object && object.hasOwnProperty(propertyName)) {
52+ return object[propertyName];
53+ }
54+ return defaultValue;
55+ }
56+
49 Component {
57 Component {
50 id: textfield
58 id: textfield
51
59
@@ -121,14 +129,14 @@ Loader {
121 right: parent.right
129 right: parent.right
122 }
130 }
123 height: menuFactory.maxHeight
131 height: menuFactory.maxHeight
124− infoText: i18n.tr("Enter SIM PIN")
132+ infoText: notification.summary
125− errorText: i18n.tr("Sorry, incorrect PIN")
133+ errorText: errorAction.valid ? errorAction.state : ""
126− minPinLength: 4
134+ retryText: notification.body
127− maxPinLength: 8
128 background: shell.background
135 background: shell.background
129
136
130 onEntered: {
137 onEntered: {
131 menuModel.changeState(menuIndex, passphrase);
138 menuModel.changeState(menuIndex, passphrase);
139+ clear(false);
132 }
140 }
133
141
134 onCancel: {
142 onCancel: {
@@ -139,6 +147,70 @@ Loader {
139 shell.activateApplication("dialer-app")
147 shell.activateApplication("dialer-app")
140 menuModel.activate(menuIndex, false)
148 menuModel.activate(menuIndex, false)
141 }
149 }
150+
151+ property var extendedData: menuData && menuData.ext || undefined
152+
153+ property var pinMinMaxAction : UnityMenuAction {
154+ model: menuModel
155+ index: menuIndex
156+ name: getExtendedProperty(extendedData, "xCanonicalPinMinMax", "")
157+
158+ onStateChanged: {
159+ var min = pinMinMaxAction.state[0];
160+ var max = pinMinMaxAction.state[1];
161+
162+ if (min === 0) min = -1;
163+ if (max === 0) max = -1;
164+
165+ minPinLength = min
166+ maxPinLength = max
167+ }
168+ }
169+
170+ property var popupAction: UnityMenuAction {
171+ model: menuModel
172+ index: menuIndex
173+ name: getExtendedProperty(extendedData, "xCanonicalPinPopup", "")
174+ onStateChanged: {
175+ if (state !== "")
176+ showInfoPopup("", state);
177+ }
178+ }
179+ onInfoPopupConfirmed: {
180+ popupAction.activate();
181+ }
182+
183+ Timer {
184+ id: errorTimer
185+ interval: 4000;
186+ running: false;
187+ repeat: false
188+ onTriggered: {
189+ errorAction.activate();
190+ }
191+ }
192+ property var errorAction: UnityMenuAction {
193+ model: menuModel
194+ index: menuIndex
195+ name: getExtendedProperty(extendedData, "xCanonicalPinError", "")
196+ onStateChanged: {
197+ errorText = state;
198+ if (state !== "") {
199+ clear(true);
200+ errorTimer.running = true;
201+ }
202+ }
203+ }
204+
205+ function loadAttributes() {
206+ if (!menuModel || menuIndex == -1) return;
207+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-pin-min-max': 'string',
208+ 'x-canonical-pin-popup': 'string',
209+ 'x-canonical-pin-error': 'string'});
210+ }
211+ Component.onCompleted: {
212+ loadAttributes();
213+ }
142 }
214 }
143 }
215 }
144}
216}
qml/Panel/ActiveCallHint.qml+1−1
@@ -117,7 +117,7 @@ Item {
117 verticalAlignment: Text.AlignVCenter
117 verticalAlignment: Text.AlignVCenter
118 horizontalAlignment: Text.AlignRight
118 horizontalAlignment: Text.AlignRight
119 text: {
119 text: {
120− var m = Math.round(d.callTime/60);
120+ var m = Math.floor(d.callTime/60);
121 var ss = d.callTime % 60;
121 var ss = d.callTime % 60;
122 if (ss >= 10) {
122 if (ss >= 10) {
123 return m + ":" + ss;
123 return m + ":" + ss;
qml/Panel/IndicatorItem.qml+6
@@ -39,6 +39,12 @@ Loader {
39 }
39 }
40 }
40 }
41
41
42+ Binding {
43+ target: item
44+ property: "identifier"
45+ value: identifier
46+ }
47+
42 Binding {
48 Binding {
43 target: item
49 target: item
44 property: "objectName"
50 property: "objectName"
qml/Panel/Indicators/DefaultIndicatorPage.qml+1−1
@@ -131,7 +131,7 @@ IndicatorBase {
131 visible: status == Loader.Ready
131 visible: status == Loader.Ready
132
132
133 property int modelIndex: index
133 property int modelIndex: index
134− sourceComponent: factory.load(model, identifier)
134+ sourceComponent: factory.load(model, main.identifier)
135
135
136 onLoaded: {
136 onLoaded: {
137 if (item.hasOwnProperty("selected")) {
137 if (item.hasOwnProperty("selected")) {
qml/Panel/Indicators/IndicatorBase.qml+1
@@ -26,6 +26,7 @@ Item {
26 enabled: menuObjectPath != ""
26 enabled: menuObjectPath != ""
27
27
28 //const
28 //const
29+ property string identifier
29 property string busName
30 property string busName
30 property string actionsObjectPath
31 property string actionsObjectPath
31 property string menuObjectPath
32 property string menuObjectPath
qml/Panel/Indicators/MenuItemFactory.qml+19−4
@@ -283,12 +283,17 @@ Item {
283 objectName: "checkableMenu"
283 objectName: "checkableMenu"
284 property QtObject menuData: null
284 property QtObject menuData: null
285 property int menuIndex: -1
285 property int menuIndex: -1
286+ property bool serverChecked: menuData && menuData.isToggled || false
286
287
287 text: menuData && menuData.label || ""
288 text: menuData && menuData.label || ""
288 enabled: menuData && menuData.sensitive || false
289 enabled: menuData && menuData.sensitive || false
289− checked: menuData && menuData.isToggled || false
290+ checked: serverChecked
290 highlightWhenPressed: false
291 highlightWhenPressed: false
291
292
293+ onServerCheckedChanged: {
294+ // value can be changed by menu, so a binding won't work.
295+ checked = serverChecked;
296+ }
292 onTriggered: {
297 onTriggered: {
293 menuModel.activate(menuIndex);
298 menuModel.activate(menuIndex);
294 }
299 }
@@ -302,13 +307,18 @@ Item {
302 objectName: "switchMenu"
307 objectName: "switchMenu"
303 property QtObject menuData: null
308 property QtObject menuData: null
304 property int menuIndex: -1
309 property int menuIndex: -1
310+ property bool serverChecked: menuData && menuData.isToggled || false
305
311
306 text: menuData && menuData.label || ""
312 text: menuData && menuData.label || ""
307 iconSource: menuData && menuData.icon || ""
313 iconSource: menuData && menuData.icon || ""
308 enabled: menuData && menuData.sensitive || false
314 enabled: menuData && menuData.sensitive || false
309− checked: menuData && menuData.isToggled || false
315+ checked: serverChecked
310 highlightWhenPressed: false
316 highlightWhenPressed: false
311
317
318+ onServerCheckedChanged: {
319+ // value can be changed by menu, so a binding won't work.
320+ checked = serverChecked;
321+ }
312 onTriggered: {
322 onTriggered: {
313 menuModel.activate(menuIndex);
323 menuModel.activate(menuIndex);
314 }
324 }
@@ -431,6 +441,7 @@ Item {
431 property var menuModel: menuFactory.menuModel
441 property var menuModel: menuFactory.menuModel
432 property int menuIndex: -1
442 property int menuIndex: -1
433 property var extendedData: menuData && menuData.ext || undefined
443 property var extendedData: menuData && menuData.ext || undefined
444+ property bool serverChecked: menuData && menuData.isToggled || false
434
445
435 property var strengthAction: UnityMenuAction {
446 property var strengthAction: UnityMenuAction {
436 model: menuModel
447 model: menuModel
@@ -440,12 +451,16 @@ Item {
440
451
441 text: menuData && menuData.label || ""
452 text: menuData && menuData.label || ""
442 enabled: menuData && menuData.sensitive || false
453 enabled: menuData && menuData.sensitive || false
443− active: menuData && menuData.isToggled || false
454+ active: serverChecked
444 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
455 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
445 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
456 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
446 signalStrength: strengthAction.valid ? strengthAction.state : 0
457 signalStrength: strengthAction.valid ? strengthAction.state : 0
447 highlightWhenPressed: false
458 highlightWhenPressed: false
448
459
460+ onServerCheckedChanged: {
461+ // value can be changed by menu, so a binding won't work.
462+ active = serverChecked;
463+ }
449 onMenuModelChanged: {
464 onMenuModelChanged: {
450 loadAttributes();
465 loadAttributes();
451 }
466 }
@@ -823,7 +838,7 @@ Item {
823 }
838 }
824
839
825 function load(modelData, context) {
840 function load(modelData, context) {
826− if (modelData.type !== undefined) {
841+ if (modelData.type !== undefined && modelData.type !== "") {
827 var component = undefined;
842 var component = undefined;
828
843
829 var contextComponents = _map[context];
844 var contextComponents = _map[context];
qml/Panel/Indicators/VisibleIndicators.qml+1
@@ -55,6 +55,7 @@ Item {
55 delegate: IndicatorDelegate {
55 delegate: IndicatorDelegate {
56 id: item
56 id: item
57 objectName: model.identifier + "-delegate"
57 objectName: model.identifier + "-delegate"
58+ identifier: model.identifier
58 Component.onCompleted: {
59 Component.onCompleted: {
59 for(var pName in indicatorProperties) {
60 for(var pName in indicatorProperties) {
60 if (item.hasOwnProperty(pName)) {
61 if (item.hasOwnProperty(pName)) {
qml/Panel/MenuContent.qml+6
@@ -124,6 +124,12 @@ Rectangle {
124 }
124 }
125 }
125 }
126
126
127+ Binding {
128+ target: loader.item
129+ property: "identifier"
130+ value: identifier
131+ }
132+
127 Binding {
133 Binding {
128 target: loader.item
134 target: loader.item
129 property: "objectName"
135 property: "objectName"
qml/Shell.qml+126−61
@@ -60,7 +60,7 @@ Item {
60
60
61 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
61 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
62 property int failedLoginsDelayAttempts: 7 // number of failed logins
62 property int failedLoginsDelayAttempts: 7 // number of failed logins
63− property int failedLoginsDelaySeconds: 5 * 60 // seconds of forced waiting
63+ property int failedLoginsDelayMinutes: 5 // minutes of forced waiting
64
64
65 property int orientation
65 property int orientation
66 readonly property int deviceOrientationAngle: Screen.angleBetween(Screen.primaryOrientation, Screen.orientation)
66 readonly property int deviceOrientationAngle: Screen.angleBetween(Screen.primaryOrientation, Screen.orientation)
@@ -87,9 +87,9 @@ Item {
87 }
87 }
88 }
88 }
89
89
90− function setFakeActiveForApp(app) {
90+ function setLockedApp(app) {
91 if (shell.locked) {
91 if (shell.locked) {
92− greeter.fakeActiveForApp = app
92+ greeter.lockedApp = app
93 lockscreen.hide()
93 lockscreen.hide()
94 }
94 }
95 }
95 }
@@ -128,6 +128,13 @@ Item {
128 objectName: "dashCommunicator"
128 objectName: "dashCommunicator"
129 }
129 }
130
130
131+ Binding {
132+ target: ApplicationManager
133+ property: "forceDashActive"
134+ value: launcher.shown || launcher.dashSwipe
135+ }
136+
137+
131 WindowKeysFilter {
138 WindowKeysFilter {
132 // Handle but do not filter out volume keys
139 // Handle but do not filter out volume keys
133 Keys.onVolumeUpPressed: { volumeControl.volumeUp(); event.accepted = false; }
140 Keys.onVolumeUpPressed: { volumeControl.volumeUp(); event.accepted = false; }
@@ -162,32 +169,37 @@ Item {
162 Connections {
169 Connections {
163 target: ApplicationManager
170 target: ApplicationManager
164 onFocusRequested: {
171 onFocusRequested: {
172+ if (greeter.narrowMode) {
165− if (appId === "dialer-app") {
173+ if (appId === "dialer-app") {
166− // Always let the dialer-app through. Either user asked
174+ // Always let the dialer-app through. Either user asked
167− // for an emergency call or accepted an incoming call.
175+ // for an emergency call or accepted an incoming call.
168− setFakeActiveForApp(appId)
176+ setLockedApp(appId)
169− } else if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== appId) {
177+ } else if (greeter.hasLockedApp && greeter.lockedApp !== appId) {
170− lockscreen.show();
178+ greeter.startUnlock()
179+ }
180+ greeter.hide();
181+ } else {
182+ if (LightDM.Greeter.active) {
183+ greeter.startUnlock()
184+ }
171 }
185 }
172− greeter.hide();
173− launcher.hide();
174 }
186 }
175
187
176 onFocusedApplicationIdChanged: {
188 onFocusedApplicationIdChanged: {
177− if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== ApplicationManager.focusedApplicationId) {
189+ if (greeter.hasLockedApp && greeter.lockedApp !== ApplicationManager.focusedApplicationId) {
178− lockscreen.show();
190+ greeter.startUnlock()
179 }
191 }
180 panel.indicators.hide();
192 panel.indicators.hide();
181 }
193 }
182
194
183 onApplicationAdded: {
195 onApplicationAdded: {
184 if (greeter.shown && appId != "unity8-dash") {
196 if (greeter.shown && appId != "unity8-dash") {
185− greeter.hide();
197+ greeter.startUnlock()
186 }
198 }
187− if (appId === "dialer-app") {
199+ if (greeter.narrowMode && appId === "dialer-app") {
188 // Always let the dialer-app through. Either user asked
200 // Always let the dialer-app through. Either user asked
189 // for an emergency call or accepted an incoming call.
201 // for an emergency call or accepted an incoming call.
190− setFakeActiveForApp(appId)
202+ setLockedApp(appId)
191 }
203 }
192 launcher.hide();
204 launcher.hide();
193 }
205 }
@@ -195,9 +207,19 @@ Item {
195
207
196 Loader {
208 Loader {
197 id: applicationsDisplayLoader
209 id: applicationsDisplayLoader
210+ objectName: "applicationsDisplayLoader"
198 anchors.fill: parent
211 anchors.fill: parent
199
212
213+ // When we have a locked app, we only want to show that one app.
214+ // FIXME: do this in a less traumatic way. We currently only allow
215+ // locked apps in phone mode (see FIXME in Lockscreen component in
216+ // this same file). When that changes, we need to do something
217+ // nicer here. But this code is currently just to prevent a
218+ // theoretical attack where user enters lockedApp mode, then makes
219+ // the screen larger (maybe connects to monitor) and tries to enter
220+ // tablet mode.
221+ property bool tabletMode: shell.sideStageEnabled && !greeter.hasLockedApp
200− source: shell.sideStageEnabled ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
222+ source: tabletMode ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
201
223
202 Binding {
224 Binding {
203 target: applicationsDisplayLoader.item
225 target: applicationsDisplayLoader.item
@@ -223,7 +245,7 @@ Item {
223 Binding {
245 Binding {
224 target: applicationsDisplayLoader.item
246 target: applicationsDisplayLoader.item
225 property: "spreadEnabled"
247 property: "spreadEnabled"
226− value: edgeDemo.stagesEnabled && greeter.fakeActiveForApp === "" // to support emergency dialer hack
248+ value: edgeDemo.stagesEnabled && !greeter.hasLockedApp
227 }
249 }
228 Binding {
250 Binding {
229 target: applicationsDisplayLoader.item
251 target: applicationsDisplayLoader.item
@@ -278,8 +300,6 @@ Item {
278 id: lockscreen
300 id: lockscreen
279 objectName: "lockscreen"
301 objectName: "lockscreen"
280
302
281− readonly property int backgroundTopMargin: -panel.panelHeight
282−
283 hides: [launcher, panel.indicators]
303 hides: [launcher, panel.indicators]
284 shown: false
304 shown: false
285 enabled: true
305 enabled: true
@@ -294,11 +314,33 @@ Item {
294 minPinLength: 4
314 minPinLength: 4
295 maxPinLength: 4
315 maxPinLength: 4
296
316
317+ // FIXME: We *should* show emergency dialer if there is a SIM present,
318+ // regardless of whether the side stage is enabled. But right now,
319+ // the assumption is that narrow screens are phones which have SIMs
320+ // and wider screens are tablets which don't. When we do allow this
321+ // on devices with a side stage and a SIM, work should be done to
322+ // ensure that the main stage is disabled while the dialer is present
323+ // in the side stage. See the FIXME in the stage loader in this file.
324+ showEmergencyCallButton: !shell.sideStageEnabled
325+
297 onEntered: LightDM.Greeter.respond(passphrase);
326 onEntered: LightDM.Greeter.respond(passphrase);
298 onCancel: greeter.show()
327 onCancel: greeter.show()
299− onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter fake-active mode
328+ onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter locked-app mode
300−
329+
301− onShownChanged: if (shown) greeter.fakeActiveForApp = ""
330+ onShownChanged: if (shown) greeter.lockedApp = ""
331+
332+ Timer {
333+ id: forcedDelayTimer
334+ interval: 1000 * 60
335+ onTriggered: {
336+ if (lockscreen.delayMinutes > 0) {
337+ lockscreen.delayMinutes -= 1
338+ if (lockscreen.delayMinutes > 0) {
339+ start() // go again
340+ }
341+ }
342+ }
343+ }
302
344
303 Component.onCompleted: {
345 Component.onCompleted: {
304 if (greeter.narrowMode) {
346 if (greeter.narrowMode) {
@@ -317,14 +359,15 @@ Item {
317 if (greeter.narrowMode) {
359 if (greeter.narrowMode) {
318 if (isDefaultPrompt) {
360 if (isDefaultPrompt) {
319 if (lockscreen.alphaNumeric) {
361 if (lockscreen.alphaNumeric) {
320− lockscreen.infoText = i18n.tr("Enter your passphrase")
362+ lockscreen.infoText = i18n.tr("Enter passphrase")
321− lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase")
363+ lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase") + "\n" +
364+ i18n.tr("Please re-enter")
322 } else {
365 } else {
323− lockscreen.infoText = i18n.tr("Enter your passcode")
366+ lockscreen.infoText = i18n.tr("Enter passcode")
324 lockscreen.errorText = i18n.tr("Sorry, incorrect passcode")
367 lockscreen.errorText = i18n.tr("Sorry, incorrect passcode")
325 }
368 }
326 } else {
369 } else {
327− lockscreen.infoText = i18n.tr("Enter your %1").arg(text.toLowerCase())
370+ lockscreen.infoText = i18n.tr("Enter %1").arg(text.toLowerCase())
328 lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
371 lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
329 }
372 }
330
373
@@ -333,11 +376,13 @@ Item {
333 }
376 }
334
377
335 onPromptlessChanged: {
378 onPromptlessChanged: {
379+ if (greeter.narrowMode) {
336− if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
380+ if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
337− lockscreen.hide()
381+ lockscreen.hide()
338− } else {
382+ } else {
339− lockscreen.reset();
383+ lockscreen.reset();
340− lockscreen.show();
384+ lockscreen.show();
385+ }
341 }
386 }
342 }
387 }
343
388
@@ -372,7 +417,8 @@ Item {
372 }
417 }
373 }
418 }
374 if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
419 if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
375− lockscreen.forceDelay(failedLoginsDelaySeconds * 1000)
420+ lockscreen.delayMinutes = failedLoginsDelayMinutes
421+ forcedDelayTimer.start()
376 }
422 }
377
423
378 lockscreen.clear(true);
424 lockscreen.clear(true);
@@ -386,7 +432,7 @@ Item {
386 Binding {
432 Binding {
387 target: LightDM.Greeter
433 target: LightDM.Greeter
388 property: "active"
434 property: "active"
389− value: greeter.shown || lockscreen.shown || greeter.fakeActiveForApp != ""
435+ value: greeter.shown || lockscreen.shown || greeter.hasLockedApp
390 }
436 }
391
437
392 Rectangle {
438 Rectangle {
@@ -398,7 +444,8 @@ Item {
398 Item {
444 Item {
399 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
445 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
400 id: greeterWrapper
446 id: greeterWrapper
447+ objectName: "greeterWrapper"
401− x: launcher.progress
448+ x: greeter.narrowMode ? launcher.progress : 0
402 y: panel.panelHeight
449 y: panel.panelHeight
403 width: parent.width
450 width: parent.width
404 height: parent.height - panel.panelHeight
451 height: parent.height - panel.panelHeight
@@ -411,14 +458,22 @@ Item {
411 property bool fullyShown: showProgress === 1.0
458 property bool fullyShown: showProgress === 1.0
412 onFullyShownChanged: {
459 onFullyShownChanged: {
413 // Wait until the greeter is completely covering lockscreen before resetting it.
460 // Wait until the greeter is completely covering lockscreen before resetting it.
414− if (fullyShown && !LightDM.Greeter.authenticated) {
461+ if (greeter.narrowMode && fullyShown && !LightDM.Greeter.authenticated) {
415 lockscreen.reset();
462 lockscreen.reset();
416 lockscreen.show();
463 lockscreen.show();
417 }
464 }
418 }
465 }
419
466
420 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
467 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
421− onShowProgressChanged: if (LightDM.Greeter.authenticated && showProgress === 0) greeter.login()
468+ onShowProgressChanged: {
469+ if (showProgress === 0) {
470+ if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
471+ greeter.login()
472+ } else if (greeter.narrowMode) {
473+ lockscreen.clear(false) // to reset focus if necessary
474+ }
475+ }
476+ }
422
477
423 Greeter {
478 Greeter {
424 id: greeter
479 id: greeter
@@ -426,13 +481,16 @@ Item {
426
481
427 signal sessionStarted() // helpful for tests
482 signal sessionStarted() // helpful for tests
428
483
429− property string fakeActiveForApp: ""
484+ property string lockedApp: ""
485+ property bool hasLockedApp: lockedApp !== ""
430
486
431 available: true
487 available: true
432 hides: [launcher, panel.indicators]
488 hides: [launcher, panel.indicators]
433 shown: true
489 shown: true
434 loadContent: required || lockscreen.required // keeps content in memory for quick show()
490 loadContent: required || lockscreen.required // keeps content in memory for quick show()
435
491
492+ locked: shell.locked
493+
436 defaultBackground: shell.background
494 defaultBackground: shell.background
437
495
438 width: parent.width
496 width: parent.width
@@ -440,6 +498,18 @@ Item {
440
498
441 dragHandleWidth: shell.edgeSize
499 dragHandleWidth: shell.edgeSize
442
500
501+ function startUnlock() {
502+ if (narrowMode) {
503+ if (!LightDM.Greeter.authenticated) {
504+ lockscreen.show()
505+ }
506+ hide()
507+ } else {
508+ show()
509+ tryToUnlock()
510+ }
511+ }
512+
443 function login() {
513 function login() {
444 enabled = false;
514 enabled = false;
445 if (LightDM.Greeter.startSessionSync()) {
515 if (LightDM.Greeter.startSessionSync()) {
@@ -455,8 +525,10 @@ Item {
455 if (shown) {
525 if (shown) {
456 if (greeter.narrowMode) {
526 if (greeter.narrowMode) {
457 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
527 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
528+ } else {
529+ reset()
458 }
530 }
459− greeter.fakeActiveForApp = "";
531+ greeter.lockedApp = "";
460 greeter.forceActiveFocus();
532 greeter.forceActiveFocus();
461 }
533 }
462 }
534 }
@@ -501,10 +573,7 @@ Item {
501 }
573 }
502
574
503 if (LightDM.Greeter.active) {
575 if (LightDM.Greeter.active) {
504− if (!LightDM.Greeter.authenticated) {
505− lockscreen.show()
506− }
507− greeter.hide()
576+ greeter.startUnlock()
508 }
577 }
509
578
510 var animate = !LightDM.Greeter.active && !stages.shown
579 var animate = !LightDM.Greeter.active && !stages.shown
@@ -513,16 +582,20 @@ Item {
513 }
582 }
514
583
515 function showDash() {
584 function showDash() {
585+ if (greeter.hasLockedApp || // just in case user gets here
516− if (shell.locked) {
586+ (!greeter.narrowMode && shell.locked)) {
517− return;
587+ return
518 }
588 }
589+
519 if (greeter.shown) {
590 if (greeter.shown) {
520 greeter.hideRight();
591 greeter.hideRight();
521 launcher.fadeOut();
592 launcher.fadeOut();
522 }
593 }
523
594
595+ if (ApplicationManager.focusedApplicationId != "unity8-dash") {
524− ApplicationManager.requestFocusApplication("unity8-dash")
596+ ApplicationManager.requestFocusApplication("unity8-dash")
525− launcher.fadeOut();
597+ launcher.fadeOut();
598+ }
526 }
599 }
527
600
528 Item {
601 Item {
@@ -537,7 +610,7 @@ Item {
537 anchors.fill: parent //because this draws indicator menus
610 anchors.fill: parent //because this draws indicator menus
538 indicators {
611 indicators {
539 hides: [launcher]
612 hides: [launcher]
540− available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && greeter.fakeActiveForApp === ""
613+ available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && !greeter.hasLockedApp
541 contentEnabled: edgeDemo.panelContentEnabled
614 contentEnabled: edgeDemo.panelContentEnabled
542 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
615 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
543 panelHeight: units.gu(3)
616 panelHeight: units.gu(3)
@@ -548,7 +621,7 @@ Item {
548 ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
621 ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
549
622
550 fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
623 fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
551− || greeter.fakeActiveForApp !== ""
624+ || greeter.hasLockedApp
552 }
625 }
553
626
554 Launcher {
627 Launcher {
@@ -561,26 +634,18 @@ Item {
561 anchors.bottom: parent.bottom
634 anchors.bottom: parent.bottom
562 width: parent.width
635 width: parent.width
563 dragAreaWidth: shell.edgeSize
636 dragAreaWidth: shell.edgeSize
564− available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && greeter.fakeActiveForApp === ""
637+ available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && !greeter.hasLockedApp
565
638
566 onShowDashHome: showHome()
639 onShowDashHome: showHome()
567− onDash: {
568− if (ApplicationManager.focusedApplicationId != "unity8-dash") {
569− showDash()
640+ onDash: showDash()
570− }
571− if (greeter.shown) {
572− launcher.fadeOut()
573− greeter.hideRight()
574− }
575− }
576 onDashSwipeChanged: {
641 onDashSwipeChanged: {
577 if (dashSwipe) {
642 if (dashSwipe) {
578 dash.setCurrentScope("clickscope", false, true)
643 dash.setCurrentScope("clickscope", false, true)
579 }
644 }
580 }
645 }
581 onLauncherApplicationSelected: {
646 onLauncherApplicationSelected: {
582− if (greeter.fakeActiveForApp !== "") {
647+ if (greeter.hasLockedApp) {
583− lockscreen.show()
648+ greeter.startUnlock()
584 }
649 }
585 if (!edgeDemo.running)
650 if (!edgeDemo.running)
586 shell.activateApplication(appId)
651 shell.activateApplication(appId)
qml/Stages/PhoneStage.qml+8
@@ -86,6 +86,14 @@ Rectangle {
86 if (spreadView.closingIndex == -1) {
86 if (spreadView.closingIndex == -1) {
87 spreadView.phase = 0;
87 spreadView.phase = 0;
88 spreadView.contentX = -spreadView.shift;
88 spreadView.contentX = -spreadView.shift;
89+ focusTopMostApp();
90+ }
91+ }
92+
93+ function focusTopMostApp() {
94+ if (ApplicationManager.count > 0) {
95+ var topmostApp = ApplicationManager.get(0);
96+ ApplicationManager.focusApplication(topmostApp.appId);
89 }
97 }
90 }
98 }
91 }
99 }
qml/Stages/TabletStage.qml+7
@@ -140,9 +140,16 @@ Rectangle {
140 if (priv.sideStageAppId == appId) {
140 if (priv.sideStageAppId == appId) {
141 priv.sideStageAppId = "";
141 priv.sideStageAppId = "";
142 }
142 }
143+
143 if (ApplicationManager.count == 0) {
144 if (ApplicationManager.count == 0) {
144 spreadView.phase = 0;
145 spreadView.phase = 0;
145 spreadView.contentX = -spreadView.shift;
146 spreadView.contentX = -spreadView.shift;
147+ } else if (spreadView.closingIndex == -1) {
148+ // Unless we're closing the app ourselves in the spread,
149+ // lets make sure the spread doesn't mess up by the changing app list.
150+ spreadView.phase = 0;
151+ spreadView.contentX = -spreadView.shift;
152+ ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
146 }
153 }
147 }
154 }
148 }
155 }
run_on_device.sh+4−5
@@ -130,11 +130,10 @@ if [ -z "${PASSWORD}" ]; then
130 usage
130 usage
131fi
131fi
132
132
133−PASSFILE=$( adb shell "FILE=\`mktemp\`
133+PASSFILE=$(adb shell 'mktemp' | tr -d '\r')
134− echo \"#!/bin/sh\" > \$FILE
134+adb shell "echo '#!/bin/sh' > ${PASSFILE}"
135− echo \"echo \\\"${PASSWORD}\\\"\" >> \$FILE
135+adb shell "echo \"echo \\\"${PASSWORD}\\\"\" >> ${PASSFILE}"
136− chmod +x \$FILE
136+adb shell "chmod +x ${PASSFILE}"
137− echo \$FILE" | tr -d '\r' )
138
137
139setup_adb_forwarding
138setup_adb_forwarding
140
139
src/CMakeLists.txt+1
@@ -36,3 +36,4 @@ install(TARGETS ${SHELL_APP}
36
36
37add_subdirectory(Panel)
37add_subdirectory(Panel)
38add_subdirectory(Dash)
38add_subdirectory(Dash)
39+add_subdirectory(libunity8-private)
src/Dash/CMakeLists.txt+2
@@ -9,6 +9,8 @@ add_executable(unity8-dash ${DASH_SRCS})
9
9
10qt5_use_modules(unity8-dash Gui Qml Quick Test)
10qt5_use_modules(unity8-dash Gui Qml Quick Test)
11
11
12+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
13+
12# install binaries
14# install binaries
13install(TARGETS ${DASH_APP}
15install(TARGETS ${DASH_APP}
14 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
16 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
src/Panel/CMakeLists.txt+2
@@ -1 +1,3 @@
1add_subdirectory(Indicators)
1add_subdirectory(Indicators)
2+
3+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
src/libunity8-private/CMakeLists.txtnew file+25
@@ -0,0 +1,25 @@
1+set(LIB_NAME "unity8-private")
2+set(SOVERSION 0)
3+set(VERSION ${SOVERSION}.0.0)
4+
5+project(lib${LIB_NAME})
6+
7+set(lib${LIB_NAME}_SRCS
8+ abstractdbusservicemonitor.cpp
9+ )
10+
11+add_library(${LIB_NAME} SHARED
12+ ${lib${LIB_NAME}_SRCS}
13+ )
14+
15+set_target_properties(${LIB_NAME} PROPERTIES
16+ VERSION ${VERSION}
17+ SOVERSION ${SOVERSION}
18+ )
19+
20+qt5_use_modules(${LIB_NAME} DBus)
21+
22+# install library
23+install(TARGETS ${LIB_NAME}
24+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
25+ )
src/libunity8-private/abstractdbusservicemonitor.cppnew file+87
@@ -0,0 +1,87 @@
1+/*
2+ * Copyright (C) 2011-2014 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Ugo Riboni <ugo.riboni@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+#include "abstractdbusservicemonitor.h"
21+
22+#include <QDBusInterface>
23+#include <QDBusServiceWatcher>
24+#include <QDBusConnection>
25+#include <QDBusConnectionInterface>
26+#include <QDBusReply>
27+
28+AbstractDBusServiceMonitor::AbstractDBusServiceMonitor(const QString &service, const QString &path,
29+ const QString &interface, const Bus bus,
30+ QObject *parent)
31+ : QObject(parent)
32+ , m_service(service)
33+ , m_path(path)
34+ , m_interface(interface)
35+ , m_watcher(new QDBusServiceWatcher(service,
36+ (bus == SystemBus) ? QDBusConnection::systemBus()
37+ : QDBusConnection::sessionBus()))
38+ , m_dbusInterface(nullptr)
39+{
40+ connect(m_watcher, &QDBusServiceWatcher::serviceRegistered, this, &AbstractDBusServiceMonitor::createInterface);
41+ connect(m_watcher, &QDBusServiceWatcher::serviceUnregistered, this, &AbstractDBusServiceMonitor::destroyInterface);
42+
43+ // Connect to the service if it's up already
44+ QDBusConnectionInterface* sessionBus = QDBusConnection::sessionBus().interface();
45+ QDBusReply<bool> reply = sessionBus->isServiceRegistered(m_service);
46+ if (reply.isValid() && reply.value()) {
47+ createInterface(m_service);
48+ }
49+}
50+
51+AbstractDBusServiceMonitor::~AbstractDBusServiceMonitor()
52+{
53+ delete m_watcher;
54+ delete m_dbusInterface;
55+}
56+
57+void AbstractDBusServiceMonitor::createInterface(const QString &)
58+{
59+ if (m_dbusInterface != nullptr) {
60+ delete m_dbusInterface;
61+ m_dbusInterface = nullptr;
62+ }
63+
64+ m_dbusInterface = new QDBusInterface(m_service, m_path, m_interface,
65+ QDBusConnection::sessionBus());
66+ Q_EMIT serviceAvailableChanged(true);
67+}
68+
69+void AbstractDBusServiceMonitor::destroyInterface(const QString &)
70+{
71+ if (m_dbusInterface != nullptr) {
72+ delete m_dbusInterface;
73+ m_dbusInterface = nullptr;
74+ }
75+
76+ Q_EMIT serviceAvailableChanged(false);
77+}
78+
79+QDBusInterface* AbstractDBusServiceMonitor::dbusInterface() const
80+{
81+ return m_dbusInterface;
82+}
83+
84+bool AbstractDBusServiceMonitor::serviceAvailable() const
85+{
86+ return m_dbusInterface != nullptr;
87+}
src/libunity8-private/abstractdbusservicemonitor.hnew file+66
@@ -0,0 +1,66 @@
1+/*
2+ * Copyright (C) 2011-2014 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Ugo Riboni <ugo.riboni@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+#ifndef ABSTRACTDBUSSERVICEMONITOR_H
21+#define ABSTRACTDBUSSERVICEMONITOR_H
22+
23+#include <QObject>
24+#include <QString>
25+#include <QDBusConnection>
26+
27+class QDBusInterface;
28+class QDBusServiceWatcher;
29+
30+class Q_DECL_EXPORT AbstractDBusServiceMonitor : public QObject
31+{
32+ Q_OBJECT
33+ Q_ENUMS(Bus)
34+ Q_PROPERTY(bool serviceAvailable READ serviceAvailable NOTIFY serviceAvailableChanged)
35+
36+public:
37+ enum Bus {
38+ SessionBus,
39+ SystemBus,
40+ };
41+
42+ explicit AbstractDBusServiceMonitor(const QString &service, const QString &path, const QString &interface,
43+ const Bus bus = SessionBus,
44+ QObject *parent = 0);
45+ ~AbstractDBusServiceMonitor();
46+
47+ QDBusInterface* dbusInterface() const;
48+
49+ bool serviceAvailable() const;
50+
51+Q_SIGNALS:
52+ void serviceAvailableChanged(bool available);
53+
54+private Q_SLOTS:
55+ void createInterface(const QString &service);
56+ void destroyInterface(const QString &service);
57+
58+protected:
59+ const QString m_service;
60+ const QString m_path;
61+ const QString m_interface;
62+ QDBusServiceWatcher* m_watcher;
63+ QDBusInterface* m_dbusInterface;
64+};
65+
66+#endif // ABSTRACTDBUSSERVICEMONITOR_H
tests/autopilot/unity8/indicators/tests/test_indicators.py+2−2
@@ -72,11 +72,11 @@ class IndicatorPageTitleMatchesWidgetTestCase(IndicatorTestCase):
72 ('Bluetooth', dict(indicator_name='indicator-bluetooth',
72 ('Bluetooth', dict(indicator_name='indicator-bluetooth',
73 title='Bluetooth')),
73 title='Bluetooth')),
74 ('Datetime', dict(indicator_name='indicator-datetime',
74 ('Datetime', dict(indicator_name='indicator-datetime',
75− title='Upcoming events')),
75+ title='Time & Date')),
76 ('Location', dict(indicator_name='indicator-location',
76 ('Location', dict(indicator_name='indicator-location',
77 title='Location')),
77 title='Location')),
78 ('Messaging', dict(indicator_name='indicator-messages',
78 ('Messaging', dict(indicator_name='indicator-messages',
79− title='Notification center')),
79+ title='Notifications')),
80 ('Network', dict(indicator_name='indicator-network',
80 ('Network', dict(indicator_name='indicator-network',
81 title='Network')),
81 title='Network')),
82 ('Power', dict(indicator_name='indicator-power',
82 ('Power', dict(indicator_name='indicator-power',
tests/autopilot/unity8/shell/emulators/dash.py+2−2
@@ -66,7 +66,7 @@ class Dash(emulators.UnityEmulatorBase):
66 return resp_grid.select_single('Tile', text=text)
66 return resp_grid.select_single('Tile', text=text)
67
67
68 def get_scope(self, scope_name='clickscope'):
68 def get_scope(self, scope_name='clickscope'):
69− return self.dash_content_list.select_single(
69+ return self.dash_content_list.wait_select_single(
70 'QQuickLoader', scopeId=scope_name)
70 'QQuickLoader', scopeId=scope_name)
71
71
72 @autopilot_logging.log_action(logger.info)
72 @autopilot_logging.log_action(logger.info)
@@ -86,7 +86,7 @@ class Dash(emulators.UnityEmulatorBase):
86
86
87 def _get_scope_loader(self, scope_id):
87 def _get_scope_loader(self, scope_id):
88 try:
88 try:
89− return self.dash_content_list.select_single(
89+ return self.dash_content_list.wait_select_single(
90 'QQuickLoader', scopeId=scope_id)
90 'QQuickLoader', scopeId=scope_id)
91 except dbus.StateNotFoundError:
91 except dbus.StateNotFoundError:
92 raise emulators.UnityEmulatorException(
92 raise emulators.UnityEmulatorException(
tests/autopilot/unity8/shell/tests/test_lock_screen.py+3−1
@@ -132,8 +132,10 @@ class TestLockscreen(UnityTestCase):
132 )
132 )
133
133
134 pin_entry_field = self.main_window.get_pinentryField()
134 pin_entry_field = self.main_window.get_pinentryField()
135− pin_entry_field.write(passphrase)
135+ # pinentryField should automatically have focus
136+ self.keyboard.type(passphrase)
136 logger.debug("Typed passphrase: %s", pin_entry_field.text)
137 logger.debug("Typed passphrase: %s", pin_entry_field.text)
138+ self.assertEqual(pin_entry_field.text, passphrase)
137 self.keyboard.type("\n")
139 self.keyboard.type("\n")
138
140
139 def _enter_prompt_passphrase(self, passphrase):
141 def _enter_prompt_passphrase(self, passphrase):
tests/mocks/Ubuntu/Telephony/MockCallEntry.cpp+26−1
@@ -22,8 +22,8 @@ MockCallEntry::MockCallEntry(QObject *parent)
22 : QObject(parent)
22 : QObject(parent)
23 , m_conference(false)
23 , m_conference(false)
24 , m_elapsed(0)
24 , m_elapsed(0)
25+ , m_timer(0)
25{
26{
26− startTimer(1000);
27}
27}
28
28
29QString MockCallEntry::phoneNumber() const
29QString MockCallEntry::phoneNumber() const
@@ -52,11 +52,36 @@ void MockCallEntry::setIsConference(bool isConference)
52 }
52 }
53}
53}
54
54
55+void MockCallEntry::setElapsedTime(int elapsedTime)
56+{
57+ if (m_elapsed != elapsedTime) {
58+ m_elapsed = elapsedTime;
59+ Q_EMIT elapsedTimeChanged();
60+ }
61+}
62+
55int MockCallEntry::elapsedTime() const
63int MockCallEntry::elapsedTime() const
56{
64{
57 return m_elapsed;
65 return m_elapsed;
58}
66}
59
67
68+bool MockCallEntry::elapsedTimerRunning() const
69+{
70+ return m_timer != 0;
71+}
72+
73+void MockCallEntry::setSlapsedTimerRunning(bool elapsedTimerRunning)
74+{
75+ if (elapsedTimerRunning && m_timer == 0) {
76+ m_timer = startTimer(1000);
77+ Q_EMIT elapsedTimerRunningChanged();
78+ } else if (!elapsedTimerRunning && m_timer != 0) {
79+ killTimer(m_timer);
80+ m_timer = 0;
81+ Q_EMIT elapsedTimerRunningChanged();
82+ }
83+}
84+
60void MockCallEntry::timerEvent(QTimerEvent * event)
85void MockCallEntry::timerEvent(QTimerEvent * event)
61{
86{
62 Q_UNUSED(event);
87 Q_UNUSED(event);
tests/mocks/Ubuntu/Telephony/MockCallEntry.h+9−1
@@ -28,7 +28,10 @@ class MockCallEntry : public QObject
28
28
29 Q_PROPERTY(QString phoneNumber READ phoneNumber WRITE setPhoneNumber NOTIFY phoneNumberChanged)
29 Q_PROPERTY(QString phoneNumber READ phoneNumber WRITE setPhoneNumber NOTIFY phoneNumberChanged)
30 Q_PROPERTY(bool isConference READ isConference WRITE setIsConference NOTIFY isConferenceChanged)
30 Q_PROPERTY(bool isConference READ isConference WRITE setIsConference NOTIFY isConferenceChanged)
31− Q_PROPERTY(int elapsedTime READ elapsedTime NOTIFY elapsedTimeChanged)
31+ Q_PROPERTY(int elapsedTime READ elapsedTime WRITE setElapsedTime NOTIFY elapsedTimeChanged)
32+
33+ // For mock use only
34+ Q_PROPERTY(bool elapsedTimerRunning READ elapsedTimerRunning WRITE setSlapsedTimerRunning NOTIFY elapsedTimerRunningChanged)
32
35
33public:
36public:
34 MockCallEntry(QObject *parent = 0);
37 MockCallEntry(QObject *parent = 0);
@@ -36,14 +39,18 @@ public:
36 QString phoneNumber() const;
39 QString phoneNumber() const;
37 bool isConference() const;
40 bool isConference() const;
38 int elapsedTime() const;
41 int elapsedTime() const;
42+ bool elapsedTimerRunning() const;
39
43
40 void setPhoneNumber(const QString& phoneNumber);
44 void setPhoneNumber(const QString& phoneNumber);
41 void setIsConference(bool isConference);
45 void setIsConference(bool isConference);
46+ void setElapsedTime(int elapsedTime);
47+ void setSlapsedTimerRunning(bool elapsedTimerRunning);
42
48
43Q_SIGNALS:
49Q_SIGNALS:
44 void phoneNumberChanged();
50 void phoneNumberChanged();
45 void isConferenceChanged();
51 void isConferenceChanged();
46 void elapsedTimeChanged();
52 void elapsedTimeChanged();
53+ void elapsedTimerRunningChanged();
47
54
48protected:
55protected:
49 void timerEvent(QTimerEvent * event);
56 void timerEvent(QTimerEvent * event);
@@ -52,6 +59,7 @@ private:
52 QString m_phoneNumber;
59 QString m_phoneNumber;
53 bool m_conference;
60 bool m_conference;
54 int m_elapsed;
61 int m_elapsed;
62+ int m_timer;
55};
63};
56
64
57#endif // MOCKCALLENTRY_H
65#endif // MOCKCALLENTRY_H
tests/mocks/Unity/Application/ApplicationManager.cpp+26
@@ -43,6 +43,7 @@ ApplicationManager *ApplicationManager::singleton()
43ApplicationManager::ApplicationManager(QObject *parent)
43ApplicationManager::ApplicationManager(QObject *parent)
44 : ApplicationManagerInterface(parent)
44 : ApplicationManagerInterface(parent)
45 , m_suspended(false)
45 , m_suspended(false)
46+ , m_forceDashActive(false)
46{
47{
47 m_roleNames.insert(RoleSession, "session");
48 m_roleNames.insert(RoleSession, "session");
48 m_roleNames.insert(RoleFullscreen, "fullscreen");
49 m_roleNames.insert(RoleFullscreen, "fullscreen");
@@ -292,6 +293,31 @@ void ApplicationManager::setSuspended(bool suspended)
292 Q_EMIT suspendedChanged();
293 Q_EMIT suspendedChanged();
293}
294}
294
295
296+bool ApplicationManager::forceDashActive() const
297+{
298+ return m_forceDashActive;
299+}
300+
301+void ApplicationManager::setForceDashActive(bool forceDashActive)
302+{
303+ if (m_forceDashActive == forceDashActive) {
304+ return;
305+ }
306+
307+ ApplicationInfo *dash = findApplication("unity8-dash");
308+ if (dash) {
309+ if (forceDashActive) {
310+ dash->setState(ApplicationInfo::Running);
311+ } else {
312+ if (!dash->focused()) {
313+ dash->setState(ApplicationInfo::Suspended);
314+ }
315+ }
316+ }
317+ m_forceDashActive = forceDashActive;
318+ Q_EMIT forceDashActiveChanged();
319+}
320+
295bool ApplicationManager::focusApplication(const QString &appId)
321bool ApplicationManager::focusApplication(const QString &appId)
296{
322{
297 ApplicationInfo *application = findApplication(appId);
323 ApplicationInfo *application = findApplication(appId);
tests/mocks/Unity/Application/ApplicationManager.h+6−2
@@ -99,8 +99,11 @@ class ApplicationManager : public ApplicationManagerInterface {
99 Q_INVOKABLE bool stopApplication(const QString &appId) override;
99 Q_INVOKABLE bool stopApplication(const QString &appId) override;
100
100
101 QString focusedApplicationId() const override;
101 QString focusedApplicationId() const override;
102− bool suspended() const;
102+ bool suspended() const override;
103− void setSuspended(bool suspended);
103+ void setSuspended(bool suspended) override;
104+
105+ bool forceDashActive() const override;
106+ void setForceDashActive(bool forceDashActive) override;
104
107
105 // Only for testing
108 // Only for testing
106 Q_INVOKABLE QStringList availableApplications();
109 Q_INVOKABLE QStringList availableApplications();
@@ -124,6 +127,7 @@ class ApplicationManager : public ApplicationManagerInterface {
124 void buildListOfAvailableApplications();
127 void buildListOfAvailableApplications();
125 void onWindowCreated();
128 void onWindowCreated();
126 bool m_suspended;
129 bool m_suspended;
130+ bool m_forceDashActive;
127 QList<ApplicationInfo*> m_runningApplications;
131 QList<ApplicationInfo*> m_runningApplications;
128 QList<ApplicationInfo*> m_availableApplications;
132 QList<ApplicationInfo*> m_availableApplications;
129 QTimer m_windowCreatedTimer;
133 QTimer m_windowCreatedTimer;
tests/mocks/Unity/Application/CMakeLists.txt+1−1
@@ -1,4 +1,4 @@
1−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=4)
1+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=5)
2
2
3set(FakeUnityApplicationQml_SOURCES
3set(FakeUnityApplicationQml_SOURCES
4 plugin.cpp
4 plugin.cpp
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+1
@@ -54,6 +54,7 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
54 item = new MockLauncherItem("ubuntu-weather-app", "/usr/share/applications/ubuntu-weather-app.desktop", "Weather", "weather", this);
54 item = new MockLauncherItem("ubuntu-weather-app", "/usr/share/applications/ubuntu-weather-app.desktop", "Weather", "weather", this);
55 item->setCount(1234567890);
55 item->setCount(1234567890);
56 item->setCountVisible(true);
56 item->setCountVisible(true);
57+ item->setPinned(true);
57 m_list.append(item);
58 m_list.append(item);
58 item = new MockLauncherItem("notes-app", "/usr/share/applications/notes-app.desktop", "Notepad", "notepad", this);
59 item = new MockLauncherItem("notes-app", "/usr/share/applications/notes-app.desktop", "Notepad", "notepad", this);
59 item->setProgress(50);
60 item->setProgress(50);
tests/mocks/Unity/fake_scope.cpp+1−1
@@ -266,7 +266,7 @@ QVariantMap Scope::customizations() const
266
266
267void Scope::refresh()
267void Scope::refresh()
268{
268{
269− qDebug() << "Scope::refresh is currently not implmented in the fake scopes plugin";
269+ Q_EMIT refreshed();
270}
270}
271
271
272unity::shell::scopes::NavigationInterface* Scope::getNavigation(const QString& id)
272unity::shell::scopes::NavigationInterface* Scope::getNavigation(const QString& id)
tests/mocks/Unity/fake_scope.h+3
@@ -79,6 +79,9 @@ public:
79
79
80 Q_INVOKABLE void refresh() override;
80 Q_INVOKABLE void refresh() override;
81
81
82+Q_SIGNALS:
83+ void refreshed(); // This is not in the Interface, here for testing benefits
84+
82protected:
85protected:
83
86
84 QString m_id;
87 QString m_id;
tests/mocks/libusermetrics/UserMetrics.cpp+2−2
@@ -238,7 +238,7 @@ void UserMetricsPrivate::setUsername(const QString &username)
238 m_username = username;
238 m_username = username;
239
239
240 m_dataIndex = m_fakeData.constFind(m_username);
240 m_dataIndex = m_fakeData.constFind(m_username);
241− if (m_dataIndex == m_fakeData.end())
241+ if (m_dataIndex == m_fakeData.constEnd())
242 {
242 {
243 m_dataIndex = m_fakeData.constFind("");
243 m_dataIndex = m_fakeData.constFind("");
244 }
244 }
@@ -383,7 +383,7 @@ void UserMetricsPrivate::finishSetFakeData()
383void UserMetricsPrivate::nextFakeData()
383void UserMetricsPrivate::nextFakeData()
384{
384{
385 ++m_dataIndex;
385 ++m_dataIndex;
386− if (m_dataIndex == m_fakeData.end() || m_dataIndex.key() != m_username)
386+ if (m_dataIndex == m_fakeData.constEnd() || m_dataIndex.key() != m_username)
387 {
387 {
388 m_dataIndex = m_fakeData.constFind(m_username);
388 m_dataIndex = m_fakeData.constFind(m_username);
389 }
389 }
tests/plugins/Dash/cardcreator/1.res+5−5
@@ -6,7 +6,7 @@ AbstractButton {
6 property var artShapeBorderSource: undefined;
6 property var artShapeBorderSource: undefined;
7 property real fontScale: 1.0;
7 property real fontScale: 1.0;
8 property var scopeStyle: null;
8 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
10 property int fixedHeaderHeight: -1;
10 property int fixedHeaderHeight: -1;
11 property size fixedArtShapeSize: Qt.size(-1, -1);
11 property size fixedArtShapeSize: Qt.size(-1, -1);
12 readonly property string title: cardData && cardData["title"] || "";
12 readonly property string title: cardData && cardData["title"] || "";
@@ -44,13 +44,13 @@ Item {
44 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
44 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
45 }
45 }
46 }
46 }
47− image: Image {
47+ image: CroppedImageMinimumSourceSize {
48 objectName: "artImage";
48 objectName: "artImage";
49 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
49 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
50 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
50 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
51 cache: true;
51 cache: true;
52 asynchronous: root.asynchronous;
52 asynchronous: root.asynchronous;
53− fillMode: Image.PreserveAspectCrop;
53+ visible: false;
54 width: root.width;
54 width: root.width;
55 height: width / artShape.aspect;
55 height: width / artShape.aspect;
56 }
56 }
@@ -74,8 +74,8 @@ Label {
74 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
74 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
75 visible: showHeader ;
75 visible: showHeader ;
76 text: root.title;
76 text: root.title;
77− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
77+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
78− horizontalAlignment: root.headerAlignment;
78+ horizontalAlignment: root.titleAlignment;
79 }
79 }
80UbuntuShape {
80UbuntuShape {
81 id: touchdown;
81 id: touchdown;
tests/plugins/Dash/cardcreator/2.res+6−10
@@ -6,7 +6,7 @@ AbstractButton {
6 property var artShapeBorderSource: undefined;
6 property var artShapeBorderSource: undefined;
7 property real fontScale: 1.0;
7 property real fontScale: 1.0;
8 property var scopeStyle: null;
8 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
10 property int fixedHeaderHeight: -1;
10 property int fixedHeaderHeight: -1;
11 property size fixedArtShapeSize: Qt.size(-1, -1);
11 property size fixedArtShapeSize: Qt.size(-1, -1);
12 readonly property string title: cardData && cardData["title"] || "";
12 readonly property string title: cardData && cardData["title"] || "";
@@ -62,20 +62,17 @@ Row {
62 anchors.margins: margins;
62 anchors.margins: margins;
63 anchors.rightMargin: 0;
63 anchors.rightMargin: 0;
64 data: [
64 data: [
65−Image {
65+CroppedImageMinimumSourceSize {
66 id: mascotImage;
66 id: mascotImage;
67 objectName: "mascotImage";
67 objectName: "mascotImage";
68 anchors { verticalCenter: parent.verticalCenter; }
68 anchors { verticalCenter: parent.verticalCenter; }
69− readonly property int maxSize: Math.max(width, height) * 4;
70 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
69 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
71 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
70 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
72 width: units.gu(6);
71 width: units.gu(6);
73 height: units.gu(5.625);
72 height: units.gu(5.625);
74− sourceSize { width: maxSize; height: maxSize }
75− fillMode: Image.PreserveAspectCrop;
76 horizontalAlignment: Image.AlignHCenter;
73 horizontalAlignment: Image.AlignHCenter;
77 verticalAlignment: Image.AlignVCenter;
74 verticalAlignment: Image.AlignVCenter;
78− visible: showHeader;
75+ visible: showHeader && resized;
79 }
76 }
80,Item {
77,Item {
81 id: headerTitleContainer;
78 id: headerTitleContainer;
@@ -98,8 +95,8 @@ Image {
98 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
95 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
99 visible: showHeader ;
96 visible: showHeader ;
100 text: root.title;
97 text: root.title;
101− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
98+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
102− horizontalAlignment: root.headerAlignment;
99+ horizontalAlignment: root.titleAlignment;
103 }
100 }
104 ,Label {
101 ,Label {
105 id: subtitleLabel;
102 id: subtitleLabel;
@@ -111,13 +108,12 @@ Image {
111 }
108 }
112 anchors.topMargin: units.dp(2);
109 anchors.topMargin: units.dp(2);
113 elide: Text.ElideRight;
110 elide: Text.ElideRight;
114− fontSize: "small";
111+ fontSize: "x-small";
115 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
112 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
116 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
113 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
117 visible: titleLabel.visible && titleLabel.text;
114 visible: titleLabel.visible && titleLabel.text;
118 text: cardData && cardData["subtitle"] || "";
115 text: cardData && cardData["subtitle"] || "";
119 font.weight: Font.Light;
116 font.weight: Font.Light;
120− horizontalAlignment: root.headerAlignment;
121 }
117 }
122
118
123 ]
119 ]
tests/plugins/Dash/cardcreator/3.res+6−7
@@ -6,7 +6,7 @@ AbstractButton {
6 property var artShapeBorderSource: undefined;
6 property var artShapeBorderSource: undefined;
7 property real fontScale: 1.0;
7 property real fontScale: 1.0;
8 property var scopeStyle: null;
8 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
10 property int fixedHeaderHeight: -1;
10 property int fixedHeaderHeight: -1;
11 property size fixedArtShapeSize: Qt.size(-1, -1);
11 property size fixedArtShapeSize: Qt.size(-1, -1);
12 readonly property string title: cardData && cardData["title"] || "";
12 readonly property string title: cardData && cardData["title"] || "";
@@ -44,13 +44,13 @@ Item {
44 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
44 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
45 }
45 }
46 }
46 }
47− image: Image {
47+ image: CroppedImageMinimumSourceSize {
48 objectName: "artImage";
48 objectName: "artImage";
49 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
49 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
50 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
50 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
51 cache: true;
51 cache: true;
52 asynchronous: root.asynchronous;
52 asynchronous: root.asynchronous;
53− fillMode: Image.PreserveAspectCrop;
53+ visible: false;
54 width: root.width;
54 width: root.width;
55 height: width / artShape.aspect;
55 height: width / artShape.aspect;
56 }
56 }
@@ -74,8 +74,8 @@ Label {
74 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
74 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
75 visible: showHeader ;
75 visible: showHeader ;
76 text: root.title;
76 text: root.title;
77− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
77+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
78− horizontalAlignment: root.headerAlignment;
78+ horizontalAlignment: root.titleAlignment;
79 }
79 }
80Label {
80Label {
81 id: subtitleLabel;
81 id: subtitleLabel;
@@ -87,13 +87,12 @@ Label {
87 }
87 }
88 anchors.topMargin: units.dp(2);
88 anchors.topMargin: units.dp(2);
89 elide: Text.ElideRight;
89 elide: Text.ElideRight;
90− fontSize: "small";
90+ fontSize: "x-small";
91 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
91 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
92 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
92 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
93 visible: titleLabel.visible && titleLabel.text;
93 visible: titleLabel.visible && titleLabel.text;
94 text: cardData && cardData["subtitle"] || "";
94 text: cardData && cardData["subtitle"] || "";
95 font.weight: Font.Light;
95 font.weight: Font.Light;
96− horizontalAlignment: root.headerAlignment;
97 }
96 }
98UbuntuShape {
97UbuntuShape {
99 id: touchdown;
98 id: touchdown;
tests/plugins/Dash/cardcreator/4.res+5−9
@@ -6,7 +6,7 @@ AbstractButton {
6 property var artShapeBorderSource: undefined;
6 property var artShapeBorderSource: undefined;
7 property real fontScale: 1.0;
7 property real fontScale: 1.0;
8 property var scopeStyle: null;
8 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
10 property int fixedHeaderHeight: -1;
10 property int fixedHeaderHeight: -1;
11 property size fixedArtShapeSize: Qt.size(-1, -1);
11 property size fixedArtShapeSize: Qt.size(-1, -1);
12 readonly property string title: cardData && cardData["title"] || "";
12 readonly property string title: cardData && cardData["title"] || "";
@@ -41,17 +41,14 @@ Loader {
41 anchors { verticalCenter: parent.verticalCenter; }
41 anchors { verticalCenter: parent.verticalCenter; }
42 }
42 }
43
43
44−,Image {
44+,CroppedImageMinimumSourceSize {
45 id: mascotImage;
45 id: mascotImage;
46 objectName: "mascotImage";
46 objectName: "mascotImage";
47 anchors { verticalCenter: parent.verticalCenter; }
47 anchors { verticalCenter: parent.verticalCenter; }
48− readonly property int maxSize: Math.max(width, height) * 4;
49 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
48 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
50 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
49 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
51 width: units.gu(6);
50 width: units.gu(6);
52 height: units.gu(5.625);
51 height: units.gu(5.625);
53− sourceSize { width: maxSize; height: maxSize }
54− fillMode: Image.PreserveAspectCrop;
55 horizontalAlignment: Image.AlignHCenter;
52 horizontalAlignment: Image.AlignHCenter;
56 verticalAlignment: Image.AlignVCenter;
53 verticalAlignment: Image.AlignVCenter;
57 visible: false;
54 visible: false;
@@ -78,8 +75,8 @@ Label {
78 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
75 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
79 visible: showHeader ;
76 visible: showHeader ;
80 text: root.title;
77 text: root.title;
81− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
78+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
82− horizontalAlignment: root.headerAlignment;
79+ horizontalAlignment: root.titleAlignment;
83 }
80 }
84,Label {
81,Label {
85 id: subtitleLabel;
82 id: subtitleLabel;
@@ -91,13 +88,12 @@ Label {
91 }
88 }
92 anchors.topMargin: units.dp(2);
89 anchors.topMargin: units.dp(2);
93 elide: Text.ElideRight;
90 elide: Text.ElideRight;
94− fontSize: "small";
91+ fontSize: "x-small";
95 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
92 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
96 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
93 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
97 visible: titleLabel.visible && titleLabel.text;
94 visible: titleLabel.visible && titleLabel.text;
98 text: cardData && cardData["subtitle"] || "";
95 text: cardData && cardData["subtitle"] || "";
99 font.weight: Font.Light;
96 font.weight: Font.Light;
100− horizontalAlignment: root.headerAlignment;
101 }
97 }
102]
98]
103}
99}
tests/plugins/Dash/cardcreator/5.res+6−7
@@ -6,7 +6,7 @@ AbstractButton {
6 property var artShapeBorderSource: undefined;
6 property var artShapeBorderSource: undefined;
7 property real fontScale: 1.0;
7 property real fontScale: 1.0;
8 property var scopeStyle: null;
8 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
10 property int fixedHeaderHeight: -1;
10 property int fixedHeaderHeight: -1;
11 property size fixedArtShapeSize: Qt.size(-1, -1);
11 property size fixedArtShapeSize: Qt.size(-1, -1);
12 readonly property string title: cardData && cardData["title"] || "";
12 readonly property string title: cardData && cardData["title"] || "";
@@ -44,13 +44,13 @@ Item {
44 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
44 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
45 }
45 }
46 }
46 }
47− image: Image {
47+ image: CroppedImageMinimumSourceSize {
48 objectName: "artImage";
48 objectName: "artImage";
49 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
49 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
50 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
50 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
51 cache: true;
51 cache: true;
52 asynchronous: root.asynchronous;
52 asynchronous: root.asynchronous;
53− fillMode: Image.PreserveAspectCrop;
53+ visible: false;
54 width: root.width;
54 width: root.width;
55 height: width / artShape.aspect;
55 height: width / artShape.aspect;
56 }
56 }
@@ -118,8 +118,8 @@ Label {
118 color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
118 color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
119 visible: showHeader && overlayLoader.active;
119 visible: showHeader && overlayLoader.active;
120 text: root.title;
120 text: root.title;
121− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
121+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
122− horizontalAlignment: root.headerAlignment;
122+ horizontalAlignment: root.titleAlignment;
123 }
123 }
124Label {
124Label {
125 id: subtitleLabel;
125 id: subtitleLabel;
@@ -132,13 +132,12 @@ Label {
132 }
132 }
133 anchors.topMargin: units.dp(2);
133 anchors.topMargin: units.dp(2);
134 elide: Text.ElideRight;
134 elide: Text.ElideRight;
135− fontSize: "small";
135+ fontSize: "x-small";
136 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
136 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
137 color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
137 color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
138 visible: titleLabel.visible && titleLabel.text;
138 visible: titleLabel.visible && titleLabel.text;
139 text: cardData && cardData["subtitle"] || "";
139 text: cardData && cardData["subtitle"] || "";
140 font.weight: Font.Light;
140 font.weight: Font.Light;
141− horizontalAlignment: root.headerAlignment;
142 }
141 }
143UbuntuShape {
142UbuntuShape {
144 id: touchdown;
143 id: touchdown;
tests/plugins/Dash/cardcreator/6.res+5−7
@@ -6,7 +6,7 @@ AbstractButton {
6 property var artShapeBorderSource: undefined;
6 property var artShapeBorderSource: undefined;
7 property real fontScale: 1.0;
7 property real fontScale: 1.0;
8 property var scopeStyle: null;
8 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
10 property int fixedHeaderHeight: -1;
10 property int fixedHeaderHeight: -1;
11 property size fixedArtShapeSize: Qt.size(-1, -1);
11 property size fixedArtShapeSize: Qt.size(-1, -1);
12 readonly property string title: cardData && cardData["title"] || "";
12 readonly property string title: cardData && cardData["title"] || "";
@@ -73,8 +73,8 @@ Item {
73 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
73 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
74 visible: showHeader ;
74 visible: showHeader ;
75 text: root.title;
75 text: root.title;
76− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
76+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
77− horizontalAlignment: root.headerAlignment;
77+ horizontalAlignment: root.titleAlignment;
78 }
78 }
79,Label {
79,Label {
80 id: subtitleLabel;
80 id: subtitleLabel;
@@ -86,15 +86,14 @@ Item {
86 }
86 }
87 anchors.topMargin: units.dp(2);
87 anchors.topMargin: units.dp(2);
88 elide: Text.ElideRight;
88 elide: Text.ElideRight;
89− fontSize: "small";
89+ fontSize: "x-small";
90 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
90 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
91 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
91 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
92 visible: titleLabel.visible && titleLabel.text;
92 visible: titleLabel.visible && titleLabel.text;
93 text: cardData && cardData["subtitle"] || "";
93 text: cardData && cardData["subtitle"] || "";
94 font.weight: Font.Light;
94 font.weight: Font.Light;
95− horizontalAlignment: root.headerAlignment;
96 }
95 }
97−,Icon {
96+,StatusIcon {
98 id: emblemIcon;
97 id: emblemIcon;
99 objectName: "emblemIcon";
98 objectName: "emblemIcon";
100 anchors {
99 anchors {
@@ -104,7 +103,6 @@ Item {
104 }
103 }
105 source: cardData && cardData["emblem"] || "";
104 source: cardData && cardData["emblem"] || "";
106 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
105 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
107− width: height;
108 height: source != "" ? titleLabel.font.pixelSize : 0;
106 height: source != "" ? titleLabel.font.pixelSize : 0;
109 }
107 }
110
108
tests/plugins/Dash/cardcreator/7.res+6−10
@@ -6,7 +6,7 @@ AbstractButton {
6 property var artShapeBorderSource: undefined;
6 property var artShapeBorderSource: undefined;
7 property real fontScale: 1.0;
7 property real fontScale: 1.0;
8 property var scopeStyle: null;
8 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
10 property int fixedHeaderHeight: -1;
10 property int fixedHeaderHeight: -1;
11 property size fixedArtShapeSize: Qt.size(-1, -1);
11 property size fixedArtShapeSize: Qt.size(-1, -1);
12 readonly property string title: cardData && cardData["title"] || "";
12 readonly property string title: cardData && cardData["title"] || "";
@@ -62,20 +62,17 @@ Row {
62 anchors.margins: margins;
62 anchors.margins: margins;
63 anchors.rightMargin: 0;
63 anchors.rightMargin: 0;
64 data: [
64 data: [
65−Image {
65+CroppedImageMinimumSourceSize {
66 id: mascotImage;
66 id: mascotImage;
67 objectName: "mascotImage";
67 objectName: "mascotImage";
68 anchors { verticalCenter: parent.verticalCenter; }
68 anchors { verticalCenter: parent.verticalCenter; }
69− readonly property int maxSize: Math.max(width, height) * 4;
70 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
69 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
71 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
70 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
72 width: units.gu(6);
71 width: units.gu(6);
73 height: units.gu(5.625);
72 height: units.gu(5.625);
74− sourceSize { width: maxSize; height: maxSize }
75− fillMode: Image.PreserveAspectCrop;
76 horizontalAlignment: Image.AlignHCenter;
73 horizontalAlignment: Image.AlignHCenter;
77 verticalAlignment: Image.AlignVCenter;
74 verticalAlignment: Image.AlignVCenter;
78− visible: showHeader;
75+ visible: showHeader && resized;
79 }
76 }
80
77
81,Item {
78,Item {
@@ -99,8 +96,8 @@ Image {
99 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
96 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
100 visible: showHeader ;
97 visible: showHeader ;
101 text: root.title;
98 text: root.title;
102− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
99+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
103− horizontalAlignment: root.headerAlignment;
100+ horizontalAlignment: root.titleAlignment;
104 }
101 }
105,Label {
102,Label {
106 id: subtitleLabel;
103 id: subtitleLabel;
@@ -112,13 +109,12 @@ Image {
112 }
109 }
113 anchors.topMargin: units.dp(2);
110 anchors.topMargin: units.dp(2);
114 elide: Text.ElideRight;
111 elide: Text.ElideRight;
115− fontSize: "small";
112+ fontSize: "x-small";
116 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
113 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
117 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
114 color: backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
118 visible: titleLabel.visible && titleLabel.text;
115 visible: titleLabel.visible && titleLabel.text;
119 text: cardData && cardData["subtitle"] || "";
116 text: cardData && cardData["subtitle"] || "";
120 font.weight: Font.Light;
117 font.weight: Font.Light;
121− horizontalAlignment: root.headerAlignment;
122 }
118 }
123,CardAttributes {
119,CardAttributes {
124 id: attributesRow;
120 id: attributesRow;
tests/plugins/Unity/Launcher/CMakeLists.txt+1−1
@@ -1,6 +1,6 @@
1pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
1pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=4)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=4)
3−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=4)
3+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=5)
4
4
5include_directories(
5include_directories(
6 ${CMAKE_CURRENT_BINARY_DIR}
6 ${CMAKE_CURRENT_BINARY_DIR}
tests/plugins/Unity/Launcher/launchermodeltest.cpp+2
@@ -105,6 +105,8 @@ public:
105 bool requestFocusApplication(const QString &appId) { Q_UNUSED(appId); return true; }
105 bool requestFocusApplication(const QString &appId) { Q_UNUSED(appId); return true; }
106 bool suspended() const { return false; }
106 bool suspended() const { return false; }
107 void setSuspended(bool) {}
107 void setSuspended(bool) {}
108+ bool forceDashActive() const { return false; }
109+ void setForceDashActive(bool) {}
108
110
109private:
111private:
110 QList<MockApp*> m_list;
112 QList<MockApp*> m_list;
tests/qmltests/CMakeLists.txt+2−1
@@ -21,11 +21,13 @@ set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
21
21
22add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
22add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
23add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin")
23add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin")
24+add_qml_test(. TabletShell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
24add_qml_test(Components Background)
25add_qml_test(Components Background)
25add_qml_test(Components Carousel)
26add_qml_test(Components Carousel)
26add_qml_test(Components DraggingArea)
27add_qml_test(Components DraggingArea)
27add_qml_test(Components EdgeDemoOverlay)
28add_qml_test(Components EdgeDemoOverlay)
28add_qml_test(Components LazyImage)
29add_qml_test(Components LazyImage)
30+add_qml_test(Components Lockscreen)
29add_qml_test(Components Rating)
31add_qml_test(Components Rating)
30add_qml_test(Components ResponsiveFlowView)
32add_qml_test(Components ResponsiveFlowView)
31add_qml_test(Components ResponsiveGridView)
33add_qml_test(Components ResponsiveGridView)
@@ -60,7 +62,6 @@ add_qml_test(Dash/ScopeSettings ScopeSettingList)
60add_qml_test(Dash/ScopeSettings ScopeSettingNumber)
62add_qml_test(Dash/ScopeSettings ScopeSettingNumber)
61add_qml_test(Dash/ScopeSettings ScopeSettingString)
63add_qml_test(Dash/ScopeSettings ScopeSettingString)
62add_qml_test(Dash/ScopeSettings ScopeSettingsWidgetFactory)
64add_qml_test(Dash/ScopeSettings ScopeSettingsWidgetFactory)
63−add_qml_test(Greeter Lockscreen ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
64add_qml_test(Greeter MultiGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
65add_qml_test(Greeter MultiGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
65add_qml_test(Greeter SingleGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
66add_qml_test(Greeter SingleGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
66add_qml_test(Greeter Infographics ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
67add_qml_test(Greeter Infographics ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
tests/qmltests/Greeter/tst_Lockscreen.qml → tests/qmltests/Components/tst_Lockscreen.qmlrenamed+31−51
@@ -18,15 +18,13 @@ import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import ".."
19import ".."
20import "../../../qml/Components"
20import "../../../qml/Components"
21−import AccountsService 0.1
22−import LightDM 0.1 as LightDM
23import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
24import Unity.Test 0.1 as UT
22import Unity.Test 0.1 as UT
25
23
26Rectangle {
24Rectangle {
27 id: root
25 id: root
28 width: units.gu(80)
26 width: units.gu(80)
29− height: units.gu(70)
27+ height: units.gu(76)
30 color: "orange"
28 color: "orange"
31
29
32 Lockscreen {
30 Lockscreen {
@@ -39,7 +37,7 @@ Rectangle {
39 alphaNumeric: pinPadCheckBox.checked
37 alphaNumeric: pinPadCheckBox.checked
40 minPinLength: minPinLengthTextField.text
38 minPinLength: minPinLengthTextField.text
41 maxPinLength: maxPinLengthTextField.text
39 maxPinLength: maxPinLengthTextField.text
42− username: "Lola"
40+ delayMinutes: delayMinutesTextField.text
43 background: "../../../qml/graphics/phone_background.jpg"
41 background: "../../../qml/graphics/phone_background.jpg"
44 }
42 }
45
43
@@ -53,24 +51,6 @@ Rectangle {
53 }
51 }
54 }
52 }
55
53
56− function setUser(username) {
57− AccountsService.user = username
58− LightDM.Greeter.authenticate(username)
59− }
60−
61− Connections {
62− target: LightDM.Greeter
63−
64− onShowPrompt: {
65− if (AccountsService.passwordDisplayHint === AccountsService.Numeric) {
66− pinPadCheckBox.checked = false
67− } else {
68− pinPadCheckBox.checked = true
69− }
70− lockscreen.infoText = text;
71− }
72− }
73−
74 Rectangle {
54 Rectangle {
75 anchors.fill: parent
55 anchors.fill: parent
76 anchors.leftMargin: lockscreen.width
56 anchors.leftMargin: lockscreen.width
@@ -129,6 +109,16 @@ Rectangle {
129 text: "Retries left"
109 text: "Retries left"
130 }
110 }
131 }
111 }
112+ Row {
113+ TextField {
114+ id: delayMinutesTextField
115+ width: units.gu(7)
116+ text: "0"
117+ }
118+ Label {
119+ text: "Delay Minutes"
120+ }
121+ }
132 Label {
122 Label {
133 id: pinLabel
123 id: pinLabel
134 anchors.verticalCenter: parent.verticalCenter
124 anchors.verticalCenter: parent.verticalCenter
@@ -141,17 +131,6 @@ Rectangle {
141 id: enteredLabel
131 id: enteredLabel
142 }
132 }
143 }
133 }
144− Button {
145− text: "start auth (1234)"
146− width: parent.width
147− onClicked: setUser("has-pin")
148− }
149− Button {
150− text: "start auth (password)"
151− width: parent.width
152− onClicked: setUser("has-password")
153− }
154−
155 TextField {
134 TextField {
156 id: infoTextTextField
135 id: infoTextTextField
157 width: parent.width
136 width: parent.width
@@ -193,6 +172,7 @@ Rectangle {
193
172
194 function cleanup() {
173 function cleanup() {
195 lockscreen.clear(false);
174 lockscreen.clear(false);
175+ delayMinutesTextField.text = "0"
196 }
176 }
197
177
198 function waitForLockscreenReady() {
178 function waitForLockscreenReady() {
@@ -237,8 +217,8 @@ Rectangle {
237
217
238 function test_labels_data() {
218 function test_labels_data() {
239 return [
219 return [
240− {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN", username: "foobar" },
220+ {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN" },
241− {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password", username: "Lola" }
221+ {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password" }
242 ]
222 ]
243 }
223 }
244
224
@@ -246,22 +226,16 @@ Rectangle {
246 pinPadCheckBox.checked = data.alphanumeric
226 pinPadCheckBox.checked = data.alphanumeric
247 lockscreen.infoText = data.infoText
227 lockscreen.infoText = data.infoText
248 waitForLockscreenReady();
228 waitForLockscreenReady();
249− if (data.alphanumeric) {
250− compare(findChild(lockscreen, "pinentryField").placeholderText, data.infoText, "Placeholdertext is not what it should be")
251− compare(findChild(lockscreen, "greeterLabel").text, "Hello " + data.username, "Greeter is not set correctly")
252− } else {
253− compare(findChild(lockscreen, "infoTextLabel").text, data.infoText, "Placeholdertext is not what it should be")
229+ compare(findChild(lockscreen, "infoTextLabel").text, data.infoText, "Placeholdertext is not what it should be")
254− }
255 }
230 }
256
231
257−
258 function test_unlock_data() {
232 function test_unlock_data() {
259 return [
233 return [
260− {tag: "numeric", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: 4, maxPinLength: 4},
234+ {tag: "numeric", alphanumeric: false, password: "1234", minPinLength: 4, maxPinLength: 4},
261− {tag: "alphanumeric", alphanumeric: true, username: "has-password", password: "password", minPinLength: -1, maxPinLength: -1},
235+ {tag: "alphanumeric", alphanumeric: true, password: "password", minPinLength: -1, maxPinLength: -1},
262− {tag: "numeric (wrong)", alphanumeric: false, username: "has-pin", password: "4321", minPinLength: 4, maxPinLength: 4},
236+ {tag: "numeric (wrong)", alphanumeric: false, password: "4321", minPinLength: 4, maxPinLength: 4},
263− {tag: "alphanumeric (wrong)", alphanumeric: true, username: "has-password", password: "drowssap", minPinLength: -1, maxPinLength: -1},
237+ {tag: "alphanumeric (wrong)", alphanumeric: true, password: "drowssap", minPinLength: -1, maxPinLength: -1},
264− {tag: "flexible length", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: -1, maxPinLength: -1},
238+ {tag: "flexible length", alphanumeric: false, password: "1234", minPinLength: -1, maxPinLength: -1},
265 ]
239 ]
266 }
240 }
267
241
@@ -269,13 +243,13 @@ Rectangle {
269 enteredLabel.text = ""
243 enteredLabel.text = ""
270 minPinLengthTextField.text = data.minPinLength
244 minPinLengthTextField.text = data.minPinLength
271 maxPinLengthTextField.text = data.maxPinLength
245 maxPinLengthTextField.text = data.maxPinLength
272− setUser(data.username)
246+ pinPadCheckBox.checked = data.alphanumeric
247+ infoTextTextField.text = "Enter " + (data.alphanumeric ? "passphrase" : "passcode")
273 waitForLockscreenReady();
248 waitForLockscreenReady();
274
249
275 var inputField = findChild(lockscreen, "pinentryField")
250 var inputField = findChild(lockscreen, "pinentryField")
276 if (data.alphanumeric) {
251 if (data.alphanumeric) {
277− mouseClick(inputField, units.gu(1), units.gu(1))
278− tryCompare(inputField, "focus", true);
252+ tryCompare(inputField, "activeFocus", true);
279 typeString(data.password)
253 typeString(data.password)
280 keyClick(Qt.Key_Enter)
254 keyClick(Qt.Key_Enter)
281 } else {
255 } else {
@@ -305,7 +279,6 @@ Rectangle {
305
279
306 var inputField = findChild(lockscreen, "pinentryField")
280 var inputField = findChild(lockscreen, "pinentryField")
307 if (data.alphanumeric) {
281 if (data.alphanumeric) {
308− mouseClick(inputField, units.gu(1), units.gu(1))
309 tryCompare(inputField, "activeFocus", true);
282 tryCompare(inputField, "activeFocus", true);
310 typeString("1")
283 typeString("1")
311 } else {
284 } else {
@@ -470,6 +443,13 @@ Rectangle {
470 var label = findChild(lockscreen, "infoTextLabel")
443 var label = findChild(lockscreen, "infoTextLabel")
471 compare(label.text, data.text);
444 compare(label.text, data.text);
472 }
445 }
446+
447+ function test_delayMinutes() {
448+ delayMinutesTextField.text = "4"
449+ waitForLockscreenReady()
450+ var label = findChild(lockscreen, "deviceLockedLabel")
451+ compare(label.text, "Device Locked")
452+ }
473 }
453 }
474
454
475 SignalSpy {
455 SignalSpy {
tests/qmltests/Dash/CardHelpers.js+1−12
@@ -16,7 +16,7 @@
16
16
17.pragma library
17.pragma library
18
18
19−var components = ["title", "art", "subtitle", "mascot", "emblem", "old-price", "price", "alt-price", "rating", "alt-rating", "summary", "attributes", "overlayColor"]
19+var components = ["title", "art", "subtitle", "mascot", "emblem", "summary", "attributes", "overlayColor"]
20
20
21var defaultLayout = ' \
21var defaultLayout = ' \
22{ \
22{ \
@@ -37,17 +37,6 @@ var defaultLayout = ' \
37 "overlayColor": null, \
37 "overlayColor": null, \
38 "mascot": null, \
38 "mascot": null, \
39 "emblem": null, \
39 "emblem": null, \
40− "old-price": null, \
41− "price": null, \
42− "alt-price": null, \
43− "rating": { \
44− "type": "stars", \
45− "range": [0, 5], \
46− "full": "image://theme/rating-star-full", \
47− "half": "image://theme/rating-star-half", \
48− "empty": "image://theme/rating-star-empty" \
49− }, \
50− "alt-rating": null, \
51 "summary": null, \
40 "summary": null, \
52 "attributes": { "max-count": 2 } \
41 "attributes": { "max-count": 2 } \
53 }, \
42 }, \
tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+4−2
@@ -27,13 +27,15 @@ Rectangle {
27 property var origHeaderjson: {
27 property var origHeaderjson: {
28 "title": "THE TITLE",
28 "title": "THE TITLE",
29 "subtitle": "Something catchy",
29 "subtitle": "Something catchy",
30− "mascot": "../graphics/play_button.png"
30+ "mascot": "../graphics/play_button.png",
31+ "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}]
31 }
32 }
32
33
33 property var headerjson: {
34 property var headerjson: {
34 "title": "THE TITLE",
35 "title": "THE TITLE",
35 "subtitle": "Something catchy",
36 "subtitle": "Something catchy",
36− "mascot": "../graphics/play_button.png"
37+ "mascot": "../graphics/play_button.png",
38+ "attributes": [{"value":"text1","icon":"image://theme/ok"},{"value":"text2","icon":"image://theme/cancel"}]
37 }
39 }
38
40
39 PreviewHeader {
41 PreviewHeader {
tests/qmltests/Dash/tst_CardTool.qml+28−20
@@ -85,8 +85,8 @@ Rectangle {
85 "layout": { "template": { "card-layout": "vertical" }, "components": { "title": "title", "subtitle": "subtitle" } }
85 "layout": { "template": { "card-layout": "vertical" }, "components": { "title": "title", "subtitle": "subtitle" } }
86 },
86 },
87 {
87 {
88− "name": "Title, price - horizontal",
88+ "name": "Title, attributes - horizontal",
89− "layout": { "template": { "card-layout": "horizontal" }, "components": { "title": "title", "price": "price" } }
89+ "layout": { "template": { "card-layout": "horizontal" }, "components": { "title": "title", "attributes": "attributes" } }
90 },
90 },
91 ]
91 ]
92
92
@@ -100,6 +100,7 @@ Rectangle {
100 }
100 }
101
101
102 Column {
102 Column {
103+ id: column
103 width: units.gu(38)
104 width: units.gu(38)
104 anchors { left: parent.left; top: parent.top; margins: units.gu(1) }
105 anchors { left: parent.left; top: parent.top; margins: units.gu(1) }
105
106
@@ -111,7 +112,7 @@ Rectangle {
111 ]
112 ]
112
113
113 delegate: Row {
114 delegate: Row {
114− anchors { left: parent.left; right: parent.right; margins: units.gu(3) }
115+ anchors { left: column.left; right: column.right; margins: units.gu(3) }
115
116
116 Label {
117 Label {
117 height: units.gu(5)
118 height: units.gu(5)
@@ -315,28 +316,35 @@ Rectangle {
315 }
316 }
316 }
317 }
317
318
318− function test_card_header_component_alignment_data() {
319+ function test_card_title_alignment_data() {
319 return [
320 return [
320− { tag: "Title - vertical", component: "titleLabel", property: "headerAlignment",
321+ { tag: "Art, header, summary", value: Text.AlignLeft, index: 0 },
322+ { tag: "Header, summary", value: Text.AlignLeft, index: 1 },
323+ { tag: "Art, header", value: Text.AlignLeft, index: 2 },
324+ { tag: "Header only", value: Text.AlignLeft, index: 3 },
325+ { tag: "Header title only", value: Text.AlignHCenter, index: 4 },
326+ { tag: "Header title and subtitle", value: Text.AlignLeft, index: 5 },
327+ { tag: "Header title and mascot", value: Text.AlignLeft, index: 6 },
328+ { tag: "Art, header, summary - small", value: Text.AlignLeft, index: 7 },
329+ { tag: "Art, header, summary - large", value: Text.AlignLeft, index: 8 },
330+ { tag: "Art, header, summary - horizontal", value: Text.AlignLeft, index: 9 },
331+ { tag: "Art, header - portrait", value: Text.AlignLeft, index: 10 },
321− value: Text.AlignHCenter, index: 11, layout_index: 0 },
332+ { tag: "Title - vertical", value: Text.AlignHCenter, index: 11 },
322− { tag: "Title - horizontal", component: "titleLabel", property: "headerAlignment",
323− value: Text.AlignLeft, index: 12, layout_index: 0},
333+ { tag: "Title - horizontal", value: Text.AlignLeft, index: 12 },
324− { tag: "Title, subtitle - vertical", component: "titleLabel", property: "headerAlignment",
325− value: Text.AlignLeft, index: 13, layout_index: 0},
334+ { tag: "Title, subtitle - vertical", value: Text.AlignLeft, index: 13 },
326− { tag: "Title, price - horizontal", component: "titleLabel", property: "headerAlignment",
327− value: Text.AlignLeft, index: 14, layout_index: 0},
335+ { tag: "Title, attributes - horizontal", value: Text.AlignLeft, index: 14 },
328− ]
336+ ];
329 }
337 }
330
338
331− function test_card_header_component_alignment(data) {
339+ function test_card_title_alignment(data) {
332 selector.selectedIndex = data.index;
340 selector.selectedIndex = data.index;
333− if (data.hasOwnProperty("layout_index")) {
334− layoutSelector.selectedIndex = data.layout_index;
335− }
336
341
337− if (data.hasOwnProperty("property")) {
342+ tryCompare(cardTool, "titleAlignment", Text.AlignLeft);
338− tryCompare(cardTool, data.property, data.value);
343+
339− }
344+ cardTool.components['title'] = { "field": "title", "align": "center" };
345+ cardTool.componentsChanged();
346+
347+ tryCompare(cardTool, "titleAlignment", data.value);
340 }
348 }
341
349
342 function test_categoryLayout_data() {
350 function test_categoryLayout_data() {
tests/qmltests/Dash/tst_GenericScopeView.qml+21
@@ -582,6 +582,27 @@ Item {
582
582
583 genericScopeView.scope = !genericScopeView.scope;
583 genericScopeView.scope = !genericScopeView.scope;
584 }
584 }
585+
586+ function test_pullToRefresh() {
587+ waitForRendering(genericScopeView)
588+
589+ mouseFlick(genericScopeView,
590+ genericScopeView.width/2, units.gu(10),
591+ genericScopeView.width/2, units.gu(80),
592+ true, false)
593+
594+ var pullToRefresh = findChild(genericScopeView, "pullToRefresh")
595+ tryCompare(pullToRefresh, "releaseToRefresh", true)
596+
597+ spy.target = genericScopeView.scope
598+ spy.signalName = "refreshed"
599+
600+ mouseRelease(genericScopeView)
601+ tryCompare(pullToRefresh, "releaseToRefresh", false)
602+
603+ spy.wait()
604+ compare(spy.count, 1)
605+ }
585 }
606 }
586 }
607 }
587}
608}
tests/qmltests/Greeter/tst_MultiGreeter.qml+2−2
@@ -29,6 +29,7 @@ Item {
29 Greeter {
29 Greeter {
30 id: greeter
30 id: greeter
31 anchors.fill: parent
31 anchors.fill: parent
32+ locked: !LightDM.Greeter.authenticated
32 }
33 }
33
34
34 Component {
35 Component {
@@ -115,8 +116,7 @@ Item {
115 var waitForSignal = data.uid != 0 && userList.currentIndex != data.uid
116 var waitForSignal = data.uid != 0 && userList.currentIndex != data.uid
116 select_index(data.uid)
117 select_index(data.uid)
117 tryCompare(userList, "currentIndex", data.uid)
118 tryCompare(userList, "currentIndex", data.uid)
118− tryCompare(greeter, "locked", data.tag !== "no-password" &&
119+ tryCompare(greeter, "locked", data.tag !== "no-password")
119− data.tag !== "auth-error")
120 if (waitForSignal) {
120 if (waitForSignal) {
121 selectionSpy.wait()
121 selectionSpy.wait()
122 tryCompare(selectionSpy, "count", 1)
122 tryCompare(selectionSpy, "count", 1)
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml+3−23
@@ -29,14 +29,14 @@ Item {
29 id: page
29 id: page
30
30
31 anchors.fill: parent
31 anchors.fill: parent
32− contentActive: true
33
32
34 menuModel: UnityMenuModel {}
33 menuModel: UnityMenuModel {}
35 busName: "test"
34 busName: "test"
36 actionsObjectPath: "test"
35 actionsObjectPath: "test"
37 menuObjectPath: "test"
36 menuObjectPath: "test"
38
37
38+ identifier: "test-indicator"
39− rootMenuType: ""
39+ rootMenuType: "com.canonical.indicator.root"
40 }
40 }
41
41
42 property var fullMenuData: [{
42 property var fullMenuData: [{
@@ -117,13 +117,8 @@ Item {
117 name: "DefaultIndicatorPage"
117 name: "DefaultIndicatorPage"
118
118
119 function init() {
119 function init() {
120− page.stop();
121 var mainMenu = findChild(page, "mainMenu");
120 var mainMenu = findChild(page, "mainMenu");
122− verify(mainMenu.model === undefined);
121+ page.menuModel.modelData = [];
123−
124− page.rootMenuType = "com.canonical.indicator.root";
125− page.start();
126−
127 verify(mainMenu.model !== null);
122 verify(mainMenu.model !== null);
128 }
123 }
129
124
@@ -157,20 +152,5 @@ Item {
157 var mainMenu = findChild(page, "mainMenu");
152 var mainMenu = findChild(page, "mainMenu");
158 tryCompare(mainMenu, "count", data.expectedCount);
153 tryCompare(mainMenu, "count", data.expectedCount);
159 }
154 }
160−
161− function test_empty_data() {
162− return [
163− { tag: "EmptyNoData", modelData: [], visible: true},
164− { tag: "EmptySubmenu", modelData: emptySubMenuData, visible: true},
165− { tag: "NotEmpty", modelData: fullMenuData, visible: false},
166− ]
167− }
168−
169− function test_empty(data) {
170− page.menuModel.modelData = data.modelData;
171−
172− var emptyLabel = findChild(page, "emptyLabel");
173− tryCompare(emptyLabel, "visible", data.visible);
174− }
175 }
155 }
176}
156}
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+24
@@ -37,6 +37,11 @@ Item {
37 property int modelIndex: 0
37 property int modelIndex: 0
38 property var data
38 property var data
39
39
40+ anchors {
41+ left: parent.left
42+ right: parent.right
43+ }
44+
40 onLoaded: {
45 onLoaded: {
41 if (item.hasOwnProperty("menuData")) {
46 if (item.hasOwnProperty("menuData")) {
42 item.menuData = data;
47 item.menuData = data;
@@ -734,5 +739,24 @@ Item {
734 compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
739 compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
735 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
740 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
736 }
741 }
742+
743+ function test_lp1336715_broken_checkbox_bindings() {
744+ menuData.type = "com.canonical.indicator.switch";
745+ menuData.sensitive = true;
746+ menuData.isToggled = false;
747+
748+ loader.data = menuData;
749+ loader.sourceComponent = factory.load(menuData);
750+
751+ compare(loader.item.checked, false, "Loader did not load check state");
752+ mouseClick(loader.item,
753+ loader.item.width / 2, loader.item.height / 2);
754+ compare(loader.item.checked, true, "Clicking switch menu should toggle check");
755+
756+ menuData.isToggled = true; // toggled will not update in mock
757+ menuData.isToggled = false;
758+
759+ compare(loader.item.checked, false, "Server updates no longer working");
760+ }
737 }
761 }
738}
762}
tests/qmltests/Panel/tst_ActiveCallHint.qml+19−6
@@ -39,6 +39,7 @@ Item {
39 Telephony.CallEntry {
39 Telephony.CallEntry {
40 id: call3
40 id: call3
41 phoneNumber: "+447812221113"
41 phoneNumber: "+447812221113"
42+ elapsedTimerRunning: true
42 }
43 }
43
44
44 ActiveCallHint {
45 ActiveCallHint {
@@ -69,6 +70,7 @@ Item {
69 callManager.foregroundCall = null;
70 callManager.foregroundCall = null;
70 callManager.backgroundCall = null;
71 callManager.backgroundCall = null;
71 callHint.labelSwitchInterval = 300;
72 callHint.labelSwitchInterval = 300;
73+ call1.elapsedTime = 0;
72
74
73 ApplicationManager.stopApplication("dialer-app");
75 ApplicationManager.stopApplication("dialer-app");
74 }
76 }
@@ -139,16 +141,27 @@ Item {
139 compare(contactLabel.text, "Freddy", "Contact label does not match call");
141 compare(contactLabel.text, "Freddy", "Contact label does not match call");
140 }
142 }
141
143
142− function test_timeLapse() {
144+ function test_timeElapsed_data() {
145+ return [
146+ { tag: "0:00->0:01", elpasedTime: 0, initial: "0:00", expected: "0:01" },
147+ { tag: "0:29->0:30", elpasedTime: 29, initial: "0:29", expected: "0:30" },
148+ { tag: "0:59->1:00", elpasedTime: 59, initial: "0:59", expected: "1:00" },
149+
150+ { tag: "01:59->02:00", elpasedTime: 119, initial: "1:59", expected: "2:00" },
151+ { tag: "59:59->60:00", elpasedTime: 3599, initial: "59:59", expected: "60:00" }
152+ ];
153+ }
154+
155+ function test_timeElapsed(data) {
143− callManager.backgroundCall = call3;
156+ callManager.backgroundCall = call1;
157+ call1.elapsedTime = data.elpasedTime;
144
158
145 var timeLabel = findChild(callHint, "timeLabel");
159 var timeLabel = findChild(callHint, "timeLabel");
146 verify(timeLabel !== null);
160 verify(timeLabel !== null);
147
161
148− var currentLabel = timeLabel.text;
162+ compare(timeLabel.text, data.initial);
149− tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
163+ call1.elapsedTime = call1.elapsedTime + 1;
150− currentLabel = timeLabel.text;
164+ compare(timeLabel.text, data.expected);
151− tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
152 }
165 }
153
166
154 function test_displayedLabelChangesOverTime() {
167 function test_displayedLabelChangesOverTime() {
tests/qmltests/Stages/tst_PhoneStage.qml+17
@@ -322,5 +322,22 @@ Item {
322 }
322 }
323 phoneStage.orientation = Qt.PortraitOrientation;
323 phoneStage.orientation = Qt.PortraitOrientation;
324 }
324 }
325+
326+ function test_focusNewTopMostAppAfterFocusedOneClosesItself() {
327+ addApps(2);
328+
329+ var secondApp = ApplicationManager.get(0);
330+ tryCompare(secondApp, "state", ApplicationInfoInterface.Running);
331+ tryCompare(secondApp, "focused", true);
332+
333+ var firstApp = ApplicationManager.get(1);
334+ tryCompare(firstApp, "state", ApplicationInfoInterface.Suspended);
335+ tryCompare(firstApp, "focused", false);
336+
337+ ApplicationManager.stopApplication(secondApp.appId);
338+
339+ tryCompare(firstApp, "state", ApplicationInfoInterface.Running);
340+ tryCompare(firstApp, "focused", true);
341+ }
325 }
342 }
326}
343}
tests/qmltests/tst_Shell.qml+5
@@ -198,6 +198,10 @@ Row {
198
198
199 var launcher = findChild(shell, "launcherPanel");
199 var launcher = findChild(shell, "launcherPanel");
200 tryCompare(launcher, "x", data.launcherHides ? -launcher.width : 0)
200 tryCompare(launcher, "x", data.launcherHides ? -launcher.width : 0)
201+
202+ // Make sure the helper for sliding out the launcher wasn't touched. We want to fade it out here.
203+ var animateTimer = findInvisibleChild(shell, "animateTimer");
204+ compare(animateTimer.nextState, "visible");
201 }
205 }
202
206
203 function test_suspend() {
207 function test_suspend() {
@@ -480,6 +484,7 @@ Row {
480 tryCompare(greeter, "showProgress", 0)
484 tryCompare(greeter, "showProgress", 0)
481 waitForRendering(greeter);
485 waitForRendering(greeter);
482 LightDM.Greeter.showGreeter()
486 LightDM.Greeter.showGreeter()
487+ waitForRendering(greeter)
483 tryCompare(greeter, "showProgress", 1)
488 tryCompare(greeter, "showProgress", 1)
484 LightDM.Greeter.hideGreeter()
489 LightDM.Greeter.hideGreeter()
485 tryCompare(greeter, "showProgress", 0)
490 tryCompare(greeter, "showProgress", 0)
tests/qmltests/tst_ShellWithPin.qml+109−26
@@ -27,10 +27,9 @@ import Powerd 0.1
27
27
28import "../../qml"
28import "../../qml"
29
29
30−Item {
30+Row {
31 id: root
31 id: root
32− width: shell.width + units.gu(20)
32+ spacing: 0
33− height: shell.height
34
33
35 QtObject {
34 QtObject {
36 id: applicationArguments
35 id: applicationArguments
@@ -48,21 +47,55 @@ Item {
48 }
47 }
49 }
48 }
50
49
51− Shell {
50+ Loader {
52− id: shell
51+ id: shellLoader
53− maxFailedLogins: maxRetriesTextField.text
52+
54− }
55− Column {
56− anchors { top: parent.top; right: parent.right; bottom: parent.bottom; margins:units.gu(1) }
57− width: units.gu(18)
53+ width: units.gu(40)
54+ height: units.gu(71)
58
55
59− Label {
56+ property bool itemDestroyed: false
60− text: "Max retries:"
57+ sourceComponent: Component {
61− color: "black"
58+ Shell {
59+ Component.onDestruction: {
60+ shellLoader.itemDestroyed = true
61+ }
62+ maxFailedLogins: maxRetriesTextField.text
63+ }
62 }
64 }
65+ }
66+
67+ Rectangle {
68+ color: "white"
69+ width: units.gu(30)
70+ height: shellLoader.height
71+
72+ Column {
73+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
74+ spacing: units.gu(1)
75+ Row {
76+ anchors { left: parent.left; right: parent.right }
77+ Button {
78+ text: "Show Greeter"
79+ onClicked: {
80+ if (shellLoader.status !== Loader.Ready)
81+ return
82+
83+ var greeter = testCase.findChild(shellLoader.item, "greeter")
84+ if (!greeter.shown) {
85+ greeter.show()
86+ }
87+ }
88+ }
89+ }
90+
91+ Label {
92+ text: "Max retries:"
93+ color: "black"
94+ }
63− TextField {
95+ TextField {
64− id: maxRetriesTextField
96+ id: maxRetriesTextField
65− text: "-1"
97+ text: "-1"
98+ }
66 }
99 }
67 }
100 }
68
101
@@ -81,12 +114,10 @@ Item {
81 name: "ShellWithPin"
114 name: "ShellWithPin"
82 when: windowShown
115 when: windowShown
83
116
84− function initTestCase() {
117+ property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
85−
86− sessionSpy.target = findChild(shell, "greeter")
87− }
88
118
89 function init() {
119 function init() {
120+ sessionSpy.target = findChild(shell, "greeter")
90 swipeAwayGreeter()
121 swipeAwayGreeter()
91 shell.failedLoginsDelayAttempts = -1
122 shell.failedLoginsDelayAttempts = -1
92 maxRetriesTextField.text = "-1"
123 maxRetriesTextField.text = "-1"
@@ -95,12 +126,28 @@ Item {
95 }
126 }
96
127
97 function cleanup() {
128 function cleanup() {
98− LightDM.Greeter.showGreeter()
129+ shellLoader.itemDestroyed = false
99− var greeter = findChild(shell, "greeter")
130+
100− tryCompare(greeter, "showProgress", 1)
131+ shellLoader.active = false
132+
133+ tryCompare(shellLoader, "status", Loader.Null)
134+ tryCompare(shellLoader, "item", null)
135+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
136+ // item might still be alive. So if we set Loader.active back to true
137+ // again right now we will get the very same Shell instance back. So no reload
138+ // actually took place. Likely because Loader waits until the next event loop
139+ // iteration to do its work. So to ensure the reload, we will wait until the
140+ // Shell instance gets destroyed.
141+ tryCompare(shellLoader, "itemDestroyed", true)
101
142
102 // kill all (fake) running apps
143 // kill all (fake) running apps
103 killApps()
144 killApps()
145+
146+ // reload our test subject to get it in a fresh state once again
147+ shellLoader.active = true
148+
149+ tryCompare(shellLoader, "status", Loader.Ready)
150+ removeTimeConstraintsFromDirectionalDragAreas(shellLoader.item)
104 }
151 }
105
152
106 function killApps() {
153 function killApps() {
@@ -113,6 +160,7 @@ Item {
113
160
114 function swipeAwayGreeter() {
161 function swipeAwayGreeter() {
115 var greeter = findChild(shell, "greeter");
162 var greeter = findChild(shell, "greeter");
163+ waitForRendering(greeter)
116 tryCompare(greeter, "showProgress", 1);
164 tryCompare(greeter, "showProgress", 1);
117
165
118 var touchX = shell.width - (shell.edgeSize / 2);
166 var touchX = shell.width - (shell.edgeSize / 2);
@@ -168,7 +216,8 @@ Item {
168
216
169 mouseClick(emergencyButton, units.gu(1), units.gu(1))
217 mouseClick(emergencyButton, units.gu(1), units.gu(1))
170
218
171− tryCompare(greeter, "fakeActiveForApp", "dialer-app")
219+ tryCompare(greeter, "lockedApp", "dialer-app")
220+ tryCompare(greeter, "hasLockedApp", true)
172 tryCompare(lockscreen, "shown", false)
221 tryCompare(lockscreen, "shown", false)
173 tryCompare(panel, "fullscreenMode", true)
222 tryCompare(panel, "fullscreenMode", true)
174 tryCompare(indicators, "available", false)
223 tryCompare(indicators, "available", false)
@@ -180,7 +229,8 @@ Item {
180 LightDM.Greeter.showGreeter()
229 LightDM.Greeter.showGreeter()
181
230
182 tryCompare(greeter, "shown", true)
231 tryCompare(greeter, "shown", true)
183− tryCompare(greeter, "fakeActiveForApp", "")
232+ tryCompare(greeter, "lockedApp", "")
233+ tryCompare(greeter, "hasLockedApp", false)
184 tryCompare(lockscreen, "shown", true)
234 tryCompare(lockscreen, "shown", true)
185 tryCompare(panel, "fullscreenMode", false)
235 tryCompare(panel, "fullscreenMode", false)
186 tryCompare(indicators, "available", true)
236 tryCompare(indicators, "available", true)
@@ -230,8 +280,10 @@ Item {
230 enterPin("1111")
280 enterPin("1111")
231 tryCompare(placeHolder, "text", "Sorry, incorrect passcode")
281 tryCompare(placeHolder, "text", "Sorry, incorrect passcode")
232
282
283+ var lockscreen = findChild(shell, "lockscreen")
284+ tryCompare(lockscreen, "delayMinutes", 0)
233 enterPin("1111")
285 enterPin("1111")
234− tryCompare(placeHolder, "text", "Too many incorrect attempts")
286+ tryCompare(lockscreen, "delayMinutes", shell.failedLoginsDelayMinutes)
235 }
287 }
236
288
237 function test_factoryReset() {
289 function test_factoryReset() {
@@ -251,5 +303,36 @@ Item {
251 enterPin("1111")
303 enterPin("1111")
252 tryCompare(resetSpy, "count", 1)
304 tryCompare(resetSpy, "count", 1)
253 }
305 }
306+
307+ function test_emergencyDialerLockOut() {
308+ // This is a theoretical attack on the lockscreen: Enter emergency
309+ // dialer mode on a phone, then plug into a larger screen,
310+ // switching to a tablet interface. This would in theory move the
311+ // dialer to a side stage and give access to other apps. So just
312+ // confirm that such an attack doesn't work.
313+
314+ var applicationsDisplayLoader = findChild(shell, "applicationsDisplayLoader")
315+
316+ // We start in phone mode
317+ tryCompare(shell, "sideStageEnabled", false)
318+ tryCompare(applicationsDisplayLoader, "tabletMode", false)
319+
320+ var app = ApplicationManager.startApplication("dialer-app")
321+
322+ var greeter = findChild(shell, "greeter")
323+ tryCompare(greeter, "showProgress", 0)
324+ tryCompare(greeter, "hasLockedApp", true)
325+
326+ // OK, we're in. Now try (but fail) to switch to tablet mode
327+ shell.tablet = true
328+ tryCompare(shell, "sideStageEnabled", true)
329+ tryCompare(applicationsDisplayLoader, "tabletMode", false)
330+
331+ // And when we kill the app, we go back to locked tablet mode
332+ killApps()
333+ tryCompare(greeter, "showProgress", 1)
334+ tryCompare(shell, "sideStageEnabled", true)
335+ tryCompare(applicationsDisplayLoader, "tabletMode", true)
336+ }
254 }
337 }
255}
338}
tests/qmltests/tst_TabletShell.qmlnew file+289
@@ -0,0 +1,289 @@
1+/*
2+ * Copyright (C) 2013,2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import GSettings 1.0
20+import LightDM 0.1 as LightDM
21+import Ubuntu.Components 1.1
22+import Ubuntu.Telephony 0.1 as Telephony
23+import Unity.Application 0.1
24+import Unity.Connectivity 0.1
25+import Unity.Test 0.1 as UT
26+import Powerd 0.1
27+
28+import "../../qml"
29+
30+Row {
31+ id: root
32+ spacing: 0
33+
34+ QtObject {
35+ id: applicationArguments
36+
37+ function hasGeometry() {
38+ return false
39+ }
40+
41+ function width() {
42+ return 0
43+ }
44+
45+ function height() {
46+ return 0
47+ }
48+ }
49+
50+ Loader {
51+ id: shellLoader
52+
53+ width: units.gu(100)
54+ height: units.gu(80)
55+
56+ property bool itemDestroyed: false
57+ sourceComponent: Component {
58+ Shell {
59+ Component.onDestruction: {
60+ shellLoader.itemDestroyed = true
61+ }
62+ }
63+ }
64+ }
65+
66+ Rectangle {
67+ color: "white"
68+ width: units.gu(20)
69+ height: shellLoader.height
70+
71+ Column {
72+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
73+ spacing: units.gu(1)
74+ Row {
75+ anchors { left: parent.left; right: parent.right }
76+ Button {
77+ text: "Show Greeter"
78+ onClicked: {
79+ if (shellLoader.status !== Loader.Ready)
80+ return
81+
82+ var greeter = testCase.findChild(shellLoader.item, "greeter")
83+ if (!greeter.shown) {
84+ greeter.show()
85+ }
86+ }
87+ }
88+ }
89+ }
90+ }
91+
92+ SignalSpy {
93+ id: sessionSpy
94+ signalName: "sessionStarted"
95+ }
96+
97+ SignalSpy {
98+ id: dashCommunicatorSpy
99+ signalName: "setCurrentScopeCalled"
100+ }
101+
102+ SignalSpy {
103+ id: unlockAllModemsSpy
104+ target: Connectivity
105+ signalName: "unlockingAllModems"
106+ }
107+
108+ Telephony.CallEntry {
109+ id: phoneCall
110+ phoneNumber: "+447812221111"
111+ }
112+
113+ UT.UnityTestCase {
114+ id: testCase
115+ name: "TabletShell"
116+ when: windowShown
117+
118+ property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
119+
120+ function init() {
121+ sessionSpy.clear()
122+ sessionSpy.target = findChild(shell, "greeter")
123+ dashCommunicatorSpy.target = findInvisibleChild(shell, "dashCommunicator")
124+ }
125+
126+ function cleanup() {
127+ shellLoader.itemDestroyed = false
128+
129+ shellLoader.active = false
130+
131+ tryCompare(shellLoader, "status", Loader.Null)
132+ tryCompare(shellLoader, "item", null)
133+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
134+ // item might still be alive. So if we set Loader.active back to true
135+ // again right now we will get the very same Shell instance back. So no reload
136+ // actually took place. Likely because Loader waits until the next event loop
137+ // iteration to do its work. So to ensure the reload, we will wait until the
138+ // Shell instance gets destroyed.
139+ tryCompare(shellLoader, "itemDestroyed", true)
140+
141+ // kill all (fake) running apps
142+ killApps()
143+
144+ unlockAllModemsSpy.clear()
145+
146+ // reload our test subject to get it in a fresh state once again
147+ shellLoader.active = true
148+
149+ tryCompare(shellLoader, "status", Loader.Ready)
150+ removeTimeConstraintsFromDirectionalDragAreas(shellLoader.item)
151+ }
152+
153+ function killApps() {
154+ while (ApplicationManager.count > 1) {
155+ var appIndex = ApplicationManager.get(0).appId == "unity8-dash" ? 1 : 0
156+ ApplicationManager.stopApplication(ApplicationManager.get(appIndex).appId)
157+ }
158+ compare(ApplicationManager.count, 1)
159+ }
160+
161+ function selectIndex(i) {
162+ // We could be anywhere in list; find target index to know which direction
163+ var greeter = findChild(shell, "greeter")
164+ var userlist = findChild(greeter, "userList")
165+ if (userlist.currentIndex == i)
166+ keyClick(Qt.Key_Escape) // Reset state if we're not moving
167+ while (userlist.currentIndex != i) {
168+ var next = userlist.currentIndex + 1
169+ if (userlist.currentIndex > i) {
170+ next = userlist.currentIndex - 1
171+ }
172+ var account = findChild(greeter, "username"+next)
173+ mouseClick(account, 1, 1)
174+ tryCompare(userlist, "currentIndex", next)
175+ tryCompare(userlist, "movingInternally", false)
176+ }
177+ }
178+
179+ function selectUser(name) {
180+ // Find index of user with the right name
181+ var greeter = findChild(shell, "greeter")
182+ for (var i = 0; i < greeter.model.count; i++) {
183+ if (greeter.model.data(i, LightDM.UserRoles.NameRole) == name) {
184+ break
185+ }
186+ }
187+ if (i == greeter.model.count) {
188+ fail("Didn't find name")
189+ return -1
190+ }
191+ selectIndex(i)
192+ return i
193+ }
194+
195+ function clickPasswordInput(isButton) {
196+ var greeter = findChild(shell, "greeter")
197+ tryCompare(greeter, "showProgress", 1)
198+
199+ var passwordMouseArea = findChild(shell, "passwordMouseArea")
200+ tryCompare(passwordMouseArea, "enabled", isButton)
201+
202+ var passwordInput = findChild(shell, "passwordInput")
203+ mouseClick(passwordInput, passwordInput.width / 2, passwordInput.height / 2)
204+ }
205+
206+ function confirmLoggedIn(loggedIn) {
207+ var greeterWrapper = findChild(shell, "greeterWrapper")
208+ tryCompare(greeterWrapper, "showProgress", loggedIn ? 0 : 1)
209+ tryCompare(sessionSpy, "count", loggedIn ? 1 : 0)
210+ }
211+
212+ function swipeFromLeftEdge(swipeLength) {
213+ var touchStartX = 2
214+ var touchStartY = shell.height / 2
215+ touchFlick(shell, touchStartX, touchStartY, swipeLength, touchStartY)
216+ }
217+
218+ function test_noLockscreen() {
219+ selectUser("has-password")
220+ var lockscreen = findChild(shell, "lockscreen")
221+ tryCompare(lockscreen, "shown", false)
222+ }
223+
224+ function test_showAndHideGreeterDBusCalls() {
225+ var greeter = findChild(shell, "greeter")
226+ LightDM.Greeter.hideGreeter()
227+ tryCompare(greeter, "showProgress", 0)
228+ LightDM.Greeter.showGreeter()
229+ tryCompare(greeter, "showProgress", 1)
230+ }
231+
232+ function test_login_data() {
233+ return [
234+ {tag: "auth error", user: "auth-error", loggedIn: false, password: ""},
235+ {tag: "with password", user: "has-password", loggedIn: true, password: "password"},
236+ {tag: "without password", user: "no-password", loggedIn: true, password: ""},
237+ ]
238+ }
239+
240+ function test_login(data) {
241+ selectUser(data.user)
242+
243+ clickPasswordInput(data.password === "")
244+
245+ if (data.password !== "") {
246+ typeString(data.password)
247+ keyClick(Qt.Key_Enter)
248+ }
249+
250+ confirmLoggedIn(data.loggedIn)
251+ }
252+
253+ function test_appLaunchDuringGreeter_data() {
254+ return [
255+ {tag: "auth error", user: "auth-error", loggedIn: false, passwordFocus: false},
256+ {tag: "without password", user: "no-password", loggedIn: true, passwordFocus: false},
257+ {tag: "with password", user: "has-password", loggedIn: false, passwordFocus: true},
258+ ]
259+ }
260+
261+ function test_appLaunchDuringGreeter(data) {
262+ selectUser(data.user)
263+
264+ var greeter = findChild(shell, "greeter")
265+ var app = ApplicationManager.startApplication("dialer-app")
266+
267+ confirmLoggedIn(data.loggedIn)
268+
269+ if (data.passwordFocus) {
270+ var passwordInput = findChild(greeter, "passwordInput")
271+ tryCompare(passwordInput, "focus", true)
272+ }
273+ }
274+
275+ function test_leftEdgeDrag_data() {
276+ return [
277+ {tag: "without password", user: "no-password", loggedIn: true},
278+ {tag: "with password", user: "has-password", loggedIn: false},
279+ ]
280+ }
281+
282+ function test_leftEdgeDrag(data) {
283+ selectUser(data.user)
284+ swipeFromLeftEdge(shell.width * 0.75)
285+ wait(500) // to give time to handle dash() signal from Launcher
286+ confirmLoggedIn(data.loggedIn)
287+ }
288+ }
289+}
tests/utils/modules/Unity/Test/UnityTestCase.qml+9
@@ -20,8 +20,17 @@ import Ubuntu.Components 0.1
20import Unity.Test 0.1 as UT
20import Unity.Test 0.1 as UT
21
21
22TestCase {
22TestCase {
23+ id: testCase
23 TestUtil {id:util}
24 TestUtil {id:util}
24
25
26+ ActivityIndicator {
27+ visible: testCase.running
28+ anchors.centerIn: parent
29+ Component.onCompleted: parent = testCase.parent
30+ z: 100
31+ running: visible
32+ }
33+
25 // Fake implementation to be provided to items under test
34 // Fake implementation to be provided to items under test
26 property var fakeDateTime: new function() {
35 property var fakeDateTime: new function() {
27 this.currentTimeMs = 0
36 this.currentTimeMs = 0
tools/unlock-device+14−13
@@ -4,7 +4,7 @@
4# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
4# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
5# This will include a reboot.
5# This will include a reboot.
6
6
7−WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device"
7+WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device; sleep 20"
8
8
9while getopts s:w: opt; do
9while getopts s:w: opt; do
10 case $opt in
10 case $opt in
@@ -19,16 +19,17 @@ done
19
19
20eval "$WAIT_COMMAND"
20eval "$WAIT_COMMAND"
21
21
22−# Force a sleep no matter what, since we may need to wait for unity8
22+for i in `seq 1 5`; do
23−# to finish coming up (it's hard to tell when the greeter is actually rendered)
23+ # We need to go through sudo to get a proper environment for dbus set up
24+ UNLOCK_OUTPUT=$(adb shell "gdbus call --session --dest com.canonical.UnityGreeter --object-path / --method com.canonical.UnityGreeter.HideGreeter && echo Greeter unlocked" 2>&1)
25+ if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
26+ echo "I: Unlock passed"
27+ exit 0
28+ else
29+ echo "I: Unlock attempt $i failed, script output: '$UNLOCK_OUTPUT'"
24−sleep 30
30+ sleep 20
31+ fi
32+done
25
33
26−# We need to go through sudo to get a proper environment for dbus set up
34+echo "I: Too many unlock failures, giving up"
27−UNLOCK_OUTPUT=$(adb shell "gdbus call --session --dest com.canonical.UnityGreeter --object-path / --method com.canonical.UnityGreeter.HideGreeter && echo Greeter unlocked" 2>&1)
28−if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
29− echo "I: Unlock passed"
30− exit 0
31−else
32− echo "I: Unlock failed, script output: '$UNLOCK_OUTPUT'"
33− exit 1
35+exit 1
34−fi