on xenial help sign in
merge trunk
commite1cfe32b49821457e5b01b4dc7c6faa9bf898cf4 authorAndrea Cimitan <andrea.cimitan@gmail.com> dateFri 10 Oct 2014, 12:13 (12 years ago) parenta7f4e27cc50056
172 files changed+3707−1201
CMakeLists.txt+5−2 CODING+4 cmake/modules/QmlTest.cmake+8 data/unity8.conf+5−1 debian/changelog+138 debian/control+1−1 debian/unity8-private.install+1 plugins/Dash/CardAttributes.qml+1−1 plugins/Dash/CardCreator.js+11−15 plugins/Dash/CroppedImageMinimumSourceSize.qml+38 plugins/Dash/qmldir+2−1 plugins/LightDM/DBusGreeter.h−1 plugins/LightDM/DBusGreeterList.h−1 plugins/Unity/DashCommunicator/CMakeLists.txt+8−2 plugins/Unity/DashCommunicator/dashcommunicator.cpp+22−13 plugins/Unity/DashCommunicator/dashcommunicator.h+16−6 plugins/Unity/DashCommunicator/dashconnection.cpp+33 plugins/Unity/DashCommunicator/dashconnection.h+34 plugins/Unity/Launcher/CMakeLists.txt+1−1 plugins/Unity/Session/orientationlock.cpp+6−6 plugins/Unity/Session/orientationlock.h+1−3 po/am.po+39−5 po/ar.po+6−4 po/ast.po+41−5 po/az.po+5−4 po/be.po+56−48 po/bg.po+4−2 po/br.po+46−8 po/bs.po+5−2 po/ca.po+50−12 po/ckb.po+4−2 po/cs.po+4−2 po/da.po+4−2 po/de.po+8−9 po/el.po+4−2 po/en_AU.po+4−5 po/en_GB.po+41−6 po/eo.po+4−2 po/es.po+47−10 po/eu.po+44−7 po/fa.po+35−7 po/fi.po+42−6 po/fo.po+4−2 po/fr.po+47−10 po/gd.po+48−8 po/gl.po+39−5 po/he.po+4−2 po/hi.po+4−2 po/hr.po+5−2 po/hu.po+42−7 po/hy.po+4−2 po/id.po+4−2 po/is.po+41−14 po/it.po+9−11 po/ja.po+14−9 po/km.po+11−17 po/kn.po+4−2 po/ko.po+45−7 po/ku.po+65−52 po/ky.po+4−2 po/lo.po+4−2 po/lt.po+5−2 po/lv.po+4−2 po/ml.po+5−4 po/mr.po+4−2 po/ms.po+4−2 po/my.po+4−2 po/nb.po+43−7 po/nl.po+43−5 po/pl.po+7−4 po/pt.po+39−5 po/pt_BR.po+8−9 po/ro.po+45−7 po/ru.po+6−3 po/shn.po+4−2 po/si.po+4−2 po/sl.po+44−6 po/sq.po+4−2 po/sr.po+5−5 po/sv.po+39−6 po/sw.po+4−2 po/ta.po+5−5 po/te.po+4−2 po/th.po+245−105 po/tr.po+4−2 po/ug.po+38−5 po/uk.po+45−5 po/unity8.pot+54−47 po/vi.po+4−2 po/xh.po+4−2 po/zh_CN.po+6−6 po/zh_HK.po+4−2 po/zh_TW.po+29−8 qml/Components/DelayedLockscreen.qml+92 qml/Components/ListItems/Base.qml+2−11 qml/Components/Lockscreen.qml+129−103 qml/Components/PassphraseLockscreen.qml+96−43 qml/Components/PinLockscreen.qml+11−5 qml/Components/ResponsiveVerticalJournal.qml+3−2 qml/Dash/CardGrid.qml+1−1 qml/Dash/CardHorizontalList.qml+1−1 qml/Dash/CardTool.qml+18−13 qml/Dash/CardVerticalJournal.qml+1−1 qml/Dash/Dash.qml+4−4 qml/Dash/DashRenderer.qml+2−2 qml/Dash/GenericScopeView.qml+36−23 qml/Dash/Previews/PreviewHeader.qml+13−1 qml/Dash/PullToRefreshScopeStyle.qml+82 qml/Dash/ScopeSettingsPage.qml+1 qml/Dash/ScopesOverview.qml+9−1 qml/Dash/ScopesOverviewFavorites.qml+1−1 qml/Greeter/Greeter.qml+14−2 qml/Greeter/GreeterContent.qml+15 qml/Greeter/LoginList.qml+19−6 qml/Launcher/Launcher.qml+1 qml/Launcher/LauncherDelegate.qml+20−33 qml/Launcher/LauncherPanel.qml+5−14 qml/Notifications/NotificationMenuItemFactory.qml+77−5 qml/Panel/ActiveCallHint.qml+1−1 qml/Panel/IndicatorItem.qml+6 qml/Panel/Indicators/DefaultIndicatorPage.qml+1−1 qml/Panel/Indicators/IndicatorBase.qml+1 qml/Panel/Indicators/MenuItemFactory.qml+19−4 qml/Panel/Indicators/VisibleIndicators.qml+1 qml/Panel/MenuContent.qml+6 qml/Shell.qml+126−61 qml/Stages/PhoneStage.qml+8 qml/Stages/TabletStage.qml+7 run_on_device.sh+4−5 src/CMakeLists.txt+1 src/Dash/CMakeLists.txt+2 src/Panel/CMakeLists.txt+2 src/libunity8-private/CMakeLists.txt+25 src/libunity8-private/abstractdbusservicemonitor.cpp+87 src/libunity8-private/abstractdbusservicemonitor.h+66 tests/autopilot/unity8/indicators/tests/test_indicators.py+2−2 tests/autopilot/unity8/shell/emulators/dash.py+2−2 tests/autopilot/unity8/shell/tests/test_lock_screen.py+3−1 tests/mocks/Ubuntu/Telephony/MockCallEntry.cpp+26−1 tests/mocks/Ubuntu/Telephony/MockCallEntry.h+9−1 tests/mocks/Unity/Application/ApplicationManager.cpp+26 tests/mocks/Unity/Application/ApplicationManager.h+6−2 tests/mocks/Unity/Application/CMakeLists.txt+1−1 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+1 tests/mocks/Unity/fake_scope.cpp+1−1 tests/mocks/Unity/fake_scope.h+3 tests/mocks/libusermetrics/UserMetrics.cpp+2−2 tests/plugins/Dash/cardcreator/1.res+5−5 tests/plugins/Dash/cardcreator/2.res+6−10 tests/plugins/Dash/cardcreator/3.res+6−7 tests/plugins/Dash/cardcreator/4.res+5−9 tests/plugins/Dash/cardcreator/5.res+6−7 tests/plugins/Dash/cardcreator/6.res+5−7 tests/plugins/Dash/cardcreator/7.res+6−10 tests/plugins/Unity/Launcher/CMakeLists.txt+1−1 tests/plugins/Unity/Launcher/launchermodeltest.cpp+2 tests/qmltests/CMakeLists.txt+2−1 tests/qmltests/Greeter/tst_Lockscreen.qml → tests/qmltests/Components/tst_Lockscreen.qml+31−51 tests/qmltests/Dash/CardHelpers.js+1−12 tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+4−2 tests/qmltests/Dash/tst_CardTool.qml+28−20 tests/qmltests/Dash/tst_GenericScopeView.qml+21 tests/qmltests/Greeter/tst_MultiGreeter.qml+2−2 tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml+3−23 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+24 tests/qmltests/Panel/tst_ActiveCallHint.qml+19−6 tests/qmltests/Stages/tst_PhoneStage.qml+17 tests/qmltests/tst_Shell.qml+5 tests/qmltests/tst_ShellWithPin.qml+109−26 tests/qmltests/tst_TabletShell.qml+289 tests/utils/modules/Unity/Test/UnityTestCase.qml+9 tools/unlock-device+14−13
CMakeLists.txt+5−2
@@ -64,13 +64,13 @@ if(SHELL_INSTALL_QML STREQUAL "")
6464 message(FATAL_ERROR "Could not determine plugin installation dir.")
6565endif()
6666
67+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
68+
6769execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugindir unity-shell-api OUTPUT_VARIABLE SHELL_PLUGINDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
6870if(SHELL_PLUGINDIR STREQUAL "")
6971 message(FATAL_ERROR "Could not determine plugin import dir.")
7072endif()
7173
72−set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
73−
7474set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-permissive -pedantic -Wall -Wextra")
7575
7676if ("${CMAKE_BUILD_TYPE}" STREQUAL "release" OR "${CMAKE_BUILD_TYPE}" STREQUAL "relwithdebinfo")
@@ -87,6 +87,9 @@ endif()
8787# "signals" and "slots"
8888add_definitions(-DQT_NO_KEYWORDS)
8989
90+# Save a few container detach and conversions
91+add_definitions(-DQT_STRICT_ITERATORS)
92+
9093# Tests
9194include(CTest)
9295enable_testing()
CODING+4
@@ -154,6 +154,10 @@ So, for the DragHandle component that would be:
154154
155155$ make testDragHandle
156156
157+To run the tests for a single component/class under gdb (so you can catch SEGFAULTS)
158+
159+$ make gdbtestComponentName
160+
157161To run a test application that allow you to manually test or to simply try out
158162a given component:
159163
cmake/modules/QmlTest.cmake+8
@@ -12,6 +12,7 @@
1212# Two targets will be created:
1313# - testComponentName - Runs the test with qmltestrunner
1414# - tryComponentName - Runs the test with uqmlscene, for manual interaction
15+# - gdbtestComponentName - Runs the test with qmltestrunner under gdb
1516#
1617# To change/set a default value for the whole test suite, prior to calling add_qml_test, set:
1718# qmltest_DEFAULT_NO_ADD_TEST (default: FALSE)
@@ -81,6 +82,7 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
8182 cmake_parse_arguments(qmltest_default "${options}" "" "${multi_value_keywords}" ${qmltest_DEFAULT_PROPERTIES})
8283
8384 set(qmltest_TARGET test${COMPONENT_NAME})
85+ set(qmltest_gdb_TARGET gdbtest${COMPONENT_NAME})
8486 set(qmltest_xvfb_TARGET xvfbtest${COMPONENT_NAME})
8587 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
8688
@@ -138,8 +140,14 @@ macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
138140 ${function_ARGS}
139141 )
140142
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+
141148 add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
142149 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)
143151 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
144152endmacro(add_qml_test_internal)
145153
data/unity8.conf+5−1
@@ -34,11 +34,15 @@ pre-start script
3434 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
3535 fi
3636
37− # Remove the socket if still there
37+ # Remove the normal and trusted sockets if still there
3838 if [ -S "$MIR_SERVER_FILE" ]; then
3939 rm "$MIR_SERVER_FILE"
4040 fi
4141
42+ if [ -S "${MIR_SERVER_FILE}_trusted" ]; then
43+ rm "${MIR_SERVER_FILE}_trusted"
44+ fi
45+
4246 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
4347
4448 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+
1139unity8 (8.00+14.10.20140926-0ubuntu1) utopic; urgency=low
2140
3141 [ CI bot ]
debian/control+1−1
@@ -25,7 +25,7 @@ Build-Depends: cmake,
2525 libpulse-dev,
2626 libqmenumodel-dev (>= 0.2.8),
2727 libqt5xmlpatterns5-dev,
28− libunity-api-dev (>= 7.91),
28+ libunity-api-dev (>= 7.92),
2929 libusermetricsoutput1-dev,
3030 libxcb1-dev,
3131 pkg-config,
debian/unity8-private.install+1
@@ -1,3 +1,4 @@
1+usr/lib/*/libunity8-private.*
12usr/lib/*/unity8/qml/AccountsService
23usr/lib/*/unity8/qml/Dash
34usr/lib/*/unity8/qml/HudClient
plugins/Dash/CardAttributes.qml+1−1
@@ -59,7 +59,7 @@ GridLayout {
5959 text: "value" in modelData && modelData["value"] || "";
6060 elide: Text.ElideRight
6161 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
6363 fontSize: "small"
6464 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
6565 color: grid.color
plugins/Dash/CardCreator.js+11−15
@@ -82,13 +82,13 @@ var kArtShapeHolderCode = 'Item { \n\
8282 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height }); \n\
8383 } \n\
8484 } \n\
85− image: Image { \n\
85+ image: CroppedImageMinimumSourceSize { \n\
8686 objectName: "artImage"; \n\
8787 property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
8888 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; } \n\
8989 cache: true; \n\
9090 asynchronous: root.asynchronous; \n\
91− fillMode: Image.PreserveAspectCrop; \n\
91+ visible: false; \n\
9292 width: %2; \n\
9393 height: %3; \n\
9494 } \n\
@@ -191,17 +191,14 @@ var kMascotShapeLoaderCode = 'Loader { \n\
191191
192192// %1 is used as anchors of mascotImage
193193// %2 is used as visible of mascotImage
194−var kMascotImageCode = 'Image { \n\
194+var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
195195 id: mascotImage; \n\
196196 objectName: "mascotImage"; \n\
197197 anchors { %1 } \n\
198− readonly property int maxSize: Math.max(width, height) * 4; \n\
199198 property bool doLoadSource: !NetworkingStatus.limitedBandwith; \n\
200199 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; } \n\
201200 width: units.gu(6); \n\
202201 height: units.gu(5.625); \n\
203− sourceSize { width: maxSize; height: maxSize } \n\
204− fillMode: Image.PreserveAspectCrop; \n\
205202 horizontalAlignment: Image.AlignHCenter; \n\
206203 verticalAlignment: Image.AlignVCenter; \n\
207204 visible: %2; \n\
@@ -222,13 +219,13 @@ var kTitleLabelCode = 'Label { \n\
222219 color: %2; \n\
223220 visible: showHeader %3; \n\
224221 text: root.title; \n\
225− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal; \n\
226− horizontalAlignment: root.headerAlignment; \n\
222+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal; \n\
223+ horizontalAlignment: root.titleAlignment; \n\
227224 }\n';
228225
229226// %1 is used as extra anchors of emblemIcon
230227// %2 is used as color of emblemIcon
231−var kEmblemIconCode = 'Icon { \n\
228+var kEmblemIconCode = 'StatusIcon { \n\
232229 id: emblemIcon; \n\
233230 objectName: "emblemIcon"; \n\
234231 anchors { \n\
@@ -238,7 +235,6 @@ var kEmblemIconCode = 'Icon { \n\
238235 } \n\
239236 source: cardData && cardData["emblem"] || ""; \n\
240237 color: %2; \n\
241− width: height; \n\
242238 height: source != "" ? titleLabel.font.pixelSize : 0; \n\
243239 }\n';
244240
@@ -260,13 +256,12 @@ var kSubtitleLabelCode = 'Label { \n\
260256 anchors { %1 } \n\
261257 anchors.topMargin: units.dp(2); \n\
262258 elide: Text.ElideRight; \n\
263− fontSize: "small"; \n\
259+ fontSize: "x-small"; \n\
264260 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
265261 color: %2; \n\
266262 visible: titleLabel.visible && titleLabel.text; \n\
267263 text: cardData && cardData["subtitle"] || ""; \n\
268264 font.weight: Font.Light; \n\
269− horizontalAlignment: root.headerAlignment; \n\
270265 }\n';
271266
272267// %1 is used as anchors of attributesRow
@@ -312,7 +307,7 @@ function cardString(template, components) {
312307 property var artShapeBorderSource: undefined; \n\
313308 property real fontScale: 1.0; \n\
314309 property var scopeStyle: null; \n\
315− property int headerAlignment: Text.AlignLeft; \n\
310+ property int titleAlignment: Text.AlignLeft; \n\
316311 property int fixedHeaderHeight: -1; \n\
317312 property size fixedArtShapeSize: Qt.size(-1, -1); \n\
318313 readonly property string title: cardData && cardData["title"] || ""; \n\
@@ -438,7 +433,7 @@ function cardString(template, components) {
438433 mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors);
439434 }
440435
441− var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
436+ var mascotImageVisible = useMascotShape ? 'false' : 'showHeader && resized';
442437 mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible);
443438 }
444439
@@ -629,7 +624,7 @@ function cardString(template, components) {
629624
630625 var implicitHeight = 'implicitHeight: ';
631626 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';
633628 } else if (hasHeaderRow) {
634629 implicitHeight += 'row.y + row.height + units.gu(1);\n';
635630 } else if (hasMascot) {
@@ -657,6 +652,7 @@ function cardString(template, components) {
657652function createCardComponent(parent, template, components) {
658653 var imports = 'import QtQuick 2.2; \n\
659654 import Ubuntu.Components 1.1; \n\
655+ import Ubuntu.Settings.Components 0.1; \n\
660656 import Ubuntu.Connectivity 1.0; \n\
661657 import Dash 0.1;\n\
662658 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
33typeinfo Dash.qmltypes
44singleton CardCreatorCache 0.1 CardCreatorCache.qml
55ScopeStyle 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 @@
2121#include <QObject>
2222
2323class Greeter;
24−class QDBusInterface;
2524
2625/** This is an internal class used to talk with the indicators.
2726 */
plugins/LightDM/DBusGreeterList.h−1
@@ -21,7 +21,6 @@
2121#include <QObject>
2222
2323class Greeter;
24−class QDBusInterface;
2524
2625/** This is an internal class used to talk with the indicators.
2726 */
plugins/Unity/DashCommunicator/CMakeLists.txt+8−2
@@ -1,5 +1,6 @@
11include_directories(
22 ${CMAKE_CURRENT_SOURCE_DIR}
3+ ${libunity8-private_SOURCE_DIR}
34)
45
56set(QMLDASHCOMMUNICATORPLUGIN_SRC
@@ -7,13 +8,18 @@ set(QMLDASHCOMMUNICATORPLUGIN_SRC
78 dbusdashcommunicatorservice.cpp
89 dashcommunicatorservice.cpp
910 dashcommunicator.cpp
10− )
11+ dashconnection.cpp
12+)
1113
1214add_library(DashCommunicator-qml MODULE
1315 ${QMLDASHCOMMUNICATORPLUGIN_SRC}
14− )
16+)
1517
1618qt5_use_modules(DashCommunicator-qml DBus Qml)
1719
20+target_link_libraries(DashCommunicator-qml
21+ unity8-private
22+)
23+
1824# export the qmldir and qmltypes files
1925add_unity8_plugin(Unity.DashCommunicator 0.1 Unity/DashCommunicator TARGETS DashCommunicator-qml)
plugins/Unity/DashCommunicator/dashcommunicator.cpp+22−13
@@ -15,29 +15,38 @@
1515 */
1616
1717#include "dashcommunicator.h"
18+#include "dashconnection.h"
1819
1920#include <QObject>
20−#include <QDBusConnection>
21−#include <QDBusInterface>
22−#include <QDebug>
2321
2422DashCommunicator::DashCommunicator(QObject *parent):
25− QObject(parent)
23+ QThread(parent),
24+ m_dashConnection(nullptr),
25+ m_created(false)
2626{
27+ start();
2728}
2829
29−DashCommunicator::~DashCommunicator()
30+void DashCommunicator::setCurrentScope(const QString &scopeId, bool animate, bool isSwipe)
3031{
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();
3140}
3241
33−
34−void DashCommunicator::setCurrentScope(const QString &scopeId, bool animate, bool isSwipe)
42+void DashCommunicator::run()
3543{
36− QDBusConnection connection = QDBusConnection::sessionBus();
37− QDBusInterface dashIface ("com.canonical.UnityDash",
38− "/com/canonical/UnityDash",
39− "",
40− connection);
44+ m_dashConnection = new DashConnection("com.canonical.UnityDash",
45+ "/com/canonical/UnityDash",
46+ "", this);
47+ m_mutex.lock();
48+ m_created = true;
49+ m_mutex.unlock();
4150
42− dashIface.call("SetCurrentScope", scopeId, animate, isSwipe);
51+ exec();
4352}
plugins/Unity/DashCommunicator/dashcommunicator.h+16−6
@@ -17,19 +17,29 @@
1717#ifndef DASHCOMMUNICATOR_H
1818#define DASHCOMMUNICATOR_H
1919
20−#include <QObject>
20+// Qt
21+#include <QThread>
22+#include <QMutex>
2123
22−class DashCommunicator: public QObject
24+class DashConnection;
25+
26+class DashCommunicator: public QThread
2327{
2428 Q_OBJECT
25− Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity.DashCommunicator")
26−
2729public:
28− DashCommunicator(QObject *parent = 0);
29− ~DashCommunicator();
30+ explicit DashCommunicator(QObject *parent = 0);
31+ ~DashCommunicator() = default;
3032
3133public Q_SLOTS:
3234 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;
3343};
3444
3545#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 @@
11include(FindPkgConfig)
22pkg_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)
44pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
55
66add_definitions(-DSM_BUSNAME=systemBus)
plugins/Unity/Session/orientationlock.cpp+6−6
@@ -24,16 +24,16 @@ OrientationLock::OrientationLock(QObject *parent)
2424 , m_enabled(false)
2525 , m_savedOrientation(Qt::PortraitOrientation)
2626{
27− systemSettings = g_settings_new("com.ubuntu.touch.system");
28− g_signal_connect(systemSettings, "changed::rotation-lock",
27+ m_systemSettings = g_settings_new("com.ubuntu.touch.system");
28+ g_signal_connect(m_systemSettings, "changed::rotation-lock",
2929 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");
3131}
3232
3333OrientationLock::~OrientationLock()
3434{
35− g_signal_handlers_disconnect_by_data(systemSettings, this);
36− g_object_unref(systemSettings);
35+ g_signal_handlers_disconnect_by_data(m_systemSettings, this);
36+ g_object_unref(m_systemSettings);
3737}
3838
3939bool OrientationLock::enabled() const
@@ -54,7 +54,7 @@ void OrientationLock::onEnabledChangedProxy(GSettings */*settings*/, const gchar
5454
5555void OrientationLock::onEnabledChanged()
5656{
57− const bool enabled = g_settings_get_boolean(systemSettings, "rotation-lock");
57+ const bool enabled = g_settings_get_boolean(m_systemSettings, "rotation-lock");
5858 if (m_enabled != enabled) {
5959 m_enabled = enabled;
6060 Q_EMIT enabledChanged();
plugins/Unity/Session/orientationlock.h+1−3
@@ -19,7 +19,6 @@
1919
2020#include <gio/gio.h>
2121#include <QtCore/QObject>
22−#include <QtDBus/QDBusInterface>
2322
2423/**
2524 * @brief The OrientationLock class exports orientation lock related properties to QML
@@ -52,8 +51,7 @@ private Q_SLOTS:
5251 void onEnabledChanged();
5352
5453private:
55− QDBusInterface *dbusInterface;
56− GSettings *systemSettings;
54+ GSettings *m_systemSettings;
5755
5856 bool m_enabled;
5957 Qt::ScreenOrientation m_savedOrientation;
po/am.po+39−5
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
14+"Language: am\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n > 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -359,5 +361,37 @@ msgstr ""
359361"የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
360362"ይጠፋል"
361363
362−#~ msgid "Manage Dash"
363−#~ msgstr "የ ዳሽ አስተዳዳሪ"
364+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-05-22 08:22+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
14+"Language: ar\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
@@ -120,8 +123,7 @@ msgstr "الحافة اليسرى"
120123
121124#: qml/Components/EdgeDemo.qml:199
122125msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr ""
124−"اسحب أصبعك من الحافة اليسرى لإظهار شريط يونتي للوصول السريع للتطبيقات"
126+msgstr "اسحب أصبعك من الحافة اليسرى لإظهار شريط يونتي للوصول السريع للتطبيقات"
125127
126128#: qml/Components/EdgeDemo.qml:226
127129msgid "Well done"
po/ast.po+41−5
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
14+"Language: ast\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -362,5 +364,39 @@ msgstr ""
362364"Si s'inxerta'l códigu incorreutamente, el teléfonu va volver a la "
363365"configuración de fábrica y van perdese tolos datos personales."
364366
365−#~ msgid "Manage Dash"
366−#~ msgstr "Xestionar tableru"
367+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-09-03 16:39+0000\n"
1212"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
14+"Language: az\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -120,8 +122,7 @@ msgstr "Sol künc"
120122
121123#: qml/Components/EdgeDemo.qml:199
122124msgid "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"
125126
126127#: qml/Components/EdgeDemo.qml:226
127128msgid "Well done"
po/be.po+56−48
@@ -7,14 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-09-24 17:12+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Belarusian <be@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\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"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -30,6 +32,25 @@ msgstr ""
3032msgid "Unpin shortcut"
3133msgstr ""
3234
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+
3354#: qml/Components/Dialogs.qml:70
3455msgid "Log out"
3556msgstr ""
@@ -132,40 +153,23 @@ msgid ""
132153"phone<br><br>Tap on the screen to start"
133154msgstr ""
134155
135−#: qml/Components/Lockscreen.qml:167
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
156+#: qml/Components/Lockscreen.qml:220
144157msgid "Emergency Call"
145158msgstr ""
146159
147−#: qml/Components/Lockscreen.qml:226
160+#: qml/Components/Lockscreen.qml:252
148161msgid "OK"
149162msgstr ""
150163
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
161165msgid "See less"
162166msgstr ""
163167
164−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
165169msgid "See all"
166170msgstr ""
167171
168−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
169173#: qml/Panel/SearchIndicator.qml:27
170174msgid "Search"
171175msgstr ""
@@ -202,6 +206,14 @@ msgstr ""
202206msgid "Send"
203207msgstr ""
204208
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+
205217#: qml/Dash/ScopesOverview.qml:206
206218msgid "Manage Scopes"
207219msgstr ""
@@ -223,7 +235,7 @@ msgid "All"
223235msgstr ""
224236
225237#: qml/Greeter/Greeter.qml:157
226−msgid "Swipe to unlock"
238+msgid "Unlock"
227239msgstr ""
228240
229241#: qml/Hud/HudParametrizedActionsPage.qml:139
@@ -246,18 +258,10 @@ msgstr ""
246258msgid "Speaking..."
247259msgstr ""
248260
249−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
250262msgid "Show password"
251263msgstr ""
252264
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−
261265#: qml/Panel/ActiveCallHint.qml:77
262266msgid "Tap to return to call..."
263267msgstr ""
@@ -302,51 +306,55 @@ msgstr ""
302306msgid "Roaming"
303307msgstr ""
304308
305−#: qml/Shell.qml:320
306−msgid "Enter your passphrase"
309+#: qml/Shell.qml:346
310+msgid "Enter passphrase"
307311msgstr ""
308312
309−#: qml/Shell.qml:321
313+#: qml/Shell.qml:347
310314msgid "Sorry, incorrect passphrase"
311315msgstr ""
312316
313−#: qml/Shell.qml:323
314−msgid "Enter your passcode"
317+#: qml/Shell.qml:348
318+msgid "Please re-enter"
319+msgstr ""
320+
321+#: qml/Shell.qml:350
322+msgid "Enter passcode"
315323msgstr ""
316324
317−#: qml/Shell.qml:324
325+#: qml/Shell.qml:351
318326msgid "Sorry, incorrect passcode"
319327msgstr ""
320328
321−#: qml/Shell.qml:327
329+#: qml/Shell.qml:354
322330#, qt-format
323−msgid "Enter your %1"
331+msgid "Enter %1"
324332msgstr ""
325333
326−#: qml/Shell.qml:328
334+#: qml/Shell.qml:355
327335#, qt-format
328336msgid "Sorry, incorrect %1"
329337msgstr ""
330338
331−#: qml/Shell.qml:363
339+#: qml/Shell.qml:390
332340msgid "Sorry, incorrect passphrase."
333341msgstr ""
334342
335−#: qml/Shell.qml:364
343+#: qml/Shell.qml:391
336344msgid "Sorry, incorrect passcode."
337345msgstr ""
338346
339−#: qml/Shell.qml:365
347+#: qml/Shell.qml:392
340348msgid "This will be your last attempt."
341349msgstr ""
342350
343−#: qml/Shell.qml:367
351+#: qml/Shell.qml:394
344352msgid ""
345353"If passphrase is entered incorrectly, your phone will conduct a factory "
346354"reset and all personal data will be deleted."
347355msgstr ""
348356
349−#: qml/Shell.qml:368
357+#: qml/Shell.qml:395
350358msgid ""
351359"If passcode is entered incorrectly, your phone will conduct a factory reset "
352360"and all personal data will be deleted."
po/bg.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-04-01 14:08+0000\n"
1212"Last-Translator: Atanas Kovachki <Unknown>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
14+"Language: bg\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/br.po+46−8
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
14+"Language: br\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n > 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +84,7 @@ msgstr "Lazhañ"
8284
8385#: qml/Components/Dialogs.qml:157
8486msgid "Restart"
85−msgstr ""
87+msgstr "Adloc'hañ"
8688
8789#: qml/Components/Dialogs.qml:167
8890msgid "Cancel"
@@ -213,7 +215,7 @@ msgstr "Kas"
213215
214216#: qml/Dash/ScopesOverview.qml:206
215217msgid "Manage Scopes"
216−msgstr ""
218+msgstr "Merañ ar c'hefluskerioù enklask"
217219
218220#: qml/Dash/ScopesOverview.qml:428
219221msgid "Done"
@@ -277,7 +279,7 @@ msgstr "Kendiviz"
277279
278280#: qml/Panel/Indicators/MenuItemFactory.qml:600
279281msgid "Nothing is playing"
280−msgstr ""
282+msgstr "Ne lenner netra bremañ"
281283
282284#: qml/Panel/Indicators/MenuItemFactory.qml:748
283285msgid "In queue…"
@@ -365,5 +367,41 @@ msgstr ""
365367"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
366368"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
367369
368−#~ msgid "Manage Dash"
369−#~ msgstr "Merañ an daolenn-vourzh"
370+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-16 22:33+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bosnian <bs@li.org>\n"
14+"Language: bs\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
po/ca.po+50−12
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
14+"Language: ca\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -98,8 +100,7 @@ msgstr "Vora dreta"
98100
99101#: qml/Components/EdgeDemo.qml:113
100102msgid "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"
103104
104105#: qml/Components/EdgeDemo.qml:144
105106msgid "Top edge"
@@ -214,7 +215,7 @@ msgstr "Envia"
214215
215216#: qml/Dash/ScopesOverview.qml:206
216217msgid "Manage Scopes"
217−msgstr ""
218+msgstr "Gestioneu les lents"
218219
219220#: qml/Dash/ScopesOverview.qml:428
220221msgid "Done"
@@ -278,7 +279,7 @@ msgstr "Conferència"
278279
279280#: qml/Panel/Indicators/MenuItemFactory.qml:600
280281msgid "Nothing is playing"
281−msgstr ""
282+msgstr "No s'està reproduint res"
282283
283284#: qml/Panel/Indicators/MenuItemFactory.qml:748
284285msgid "In queue…"
@@ -344,7 +345,7 @@ msgstr "La contrasenya és incorrecta"
344345
345346#: qml/Shell.qml:364
346347msgid "Sorry, incorrect passcode."
347−msgstr "La clau és incorrecta"
348+msgstr "El codi d'accés no és correcte"
348349
349350#: qml/Shell.qml:365
350351msgid "This will be your last attempt."
@@ -364,8 +365,45 @@ msgid ""
364365"If passcode is entered incorrectly, your phone will conduct a factory reset "
365366"and all personal data will be deleted."
366367msgstr ""
367−"Si la clau s'introdueix de manera incorrecta, el telèfon es reinicialitzarà "
368−"a l'estat de fàbrica i se suprimiran totes les dades personals."
368+"Si el codi d'accés s'introdueix de manera incorrecta, el telèfon es "
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"
369407
370−#~ msgid "Manage Dash"
371−#~ msgstr "Gestiona el tauler"
408+#~ msgid "Enter %1"
409+#~ msgstr "Introduïu: %1"
po/ckb.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-21 11:05+0000\n"
1212"Last-Translator: Aras <aras.noori@gmail.com>\n"
1313"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
14+"Language: \n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/cs.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-08 10:11+0000\n"
1212"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
1313"Language-Team: Czech <cs@li.org>\n"
14+"Language: cs\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/da.po+4−2
@@ -7,15 +7,17 @@
77msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
10−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"Report-Msgid-Bugs-To: \n"
1111"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1212"PO-Revision-Date: 2014-07-30 12:37+0000\n"
1313"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
1414"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
15+"Language: da\n"
1516"MIME-Version: 1.0\n"
1617"Content-Type: text/plain; charset=UTF-8\n"
1718"Content-Transfer-Encoding: 8bit\n"
18−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
19+"Plural-Forms: nplurals=2; plural=n != 1;\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1921"X-Generator: Launchpad (build 17196)\n"
2022
2123#: plugins/LightDM/Greeter.cpp:130
po/de.po+8−9
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-09-23 08:31+0000\n"
12−"Last-Translator: Martin Pitt <martin.pitt@ubuntu.com>\n"
11+"PO-Revision-Date: 2014-09-29 06:33+0000\n"
12+"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
1313"Language-Team: German <de@li.org>\n"
14+"Language: de\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -211,7 +213,7 @@ msgstr "Senden"
211213
212214#: qml/Dash/ScopesOverview.qml:206
213215msgid "Manage Scopes"
214−msgstr ""
216+msgstr "Filter verwalten"
215217
216218#: qml/Dash/ScopesOverview.qml:428
217219msgid "Done"
@@ -275,7 +277,7 @@ msgstr "Konferenz"
275277
276278#: qml/Panel/Indicators/MenuItemFactory.qml:600
277279msgid "Nothing is playing"
278−msgstr ""
280+msgstr "Nichts wird abgespielt"
279281
280282#: qml/Panel/Indicators/MenuItemFactory.qml:748
281283msgid "In queue…"
@@ -362,6 +364,3 @@ msgid ""
362364msgstr ""
363365"Wird die PIN falsch eingegeben, wird das Telefon auf den Werkszustand "
364366"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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-08-21 12:06+0000\n"
1212"Last-Translator: Chris Taklis (aka Kailor) <ctaklis@gmail.com>\n"
1313"Language-Team: Greek <el@li.org>\n"
14+"Language: el\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/en_AU.po+4−5
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-09-23 01:24+0000\n"
1212"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@li.org>\n"
14+"Language: \n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -359,6 +361,3 @@ msgid ""
359361msgstr ""
360362"If passcode is entered incorrectly, your phone will conduct a factory reset "
361363"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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-23 13:48+0000\n"
12−"Last-Translator: Alan Pope ( ͡° ͜ʖ ͡°) <alan@ubuntu.com>\n"
11+"PO-Revision-Date: 2014-10-03 12:46+0000\n"
12+"Last-Translator: Andi Chandler <Unknown>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
14+"Language: \n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,38 @@ msgstr ""
360362"If passcode is entered incorrectly, your phone will conduct a factory reset "
361363"and all personal data will be deleted."
362364
363−#~ msgid "Manage Dash"
364−#~ msgstr "Manage Dash"
365+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Esperanto <eo@li.org>\n"
14+"Language: eo\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/es.po+47−10
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
14+"Language: es\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -66,7 +68,7 @@ msgstr "¿Esta seguro de que quiere reiniciar?"
6668
6769#: qml/Components/Dialogs.qml:144
6870msgid "Power"
69−msgstr "Encendido"
71+msgstr "Apagar"
7072
7173#: qml/Components/Dialogs.qml:145
7274msgid ""
@@ -106,8 +108,7 @@ msgstr "Borde superior"
106108
107109#: qml/Components/EdgeDemo.qml:145
108110msgid "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"
111112
112113#: qml/Components/EdgeDemo.qml:170
113114msgid "Close"
@@ -211,7 +212,7 @@ msgstr "Enviar"
211212
212213#: qml/Dash/ScopesOverview.qml:206
213214msgid "Manage Scopes"
214−msgstr ""
215+msgstr "Administrar ámbitos"
215216
216217#: qml/Dash/ScopesOverview.qml:428
217218msgid "Done"
@@ -275,7 +276,7 @@ msgstr "Conferencia"
275276
276277#: qml/Panel/Indicators/MenuItemFactory.qml:600
277278msgid "Nothing is playing"
278−msgstr ""
279+msgstr "Ningún contenido en reproducción"
279280
280281#: qml/Panel/Indicators/MenuItemFactory.qml:748
281282msgid "In queue…"
@@ -363,5 +364,41 @@ msgstr ""
363364"Si se introduce el código incorrectamente, el teléfono volverá a la "
364365"configuración de fábrica y se perderán todos los datos personales."
365366
366−#~ msgid "Manage Dash"
367−#~ msgstr "Gestionar tablero"
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."
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
14+"Language: eu\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -96,8 +98,7 @@ msgstr "Eskuineko ertza"
9698
9799#: qml/Components/EdgeDemo.qml:113
98100msgid "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"
101102
102103#: qml/Components/EdgeDemo.qml:144
103104msgid "Top edge"
@@ -361,5 +362,41 @@ msgstr ""
361362"Okerreko pasakodea sartzen baduzu, telefonoaren jatorrizko ezarpenak "
362363"berrezarri eta datu pertsonal guztiak ezabatuko dira."
363364
364−#~ msgid "Manage Dash"
365−#~ msgstr "Kudeatu abio-leihoa"
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."
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
1313"Language-Team: Persian <fa@li.org>\n"
14+"Language: fa\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -208,7 +210,7 @@ msgstr "ارسال"
208210
209211#: qml/Dash/ScopesOverview.qml:206
210212msgid "Manage Scopes"
211−msgstr ""
213+msgstr "مدیریت حوزه‌ها"
212214
213215#: qml/Dash/ScopesOverview.qml:428
214216msgid "Done"
@@ -272,7 +274,7 @@ msgstr "کنفرانس"
272274
273275#: qml/Panel/Indicators/MenuItemFactory.qml:600
274276msgid "Nothing is playing"
275−msgstr ""
277+msgstr "هیچ چیزی در حال پخش نیست"
276278
277279#: qml/Panel/Indicators/MenuItemFactory.qml:748
278280msgid "In queue…"
@@ -360,5 +362,31 @@ msgstr ""
360362"اگر رمزعبور نادرست وارد شود، تلفن شما بازنشانی کارخانه خواهد شد و تمامی "
361363"اطّلاعات شخصی حذف خواهند شد."
362364
363−#~ msgid "Manage Dash"
364−#~ msgstr "مدیریت دش"
365+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-28 13:47+0000\n"
12−"Last-Translator: Timo Jyrinki <timo.jyrinki@canonical.com>\n"
11+"PO-Revision-Date: 2014-10-07 13:10+0000\n"
12+"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
14+"Language: fi\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,39 @@ msgstr ""
360362"Jos kirjoitat suojakoodin virheellisesti, puhelimesi palautetaan "
361363"tehdastilaan ja kaikki henkilökohtaiset tietosi poistetaan."
362364
363−#~ msgid "Manage Dash"
364−#~ msgstr "Unityn hallinta"
365+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-14 20:08+0000\n"
1212"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@li.org>\n"
14+"Language: fo\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/fr.po+47−10
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
11−"PO-Revision-Date: 2014-08-29 10:31+0000\n"
12−"Last-Translator: Sébastien Maes <nautilussebastien@gmail.com>\n"
11+"PO-Revision-Date: 2014-10-09 19:00+0000\n"
12+"Last-Translator: Anne <anneonyme017@gmail.com>\n"
1313"Language-Team: French <fr@li.org>\n"
14+"Language: fr\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n > 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -98,8 +100,7 @@ msgstr "Bord droit"
98100
99101#: qml/Components/EdgeDemo.qml:113
100102msgid "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."
103104
104105#: qml/Components/EdgeDemo.qml:144
105106msgid "Top edge"
@@ -215,7 +216,7 @@ msgstr "Envoyer"
215216
216217#: qml/Dash/ScopesOverview.qml:206
217218msgid "Manage Scopes"
218−msgstr ""
219+msgstr "Gérer les moteurs de recherche"
219220
220221#: qml/Dash/ScopesOverview.qml:428
221222msgid "Done"
@@ -279,7 +280,7 @@ msgstr "Conférence"
279280
280281#: qml/Panel/Indicators/MenuItemFactory.qml:600
281282msgid "Nothing is playing"
282−msgstr ""
283+msgstr "Rien n'est en cours de lecture"
283284
284285#: qml/Panel/Indicators/MenuItemFactory.qml:748
285286msgid "In queue…"
@@ -369,5 +370,41 @@ msgstr ""
369370"réinitialisation aux paramètres d'usine et toutes les données personnelles "
370371"seront supprimées."
371372
372−#~ msgid "Manage Dash"
373−#~ msgstr "Gérer le tableau de bord"
373+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: GunChleoc <Unknown>\n"
1313"Language-Team: Fòram na Gàidhlig\n"
14+"Language: gd\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
19−"Language: gd\n"
2022
2123#: plugins/LightDM/Greeter.cpp:130
2224msgid "Password: "
@@ -215,7 +217,7 @@ msgstr "Cuir"
215217
216218#: qml/Dash/ScopesOverview.qml:206
217219msgid "Manage Scopes"
218−msgstr ""
220+msgstr "Stiùirich na sgòpaichean"
219221
220222#: qml/Dash/ScopesOverview.qml:428
221223msgid "Done"
@@ -279,7 +281,7 @@ msgstr "Gairm co-labhairt"
279281
280282#: qml/Panel/Indicators/MenuItemFactory.qml:600
281283msgid "Nothing is playing"
282−msgstr ""
284+msgstr "Chan eil dad 'ga chluich"
283285
284286#: qml/Panel/Indicators/MenuItemFactory.qml:748
285287msgid "In queue…"
@@ -369,5 +371,43 @@ msgstr ""
369371"shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta pearsanta "
370372"a sguabadh às."
371373
372−#~ msgid "Manage Dash"
373−#~ msgstr "Stiùirich an deas-bhòrd"
374+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
14+"Language: gl\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,37 @@ msgstr ""
360362"Se a clave introducida é incorrecta, o teléfono restabelecerá os valores de "
361363"fábrica e perderá todos os datos persoais."
362364
363−#~ msgid "Manage Dash"
364−#~ msgstr "Xestión do Panel"
365+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-08-23 14:19+0000\n"
1212"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@li.org>\n"
14+"Language: he\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/hi.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-15 01:49+0000\n"
1212"Last-Translator: Siddhanathan S. <Unknown>\n"
1313"Language-Team: Hindi <hi@li.org>\n"
14+"Language: hi\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/hr.po+5−2
@@ -6,15 +6,18 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-06-27 04:14+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Croatian <hr@li.org>\n"
14+"Language: hr\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
po/hu.po+42−7
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
14+"Language: hu\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -135,8 +137,8 @@ msgid ""
135137"You have now mastered the edge gestures and can start using the "
136138"phone<br><br>Tap on the screen to start"
137139msgstr ""
138−"Elsajátította a gesztusokat, és megkezdheti a telefon "
139−"használatát.<br><br>Koppintson a képernyőre a kezdéshez."
140+"Elsajátította a gesztusokat, és megkezdheti a telefon használatát."
141+"<br><br>Koppintson a képernyőre a kezdéshez."
140142
141143#: qml/Components/Lockscreen.qml:167
142144msgid "Please wait"
@@ -362,5 +364,38 @@ msgstr ""
362364"Ha helytelen jelkódot ad meg, a telefonja visszaállítja a gyári "
363365"beállításokat és törli minden személyes adatát."
364366
365−#~ msgid "Manage Dash"
366−#~ msgstr "Dash kezelése"
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."
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-06-27 04:43+0000\n"
1212"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
1313"Language-Team: Armenian <hy@li.org>\n"
14+"Language: hy\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/id.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Indonesian <id@li.org>\n"
14+"Language: id\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/is.po+41−14
@@ -8,17 +8,18 @@
88msgid ""
99msgstr ""
1010"Project-Id-Version: po_unity8-is\n"
11−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11+"Report-Msgid-Bugs-To: \n"
1212"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"
1414"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
1515"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
16+"Language: is\n"
1617"MIME-Version: 1.0\n"
1718"Content-Type: text/plain; charset=UTF-8\n"
1819"Content-Transfer-Encoding: 8bit\n"
19−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
20+"Plural-Forms: nplurals=2; plural=n != 1;\n"
21+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
2022"X-Generator: Launchpad (build 17196)\n"
21−"Language: is\n"
2223
2324#: plugins/LightDM/Greeter.cpp:130
2425msgid "Password: "
@@ -39,7 +40,7 @@ msgstr "Útskráning"
3940
4041#: qml/Components/Dialogs.qml:71
4142msgid "Are you sure you want to log out?"
42−msgstr ""
43+msgstr "Ertu viss um að þú viljir skrá þig út?"
4344
4445#: qml/Components/Dialogs.qml:73 qml/Components/Dialogs.qml:97
4546#: qml/Components/Dialogs.qml:122
@@ -57,7 +58,7 @@ msgstr "Slökkva á tölvunni"
5758
5859#: qml/Components/Dialogs.qml:95
5960msgid "Are you sure you want to shut down?"
60−msgstr ""
61+msgstr "Ertu viss um að þú viljir slökkva á símanum?"
6162
6263#: qml/Components/Dialogs.qml:119
6364msgid "Reboot"
@@ -65,7 +66,7 @@ msgstr "Endurræsa"
6566
6667#: qml/Components/Dialogs.qml:120
6768msgid "Are you sure you want to reboot?"
68−msgstr ""
69+msgstr "Ertu viss að þú viljir enduræsa?"
6970
7071#: qml/Components/Dialogs.qml:144
7172msgid "Power"
@@ -76,6 +77,8 @@ msgid ""
7677"Are you sure you would like\n"
7778"to power off?"
7879msgstr ""
80+"Ertu viss um að þú viljir\n"
81+"slökkva á símanum?"
7982
8083#: qml/Components/Dialogs.qml:147
8184msgid "Power off"
@@ -306,7 +309,7 @@ msgstr "Aflæsa SIM-korti"
306309
307310#: qml/Panel/Indicators/RoamingIndication.qml:27
308311msgid "Roaming"
309−msgstr ""
312+msgstr "Ráphamur"
310313
311314#: qml/Shell.qml:320
312315msgid "Enter your passphrase"
@@ -314,7 +317,7 @@ msgstr ""
314317
315318#: qml/Shell.qml:321
316319msgid "Sorry, incorrect passphrase"
317−msgstr ""
320+msgstr "Því miður, rangt lykilorð"
318321
319322#: qml/Shell.qml:323
320323msgid "Enter your passcode"
@@ -322,7 +325,7 @@ msgstr ""
322325
323326#: qml/Shell.qml:324
324327msgid "Sorry, incorrect passcode"
325−msgstr ""
328+msgstr "Því miður, rangur aðgangskóði"
326329
327330#: qml/Shell.qml:327
328331#, qt-format
@@ -332,28 +335,52 @@ msgstr ""
332335#: qml/Shell.qml:328
333336#, qt-format
334337msgid "Sorry, incorrect %1"
335−msgstr ""
338+msgstr "Því miður, rangt %1"
336339
337340#: qml/Shell.qml:363
338341msgid "Sorry, incorrect passphrase."
339−msgstr ""
342+msgstr "Því miður, rangt lykilorð."
340343
341344#: qml/Shell.qml:364
342345msgid "Sorry, incorrect passcode."
343−msgstr ""
346+msgstr "Því miður, rangur aðgangskóði."
344347
345348#: qml/Shell.qml:365
346349msgid "This will be your last attempt."
347−msgstr ""
350+msgstr "Þetta mun verða síðasta tilraunin þín."
348351
349352#: qml/Shell.qml:367
350353msgid ""
351354"If passphrase is entered incorrectly, your phone will conduct a factory "
352355"reset and all personal data will be deleted."
353356msgstr ""
357+"Ef lykilorð er rangt, mun síminn frumstilla allt á verksmiðjustillingar og "
358+"öllum einkagögnum verður eytt."
354359
355360#: qml/Shell.qml:368
356361msgid ""
357362"If passcode is entered incorrectly, your phone will conduct a factory reset "
358363"and all personal data will be deleted."
359364msgstr ""
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
1313"Language-Team: Italian <it@li.org>\n"
14+"Language: it\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +84,7 @@ msgstr "Spegni"
8284
8385#: qml/Components/Dialogs.qml:157
8486msgid "Restart"
85−msgstr ""
87+msgstr "Riavvia"
8688
8789#: qml/Components/Dialogs.qml:167
8890msgid "Cancel"
@@ -106,8 +108,7 @@ msgstr "Bordo superiore"
106108
107109#: qml/Components/EdgeDemo.qml:145
108110msgid "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"
111112
112113#: qml/Components/EdgeDemo.qml:170
113114msgid "Close"
@@ -213,7 +214,7 @@ msgstr "Invia"
213214
214215#: qml/Dash/ScopesOverview.qml:206
215216msgid "Manage Scopes"
216−msgstr ""
217+msgstr "Gestisci Scope"
217218
218219#: qml/Dash/ScopesOverview.qml:428
219220msgid "Done"
@@ -277,7 +278,7 @@ msgstr "Conferenza"
277278
278279#: qml/Panel/Indicators/MenuItemFactory.qml:600
279280msgid "Nothing is playing"
280−msgstr ""
281+msgstr "Niente in riproduzione"
281282
282283#: qml/Panel/Indicators/MenuItemFactory.qml:748
283284msgid "In queue…"
@@ -364,6 +365,3 @@ msgid ""
364365msgstr ""
365366"Se verrà inserito una passcode errato, il telefono eseguirà un ripristino "
366367"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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-09-18 09:47+0000\n"
1212"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
14+"Language: ja\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -120,7 +122,8 @@ msgstr "左端"
120122
121123#: qml/Components/EdgeDemo.qml:199
122124msgid "Swipe from the left to reveal the launcher for quick access to apps"
123−msgstr "アプリに素早くアクセスできるLauncherを表示するには左からスワイプしてください"
125+msgstr ""
126+"アプリに素早くアクセスできるLauncherを表示するには左からスワイプしてください"
124127
125128#: qml/Components/EdgeDemo.qml:226
126129msgid "Well done"
@@ -131,7 +134,8 @@ msgid ""
131134"You have now mastered the edge gestures and can start using the "
132135"phone<br><br>Tap on the screen to start"
133136msgstr ""
134−"これでスマートフォンの操作に必要な、画面端を用いたジェスチャーを習得できました。<br><br>利用を開始するなら画面をタップしてください"
137+"これでスマートフォンの操作に必要な、画面端を用いたジェスチャーを習得できまし"
138+"た。<br><br>利用を開始するなら画面をタップしてください"
135139
136140#: qml/Components/Lockscreen.qml:167
137141msgid "Please wait"
@@ -345,13 +349,14 @@ msgstr "これが最後のチャンスです。"
345349msgid ""
346350"If passphrase is entered incorrectly, your phone will conduct a factory "
347351"reset and all personal data will be deleted."
348−msgstr "パスフレーズが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
352+msgstr ""
353+"パスフレーズが間違っている場合、ファクトリーリセットを実施し、すべての個人"
354+"データは削除されます。"
349355
350356#: qml/Shell.qml:368
351357msgid ""
352358"If passcode is entered incorrectly, your phone will conduct a factory reset "
353359"and all personal data will be deleted."
354−msgstr "パスコードが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
355−
356−#~ msgid "Manage Dash"
357−#~ msgstr "Dashの管理"
360+msgstr ""
361+"パスコードが間違っている場合、ファクトリーリセットを実施し、すべての個人デー"
362+"タは削除されます。"
po/km.po+11−17
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"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"
1313"Language-Team: Khmer <km@li.org>\n"
14+"Language: \n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -122,9 +124,7 @@ msgstr "គែមឆ្វេង"
122124
123125#: qml/Components/EdgeDemo.qml:199
124126msgid "Swipe from the left to reveal the launcher for quick access to apps"
125−msgstr ""
126−"អូស​ពី​គែម​ឆ្វេង "
127−"ដើម្បី​បង្ហាញ​កម្មវិធី​ចាប់ផ្ដើម​សម្រាប់​ចូល​ដំណើរ​ការ​កម្មវិធី​រហ័ស"
127+msgstr "អូស​ពី​គែម​ឆ្វេង ដើម្បី​បង្ហាញ​កម្មវិធី​ចាប់ផ្ដើម​សម្រាប់​ចូល​ដំណើរ​ការ​កម្មវិធី​រហ័ស"
128128
129129#: qml/Components/EdgeDemo.qml:226
130130msgid "Well done"
@@ -135,8 +135,7 @@ msgid ""
135135"You have now mastered the edge gestures and can start using the "
136136"phone<br><br>Tap on the screen to start"
137137msgstr ""
138−"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
139−"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
138+"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
140139
141140#: qml/Components/Lockscreen.qml:167
142141msgid "Please wait"
@@ -351,18 +350,13 @@ msgid ""
351350"If passphrase is entered incorrectly, your phone will conduct a factory "
352351"reset and all personal data will be deleted."
353352msgstr ""
354−"បើ​បញ្ចូល​ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ "
355−"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
356−"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
353+"បើ​បញ្ចូល​ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​"
354+"របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
357355
358356#: qml/Shell.qml:368
359357msgid ""
360358"If passcode is entered incorrectly, your phone will conduct a factory reset "
361359"and all personal data will be deleted."
362360msgstr ""
363−"បើ​បញ្ចូល​កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ "
364−"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
365−"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
366−
367−#~ msgid "Manage Dash"
368−#~ msgstr "គ្រប់គ្រង​ផ្ទាំង"
361+"បើ​បញ្ចូល​កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​"
362+"របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
po/kn.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-06-27 05:43+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kannada <kn@li.org>\n"
14+"Language: kn\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/ko.po+45−7
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-08-19 13:02+0000\n"
1212"Last-Translator: MinSik CHO <Unknown>\n"
1313"Language-Team: Korean <ko@li.org>\n"
14+"Language: ko\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -131,7 +133,8 @@ msgid ""
131133"You have now mastered the edge gestures and can start using the "
132134"phone<br><br>Tap on the screen to start"
133135msgstr ""
134−"여러분은 가장자리에서 끌어오기 제스쳐를 완벽히 익히셨고 휴대 전화를 사용할 수 있습니다. <br><br> 스크린을 터치해서 시작하세요."
136+"여러분은 가장자리에서 끌어오기 제스쳐를 완벽히 익히셨고 휴대 전화를 사용할 "
137+"수 있습니다. <br><br> 스크린을 터치해서 시작하세요."
135138
136139#: qml/Components/Lockscreen.qml:167
137140msgid "Please wait"
@@ -345,13 +348,48 @@ msgstr "마지막 시도입니다."
345348msgid ""
346349"If passphrase is entered incorrectly, your phone will conduct a factory "
347350"reset and all personal data will be deleted."
348−msgstr "이번에도 올바르지 않은 패스프레이즈를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
351+msgstr ""
352+"이번에도 올바르지 않은 패스프레이즈를 입력하면 휴대 전화를 공장 초기화하여 모"
353+"든 개인 정보를 삭제합니다."
349354
350355#: qml/Shell.qml:368
351356msgid ""
352357"If passcode is entered incorrectly, your phone will conduct a factory reset "
353358"and all personal data will be deleted."
354−msgstr "이번에도 올바르지 않은 패스코드를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
359+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 "패스코드를 입력해주십시오."
355393
356−#~ msgid "Manage Dash"
357−#~ msgstr "대시 관리"
394+#~ msgid "Enter %1"
395+#~ msgstr "%1 입력"
po/ku.po+65−52
@@ -7,14 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-09-10 13:14+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Kurdish <ku@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1819"X-Generator: Launchpad (build 17196)\n"
1920
2021#: plugins/LightDM/Greeter.cpp:130
@@ -30,6 +31,25 @@ msgstr "Kurteriyê pêveke"
3031msgid "Unpin shortcut"
3132msgstr "Derzîdanka kurteriyê rake"
3233
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+
3353#: qml/Components/Dialogs.qml:70
3454msgid "Log out"
3555msgstr "Derkeve"
@@ -135,40 +155,23 @@ msgid ""
135155msgstr ""
136156"Tu tevgerên kêlekê fêr bûyî<br><br>Ji bo destpêkirinê ekranê bipelîne"
137157
138−#: qml/Components/Lockscreen.qml:167
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
158+#: qml/Components/Lockscreen.qml:220
147159msgid "Emergency Call"
148160msgstr "Lêgerîna Lezgîn"
149161
150−#: qml/Components/Lockscreen.qml:226
162+#: qml/Components/Lockscreen.qml:252
151163msgid "OK"
152164msgstr "BAŞ E"
153165
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
164167msgid "See less"
165168msgstr "Hindiktir bibîne"
166169
167−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
168171msgid "See all"
169172msgstr "Tevî bibîne"
170173
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172175#: qml/Panel/SearchIndicator.qml:27
173176msgid "Search"
174177msgstr "Lêgerîn"
@@ -205,6 +208,14 @@ msgstr "Binirxîne"
205208msgid "Send"
206209msgstr "Bişîne"
207210
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+
208219#: qml/Dash/ScopesOverview.qml:206
209220msgid "Manage Scopes"
210221msgstr ""
@@ -226,8 +237,8 @@ msgid "All"
226237msgstr "Hemû"
227238
228239#: qml/Greeter/Greeter.qml:157
229−msgid "Swipe to unlock"
230−msgstr "Ji bo vekirinê kaş bike"
240+msgid "Unlock"
241+msgstr ""
231242
232243#: qml/Hud/HudParametrizedActionsPage.qml:139
233244msgid "Confirm"
@@ -249,18 +260,10 @@ msgstr "Niha biaxive..."
249260msgid "Speaking..."
250261msgstr "Diaxive..."
251262
252−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
253264msgid "Show password"
254265msgstr "Şîfreyê nîşan bide"
255266
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−
264267#: qml/Panel/ActiveCallHint.qml:77
265268msgid "Tap to return to call..."
266269msgstr "Ji bo vegerî lêgerînê bipelîne..."
@@ -305,45 +308,49 @@ msgstr "Kilîda SIMê veke"
305308msgid "Roaming"
306309msgstr "Geriyan"
307310
308−#: qml/Shell.qml:320
309−msgid "Enter your passphrase"
310−msgstr "Parolaya xwe binivîse"
311+#: qml/Shell.qml:346
312+msgid "Enter passphrase"
313+msgstr ""
311314
312−#: qml/Shell.qml:321
315+#: qml/Shell.qml:347
313316msgid "Sorry, incorrect passphrase"
314317msgstr "Bibore, parola çewt e"
315318
316−#: qml/Shell.qml:323
317−msgid "Enter your passcode"
318−msgstr "Parolaya xwe binivîse"
319+#: qml/Shell.qml:348
320+msgid "Please re-enter"
321+msgstr ""
322+
323+#: qml/Shell.qml:350
324+msgid "Enter passcode"
325+msgstr ""
319326
320−#: qml/Shell.qml:324
327+#: qml/Shell.qml:351
321328msgid "Sorry, incorrect passcode"
322329msgstr "Bibore, parola çewrt e"
323330
324−#: qml/Shell.qml:327
331+#: qml/Shell.qml:354
325332#, qt-format
326−msgid "Enter your %1"
327−msgstr "%1a xwe binivîse"
333+msgid "Enter %1"
334+msgstr ""
328335
329−#: qml/Shell.qml:328
336+#: qml/Shell.qml:355
330337#, qt-format
331338msgid "Sorry, incorrect %1"
332339msgstr "Bibore, %1 çewt e"
333340
334−#: qml/Shell.qml:363
341+#: qml/Shell.qml:390
335342msgid "Sorry, incorrect passphrase."
336343msgstr "Bibore, parola çewt e."
337344
338−#: qml/Shell.qml:364
345+#: qml/Shell.qml:391
339346msgid "Sorry, incorrect passcode."
340347msgstr "Bibore, parola çewt e."
341348
342−#: qml/Shell.qml:365
349+#: qml/Shell.qml:392
343350msgid "This will be your last attempt."
344351msgstr "Ev ê ceribandina dawiyê be."
345352
346−#: qml/Shell.qml:367
353+#: qml/Shell.qml:394
347354msgid ""
348355"If passphrase is entered incorrectly, your phone will conduct a factory "
349356"reset and all personal data will be deleted."
@@ -351,10 +358,16 @@ msgstr ""
351358"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
352359"hemû daneyên te yên taybet dê bên jêbirin."
353360
354−#: qml/Shell.qml:368
361+#: qml/Shell.qml:395
355362msgid ""
356363"If passcode is entered incorrectly, your phone will conduct a factory reset "
357364"and all personal data will be deleted."
358365msgstr ""
359366"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
360367"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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-06-27 06:17+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kirghiz <ky@li.org>\n"
14+"Language: ky\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/lo.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-10-02 10:00+0000\n"
1212"Last-Translator: Anousak <anousak@gmail.com>\n"
1313"Language-Team: Lao <lo@li.org>\n"
14+"Language: \n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/lt.po+5−2
@@ -6,15 +6,18 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-05-19 17:15+0000\n"
1212"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
1313"Language-Team: Lithuanian <lt@li.org>\n"
14+"Language: lt\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
po/lv.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-08-21 09:46+0000\n"
1212"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
1313"Language-Team: Latvian <lv@li.org>\n"
14+"Language: lv\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/ml.po+5−4
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
1212"Last-Translator: ST Alfas <Unknown>\n"
1313"Language-Team: Malayalam <ml@li.org>\n"
14+"Language: ml\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -121,8 +123,7 @@ msgstr "ഇടത് വശം"
121123#: qml/Components/EdgeDemo.qml:199
122124msgid "Swipe from the left to reveal the launcher for quick access to apps"
123125msgstr ""
124−"പ്രയോഗങ്ങള്‍ പെട്ടെന്ന് ലഭ്യമാക്കുന്ന വിക്ഷേപിക ലഭ്യമാക്കാന്‍ ഇടതു വശത്ത് "
125−"നിന്നും സ്വൈപ് ചെയ്യുക"
126+"പ്രയോഗങ്ങള്‍ പെട്ടെന്ന് ലഭ്യമാക്കുന്ന വിക്ഷേപിക ലഭ്യമാക്കാന്‍ ഇടതു വശത്ത് നിന്നും സ്വൈപ് ചെയ്യുക"
126127
127128#: qml/Components/EdgeDemo.qml:226
128129msgid "Well done"
po/mr.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-14 19:54+0000\n"
1212"Last-Translator: Rohan Deshmukh <Unknown>\n"
1313"Language-Team: Marathi <mr@li.org>\n"
14+"Language: mr\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/ms.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-17 09:05+0000\n"
1212"Last-Translator: abuyop <Unknown>\n"
1313"Language-Team: Malay <ms@li.org>\n"
14+"Language: ms\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/my.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-12-12 11:12+0000\n"
1212"Last-Translator: Pyae Sone <Unknown>\n"
1313"Language-Team: Burmese <my@li.org>\n"
14+"Language: my\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/nb.po+43−7
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Åka Sikrom <Unknown>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
14+"Language: nb\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -208,7 +210,7 @@ msgstr "Send"
208210
209211#: qml/Dash/ScopesOverview.qml:206
210212msgid "Manage Scopes"
211−msgstr ""
213+msgstr "Håndter virkefelt"
212214
213215#: qml/Dash/ScopesOverview.qml:428
214216msgid "Done"
@@ -272,7 +274,7 @@ msgstr "Konferanse"
272274
273275#: qml/Panel/Indicators/MenuItemFactory.qml:600
274276msgid "Nothing is playing"
275−msgstr ""
277+msgstr "Ingenting spilles nå"
276278
277279#: qml/Panel/Indicators/MenuItemFactory.qml:748
278280msgid "In queue…"
@@ -360,5 +362,39 @@ msgstr ""
360362"Hvis du skriver feil kode en gang til, tilbakestilles telefonen til "
361363"fabrikkinnstillinger, og alle personlige data slettes."
362364
363−#~ msgid "Manage Dash"
364−#~ msgstr "Håndter dashbord"
365+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: rob <linuxned@gmail.com>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
14+"Language: nl\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,41 @@ msgstr ""
360362"Wanneer de toegangscode nu opnieuw onjuist wordt ingevoerd, zal uw telefoon "
361363"teruggaan naar de fabrieksinstellingen en zal al uw eigen data verloren gaan."
362364
363−#~ msgid "Manage Dash"
364−#~ msgstr "Snelzoeker-beheer"
365+#~ msgid "Device Locked"
366+#~ msgstr "Apparaat vergrendeld"
367+
368+#~ msgid "You have been locked out due to too many failed passphrase attempts."
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-08-18 20:25+0000\n"
1212"Last-Translator: Paweł Stroka <pawstr@gmail.com>\n"
1313"Language-Team: Polish <pl@li.org>\n"
14+"Language: pl\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
@@ -133,8 +136,8 @@ msgid ""
133136"You have now mastered the edge gestures and can start using the "
134137"phone<br><br>Tap on the screen to start"
135138msgstr ""
136−"Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do "
137−"pracy.<br><br>Dotknij ekranu by rozpocząć"
139+"Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do pracy."
140+"<br><br>Dotknij ekranu by rozpocząć"
138141
139142#: qml/Components/Lockscreen.qml:167
140143msgid "Please wait"
po/pt.po+39−5
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
1313"Language-Team: Portuguese <pt@li.org>\n"
14+"Language: pt\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -361,5 +363,37 @@ msgstr ""
361363"Se a senha for introduzida incorretamente, o seu telemóvel vai apagar todos "
362364"os seus dados pessoais."
363365
364−#~ msgid "Manage Dash"
365−#~ msgstr "Gerir o Dash"
366+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Rafael Neri <Unknown>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
14+"Language: pt_BR\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n > 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -82,7 +84,7 @@ msgstr "Desligar"
8284
8385#: qml/Components/Dialogs.qml:157
8486msgid "Restart"
85−msgstr ""
87+msgstr "Reiniciar"
8688
8789#: qml/Components/Dialogs.qml:167
8890msgid "Cancel"
@@ -210,7 +212,7 @@ msgstr "Enviar"
210212
211213#: qml/Dash/ScopesOverview.qml:206
212214msgid "Manage Scopes"
213−msgstr ""
215+msgstr "Gerenciar Plugins"
214216
215217#: qml/Dash/ScopesOverview.qml:428
216218msgid "Done"
@@ -274,7 +276,7 @@ msgstr "Conferência"
274276
275277#: qml/Panel/Indicators/MenuItemFactory.qml:600
276278msgid "Nothing is playing"
277−msgstr ""
279+msgstr "Nada está tocando"
278280
279281#: qml/Panel/Indicators/MenuItemFactory.qml:748
280282msgid "In queue…"
@@ -361,6 +363,3 @@ msgid ""
361363msgstr ""
362364"Se o código de acesso for digitado incorretamente, o telefone será "
363365"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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Marian Vasile <marianvasile1972@gmail.com>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
14+"Language: ro\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
19+"== 0) && (n != 0))) ? 2: 1));\n"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
@@ -106,8 +109,7 @@ msgstr "Marginea de sus"
106109
107110#: qml/Components/EdgeDemo.qml:145
108111msgid "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"
111113
112114#: qml/Components/EdgeDemo.qml:170
113115msgid "Close"
@@ -365,5 +367,41 @@ msgstr ""
365367"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
366368"șterse."
367369
368−#~ msgid "Manage Dash"
369−#~ msgstr "Administrare Panou principal"
370+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-08-29 08:06+0000\n"
1212"Last-Translator: Jay ZDLin <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
14+"Language: ru\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
@@ -80,7 +83,7 @@ msgstr "Отключить"
8083
8184#: qml/Components/Dialogs.qml:157
8285msgid "Restart"
83−msgstr ""
86+msgstr "Перезагрузить"
8487
8588#: qml/Components/Dialogs.qml:167
8689msgid "Cancel"
po/shn.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-10-07 11:46+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Shan <shn@li.org>\n"
14+"Language: shn\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/si.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Sinhalese <si@li.org>\n"
14+"Language: \n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/sl.po+44−6
@@ -6,15 +6,18 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
14+"Language: sl\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
@@ -274,7 +277,7 @@ msgstr "Konferenca"
274277
275278#: qml/Panel/Indicators/MenuItemFactory.qml:600
276279msgid "Nothing is playing"
277−msgstr ""
280+msgstr "Nič se ne predvaja"
278281
279282#: qml/Panel/Indicators/MenuItemFactory.qml:748
280283msgid "In queue…"
@@ -362,5 +365,40 @@ msgstr ""
362365"Če je vneseno nepravilno geslo, bo telefon ponastavljen na tovarniške "
363366"nastavitve ter vsi osebni podatki bodo izbrisani."
364367
365−#~ msgid "Manage Dash"
366−#~ msgstr "Upravljaj s pregledno ploščo"
368+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-15 13:51+0000\n"
1212"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
1313"Language-Team: Albanian <sq@li.org>\n"
14+"Language: sq\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:19+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/sr.po+5−5
@@ -6,15 +6,18 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-09-24 13:29+0000\n"
1212"Last-Translator: Данило Шеган <Unknown>\n"
1313"Language-Team: Serbian <sr@li.org>\n"
14+"Language: sr\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
@@ -359,6 +362,3 @@ msgid ""
359362msgstr ""
360363"Ако се унесе погрешан код, ваш телефон ће се ресетовати и сви лични подаци "
361364"ће бити обрисани."
362−
363−#~ msgid "Manage Dash"
364−#~ msgstr "Управљај Полицом"
po/sv.po+39−6
@@ -6,17 +6,18 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Josef Andersson <Unknown>\n"
1313"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
14+"Language: sv\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
19−"Language: sv\n"
2021
2122#: plugins/LightDM/Greeter.cpp:130
2223msgid "Password: "
@@ -361,5 +362,37 @@ msgstr ""
361362"Om lösenkoden anges felaktigt kommer telefonen att fabrikåterställas och all "
362363"personlig data kommer att tas bort."
363364
364−#~ msgid "Manage Dash"
365−#~ msgstr "Hantera Dash"
365+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-14 19:28+0000\n"
1212"Last-Translator: Damas <Unknown>\n"
1313"Language-Team: Swahili <sw@li.org>\n"
14+"Language: sw\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/ta.po+5−5
@@ -6,17 +6,18 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
1212"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
14+"Language: ta\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
19−"Language: ta\n"
2021
2122#: plugins/LightDM/Greeter.cpp:130
2223msgid "Password: "
@@ -122,8 +123,7 @@ msgstr "இடது விளிம்பு"
122123#: qml/Components/EdgeDemo.qml:199
123124msgid "Swipe from the left to reveal the launcher for quick access to apps"
124125msgstr ""
125−"பயன்பாடுகளின் விரைவான அணுகலை பெறத்தேவையான தொடக்கியை இடமிருந்து தேய்த்தால் "
126−"வெளிப்படும்"
126+"பயன்பாடுகளின் விரைவான அணுகலை பெறத்தேவையான தொடக்கியை இடமிருந்து தேய்த்தால் வெளிப்படும்"
127127
128128#: qml/Components/EdgeDemo.qml:226
129129msgid "Well done"
po/te.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-07-19 10:04+0000\n"
1212"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
1313"Language-Team: Telugu <te@li.org>\n"
14+"Language: te\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/th.po+245−105
@@ -1,220 +1,360 @@
1−# Thai translation for unity
2−# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3−# This file is distributed under the same license as the unity package.
4−# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
1+# Thai translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
55#
66msgid ""
77msgstr ""
8−"Project-Id-Version: unity\n"
8+"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2013-06-26 22:58+0200\n"
11−"PO-Revision-Date: 2013-06-28 15:34+0000\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11+"PO-Revision-Date: 2014-10-02 04:55+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Thai <th@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2013-06-30 07:12+0000\n"
18−"X-Generator: Launchpad (build 16692)\n"
17+"Plural-Forms: nplurals=1; plural=0;\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19+"X-Generator: Launchpad (build 17196)\n"
1920
20−#: Applications/applications.js:23
21−msgid "Phone"
21+#: plugins/LightDM/Greeter.cpp:130
22+msgid "Password: "
2223msgstr ""
2324
24−#: Applications/applications.js:29
25−msgid "Camera"
25+#: plugins/Unity/Launcher/launcheritem.cpp:45
26+#: plugins/Unity/Launcher/launcheritem.cpp:91
27+msgid "Pin shortcut"
2628msgstr ""
2729
28−#: Applications/applications.js:35
29−msgid "Gallery"
30+#: plugins/Unity/Launcher/launcheritem.cpp:91
31+msgid "Unpin shortcut"
3032msgstr ""
3133
32−#: Applications/applications.js:40
33−msgid "Facebook"
34+#: qml/Components/DelayedLockscreen.qml:47
35+msgid "Device Locked"
3436msgstr ""
3537
36−#: Applications/applications.js:46
37−msgid "Browser"
38+#: qml/Components/DelayedLockscreen.qml:62
39+msgid "You have been locked out due to too many failed passphrase attempts."
3840msgstr ""
3941
40−#: Applications/applications.js:51
41−msgid "Twitter"
42+#: qml/Components/DelayedLockscreen.qml:63
43+msgid "You have been locked out due to too many failed passcode attempts."
4244msgstr ""
4345
44−#: Applications/applications.js:57
45−msgid "GMail"
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+
53+#: qml/Components/Dialogs.qml:70
54+msgid "Log out"
4655msgstr ""
4756
48−#: Applications/applications.js:62
49−msgid "Weather"
57+#: qml/Components/Dialogs.qml:71
58+msgid "Are you sure you want to log out?"
5059msgstr ""
5160
52−#: Applications/applications.js:68
53−msgid "Notepad"
61+#: qml/Components/Dialogs.qml:73 qml/Components/Dialogs.qml:97
62+#: qml/Components/Dialogs.qml:122
63+msgid "No"
5464msgstr ""
5565
56−#: Applications/applications.js:74
57−msgid "Calendar"
66+#: qml/Components/Dialogs.qml:80 qml/Components/Dialogs.qml:104
67+#: qml/Components/Dialogs.qml:129
68+msgid "Yes"
5869msgstr ""
5970
60−#: Applications/applications.js:80
61−msgid "Media Player"
71+#: qml/Components/Dialogs.qml:94
72+msgid "Shut down"
6273msgstr ""
6374
64−#: Applications/applications.js:86
65−msgid "Evernote"
75+#: qml/Components/Dialogs.qml:95
76+msgid "Are you sure you want to shut down?"
6677msgstr ""
6778
68−#: Applications/applications.js:91
69−msgid "Map"
79+#: qml/Components/Dialogs.qml:119
80+msgid "Reboot"
7081msgstr ""
7182
72−#: Applications/applications.js:96
73−msgid "Pinterest"
83+#: qml/Components/Dialogs.qml:120
84+msgid "Are you sure you want to reboot?"
7485msgstr ""
7586
76−#: Applications/applications.js:101
77−msgid "SoundCloud"
87+#: qml/Components/Dialogs.qml:144
88+msgid "Power"
7889msgstr ""
7990
80−#: Applications/applications.js:106
81−msgid "Wikipedia"
91+#: qml/Components/Dialogs.qml:145
92+msgid ""
93+"Are you sure you would like\n"
94+"to power off?"
8295msgstr ""
8396
84−#: Applications/applications.js:111
85−msgid "YouTube"
97+#: qml/Components/Dialogs.qml:147
98+msgid "Power off"
8699msgstr ""
87100
88−#: Components/PageHeader.qml:300
89−msgid "Recent searches"
101+#: qml/Components/Dialogs.qml:157
102+msgid "Restart"
90103msgstr ""
91104
92−#: Dash/DashApps.qml:65
93−msgid "Running apps"
105+#: qml/Components/Dialogs.qml:167
106+msgid "Cancel"
94107msgstr ""
95108
96−#: Dash/DashApps.qml:68
97−msgid "Frequently used"
109+#: qml/Components/EdgeDemoOverlay.qml:151
110+msgid "Skip intro"
98111msgstr ""
99112
100−#: Dash/DashApps.qml:71
101−msgid "Installed"
113+#: qml/Components/EdgeDemo.qml:112
114+msgid "Right edge"
102115msgstr ""
103116
104−#: Dash/DashApps.qml:74
105−msgid "Available for download"
117+#: qml/Components/EdgeDemo.qml:113
118+msgid "Try swiping from the right edge to unlock the phone"
106119msgstr ""
107120
108−#: Dash/DashApps.qml:178
109−msgid "Apps"
121+#: qml/Components/EdgeDemo.qml:144
122+msgid "Top edge"
110123msgstr ""
111124
112−#: Dash/DashHome.qml:40
113−msgid "Frequent Apps"
125+#: qml/Components/EdgeDemo.qml:145
126+msgid "Try swiping from the top edge to access the indicators"
114127msgstr ""
115128
116−#: Dash/DashHome.qml:43
117−msgid "Recent Music"
129+#: qml/Components/EdgeDemo.qml:170
130+msgid "Close"
118131msgstr ""
119132
120−#: Dash/DashHome.qml:46
121−msgid "Videos Popular Online"
133+#: qml/Components/EdgeDemo.qml:171
134+msgid "Swipe up again to close the settings screen"
122135msgstr ""
123136
124−#: Dash/DashHome.qml:175
125−msgid "Home"
137+#: qml/Components/EdgeDemo.qml:198
138+msgid "Left edge"
126139msgstr ""
127140
128−#: Dash/DashMusic.qml:27 Dash/DashVideos.qml:28
129−msgid "Featured"
141+#: qml/Components/EdgeDemo.qml:199
142+msgid "Swipe from the left to reveal the launcher for quick access to apps"
130143msgstr ""
131144
132−#: Dash/DashMusic.qml:28 Dash/DashVideos.qml:29
133−msgid "Recent"
145+#: qml/Components/EdgeDemo.qml:226
146+msgid "Well done"
134147msgstr ""
135148
136−#: Dash/DashMusic.qml:29 Dash/DashVideos.qml:30
137−msgid "New Releases"
149+#: qml/Components/EdgeDemo.qml:227
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"
138153msgstr ""
139154
140−#: Dash/DashMusic.qml:30
141−msgid "Top Charting"
155+#: qml/Components/Lockscreen.qml:220
156+msgid "Emergency Call"
142157msgstr ""
143158
144−#: Dash/DashMusic.qml:99
145−msgid "Music"
159+#: qml/Components/Lockscreen.qml:252
160+msgid "OK"
146161msgstr ""
147162
148−#: Dash/DashVideos.qml:31
149−msgid "Popular Online"
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164+msgid "See less"
150165msgstr ""
151166
152−#: Dash/DashVideos.qml:155
153−msgid "Videos"
167+#: qml/Dash/GenericScopeView.qml:434
168+msgid "See all"
154169msgstr ""
155170
156−#: Dash/Video/VideoPreview.qml:98
157−msgid "Directed by:"
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172+#: qml/Panel/SearchIndicator.qml:27
173+msgid "Search"
158174msgstr ""
159175
160−#: Dash/Video/VideoPreview.qml:121
161−msgid "Starring:"
176+#: qml/Dash/PageHeader.qml:268
177+msgid "Settings"
162178msgstr ""
163179
164−#: Dash/Video/VideoPreview.qml:144
165−msgid "Author:"
180+#: qml/Dash/PageHeader.qml:275
181+msgid "Remove from Favorites"
166182msgstr ""
167183
168−#: Greeter/Lockscreen.qml:133
169−msgid "Emergency call"
184+#: qml/Dash/PageHeader.qml:275
185+msgid "Add to Favorites"
170186msgstr ""
171187
172−#: Greeter/PassphraseLockscreen.qml:59
173−#, qt-format
174−msgid "Hello %1"
188+#: qml/Dash/Previews/PreviewActionCombo.qml:35
189+msgid "More..."
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…"
175214msgstr ""
176215
177−#: Greeter/PassphraseLockscreen.qml:59
178−msgid "Hello"
216+#: qml/Dash/ScopesOverview.qml:206
217+msgid "Manage Scopes"
179218msgstr ""
180219
181−#: Hud/HudParametrizedActionsPage.qml:132
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+
240+#: qml/Hud/HudParametrizedActionsPage.qml:139
182241msgid "Confirm"
183242msgstr ""
184243
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
186245msgid "Type or say a command"
187246msgstr ""
188247
189−#: Hud/Hud.qml:84
248+#: qml/Hud/Hud.qml:84
190249msgid "Loading. Please Wait..."
191250msgstr ""
192251
193−#: Hud/Hud.qml:89
252+#: qml/Hud/Hud.qml:89
194253msgid "Speak Now..."
195254msgstr ""
196255
197−#: Hud/Hud.qml:94
256+#: qml/Hud/Hud.qml:94
198257msgid "Speaking..."
199258msgstr ""
200259
201−#: Panel/MenuContent.qml:192
202−msgid "Device"
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261+msgid "Show password"
203262msgstr ""
204263
205−#: Panel/Menus/Overview/FlightModeWidget.qml:42
206−msgid "Flight mode"
264+#: qml/Panel/ActiveCallHint.qml:77
265+msgid "Tap to return to call..."
207266msgstr ""
208267
209−#: Panel/SearchIndicator.qml:26
210−msgid "Search"
268+#: qml/Panel/ActiveCallHint.qml:90
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"
211282msgstr ""
212283
213−#: plugins/Unity/scope.cpp:268
214−msgid "Sorry, there is nothing that matches your search."
284+#: qml/Panel/Indicators/MenuItemFactory.qml:754
285+msgid "Paused, tap to resume"
215286msgstr ""
216287
217−#: Shell.qml:383
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+
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
218334#, 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."
220360msgstr ""
po/tr.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-07-16 17:58+0000\n"
1212"Last-Translator: Volkan Gezer <Unknown>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
14+"Language: tr\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/ug.po+38−5
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Gheyret T.Kenji <Unknown>\n"
1313"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
14+"Language: \n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -360,5 +362,36 @@ msgstr ""
360362"ئەگەر ئىم كودى توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن "
361363"چىققان ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
362364
363−#~ msgid "Manage Dash"
364−#~ msgstr "باش تاختىنى باشقۇرۇش"
365+#~ msgid "Device Locked"
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 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"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"
1212"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
1313"Language-Team: Ukrainian <uk@li.org>\n"
14+"Language: uk\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\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"
20+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1821"X-Generator: Launchpad (build 17196)\n"
1922
2023#: plugins/LightDM/Greeter.cpp:130
@@ -363,5 +366,42 @@ msgstr ""
363366"Якщо код-пароль буде вказано неправильно, телефон повернеться до початкового "
364367"стану, усі особисті дані буде вилучено."
365368
366−#~ msgid "Manage Dash"
367−#~ msgstr "Керування панеллю"
369+#~ msgid "Device Locked"
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 ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"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"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,6 +16,7 @@ msgstr ""
1616"MIME-Version: 1.0\n"
1717"Content-Type: text/plain; charset=UTF-8\n"
1818"Content-Transfer-Encoding: 8bit\n"
19+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
1920
2021#: plugins/LightDM/Greeter.cpp:130
2122msgid "Password: "
@@ -30,6 +31,25 @@ msgstr ""
3031msgid "Unpin shortcut"
3132msgstr ""
3233
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+
3353#: qml/Components/Dialogs.qml:70
3454msgid "Log out"
3555msgstr ""
@@ -132,40 +152,23 @@ msgid ""
132152"phone<br><br>Tap on the screen to start"
133153msgstr ""
134154
135−#: qml/Components/Lockscreen.qml:167
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
155+#: qml/Components/Lockscreen.qml:220
144156msgid "Emergency Call"
145157msgstr ""
146158
147−#: qml/Components/Lockscreen.qml:226
159+#: qml/Components/Lockscreen.qml:252
148160msgid "OK"
149161msgstr ""
150162
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
161164msgid "See less"
162165msgstr ""
163166
164−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
165168msgid "See all"
166169msgstr ""
167170
168−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
169172#: qml/Panel/SearchIndicator.qml:27
170173msgid "Search"
171174msgstr ""
@@ -202,6 +205,14 @@ msgstr ""
202205msgid "Send"
203206msgstr ""
204207
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+
205216#: qml/Dash/ScopesOverview.qml:206
206217msgid "Manage Scopes"
207218msgstr ""
@@ -223,7 +234,7 @@ msgid "All"
223234msgstr ""
224235
225236#: qml/Greeter/Greeter.qml:157
226−msgid "Swipe to unlock"
237+msgid "Unlock"
227238msgstr ""
228239
229240#: qml/Hud/HudParametrizedActionsPage.qml:139
@@ -246,18 +257,10 @@ msgstr ""
246257msgid "Speaking..."
247258msgstr ""
248259
249−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
250261msgid "Show password"
251262msgstr ""
252263
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−
261264#: qml/Panel/ActiveCallHint.qml:77
262265msgid "Tap to return to call..."
263266msgstr ""
@@ -302,51 +305,55 @@ msgstr ""
302305msgid "Roaming"
303306msgstr ""
304307
305−#: qml/Shell.qml:320
306−msgid "Enter your passphrase"
308+#: qml/Shell.qml:346
309+msgid "Enter passphrase"
307310msgstr ""
308311
309−#: qml/Shell.qml:321
312+#: qml/Shell.qml:347
310313msgid "Sorry, incorrect passphrase"
311314msgstr ""
312315
313−#: qml/Shell.qml:323
314−msgid "Enter your passcode"
316+#: qml/Shell.qml:348
317+msgid "Please re-enter"
318+msgstr ""
319+
320+#: qml/Shell.qml:350
321+msgid "Enter passcode"
315322msgstr ""
316323
317−#: qml/Shell.qml:324
324+#: qml/Shell.qml:351
318325msgid "Sorry, incorrect passcode"
319326msgstr ""
320327
321−#: qml/Shell.qml:327
328+#: qml/Shell.qml:354
322329#, qt-format
323−msgid "Enter your %1"
330+msgid "Enter %1"
324331msgstr ""
325332
326−#: qml/Shell.qml:328
333+#: qml/Shell.qml:355
327334#, qt-format
328335msgid "Sorry, incorrect %1"
329336msgstr ""
330337
331−#: qml/Shell.qml:363
338+#: qml/Shell.qml:390
332339msgid "Sorry, incorrect passphrase."
333340msgstr ""
334341
335−#: qml/Shell.qml:364
342+#: qml/Shell.qml:391
336343msgid "Sorry, incorrect passcode."
337344msgstr ""
338345
339−#: qml/Shell.qml:365
346+#: qml/Shell.qml:392
340347msgid "This will be your last attempt."
341348msgstr ""
342349
343−#: qml/Shell.qml:367
350+#: qml/Shell.qml:394
344351msgid ""
345352"If passphrase is entered incorrectly, your phone will conduct a factory "
346353"reset and all personal data will be deleted."
347354msgstr ""
348355
349−#: qml/Shell.qml:368
356+#: qml/Shell.qml:395
350357msgid ""
351358"If passcode is entered incorrectly, your phone will conduct a factory reset "
352359"and all personal data will be deleted."
po/vi.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-01-15 01:19+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Vietnamese <vi@li.org>\n"
14+"Language: vi\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/xh.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2013-09-28 13:20+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Xhosa <xh@li.org>\n"
14+"Language: xh\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=2; plural=n != 1;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/zh_CN.po+6−6
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-08-12 14:09+0000\n"
1212"Last-Translator: Anthony Wong <anthony.wong@ubuntu.com>\n"
1313"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
14+"Language: \n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -130,7 +132,8 @@ msgstr "做得好"
130132msgid ""
131133"You have now mastered the edge gestures and can start using the "
132134"phone<br><br>Tap on the screen to start"
133−msgstr "您现在已经掌握了边缘滑动手势,可以开始使用手机了<br><br>请点击屏幕开始使用"
135+msgstr ""
136+"您现在已经掌握了边缘滑动手势,可以开始使用手机了<br><br>请点击屏幕开始使用"
134137
135138#: qml/Components/Lockscreen.qml:167
136139msgid "Please wait"
@@ -351,6 +354,3 @@ msgid ""
351354"If passcode is entered incorrectly, your phone will conduct a factory reset "
352355"and all personal data will be deleted."
353356msgstr ""
354−
355−#~ msgid "Manage Dash"
356−#~ msgstr "管理 Dash"
po/zh_HK.po+4−2
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-08-10 11:45+0000\n"
1212"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
1313"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
14+"Language: zh_HK\n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
po/zh_TW.po+29−8
@@ -6,15 +6,17 @@
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9+"Report-Msgid-Bugs-To: \n"
1010"POT-Creation-Date: 2014-09-24 10:43+0100\n"
1111"PO-Revision-Date: 2014-07-26 16:21+0000\n"
1212"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
14+"Language: \n"
1415"MIME-Version: 1.0\n"
1516"Content-Type: text/plain; charset=UTF-8\n"
1617"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-09-29 05:20+0000\n"
18+"Plural-Forms: nplurals=1; plural=0;\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
1820"X-Generator: Launchpad (build 17196)\n"
1921
2022#: plugins/LightDM/Greeter.cpp:130
@@ -80,7 +82,7 @@ msgstr "關閉電源"
8082
8183#: qml/Components/Dialogs.qml:157
8284msgid "Restart"
83−msgstr ""
85+msgstr "重新啟動"
8486
8587#: qml/Components/Dialogs.qml:167
8688msgid "Cancel"
@@ -316,7 +318,7 @@ msgstr "輸入密碼"
316318
317319#: qml/Shell.qml:324
318320msgid "Sorry, incorrect passcode"
319−msgstr "抱歉,密碼不對"
321+msgstr "抱歉,passcode 不對"
320322
321323#: qml/Shell.qml:327
322324#, qt-format
@@ -334,7 +336,7 @@ msgstr "抱歉,密語不對"
334336
335337#: qml/Shell.qml:364
336338msgid "Sorry, incorrect passcode."
337−msgstr "抱歉,密碼不對。"
339+msgstr "抱歉,passcode 不對。"
338340
339341#: qml/Shell.qml:365
340342msgid "This will be your last attempt."
@@ -350,7 +352,26 @@ msgstr "如輸入的密語不對,本電話會進行重設,所有個人資料
350352msgid ""
351353"If passcode is entered incorrectly, your phone will conduct a factory reset "
352354"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"
354375
355−#~ msgid "Manage Dash"
356−#~ msgstr "管理 Dash"
376+#~ msgid "Enter %1"
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 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919
20−AbstractButton {
20+Item {
2121 id: emptyListItem
2222 width: parent ? parent.width : units.gu(31)
2323 height: body.height + bottomDividerLine.height
@@ -28,15 +28,6 @@ AbstractButton {
2828 */
2929 property bool selected: false
3030
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−
4031 /*!
4132 \preliminary
4233 Set to show or hide the thin bottom divider line (drawn by the \l ThinDivider component).
@@ -119,7 +110,7 @@ AbstractButton {
119110 right: parent.right
120111 bottom: bottomDividerLine.top
121112 }
122− pressed: (emptyListItem.selected || (emptyListItem.highlightWhenPressed && emptyListItem.pressed)) ? "pressed" : ""
113+ pressed: emptyListItem.selected
123114 }
124115 }
125116}
qml/Components/Lockscreen.qml+129−103
@@ -24,17 +24,24 @@ Showable {
2424 // Determine if a numeric or alphanumeric pad is used.
2525 property bool alphaNumeric: false
2626
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+
2733 // Informational text. (e.g. some text to tell which domain this is pin is entered for)
2834 property string infoText: ""
2935
3036 // Retries text (e.g. 3 retries left)
37+ // (This is not currently used, but will be necessary for SIM unlock screen)
3138 property string retryText: ""
3239
3340 // The text to be displayed in case the login failed
3441 property string errorText: ""
3542
36− // In case the Lockscreen can show a greeter message, this is the username
37− property string username: ""
43+ // If > 0, a forced delay is happening
44+ property int delayMinutes: 0
3845
3946 // Set those to a value greater 0 to restrict the pin length.
4047 // If both are unset, the Lockscreen will show a confirm button and allow typing any length of pin before
@@ -54,16 +61,7 @@ Showable {
5461 signal emergencyCall()
5562 signal infoPopupConfirmed()
5663
57− onRequiredChanged: {
58− if (required && pinPadLoader.item) {
59− clear(false)
60− }
61− }
62−
63− function forceDelay(delay) {
64− forcedDelayTimer.interval = delay
65− forcedDelayTimer.start()
66− }
64+ onActiveFocusChanged: if (activeFocus && pinPadLoader.item) pinPadLoader.item.forceActiveFocus()
6765
6866 function reset() {
6967 // This causes the loader below to destry and recreate the source
@@ -80,19 +78,17 @@ Showable {
8078 }
8179
8280 function showInfoPopup(title, text) {
83− PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
84− }
85−
86− Timer {
87− id: forcedDelayTimer
88− onTriggered: pinPadLoader.showWrongText = false
81+ var popup = PopupUtils.open(infoPopupComponent, root, {title: title, text: text})
82+ // FIXME: SDK will do this internally soonish
83+ popup.z = Number.MAX_VALUE
8984 }
9085
9186 Rectangle {
92− // In case background fails to load or is undefined
87+ // In case background fails to load
9388 id: backgroundBackup
9489 anchors.fill: parent
9590 color: "black"
91+ visible: root.background.toString() !== ""
9692 }
9793
9894 Image {
@@ -107,111 +103,141 @@ Showable {
107103
108104 MouseArea {
109105 anchors.fill: root
106+ onClicked: {
107+ if (pinPadLoader.item)
108+ pinPadLoader.item.forceActiveFocus()
109+ }
110110 }
111111
112− Loader {
113− id: pinPadLoader
114− objectName: "pinPadLoader"
115− anchors {
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
122− property bool waiting: false
123− property bool showWrongText: false
124−
125− source: (!resetting && root.required) ? (root.alphaNumeric ? "PassphraseLockscreen.qml" : "PinLockscreen.qml") : ""
126− onSourceChanged: {
127− waiting = false
128− showWrongText = false
129− }
130− onLoaded: {
131− if (forcedDelayTimer.running) {
132− pinPadLoader.item.clear(true)
112+ FocusScope {
113+ id: loaderScope
114+ anchors.fill: parent
115+
116+ Loader {
117+ id: pinPadLoader
118+ objectName: "pinPadLoader"
119+ anchors.fill: parent
120+ property bool resetting: false
121+ property bool waiting: false
122+ property bool showWrongText: false
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) {
130+ return "PassphraseLockscreen.qml"
131+ } else {
132+ return "PinLockscreen.qml"
133+ }
134+ }
135+ onSourceChanged: {
136+ waiting = false
137+ showWrongText = false
138+ if (loaderScope.activeFocus && pinPadLoader.item)
139+ pinPadLoader.item.forceActiveFocus()
133140 }
134− }
135141
136− Connections {
137− target: pinPadLoader.item
142+ Connections {
143+ target: pinPadLoader.item
138144
139− onEntered: {
140− pinPadLoader.waiting = true
141− root.entered(passphrase);
142− }
145+ onEntered: {
146+ pinPadLoader.waiting = true
147+ root.entered(passphrase);
148+ }
143149
144− onCancel: {
145− root.cancel()
150+ onCancel: {
151+ root.cancel()
152+ }
146153 }
147− }
148154
149− Binding {
150− target: pinPadLoader.item
151− property: "minPinLength"
152− value: root.minPinLength
153− }
154− Binding {
155− target: pinPadLoader.item
156− property: "maxPinLength"
157− value: root.maxPinLength
158− }
159− Binding {
160− target: pinPadLoader.item
161− property: "infoText"
162− value: root.infoText
163− }
164− Binding {
165− target: pinPadLoader.item
166− property: "retryText"
167− value: forcedDelayTimer.running ? i18n.tr("Please wait") : root.retryText
168− }
169− Binding {
170− target: pinPadLoader.item
171− property: "errorText"
172− value: forcedDelayTimer.running ? i18n.tr("Too many incorrect attempts") :
173− (pinPadLoader.showWrongText ? root.errorText : "")
174− }
175− Binding {
176− target: pinPadLoader.item
177− property: "username"
178− value: root.username
155+ Binding {
156+ target: pinPadLoader.item
157+ property: "minPinLength"
158+ value: root.minPinLength
159+ }
160+ Binding {
161+ target: pinPadLoader.item
162+ property: "maxPinLength"
163+ value: root.maxPinLength
164+ }
165+ Binding {
166+ target: pinPadLoader.item
167+ property: "infoText"
168+ value: root.infoText
169+ }
170+ Binding {
171+ target: pinPadLoader.item
172+ property: "retryText"
173+ value: root.retryText
174+ }
175+ Binding {
176+ target: pinPadLoader.item
177+ property: "errorText"
178+ value: pinPadLoader.showWrongText ? root.errorText : ""
179+ }
180+ Binding {
181+ target: pinPadLoader.item
182+ property: "entryEnabled"
183+ value: !pinPadLoader.waiting
184+ }
185+ Binding {
186+ target: pinPadLoader.item
187+ property: "alphaNumeric"
188+ value: root.alphaNumeric
189+ }
190+ Binding {
191+ target: pinPadLoader.item
192+ property: "delayMinutes"
193+ value: root.delayMinutes
194+ }
179195 }
180196 Binding {
181197 target: pinPadLoader.item
182− property: "entryEnabled"
183− value: !pinPadLoader.waiting && !forcedDelayTimer.running
198+ property: "showCancelButton"
199+ value: root.showCancelButton
184200 }
185201 }
186202
187− Label {
188− id: emergencyCallLabel
189− objectName: "emergencyCallLabel"
203+ Item {
204+ id: emergencyCallRow
190205
191− // FIXME: We *should* show emergency dialer if there is a SIM present,
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
206+ visible: showEmergencyCallButton
199207
200208 anchors {
201209 bottom: parent.bottom
202− bottomMargin: units.gu(4)
203− horizontalCenter: parent.horizontalCenter
210+ bottomMargin: units.gu(7) + (Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0)
211+ left: parent.left
212+ right: parent.right
204213 }
205214
206− text: i18n.tr("Emergency Call")
207− color: "#f3f3e7"
208− opacity: 0.6
209− }
215+ Label {
216+ id: emergencyCallLabel
217+ objectName: "emergencyCallLabel"
218+ anchors.horizontalCenter: parent.horizontalCenter
210219
211− MouseArea {
212− anchors.fill: emergencyCallLabel
213− onClicked: root.emergencyCall()
214− enabled: emergencyCallLabel.visible
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+
234+ MouseArea {
235+ anchors.top: emergencyCallLabel.top
236+ anchors.bottom: emergencyCallLabel.bottom
237+ anchors.left: emergencyCallLabel.left
238+ anchors.right: emergencyCallIcon.right
239+ onClicked: root.emergencyCall()
240+ }
215241 }
216242
217243 Component {
qml/Components/PassphraseLockscreen.qml+96−43
@@ -20,10 +20,12 @@ import "../Components"
2020
2121Item {
2222 id: root
23− height: highlightItem.height
23+ anchors.top: parent.top
24+ anchors.topMargin: units.gu(4)
25+ height: shakeContainer.height
2426
2527 property string infoText
26− property string username: ""
28+ property string errorText
2729 property bool entryEnabled: true
2830
2931 signal entered(string passphrase)
@@ -31,64 +33,115 @@ Item {
3133
3234 function clear(playAnimation) {
3335 pinentryField.text = "";
36+ pinentryField.incorrectOverride = false;
37+ pinentryField.forceActiveFocus();
3438 if (playAnimation) {
3539 wrongPasswordAnimation.start();
36− pinentryField.forceActiveFocus();
37− } else {
38− pinentryField.focus = false
3940 }
4041 }
4142
42− Rectangle {
43− id: highlightItem
44− width: units.gu(32)
45− height: units.gu(10)
46− anchors.centerIn: parent
47− color: Qt.rgba(0.1, 0.1, 0.1, 0.4)
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)
51− antialiasing: true
43+ onActiveFocusChanged: if (activeFocus) pinentryField.forceActiveFocus()
44+
45+ Column {
46+ id: shakeContainer
47+ anchors.horizontalCenter: parent.horizontalCenter
48+ width: parent.width
49+ spacing: units.gu(2)
5250
5351 Label {
54− objectName: "greeterLabel"
55− anchors {
56− left: parent.left
57− top: parent.top
58− right: parent.right
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"
52+ id: infoField
53+ objectName: "infoTextLabel"
54+ fontSize: "x-large"
55+ color: "#f3f3e7"
56+ anchors.horizontalCenter: parent.horizontalCenter
57+ text: root.infoText
6358 }
6459
65− TextField {
66− id: pinentryField
67− objectName: "pinentryField"
68− anchors {
69− horizontalCenter: parent.horizontalCenter
70− bottom: parent.bottom
71− margins: units.gu(1)
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
67+ objectName: "pinentryField"
68+
69+ property bool incorrectOverride: false
70+
71+ anchors {
72+ top: parent.top
73+ left: parent.left
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+ }
72109 }
73− height: units.gu(4.5)
74− width: parent.width - units.gu(2)
75− echoMode: TextInput.Password
76− opacity: 0.9
77− hasClearButton: false
78− enabled: root.entryEnabled
79− placeholderText: root.infoText
80−
81− onAccepted: {
82− if (pinentryField.text) {
83− root.entered(pinentryField.text);
110+
111+ Row {
112+ id: dotRow
113+ anchors.centerIn: entryContainer
114+
115+ property real dotSize: Math.min(units.gu(2), entryContainer.width / pinentryField.length)
116+ spacing: Math.min(units.gu(2), Math.max(0, (entryContainer.width / pinentryField.length) - dotSize))
117+
118+ Repeater {
119+ model: pinentryField.length
120+ delegate: Rectangle {
121+ color: "#f3f3e7"
122+ width: dotRow.dotSize
123+ height: width
124+ radius: width / 2
125+ }
84126 }
85127 }
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+ }
86139 }
87140 }
88141
89142 WrongPasswordAnimation {
90143 id: wrongPasswordAnimation
91144 objectName: "wrongPasswordAnimation"
92− target: pinentryField
145+ target: shakeContainer
93146 }
94147}
qml/Components/PinLockscreen.qml+11−5
@@ -21,7 +21,9 @@ import "../Components"
2121
2222Column {
2323 id: root
24− anchors.centerIn: parent
24+ anchors.top: parent.top
25+ anchors.topMargin: units.gu(4)
26+ anchors.horizontalCenter: parent.horizontalCenter
2527 spacing: units.gu(2)
2628
2729 property string infoText
@@ -31,6 +33,7 @@ Column {
3133 property int padHeight: units.gu(28)
3234 property int minPinLength: -1
3335 property int maxPinLength: -1
36+ property bool showCancelButton: true
3437
3538 signal entered(string passphrase)
3639 signal cancel()
@@ -49,7 +52,7 @@ Column {
4952 id: shakeContainer
5053 anchors.horizontalCenter: parent.horizontalCenter
5154 width: parent.width
52− spacing: units.gu(2)
55+ spacing: units.gu(1)
5356
5457 Label {
5558 id: infoField
@@ -108,8 +111,10 @@ Column {
108111 fontSize: "x-large"
109112 color: "#f3f3e7"
110113 anchors.horizontalCenter: parent.horizontalCenter
114+ horizontalAlignment: Text.AlignHCenter
111115 text: root.errorText
112116 visible: pinentryField.incorrectOverride
117+ scale: Math.min(1, parent.width / width)
113118 }
114119
115120 AbstractButton {
@@ -193,19 +198,20 @@ Column {
193198 }
194199 PinPadButton {
195200 iconName: "close"
196− height: numbersGrid.buttonHeight
201+ height: units.gu(5) // visual spec has this row a little closer in
197202 width: numbersGrid.buttonWidth
198203
199204 onClicked: root.cancel()
205+ visible: root.showCancelButton
200206 }
201207 Item {
202− height: numbersGrid.buttonHeight
208+ height: units.gu(5)
203209 width: numbersGrid.buttonWidth
204210 }
205211 PinPadButton {
206212 iconName: "tick"
207213 objectName: "confirmButton"
208− height: numbersGrid.buttonHeight
214+ height: units.gu(5)
209215 width: numbersGrid.buttonWidth
210216 enabled: root.enabled && pinentryField.text.length >= root.minPinLength
211217 visible: root.minPinLength == -1 || root.minPinLength !== root.maxPinLength
qml/Components/ResponsiveVerticalJournal.qml+3−2
@@ -47,7 +47,9 @@ Item {
4747 property alias delegate: verticalJournalView.delegate
4848 property alias displayMarginBeginning: verticalJournalView.displayMarginBeginning
4949 property alias displayMarginEnd: verticalJournalView.displayMarginEnd
50− implicitHeight: verticalJournalView.implicitHeight
50+
51+ implicitHeight: verticalJournalView.implicitHeight + rowSpacing
52+ clip: height < implicitHeight
5153
5254 VerticalJournal {
5355 id: verticalJournalView
@@ -59,7 +61,6 @@ Item {
5961 topMargin: rowSpacing / 2
6062 bottomMargin: rowSpacing / 2
6163 }
62− clip: parent.height != implicitHeight
6364
6465 function px2gu(pixels) {
6566 return Math.floor(pixels / units.gu(1))
qml/Dash/CardGrid.qml+1−1
@@ -69,7 +69,7 @@ DashRenderer {
6969 item.cardData = Qt.binding(function() { return model; });
7070 item.template = Qt.binding(function() { return cardTool.template; });
7171 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; });
7373 item.scopeStyle = root.scopeStyle;
7474 }
7575 Connections {
qml/Dash/CardHorizontalList.qml+1−1
@@ -50,7 +50,7 @@ DashRenderer {
5050 item.cardData = Qt.binding(function() { return model; });
5151 item.template = Qt.binding(function() { return cardTool.template; });
5252 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; });
5454 item.scopeStyle = root.scopeStyle;
5555 }
5656 Connections {
qml/Dash/CardTool.qml+18−13
@@ -131,21 +131,26 @@ Item {
131131 property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
132132
133133 /*!
134− \brief Desired alignment of header components.
134+ \brief Desired alignment of title
135135 */
136− readonly property int headerAlignment: {
137− var subtitle = components["subtitle"];
138− var price = components["price"];
139− var summary = components["summary"];
140−
141− var hasSubtitle = subtitle && (typeof subtitle === "string" || subtitle["field"])
142− var hasPrice = price && (typeof price === "string" || subtitle["field"]);
143− var hasSummary = summary && (typeof summary === "string" || summary["field"])
144−
145− var isOnlyTextComponent = !hasSubtitle && !hasPrice && !hasSummary;
146− if (!isOnlyTextComponent) return Text.AlignLeft;
136+ readonly property int titleAlignment: {
137+ if (template["card-layout"] === "horizontal"
138+ || (typeof components["title"] !== "object" &&
139+ components["title"]["align"] !== "center")) return Text.AlignLeft;
140+
141+ var keys = ["mascot", "emblem", "subtitle", "attributes", "summary"];
142+
143+ for (var key in keys) {
144+ key = keys[key];
145+ try {
146+ if (typeof components[key] === "string"
147+ || typeof components[key]["field"] === "string") return Text.AlignLeft;
148+ } catch (e) {
149+ continue;
150+ }
151+ }
147152
148− return (template["card-layout"] === "horizontal") ? Text.AlignLeft : Text.AlignHCenter;
153+ return Text.AlignHCenter;
149154 }
150155
151156 QtObject {
qml/Dash/CardVerticalJournal.qml+1−1
@@ -57,7 +57,7 @@ DashRenderer {
5757 item.cardData = Qt.binding(function() { return model; });
5858 item.template = Qt.binding(function() { return cardTool.template; });
5959 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; });
6161 item.scopeStyle = root.scopeStyle;
6262 }
6363 Connections {
qml/Dash/Dash.qml+4−4
@@ -29,7 +29,6 @@ Showable {
2929 visible: shown
3030
3131 property string showScopeOnLoaded: "clickscope"
32− property real contentScale: 1.0
3332
3433 DashCommunicatorService {
3534 objectName: "dashCommunicatorService"
@@ -41,8 +40,9 @@ Showable {
4140 if (window.active) {
4241 dashContentCache.scheduleUpdate();
4342 }
44− overviewController.enableAnimation = window.active;
43+ overviewController.enableAnimation = window.active && !scopesOverview.showingNonFavoriteScope;
4544 overviewController.progress = 0;
45+ scopesOverview.closeTempScope();
4646 }
4747 }
4848 }
@@ -190,7 +190,6 @@ Showable {
190190 dash.showScopeOnLoaded = ""
191191 }
192192 }
193− scale: dash.contentScale
194193 clip: scale != 1.0 || scopeItem.visible || overviewController.progress != 0
195194 Behavior on x {
196195 UbuntuNumberAnimation {
@@ -245,7 +244,7 @@ Showable {
245244 y: overviewController.progress == 0 ? dashContent.y : overviewProgressY
246245 width: parent.width
247246 height: parent.height
248− scale: dash.contentScale * overviewProgressScale
247+ scale: overviewProgressScale
249248 enabled: opacity == 1
250249 opacity: 1 - overviewController.progress
251250 clip: scale != 1.0
@@ -275,6 +274,7 @@ Showable {
275274 left: parent.left
276275 right: parent.right
277276 bottom: parent.bottom
277+ bottomMargin: Qt.inputMethod.keyboardRectangle.height
278278 }
279279 height: units.dp(3)
280280 color: scopeStyle.backgroundLuminance > 0.7 ? "#50000000" : "#50ffffff"
qml/Dash/DashRenderer.qml+2−2
@@ -17,9 +17,9 @@
1717import QtQuick 2.0
1818
1919Item {
20− property int collapsedHeight
20+ property real collapsedHeight
2121
22− property int expandedHeight
22+ property real expandedHeight
2323
2424 property int collapsedItemCount: -1
2525
qml/Dash/GenericScopeView.qml+36−23
@@ -15,7 +15,7 @@
1515 */
1616
1717import QtQuick 2.0
18−import Ubuntu.Components 0.1
18+import Ubuntu.Components 1.1
1919import Utils 0.1
2020import Unity 0.2
2121import Dash 0.1
@@ -213,7 +213,6 @@ FocusScope {
213213 delegate: ListItems.Base {
214214 id: baseItem
215215 objectName: "dashCategory" + category
216− highlightWhenPressed: false
217216 showDivider: false
218217
219218 property Item seeAllButton: seeAll
@@ -349,27 +348,6 @@ FocusScope {
349348 }
350349 Connections {
351350 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− }
373351 onOriginYChanged: rendererLoader.updateRanges();
374352 onContentYChanged: rendererLoader.updateRanges();
375353 onHeightChanged: rendererLoader.updateRanges();
@@ -540,6 +518,41 @@ FocusScope {
540518 }
541519 }
542520
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+
543556 AbstractButton {
544557 id: floatingSeeLess
545558 objectName: "floatingSeeLess"
qml/Dash/Previews/PreviewHeader.qml+13−1
@@ -16,12 +16,14 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import Dash 0.1
1920import "../"
2021
2122/*! This preview widget shows a header
2223 * The title comes in widgetData["title"]
2324 * The mascot comes in widgetData["mascot"]
2425 * The subtitle comes in widgetData["subtitle"]
26+ * The attributes comes in widgetData["attributes"]
2527 */
2628
2729PreviewWidget {
@@ -35,6 +37,7 @@ PreviewWidget {
3537 readonly property url mascot: root.widgetData["mascot"] || ""
3638 readonly property string title: root.widgetData["title"] || ""
3739 readonly property string subtitle: root.widgetData["subtitle"] || ""
40+ readonly property var attributes: root.widgetData["attributes"] || null
3841 readonly property color fontColor: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText
3942
4043 implicitHeight: row.height + row.margins * 2
@@ -97,7 +100,6 @@ PreviewWidget {
97100 font.weight: Font.Normal
98101 fontSize: "large"
99102 wrapMode: Text.Wrap
100− maximumLineCount: 2
101103 color: headerRoot.fontColor
102104 text: headerRoot.title
103105 }
@@ -115,6 +117,16 @@ PreviewWidget {
115117 text: headerRoot.subtitle
116118 }
117119 }
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+ }
118130 }
119131 }
120132 }
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 {
5050 right: parent.right
5151 }
5252 model: root.scope ? root.scope.settings : null
53+ clip: true
5354
5455 delegate: ScopeSettingsWidgetFactory {
5556 objectName: "scopeSettingItem" + index
qml/Dash/ScopesOverview.qml+9−1
@@ -89,6 +89,7 @@ Item {
8989 } else {
9090 root.allFavoriteSelected(scopeId);
9191 }
92+ previewListView.open = false;
9293 }
9394 }
9495
@@ -98,6 +99,14 @@ Item {
9899 value: progress === 1
99100 }
100101
102+ function closeTempScope() {
103+ if (tempScopeItem.scope) {
104+ root.scope.closeScope(tempScopeItem.scope);
105+ tempScopeItem.scope = null;
106+ tempScopeItem.backClicked()
107+ }
108+ }
109+
101110 function animateDashFromAll(scopeId) {
102111 var currentScopePos = allScopeCardPosition(scopeId);
103112 if (currentScopePos) {
@@ -531,7 +540,6 @@ Item {
531540
532541 width: parent.width
533542 height: parent.height
534− scale: dash.contentScale
535543 clip: scale != 1.0
536544 visible: scope != null
537545 hasBackAction: true
qml/Dash/ScopesOverviewFavorites.qml+1−1
@@ -63,7 +63,7 @@ Flickables.Flickable {
6363 item.cardData = Qt.binding(function() { return model; });
6464 item.template = Qt.binding(function() { return cardTool.template; });
6565 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; });
6767 }
6868
6969 Connections {
qml/Greeter/Greeter.qml+14−2
@@ -36,7 +36,7 @@ Showable {
3636
3737 property alias dragHandleWidth: dragHandle.width
3838 property alias model: greeterContentLoader.model
39− property bool locked: shown && !LightDM.Greeter.promptless
39+ property bool locked: true
4040
4141 readonly property bool narrowMode: !multiUser && height > width
4242 readonly property bool multiUser: LightDM.Users.count > 1
@@ -57,6 +57,18 @@ Showable {
5757 }
5858 }
5959
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+
6072 onRequiredChanged: {
6173 // Reset hide animation to default once we're finished with it
6274 if (required) {
@@ -154,7 +166,7 @@ Showable {
154166 anchors.horizontalCenter: parent.horizontalCenter
155167 anchors.bottom: parent.bottom
156168 anchors.bottomMargin: units.gu(5)
157− text: i18n.tr("Swipe to unlock")
169+ text: "《 " + i18n.tr("Unlock") + " 》"
158170 color: "white"
159171 font.weight: Font.Light
160172
qml/Greeter/GreeterContent.qml+15
@@ -29,6 +29,18 @@ Item {
2929 signal selected(int uid)
3030 signal unlocked(int uid)
3131
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+
3244 Rectangle {
3345 // In case background fails to load
3446 id: backgroundBackup
@@ -47,6 +59,9 @@ Item {
4759 topMargin: backgroundTopMargin
4860 }
4961 fillMode: Image.PreserveAspectCrop
62+ // Limit how much memory we'll reserve for this image
63+ sourceSize.height: height
64+ sourceSize.width: width
5065 }
5166
5267 // See Shell.qml's backgroundSettings treatment for why we need a separate
qml/Greeter/LoginList.qml+19−6
@@ -36,6 +36,22 @@ Item {
3636 signal selected(int uid)
3737 signal unlocked(int uid)
3838
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+
3955 Keys.onEscapePressed: root.resetAuthentication()
4056
4157 Rectangle {
@@ -229,14 +245,11 @@ Item {
229245 }
230246
231247 MouseArea {
248+ id: passwordMouseArea
249+ objectName: "passwordMouseArea"
232250 anchors.fill: passwordInput
233251 enabled: LightDM.Greeter.promptless
234− onClicked: {
235− if (LightDM.Greeter.authenticated)
236− root.unlocked(userList.currentIndex);
237− else
238− root.resetAuthentication();
239− }
252+ onClicked: root.tryToUnlock()
240253 }
241254
242255 function resetAuthentication() {
qml/Launcher/Launcher.qml+1
@@ -92,6 +92,7 @@ Item {
9292 // machine and switch to the final state in the next event loop run
9393 Timer {
9494 id: animateTimer
95+ objectName: "animateTimer"
9596 interval: 1
9697 property string nextState: ""
9798 onTriggered: {
qml/Launcher/LauncherDelegate.qml+20−33
@@ -27,7 +27,7 @@ Item {
2727 property bool itemFocused: false
2828 property real maxAngle: 0
2929 property bool inverted: false
30− property bool clipCorner: false
30+ property alias pinned: pin.visible
3131
3232 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
3333 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
@@ -71,14 +71,31 @@ Item {
7171 height: root.itemHeight - units.gu(1)
7272 }
7373
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+
7487 UbuntuShape {
88+ id: countEmblem
7589 objectName: "countEmblem"
90+
91+ readonly property real pinMargin: pin.visible ? pin.width + units.gu(1) - anchors.leftMargin : 0
92+
7693 anchors {
7794 right: parent.right
7895 top: parent.top
7996 margins: units.dp(3)
8097 }
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)))
8299 height: units.gu(2)
83100 color: UbuntuColors.orange
84101 visible: root.countVisible
@@ -92,7 +109,7 @@ Item {
92109 // FIXME: verticalCenter seems to be off wee bit and QML doesn't have a centerLine
93110 // property for Text: https://bugreports.qt-project.org/browse/QTBUG-40479
94111 anchors.verticalCenterOffset: -units.dp(.5)
95− width: root.itemWidth - units.gu(1)
112+ width: root.itemWidth - units.gu(1) - countEmblem.pinMargin
96113 horizontalAlignment: Text.AlignHCenter
97114 elide: Text.ElideRight
98115 color: "white"
@@ -149,24 +166,6 @@ Item {
149166 }
150167 }
151168
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−
170169 ShaderEffect {
171170 id: transformEffect
172171 anchors.centerIn: parent
@@ -176,7 +175,6 @@ Item {
176175 property real itemOpacity: root.itemOpacity
177176 property real brightness: Math.max(-1, root.brightness)
178177 property real angle: root.angle
179− property bool clipCorner: root.clipCorner
180178 rotation: root.inverted ? 180 : 0
181179
182180 property variant source: ShaderEffectSource {
@@ -185,11 +183,6 @@ Item {
185183 hideSource: true
186184 }
187185
188− property var mask: ShaderEffectSource {
189− sourceItem: clipper
190− hideSource: true
191− }
192−
193186 transform: [
194187 // Rotating 3 times at top/bottom because that increases the perspective.
195188 // This is a hack, but as QML does not support real 3D coordinates
@@ -224,19 +217,13 @@ Item {
224217 fragmentShader: "
225218 varying highp vec2 qt_TexCoord0;
226219 uniform sampler2D source;
227− uniform sampler2D mask;
228220 uniform lowp float brightness;
229221 uniform lowp float itemOpacity;
230− uniform bool clipCorner;
231222 void main(void)
232223 {
233224 highp vec4 sourceColor = texture2D(source, qt_TexCoord0);
234− highp vec4 maskColor = texture2D(mask, qt_TexCoord0);
235225 sourceColor.rgb = mix(sourceColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
236226 sourceColor *= itemOpacity;
237− if (clipCorner) {
238− sourceColor *= maskColor.a;
239− }
240227 gl_FragColor = sourceColor;
241228 }"
242229 }
qml/Launcher/LauncherPanel.qml+5−14
@@ -66,15 +66,6 @@ Rectangle {
6666 }
6767 }
6868
69− ThinDivider {
70− anchors {
71− left: parent.left
72− right: parent.right
73− margins: -mainColumn.anchors.leftMargin
74− }
75− rotation: root.rotation
76− }
77−
7869 Item {
7970 anchors.left: parent.left
8071 anchors.right: parent.right
@@ -159,7 +150,7 @@ Rectangle {
159150 count: model.count
160151 countVisible: model.countVisible
161152 progress: model.progress
162− clipCorner: model.pinned
153+ pinned: model.pinned
163154 itemFocused: model.focused
164155 inverted: root.inverted
165156 z: -Math.abs(offset)
@@ -470,10 +461,10 @@ Rectangle {
470461 width: itemWidth
471462 rotation: root.rotation
472463 itemOpacity: 0.9
473− clipCorner: dndArea.draggedIndex > -1 &&
474− LauncherModel.get(dndArea.draggedIndex).pinned &&
475− !dndArea.preDragging &&
476− !dndArea.dragging
464+ pinned: dndArea.draggedIndex > -1 &&
465+ LauncherModel.get(dndArea.draggedIndex).pinned &&
466+ !dndArea.preDragging &&
467+ !dndArea.dragging
477468
478469 function flatten() {
479470 fakeDragItemAnimation.start();
qml/Notifications/NotificationMenuItemFactory.qml+77−5
@@ -19,6 +19,7 @@
1919
2020import QtQuick 2.0
2121import Ubuntu.Components 0.1
22+import QMenuModel 0.1
2223import "../Components"
2324
2425Loader {
@@ -26,7 +27,7 @@ Loader {
2627
2728 property QtObject menuModel: null
2829 property QtObject menuData: null
29− property int menuIndex
30+ property int menuIndex : -1
3031 property int maxHeight
3132 readonly property bool fullscreen: menuData.type === "com.canonical.snapdecision.pinlock"
3233
@@ -46,6 +47,13 @@ Loader {
4647 }
4748 }
4849
50+ function getExtendedProperty(object, propertyName, defaultValue) {
51+ if (object && object.hasOwnProperty(propertyName)) {
52+ return object[propertyName];
53+ }
54+ return defaultValue;
55+ }
56+
4957 Component {
5058 id: textfield
5159
@@ -121,14 +129,14 @@ Loader {
121129 right: parent.right
122130 }
123131 height: menuFactory.maxHeight
124− infoText: i18n.tr("Enter SIM PIN")
125− errorText: i18n.tr("Sorry, incorrect PIN")
126− minPinLength: 4
127− maxPinLength: 8
132+ infoText: notification.summary
133+ errorText: errorAction.valid ? errorAction.state : ""
134+ retryText: notification.body
128135 background: shell.background
129136
130137 onEntered: {
131138 menuModel.changeState(menuIndex, passphrase);
139+ clear(false);
132140 }
133141
134142 onCancel: {
@@ -139,6 +147,70 @@ Loader {
139147 shell.activateApplication("dialer-app")
140148 menuModel.activate(menuIndex, false)
141149 }
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+ }
142214 }
143215 }
144216}
qml/Panel/ActiveCallHint.qml+1−1
@@ -117,7 +117,7 @@ Item {
117117 verticalAlignment: Text.AlignVCenter
118118 horizontalAlignment: Text.AlignRight
119119 text: {
120− var m = Math.round(d.callTime/60);
120+ var m = Math.floor(d.callTime/60);
121121 var ss = d.callTime % 60;
122122 if (ss >= 10) {
123123 return m + ":" + ss;
qml/Panel/IndicatorItem.qml+6
@@ -39,6 +39,12 @@ Loader {
3939 }
4040 }
4141
42+ Binding {
43+ target: item
44+ property: "identifier"
45+ value: identifier
46+ }
47+
4248 Binding {
4349 target: item
4450 property: "objectName"
qml/Panel/Indicators/DefaultIndicatorPage.qml+1−1
@@ -131,7 +131,7 @@ IndicatorBase {
131131 visible: status == Loader.Ready
132132
133133 property int modelIndex: index
134− sourceComponent: factory.load(model, identifier)
134+ sourceComponent: factory.load(model, main.identifier)
135135
136136 onLoaded: {
137137 if (item.hasOwnProperty("selected")) {
qml/Panel/Indicators/IndicatorBase.qml+1
@@ -26,6 +26,7 @@ Item {
2626 enabled: menuObjectPath != ""
2727
2828 //const
29+ property string identifier
2930 property string busName
3031 property string actionsObjectPath
3132 property string menuObjectPath
qml/Panel/Indicators/MenuItemFactory.qml+19−4
@@ -283,12 +283,17 @@ Item {
283283 objectName: "checkableMenu"
284284 property QtObject menuData: null
285285 property int menuIndex: -1
286+ property bool serverChecked: menuData && menuData.isToggled || false
286287
287288 text: menuData && menuData.label || ""
288289 enabled: menuData && menuData.sensitive || false
289− checked: menuData && menuData.isToggled || false
290+ checked: serverChecked
290291 highlightWhenPressed: false
291292
293+ onServerCheckedChanged: {
294+ // value can be changed by menu, so a binding won't work.
295+ checked = serverChecked;
296+ }
292297 onTriggered: {
293298 menuModel.activate(menuIndex);
294299 }
@@ -302,13 +307,18 @@ Item {
302307 objectName: "switchMenu"
303308 property QtObject menuData: null
304309 property int menuIndex: -1
310+ property bool serverChecked: menuData && menuData.isToggled || false
305311
306312 text: menuData && menuData.label || ""
307313 iconSource: menuData && menuData.icon || ""
308314 enabled: menuData && menuData.sensitive || false
309− checked: menuData && menuData.isToggled || false
315+ checked: serverChecked
310316 highlightWhenPressed: false
311317
318+ onServerCheckedChanged: {
319+ // value can be changed by menu, so a binding won't work.
320+ checked = serverChecked;
321+ }
312322 onTriggered: {
313323 menuModel.activate(menuIndex);
314324 }
@@ -431,6 +441,7 @@ Item {
431441 property var menuModel: menuFactory.menuModel
432442 property int menuIndex: -1
433443 property var extendedData: menuData && menuData.ext || undefined
444+ property bool serverChecked: menuData && menuData.isToggled || false
434445
435446 property var strengthAction: UnityMenuAction {
436447 model: menuModel
@@ -440,12 +451,16 @@ Item {
440451
441452 text: menuData && menuData.label || ""
442453 enabled: menuData && menuData.sensitive || false
443− active: menuData && menuData.isToggled || false
454+ active: serverChecked
444455 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
445456 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
446457 signalStrength: strengthAction.valid ? strengthAction.state : 0
447458 highlightWhenPressed: false
448459
460+ onServerCheckedChanged: {
461+ // value can be changed by menu, so a binding won't work.
462+ active = serverChecked;
463+ }
449464 onMenuModelChanged: {
450465 loadAttributes();
451466 }
@@ -823,7 +838,7 @@ Item {
823838 }
824839
825840 function load(modelData, context) {
826− if (modelData.type !== undefined) {
841+ if (modelData.type !== undefined && modelData.type !== "") {
827842 var component = undefined;
828843
829844 var contextComponents = _map[context];
qml/Panel/Indicators/VisibleIndicators.qml+1
@@ -55,6 +55,7 @@ Item {
5555 delegate: IndicatorDelegate {
5656 id: item
5757 objectName: model.identifier + "-delegate"
58+ identifier: model.identifier
5859 Component.onCompleted: {
5960 for(var pName in indicatorProperties) {
6061 if (item.hasOwnProperty(pName)) {
qml/Panel/MenuContent.qml+6
@@ -124,6 +124,12 @@ Rectangle {
124124 }
125125 }
126126
127+ Binding {
128+ target: loader.item
129+ property: "identifier"
130+ value: identifier
131+ }
132+
127133 Binding {
128134 target: loader.item
129135 property: "objectName"
qml/Shell.qml+126−61
@@ -60,7 +60,7 @@ Item {
6060
6161 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
6262 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
6464
6565 property int orientation
6666 readonly property int deviceOrientationAngle: Screen.angleBetween(Screen.primaryOrientation, Screen.orientation)
@@ -87,9 +87,9 @@ Item {
8787 }
8888 }
8989
90− function setFakeActiveForApp(app) {
90+ function setLockedApp(app) {
9191 if (shell.locked) {
92− greeter.fakeActiveForApp = app
92+ greeter.lockedApp = app
9393 lockscreen.hide()
9494 }
9595 }
@@ -128,6 +128,13 @@ Item {
128128 objectName: "dashCommunicator"
129129 }
130130
131+ Binding {
132+ target: ApplicationManager
133+ property: "forceDashActive"
134+ value: launcher.shown || launcher.dashSwipe
135+ }
136+
137+
131138 WindowKeysFilter {
132139 // Handle but do not filter out volume keys
133140 Keys.onVolumeUpPressed: { volumeControl.volumeUp(); event.accepted = false; }
@@ -162,32 +169,37 @@ Item {
162169 Connections {
163170 target: ApplicationManager
164171 onFocusRequested: {
165− if (appId === "dialer-app") {
166− // Always let the dialer-app through. Either user asked
167− // for an emergency call or accepted an incoming call.
168− setFakeActiveForApp(appId)
169− } else if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== appId) {
170− lockscreen.show();
172+ if (greeter.narrowMode) {
173+ if (appId === "dialer-app") {
174+ // Always let the dialer-app through. Either user asked
175+ // for an emergency call or accepted an incoming call.
176+ setLockedApp(appId)
177+ } else if (greeter.hasLockedApp && greeter.lockedApp !== appId) {
178+ greeter.startUnlock()
179+ }
180+ greeter.hide();
181+ } else {
182+ if (LightDM.Greeter.active) {
183+ greeter.startUnlock()
184+ }
171185 }
172− greeter.hide();
173− launcher.hide();
174186 }
175187
176188 onFocusedApplicationIdChanged: {
177− if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== ApplicationManager.focusedApplicationId) {
178− lockscreen.show();
189+ if (greeter.hasLockedApp && greeter.lockedApp !== ApplicationManager.focusedApplicationId) {
190+ greeter.startUnlock()
179191 }
180192 panel.indicators.hide();
181193 }
182194
183195 onApplicationAdded: {
184196 if (greeter.shown && appId != "unity8-dash") {
185− greeter.hide();
197+ greeter.startUnlock()
186198 }
187− if (appId === "dialer-app") {
199+ if (greeter.narrowMode && appId === "dialer-app") {
188200 // Always let the dialer-app through. Either user asked
189201 // for an emergency call or accepted an incoming call.
190− setFakeActiveForApp(appId)
202+ setLockedApp(appId)
191203 }
192204 launcher.hide();
193205 }
@@ -195,9 +207,19 @@ Item {
195207
196208 Loader {
197209 id: applicationsDisplayLoader
210+ objectName: "applicationsDisplayLoader"
198211 anchors.fill: parent
199212
200− source: shell.sideStageEnabled ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
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
222+ source: tabletMode ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
201223
202224 Binding {
203225 target: applicationsDisplayLoader.item
@@ -223,7 +245,7 @@ Item {
223245 Binding {
224246 target: applicationsDisplayLoader.item
225247 property: "spreadEnabled"
226− value: edgeDemo.stagesEnabled && greeter.fakeActiveForApp === "" // to support emergency dialer hack
248+ value: edgeDemo.stagesEnabled && !greeter.hasLockedApp
227249 }
228250 Binding {
229251 target: applicationsDisplayLoader.item
@@ -278,8 +300,6 @@ Item {
278300 id: lockscreen
279301 objectName: "lockscreen"
280302
281− readonly property int backgroundTopMargin: -panel.panelHeight
282−
283303 hides: [launcher, panel.indicators]
284304 shown: false
285305 enabled: true
@@ -294,11 +314,33 @@ Item {
294314 minPinLength: 4
295315 maxPinLength: 4
296316
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+
297326 onEntered: LightDM.Greeter.respond(passphrase);
298327 onCancel: greeter.show()
299− onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter fake-active mode
300−
301− onShownChanged: if (shown) greeter.fakeActiveForApp = ""
328+ onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter locked-app mode
329+
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+ }
302344
303345 Component.onCompleted: {
304346 if (greeter.narrowMode) {
@@ -317,14 +359,15 @@ Item {
317359 if (greeter.narrowMode) {
318360 if (isDefaultPrompt) {
319361 if (lockscreen.alphaNumeric) {
320− lockscreen.infoText = i18n.tr("Enter your passphrase")
321− lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase")
362+ lockscreen.infoText = i18n.tr("Enter passphrase")
363+ lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase") + "\n" +
364+ i18n.tr("Please re-enter")
322365 } else {
323− lockscreen.infoText = i18n.tr("Enter your passcode")
366+ lockscreen.infoText = i18n.tr("Enter passcode")
324367 lockscreen.errorText = i18n.tr("Sorry, incorrect passcode")
325368 }
326369 } else {
327− lockscreen.infoText = i18n.tr("Enter your %1").arg(text.toLowerCase())
370+ lockscreen.infoText = i18n.tr("Enter %1").arg(text.toLowerCase())
328371 lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
329372 }
330373
@@ -333,11 +376,13 @@ Item {
333376 }
334377
335378 onPromptlessChanged: {
336− if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
337− lockscreen.hide()
338− } else {
339− lockscreen.reset();
340− lockscreen.show();
379+ if (greeter.narrowMode) {
380+ if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
381+ lockscreen.hide()
382+ } else {
383+ lockscreen.reset();
384+ lockscreen.show();
385+ }
341386 }
342387 }
343388
@@ -372,7 +417,8 @@ Item {
372417 }
373418 }
374419 if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
375− lockscreen.forceDelay(failedLoginsDelaySeconds * 1000)
420+ lockscreen.delayMinutes = failedLoginsDelayMinutes
421+ forcedDelayTimer.start()
376422 }
377423
378424 lockscreen.clear(true);
@@ -386,7 +432,7 @@ Item {
386432 Binding {
387433 target: LightDM.Greeter
388434 property: "active"
389− value: greeter.shown || lockscreen.shown || greeter.fakeActiveForApp != ""
435+ value: greeter.shown || lockscreen.shown || greeter.hasLockedApp
390436 }
391437
392438 Rectangle {
@@ -398,7 +444,8 @@ Item {
398444 Item {
399445 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
400446 id: greeterWrapper
401− x: launcher.progress
447+ objectName: "greeterWrapper"
448+ x: greeter.narrowMode ? launcher.progress : 0
402449 y: panel.panelHeight
403450 width: parent.width
404451 height: parent.height - panel.panelHeight
@@ -411,14 +458,22 @@ Item {
411458 property bool fullyShown: showProgress === 1.0
412459 onFullyShownChanged: {
413460 // 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) {
415462 lockscreen.reset();
416463 lockscreen.show();
417464 }
418465 }
419466
420467 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+ }
422477
423478 Greeter {
424479 id: greeter
@@ -426,13 +481,16 @@ Item {
426481
427482 signal sessionStarted() // helpful for tests
428483
429− property string fakeActiveForApp: ""
484+ property string lockedApp: ""
485+ property bool hasLockedApp: lockedApp !== ""
430486
431487 available: true
432488 hides: [launcher, panel.indicators]
433489 shown: true
434490 loadContent: required || lockscreen.required // keeps content in memory for quick show()
435491
492+ locked: shell.locked
493+
436494 defaultBackground: shell.background
437495
438496 width: parent.width
@@ -440,6 +498,18 @@ Item {
440498
441499 dragHandleWidth: shell.edgeSize
442500
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+
443513 function login() {
444514 enabled = false;
445515 if (LightDM.Greeter.startSessionSync()) {
@@ -455,8 +525,10 @@ Item {
455525 if (shown) {
456526 if (greeter.narrowMode) {
457527 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
528+ } else {
529+ reset()
458530 }
459− greeter.fakeActiveForApp = "";
531+ greeter.lockedApp = "";
460532 greeter.forceActiveFocus();
461533 }
462534 }
@@ -501,10 +573,7 @@ Item {
501573 }
502574
503575 if (LightDM.Greeter.active) {
504− if (!LightDM.Greeter.authenticated) {
505− lockscreen.show()
506− }
507− greeter.hide()
576+ greeter.startUnlock()
508577 }
509578
510579 var animate = !LightDM.Greeter.active && !stages.shown
@@ -513,16 +582,20 @@ Item {
513582 }
514583
515584 function showDash() {
516− if (shell.locked) {
517− return;
585+ if (greeter.hasLockedApp || // just in case user gets here
586+ (!greeter.narrowMode && shell.locked)) {
587+ return
518588 }
589+
519590 if (greeter.shown) {
520591 greeter.hideRight();
521592 launcher.fadeOut();
522593 }
523594
524− ApplicationManager.requestFocusApplication("unity8-dash")
525− launcher.fadeOut();
595+ if (ApplicationManager.focusedApplicationId != "unity8-dash") {
596+ ApplicationManager.requestFocusApplication("unity8-dash")
597+ launcher.fadeOut();
598+ }
526599 }
527600
528601 Item {
@@ -537,7 +610,7 @@ Item {
537610 anchors.fill: parent //because this draws indicator menus
538611 indicators {
539612 hides: [launcher]
540− available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && greeter.fakeActiveForApp === ""
613+ available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && !greeter.hasLockedApp
541614 contentEnabled: edgeDemo.panelContentEnabled
542615 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
543616 panelHeight: units.gu(3)
@@ -548,7 +621,7 @@ Item {
548621 ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
549622
550623 fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
551− || greeter.fakeActiveForApp !== ""
624+ || greeter.hasLockedApp
552625 }
553626
554627 Launcher {
@@ -561,26 +634,18 @@ Item {
561634 anchors.bottom: parent.bottom
562635 width: parent.width
563636 dragAreaWidth: shell.edgeSize
564− available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && greeter.fakeActiveForApp === ""
637+ available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && !greeter.hasLockedApp
565638
566639 onShowDashHome: showHome()
567− onDash: {
568− if (ApplicationManager.focusedApplicationId != "unity8-dash") {
569− showDash()
570− }
571− if (greeter.shown) {
572− launcher.fadeOut()
573− greeter.hideRight()
574− }
575− }
640+ onDash: showDash()
576641 onDashSwipeChanged: {
577642 if (dashSwipe) {
578643 dash.setCurrentScope("clickscope", false, true)
579644 }
580645 }
581646 onLauncherApplicationSelected: {
582− if (greeter.fakeActiveForApp !== "") {
583− lockscreen.show()
647+ if (greeter.hasLockedApp) {
648+ greeter.startUnlock()
584649 }
585650 if (!edgeDemo.running)
586651 shell.activateApplication(appId)
qml/Stages/PhoneStage.qml+8
@@ -86,6 +86,14 @@ Rectangle {
8686 if (spreadView.closingIndex == -1) {
8787 spreadView.phase = 0;
8888 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);
8997 }
9098 }
9199 }
qml/Stages/TabletStage.qml+7
@@ -140,9 +140,16 @@ Rectangle {
140140 if (priv.sideStageAppId == appId) {
141141 priv.sideStageAppId = "";
142142 }
143+
143144 if (ApplicationManager.count == 0) {
144145 spreadView.phase = 0;
145146 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);
146153 }
147154 }
148155 }
run_on_device.sh+4−5
@@ -130,11 +130,10 @@ if [ -z "${PASSWORD}" ]; then
130130 usage
131131fi
132132
133−PASSFILE=$( adb shell "FILE=\`mktemp\`
134− echo \"#!/bin/sh\" > \$FILE
135− echo \"echo \\\"${PASSWORD}\\\"\" >> \$FILE
136− chmod +x \$FILE
137− echo \$FILE" | tr -d '\r' )
133+PASSFILE=$(adb shell 'mktemp' | tr -d '\r')
134+adb shell "echo '#!/bin/sh' > ${PASSFILE}"
135+adb shell "echo \"echo \\\"${PASSWORD}\\\"\" >> ${PASSFILE}"
136+adb shell "chmod +x ${PASSFILE}"
138137
139138setup_adb_forwarding
140139
src/CMakeLists.txt+1
@@ -36,3 +36,4 @@ install(TARGETS ${SHELL_APP}
3636
3737add_subdirectory(Panel)
3838add_subdirectory(Dash)
39+add_subdirectory(libunity8-private)
src/Dash/CMakeLists.txt+2
@@ -9,6 +9,8 @@ add_executable(unity8-dash ${DASH_SRCS})
99
1010qt5_use_modules(unity8-dash Gui Qml Quick Test)
1111
12+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
13+
1214# install binaries
1315install(TARGETS ${DASH_APP}
1416 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
src/Panel/CMakeLists.txt+2
@@ -1 +1,3 @@
11add_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):
7272 ('Bluetooth', dict(indicator_name='indicator-bluetooth',
7373 title='Bluetooth')),
7474 ('Datetime', dict(indicator_name='indicator-datetime',
75− title='Upcoming events')),
75+ title='Time & Date')),
7676 ('Location', dict(indicator_name='indicator-location',
7777 title='Location')),
7878 ('Messaging', dict(indicator_name='indicator-messages',
79− title='Notification center')),
79+ title='Notifications')),
8080 ('Network', dict(indicator_name='indicator-network',
8181 title='Network')),
8282 ('Power', dict(indicator_name='indicator-power',
tests/autopilot/unity8/shell/emulators/dash.py+2−2
@@ -66,7 +66,7 @@ class Dash(emulators.UnityEmulatorBase):
6666 return resp_grid.select_single('Tile', text=text)
6767
6868 def get_scope(self, scope_name='clickscope'):
69− return self.dash_content_list.select_single(
69+ return self.dash_content_list.wait_select_single(
7070 'QQuickLoader', scopeId=scope_name)
7171
7272 @autopilot_logging.log_action(logger.info)
@@ -86,7 +86,7 @@ class Dash(emulators.UnityEmulatorBase):
8686
8787 def _get_scope_loader(self, scope_id):
8888 try:
89− return self.dash_content_list.select_single(
89+ return self.dash_content_list.wait_select_single(
9090 'QQuickLoader', scopeId=scope_id)
9191 except dbus.StateNotFoundError:
9292 raise emulators.UnityEmulatorException(
tests/autopilot/unity8/shell/tests/test_lock_screen.py+3−1
@@ -132,8 +132,10 @@ class TestLockscreen(UnityTestCase):
132132 )
133133
134134 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)
136137 logger.debug("Typed passphrase: %s", pin_entry_field.text)
138+ self.assertEqual(pin_entry_field.text, passphrase)
137139 self.keyboard.type("\n")
138140
139141 def _enter_prompt_passphrase(self, passphrase):
tests/mocks/Ubuntu/Telephony/MockCallEntry.cpp+26−1
@@ -22,8 +22,8 @@ MockCallEntry::MockCallEntry(QObject *parent)
2222 : QObject(parent)
2323 , m_conference(false)
2424 , m_elapsed(0)
25+ , m_timer(0)
2526{
26− startTimer(1000);
2727}
2828
2929QString MockCallEntry::phoneNumber() const
@@ -52,11 +52,36 @@ void MockCallEntry::setIsConference(bool isConference)
5252 }
5353}
5454
55+void MockCallEntry::setElapsedTime(int elapsedTime)
56+{
57+ if (m_elapsed != elapsedTime) {
58+ m_elapsed = elapsedTime;
59+ Q_EMIT elapsedTimeChanged();
60+ }
61+}
62+
5563int MockCallEntry::elapsedTime() const
5664{
5765 return m_elapsed;
5866}
5967
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+
6085void MockCallEntry::timerEvent(QTimerEvent * event)
6186{
6287 Q_UNUSED(event);
tests/mocks/Ubuntu/Telephony/MockCallEntry.h+9−1
@@ -28,7 +28,10 @@ class MockCallEntry : public QObject
2828
2929 Q_PROPERTY(QString phoneNumber READ phoneNumber WRITE setPhoneNumber NOTIFY phoneNumberChanged)
3030 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)
3235
3336public:
3437 MockCallEntry(QObject *parent = 0);
@@ -36,14 +39,18 @@ public:
3639 QString phoneNumber() const;
3740 bool isConference() const;
3841 int elapsedTime() const;
42+ bool elapsedTimerRunning() const;
3943
4044 void setPhoneNumber(const QString& phoneNumber);
4145 void setIsConference(bool isConference);
46+ void setElapsedTime(int elapsedTime);
47+ void setSlapsedTimerRunning(bool elapsedTimerRunning);
4248
4349Q_SIGNALS:
4450 void phoneNumberChanged();
4551 void isConferenceChanged();
4652 void elapsedTimeChanged();
53+ void elapsedTimerRunningChanged();
4754
4855protected:
4956 void timerEvent(QTimerEvent * event);
@@ -52,6 +59,7 @@ private:
5259 QString m_phoneNumber;
5360 bool m_conference;
5461 int m_elapsed;
62+ int m_timer;
5563};
5664
5765#endif // MOCKCALLENTRY_H
tests/mocks/Unity/Application/ApplicationManager.cpp+26
@@ -43,6 +43,7 @@ ApplicationManager *ApplicationManager::singleton()
4343ApplicationManager::ApplicationManager(QObject *parent)
4444 : ApplicationManagerInterface(parent)
4545 , m_suspended(false)
46+ , m_forceDashActive(false)
4647{
4748 m_roleNames.insert(RoleSession, "session");
4849 m_roleNames.insert(RoleFullscreen, "fullscreen");
@@ -292,6 +293,31 @@ void ApplicationManager::setSuspended(bool suspended)
292293 Q_EMIT suspendedChanged();
293294}
294295
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+
295321bool ApplicationManager::focusApplication(const QString &appId)
296322{
297323 ApplicationInfo *application = findApplication(appId);
tests/mocks/Unity/Application/ApplicationManager.h+6−2
@@ -99,8 +99,11 @@ class ApplicationManager : public ApplicationManagerInterface {
9999 Q_INVOKABLE bool stopApplication(const QString &appId) override;
100100
101101 QString focusedApplicationId() const override;
102− bool suspended() const;
103− void setSuspended(bool suspended);
102+ bool suspended() const override;
103+ void setSuspended(bool suspended) override;
104+
105+ bool forceDashActive() const override;
106+ void setForceDashActive(bool forceDashActive) override;
104107
105108 // Only for testing
106109 Q_INVOKABLE QStringList availableApplications();
@@ -124,6 +127,7 @@ class ApplicationManager : public ApplicationManagerInterface {
124127 void buildListOfAvailableApplications();
125128 void onWindowCreated();
126129 bool m_suspended;
130+ bool m_forceDashActive;
127131 QList<ApplicationInfo*> m_runningApplications;
128132 QList<ApplicationInfo*> m_availableApplications;
129133 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)
22
33set(FakeUnityApplicationQml_SOURCES
44 plugin.cpp
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+1
@@ -54,6 +54,7 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
5454 item = new MockLauncherItem("ubuntu-weather-app", "/usr/share/applications/ubuntu-weather-app.desktop", "Weather", "weather", this);
5555 item->setCount(1234567890);
5656 item->setCountVisible(true);
57+ item->setPinned(true);
5758 m_list.append(item);
5859 item = new MockLauncherItem("notes-app", "/usr/share/applications/notes-app.desktop", "Notepad", "notepad", this);
5960 item->setProgress(50);
tests/mocks/Unity/fake_scope.cpp+1−1
@@ -266,7 +266,7 @@ QVariantMap Scope::customizations() const
266266
267267void Scope::refresh()
268268{
269− qDebug() << "Scope::refresh is currently not implmented in the fake scopes plugin";
269+ Q_EMIT refreshed();
270270}
271271
272272unity::shell::scopes::NavigationInterface* Scope::getNavigation(const QString& id)
tests/mocks/Unity/fake_scope.h+3
@@ -79,6 +79,9 @@ public:
7979
8080 Q_INVOKABLE void refresh() override;
8181
82+Q_SIGNALS:
83+ void refreshed(); // This is not in the Interface, here for testing benefits
84+
8285protected:
8386
8487 QString m_id;
tests/mocks/libusermetrics/UserMetrics.cpp+2−2
@@ -238,7 +238,7 @@ void UserMetricsPrivate::setUsername(const QString &username)
238238 m_username = username;
239239
240240 m_dataIndex = m_fakeData.constFind(m_username);
241− if (m_dataIndex == m_fakeData.end())
241+ if (m_dataIndex == m_fakeData.constEnd())
242242 {
243243 m_dataIndex = m_fakeData.constFind("");
244244 }
@@ -383,7 +383,7 @@ void UserMetricsPrivate::finishSetFakeData()
383383void UserMetricsPrivate::nextFakeData()
384384{
385385 ++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)
387387 {
388388 m_dataIndex = m_fakeData.constFind(m_username);
389389 }
tests/plugins/Dash/cardcreator/1.res+5−5
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -44,13 +44,13 @@ Item {
4444 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
4545 }
4646 }
47− image: Image {
47+ image: CroppedImageMinimumSourceSize {
4848 objectName: "artImage";
4949 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
5050 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
5151 cache: true;
5252 asynchronous: root.asynchronous;
53− fillMode: Image.PreserveAspectCrop;
53+ visible: false;
5454 width: root.width;
5555 height: width / artShape.aspect;
5656 }
@@ -74,8 +74,8 @@ Label {
7474 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
7575 visible: showHeader ;
7676 text: root.title;
77− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
78− horizontalAlignment: root.headerAlignment;
77+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
78+ horizontalAlignment: root.titleAlignment;
7979 }
8080UbuntuShape {
8181 id: touchdown;
tests/plugins/Dash/cardcreator/2.res+6−10
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -62,20 +62,17 @@ Row {
6262 anchors.margins: margins;
6363 anchors.rightMargin: 0;
6464 data: [
65−Image {
65+CroppedImageMinimumSourceSize {
6666 id: mascotImage;
6767 objectName: "mascotImage";
6868 anchors { verticalCenter: parent.verticalCenter; }
69− readonly property int maxSize: Math.max(width, height) * 4;
7069 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
7170 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
7271 width: units.gu(6);
7372 height: units.gu(5.625);
74− sourceSize { width: maxSize; height: maxSize }
75− fillMode: Image.PreserveAspectCrop;
7673 horizontalAlignment: Image.AlignHCenter;
7774 verticalAlignment: Image.AlignVCenter;
78− visible: showHeader;
75+ visible: showHeader && resized;
7976 }
8077,Item {
8178 id: headerTitleContainer;
@@ -98,8 +95,8 @@ Image {
9895 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");
9996 visible: showHeader ;
10097 text: root.title;
101− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
102− horizontalAlignment: root.headerAlignment;
98+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
99+ horizontalAlignment: root.titleAlignment;
103100 }
104101 ,Label {
105102 id: subtitleLabel;
@@ -111,13 +108,12 @@ Image {
111108 }
112109 anchors.topMargin: units.dp(2);
113110 elide: Text.ElideRight;
114− fontSize: "small";
111+ fontSize: "x-small";
115112 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
116113 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");
117114 visible: titleLabel.visible && titleLabel.text;
118115 text: cardData && cardData["subtitle"] || "";
119116 font.weight: Font.Light;
120− horizontalAlignment: root.headerAlignment;
121117 }
122118
123119 ]
tests/plugins/Dash/cardcreator/3.res+6−7
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -44,13 +44,13 @@ Item {
4444 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
4545 }
4646 }
47− image: Image {
47+ image: CroppedImageMinimumSourceSize {
4848 objectName: "artImage";
4949 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
5050 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
5151 cache: true;
5252 asynchronous: root.asynchronous;
53− fillMode: Image.PreserveAspectCrop;
53+ visible: false;
5454 width: root.width;
5555 height: width / artShape.aspect;
5656 }
@@ -74,8 +74,8 @@ Label {
7474 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
7575 visible: showHeader ;
7676 text: root.title;
77− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
78− horizontalAlignment: root.headerAlignment;
77+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
78+ horizontalAlignment: root.titleAlignment;
7979 }
8080Label {
8181 id: subtitleLabel;
@@ -87,13 +87,12 @@ Label {
8787 }
8888 anchors.topMargin: units.dp(2);
8989 elide: Text.ElideRight;
90− fontSize: "small";
90+ fontSize: "x-small";
9191 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
9292 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
9393 visible: titleLabel.visible && titleLabel.text;
9494 text: cardData && cardData["subtitle"] || "";
9595 font.weight: Font.Light;
96− horizontalAlignment: root.headerAlignment;
9796 }
9897UbuntuShape {
9998 id: touchdown;
tests/plugins/Dash/cardcreator/4.res+5−9
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -41,17 +41,14 @@ Loader {
4141 anchors { verticalCenter: parent.verticalCenter; }
4242 }
4343
44−,Image {
44+,CroppedImageMinimumSourceSize {
4545 id: mascotImage;
4646 objectName: "mascotImage";
4747 anchors { verticalCenter: parent.verticalCenter; }
48− readonly property int maxSize: Math.max(width, height) * 4;
4948 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
5049 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
5150 width: units.gu(6);
5251 height: units.gu(5.625);
53− sourceSize { width: maxSize; height: maxSize }
54− fillMode: Image.PreserveAspectCrop;
5552 horizontalAlignment: Image.AlignHCenter;
5653 verticalAlignment: Image.AlignVCenter;
5754 visible: false;
@@ -78,8 +75,8 @@ Label {
7875 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
7976 visible: showHeader ;
8077 text: root.title;
81− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
82− horizontalAlignment: root.headerAlignment;
78+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
79+ horizontalAlignment: root.titleAlignment;
8380 }
8481,Label {
8582 id: subtitleLabel;
@@ -91,13 +88,12 @@ Label {
9188 }
9289 anchors.topMargin: units.dp(2);
9390 elide: Text.ElideRight;
94− fontSize: "small";
91+ fontSize: "x-small";
9592 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
9693 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText;
9794 visible: titleLabel.visible && titleLabel.text;
9895 text: cardData && cardData["subtitle"] || "";
9996 font.weight: Font.Light;
100− horizontalAlignment: root.headerAlignment;
10197 }
10298]
10399}
tests/plugins/Dash/cardcreator/5.res+6−7
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -44,13 +44,13 @@ Item {
4444 height = Qt.binding(function() { return image.status !== Image.Ready ? 0 : image.height });
4545 }
4646 }
47− image: Image {
47+ image: CroppedImageMinimumSourceSize {
4848 objectName: "artImage";
4949 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
5050 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["art"] || ""; }
5151 cache: true;
5252 asynchronous: root.asynchronous;
53− fillMode: Image.PreserveAspectCrop;
53+ visible: false;
5454 width: root.width;
5555 height: width / artShape.aspect;
5656 }
@@ -118,8 +118,8 @@ Label {
118118 color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
119119 visible: showHeader && overlayLoader.active;
120120 text: root.title;
121− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
122− horizontalAlignment: root.headerAlignment;
121+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
122+ horizontalAlignment: root.titleAlignment;
123123 }
124124Label {
125125 id: subtitleLabel;
@@ -132,13 +132,12 @@ Label {
132132 }
133133 anchors.topMargin: units.dp(2);
134134 elide: Text.ElideRight;
135− fontSize: "small";
135+ fontSize: "x-small";
136136 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
137137 color: root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? Theme.palette.normal.baseText : "white");
138138 visible: titleLabel.visible && titleLabel.text;
139139 text: cardData && cardData["subtitle"] || "";
140140 font.weight: Font.Light;
141− horizontalAlignment: root.headerAlignment;
142141 }
143142UbuntuShape {
144143 id: touchdown;
tests/plugins/Dash/cardcreator/6.res+5−7
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -73,8 +73,8 @@ Item {
7373 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");
7474 visible: showHeader ;
7575 text: root.title;
76− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
77− horizontalAlignment: root.headerAlignment;
76+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
77+ horizontalAlignment: root.titleAlignment;
7878 }
7979,Label {
8080 id: subtitleLabel;
@@ -86,15 +86,14 @@ Item {
8686 }
8787 anchors.topMargin: units.dp(2);
8888 elide: Text.ElideRight;
89− fontSize: "small";
89+ fontSize: "x-small";
9090 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
9191 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");
9292 visible: titleLabel.visible && titleLabel.text;
9393 text: cardData && cardData["subtitle"] || "";
9494 font.weight: Font.Light;
95− horizontalAlignment: root.headerAlignment;
9695 }
97−,Icon {
96+,StatusIcon {
9897 id: emblemIcon;
9998 objectName: "emblemIcon";
10099 anchors {
@@ -104,7 +103,6 @@ Item {
104103 }
105104 source: cardData && cardData["emblem"] || "";
106105 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;
108106 height: source != "" ? titleLabel.font.pixelSize : 0;
109107 }
110108
tests/plugins/Dash/cardcreator/7.res+6−10
@@ -6,7 +6,7 @@ AbstractButton {
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
88 property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int titleAlignment: Text.AlignLeft;
1010 property int fixedHeaderHeight: -1;
1111 property size fixedArtShapeSize: Qt.size(-1, -1);
1212 readonly property string title: cardData && cardData["title"] || "";
@@ -62,20 +62,17 @@ Row {
6262 anchors.margins: margins;
6363 anchors.rightMargin: 0;
6464 data: [
65−Image {
65+CroppedImageMinimumSourceSize {
6666 id: mascotImage;
6767 objectName: "mascotImage";
6868 anchors { verticalCenter: parent.verticalCenter; }
69− readonly property int maxSize: Math.max(width, height) * 4;
7069 property bool doLoadSource: !NetworkingStatus.limitedBandwith;
7170 source: { if (root.visible) doLoadSource = true; return doLoadSource && cardData && cardData["mascot"] || ""; }
7271 width: units.gu(6);
7372 height: units.gu(5.625);
74− sourceSize { width: maxSize; height: maxSize }
75− fillMode: Image.PreserveAspectCrop;
7673 horizontalAlignment: Image.AlignHCenter;
7774 verticalAlignment: Image.AlignVCenter;
78− visible: showHeader;
75+ visible: showHeader && resized;
7976 }
8077
8178,Item {
@@ -99,8 +96,8 @@ Image {
9996 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");
10097 visible: showHeader ;
10198 text: root.title;
102− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
103− horizontalAlignment: root.headerAlignment;
99+ font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal;
100+ horizontalAlignment: root.titleAlignment;
104101 }
105102,Label {
106103 id: subtitleLabel;
@@ -112,13 +109,12 @@ Image {
112109 }
113110 anchors.topMargin: units.dp(2);
114111 elide: Text.ElideRight;
115− fontSize: "small";
112+ fontSize: "x-small";
116113 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
117114 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");
118115 visible: titleLabel.visible && titleLabel.text;
119116 text: cardData && cardData["subtitle"] || "";
120117 font.weight: Font.Light;
121− horizontalAlignment: root.headerAlignment;
122118 }
123119,CardAttributes {
124120 id: attributesRow;
tests/plugins/Unity/Launcher/CMakeLists.txt+1−1
@@ -1,6 +1,6 @@
11pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
22pkg_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)
44
55include_directories(
66 ${CMAKE_CURRENT_BINARY_DIR}
tests/plugins/Unity/Launcher/launchermodeltest.cpp+2
@@ -105,6 +105,8 @@ public:
105105 bool requestFocusApplication(const QString &appId) { Q_UNUSED(appId); return true; }
106106 bool suspended() const { return false; }
107107 void setSuspended(bool) {}
108+ bool forceDashActive() const { return false; }
109+ void setForceDashActive(bool) {}
108110
109111private:
110112 QList<MockApp*> m_list;
tests/qmltests/CMakeLists.txt+2−1
@@ -21,11 +21,13 @@ set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
2121
2222add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
2323add_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")
2425add_qml_test(Components Background)
2526add_qml_test(Components Carousel)
2627add_qml_test(Components DraggingArea)
2728add_qml_test(Components EdgeDemoOverlay)
2829add_qml_test(Components LazyImage)
30+add_qml_test(Components Lockscreen)
2931add_qml_test(Components Rating)
3032add_qml_test(Components ResponsiveFlowView)
3133add_qml_test(Components ResponsiveGridView)
@@ -60,7 +62,6 @@ add_qml_test(Dash/ScopeSettings ScopeSettingList)
6062add_qml_test(Dash/ScopeSettings ScopeSettingNumber)
6163add_qml_test(Dash/ScopeSettings ScopeSettingString)
6264add_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")
6465add_qml_test(Greeter MultiGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
6566add_qml_test(Greeter SingleGreeter ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/libusermetrics:${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
6667add_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
1818import QtTest 1.0
1919import ".."
2020import "../../../qml/Components"
21−import AccountsService 0.1
22−import LightDM 0.1 as LightDM
2321import Ubuntu.Components 0.1
2422import Unity.Test 0.1 as UT
2523
2624Rectangle {
2725 id: root
2826 width: units.gu(80)
29− height: units.gu(70)
27+ height: units.gu(76)
3028 color: "orange"
3129
3230 Lockscreen {
@@ -39,7 +37,7 @@ Rectangle {
3937 alphaNumeric: pinPadCheckBox.checked
4038 minPinLength: minPinLengthTextField.text
4139 maxPinLength: maxPinLengthTextField.text
42− username: "Lola"
40+ delayMinutes: delayMinutesTextField.text
4341 background: "../../../qml/graphics/phone_background.jpg"
4442 }
4543
@@ -53,24 +51,6 @@ Rectangle {
5351 }
5452 }
5553
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−
7454 Rectangle {
7555 anchors.fill: parent
7656 anchors.leftMargin: lockscreen.width
@@ -129,6 +109,16 @@ Rectangle {
129109 text: "Retries left"
130110 }
131111 }
112+ Row {
113+ TextField {
114+ id: delayMinutesTextField
115+ width: units.gu(7)
116+ text: "0"
117+ }
118+ Label {
119+ text: "Delay Minutes"
120+ }
121+ }
132122 Label {
133123 id: pinLabel
134124 anchors.verticalCenter: parent.verticalCenter
@@ -141,17 +131,6 @@ Rectangle {
141131 id: enteredLabel
142132 }
143133 }
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−
155134 TextField {
156135 id: infoTextTextField
157136 width: parent.width
@@ -193,6 +172,7 @@ Rectangle {
193172
194173 function cleanup() {
195174 lockscreen.clear(false);
175+ delayMinutesTextField.text = "0"
196176 }
197177
198178 function waitForLockscreenReady() {
@@ -237,8 +217,8 @@ Rectangle {
237217
238218 function test_labels_data() {
239219 return [
240− {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN", username: "foobar" },
241− {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password", username: "Lola" }
220+ {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN" },
221+ {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password" }
242222 ]
243223 }
244224
@@ -246,22 +226,16 @@ Rectangle {
246226 pinPadCheckBox.checked = data.alphanumeric
247227 lockscreen.infoText = data.infoText
248228 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")
254− }
229+ compare(findChild(lockscreen, "infoTextLabel").text, data.infoText, "Placeholdertext is not what it should be")
255230 }
256231
257−
258232 function test_unlock_data() {
259233 return [
260− {tag: "numeric", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: 4, maxPinLength: 4},
261− {tag: "alphanumeric", alphanumeric: true, username: "has-password", password: "password", minPinLength: -1, maxPinLength: -1},
262− {tag: "numeric (wrong)", alphanumeric: false, username: "has-pin", password: "4321", minPinLength: 4, maxPinLength: 4},
263− {tag: "alphanumeric (wrong)", alphanumeric: true, username: "has-password", password: "drowssap", minPinLength: -1, maxPinLength: -1},
264− {tag: "flexible length", alphanumeric: false, username: "has-pin", password: "1234", minPinLength: -1, maxPinLength: -1},
234+ {tag: "numeric", alphanumeric: false, password: "1234", minPinLength: 4, maxPinLength: 4},
235+ {tag: "alphanumeric", alphanumeric: true, password: "password", minPinLength: -1, maxPinLength: -1},
236+ {tag: "numeric (wrong)", alphanumeric: false, password: "4321", minPinLength: 4, maxPinLength: 4},
237+ {tag: "alphanumeric (wrong)", alphanumeric: true, password: "drowssap", minPinLength: -1, maxPinLength: -1},
238+ {tag: "flexible length", alphanumeric: false, password: "1234", minPinLength: -1, maxPinLength: -1},
265239 ]
266240 }
267241
@@ -269,13 +243,13 @@ Rectangle {
269243 enteredLabel.text = ""
270244 minPinLengthTextField.text = data.minPinLength
271245 maxPinLengthTextField.text = data.maxPinLength
272− setUser(data.username)
246+ pinPadCheckBox.checked = data.alphanumeric
247+ infoTextTextField.text = "Enter " + (data.alphanumeric ? "passphrase" : "passcode")
273248 waitForLockscreenReady();
274249
275250 var inputField = findChild(lockscreen, "pinentryField")
276251 if (data.alphanumeric) {
277− mouseClick(inputField, units.gu(1), units.gu(1))
278− tryCompare(inputField, "focus", true);
252+ tryCompare(inputField, "activeFocus", true);
279253 typeString(data.password)
280254 keyClick(Qt.Key_Enter)
281255 } else {
@@ -305,7 +279,6 @@ Rectangle {
305279
306280 var inputField = findChild(lockscreen, "pinentryField")
307281 if (data.alphanumeric) {
308− mouseClick(inputField, units.gu(1), units.gu(1))
309282 tryCompare(inputField, "activeFocus", true);
310283 typeString("1")
311284 } else {
@@ -470,6 +443,13 @@ Rectangle {
470443 var label = findChild(lockscreen, "infoTextLabel")
471444 compare(label.text, data.text);
472445 }
446+
447+ function test_delayMinutes() {
448+ delayMinutesTextField.text = "4"
449+ waitForLockscreenReady()
450+ var label = findChild(lockscreen, "deviceLockedLabel")
451+ compare(label.text, "Device Locked")
452+ }
473453 }
474454
475455 SignalSpy {
tests/qmltests/Dash/CardHelpers.js+1−12
@@ -16,7 +16,7 @@
1616
1717.pragma library
1818
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"]
2020
2121var defaultLayout = ' \
2222{ \
@@ -37,17 +37,6 @@ var defaultLayout = ' \
3737 "overlayColor": null, \
3838 "mascot": null, \
3939 "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, \
5140 "summary": null, \
5241 "attributes": { "max-count": 2 } \
5342 }, \
tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+4−2
@@ -27,13 +27,15 @@ Rectangle {
2727 property var origHeaderjson: {
2828 "title": "THE TITLE",
2929 "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"}]
3132 }
3233
3334 property var headerjson: {
3435 "title": "THE TITLE",
3536 "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"}]
3739 }
3840
3941 PreviewHeader {
tests/qmltests/Dash/tst_CardTool.qml+28−20
@@ -85,8 +85,8 @@ Rectangle {
8585 "layout": { "template": { "card-layout": "vertical" }, "components": { "title": "title", "subtitle": "subtitle" } }
8686 },
8787 {
88− "name": "Title, price - horizontal",
89− "layout": { "template": { "card-layout": "horizontal" }, "components": { "title": "title", "price": "price" } }
88+ "name": "Title, attributes - horizontal",
89+ "layout": { "template": { "card-layout": "horizontal" }, "components": { "title": "title", "attributes": "attributes" } }
9090 },
9191 ]
9292
@@ -100,6 +100,7 @@ Rectangle {
100100 }
101101
102102 Column {
103+ id: column
103104 width: units.gu(38)
104105 anchors { left: parent.left; top: parent.top; margins: units.gu(1) }
105106
@@ -111,7 +112,7 @@ Rectangle {
111112 ]
112113
113114 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) }
115116
116117 Label {
117118 height: units.gu(5)
@@ -315,28 +316,35 @@ Rectangle {
315316 }
316317 }
317318
318− function test_card_header_component_alignment_data() {
319+ function test_card_title_alignment_data() {
319320 return [
320− { tag: "Title - vertical", component: "titleLabel", property: "headerAlignment",
321− value: Text.AlignHCenter, index: 11, layout_index: 0 },
322− { tag: "Title - horizontal", component: "titleLabel", property: "headerAlignment",
323− value: Text.AlignLeft, index: 12, layout_index: 0},
324− { tag: "Title, subtitle - vertical", component: "titleLabel", property: "headerAlignment",
325− value: Text.AlignLeft, index: 13, layout_index: 0},
326− { tag: "Title, price - horizontal", component: "titleLabel", property: "headerAlignment",
327− value: Text.AlignLeft, index: 14, layout_index: 0},
328− ]
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 },
332+ { tag: "Title - vertical", value: Text.AlignHCenter, index: 11 },
333+ { tag: "Title - horizontal", value: Text.AlignLeft, index: 12 },
334+ { tag: "Title, subtitle - vertical", value: Text.AlignLeft, index: 13 },
335+ { tag: "Title, attributes - horizontal", value: Text.AlignLeft, index: 14 },
336+ ];
329337 }
330338
331− function test_card_header_component_alignment(data) {
339+ function test_card_title_alignment(data) {
332340 selector.selectedIndex = data.index;
333− if (data.hasOwnProperty("layout_index")) {
334− layoutSelector.selectedIndex = data.layout_index;
335− }
336341
337− if (data.hasOwnProperty("property")) {
338− tryCompare(cardTool, data.property, data.value);
339− }
342+ tryCompare(cardTool, "titleAlignment", Text.AlignLeft);
343+
344+ cardTool.components['title'] = { "field": "title", "align": "center" };
345+ cardTool.componentsChanged();
346+
347+ tryCompare(cardTool, "titleAlignment", data.value);
340348 }
341349
342350 function test_categoryLayout_data() {
tests/qmltests/Dash/tst_GenericScopeView.qml+21
@@ -582,6 +582,27 @@ Item {
582582
583583 genericScopeView.scope = !genericScopeView.scope;
584584 }
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+ }
585606 }
586607 }
587608}
tests/qmltests/Greeter/tst_MultiGreeter.qml+2−2
@@ -29,6 +29,7 @@ Item {
2929 Greeter {
3030 id: greeter
3131 anchors.fill: parent
32+ locked: !LightDM.Greeter.authenticated
3233 }
3334
3435 Component {
@@ -115,8 +116,7 @@ Item {
115116 var waitForSignal = data.uid != 0 && userList.currentIndex != data.uid
116117 select_index(data.uid)
117118 tryCompare(userList, "currentIndex", data.uid)
118− tryCompare(greeter, "locked", data.tag !== "no-password" &&
119− data.tag !== "auth-error")
119+ tryCompare(greeter, "locked", data.tag !== "no-password")
120120 if (waitForSignal) {
121121 selectionSpy.wait()
122122 tryCompare(selectionSpy, "count", 1)
tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml+3−23
@@ -29,14 +29,14 @@ Item {
2929 id: page
3030
3131 anchors.fill: parent
32− contentActive: true
3332
3433 menuModel: UnityMenuModel {}
3534 busName: "test"
3635 actionsObjectPath: "test"
3736 menuObjectPath: "test"
3837
39− rootMenuType: ""
38+ identifier: "test-indicator"
39+ rootMenuType: "com.canonical.indicator.root"
4040 }
4141
4242 property var fullMenuData: [{
@@ -117,13 +117,8 @@ Item {
117117 name: "DefaultIndicatorPage"
118118
119119 function init() {
120− page.stop();
121120 var mainMenu = findChild(page, "mainMenu");
122− verify(mainMenu.model === undefined);
123−
124− page.rootMenuType = "com.canonical.indicator.root";
125− page.start();
126−
121+ page.menuModel.modelData = [];
127122 verify(mainMenu.model !== null);
128123 }
129124
@@ -157,20 +152,5 @@ Item {
157152 var mainMenu = findChild(page, "mainMenu");
158153 tryCompare(mainMenu, "count", data.expectedCount);
159154 }
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− }
175155 }
176156}
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+24
@@ -37,6 +37,11 @@ Item {
3737 property int modelIndex: 0
3838 property var data
3939
40+ anchors {
41+ left: parent.left
42+ right: parent.right
43+ }
44+
4045 onLoaded: {
4146 if (item.hasOwnProperty("menuData")) {
4247 item.menuData = data;
@@ -734,5 +739,24 @@ Item {
734739 compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
735740 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
736741 }
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+ }
737761 }
738762}
tests/qmltests/Panel/tst_ActiveCallHint.qml+19−6
@@ -39,6 +39,7 @@ Item {
3939 Telephony.CallEntry {
4040 id: call3
4141 phoneNumber: "+447812221113"
42+ elapsedTimerRunning: true
4243 }
4344
4445 ActiveCallHint {
@@ -69,6 +70,7 @@ Item {
6970 callManager.foregroundCall = null;
7071 callManager.backgroundCall = null;
7172 callHint.labelSwitchInterval = 300;
73+ call1.elapsedTime = 0;
7274
7375 ApplicationManager.stopApplication("dialer-app");
7476 }
@@ -139,16 +141,27 @@ Item {
139141 compare(contactLabel.text, "Freddy", "Contact label does not match call");
140142 }
141143
142− function test_timeLapse() {
143− callManager.backgroundCall = call3;
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) {
156+ callManager.backgroundCall = call1;
157+ call1.elapsedTime = data.elpasedTime;
144158
145159 var timeLabel = findChild(callHint, "timeLabel");
146160 verify(timeLabel !== null);
147161
148− var currentLabel = timeLabel.text;
149− tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
150− currentLabel = timeLabel.text;
151− tryCompareFunction(function() { return timeLabel.text !== currentLabel }, true);
162+ compare(timeLabel.text, data.initial);
163+ call1.elapsedTime = call1.elapsedTime + 1;
164+ compare(timeLabel.text, data.expected);
152165 }
153166
154167 function test_displayedLabelChangesOverTime() {
tests/qmltests/Stages/tst_PhoneStage.qml+17
@@ -322,5 +322,22 @@ Item {
322322 }
323323 phoneStage.orientation = Qt.PortraitOrientation;
324324 }
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+ }
325342 }
326343}
tests/qmltests/tst_Shell.qml+5
@@ -198,6 +198,10 @@ Row {
198198
199199 var launcher = findChild(shell, "launcherPanel");
200200 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");
201205 }
202206
203207 function test_suspend() {
@@ -480,6 +484,7 @@ Row {
480484 tryCompare(greeter, "showProgress", 0)
481485 waitForRendering(greeter);
482486 LightDM.Greeter.showGreeter()
487+ waitForRendering(greeter)
483488 tryCompare(greeter, "showProgress", 1)
484489 LightDM.Greeter.hideGreeter()
485490 tryCompare(greeter, "showProgress", 0)
tests/qmltests/tst_ShellWithPin.qml+109−26
@@ -27,10 +27,9 @@ import Powerd 0.1
2727
2828import "../../qml"
2929
30−Item {
30+Row {
3131 id: root
32− width: shell.width + units.gu(20)
33− height: shell.height
32+ spacing: 0
3433
3534 QtObject {
3635 id: applicationArguments
@@ -48,21 +47,55 @@ Item {
4847 }
4948 }
5049
51− Shell {
52− id: shell
53− maxFailedLogins: maxRetriesTextField.text
54− }
55− Column {
56− anchors { top: parent.top; right: parent.right; bottom: parent.bottom; margins:units.gu(1) }
57− width: units.gu(18)
50+ Loader {
51+ id: shellLoader
52+
53+ width: units.gu(40)
54+ height: units.gu(71)
5855
59− Label {
60− text: "Max retries:"
61− color: "black"
56+ property bool itemDestroyed: false
57+ sourceComponent: Component {
58+ Shell {
59+ Component.onDestruction: {
60+ shellLoader.itemDestroyed = true
61+ }
62+ maxFailedLogins: maxRetriesTextField.text
63+ }
6264 }
63− TextField {
64− id: maxRetriesTextField
65− text: "-1"
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+ }
95+ TextField {
96+ id: maxRetriesTextField
97+ text: "-1"
98+ }
6699 }
67100 }
68101
@@ -81,12 +114,10 @@ Item {
81114 name: "ShellWithPin"
82115 when: windowShown
83116
84− function initTestCase() {
85−
86− sessionSpy.target = findChild(shell, "greeter")
87− }
117+ property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
88118
89119 function init() {
120+ sessionSpy.target = findChild(shell, "greeter")
90121 swipeAwayGreeter()
91122 shell.failedLoginsDelayAttempts = -1
92123 maxRetriesTextField.text = "-1"
@@ -95,12 +126,28 @@ Item {
95126 }
96127
97128 function cleanup() {
98− LightDM.Greeter.showGreeter()
99− var greeter = findChild(shell, "greeter")
100− tryCompare(greeter, "showProgress", 1)
129+ shellLoader.itemDestroyed = false
130+
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)
101142
102143 // kill all (fake) running apps
103144 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)
104151 }
105152
106153 function killApps() {
@@ -113,6 +160,7 @@ Item {
113160
114161 function swipeAwayGreeter() {
115162 var greeter = findChild(shell, "greeter");
163+ waitForRendering(greeter)
116164 tryCompare(greeter, "showProgress", 1);
117165
118166 var touchX = shell.width - (shell.edgeSize / 2);
@@ -168,7 +216,8 @@ Item {
168216
169217 mouseClick(emergencyButton, units.gu(1), units.gu(1))
170218
171− tryCompare(greeter, "fakeActiveForApp", "dialer-app")
219+ tryCompare(greeter, "lockedApp", "dialer-app")
220+ tryCompare(greeter, "hasLockedApp", true)
172221 tryCompare(lockscreen, "shown", false)
173222 tryCompare(panel, "fullscreenMode", true)
174223 tryCompare(indicators, "available", false)
@@ -180,7 +229,8 @@ Item {
180229 LightDM.Greeter.showGreeter()
181230
182231 tryCompare(greeter, "shown", true)
183− tryCompare(greeter, "fakeActiveForApp", "")
232+ tryCompare(greeter, "lockedApp", "")
233+ tryCompare(greeter, "hasLockedApp", false)
184234 tryCompare(lockscreen, "shown", true)
185235 tryCompare(panel, "fullscreenMode", false)
186236 tryCompare(indicators, "available", true)
@@ -230,8 +280,10 @@ Item {
230280 enterPin("1111")
231281 tryCompare(placeHolder, "text", "Sorry, incorrect passcode")
232282
283+ var lockscreen = findChild(shell, "lockscreen")
284+ tryCompare(lockscreen, "delayMinutes", 0)
233285 enterPin("1111")
234− tryCompare(placeHolder, "text", "Too many incorrect attempts")
286+ tryCompare(lockscreen, "delayMinutes", shell.failedLoginsDelayMinutes)
235287 }
236288
237289 function test_factoryReset() {
@@ -251,5 +303,36 @@ Item {
251303 enterPin("1111")
252304 tryCompare(resetSpy, "count", 1)
253305 }
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+ }
254337 }
255338}
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
2020import Unity.Test 0.1 as UT
2121
2222TestCase {
23+ id: testCase
2324 TestUtil {id:util}
2425
26+ ActivityIndicator {
27+ visible: testCase.running
28+ anchors.centerIn: parent
29+ Component.onCompleted: parent = testCase.parent
30+ z: 100
31+ running: visible
32+ }
33+
2534 // Fake implementation to be provided to items under test
2635 property var fakeDateTime: new function() {
2736 this.currentTimeMs = 0
tools/unlock-device+14−13
@@ -4,7 +4,7 @@
44# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
55# This will include a reboot.
66
7−WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device"
7+WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device; sleep 20"
88
99while getopts s:w: opt; do
1010 case $opt in
@@ -19,16 +19,17 @@ done
1919
2020eval "$WAIT_COMMAND"
2121
22−# Force a sleep no matter what, since we may need to wait for unity8
23−# to finish coming up (it's hard to tell when the greeter is actually rendered)
24−sleep 30
22+for i in `seq 1 5`; do
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'"
30+ sleep 20
31+ fi
32+done
2533
26−# We need to go through sudo to get a proper environment for dbus set 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
34−fi
34+echo "I: Too many unlock failures, giving up"
35+exit 1