on xenial help sign in
merge trunk, update test to work with trunk
8cf66daMichael Zanetti
CMakeLists.txt+5
@@ -58,6 +58,7 @@ find_package(Qt5DBus 5.2 REQUIRED)
58include(GNUInstallDirs)
58include(GNUInstallDirs)
59
59
60set(SHELL_APP_DIR ${CMAKE_INSTALL_DATADIR}/unity8)
60set(SHELL_APP_DIR ${CMAKE_INSTALL_DATADIR}/unity8)
61+set(SHELL_PRIVATE_LIBDIR ${CMAKE_INSTALL_LIBDIR}/unity8)
61
62
62execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugindir_suffix unity-shell-api OUTPUT_VARIABLE SHELL_INSTALL_QML OUTPUT_STRIP_TRAILING_WHITESPACE)
63execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugindir_suffix unity-shell-api OUTPUT_VARIABLE SHELL_INSTALL_QML OUTPUT_STRIP_TRAILING_WHITESPACE)
63if(SHELL_INSTALL_QML STREQUAL "")
64if(SHELL_INSTALL_QML STREQUAL "")
@@ -87,6 +88,9 @@ endif()
87# "signals" and "slots"
88# "signals" and "slots"
88add_definitions(-DQT_NO_KEYWORDS)
89add_definitions(-DQT_NO_KEYWORDS)
89
90
91+# Save a few container detach and conversions
92+add_definitions(-DQT_STRICT_ITERATORS)
93+
90# Tests
94# Tests
91include(CTest)
95include(CTest)
92enable_testing()
96enable_testing()
@@ -106,6 +110,7 @@ include_directories(
106
110
107# add subdirectories to build
111# add subdirectories to build
108add_subdirectory(include)
112add_subdirectory(include)
113+add_subdirectory(libs)
109add_subdirectory(src)
114add_subdirectory(src)
110add_subdirectory(tools)
115add_subdirectory(tools)
111add_subdirectory(qml)
116add_subdirectory(qml)
debian/changelog+69
@@ -1,3 +1,72 @@
1+unity8 (8.00+14.10.20141013.2-0ubuntu1) utopic; urgency=low
2+
3+ [ Michael Terry ]
4+ * Don't show initial lockscreen during the edge demo. The user just
5+ set up their phone with a password, it's pointless to ask them
6+ again. (LP: #1358283)
7+ * Distinguish between incoming calls and other dialer-app opens. (LP:
8+ #1378218) (LP: #1378218)
9+
10+ [ Andrea Cimitan ]
11+ * Fix flickable speed to be resolution independent, by subclassing
12+ components (LP: #1348557)
13+
14+ [ Michał Sawicz ]
15+ * Fix the ShellWithPin test and some functionality.
16+
17+ [ Albert Astals ]
18+ * Move Base.qml to DashCategoryBase
19+ * Fix first item positioning when m_clipItem->y() is not 0 (LP:
20+ #1251597)
21+ * Fix some small qml warnings
22+
23+ [ Daniel d'Andrada ]
24+ * Add touch ownership logic on top of qt input handling
25+
26+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 13 Oct 2014 15:43:03 +0000
27+
28+unity8 (8.00+14.10.20141009.4-0ubuntu1) utopic; urgency=low
29+
30+ [ Michał Sawicz ]
31+ * Rename datetime indicator in test
32+
33+ [ Albert Astals ]
34+ * Close overview temp scope on show dash (LP: #1373819)
35+ * Enable QT_STRICT_ITERATORS
36+ * Make Base not clickable, since we don't use it in anywhere clickable
37+ (we only use it for Category delegates in the LVWPH) (LP: #1300709)
38+ * Hide preview if it was visible when going to a scope (LP: #1374548)
39+ * Remove contentScale variable
40+
41+ [ Andrea Cimitan ]
42+ * Fix card implicitHeight when summary is declared, but its text is
43+ empty. Also fixes vertical journal height and clipping (LP:
44+ #1362160)
45+ * Redesign for pinned apps. Remove thindivider on top of ubuntu dash
46+ button (not needed anymore) (LP: #1377100)
47+
48+ [ Ying-Chun Liu ]
49+ * Fix run_on_device.sh to let it run again.
50+
51+ [ Nick Dedekind ]
52+ * Fixed indicator menu bindings to server toggle value broken by user
53+ interaction. (LP: #1336715)
54+ * Force rendering so we don't get stuck in "waitForRendering" loop in
55+ tests.
56+
57+ [ Daniel d'Andrada ]
58+ * PhoneStage: focus the new topmost app after the current one closes
59+ itself (LP: #1375267)
60+
61+ [ Michael Terry ]
62+ * Fix some security issues with the tablet greeter, which allowed the
63+ lockscreen to be bypassed. (LP: #1367715) (LP: #1367715)
64+
65+ [ Michael Zanetti ]
66+ * scale down errorText label if necessary (LP: #1378848)
67+
68+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 09 Oct 2014 14:05:54 +0000
69+
1unity8 (8.00+14.10.20141008-0ubuntu1) utopic; urgency=low
70unity8 (8.00+14.10.20141008-0ubuntu1) utopic; urgency=low
2
71
3 [ Michael Zanetti ]
72 [ Michael Zanetti ]
debian/control+1−1
@@ -86,7 +86,7 @@ Depends: gsettings-desktop-schemas,
86 qmenumodel-qml (>= 0.2.8),
86 qmenumodel-qml (>= 0.2.8),
87 qml-module-qtquick-xmllistmodel,
87 qml-module-qtquick-xmllistmodel,
88 qtdeclarative5-gsettings1.0,
88 qtdeclarative5-gsettings1.0,
89− qtdeclarative5-qtmir-plugin (>= 0.4.3),
89+ qtdeclarative5-qtmir-plugin (>= 0.4.4),
90 qtdeclarative5-ubuntu-telephony0.1,
90 qtdeclarative5-ubuntu-telephony0.1,
91 unity-launcher-impl-4,
91 unity-launcher-impl-4,
92 unity8-common (= ${source:Version}),
92 unity8-common (= ${source:Version}),
debian/unity8-private.install+1
@@ -9,5 +9,6 @@ usr/lib/*/unity8/qml/SessionBroadcast
9usr/lib/*/unity8/qml/Ubuntu
9usr/lib/*/unity8/qml/Ubuntu
10usr/lib/*/unity8/qml/Unity
10usr/lib/*/unity8/qml/Unity
11usr/lib/*/unity8/qml/Utils
11usr/lib/*/unity8/qml/Utils
12+usr/lib/*/unity8/libUbuntuGestures*
12usr/share/accountsservice/interfaces
13usr/share/accountsservice/interfaces
13usr/share/dbus-1/interfaces
14usr/share/dbus-1/interfaces
libs/CMakeLists.txtnew file+1
@@ -0,0 +1 @@
1+add_subdirectory(UbuntuGestures)
libs/UbuntuGestures/CMakeLists.txtnew file+40
@@ -0,0 +1,40 @@
1+# in order to include Qt's private headers
2+remove_definitions(-DQT_NO_KEYWORDS)
3+
4+set(UbuntuGestures_SOURCES
5+ CandidateInactivityTimer.cpp
6+ DebugHelpers.cpp
7+ Timer.cpp
8+ TouchOwnershipEvent.cpp
9+ TouchRegistry.cpp
10+ UnownedTouchEvent.cpp
11+)
12+
13+add_definitions(-DUBUNTUGESTURES_LIBRARY)
14+
15+add_library(UbuntuGestures SHARED ${UbuntuGestures_SOURCES})
16+
17+qt5_use_modules(UbuntuGestures Core Quick)
18+
19+# So that Foo.cpp can #include "Foo.moc"
20+include_directories(${CMAKE_CURRENT_BINARY_DIR})
21+
22+install(TARGETS UbuntuGestures
23+ DESTINATION ${SHELL_PRIVATE_LIBDIR})
24+
25+
26+# There's no cmake var for v8 include path :-/ so create one
27+LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
28+if(${Qt5Core_VERSION_STRING} VERSION_LESS "5.1.0")
29+ SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/../QtV8/${Qt5Core_VERSION_STRING}/QtV8)
30+else()
31+ SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
32+endif()
33+
34+# DANGER! DANGER! Using Qt's private API!
35+include_directories(
36+ ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
37+ ${Qt5Quick_INCLUDE_DIRS}
38+ ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
39+ ${Qt5V8_PRIVATE_INCLUDE_DIR}
40+)
libs/UbuntuGestures/CandidateInactivityTimer.cppnew file+41
@@ -0,0 +1,41 @@
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+#include "CandidateInactivityTimer.h"
18+
19+namespace UbuntuGestures {
20+
21+CandidateInactivityTimer::CandidateInactivityTimer(int touchId, QQuickItem *candidate,
22+ AbstractTimerFactory &timerFactory, QObject *parent)
23+ : QObject(parent)
24+ , m_touchId(touchId)
25+ , m_candidate(candidate)
26+{
27+ m_timer = timerFactory.createTimer(this);
28+ connect(m_timer, &AbstractTimer::timeout,
29+ this, &CandidateInactivityTimer::onTimeout);
30+ m_timer->setInterval(durationMs);
31+ m_timer->setSingleShot(true);
32+ m_timer->start();
33+}
34+
35+void CandidateInactivityTimer::onTimeout()
36+{
37+ qWarning("[TouchRegistry] Candidate for touch %d defaulted!", m_touchId);
38+ Q_EMIT candidateDefaulted(m_touchId, m_candidate);
39+}
40+
41+} // namespace UbuntuGestures
libs/UbuntuGestures/CandidateInactivityTimer.hnew file+49
@@ -0,0 +1,49 @@
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+#ifndef UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H
18+#define UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H
19+
20+#include <QObject>
21+
22+class QQuickItem;
23+
24+#include "Timer.h"
25+
26+namespace UbuntuGestures {
27+
28+class UBUNTUGESTURES_EXPORT CandidateInactivityTimer : public QObject {
29+ Q_OBJECT
30+public:
31+ CandidateInactivityTimer(int touchId, QQuickItem *candidate,
32+ AbstractTimerFactory &timerFactory,
33+ QObject *parent = nullptr);
34+
35+ const int durationMs = 350;
36+
37+Q_SIGNALS:
38+ void candidateDefaulted(int touchId, QQuickItem *candidate);
39+private Q_SLOTS:
40+ void onTimeout();
41+private:
42+ AbstractTimer *m_timer;
43+ int m_touchId;
44+ QQuickItem *m_candidate;
45+};
46+
47+} // namespace UbuntuGestures
48+
49+#endif // UBUNTUGESTURES_CANDIDATE_INACTIVITY_TIMER_H
libs/UbuntuGestures/DebugHelpers.cppnew file+68
@@ -0,0 +1,68 @@
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+#include "DebugHelpers.h"
18+#include <QTouchEvent>
19+
20+QString touchPointStateToString(Qt::TouchPointState state)
21+{
22+ switch (state) {
23+ case Qt::TouchPointPressed:
24+ return QString("pressed");
25+ case Qt::TouchPointMoved:
26+ return QString("moved");
27+ case Qt::TouchPointStationary:
28+ return QString("stationary");
29+ case Qt::TouchPointReleased:
30+ return QString("released");
31+ default:
32+ return QString("INVALID_STATE");
33+ }
34+}
35+
36+QString touchEventToString(const QTouchEvent *ev)
37+{
38+ QString message;
39+
40+ switch (ev->type()) {
41+ case QEvent::TouchBegin:
42+ message.append("TouchBegin ");
43+ break;
44+ case QEvent::TouchUpdate:
45+ message.append("TouchUpdate ");
46+ break;
47+ case QEvent::TouchEnd:
48+ message.append("TouchEnd ");
49+ break;
50+ case QEvent::TouchCancel:
51+ message.append("TouchCancel ");
52+ break;
53+ default:
54+ message.append("INVALID_TOUCH_EVENT_TYPE ");
55+ }
56+
57+ foreach(const QTouchEvent::TouchPoint& touchPoint, ev->touchPoints()) {
58+ message.append(
59+ QString("(id:%1, state:%2, scenePos:(%3,%4)) ")
60+ .arg(touchPoint.id())
61+ .arg(touchPointStateToString(touchPoint.state()))
62+ .arg(touchPoint.scenePos().x())
63+ .arg(touchPoint.scenePos().y())
64+ );
65+ }
66+
67+ return message;
68+}
libs/UbuntuGestures/DebugHelpers.hnew file+29
@@ -0,0 +1,29 @@
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+#ifndef UBUNTUGESTURES_DEBUG_HELPER_H
18+#define UBUNTUGESTURES_DEBUG_HELPER_H
19+
20+#include <QString>
21+
22+#include "UbuntuGesturesGlobal.h"
23+
24+class QTouchEvent;
25+
26+UBUNTUGESTURES_EXPORT QString touchPointStateToString(Qt::TouchPointState state);
27+UBUNTUGESTURES_EXPORT QString touchEventToString(const QTouchEvent *ev);
28+
29+#endif // UBUNTUGESTURES_DEBUG_HELPER_H
libs/UbuntuGestures/Pool.hnew file+134
@@ -0,0 +1,134 @@
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+#ifndef UBUNTUGESTURES_POOL_H
18+#define UBUNTUGESTURES_POOL_H
19+
20+#include <QVector>
21+
22+#include "UbuntuGesturesGlobal.h"
23+
24+/*
25+ An object pool.
26+ Avoids unnecessary creations/initializations and deletions/destructions of items. Useful
27+ in a scenario where items are created and destroyed very frequently but the total number
28+ of items at any given time remains small. They're stored in a unordered fashion.
29+
30+ To be used in Pool, ItemType needs to have the following methods:
31+
32+ - ItemType();
33+
34+ A constructor that takes no parameters. An object contructed with it must return false if
35+ isValid() is called.
36+
37+ - bool isValid() const;
38+
39+ Returns wheter the object holds a valid , "filled" state or is empty.
40+ Used by Pool to check if the slot occupied by this object is actually available.
41+
42+ - void reset();
43+
44+ Resets the object to its initial, empty, state. After calling this method, isValid() must
45+ return false.
46+ */
47+template <class ItemType> class Pool
48+{
49+public:
50+ Pool() : m_lastUsedIndex(-1) {
51+ }
52+
53+ class Iterator {
54+ public:
55+ Iterator() : index(-1), item(nullptr) {}
56+ Iterator(int index, ItemType *item)
57+ : index(index), item(item) {}
58+
59+ ItemType *operator->() const { return item; }
60+ ItemType &operator*() const { return *item; }
61+ ItemType &value() const { return *item; }
62+
63+ Iterator &operator= (const Iterator& other) {
64+ index = other.index;
65+ item = other.item;
66+
67+ // by convention, always return *this
68+ return *this;
69+ }
70+
71+ operator bool() const { return item != nullptr; }
72+
73+ int index;
74+ ItemType *item;
75+ };
76+
77+ Iterator &end() const { return Iterator(); }
78+
79+ ItemType &getEmptySlot() {
80+ Q_ASSERT(m_lastUsedIndex < m_slots.size());
81+
82+ // Look for an in-between vacancy first
83+ for (int i = 0; i < m_lastUsedIndex; ++i) {
84+ ItemType &item = m_slots[i];
85+ if (!item.isValid()) {
86+ return item;
87+ }
88+ }
89+
90+ ++m_lastUsedIndex;
91+ if (m_lastUsedIndex >= m_slots.size()) {
92+ m_slots.resize(m_lastUsedIndex + 1);
93+ }
94+
95+ return m_slots[m_lastUsedIndex];
96+ }
97+
98+ void freeSlot(Iterator &iterator) {
99+ m_slots[iterator.index].reset();
100+ if (iterator.index == m_lastUsedIndex) {
101+ do {
102+ --m_lastUsedIndex;
103+ } while (m_lastUsedIndex >= 0 && !m_slots.at(m_lastUsedIndex).isValid());
104+ }
105+ }
106+
107+ // Iterates through all valid items (i.e. the occupied slots)
108+ // calling the given function, with the option of ending the loop early.
109+ //
110+ // bool Func(Iterator& item)
111+ //
112+ // Returning true means it wants to continue the "for" loop, false
113+ // terminates the loop.
114+ template<typename Func> void forEach(Func func) {
115+ Iterator it;
116+ for (it.index = 0; it.index <= m_lastUsedIndex; ++it.index) {
117+ it.item = &m_slots[it.index];
118+ if (!it.item->isValid())
119+ continue;
120+
121+ if (!func(it))
122+ break;
123+ }
124+ }
125+
126+ bool isEmpty() const { return m_lastUsedIndex == -1; }
127+
128+
129+private:
130+ QVector<ItemType> m_slots;
131+ int m_lastUsedIndex;
132+};
133+
134+#endif // UBUNTUGESTURES_POOL_H
libs/UbuntuGestures/Timer.cppnew file+109
@@ -0,0 +1,109 @@
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+#include "Timer.h"
18+
19+namespace UbuntuGestures {
20+
21+Timer::Timer(QObject *parent) : AbstractTimer(parent)
22+{
23+ m_timer.setSingleShot(false);
24+ connect(&m_timer, &QTimer::timeout, this, &AbstractTimer::timeout);
25+}
26+
27+int Timer::interval() const
28+{
29+ return m_timer.interval();
30+}
31+
32+void Timer::setInterval(int msecs)
33+{
34+ m_timer.setInterval(msecs);
35+}
36+
37+void Timer::start()
38+{
39+ m_timer.start();
40+ AbstractTimer::start();
41+}
42+
43+void Timer::stop()
44+{
45+ m_timer.stop();
46+ AbstractTimer::stop();
47+}
48+
49+bool Timer::isSingleShot() const
50+{
51+ return m_timer.isSingleShot();
52+}
53+
54+void Timer::setSingleShot(bool value)
55+{
56+ m_timer.setSingleShot(value);
57+}
58+
59+/////////////////////////////////// FakeTimer //////////////////////////////////
60+
61+FakeTimer::FakeTimer(QObject *parent)
62+ : UbuntuGestures::AbstractTimer(parent)
63+ , m_interval(0)
64+ , m_singleShot(false)
65+{
66+}
67+
68+int FakeTimer::interval() const
69+{
70+ return m_interval;
71+}
72+
73+void FakeTimer::setInterval(int msecs)
74+{
75+ m_interval = msecs;
76+}
77+
78+bool FakeTimer::isSingleShot() const
79+{
80+ return m_singleShot;
81+}
82+
83+void FakeTimer::setSingleShot(bool value)
84+{
85+ m_singleShot = value;
86+}
87+
88+/////////////////////////////////// FakeTimerFactory //////////////////////////////////
89+
90+AbstractTimer *FakeTimerFactory::createTimer(QObject *parent)
91+{
92+ FakeTimer *fakeTimer = new FakeTimer(parent);
93+
94+ timers.append(fakeTimer);
95+
96+ return fakeTimer;
97+}
98+
99+void FakeTimerFactory::makeRunningTimersTimeout()
100+{
101+ for (int i = 0; i < timers.count(); ++i) {
102+ FakeTimer *timer = timers[i].data();
103+ if (timer && timer->isRunning()) {
104+ timer->emitTimeout();
105+ }
106+ }
107+}
108+
109+} // namespace UbuntuGestures
libs/UbuntuGestures/Timer.hnew file+105
@@ -0,0 +1,105 @@
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+#ifndef UBUNTUGESTURES_TIMER_H
18+#define UBUNTUGESTURES_TIMER_H
19+
20+#include "UbuntuGesturesGlobal.h"
21+
22+#include <QObject>
23+#include <QPointer>
24+#include <QTimer>
25+
26+namespace UbuntuGestures {
27+
28+/* Defines an interface for a Timer. Useful for tests. */
29+class UBUNTUGESTURES_EXPORT AbstractTimer : public QObject
30+{
31+ Q_OBJECT
32+public:
33+ AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {}
34+ virtual int interval() const = 0;
35+ virtual void setInterval(int msecs) = 0;
36+ virtual void start() { m_isRunning = true; }
37+ virtual void stop() { m_isRunning = false; }
38+ bool isRunning() const { return m_isRunning; }
39+ virtual bool isSingleShot() const = 0;
40+ virtual void setSingleShot(bool value) = 0;
41+Q_SIGNALS:
42+ void timeout();
43+private:
44+ bool m_isRunning;
45+};
46+
47+/* Essentially a QTimer wrapper */
48+class UBUNTUGESTURES_EXPORT Timer : public AbstractTimer
49+{
50+ Q_OBJECT
51+public:
52+ Timer(QObject *parent = nullptr);
53+
54+ int interval() const override;
55+ void setInterval(int msecs) override;
56+ void start() override;
57+ void stop() override;
58+ bool isSingleShot() const override;
59+ void setSingleShot(bool value) override;
60+private:
61+ QTimer m_timer;
62+};
63+
64+/* For tests */
65+class UBUNTUGESTURES_EXPORT FakeTimer : public AbstractTimer
66+{
67+ Q_OBJECT
68+public:
69+ FakeTimer(QObject *parent = nullptr);
70+
71+ virtual void emitTimeout() { Q_EMIT timeout(); }
72+
73+ int interval() const override;
74+ void setInterval(int msecs) override;
75+ bool isSingleShot() const override;
76+ void setSingleShot(bool value) override;
77+private:
78+ int m_interval;
79+ bool m_singleShot;
80+};
81+
82+class UBUNTUGESTURES_EXPORT AbstractTimerFactory
83+{
84+public:
85+ virtual ~AbstractTimerFactory() {}
86+ virtual AbstractTimer *createTimer(QObject *parent = nullptr) = 0;
87+};
88+
89+class UBUNTUGESTURES_EXPORT TimerFactory : public AbstractTimerFactory
90+{
91+public:
92+ AbstractTimer *createTimer(QObject *parent = nullptr) override { return new Timer(parent); }
93+};
94+
95+class UBUNTUGESTURES_EXPORT FakeTimerFactory : public AbstractTimerFactory
96+{
97+public:
98+ AbstractTimer *createTimer(QObject *parent = nullptr) override;
99+ void makeRunningTimersTimeout();
100+ QList<QPointer<FakeTimer>> timers;
101+};
102+
103+} // namespace UbuntuGestures
104+
105+#endif // UBUNTUGESTURES_TIMER_H
libs/UbuntuGestures/TouchOwnershipEvent.cppnew file+35
@@ -0,0 +1,35 @@
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+#include "TouchOwnershipEvent.h"
18+
19+QEvent::Type TouchOwnershipEvent::m_touchOwnershipType = (QEvent::Type)-1;
20+
21+TouchOwnershipEvent::TouchOwnershipEvent(int touchId, bool gained)
22+ : QEvent(touchOwnershipEventType())
23+ , m_touchId(touchId)
24+ , m_gained(gained)
25+{
26+}
27+
28+QEvent::Type TouchOwnershipEvent::touchOwnershipEventType()
29+{
30+ if (m_touchOwnershipType == (QEvent::Type)-1) {
31+ m_touchOwnershipType = (QEvent::Type)registerEventType();
32+ }
33+
34+ return m_touchOwnershipType;
35+}
libs/UbuntuGestures/TouchOwnershipEvent.hnew file+50
@@ -0,0 +1,50 @@
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+#ifndef UBUNTU_TOUCHOWNERSHIPEVENT_H
18+#define UBUNTU_TOUCHOWNERSHIPEVENT_H
19+
20+#include <QEvent>
21+#include "UbuntuGesturesGlobal.h"
22+
23+/*
24+ When an item get an ownership event for a touch it can grab/steal that touch
25+ with a clean conscience.
26+ */
27+class UBUNTUGESTURES_EXPORT TouchOwnershipEvent : public QEvent
28+{
29+public:
30+ TouchOwnershipEvent(int touchId, bool gained);
31+
32+ static Type touchOwnershipEventType();
33+
34+ /*
35+ Whether ownership was gained (true) or lost (false)
36+ */
37+ bool gained() const { return m_gained; }
38+
39+ /*
40+ Id of the touch whose ownership was granted.
41+ */
42+ int touchId() const { return m_touchId; }
43+
44+private:
45+ static Type m_touchOwnershipType;
46+ int m_touchId;
47+ bool m_gained;
48+};
49+
50+#endif // UBUNTU_TOUCHOWNERSHIPEVENT_H
libs/UbuntuGestures/TouchRegistry.cppnew file+500
@@ -0,0 +1,500 @@
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+#include "TouchRegistry.h"
18+
19+#include <QCoreApplication>
20+#include <QDebug>
21+
22+#pragma GCC diagnostic push
23+#pragma GCC diagnostic ignored "-pedantic"
24+#include <private/qquickitem_p.h>
25+#pragma GCC diagnostic pop
26+
27+#include "CandidateInactivityTimer.h"
28+#include "Timer.h"
29+#include "TouchOwnershipEvent.h"
30+#include "UnownedTouchEvent.h"
31+
32+#define TOUCHREGISTRY_DEBUG 0
33+
34+#if TOUCHREGISTRY_DEBUG
35+ #include "DebugHelpers.h"
36+ #define UG_DEBUG qDebug() << "[TouchRegistry]"
37+#endif // TOUCHREGISTRY_DEBUG
38+
39+using namespace UbuntuGestures;
40+
41+TouchRegistry *TouchRegistry::m_instance = nullptr;
42+
43+TouchRegistry::TouchRegistry(QObject *parent)
44+ : TouchRegistry(parent, new TimerFactory)
45+{
46+}
47+
48+TouchRegistry::TouchRegistry(QObject *parent, AbstractTimerFactory *timerFactory)
49+ : QObject(parent)
50+ , m_inDispatchLoop(false)
51+ , m_timerFactory(timerFactory)
52+{
53+ if (m_instance == nullptr) {
54+ m_instance = this;
55+ } else {
56+ qFatal("Cannot have more than one instance of TouchRegistry. It must be a singleton.");
57+ }
58+}
59+
60+TouchRegistry::~TouchRegistry()
61+{
62+ Q_ASSERT(m_instance != nullptr);
63+ m_instance = nullptr;
64+ delete m_timerFactory;
65+}
66+
67+void TouchRegistry::update(const QTouchEvent *event)
68+{
69+ #if TOUCHREGISTRY_DEBUG
70+ UG_DEBUG << "got" << qPrintable(touchEventToString(event));
71+ #endif
72+
73+ const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
74+ for (int i = 0; i < touchPoints.count(); ++i) {
75+ const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
76+ if (touchPoint.state() == Qt::TouchPointPressed) {
77+ TouchInfo &touchInfo = m_touchInfoPool.getEmptySlot();
78+ touchInfo.init(touchPoint.id());
79+ } else if (touchPoint.state() == Qt::TouchPointReleased) {
80+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(touchPoint.id());
81+
82+ touchInfo->physicallyEnded = true;
83+ }
84+ }
85+
86+ deliverTouchUpdatesToUndecidedCandidatesAndWatchers(event);
87+
88+ freeEndedTouchInfos();
89+}
90+
91+void TouchRegistry::deliverTouchUpdatesToUndecidedCandidatesAndWatchers(const QTouchEvent *event)
92+{
93+ // TODO: Look into how we could optimize this whole thing.
94+ // Although it's not really a problem as we should have at most two candidates
95+ // for each point and there should not be many active points at any given moment.
96+ // But having three nested for-loops does scare.
97+
98+ // TODO: Don't send it to the object that is already receiving the regular event
99+ // because QQuickWindow is sending it to him (i.e., he's the touch owner from Qt's point of view)
100+ // Problem is, we cannnot easily get this information.
101+
102+ const QList<QTouchEvent::TouchPoint> &updatedTouchPoints = event->touchPoints();
103+
104+ // Maps an item to the touches in this event he should be informed about.
105+ // E.g.: a QTouchEvent might have three touches but a given item might be interested in only
106+ // one of them. So he will get a UnownedTouchEvent from this QTouchEvent containing only that
107+ // touch point.
108+ QMap<QQuickItem*, QList<int>> touchIdsForItems;
109+
110+ // Build touchIdsForItems
111+ m_touchInfoPool.forEach([&](Pool<TouchInfo>::Iterator &touchInfo) {
112+ if (touchInfo->isOwned() && touchInfo->watchers.isEmpty())
113+ return true;
114+
115+ for (int j = 0; j < updatedTouchPoints.count(); ++j) {
116+ if (updatedTouchPoints[j].id() == touchInfo->id) {
117+ if (!touchInfo->isOwned()) {
118+ for (int i = 0; i < touchInfo->candidates.count(); ++i) {
119+ CandidateInfo &candidate = touchInfo->candidates[i];
120+ Q_ASSERT(!candidate.item.isNull());
121+ touchIdsForItems[candidate.item.data()].append(touchInfo->id);
122+ }
123+ }
124+
125+ const QList<QPointer<QQuickItem>> &watchers = touchInfo->watchers;
126+ for (int i = 0; i < watchers.count(); ++i) {
127+ if (!watchers[i].isNull()) {
128+ touchIdsForItems[watchers[i].data()].append(touchInfo->id);
129+ }
130+ }
131+
132+ return true;
133+ }
134+ }
135+
136+ return true;
137+ });
138+
139+ // TODO: Consider what happens if an item calls any of TouchRegistry's public methods
140+ // from the event handler callback.
141+ m_inDispatchLoop = true;
142+ auto it = touchIdsForItems.constBegin();
143+ while (it != touchIdsForItems.constEnd()) {
144+ QQuickItem *item = it.key();
145+ const QList<int> &touchIds = it.value();
146+ dispatchPointsToItem(event, touchIds, item);
147+ ++it;
148+ };
149+ m_inDispatchLoop = false;
150+}
151+
152+void TouchRegistry::freeEndedTouchInfos()
153+{
154+ m_touchInfoPool.forEach([&](Pool<TouchInfo>::Iterator &touchInfo) {
155+ if (touchInfo->ended()) {
156+ m_touchInfoPool.freeSlot(touchInfo);
157+ }
158+ return true;
159+ });
160+}
161+
162+/*
163+ Extracts the touches with the given touchIds from event and send them in a
164+ UnownedTouchEvent to the given item
165+ */
166+void TouchRegistry::dispatchPointsToItem(const QTouchEvent *event, const QList<int> &touchIds,
167+ QQuickItem *item)
168+{
169+ Qt::TouchPointStates touchPointStates = 0;
170+ QList<QTouchEvent::TouchPoint> touchPoints;
171+
172+ const QList<QTouchEvent::TouchPoint> &allTouchPoints = event->touchPoints();
173+
174+ QTransform windowToCandidateTransform = QQuickItemPrivate::get(item)->windowToItemTransform();
175+ QMatrix4x4 windowToCandidateMatrix(windowToCandidateTransform);
176+
177+ for (int i = 0; i < allTouchPoints.count(); ++i) {
178+ const QTouchEvent::TouchPoint &originalTouchPoint = allTouchPoints[i];
179+ if (touchIds.contains(originalTouchPoint.id())) {
180+ QTouchEvent::TouchPoint touchPoint = originalTouchPoint;
181+
182+ translateTouchPointFromScreenToWindowCoords(touchPoint);
183+
184+ // Set the point's local coordinates to that of the item
185+ touchPoint.setRect(windowToCandidateTransform.mapRect(touchPoint.sceneRect()));
186+ touchPoint.setStartPos(windowToCandidateTransform.map(touchPoint.startScenePos()));
187+ touchPoint.setLastPos(windowToCandidateTransform.map(touchPoint.lastScenePos()));
188+ touchPoint.setVelocity(windowToCandidateMatrix.mapVector(touchPoint.velocity()).toVector2D());
189+
190+ touchPoints.append(touchPoint);
191+ touchPointStates |= touchPoint.state();
192+ }
193+ }
194+
195+ QTouchEvent *eventForItem = new QTouchEvent(event->type(),
196+ event->device(),
197+ event->modifiers(),
198+ touchPointStates,
199+ touchPoints);
200+ eventForItem->setWindow(event->window());
201+ eventForItem->setTimestamp(event->timestamp());
202+ eventForItem->setTarget(event->target());
203+
204+ UnownedTouchEvent unownedTouchEvent(eventForItem);
205+
206+ #if TOUCHREGISTRY_DEBUG
207+ UG_DEBUG << "Sending unowned" << qPrintable(touchEventToString(eventForItem))
208+ << "to" << item;
209+ #endif
210+
211+ QCoreApplication::sendEvent(item, &unownedTouchEvent);
212+}
213+
214+void TouchRegistry::translateTouchPointFromScreenToWindowCoords(QTouchEvent::TouchPoint &touchPoint)
215+{
216+ touchPoint.setScreenRect(touchPoint.sceneRect());
217+ touchPoint.setStartScreenPos(touchPoint.startScenePos());
218+ touchPoint.setLastScreenPos(touchPoint.lastScenePos());
219+
220+ touchPoint.setSceneRect(touchPoint.rect());
221+ touchPoint.setStartScenePos(touchPoint.startPos());
222+ touchPoint.setLastScenePos(touchPoint.lastPos());
223+}
224+
225+bool TouchRegistry::eventFilter(QObject *watched, QEvent *event)
226+{
227+ Q_UNUSED(watched);
228+
229+ switch (event->type()) {
230+ case QEvent::TouchBegin:
231+ case QEvent::TouchUpdate:
232+ case QEvent::TouchEnd:
233+ case QEvent::TouchCancel:
234+ update(static_cast<QTouchEvent*>(event));
235+ break;
236+ default:
237+ // do nothing
238+ break;
239+ }
240+
241+ // Do not filter out the event. i.e., let it be handled further as
242+ // we're just monitoring events
243+ return false;
244+}
245+
246+void TouchRegistry::addCandidateOwnerForTouch(int id, QQuickItem *candidate)
247+{
248+ #if TOUCHREGISTRY_DEBUG
249+ UG_DEBUG << "addCandidateOwnerForTouch id" << id << "candidate" << candidate;
250+ #endif
251+
252+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
253+ if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
254+
255+ if (touchInfo->isOwned()) {
256+ qWarning("TouchRegistry: trying to add candidate owner for a touch that's already owned");
257+ return;
258+ }
259+
260+ // TODO: Check if candidate already exists
261+
262+ CandidateInfo candidateInfo;
263+ candidateInfo.undecided = true;
264+ candidateInfo.item = candidate;
265+ candidateInfo.inactivityTimer = new CandidateInactivityTimer(id, candidate,
266+ *m_timerFactory,
267+ this);
268+ connect(candidateInfo.inactivityTimer, &CandidateInactivityTimer::candidateDefaulted,
269+ this, &TouchRegistry::rejectCandidateOwnerForTouch);
270+
271+ touchInfo->candidates.append(candidateInfo);
272+}
273+
274+void TouchRegistry::addTouchWatcher(int touchId, QQuickItem *watcher)
275+{
276+ #if TOUCHREGISTRY_DEBUG
277+ UG_DEBUG << "addTouchWatcher id" << touchId << "watcher" << watcher;
278+ #endif
279+
280+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(touchId);
281+ if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
282+
283+ // TODO: Check if watcher already exists
284+
285+ touchInfo->watchers.append(watcher);
286+}
287+
288+void TouchRegistry::removeCandidateOwnerForTouch(int id, QQuickItem *candidate)
289+{
290+ #if TOUCHREGISTRY_DEBUG
291+ UG_DEBUG << "removeCandidateOwnerForTouch id" << id << "candidate" << candidate;
292+ #endif
293+
294+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
295+ if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
296+
297+ int indexRemoved = -1;
298+
299+ // TODO: check if the candidate is in fact the owner of the touch
300+
301+ for (int i = 0; i < touchInfo->candidates.count() && indexRemoved == -1; ++i) {
302+ CandidateInfo &candidateInfo = touchInfo->candidates[i];
303+ if (candidateInfo.item == candidate) {
304+ Q_ASSERT(i > 0 || candidateInfo.undecided);
305+ if (i == 0 && !candidateInfo.undecided) {
306+ qCritical("TouchRegistry: touch owner is being removed.");
307+ }
308+ delete candidateInfo.inactivityTimer;
309+ candidateInfo.inactivityTimer = nullptr;
310+ touchInfo->candidates.removeAt(i);
311+ indexRemoved = i;
312+ }
313+ }
314+
315+ if (indexRemoved == 0) {
316+ // the top candidate has been removed. if the new top candidate
317+ // wants the touch let him know he's now the owner.
318+ if (touchInfo->isOwned()) {
319+ touchInfo->notifyCandidatesOfOwnershipResolution();
320+ }
321+ }
322+
323+ if (!m_inDispatchLoop && touchInfo->ended()) {
324+ m_touchInfoPool.freeSlot(touchInfo);
325+ }
326+}
327+
328+void TouchRegistry::requestTouchOwnership(int id, QQuickItem *candidate)
329+{
330+ #if TOUCHREGISTRY_DEBUG
331+ UG_DEBUG << "requestTouchOwnership id " << id << "candidate" << candidate;
332+ #endif
333+
334+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
335+ if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
336+
337+ Q_ASSERT(!touchInfo->isOwned());
338+
339+ int candidateIndex = -1;
340+ for (int i = 0; i < touchInfo->candidates.count(); ++i) {
341+ CandidateInfo &candidateInfo = touchInfo->candidates[i];
342+ if (candidateInfo.item == candidate) {
343+ candidateInfo.undecided = false;
344+ delete candidateInfo.inactivityTimer;
345+ candidateInfo.inactivityTimer = nullptr;
346+ candidateIndex = i;
347+ break;
348+ }
349+ }
350+
351+ // add it as a candidate if not present yet
352+ if (candidateIndex < 0) {
353+ CandidateInfo candidateInfo;
354+ candidateInfo.undecided = false;
355+ candidateInfo.item = candidate;
356+ candidateInfo.inactivityTimer = nullptr;
357+ touchInfo->candidates.append(candidateInfo);
358+ // it's the last one
359+ candidateIndex = touchInfo->candidates.count() - 1;
360+ }
361+
362+ // If it's the top candidate it means it's now the owner. Let
363+ // it know about it.
364+ if (candidateIndex == 0) {
365+ touchInfo->notifyCandidatesOfOwnershipResolution();
366+ }
367+}
368+
369+Pool<TouchRegistry::TouchInfo>::Iterator TouchRegistry::findTouchInfo(int id)
370+{
371+ Pool<TouchInfo>::Iterator touchInfo;
372+
373+ m_touchInfoPool.forEach([&](Pool<TouchInfo>::Iterator &someTouchInfo) -> bool {
374+ if (someTouchInfo->id == id) {
375+ touchInfo = someTouchInfo;
376+ return false;
377+ } else {
378+ return true;
379+ }
380+ });
381+
382+ return touchInfo;
383+}
384+
385+
386+void TouchRegistry::rejectCandidateOwnerForTouch(int id, QQuickItem *candidate)
387+{
388+ // NB: It's technically possible that candidate is a dangling pointer at this point.
389+ // Although that would most likely be due to a bug in our code.
390+ // In any case, only dereference it after it's confirmed that it indeed exists.
391+
392+ #if TOUCHREGISTRY_DEBUG
393+ UG_DEBUG << "rejectCandidateOwnerForTouch id" << id << "candidate" << (void*)candidate;
394+ #endif
395+
396+ Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
397+ if (!touchInfo) {
398+ #if TOUCHREGISTRY_DEBUG
399+ UG_DEBUG << "Failed to find TouchInfo for id" << id;
400+ #endif
401+ return;
402+ }
403+
404+ int rejectedCandidateIndex = -1;
405+
406+ // Check if the given candidate is valid and still undecided
407+ for (int i = 0; i < touchInfo->candidates.count() && rejectedCandidateIndex == -1; ++i) {
408+ CandidateInfo &candidateInfo = touchInfo->candidates[i];
409+ if (candidateInfo.item == candidate) {
410+ Q_ASSERT(i > 0 || candidateInfo.undecided);
411+ if (i == 0 && !candidateInfo.undecided) {
412+ qCritical() << "TouchRegistry: Can't reject item (" << (void*)candidate
413+ << ") as it already owns touch" << id;
414+ return;
415+ } else {
416+ // we found the guy and it's all fine.
417+ rejectedCandidateIndex = i;
418+ }
419+ }
420+ }
421+
422+ // If we reached this point it's because the given candidate exists and is indeed undecided.
423+
424+ Q_ASSERT(rejectedCandidateIndex >= 0 && rejectedCandidateIndex < touchInfo->candidates.size());
425+
426+ {
427+ TouchOwnershipEvent lostOwnershipEvent(id, false /*gained*/);
428+ QCoreApplication::sendEvent(candidate, &lostOwnershipEvent);
429+ }
430+
431+ touchInfo->candidates.removeAt(rejectedCandidateIndex);
432+
433+ if (rejectedCandidateIndex == 0) {
434+ // the top candidate has been removed. if the new top candidate
435+ // wants the touch let him know he's now the owner.
436+ if (touchInfo->isOwned()) {
437+ touchInfo->notifyCandidatesOfOwnershipResolution();
438+ }
439+ }
440+}
441+
442+////////////////////////////////////// TouchRegistry::TouchInfo ////////////////////////////////////
443+
444+TouchRegistry::TouchInfo::TouchInfo(int id)
445+{
446+ init(id);
447+}
448+
449+void TouchRegistry::TouchInfo::reset()
450+{
451+ id = -1;
452+
453+ for (int i = 0; i < candidates.count(); ++i) {
454+ CandidateInfo &candidate = candidates[i];
455+ delete candidate.inactivityTimer;
456+ candidate.inactivityTimer.clear(); // shoundn't be needed but anyway...
457+ }
458+}
459+
460+void TouchRegistry::TouchInfo::init(int id)
461+{
462+ this->id = id;
463+ physicallyEnded = false;
464+ candidates.clear();
465+ watchers.clear();
466+}
467+
468+bool TouchRegistry::TouchInfo::isOwned() const
469+{
470+ return !candidates.isEmpty() && !candidates.first().undecided;
471+}
472+
473+bool TouchRegistry::TouchInfo::ended() const
474+{
475+ Q_ASSERT(isValid());
476+ return physicallyEnded && (isOwned() || candidates.isEmpty());
477+}
478+
479+void TouchRegistry::TouchInfo::notifyCandidatesOfOwnershipResolution()
480+{
481+ Q_ASSERT(isOwned());
482+
483+ #if TOUCHREGISTRY_DEBUG
484+ UG_DEBUG << "sending TouchOwnershipEvent(id =" << id
485+ << " gained) to candidate" << candidates[0].item;
486+ #endif
487+
488+ TouchOwnershipEvent gainedOwnershipEvent(id, true /*gained*/);
489+ QCoreApplication::sendEvent(candidates[0].item, &gainedOwnershipEvent);
490+
491+
492+ TouchOwnershipEvent lostOwnershipEvent(id, false /*gained*/);
493+ for (int i = 1; i < candidates.count(); ++i) {
494+ #if TOUCHREGISTRY_DEBUG
495+ UG_DEBUG << "sending TouchWonershipEvent(id =" << id << " lost) to candidate"
496+ << candidates[i].item;
497+ #endif
498+ QCoreApplication::sendEvent(candidates[i].item, &lostOwnershipEvent);
499+ }
500+}
libs/UbuntuGestures/TouchRegistry.hnew file+182
@@ -0,0 +1,182 @@
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+#ifndef UNITY_TOUCHREGISTRY_H
18+#define UNITY_TOUCHREGISTRY_H
19+
20+#include <QQuickItem>
21+#include <QObject>
22+#include <QPointer>
23+#include <QTouchEvent>
24+#include <QVector>
25+
26+#include "UbuntuGesturesGlobal.h"
27+#include "CandidateInactivityTimer.h"
28+#include "Pool.h"
29+
30+namespace UbuntuGestures {
31+ class AbstractTimerFactory;
32+}
33+
34+/*
35+ Where the ownership of touches is registered.
36+
37+ Singleton used for adding a touch point ownership model analogous to the one
38+ described in the XInput 2.2 protocol[1] on top of the existing input dispatch logic in QQuickWindow.
39+
40+ It provides a much more flexible and powerful way of dealing with pointer ownership than the existing
41+ mechanisms in Qt. Namely QQuickItem::grabTouchPoints, QuickItem::keepTouchGrab,
42+ QQuickItem::setFiltersChildMouseEvents, QQuickItem::ungrabTouchPoints and QQuickItem::touchUngrabEvent.
43+
44+ Usage:
45+
46+ 1- An item receives a a new touch point. If he's not sure whether he wants it yet, he calls:
47+ TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, this);
48+ touchEvent->ignore();
49+ Ignoring the event is crucial so that it can be seen by other interested parties, which will
50+ behave similarly.
51+
52+ 2- That item will then start receiving UnownedTouchEvents for that touch from step 1. Once he's
53+ made a decision he calls either:
54+ TouchRegistry::instance()->requestTouchOwnership(touchId, this);
55+ If he wants the touch point or:
56+ TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, this);
57+  if he does not want it.
58+
59+ Candidates are put in a priority queue. The first one to call addCandidateOwnerForTouch() will
60+ take precedence over the others for receiving ownership over the touch point (from now on called
61+ simply top-candidate).
62+
63+ If the top-candidate calls requestTouchOwnership() he will immediately receive a
64+ TouchOwnershipEvent(gained=true) for that touch point. He can then safely call
65+ QQuickItem::grabTouchPoints to actually get the owned touch points. The other candidates
66+ will receive TouchOwnershipEvent(gained=false) and will no longer receive UnownedTouchEvents
67+ for that touch point. They will have to undo whatever action they were performing with that
68+ touch point.
69+
70+ But if the top-candidate calls removeCandidateOwnerForTouch() instead, he's popped from the
71+ candidacy queue and ownership is given to the new top-most candidate if he has already
72+ made his decision, that is.
73+
74+ The TouchRegistry cannot enforce the results of this pointer ownership negotiation (i.e.,
75+ who gets to grab the touch points) as that would clash with QQuickWindow's input event
76+ dispatching logic. The candidates have to respect the decision and grab the touch points
77+ themselves.
78+
79+ If an item wants ownership over touches as soon as he receives the TouchBegin for them, his step 1
80+ would be instead:
81+ TouchRegistry::instance()->requestTouchOwnership(touchId, this);
82+ return true;
83+ He would then be notified once ownership has been granted to him, from which point onwards he could
84+ safely assume other TouchRegistry users wouldn't snatch this touch away from him.
85+
86+ Items oblivious to TouchRegistry will lose their touch points without warning, just like in plain Qt.
87+
88+ [1] - http://www.x.org/releases/X11R7.7/doc/inputproto/XI2proto.txt (see multitouch-ownership)
89+ */
90+class UBUNTUGESTURES_EXPORT TouchRegistry : public QObject
91+{
92+ Q_OBJECT
93+public:
94+ TouchRegistry(QObject *parent = nullptr);
95+ // Useful for tests, where you should feed a fake timer
96+ TouchRegistry(QObject *parent, UbuntuGestures::AbstractTimerFactory *timerFactory);
97+
98+ virtual ~TouchRegistry();
99+
100+ // Returns a pointer to the application's TouchRegistry instance.
101+ // If no instance has been allocated, null is returned.
102+ static TouchRegistry *instance() { return m_instance; }
103+
104+ void update(const QTouchEvent *event);
105+
106+ // Calls update() if the given event is a QTouchEvent
107+ bool eventFilter(QObject *watched, QEvent *event) override;
108+
109+ // An item that might later request ownership over the given touch point.
110+ // He will be kept informed about that touch point through UnownedTouchEvents
111+ // All candidates must eventually decide whether they want to own the touch point
112+ // or not. That decision is informed through requestTouchOwnership() or
113+ // removeCandidateOwnerForTouch()
114+ void addCandidateOwnerForTouch(int id, QQuickItem *candidate);
115+
116+ // The same as rejecting ownership of a touch
117+ void removeCandidateOwnerForTouch(int id, QQuickItem *candidate);
118+
119+ // The candidate object wants to be the owner of the touch with the given id.
120+ // If he's currently the oldest/top-most candidate, he will get an ownership
121+ // event immediately. If not, he will get ownership if (or once) he becomes the
122+ // top-most candidate.
123+ void requestTouchOwnership(int id, QQuickItem *candidate);
124+
125+ // An item that has no interest (effective or potential) in owning a touch point
126+ // but would nonetheless like to be kept up-to-date on its state.
127+ void addTouchWatcher(int touchId, QQuickItem *watcherItem);
128+
129+private Q_SLOTS:
130+ void rejectCandidateOwnerForTouch(int id, QQuickItem *candidate);
131+
132+private:
133+ class CandidateInfo {
134+ public:
135+ bool undecided;
136+ // TODO: Prune candidates that become null and resolve ownership accordingly.
137+ QPointer<QQuickItem> item;
138+ QPointer<UbuntuGestures::CandidateInactivityTimer> inactivityTimer;
139+ };
140+
141+ class TouchInfo {
142+ public:
143+ TouchInfo() : id(-1) {}
144+ TouchInfo(int id);
145+ bool isValid() const { return id >= 0; }
146+ void reset();
147+ void init(int id);
148+ int id;
149+ bool physicallyEnded;
150+ bool isOwned() const;
151+ bool ended() const;
152+ void notifyCandidatesOfOwnershipResolution();
153+
154+ // TODO optimize storage (s/QList/Pool)
155+ QList<CandidateInfo> candidates;
156+ QList<QPointer<QQuickItem>> watchers;
157+ };
158+
159+ Pool<TouchInfo>::Iterator findTouchInfo(int id);
160+
161+ void deliverTouchUpdatesToUndecidedCandidatesAndWatchers(const QTouchEvent *event);
162+
163+ static void translateTouchPointFromScreenToWindowCoords(QTouchEvent::TouchPoint &touchPoint);
164+
165+ static void dispatchPointsToItem(const QTouchEvent *event, const QList<int> &touchIds,
166+ QQuickItem *item);
167+ void freeEndedTouchInfos();
168+
169+ Pool<TouchInfo> m_touchInfoPool;
170+
171+ // the singleton instance
172+ static TouchRegistry *m_instance;
173+
174+ bool m_inDispatchLoop;
175+
176+ UbuntuGestures::AbstractTimerFactory *m_timerFactory;
177+
178+ friend class tst_TouchRegistry;
179+ friend class tst_DirectionalDragArea;
180+};
181+
182+#endif // UNITY_TOUCHREGISTRY_H
plugins/Ubuntu/Gestures/UbuntuGesturesGlobal.h → libs/UbuntuGestures/UbuntuGesturesGlobal.hrenamed+1−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
libs/UbuntuGestures/UnownedTouchEvent.cppnew file+39
@@ -0,0 +1,39 @@
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+#include "UnownedTouchEvent.h"
18+
19+QEvent::Type UnownedTouchEvent::m_unownedTouchEventType = (QEvent::Type)-1;
20+
21+UnownedTouchEvent::UnownedTouchEvent(QTouchEvent *touchEvent)
22+ : QEvent(unownedTouchEventType())
23+ , m_touchEvent(touchEvent)
24+{
25+}
26+
27+QEvent::Type UnownedTouchEvent::unownedTouchEventType()
28+{
29+ if (m_unownedTouchEventType == (QEvent::Type)-1) {
30+ m_unownedTouchEventType = (QEvent::Type)registerEventType();
31+ }
32+
33+ return m_unownedTouchEventType;
34+}
35+
36+QTouchEvent *UnownedTouchEvent::touchEvent()
37+{
38+ return m_touchEvent.data();
39+}
libs/UbuntuGestures/UnownedTouchEvent.hnew file+45
@@ -0,0 +1,45 @@
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+#ifndef UBUNTU_UNOWNEDTOUCHEVENT_H
18+#define UBUNTU_UNOWNEDTOUCHEVENT_H
19+
20+#include <QTouchEvent>
21+#include <QScopedPointer>
22+#include "UbuntuGesturesGlobal.h"
23+
24+/*
25+ A touch event with touch points that do not belong the item receiving it.
26+
27+ See TouchRegistry::addCandidateOwnerForTouch and TouchRegistry::addTouchWatcher
28+ */
29+class UBUNTUGESTURES_EXPORT UnownedTouchEvent : public QEvent
30+{
31+public:
32+ UnownedTouchEvent(QTouchEvent *touchEvent);
33+ static Type unownedTouchEventType();
34+
35+ // TODO: It might be cleaner to store the information directly in UnownedTouchEvent
36+ // instead of carrying around a synthesized QTouchEvent. But the latter option
37+ // is very convenient.
38+ QTouchEvent *touchEvent();
39+
40+private:
41+ static Type m_unownedTouchEventType;
42+ QScopedPointer<QTouchEvent> m_touchEvent;
43+};
44+
45+#endif // UBUNTU_UNOWNEDTOUCHEVENT_H
plugins/Dash/CardCreator.js+1−1
@@ -624,7 +624,7 @@ function cardString(template, components) {
624
624
625 var implicitHeight = 'implicitHeight: ';
625 var implicitHeight = 'implicitHeight: ';
626 if (hasSummary) {
626 if (hasSummary) {
627− implicitHeight += 'summary.y + summary.height + (summary.text ? units.gu(1) : 0);\n';
627+ implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
628 } else if (hasHeaderRow) {
628 } else if (hasHeaderRow) {
629 implicitHeight += 'row.y + row.height + units.gu(1);\n';
629 implicitHeight += 'row.y + row.height + units.gu(1);\n';
630 } else if (hasMascot) {
630 } else if (hasMascot) {
plugins/Dash/listviewwithpageheader.cpp+1−1
@@ -851,7 +851,7 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
851 if (nextItem) {
851 if (nextItem) {
852 listItem->setY(nextItem->y() - listItem->height());
852 listItem->setY(nextItem->y() - listItem->height());
853 } else if (modelIndex == 0) {
853 } else if (modelIndex == 0) {
854− listItem->setY(m_headerItem ? m_headerItem->height() : 0);
854+ listItem->setY(-m_clipItem->y() + (m_headerItem ? m_headerItem->height() : 0));
855 } else if (!m_visibleItems.isEmpty()) {
855 } else if (!m_visibleItems.isEmpty()) {
856 lostItem = true;
856 lostItem = true;
857 }
857 }
plugins/Ubuntu/Gestures/AxisVelocityCalculator.h+2−2
@@ -21,7 +21,7 @@
21#ifndef VELOCITY_CALCULATOR_H
21#ifndef VELOCITY_CALCULATOR_H
22#define VELOCITY_CALCULATOR_H
22#define VELOCITY_CALCULATOR_H
23
23
24−#include "UbuntuGesturesGlobal.h"
24+#include "UbuntuGesturesQmlGlobal.h"
25#include <stdint.h>
25#include <stdint.h>
26#include <QtCore/QObject>
26#include <QtCore/QObject>
27#include "TimeSource.h"
27#include "TimeSource.h"
@@ -49,7 +49,7 @@
49 }
49 }
50 }
50 }
51 */
51 */
52−class UBUNTUGESTURES_EXPORT AxisVelocityCalculator : public QObject
52+class UBUNTUGESTURESQML_EXPORT AxisVelocityCalculator : public QObject
53{
53{
54 Q_OBJECT
54 Q_OBJECT
55
55
plugins/Ubuntu/Gestures/CMakeLists.txt+24−5
@@ -1,19 +1,38 @@
1−set(UbuntuGestureQml_SOURCES
1+# in order to include Qt's private headers
2+remove_definitions(-DQT_NO_KEYWORDS)
3+
4+set(UbuntuGesturesQml_SOURCES
2 plugin.cpp
5 plugin.cpp
3 AxisVelocityCalculator.cpp
6 AxisVelocityCalculator.cpp
4 Direction.cpp
7 Direction.cpp
5 DirectionalDragArea.cpp
8 DirectionalDragArea.cpp
6 PressedOutsideNotifier.cpp
9 PressedOutsideNotifier.cpp
7 TimeSource.cpp
10 TimeSource.cpp
11+ TouchGate.cpp
8)
12)
9
13
10−add_definitions(-DUBUNTUGESTURES_LIBRARY)
14+add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
11
15
12−add_library(UbuntuGestureQml MODULE ${UbuntuGestureQml_SOURCES})
16+add_library(UbuntuGesturesQml MODULE ${UbuntuGesturesQml_SOURCES})
17+target_link_libraries(UbuntuGesturesQml UbuntuGestures)
13
18
14−qt5_use_modules(UbuntuGestureQml Core Quick)
19+qt5_use_modules(UbuntuGesturesQml Core Quick)
15
20
16# So that Foo.cpp can #include "Foo.moc"
21# So that Foo.cpp can #include "Foo.moc"
17include_directories(${CMAKE_CURRENT_BINARY_DIR})
22include_directories(${CMAKE_CURRENT_BINARY_DIR})
18
23
24+include_directories(${CMAKE_SOURCE_DIR}/libs/UbuntuGestures)
25+
26+# There's no cmake var for v8 include path :-/ so create one
27+LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
28+SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
29+
30+# DANGER! DANGER! Using Qt's private API!
31+include_directories(
32+ ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
33+ ${Qt5Quick_INCLUDE_DIRS}
34+ ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
35+ ${Qt5V8_PRIVATE_INCLUDE_DIR}
36+)
37+
19−add_unity8_plugin(Ubuntu.Gestures 0.1 Ubuntu/Gestures TARGETS UbuntuGestureQml)
38+add_unity8_plugin(Ubuntu.Gestures 0.1 Ubuntu/Gestures TARGETS UbuntuGesturesQml)
plugins/Ubuntu/Gestures/Direction.h+2−2
@@ -17,14 +17,14 @@
17#ifndef DIRECTION_H
17#ifndef DIRECTION_H
18#define DIRECTION_H
18#define DIRECTION_H
19
19
20−#include "UbuntuGesturesGlobal.h"
20+#include "UbuntuGesturesQmlGlobal.h"
21#include <QObject>
21#include <QObject>
22
22
23/*
23/*
24 A Direction enum wrapper so that we can do things like "direction: Direction.Righwards"
24 A Direction enum wrapper so that we can do things like "direction: Direction.Righwards"
25 from QML.
25 from QML.
26 */
26 */
27−class UBUNTUGESTURES_EXPORT Direction : public QObject {
27+class UBUNTUGESTURESQML_EXPORT Direction : public QObject {
28 Q_OBJECT
28 Q_OBJECT
29 Q_ENUMS(Type)
29 Q_ENUMS(Type)
30
30
plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+317−191
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -14,64 +14,32 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17+#define ACTIVETOUCHESINFO_DEBUG 0
18+#define DIRECTIONALDRAGAREA_DEBUG 0
19+
17#include "DirectionalDragArea.h"
20#include "DirectionalDragArea.h"
18
21
22+#include <QQuickWindow>
19#include <QtCore/qmath.h>
23#include <QtCore/qmath.h>
20−#include <QtCore/QTimer>
21#include <QDebug>
24#include <QDebug>
22
25
23−using namespace UbuntuGestures;
26+#pragma GCC diagnostic push
27+#pragma GCC diagnostic ignored "-pedantic"
28+#include <private/qquickwindow_p.h>
29+#pragma GCC diagnostic pop
24
30
25−#define DIRECTIONALDRAGAREA_DEBUG 0
31+// local
32+#include "TouchOwnershipEvent.h"
33+#include "TouchRegistry.h"
34+#include "UnownedTouchEvent.h"
35+
36+using namespace UbuntuGestures;
26
37
27#if DIRECTIONALDRAGAREA_DEBUG
38#if DIRECTIONALDRAGAREA_DEBUG
28#define DDA_DEBUG(msg) qDebug("[DDA] " msg)
39#define DDA_DEBUG(msg) qDebug("[DDA] " msg)
29−namespace {
40+#include "DebugHelpers.h"
30−QString touchPointStateToString(Qt::TouchPointState state) {
31− switch (state) {
32− case Qt::TouchPointPressed:
33− return QString("pressed");
34− case Qt::TouchPointMoved:
35− return QString("moved");
36− case Qt::TouchPointStationary:
37− return QString("stationary");
38− default: // Qt::TouchPointReleased:
39− return QString("released");
40− }
41−}
42−QString touchEventToString(QTouchEvent *ev)
43−{
44− QString message;
45−
46− switch (ev->type()) {
47− case QEvent::TouchBegin:
48− message.append("TouchBegin ");
49− break;
50− case QEvent::TouchUpdate:
51− message.append("TouchUpdate ");
52− break;
53− case QEvent::TouchEnd:
54− message.append("TouchEnd ");
55− break;
56− default: //QEvent::TouchCancel
57− message.append("TouchCancel ");
58− }
59−
60− for (int i=0; i < ev->touchPoints().size(); ++i) {
61−
62− const QTouchEvent::TouchPoint& touchPoint = ev->touchPoints().at(i);
63− message.append(
64− QString("(id:%1, state:%2, scenePos:(%3,%4)) ")
65− .arg(touchPoint.id())
66− .arg(touchPointStateToString(touchPoint.state()))
67− .arg(touchPoint.scenePos().x())
68− .arg(touchPoint.scenePos().y())
69− );
70− }
71−
72− return message;
73−}
74
41
42+namespace {
75const char *statusToString(DirectionalDragArea::Status status)
43const char *statusToString(DirectionalDragArea::Status status)
76{
44{
77 if (status == DirectionalDragArea::WaitingForTouch) {
45 if (status == DirectionalDragArea::WaitingForTouch) {
@@ -88,23 +56,6 @@ const char *statusToString(DirectionalDragArea::Status status)
88#define DDA_DEBUG(msg) do{}while(0)
56#define DDA_DEBUG(msg) do{}while(0)
89#endif // DIRECTIONALDRAGAREA_DEBUG
57#endif // DIRECTIONALDRAGAREA_DEBUG
90
58
91−// Essentially a QTimer wrapper
92−class RecognitionTimer : public UbuntuGestures::AbstractTimer
93−{
94− Q_OBJECT
95−public:
96− RecognitionTimer(QObject *parent) : UbuntuGestures::AbstractTimer(parent) {
97− m_timer.setSingleShot(false);
98− connect(&m_timer, &QTimer::timeout,
99− this, &UbuntuGestures::AbstractTimer::timeout);
100− }
101− virtual int interval() const { return m_timer.interval(); }
102− virtual void setInterval(int msecs) { m_timer.setInterval(msecs); }
103− virtual void start() { m_timer.start(); UbuntuGestures::AbstractTimer::start(); }
104− virtual void stop() { m_timer.stop(); UbuntuGestures::AbstractTimer::stop(); }
105−private:
106− QTimer m_timer;
107−};
108
59
109DirectionalDragArea::DirectionalDragArea(QQuickItem *parent)
60DirectionalDragArea::DirectionalDragArea(QQuickItem *parent)
110 : QQuickItem(parent)
61 : QQuickItem(parent)
@@ -126,12 +77,14 @@ DirectionalDragArea::DirectionalDragArea(QQuickItem *parent)
126 , m_timeSource(new RealTimeSource)
77 , m_timeSource(new RealTimeSource)
127 , m_activeTouches(m_timeSource)
78 , m_activeTouches(m_timeSource)
128{
79{
129− setRecognitionTimer(new RecognitionTimer(this));
80+ setRecognitionTimer(new Timer(this));
130 m_recognitionTimer->setInterval(60);
81 m_recognitionTimer->setInterval(60);
82+ m_recognitionTimer->setSingleShot(false);
131
83
132 m_velocityCalculator = new AxisVelocityCalculator(this);
84 m_velocityCalculator = new AxisVelocityCalculator(this);
133
85
134− connect(this, &QQuickItem::enabledChanged, this, &DirectionalDragArea::onEnabledChanged);
86+ connect(this, &QQuickItem::enabledChanged, this, &DirectionalDragArea::giveUpIfDisabledOrInvisible);
87+ connect(this, &QQuickItem::visibleChanged, this, &DirectionalDragArea::giveUpIfDisabledOrInvisible);
135}
88}
136
89
137Direction::Type DirectionalDragArea::direction() const
90Direction::Type DirectionalDragArea::direction() const
@@ -214,6 +167,7 @@ void DirectionalDragArea::setRecognitionTimer(UbuntuGestures::AbstractTimer *tim
214{
167{
215 int interval = 0;
168 int interval = 0;
216 bool timerWasRunning = false;
169 bool timerWasRunning = false;
170+ bool wasSingleShot = false;
217
171
218 // can be null when called from the constructor
172 // can be null when called from the constructor
219 if (m_recognitionTimer) {
173 if (m_recognitionTimer) {
@@ -226,6 +180,7 @@ void DirectionalDragArea::setRecognitionTimer(UbuntuGestures::AbstractTimer *tim
226
180
227 m_recognitionTimer = timer;
181 m_recognitionTimer = timer;
228 timer->setInterval(interval);
182 timer->setInterval(interval);
183+ timer->setSingleShot(wasSingleShot);
229 connect(timer, &UbuntuGestures::AbstractTimer::timeout,
184 connect(timer, &UbuntuGestures::AbstractTimer::timeout,
230 this, &DirectionalDragArea::checkSpeed);
185 this, &DirectionalDragArea::checkSpeed);
231 if (timerWasRunning) {
186 if (timerWasRunning) {
@@ -280,8 +235,144 @@ qreal DirectionalDragArea::touchSceneY() const
280 return m_previousScenePos.y();
235 return m_previousScenePos.y();
281}
236}
282
237
238+bool DirectionalDragArea::event(QEvent *event)
239+{
240+ if (event->type() == TouchOwnershipEvent::touchOwnershipEventType()) {
241+ touchOwnershipEvent(static_cast<TouchOwnershipEvent *>(event));
242+ return true;
243+ } else if (event->type() == UnownedTouchEvent::unownedTouchEventType()) {
244+ unownedTouchEvent(static_cast<UnownedTouchEvent *>(event));
245+ return true;
246+ } else {
247+ return QQuickItem::event(event);
248+ }
249+}
250+
251+void DirectionalDragArea::touchOwnershipEvent(TouchOwnershipEvent *event)
252+{
253+ if (event->gained()) {
254+ QVector<int> ids;
255+ ids.append(event->touchId());
256+ DDA_DEBUG("grabbing touch");
257+ grabTouchPoints(ids);
258+
259+ // Work around for Qt bug. If we grab a touch that is being used for mouse pointer
260+ // emulation it will cause the emulation logic to go nuts.
261+ // Thus we have to also grab the mouse in this case.
262+ // TODO: Report bug to Qt
263+ if (window()) {
264+ QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(window());
265+ if (windowPrivate->touchMouseId == event->touchId() && window()->mouseGrabberItem()) {
266+ DDA_DEBUG("removing mouse grabber");
267+ window()->mouseGrabberItem()->ungrabMouse();
268+ }
269+ }
270+ } else {
271+ // We still wanna know when it ends for keeping the composition time window up-to-date
272+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
273+
274+ setStatus(WaitingForTouch);
275+ }
276+}
277+
278+void DirectionalDragArea::unownedTouchEvent(UnownedTouchEvent *unownedTouchEvent)
279+{
280+ QTouchEvent *event = unownedTouchEvent->touchEvent();
281+
282+ Q_ASSERT(!event->touchPointStates().testFlag(Qt::TouchPointPressed));
283+
284+ #if DIRECTIONALDRAGAREA_DEBUG
285+ // TODO Consider using qCDebug() when available (Qt 5.2)
286+ qDebug() << "[DDA] Unowned" << m_timeSource->msecsSinceReference()
287+ << qPrintable(touchEventToString(event));
288+ #endif
289+
290+ switch (m_status) {
291+ case WaitingForTouch:
292+ // do nothing
293+ break;
294+ case Undecided:
295+ Q_ASSERT(isEnabled() && isVisible());
296+ unownedTouchEvent_undecided(unownedTouchEvent);
297+ break;
298+ default: // Recognized:
299+ // do nothing
300+ break;
301+ }
302+
303+ m_activeTouches.update(event);
304+}
305+
306+void DirectionalDragArea::unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent)
307+{
308+ const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(unownedTouchEvent->touchEvent());
309+ if (!touchPoint) {
310+ qCritical() << "DirectionalDragArea[status=Undecided]: touch " << m_touchId
311+ << "missing from UnownedTouchEvent without first reaching state Qt::TouchPointReleased. "
312+ "Considering it as released.";
313+
314+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
315+ setStatus(WaitingForTouch);
316+ return;
317+ }
318+
319+ const QPointF &touchScenePos = touchPoint->scenePos();
320+
321+ if (touchPoint->state() == Qt::TouchPointReleased) {
322+ // touch has ended before recognition concluded
323+ DDA_DEBUG("Touch has ended before recognition concluded");
324+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
325+ emitSignalIfTapped();
326+ setStatus(WaitingForTouch);
327+ return;
328+ }
329+
330+ m_previousDampedScenePos.setX(m_dampedScenePos.x());
331+ m_previousDampedScenePos.setY(m_dampedScenePos.y());
332+ m_dampedScenePos.update(touchScenePos);
333+ updateVelocityCalculator(touchScenePos);
334+
335+ if (!pointInsideAllowedArea()) {
336+ DDA_DEBUG("Rejecting gesture because touch point is outside allowed area.");
337+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
338+ // We still wanna know when it ends for keeping the composition time window up-to-date
339+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
340+ setStatus(WaitingForTouch);
341+ return;
342+ }
343+
344+ if (!movingInRightDirection()) {
345+ DDA_DEBUG("Rejecting gesture because touch point is moving in the wrong direction.");
346+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
347+ // We still wanna know when it ends for keeping the composition time window up-to-date
348+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
349+ setStatus(WaitingForTouch);
350+ return;
351+ }
352+
353+ setPreviousPos(touchPoint->pos());
354+ setPreviousScenePos(touchScenePos);
355+
356+ if (isWithinTouchCompositionWindow()) {
357+ // There's still time for some new touch to appear and ruin our party as it would be combined
358+ // with our m_touchId one and therefore deny the possibility of a single-finger gesture.
359+ DDA_DEBUG("Sill within composition window. Let's wait more.");
360+ return;
361+ }
362+
363+ if (movedFarEnough(touchScenePos)) {
364+ TouchRegistry::instance()->requestTouchOwnership(m_touchId, this);
365+ setStatus(Recognized);
366+ } else {
367+ DDA_DEBUG("Didn't move far enough yet. Let's wait more.");
368+ }
369+}
370+
283void DirectionalDragArea::touchEvent(QTouchEvent *event)
371void DirectionalDragArea::touchEvent(QTouchEvent *event)
284{
372{
373+ // TODO: Consider when more than one touch starts in the same event (although it's not possible
374+ // with Mir's android-input). Have to track them all. Consider it a plus/bonus.
375+
285 #if DIRECTIONALDRAGAREA_DEBUG
376 #if DIRECTIONALDRAGAREA_DEBUG
286 // TODO Consider using qCDebug() when available (Qt 5.2)
377 // TODO Consider using qCDebug() when available (Qt 5.2)
287 qDebug() << "[DDA]" << m_timeSource->msecsSinceReference()
378 qDebug() << "[DDA]" << m_timeSource->msecsSinceReference()
@@ -310,29 +401,34 @@ void DirectionalDragArea::touchEvent(QTouchEvent *event)
310
401
311void DirectionalDragArea::touchEvent_absent(QTouchEvent *event)
402void DirectionalDragArea::touchEvent_absent(QTouchEvent *event)
312{
403{
404+ // TODO: accept/reject is for the whole event, not per touch id. See how that affects us.
405+
313 if (!event->touchPointStates().testFlag(Qt::TouchPointPressed)) {
406 if (!event->touchPointStates().testFlag(Qt::TouchPointPressed)) {
314 // Nothing to see here. No touch starting in this event.
407 // Nothing to see here. No touch starting in this event.
315 return;
408 return;
316 }
409 }
317
410
411+ // to be proven wrong, if that's the case
412+ bool allGood = true;
413+
318 if (isWithinTouchCompositionWindow()) {
414 if (isWithinTouchCompositionWindow()) {
319 // too close to the last touch start. So we consider them as starting roughly at the same time.
415 // too close to the last touch start. So we consider them as starting roughly at the same time.
320 // Can't be a single-touch gesture.
416 // Can't be a single-touch gesture.
321 #if DIRECTIONALDRAGAREA_DEBUG
417 #if DIRECTIONALDRAGAREA_DEBUG
322 qDebug("[DDA] A new touch point came in but we're still within time composition window. Ignoring it.");
418 qDebug("[DDA] A new touch point came in but we're still within time composition window. Ignoring it.");
323 #endif
419 #endif
324− return;
420+ allGood = false;
325 }
421 }
326
422
327 const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
423 const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
328
424
329 const QTouchEvent::TouchPoint *newTouchPoint = nullptr;
425 const QTouchEvent::TouchPoint *newTouchPoint = nullptr;
330− for (int i = 0; i < touchPoints.count(); ++i) {
426+ for (int i = 0; i < touchPoints.count() && allGood; ++i) {
331 const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
427 const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
332 if (touchPoint.state() == Qt::TouchPointPressed) {
428 if (touchPoint.state() == Qt::TouchPointPressed) {
333 if (newTouchPoint) {
429 if (newTouchPoint) {
334 // more than one touch starting in this QTouchEvent. Can't be a single-touch gesture
430 // more than one touch starting in this QTouchEvent. Can't be a single-touch gesture
335− return;
431+ allGood = false;
336 } else {
432 } else {
337 // that's our candidate
433 // that's our candidate
338 m_touchId = touchPoint.id();
434 m_touchId = touchPoint.id();
@@ -341,85 +437,61 @@ void DirectionalDragArea::touchEvent_absent(QTouchEvent *event)
341 }
437 }
342 }
438 }
343
439
440+ if (allGood) {
344− Q_ASSERT(newTouchPoint);
441+ Q_ASSERT(newTouchPoint);
345
442
346− // If we have made this far, we are good to go to the next status.
347−
348− m_startPos = newTouchPoint->pos();
443+ m_startPos = newTouchPoint->pos();
349− m_startScenePos = newTouchPoint->scenePos();
444+ m_startScenePos = newTouchPoint->scenePos();
350− m_touchId = newTouchPoint->id();
445+ m_touchId = newTouchPoint->id();
351− m_dampedScenePos.reset(m_startScenePos);
446+ m_dampedScenePos.reset(m_startScenePos);
352− m_velocityCalculator->setTrackedPosition(0.);
447+ m_velocityCalculator->setTrackedPosition(0.);
353− m_velocityCalculator->reset();
448+ m_velocityCalculator->reset();
354− m_numSamplesOnLastSpeedCheck = 0;
449+ m_numSamplesOnLastSpeedCheck = 0;
355− m_silenceTime = 0;
450+ m_silenceTime = 0;
356− setPreviousPos(m_startPos);
451+ setPreviousPos(m_startPos);
357− setPreviousScenePos(m_startScenePos);
452+ setPreviousScenePos(m_startScenePos);
358− updateSceneDirectionVector();
453+ updateSceneDirectionVector();
359−
454+
455+ if (recognitionIsDisabled()) {
456+ // Behave like a dumb TouchArea
457+ TouchRegistry::instance()->requestTouchOwnership(m_touchId, this);
458+ setStatus(Recognized);
459+ event->accept();
460+ } else {
461+ // just monitor the touch points for now.
462+ TouchRegistry::instance()->addCandidateOwnerForTouch(m_touchId, this);
463+
360− setStatus(Undecided);
464+ setStatus(Undecided);
465+ // Let the item below have it. We will monitor it and grab it later if a gesture
466+ // gets recognized.
467+ event->ignore();
468+ }
469+ } else {
470+ watchPressedTouchPoints(touchPoints);
471+ event->ignore();
472+ }
361}
473}
362
474
363void DirectionalDragArea::touchEvent_undecided(QTouchEvent *event)
475void DirectionalDragArea::touchEvent_undecided(QTouchEvent *event)
364{
476{
477+ Q_ASSERT(event->type() == QEvent::TouchBegin);
365− const QTouchEvent::TouchPoint *touchPoint = fetchTargetTouchPoint(event);
478+ Q_ASSERT(fetchTargetTouchPoint(event) == nullptr);
366
479
367− if (!touchPoint) {
480+ // We're not interested in new touch points. We already have our candidate (m_touchId).
368− qCritical() << "DirectionalDragArea[status=Undecided]: touch " << m_touchId
481+ // But we do want to know when those new touches end for keeping the composition time
369− << "missing from QTouchEvent without first reaching state Qt::TouchPointReleased. "
482+ // window up-to-date
370− "Considering it as released.";
483+ event->ignore();
371− setStatus(WaitingForTouch);
484+ watchPressedTouchPoints(event->touchPoints());
372− return;
373− }
374−
375− const QPointF &touchScenePos = touchPoint->scenePos();
376−
377− if (touchPoint->state() == Qt::TouchPointReleased) {
378− // touch has ended before recognition concluded
379− DDA_DEBUG("Touch has ended before recognition concluded");
380− setStatus(WaitingForTouch);
381− Q_EMIT tapped();
382− return;
383− }
384
485
385 if (event->touchPointStates().testFlag(Qt::TouchPointPressed) && isWithinTouchCompositionWindow()) {
486 if (event->touchPointStates().testFlag(Qt::TouchPointPressed) && isWithinTouchCompositionWindow()) {
386 // multi-finger drags are not accepted
487 // multi-finger drags are not accepted
387 DDA_DEBUG("Multi-finger drags are not accepted");
488 DDA_DEBUG("Multi-finger drags are not accepted");
388− setStatus(WaitingForTouch);
389− return;
390− }
391
489
392− m_previousDampedScenePos.setX(m_dampedScenePos.x());
490+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
393− m_previousDampedScenePos.setY(m_dampedScenePos.y());
491+ // We still wanna know when it ends for keeping the composition time window up-to-date
394− m_dampedScenePos.update(touchScenePos);
492+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
395− updateVelocityCalculator(touchScenePos);
396−
397− if (!pointInsideAllowedArea()) {
398− DDA_DEBUG("Rejecting gesture because touch point is outside allowed area.");
399− setStatus(WaitingForTouch);
400− return;
401− }
402
493
403− if (!movingInRightDirection()) {
404− DDA_DEBUG("Rejecting gesture becauuse touch point is moving in the wrong direction.");
405 setStatus(WaitingForTouch);
494 setStatus(WaitingForTouch);
406− return;
407− }
408−
409− setPreviousPos(touchPoint->pos());
410− setPreviousScenePos(touchScenePos);
411−
412− if (isWithinTouchCompositionWindow()) {
413− // There's still time for some new touch to appear and ruin our party as it would be combined
414− // with our m_touchId one and therefore deny the possibility of a single-finger gesture.
415− DDA_DEBUG("Sill within composition window. Let's wait more.");
416− return;
417− }
418−
419− if (movedFarEnough(touchScenePos)) {
420− setStatus(Recognized);
421− } else {
422− DDA_DEBUG("Didn't move far enough yet. Let's wait more.");
423 }
495 }
424}
496}
425
497
@@ -437,11 +509,35 @@ void DirectionalDragArea::touchEvent_recognized(QTouchEvent *event)
437 setPreviousScenePos(touchPoint->scenePos());
509 setPreviousScenePos(touchPoint->scenePos());
438
510
439 if (touchPoint->state() == Qt::TouchPointReleased) {
511 if (touchPoint->state() == Qt::TouchPointReleased) {
512+ emitSignalIfTapped();
440 setStatus(WaitingForTouch);
513 setStatus(WaitingForTouch);
441 }
514 }
442 }
515 }
443}
516}
444
517
518+void DirectionalDragArea::watchPressedTouchPoints(const QList<QTouchEvent::TouchPoint> &touchPoints)
519+{
520+ for (int i = 0; i < touchPoints.count(); ++i) {
521+ const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
522+ if (touchPoint.state() == Qt::TouchPointPressed) {
523+ TouchRegistry::instance()->addTouchWatcher(touchPoint.id(), this);
524+ }
525+ }
526+}
527+
528+bool DirectionalDragArea::recognitionIsDisabled() const
529+{
530+ return distanceThreshold() <= 0 && compositionTime() <= 0;
531+}
532+
533+void DirectionalDragArea::emitSignalIfTapped()
534+{
535+ qint64 touchDuration = m_timeSource->msecsSinceReference() - m_activeTouches.touchStartTime(m_touchId);
536+ if (touchDuration <= maxTapDuration()) {
537+ Q_EMIT tapped();
538+ }
539+}
540+
445const QTouchEvent::TouchPoint *DirectionalDragArea::fetchTargetTouchPoint(QTouchEvent *event)
541const QTouchEvent::TouchPoint *DirectionalDragArea::fetchTargetTouchPoint(QTouchEvent *event)
446{
542{
447 const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
543 const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
@@ -509,12 +605,16 @@ bool DirectionalDragArea::movedFarEnough(const QPointF &point) const
509
605
510void DirectionalDragArea::checkSpeed()
606void DirectionalDragArea::checkSpeed()
511{
607{
608+ Q_ASSERT(m_status == Undecided);
609+
512 if (m_velocityCalculator->numSamples() >= AxisVelocityCalculator::MIN_SAMPLES_NEEDED) {
610 if (m_velocityCalculator->numSamples() >= AxisVelocityCalculator::MIN_SAMPLES_NEEDED) {
513 qreal speed = qFabs(m_velocityCalculator->calculate());
611 qreal speed = qFabs(m_velocityCalculator->calculate());
514 qreal minSpeedMsecs = m_minSpeed / 1000.0;
612 qreal minSpeedMsecs = m_minSpeed / 1000.0;
515
613
516 if (speed < minSpeedMsecs) {
614 if (speed < minSpeedMsecs) {
517 DDA_DEBUG("Rejecting gesture because it's below minimum speed.");
615 DDA_DEBUG("Rejecting gesture because it's below minimum speed.");
616+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
617+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
518 setStatus(WaitingForTouch);
618 setStatus(WaitingForTouch);
519 }
619 }
520 }
620 }
@@ -523,7 +623,9 @@ void DirectionalDragArea::checkSpeed()
523 m_silenceTime += m_recognitionTimer->interval();
623 m_silenceTime += m_recognitionTimer->interval();
524
624
525 if (m_silenceTime > m_maxSilenceTime) {
625 if (m_silenceTime > m_maxSilenceTime) {
526− DDA_DEBUG("Rejecting gesture because it's silence time has been exceeded.");
626+ DDA_DEBUG("Rejecting gesture because its silence time has been exceeded.");
627+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
628+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
527 setStatus(WaitingForTouch);
629 setStatus(WaitingForTouch);
528 }
630 }
529 } else {
631 } else {
@@ -532,10 +634,19 @@ void DirectionalDragArea::checkSpeed()
532 m_numSamplesOnLastSpeedCheck = m_velocityCalculator->numSamples();
634 m_numSamplesOnLastSpeedCheck = m_velocityCalculator->numSamples();
533}
635}
534
636
535−void DirectionalDragArea::onEnabledChanged()
637+void DirectionalDragArea::giveUpIfDisabledOrInvisible()
536{
638{
639+ if (!isEnabled() || !isVisible()) {
640+ if (m_status == Undecided) {
641+ TouchRegistry::instance()->removeCandidateOwnerForTouch(m_touchId, this);
642+ // We still wanna know when it ends for keeping the composition time window up-to-date
643+ TouchRegistry::instance()->addTouchWatcher(m_touchId, this);
644+ }
645+
537− if (!isEnabled() && m_status != WaitingForTouch) {
646+ if (m_status != WaitingForTouch) {
647+ DDA_DEBUG("Resetting status because got disabled or made invisible");
538− setStatus(WaitingForTouch);
648+ setStatus(WaitingForTouch);
649+ }
539 }
650 }
540}
651}
541
652
@@ -631,7 +742,9 @@ void DirectionalDragArea::updateVelocityCalculator(const QPointF &scenePos)
631
742
632bool DirectionalDragArea::isWithinTouchCompositionWindow()
743bool DirectionalDragArea::isWithinTouchCompositionWindow()
633{
744{
745+ return
746+ compositionTime() > 0 &&
634− return !m_activeTouches.isEmpty() &&
747+ !m_activeTouches.isEmpty() &&
635 m_timeSource->msecsSinceReference() <=
748 m_timeSource->msecsSinceReference() <=
636 m_activeTouches.mostRecentStartTime() + (qint64)compositionTime();
749 m_activeTouches.mostRecentStartTime() + (qint64)compositionTime();
637}
750}
@@ -639,18 +752,17 @@ bool DirectionalDragArea::isWithinTouchCompositionWindow()
639//************************** ActiveTouchesInfo **************************
752//************************** ActiveTouchesInfo **************************
640
753
641DirectionalDragArea::ActiveTouchesInfo::ActiveTouchesInfo(const SharedTimeSource &timeSource)
754DirectionalDragArea::ActiveTouchesInfo::ActiveTouchesInfo(const SharedTimeSource &timeSource)
642− : m_timeSource(timeSource), m_lastUsedIndex(-1)
755+ : m_timeSource(timeSource)
643{
756{
644− // Estimate of the maximum number of active touches we might reach.
645− // Not a problem if it ends up being an underestimate as this is just
646− // an optimization.
647− m_vector.resize(3);
648}
757}
649
758
650void DirectionalDragArea::ActiveTouchesInfo::update(QTouchEvent *event)
759void DirectionalDragArea::ActiveTouchesInfo::update(QTouchEvent *event)
651{
760{
652 if (!(event->touchPointStates() & (Qt::TouchPointPressed | Qt::TouchPointReleased))) {
761 if (!(event->touchPointStates() & (Qt::TouchPointPressed | Qt::TouchPointReleased))) {
653 // nothing to update
762 // nothing to update
763+ #if ACTIVETOUCHESINFO_DEBUG
764+ qDebug("[DDA::ActiveTouchesInfo] Nothing to Update");
765+ #endif
654 return;
766 return;
655 }
767 }
656
768
@@ -658,74 +770,88 @@ void DirectionalDragArea::ActiveTouchesInfo::update(QTouchEvent *event)
658 for (int i = 0; i < touchPoints.count(); ++i) {
770 for (int i = 0; i < touchPoints.count(); ++i) {
659 const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
771 const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
660 if (touchPoint.state() == Qt::TouchPointPressed) {
772 if (touchPoint.state() == Qt::TouchPointPressed) {
661− addTouchPoint(touchPoint);
773+ addTouchPoint(touchPoint.id());
662 } else if (touchPoint.state() == Qt::TouchPointReleased) {
774 } else if (touchPoint.state() == Qt::TouchPointReleased) {
663− removeTouchPoint(touchPoint);
775+ removeTouchPoint(touchPoint.id());
664 }
776 }
665 }
777 }
666}
778}
667
779
780+#if ACTIVETOUCHESINFO_DEBUG
668−void DirectionalDragArea::ActiveTouchesInfo::addTouchPoint(const QTouchEvent::TouchPoint &touchPoint)
781+QString DirectionalDragArea::ActiveTouchesInfo::toString()
669{
782{
670− ActiveTouchInfo &activeTouchInfo = getEmptySlot();
783+ QString string = "(";
671− activeTouchInfo.id = touchPoint.id();
784+
672− activeTouchInfo.startTime = m_timeSource->msecsSinceReference();
785+ {
786+ QTextStream stream(&string);
787+ m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
788+ stream << "(id=" << touchInfo->id << ",startTime=" << touchInfo->startTime << ")";
789+ return true;
790+ });
791+ }
792+
793+ string.append(")");
794+
795+ return string;
673}
796}
797+#endif // ACTIVETOUCHESINFO_DEBUG
674
798
675−void DirectionalDragArea::ActiveTouchesInfo::removeTouchPoint(const QTouchEvent::TouchPoint &touchPoint)
799+void DirectionalDragArea::ActiveTouchesInfo::addTouchPoint(int touchId)
676{
800{
677− for (int i = 0; i <= m_lastUsedIndex; ++i) {
801+ ActiveTouchInfo &activeTouchInfo = m_touchInfoPool.getEmptySlot();
678− if (touchPoint.id() == m_vector.at(i).id) {
802+ activeTouchInfo.id = touchId;
679− freeSlot(i);
803+ activeTouchInfo.startTime = m_timeSource->msecsSinceReference();
680− return;
804+
681− }
805+ #if ACTIVETOUCHESINFO_DEBUG
682− }
806+ qDebug() << "[DDA::ActiveTouchesInfo]" << qPrintable(toString());
683− Q_ASSERT(false); // shouldn't reach this point
807+ #endif
684}
808}
685
809
686−DirectionalDragArea::ActiveTouchInfo &DirectionalDragArea::ActiveTouchesInfo::getEmptySlot()
810+qint64 DirectionalDragArea::ActiveTouchesInfo::touchStartTime(int touchId)
687{
811{
688− Q_ASSERT(m_lastUsedIndex < m_vector.size());
812+ qint64 result = -1;
689
813
690− // Look for an in-between vacancy first
814+ m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
691− for (int i = 0; i < m_lastUsedIndex; ++i) {
815+ if (touchId == touchInfo->id) {
692− ActiveTouchInfo &activeTouchInfo = m_vector[i];
816+ result = touchInfo->startTime;
693− if (!activeTouchInfo.isValid()) {
817+ return false;
694− return activeTouchInfo;
818+ } else {
819+ return true;
695 }
820 }
696− }
821+ });
697−
698− ++m_lastUsedIndex;
699− if (m_lastUsedIndex >= m_vector.size()) {
700− m_vector.resize(m_lastUsedIndex + 1);
701− }
702
822
703− return m_vector[m_lastUsedIndex];
823+ Q_ASSERT(result != -1);
824+ return result;
704}
825}
705
826
706−void DirectionalDragArea::ActiveTouchesInfo::freeSlot(int index)
827+void DirectionalDragArea::ActiveTouchesInfo::removeTouchPoint(int touchId)
707{
828{
708− m_vector[index].reset();
829+ m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &touchInfo) {
709− if (index == m_lastUsedIndex) {
830+ if (touchId == touchInfo->id) {
710− do {
831+ m_touchInfoPool.freeSlot(touchInfo);
711− --m_lastUsedIndex;
832+ return false;
712− } while (m_lastUsedIndex >= 0 && !m_vector.at(m_lastUsedIndex).isValid());
833+ } else {
713− }
834+ return true;
835+ }
836+ });
837+
838+ #if ACTIVETOUCHESINFO_DEBUG
839+ qDebug() << "[DDA::ActiveTouchesInfo]" << qPrintable(toString());
840+ #endif
714}
841}
715
842
716qint64 DirectionalDragArea::ActiveTouchesInfo::mostRecentStartTime()
843qint64 DirectionalDragArea::ActiveTouchesInfo::mostRecentStartTime()
717{
844{
718− Q_ASSERT(m_lastUsedIndex >= 0);
845+ Q_ASSERT(!m_touchInfoPool.isEmpty());
846+
847+ qint64 highestStartTime = -1;
719
848
720− qint64 highestStartTime = m_vector.at(0).startTime;
721− int i = 1;
722− do {
723− const ActiveTouchInfo &activeTouchInfo = m_vector.at(i);
849+ m_touchInfoPool.forEach([&](Pool<ActiveTouchInfo>::Iterator &activeTouchInfo) {
724− if (activeTouchInfo.isValid() && activeTouchInfo.startTime > highestStartTime) {
850+ if (activeTouchInfo->startTime > highestStartTime) {
725− highestStartTime = activeTouchInfo.startTime;
851+ highestStartTime = activeTouchInfo->startTime;
726 }
852 }
727− ++i;
853+ return true;
728− } while (i < m_lastUsedIndex);
854+ });
729
855
730 return highestStartTime;
856 return highestStartTime;
731}
857}
plugins/Ubuntu/Gestures/DirectionalDragArea.h+37−29
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013,2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -19,27 +19,16 @@
19
19
20#include <QtQuick/QQuickItem>
20#include <QtQuick/QQuickItem>
21#include "AxisVelocityCalculator.h"
21#include "AxisVelocityCalculator.h"
22−#include "UbuntuGesturesGlobal.h"
22+#include "UbuntuGesturesQmlGlobal.h"
23#include "Damper.h"
23#include "Damper.h"
24#include "Direction.h"
24#include "Direction.h"
25
25
26−namespace UbuntuGestures {
26+// lib UbuntuGestures
27−/* Defines an interface for a Timer. */
27+#include <Pool.h>
28−class UBUNTUGESTURES_EXPORT AbstractTimer : public QObject {
28+#include <Timer.h>
29− Q_OBJECT
29+
30−public:
30+class TouchOwnershipEvent;
31− AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {}
31+class UnownedTouchEvent;
32− virtual int interval() const = 0;
33− virtual void setInterval(int msecs) = 0;
34− virtual void start() { m_isRunning = true; };
35− virtual void stop() { m_isRunning = false; }
36− bool isRunning() const { return m_isRunning; }
37−Q_SIGNALS:
38− void timeout();
39−private:
40− bool m_isRunning;
41−};
42−}
43
32
44/*
33/*
45 An area that detects axis-aligned single-finger drag gestures
34 An area that detects axis-aligned single-finger drag gestures
@@ -50,7 +39,7 @@ private:
50
39
51 See doc/DirectionalDragArea.svg
40 See doc/DirectionalDragArea.svg
52 */
41 */
53−class UBUNTUGESTURES_EXPORT DirectionalDragArea : public QQuickItem {
42+class UBUNTUGESTURESQML_EXPORT DirectionalDragArea : public QQuickItem {
54 Q_OBJECT
43 Q_OBJECT
55
44
56 // The direction in which the gesture should move in order to be recognized.
45 // The direction in which the gesture should move in order to be recognized.
@@ -196,6 +185,12 @@ public:
196 // Useful for testing, where a fake time source can be supplied
185 // Useful for testing, where a fake time source can be supplied
197 void setTimeSource(const UbuntuGestures::SharedTimeSource &timeSource);
186 void setTimeSource(const UbuntuGestures::SharedTimeSource &timeSource);
198
187
188+ bool event(QEvent *e) override;
189+
190+ // Maximum time, in milliseconds, between a press and a release, for a touch
191+ // sequence to be considered a tap.
192+ int maxTapDuration() const { return 300; }
193+
199Q_SIGNALS:
194Q_SIGNALS:
200 void directionChanged(Direction::Type direction);
195 void directionChanged(Direction::Type direction);
201 void statusChanged(Status value);
196 void statusChanged(Status value);
@@ -212,6 +207,10 @@ Q_SIGNALS:
212 void touchYChanged(qreal value);
207 void touchYChanged(qreal value);
213 void touchSceneXChanged(qreal value);
208 void touchSceneXChanged(qreal value);
214 void touchSceneYChanged(qreal value);
209 void touchSceneYChanged(qreal value);
210+
211+ // TODO: I would rather not have such signal as it has nothing to do with drag gestures.
212+ // Remove when no longer used or move its implementation to the QML code that uses it
213+ // See maxTapDuration()
215 void tapped();
214 void tapped();
216
215
217protected:
216protected:
@@ -219,7 +218,7 @@ protected:
219
218
220private Q_SLOTS:
219private Q_SLOTS:
221 void checkSpeed();
220 void checkSpeed();
222− void onEnabledChanged();
221+ void giveUpIfDisabledOrInvisible();
223
222
224private:
223private:
225 void touchEvent_absent(QTouchEvent *event);
224 void touchEvent_absent(QTouchEvent *event);
@@ -238,6 +237,12 @@ private:
238 // returns the scalar projection between the given vector (in scene coordinates)
237 // returns the scalar projection between the given vector (in scene coordinates)
239 // and m_sceneDirectionVector
238 // and m_sceneDirectionVector
240 qreal projectOntoDirectionVector(const QPointF &sceneVector) const;
239 qreal projectOntoDirectionVector(const QPointF &sceneVector) const;
240+ void touchOwnershipEvent(TouchOwnershipEvent *event);
241+ void unownedTouchEvent(UnownedTouchEvent *event);
242+ void unownedTouchEvent_undecided(UnownedTouchEvent *unownedTouchEvent);
243+ void watchPressedTouchPoints(const QList<QTouchEvent::TouchPoint> &touchPoints);
244+ bool recognitionIsDisabled() const;
245+ void emitSignalIfTapped();
241
246
242 Status m_status;
247 Status m_status;
243
248
@@ -283,18 +288,21 @@ private:
283 public:
288 public:
284 ActiveTouchesInfo(const UbuntuGestures::SharedTimeSource &timeSource);
289 ActiveTouchesInfo(const UbuntuGestures::SharedTimeSource &timeSource);
285 void update(QTouchEvent *event);
290 void update(QTouchEvent *event);
286− ActiveTouchInfo &touchInfo(int id);
291+ qint64 touchStartTime(int id);
292+ bool isEmpty() const { return m_touchInfoPool.isEmpty(); }
287 qint64 mostRecentStartTime();
293 qint64 mostRecentStartTime();
288 UbuntuGestures::SharedTimeSource m_timeSource;
294 UbuntuGestures::SharedTimeSource m_timeSource;
289− bool isEmpty() const { return m_lastUsedIndex == -1; }
290 private:
295 private:
291− void addTouchPoint(const QTouchEvent::TouchPoint &touchPoint);
296+ void addTouchPoint(int touchId);
292− ActiveTouchInfo &getEmptySlot();
293− void freeSlot(int index);
294− void removeTouchPoint(const QTouchEvent::TouchPoint &touchPoint);
297+ void removeTouchPoint(int touchId);
298+ #if ACTIVETOUCHESINFO_DEBUG
299+ QString toString();
300+ #endif
301+
295− QVector<struct ActiveTouchInfo> m_vector;
302+ Pool<ActiveTouchInfo> m_touchInfoPool;
296− int m_lastUsedIndex;
297 } m_activeTouches;
303 } m_activeTouches;
304+
305+ friend class tst_DirectionalDragArea;
298};
306};
299
307
300#endif // DIRECTIONAL_DRAG_AREA_H
308#endif // DIRECTIONAL_DRAG_AREA_H
plugins/Ubuntu/Gestures/TimeSource.h+2−2
@@ -21,14 +21,14 @@
21#ifndef UBUNTUGESTURES_TIMESOURCE_H
21#ifndef UBUNTUGESTURES_TIMESOURCE_H
22#define UBUNTUGESTURES_TIMESOURCE_H
22#define UBUNTUGESTURES_TIMESOURCE_H
23
23
24−#include "UbuntuGesturesGlobal.h"
24+#include "UbuntuGesturesQmlGlobal.h"
25#include <QSharedPointer>
25#include <QSharedPointer>
26
26
27namespace UbuntuGestures {
27namespace UbuntuGestures {
28/*
28/*
29 Interface for a time source.
29 Interface for a time source.
30 */
30 */
31−class UBUNTUGESTURES_EXPORT TimeSource {
31+class UBUNTUGESTURESQML_EXPORT TimeSource {
32public:
32public:
33 virtual ~TimeSource() {}
33 virtual ~TimeSource() {}
34 /* Returns the current time in milliseconds since some reference time in the past. */
34 /* Returns the current time in milliseconds since some reference time in the past. */
plugins/Ubuntu/Gestures/TouchGate.cppnew file+347
@@ -0,0 +1,347 @@
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+#include "TouchGate.h"
18+
19+#include <QCoreApplication>
20+#include <QDebug>
21+
22+#include <TouchOwnershipEvent.h>
23+#include <TouchRegistry.h>
24+
25+#pragma GCC diagnostic push
26+#pragma GCC diagnostic ignored "-pedantic"
27+#include <private/qquickitem_p.h>
28+#pragma GCC diagnostic pop
29+
30+#if TOUCHGATE_DEBUG
31+#include <DebugHelpers.h>
32+#endif
33+
34+
35+bool TouchGate::event(QEvent *e)
36+{
37+ if (e->type() == TouchOwnershipEvent::touchOwnershipEventType()) {
38+ touchOwnershipEvent(static_cast<TouchOwnershipEvent *>(e));
39+ return true;
40+ } else {
41+ return QQuickItem::event(e);
42+ }
43+}
44+
45+void TouchGate::touchEvent(QTouchEvent *event)
46+{
47+ #if TOUCHGATE_DEBUG
48+ qDebug() << "[TouchGate] got touch event" << qPrintable(touchEventToString(event));
49+ #endif
50+ event->accept();
51+
52+ const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
53+ bool goodToGo = true;
54+ for (int i = 0; i < touchPoints.count(); ++i) {
55+ const QTouchEvent::TouchPoint &touchPoint = touchPoints[i];
56+
57+ if (touchPoint.state() == Qt::TouchPointPressed) {
58+ Q_ASSERT(!m_touchInfoMap.contains(touchPoint.id()));
59+ m_touchInfoMap[touchPoint.id()].ownership = OwnershipRequested;
60+ m_touchInfoMap[touchPoint.id()].ended = false;
61+ TouchRegistry::instance()->requestTouchOwnership(touchPoint.id(), this);
62+ }
63+
64+ goodToGo &= m_touchInfoMap.contains(touchPoint.id())
65+ && m_touchInfoMap[touchPoint.id()].ownership == OwnershipGranted;
66+
67+ if (touchPoint.state() == Qt::TouchPointReleased && m_touchInfoMap.contains(touchPoint.id())) {
68+ m_touchInfoMap[touchPoint.id()].ended = true;
69+ }
70+
71+ }
72+
73+ if (goodToGo) {
74+ if (m_storedEvents.isEmpty()) {
75+ // let it pass through
76+ dispatchTouchEventToTarget(event);
77+ } else {
78+ // Retain the event to ensure TouchGate dispatches them in order.
79+ // Otherwise the current event would come before the stored ones, which are older.
80+ #if TOUCHGATE_DEBUG
81+ qDebug("[TouchGate] Storing event because thouches %s are still pending ownership.",
82+ qPrintable(oldestPendingTouchIdsString()));
83+ #endif
84+ storeTouchEvent(event);
85+ }
86+ } else {
87+ // Retain events that have unowned touches
88+ storeTouchEvent(event);
89+ }
90+}
91+
92+void TouchGate::touchOwnershipEvent(TouchOwnershipEvent *event)
93+{
94+ // TODO: Optimization: batch those actions as TouchOwnershipEvents
95+ // might come one right after the other.
96+
97+ Q_ASSERT(m_touchInfoMap.contains(event->touchId()));
98+
99+ TouchInfo &touchInfo = m_touchInfoMap[event->touchId()];
100+
101+ if (event->gained()) {
102+ #if TOUCHGATE_DEBUG
103+ qDebug() << "[TouchGate] Got ownership of touch " << event->touchId();
104+ #endif
105+ touchInfo.ownership = OwnershipGranted;
106+ } else {
107+ #if TOUCHGATE_DEBUG
108+ qDebug() << "[TouchGate] Lost ownership of touch " << event->touchId();
109+ #endif
110+ m_touchInfoMap.remove(event->touchId());
111+ removeTouchFromStoredEvents(event->touchId());
112+ }
113+
114+ dispatchFullyOwnedEvents();
115+}
116+
117+bool TouchGate::isTouchPointOwned(int touchId) const
118+{
119+ return m_touchInfoMap[touchId].ownership == OwnershipGranted;
120+}
121+
122+void TouchGate::storeTouchEvent(const QTouchEvent *event)
123+{
124+ #if TOUCHGATE_DEBUG
125+ qDebug() << "[TouchGate] Storing" << qPrintable(touchEventToString(event));
126+ #endif
127+
128+ TouchEvent clonedEvent(event);
129+ m_storedEvents.append(std::move(clonedEvent));
130+}
131+
132+void TouchGate::removeTouchFromStoredEvents(int touchId)
133+{
134+ int i = 0;
135+ while (i < m_storedEvents.count()) {
136+ TouchEvent &event = m_storedEvents[i];
137+ bool removed = event.removeTouch(touchId);
138+
139+ if (removed && event.touchPoints.isEmpty()) {
140+ m_storedEvents.removeAt(i);
141+ } else {
142+ ++i;
143+ }
144+ }
145+}
146+
147+void TouchGate::dispatchFullyOwnedEvents()
148+{
149+ while (!m_storedEvents.isEmpty() && eventIsFullyOwned(m_storedEvents.first())) {
150+ TouchEvent event = m_storedEvents.takeFirst();
151+ dispatchTouchEventToTarget(event);
152+ }
153+}
154+
155+#if TOUCHGATE_DEBUG
156+QString TouchGate::oldestPendingTouchIdsString()
157+{
158+ Q_ASSERT(!m_storedEvents.isEmpty());
159+
160+ QString str;
161+
162+ const auto &touchPoints = m_storedEvents.first().touchPoints;
163+ for (int i = 0; i < touchPoints.count(); ++i) {
164+ if (!isTouchPointOwned(touchPoints[i].id())) {
165+ if (!str.isEmpty()) {
166+ str.append(", ");
167+ }
168+ str.append(QString::number(touchPoints[i].id()));
169+ }
170+ }
171+
172+ return str;
173+}
174+#endif
175+
176+bool TouchGate::eventIsFullyOwned(const TouchGate::TouchEvent &event) const
177+{
178+ for (int i = 0; i < event.touchPoints.count(); ++i) {
179+ if (!isTouchPointOwned(event.touchPoints[i].id())) {
180+ return false;
181+ }
182+ }
183+
184+ return true;
185+}
186+
187+void TouchGate::setTargetItem(QQuickItem *item)
188+{
189+ // TODO: changing the target item while dispatch of touch events is taking place will
190+ // create a mess
191+
192+ if (item == m_targetItem.data())
193+ return;
194+
195+ m_targetItem = item;
196+ Q_EMIT targetItemChanged(item);
197+}
198+
199+void TouchGate::dispatchTouchEventToTarget(const TouchEvent &event)
200+{
201+ dispatchTouchEventToTarget(event.eventType,
202+ event.device,
203+ event.modifiers,
204+ event.touchPoints,
205+ event.target,
206+ event.window,
207+ event.timestamp);
208+}
209+
210+void TouchGate::dispatchTouchEventToTarget(QTouchEvent* event)
211+{
212+ dispatchTouchEventToTarget(event->type(),
213+ event->device(),
214+ event->modifiers(),
215+ event->touchPoints(),
216+ event->target(),
217+ event->window(),
218+ event->timestamp());
219+}
220+
221+void TouchGate::dispatchTouchEventToTarget(QEvent::Type eventType,
222+ QTouchDevice *device,
223+ Qt::KeyboardModifiers modifiers,
224+ const QList<QTouchEvent::TouchPoint> &touchPoints,
225+ QObject *target,
226+ QWindow *window,
227+ ulong timestamp)
228+{
229+ removeTouchInfoForEndedTouches(touchPoints);
230+
231+ if (m_targetItem.isNull()) {
232+ qWarning("[TouchGate] Cannot dispatch touch event because target item is null");
233+ return;
234+ }
235+
236+ QQuickItem *targetItem = m_targetItem.data();
237+
238+ if (!targetItem->isEnabled() || !targetItem->isVisible()) {
239+ #if TOUCHGATE_DEBUG
240+ qDebug() << "[TouchGate] Cannot dispatch touch event to" << targetItem
241+ << "because it's disabled or invisible.";
242+ #endif
243+ return;
244+ }
245+
246+ // Map touch points to targetItem coordinates
247+ QList<QTouchEvent::TouchPoint> targetTouchPoints = touchPoints;
248+ transformTouchPoints(targetTouchPoints, QQuickItemPrivate::get(targetItem)->windowToItemTransform());
249+ QTouchEvent *eventForTargetItem = createQTouchEvent(eventType, device, modifiers, targetTouchPoints,
250+ target, window, timestamp);
251+
252+ #if TOUCHGATE_DEBUG
253+ qDebug() << "[TouchGate] dispatching" << qPrintable(touchEventToString(eventForTargetItem))
254+ << "to" << targetItem;
255+ #endif
256+
257+ QCoreApplication::sendEvent(targetItem, eventForTargetItem);
258+
259+ delete eventForTargetItem;
260+}
261+
262+// NB: From QQuickWindow
263+void TouchGate::transformTouchPoints(QList<QTouchEvent::TouchPoint> &touchPoints, const QTransform &transform)
264+{
265+ QMatrix4x4 transformMatrix(transform);
266+ for (int i=0; i<touchPoints.count(); i++) {
267+ QTouchEvent::TouchPoint &touchPoint = touchPoints[i];
268+ touchPoint.setRect(transform.mapRect(touchPoint.sceneRect()));
269+ touchPoint.setStartPos(transform.map(touchPoint.startScenePos()));
270+ touchPoint.setLastPos(transform.map(touchPoint.lastScenePos()));
271+ touchPoint.setVelocity(transformMatrix.mapVector(touchPoint.velocity()).toVector2D());
272+ }
273+}
274+
275+QTouchEvent *TouchGate::createQTouchEvent(QEvent::Type eventType,
276+ QTouchDevice *device,
277+ Qt::KeyboardModifiers modifiers,
278+ const QList<QTouchEvent::TouchPoint> &touchPoints,
279+ QObject *target,
280+ QWindow *window,
281+ ulong timestamp)
282+{
283+ Qt::TouchPointStates eventStates = 0;
284+ for (int i = 0; i < touchPoints.count(); i++)
285+ eventStates |= touchPoints[i].state();
286+ // if all points have the same state, set the event type accordingly
287+ switch (eventStates) {
288+ case Qt::TouchPointPressed:
289+ eventType = QEvent::TouchBegin;
290+ break;
291+ case Qt::TouchPointReleased:
292+ eventType = QEvent::TouchEnd;
293+ break;
294+ default:
295+ eventType = QEvent::TouchUpdate;
296+ break;
297+ }
298+
299+ QTouchEvent *touchEvent = new QTouchEvent(eventType);
300+ touchEvent->setWindow(window);
301+ touchEvent->setTarget(target);
302+ touchEvent->setDevice(device);
303+ touchEvent->setModifiers(modifiers);
304+ touchEvent->setTouchPoints(touchPoints);
305+ touchEvent->setTouchPointStates(eventStates);
306+ touchEvent->setTimestamp(timestamp);
307+ touchEvent->accept();
308+ return touchEvent;
309+}
310+
311+void TouchGate::removeTouchInfoForEndedTouches(const QList<QTouchEvent::TouchPoint> &touchPoints)
312+{
313+ for (int i = 0; i < touchPoints.size(); ++i) {\
314+ const QTouchEvent::TouchPoint &touchPoint = touchPoints.at(i);
315+
316+ if (touchPoint.state() == Qt::TouchPointReleased) {
317+ Q_ASSERT(m_touchInfoMap.contains(touchPoint.id()));
318+ Q_ASSERT(m_touchInfoMap[touchPoint.id()].ended);
319+ Q_ASSERT(m_touchInfoMap[touchPoint.id()].ownership == OwnershipGranted);
320+ m_touchInfoMap.remove(touchPoint.id());
321+ }
322+ }
323+}
324+
325+TouchGate::TouchEvent::TouchEvent(const QTouchEvent *event)
326+ : eventType(event->type())
327+ , device(event->device())
328+ , modifiers(event->modifiers())
329+ , touchPoints(event->touchPoints())
330+ , target(event->target())
331+ , window(event->window())
332+ , timestamp(event->timestamp())
333+{
334+}
335+
336+bool TouchGate::TouchEvent::removeTouch(int touchId)
337+{
338+ bool removed = false;
339+ for (int i = 0; i < touchPoints.count() && !removed; ++i) {
340+ if (touchPoints[i].id() == touchId) {
341+ touchPoints.removeAt(i);
342+ removed = true;
343+ }
344+ }
345+
346+ return removed;
347+}
plugins/Ubuntu/Gestures/TouchGate.hnew file+126
@@ -0,0 +1,126 @@
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+#ifndef UBUNTU_TOUCH_GATE_H
18+#define UBUNTU_TOUCH_GATE_H
19+
20+#include "UbuntuGesturesQmlGlobal.h"
21+
22+#include <QQuickItem>
23+#include <QList>
24+#include <QPointer>
25+#include <QMap>
26+
27+#define TOUCHGATE_DEBUG 0
28+
29+class TouchOwnershipEvent;
30+
31+/*
32+ Blocks the passage of events until ownership over the related touch points is granted.
33+
34+ Blocked touch events won't be discarded. Instead they will be buffered until ownership
35+ is granted. If ownership is given to another item, the event buffer is cleared.
36+
37+ A TouchGate is useful as a mediator for items that do not understand, or gracefully handle,
38+ touch canceling. By having a TouchGate in front of them you guarantee that only owned touches (i.e.,
39+ touches that won't be canceled later) reaches them.
40+ */
41+class UBUNTUGESTURESQML_EXPORT TouchGate : public QQuickItem {
42+ Q_OBJECT
43+
44+ // Item that's going to receive the touch events that make it through the gate.
45+ Q_PROPERTY(QQuickItem* targetItem READ targetItem WRITE setTargetItem NOTIFY targetItemChanged)
46+
47+public:
48+ bool event(QEvent *e) override;
49+
50+ QQuickItem *targetItem() { return m_targetItem; }
51+ void setTargetItem(QQuickItem *item);
52+
53+Q_SIGNALS:
54+ void targetItemChanged(QQuickItem *item);
55+
56+protected:
57+ void touchEvent(QTouchEvent *event) override;
58+private:
59+ class TouchEvent {
60+ public:
61+ TouchEvent(const QTouchEvent *event);
62+
63+ bool removeTouch(int touchId);
64+
65+ QEvent::Type eventType;
66+ QTouchDevice *device;
67+ Qt::KeyboardModifiers modifiers;
68+ QList<QTouchEvent::TouchPoint> touchPoints;
69+ QObject *target;
70+ QWindow *window;
71+ ulong timestamp;
72+ };
73+
74+ void touchOwnershipEvent(TouchOwnershipEvent *event);
75+ bool isTouchPointOwned(int touchId) const;
76+ void storeTouchEvent(const QTouchEvent *event);
77+ void removeTouchFromStoredEvents(int touchId);
78+ void dispatchFullyOwnedEvents();
79+ bool eventIsFullyOwned(const TouchEvent &event) const;
80+
81+ void dispatchTouchEventToTarget(const TouchEvent &event);
82+ void dispatchTouchEventToTarget(QTouchEvent* event);
83+ void dispatchTouchEventToTarget(
84+ QEvent::Type eventType,
85+ QTouchDevice *device,
86+ Qt::KeyboardModifiers modifiers,
87+ const QList<QTouchEvent::TouchPoint> &touchPoints,
88+ QObject *target,
89+ QWindow *window,
90+ ulong timestamp);
91+
92+ void transformTouchPoints(QList<QTouchEvent::TouchPoint> &touchPoints, const QTransform &transform);
93+ static QTouchEvent *createQTouchEvent(QEvent::Type eventType,
94+ QTouchDevice *device,
95+ Qt::KeyboardModifiers modifiers,
96+ const QList<QTouchEvent::TouchPoint> &touchPoints,
97+ QObject *target,
98+ QWindow *window,
99+ ulong timestamp);
100+ void removeTouchInfoForEndedTouches(const QList<QTouchEvent::TouchPoint> &touchPoints);
101+
102+ #if TOUCHGATE_DEBUG
103+ QString oldestPendingTouchIdsString();
104+ #endif
105+
106+ QList<TouchEvent> m_storedEvents;
107+
108+ enum {
109+ OwnershipUndefined,
110+ OwnershipRequested,
111+ OwnershipGranted,
112+ };
113+ class TouchInfo {
114+ public:
115+ TouchInfo() {ownership = OwnershipUndefined; ended = false;}
116+ int ownership;
117+ bool ended;
118+ };
119+ QMap<int, TouchInfo> m_touchInfoMap;
120+
121+ QPointer<QQuickItem> m_targetItem;
122+
123+ friend class tst_TouchGate;
124+};
125+
126+#endif // UBUNTU_TOUCH_GATE_H
plugins/Ubuntu/Gestures/UbuntuGesturesQmlGlobal.hnew file+23
@@ -0,0 +1,23 @@
1+/*
2+ * Copyright (C) 2013 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+#include <QtCore/QtGlobal>
18+
19+#if defined(UBUNTUGESTURESQML_LIBRARY)
20+# define UBUNTUGESTURESQML_EXPORT Q_DECL_EXPORT
21+#else
22+# define UBUNTUGESTURESQML_EXPORT Q_DECL_IMPORT
23+#endif
plugins/Ubuntu/Gestures/plugin.cpp+3−1
@@ -19,6 +19,7 @@
19#include "Direction.h"
19#include "Direction.h"
20#include "DirectionalDragArea.h"
20#include "DirectionalDragArea.h"
21#include "PressedOutsideNotifier.h"
21#include "PressedOutsideNotifier.h"
22+#include "TouchGate.h"
22
23
23#include <qqml.h>
24#include <qqml.h>
24
25
@@ -28,10 +29,11 @@ static QObject* directionSingleton(QQmlEngine* engine, QJSEngine* scriptEngine)
28 return new Direction;
29 return new Direction;
29}
30}
30
31
31−void UbuntuGestureQmlPlugin::registerTypes(const char *uri)
32+void UbuntuGesturesQmlPlugin::registerTypes(const char *uri)
32{
33{
33 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
34 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
34 qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
35 qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
35 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
36 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
36 qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
37 qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
38+ qmlRegisterType<TouchGate>(uri, 0, 1, "TouchGate");
37}
39}
plugins/Ubuntu/Gestures/plugin.h+1−1
@@ -19,7 +19,7 @@
19
19
20#include <QtQml/QQmlExtensionPlugin>
20#include <QtQml/QQmlExtensionPlugin>
21
21
22−class UbuntuGestureQmlPlugin : public QQmlExtensionPlugin
22+class UbuntuGesturesQmlPlugin : public QQmlExtensionPlugin
23{
23{
24 Q_OBJECT
24 Q_OBJECT
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
plugins/Ubuntu/Gestures/qmldir+1−1
@@ -1,3 +1,3 @@
1module Ubuntu.Gestures
1module Ubuntu.Gestures
2−plugin UbuntuGestureQml
2+plugin UbuntuGesturesQml
3typeinfo Gestures.qmltypes
3typeinfo Gestures.qmltypes
po/am.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-08 00:48+0000\n"
11"PO-Revision-Date: 2014-10-08 00:48+0000\n"
12"Last-Translator: samson <Unknown>\n"
12"Last-Translator: samson <Unknown>\n"
13"Language-Team: Amharic <am@li.org>\n"
13"Language-Team: Amharic <am@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgid ""
155msgstr ""
155msgstr ""
156"አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
156"አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
157
157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159msgid "Emergency Call"
159msgid "Emergency Call"
160msgstr "የ ድንገተኛ ጥሪ"
160msgstr "የ ድንገተኛ ጥሪ"
161
161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163msgid "OK"
163msgid "OK"
164msgstr "እሺ"
164msgstr "እሺ"
165
165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167msgid "See less"
167msgid "See less"
168msgstr "አነስተኛ መመልከቻ"
168msgstr "አነስተኛ መመልከቻ"
169
169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171msgid "See all"
171msgid "See all"
172msgstr "ሁሉንም መመልከቻ"
172msgstr "ሁሉንም መመልከቻ"
173
173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175#: qml/Panel/SearchIndicator.qml:27
175#: qml/Panel/SearchIndicator.qml:27
176msgid "Search"
176msgid "Search"
177msgstr "መፈለጊያ"
177msgstr "መፈለጊያ"
@@ -260,18 +260,10 @@ msgstr "አሁን ይናገሩ..."
260msgid "Speaking..."
260msgid "Speaking..."
261msgstr "በመናገር ላይ..."
261msgstr "በመናገር ላይ..."
262
262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264msgid "Show password"
264msgid "Show password"
265msgstr "የመግቢያ ቃል ማሳያ"
265msgstr "የመግቢያ ቃል ማሳያ"
266
266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr "ሲም ፒን ያስገቡ"
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "አዝናለሁ የተሳሳተ ፒን"
274−
275#: qml/Panel/ActiveCallHint.qml:77
267#: qml/Panel/ActiveCallHint.qml:77
276msgid "Tap to return to call..."
268msgid "Tap to return to call..."
277msgstr "ወደ ጥሪው ለመመለስ መታ ያድርጉ..."
269msgstr "ወደ ጥሪው ለመመለስ መታ ያድርጉ..."
@@ -316,49 +308,49 @@ msgstr "ሲም መክፈቻ"
316msgid "Roaming"
308msgid "Roaming"
317msgstr "ማዘዋወሪያ"
309msgstr "ማዘዋወሪያ"
318
310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320msgid "Enter passphrase"
312msgid "Enter passphrase"
321msgstr "የ ማለፊያ ሀረግ ያስገቡ"
313msgstr "የ ማለፊያ ሀረግ ያስገቡ"
322
314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324msgid "Sorry, incorrect passphrase"
316msgid "Sorry, incorrect passphrase"
325msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
317msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
326
318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328msgid "Please re-enter"
320msgid "Please re-enter"
329msgstr "እባክዎን እንደገና-ያስገቡ"
321msgstr "እባክዎን እንደገና-ያስገቡ"
330
322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332msgid "Enter passcode"
324msgid "Enter passcode"
333msgstr "የ ማለፊያ ኮድ ያስገቡ"
325msgstr "የ ማለፊያ ኮድ ያስገቡ"
334
326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336msgid "Sorry, incorrect passcode"
328msgid "Sorry, incorrect passcode"
337msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
329msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
338
330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340#, qt-format
332#, qt-format
341msgid "Enter %1"
333msgid "Enter %1"
342msgstr "ማስገቢያ %1"
334msgstr "ማስገቢያ %1"
343
335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345#, qt-format
337#, qt-format
346msgid "Sorry, incorrect %1"
338msgid "Sorry, incorrect %1"
347msgstr "አዝናለሁ: የተሳሳተ%1"
339msgstr "አዝናለሁ: የተሳሳተ%1"
348
340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350msgid "Sorry, incorrect passphrase."
342msgid "Sorry, incorrect passphrase."
351msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
343msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
352
344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354msgid "Sorry, incorrect passcode."
346msgid "Sorry, incorrect passcode."
355msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
347msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
356
348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358msgid "This will be your last attempt."
350msgid "This will be your last attempt."
359msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
351msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
360
352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362msgid ""
354msgid ""
363"If passphrase is entered incorrectly, your phone will conduct a factory "
355"If passphrase is entered incorrectly, your phone will conduct a factory "
364"reset and all personal data will be deleted."
356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366"የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
358"የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
367"ይጠፋል"
359"ይጠፋል"
368
360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370msgid ""
362msgid ""
371"If passcode is entered incorrectly, your phone will conduct a factory reset "
363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372"and all personal data will be deleted."
364"and all personal data will be deleted."
@@ -374,28 +366,8 @@ msgstr ""
374"የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
366"የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
375"ይጠፋል"
367"ይጠፋል"
376
368
377−#, qt-format
369+#~ msgid "Sorry, incorrect PIN"
378−#~ msgid "Hello %1"
370+#~ msgstr "አዝናለሁ የተሳሳተ ፒን"
379−#~ msgstr "ሰላም %1"
380−
381−#~ msgid "Hello"
382−#~ msgstr "ሰላም"
383−
384−#~ msgid "Swipe to unlock"
385−#~ msgstr "ለመክፈት ይጥረጉ"
386−
387−#~ msgid "Please wait"
388−#~ msgstr "እባክዎን ይቆዩ"
389−
390−#~ msgid "Too many incorrect attempts"
391−#~ msgstr "በርካታ የተሳሳቱ ሙከራዎች"
392−
393−#, qt-format
394−#~ msgid "Enter your %1"
395−#~ msgstr "ያስገቡ የ እርስዎን %1"
396−
397−#~ msgid "Enter your passphrase"
398−#~ msgstr "የማለፊያ ሐረግ ያስገቡ"
399
371
400−#~ msgid "Enter your passcode"
372+#~ msgid "Enter SIM PIN"
401−#~ msgstr "የ እርስዎን የማለፊያ ኮድ ያስገቡ"
373+#~ msgstr "ሲም ፒን ያስገቡ"
po/ar.po+20−38
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-05-22 08:22+0000\n"
11"PO-Revision-Date: 2014-05-22 08:22+0000\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13"Language-Team: Arabic <ar@li.org>\n"
13"Language-Team: Arabic <ar@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156"أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
156"أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
157"الشاشة للبدء"
157"الشاشة للبدء"
158
158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160msgid "Emergency Call"
160msgid "Emergency Call"
161msgstr "مكالمة طوارئ"
161msgstr "مكالمة طوارئ"
162
162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164msgid "OK"
164msgid "OK"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168msgid "See less"
168msgid "See less"
169msgstr "شاهد أقل"
169msgstr "شاهد أقل"
170
170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172msgid "See all"
172msgid "See all"
173msgstr ""
173msgstr ""
174
174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176#: qml/Panel/SearchIndicator.qml:27
176#: qml/Panel/SearchIndicator.qml:27
177msgid "Search"
177msgid "Search"
178msgstr "ابحث"
178msgstr "ابحث"
@@ -261,18 +261,10 @@ msgstr "تكلم الآن..."
261msgid "Speaking..."
261msgid "Speaking..."
262msgstr "تتكلم الآن..."
262msgstr "تتكلم الآن..."
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265msgid "Show password"
265msgid "Show password"
266msgstr "عرض كلمة السر"
266msgstr "عرض كلمة السر"
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr ""
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr ""
275−
276#: qml/Panel/ActiveCallHint.qml:77
268#: qml/Panel/ActiveCallHint.qml:77
277msgid "Tap to return to call..."
269msgid "Tap to return to call..."
278msgstr ""
270msgstr ""
@@ -317,66 +309,56 @@ msgstr ""
317msgid "Roaming"
309msgid "Roaming"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321msgid "Enter passphrase"
313msgid "Enter passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325msgid "Sorry, incorrect passphrase"
317msgid "Sorry, incorrect passphrase"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329msgid "Please re-enter"
321msgid "Please re-enter"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333msgid "Enter passcode"
325msgid "Enter passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337msgid "Sorry, incorrect passcode"
329msgid "Sorry, incorrect passcode"
338msgstr ""
330msgstr ""
339
331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341#, qt-format
333#, qt-format
342msgid "Enter %1"
334msgid "Enter %1"
343msgstr ""
335msgstr ""
344
336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346#, qt-format
338#, qt-format
347msgid "Sorry, incorrect %1"
339msgid "Sorry, incorrect %1"
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351msgid "Sorry, incorrect passphrase."
343msgid "Sorry, incorrect passphrase."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355msgid "Sorry, incorrect passcode."
347msgid "Sorry, incorrect passcode."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359msgid "This will be your last attempt."
351msgid "This will be your last attempt."
360msgstr ""
352msgstr ""
361
353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363msgid ""
355msgid ""
364"If passphrase is entered incorrectly, your phone will conduct a factory "
356"If passphrase is entered incorrectly, your phone will conduct a factory "
365"reset and all personal data will be deleted."
357"reset and all personal data will be deleted."
366msgstr ""
358msgstr ""
367
359
368−#: qml/Shell.qml:389
360+#: qml/Shell.qml:395
369msgid ""
361msgid ""
370"If passcode is entered incorrectly, your phone will conduct a factory reset "
362"If passcode is entered incorrectly, your phone will conduct a factory reset "
371"and all personal data will be deleted."
363"and all personal data will be deleted."
372msgstr ""
364msgstr ""
373−
374−#, qt-format
375−#~ msgid "Hello %1"
376−#~ msgstr "مرحبا %1"
377−
378−#~ msgid "Hello"
379−#~ msgstr "مرحبًا"
380−
381−#~ msgid "Swipe to unlock"
382−#~ msgstr "اسحب لفتح القفل"
po/ast.po+32−59
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2014-10-03 22:20+0000\n"
11+"PO-Revision-Date: 2014-10-09 09:49+0000\n"
12−"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
12+"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
13"Language-Team: Asturian <ast@li.org>\n"
13"Language-Team: Asturian <ast@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -37,11 +37,12 @@ msgstr "Preséu bloquiáu"
37
37
38#: qml/Components/DelayedLockscreen.qml:62
38#: qml/Components/DelayedLockscreen.qml:62
39msgid "You have been locked out due to too many failed passphrase attempts."
39msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "Quedasti bloquiáu polos escesivos intentos fallíos de frase de pasu."
41
41
42#: qml/Components/DelayedLockscreen.qml:63
42#: qml/Components/DelayedLockscreen.qml:63
43msgid "You have been locked out due to too many failed passcode attempts."
43msgid "You have been locked out due to too many failed passcode attempts."
44msgstr ""
44msgstr ""
45+"Quedasti bloquiáu polos escesivos intentos fallíos de códigu de pasu."
45
46
46#: qml/Components/DelayedLockscreen.qml:72
47#: qml/Components/DelayedLockscreen.qml:72
47#, qt-format
48#, qt-format
@@ -158,23 +159,23 @@ msgstr ""
158"Agora yá domines los xestos de los berbesos y pues entamar a usar el "
159"Agora yá domines los xestos de los berbesos y pues entamar a usar el "
159"teléfonu<br><br>Toca la pantalla pa comenzar"
160"teléfonu<br><br>Toca la pantalla pa comenzar"
160
161
161−#: qml/Components/Lockscreen.qml:218
162+#: qml/Components/Lockscreen.qml:220
162msgid "Emergency Call"
163msgid "Emergency Call"
163msgstr "Llamada d'emerxencia"
164msgstr "Llamada d'emerxencia"
164
165
165−#: qml/Components/Lockscreen.qml:250
166+#: qml/Components/Lockscreen.qml:252
166msgid "OK"
167msgid "OK"
167msgstr "Aceutar"
168msgstr "Aceutar"
168
169
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
170+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170msgid "See less"
171msgid "See less"
171msgstr "Ver menos"
172msgstr "Ver menos"
172
173
173−#: qml/Dash/GenericScopeView.qml:411
174+#: qml/Dash/GenericScopeView.qml:434
174msgid "See all"
175msgid "See all"
175msgstr "Ver too"
176msgstr "Ver too"
176
177
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
178+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178#: qml/Panel/SearchIndicator.qml:27
179#: qml/Panel/SearchIndicator.qml:27
179msgid "Search"
180msgid "Search"
180msgstr "Guetar"
181msgstr "Guetar"
@@ -213,11 +214,11 @@ msgstr "Unviar"
213
214
214#: qml/Dash/PullToRefreshScopeStyle.qml:55
215#: qml/Dash/PullToRefreshScopeStyle.qml:55
215msgid "Pull to refresh…"
216msgid "Pull to refresh…"
216−msgstr ""
217+msgstr "Tirar p'anovar..."
217
218
218#: qml/Dash/PullToRefreshScopeStyle.qml:60
219#: qml/Dash/PullToRefreshScopeStyle.qml:60
219msgid "Release to refresh…"
220msgid "Release to refresh…"
220−msgstr ""
221+msgstr "Soltar p'anovar..."
221
222
222#: qml/Dash/ScopesOverview.qml:206
223#: qml/Dash/ScopesOverview.qml:206
223msgid "Manage Scopes"
224msgid "Manage Scopes"
@@ -263,18 +264,10 @@ msgstr "Fala agora…"
263msgid "Speaking..."
264msgid "Speaking..."
264msgstr "Falando…"
265msgstr "Falando…"
265
266
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
267+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267msgid "Show password"
268msgid "Show password"
268msgstr "Amosar contraseña"
269msgstr "Amosar contraseña"
269
270
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Escribi'l PIN de la SIM"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "PIN incorreutu"
277−
278#: qml/Panel/ActiveCallHint.qml:77
271#: qml/Panel/ActiveCallHint.qml:77
279msgid "Tap to return to call..."
272msgid "Tap to return to call..."
280msgstr "Tocar pa tornar a la llamada..."
273msgstr "Tocar pa tornar a la llamada..."
@@ -319,49 +312,49 @@ msgstr "Desbloquiar SIM"
319msgid "Roaming"
312msgid "Roaming"
320msgstr "Roaming"
313msgstr "Roaming"
321
314
322−#: qml/Shell.qml:340
315+#: qml/Shell.qml:346
323msgid "Enter passphrase"
316msgid "Enter passphrase"
324−msgstr ""
317+msgstr "Escribi la frase contraseña"
325
318
326−#: qml/Shell.qml:341
319+#: qml/Shell.qml:347
327msgid "Sorry, incorrect passphrase"
320msgid "Sorry, incorrect passphrase"
328msgstr "Sentímoslo, contraseña incorreuta"
321msgstr "Sentímoslo, contraseña incorreuta"
329
322
330−#: qml/Shell.qml:342
323+#: qml/Shell.qml:348
331msgid "Please re-enter"
324msgid "Please re-enter"
332msgstr "Vuelvi a escribila"
325msgstr "Vuelvi a escribila"
333
326
334−#: qml/Shell.qml:344
327+#: qml/Shell.qml:350
335msgid "Enter passcode"
328msgid "Enter passcode"
336−msgstr ""
329+msgstr "Escribi'l códigu de pasu"
337
330
338−#: qml/Shell.qml:345
331+#: qml/Shell.qml:351
339msgid "Sorry, incorrect passcode"
332msgid "Sorry, incorrect passcode"
340msgstr "Sentímoslo, códigu de pasu incorreutu"
333msgstr "Sentímoslo, códigu de pasu incorreutu"
341
334
342−#: qml/Shell.qml:348
335+#: qml/Shell.qml:354
343#, qt-format
336#, qt-format
344msgid "Enter %1"
337msgid "Enter %1"
345msgstr "Escribi %1"
338msgstr "Escribi %1"
346
339
347−#: qml/Shell.qml:349
340+#: qml/Shell.qml:355
348#, qt-format
341#, qt-format
349msgid "Sorry, incorrect %1"
342msgid "Sorry, incorrect %1"
350msgstr "Sentímoslo, %1 incorreutu"
343msgstr "Sentímoslo, %1 incorreutu"
351
344
352−#: qml/Shell.qml:384
345+#: qml/Shell.qml:390
353msgid "Sorry, incorrect passphrase."
346msgid "Sorry, incorrect passphrase."
354msgstr "Fras de pasu incorreuta"
347msgstr "Fras de pasu incorreuta"
355
348
356−#: qml/Shell.qml:385
349+#: qml/Shell.qml:391
357msgid "Sorry, incorrect passcode."
350msgid "Sorry, incorrect passcode."
358msgstr "Códigu de pasu incorreutu"
351msgstr "Códigu de pasu incorreutu"
359
352
360−#: qml/Shell.qml:386
353+#: qml/Shell.qml:392
361msgid "This will be your last attempt."
354msgid "This will be your last attempt."
362msgstr "Esti ye'l caberu intentu."
355msgstr "Esti ye'l caberu intentu."
363
356
364−#: qml/Shell.qml:388
357+#: qml/Shell.qml:394
365msgid ""
358msgid ""
366"If passphrase is entered incorrectly, your phone will conduct a factory "
359"If passphrase is entered incorrectly, your phone will conduct a factory "
367"reset and all personal data will be deleted."
360"reset and all personal data will be deleted."
@@ -369,7 +362,7 @@ msgstr ""
369"Si s'inxerta la fras incorreutamente, el teléfonu va volver a la "
362"Si s'inxerta la fras incorreutamente, el teléfonu va volver a la "
370"configuración de fábrica y van perdese tolos datos personales."
363"configuración de fábrica y van perdese tolos datos personales."
371
364
372−#: qml/Shell.qml:389
365+#: qml/Shell.qml:395
373msgid ""
366msgid ""
374"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
375"and all personal data will be deleted."
368"and all personal data will be deleted."
@@ -377,28 +370,8 @@ msgstr ""
377"Si s'inxerta'l códigu incorreutamente, el teléfonu va volver a la "
370"Si s'inxerta'l códigu incorreutamente, el teléfonu va volver a la "
378"configuración de fábrica y van perdese tolos datos personales."
371"configuración de fábrica y van perdese tolos datos personales."
379
372
380−#~ msgid "Hello"
373+#~ msgid "Sorry, incorrect PIN"
381−#~ msgstr "Hola"
374+#~ msgstr "PIN incorreutu"
382−
383−#, qt-format
384−#~ msgid "Hello %1"
385−#~ msgstr "Hola %1"
386−
387−#~ msgid "Swipe to unlock"
388−#~ msgstr "Esliza pa desbloquiar"
389−
390−#~ msgid "Please wait"
391−#~ msgstr "Espera un segundu"
392−
393−#, qt-format
394−#~ msgid "Enter your %1"
395−#~ msgstr "Introduz %1"
396−
397−#~ msgid "Enter your passphrase"
398−#~ msgstr "Introduz contraseña"
399−
400−#~ msgid "Enter your passcode"
401−#~ msgstr "Introduz códigu de pasu"
402
375
403−#~ msgid "Too many incorrect attempts"
376+#~ msgid "Enter SIM PIN"
404−#~ msgstr "Munchos intentos incorreutos"
377+#~ msgstr "Escribi'l PIN de la SIM"
po/az.po+24−49
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgstr ""
155"Siz künc hәrәkәtlәrini öyrәndiniz və telefonu istifadə etməyə başlaya "
155"Siz künc hәrәkәtlәrini öyrәndiniz və telefonu istifadə etməyə başlaya "
156"bilərsiniz.<br><br>Başlamaq üçün ekrana toxunun"
156"bilərsiniz.<br><br>Başlamaq üçün ekrana toxunun"
157
157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159msgid "Emergency Call"
159msgid "Emergency Call"
160msgstr "Zərurət zəngi"
160msgstr "Zərurət zəngi"
161
161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163msgid "OK"
163msgid "OK"
164msgstr "Oldu"
164msgstr "Oldu"
165
165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167msgid "See less"
167msgid "See less"
168msgstr "Daha azını gör"
168msgstr "Daha azını gör"
169
169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171msgid "See all"
171msgid "See all"
172msgstr "Hamısını gör"
172msgstr "Hamısını gör"
173
173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175#: qml/Panel/SearchIndicator.qml:27
175#: qml/Panel/SearchIndicator.qml:27
176msgid "Search"
176msgid "Search"
177msgstr "Axtar"
177msgstr "Axtar"
@@ -260,18 +260,10 @@ msgstr "Danışın..."
260msgid "Speaking..."
260msgid "Speaking..."
261msgstr "Danışır..."
261msgstr "Danışır..."
262
262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264msgid "Show password"
264msgid "Show password"
265msgstr "Şifrәni göstәr"
265msgstr "Şifrәni göstәr"
266
266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr "SIM PIN kodunuzu daxil edin"
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "Bağışlayın, PIN yanlışdır"
274−
275#: qml/Panel/ActiveCallHint.qml:77
267#: qml/Panel/ActiveCallHint.qml:77
276msgid "Tap to return to call..."
268msgid "Tap to return to call..."
277msgstr "Zəngə qayıtmaq üçün toxunun..."
269msgstr "Zəngə qayıtmaq üçün toxunun..."
@@ -316,49 +308,49 @@ msgstr "SIM kilidini aç"
316msgid "Roaming"
308msgid "Roaming"
317msgstr "Rominq"
309msgstr "Rominq"
318
310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320msgid "Enter passphrase"
312msgid "Enter passphrase"
321msgstr ""
313msgstr ""
322
314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324msgid "Sorry, incorrect passphrase"
316msgid "Sorry, incorrect passphrase"
325msgstr "Bağışlayın, açar söz yanlışdır"
317msgstr "Bağışlayın, açar söz yanlışdır"
326
318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328msgid "Please re-enter"
320msgid "Please re-enter"
329msgstr ""
321msgstr ""
330
322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332msgid "Enter passcode"
324msgid "Enter passcode"
333msgstr ""
325msgstr ""
334
326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336msgid "Sorry, incorrect passcode"
328msgid "Sorry, incorrect passcode"
337msgstr ""
329msgstr ""
338
330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340#, qt-format
332#, qt-format
341msgid "Enter %1"
333msgid "Enter %1"
342msgstr ""
334msgstr ""
343
335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345#, qt-format
337#, qt-format
346msgid "Sorry, incorrect %1"
338msgid "Sorry, incorrect %1"
347msgstr "Bağışlayın, %1 yanlışdır"
339msgstr "Bağışlayın, %1 yanlışdır"
348
340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350msgid "Sorry, incorrect passphrase."
342msgid "Sorry, incorrect passphrase."
351msgstr "Bağışlayın, açar söz yanlışdır."
343msgstr "Bağışlayın, açar söz yanlışdır."
352
344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354msgid "Sorry, incorrect passcode."
346msgid "Sorry, incorrect passcode."
355msgstr "Təəssüf ki, açar kod yanlışdır."
347msgstr "Təəssüf ki, açar kod yanlışdır."
356
348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358msgid "This will be your last attempt."
350msgid "This will be your last attempt."
359msgstr "Bu sizin son cəhdiniz olacaq."
351msgstr "Bu sizin son cəhdiniz olacaq."
360
352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362msgid ""
354msgid ""
363"If passphrase is entered incorrectly, your phone will conduct a factory "
355"If passphrase is entered incorrectly, your phone will conduct a factory "
364"reset and all personal data will be deleted."
356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366"Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
358"Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
367"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
359"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
368
360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370msgid ""
362msgid ""
371"If passcode is entered incorrectly, your phone will conduct a factory reset "
363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372"and all personal data will be deleted."
364"and all personal data will be deleted."
@@ -374,25 +366,8 @@ msgstr ""
374"Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
366"Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
375"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
367"geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
376
368
377−#~ msgid "Swipe to unlock"
369+#~ msgid "Enter SIM PIN"
378−#~ msgstr "Kilidi açmaq üçün sürüşdürün"
370+#~ msgstr "SIM PIN kodunuzu daxil edin"
379−
380−#, qt-format
381−#~ msgid "Enter your %1"
382−#~ msgstr "%1 daxil edin"
383−
384−#~ msgid "Enter your passphrase"
385−#~ msgstr "Açar sözünüzü daxil edin"
386−
387−#~ msgid "Please wait"
388−#~ msgstr "Xahiş edirik gözləyin"
389−
390−#~ msgid "Too many incorrect attempts"
391−#~ msgstr "Çoxlu yanlış cəhdlәr"
392−
393−#, qt-format
394−#~ msgid "Hello %1"
395−#~ msgstr "Salam %1"
396
371
397−#~ msgid "Hello"
372+#~ msgid "Sorry, incorrect PIN"
398−#~ msgstr "Salam"
373+#~ msgstr "Bağışlayın, PIN yanlışdır"
po/be.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-24 17:12+0000\n"
11"PO-Revision-Date: 2014-09-24 17:12+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Belarusian <be@li.org>\n"
13"Language-Team: Belarusian <be@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153"phone<br><br>Tap on the screen to start"
153"phone<br><br>Tap on the screen to start"
154msgstr ""
154msgstr ""
155
155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157msgid "Emergency Call"
157msgid "Emergency Call"
158msgstr ""
158msgstr ""
159
159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161msgid "OK"
161msgid "OK"
162msgstr ""
162msgstr ""
163
163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165msgid "See less"
165msgid "See less"
166msgstr ""
166msgstr ""
167
167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169msgid "See all"
169msgid "See all"
170msgstr ""
170msgstr ""
171
171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173#: qml/Panel/SearchIndicator.qml:27
173#: qml/Panel/SearchIndicator.qml:27
174msgid "Search"
174msgid "Search"
175msgstr ""
175msgstr ""
@@ -258,18 +258,10 @@ msgstr ""
258msgid "Speaking..."
258msgid "Speaking..."
259msgstr ""
259msgstr ""
260
260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262msgid "Show password"
262msgid "Show password"
263msgstr ""
263msgstr ""
264
264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr ""
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr ""
272−
273#: qml/Panel/ActiveCallHint.qml:77
265#: qml/Panel/ActiveCallHint.qml:77
274msgid "Tap to return to call..."
266msgid "Tap to return to call..."
275msgstr ""
267msgstr ""
@@ -314,55 +306,55 @@ msgstr ""
314msgid "Roaming"
306msgid "Roaming"
315msgstr ""
307msgstr ""
316
308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318msgid "Enter passphrase"
310msgid "Enter passphrase"
319msgstr ""
311msgstr ""
320
312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322msgid "Sorry, incorrect passphrase"
314msgid "Sorry, incorrect passphrase"
323msgstr ""
315msgstr ""
324
316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326msgid "Please re-enter"
318msgid "Please re-enter"
327msgstr ""
319msgstr ""
328
320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330msgid "Enter passcode"
322msgid "Enter passcode"
331msgstr ""
323msgstr ""
332
324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334msgid "Sorry, incorrect passcode"
326msgid "Sorry, incorrect passcode"
335msgstr ""
327msgstr ""
336
328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338#, qt-format
330#, qt-format
339msgid "Enter %1"
331msgid "Enter %1"
340msgstr ""
332msgstr ""
341
333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343#, qt-format
335#, qt-format
344msgid "Sorry, incorrect %1"
336msgid "Sorry, incorrect %1"
345msgstr ""
337msgstr ""
346
338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348msgid "Sorry, incorrect passphrase."
340msgid "Sorry, incorrect passphrase."
349msgstr ""
341msgstr ""
350
342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352msgid "Sorry, incorrect passcode."
344msgid "Sorry, incorrect passcode."
353msgstr ""
345msgstr ""
354
346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356msgid "This will be your last attempt."
348msgid "This will be your last attempt."
357msgstr ""
349msgstr ""
358
350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360msgid ""
352msgid ""
361"If passphrase is entered incorrectly, your phone will conduct a factory "
353"If passphrase is entered incorrectly, your phone will conduct a factory "
362"reset and all personal data will be deleted."
354"reset and all personal data will be deleted."
363msgstr ""
355msgstr ""
364
356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366msgid ""
358msgid ""
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368"and all personal data will be deleted."
360"and all personal data will be deleted."
po/bg.po+20−35
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-04-01 14:08+0000\n"
11"PO-Revision-Date: 2014-04-01 14:08+0000\n"
12"Last-Translator: Atanas Kovachki <Unknown>\n"
12"Last-Translator: Atanas Kovachki <Unknown>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -159,23 +159,23 @@ msgid ""
159"phone<br><br>Tap on the screen to start"
159"phone<br><br>Tap on the screen to start"
160msgstr ""
160msgstr ""
161
161
162−#: qml/Components/Lockscreen.qml:218
162+#: qml/Components/Lockscreen.qml:220
163msgid "Emergency Call"
163msgid "Emergency Call"
164msgstr "Спешно повикване"
164msgstr "Спешно повикване"
165
165
166−#: qml/Components/Lockscreen.qml:250
166+#: qml/Components/Lockscreen.qml:252
167msgid "OK"
167msgid "OK"
168msgstr ""
168msgstr ""
169
169
170−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
170+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
171msgid "See less"
171msgid "See less"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/GenericScopeView.qml:411
174+#: qml/Dash/GenericScopeView.qml:434
175msgid "See all"
175msgid "See all"
176msgstr ""
176msgstr ""
177
177
178−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
178+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
179#: qml/Panel/SearchIndicator.qml:27
179#: qml/Panel/SearchIndicator.qml:27
180msgid "Search"
180msgid "Search"
181msgstr "Търсене"
181msgstr "Търсене"
@@ -264,18 +264,10 @@ msgstr "Говорете сега..."
264msgid "Speaking..."
264msgid "Speaking..."
265msgstr "Говорете..."
265msgstr "Говорете..."
266
266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:108
267+#: qml/Notifications/NotificationMenuItemFactory.qml:116
268msgid "Show password"
268msgid "Show password"
269msgstr "Покажи паролата"
269msgstr "Покажи паролата"
270
270
271−#: qml/Notifications/NotificationMenuItemFactory.qml:124
272−msgid "Enter SIM PIN"
273−msgstr ""
274−
275−#: qml/Notifications/NotificationMenuItemFactory.qml:125
276−msgid "Sorry, incorrect PIN"
277−msgstr ""
278−
279#: qml/Panel/ActiveCallHint.qml:77
271#: qml/Panel/ActiveCallHint.qml:77
280msgid "Tap to return to call..."
272msgid "Tap to return to call..."
281msgstr ""
273msgstr ""
@@ -320,63 +312,56 @@ msgstr ""
320msgid "Roaming"
312msgid "Roaming"
321msgstr ""
313msgstr ""
322
314
323−#: qml/Shell.qml:340
315+#: qml/Shell.qml:346
324msgid "Enter passphrase"
316msgid "Enter passphrase"
325msgstr ""
317msgstr ""
326
318
327−#: qml/Shell.qml:341
319+#: qml/Shell.qml:347
328msgid "Sorry, incorrect passphrase"
320msgid "Sorry, incorrect passphrase"
329msgstr ""
321msgstr ""
330
322
331−#: qml/Shell.qml:342
323+#: qml/Shell.qml:348
332msgid "Please re-enter"
324msgid "Please re-enter"
333msgstr ""
325msgstr ""
334
326
335−#: qml/Shell.qml:344
327+#: qml/Shell.qml:350
336msgid "Enter passcode"
328msgid "Enter passcode"
337msgstr ""
329msgstr ""
338
330
339−#: qml/Shell.qml:345
331+#: qml/Shell.qml:351
340msgid "Sorry, incorrect passcode"
332msgid "Sorry, incorrect passcode"
341msgstr ""
333msgstr ""
342
334
343−#: qml/Shell.qml:348
335+#: qml/Shell.qml:354
344#, qt-format
336#, qt-format
345msgid "Enter %1"
337msgid "Enter %1"
346msgstr ""
338msgstr ""
347
339
348−#: qml/Shell.qml:349
340+#: qml/Shell.qml:355
349#, qt-format
341#, qt-format
350msgid "Sorry, incorrect %1"
342msgid "Sorry, incorrect %1"
351msgstr ""
343msgstr ""
352
344
353−#: qml/Shell.qml:384
345+#: qml/Shell.qml:390
354msgid "Sorry, incorrect passphrase."
346msgid "Sorry, incorrect passphrase."
355msgstr ""
347msgstr ""
356
348
357−#: qml/Shell.qml:385
349+#: qml/Shell.qml:391
358msgid "Sorry, incorrect passcode."
350msgid "Sorry, incorrect passcode."
359msgstr ""
351msgstr ""
360
352
361−#: qml/Shell.qml:386
353+#: qml/Shell.qml:392
362msgid "This will be your last attempt."
354msgid "This will be your last attempt."
363msgstr ""
355msgstr ""
364
356
365−#: qml/Shell.qml:388
357+#: qml/Shell.qml:394
366msgid ""
358msgid ""
367"If passphrase is entered incorrectly, your phone will conduct a factory "
359"If passphrase is entered incorrectly, your phone will conduct a factory "
368"reset and all personal data will be deleted."
360"reset and all personal data will be deleted."
369msgstr ""
361msgstr ""
370
362
371−#: qml/Shell.qml:389
363+#: qml/Shell.qml:395
372msgid ""
364msgid ""
373"If passcode is entered incorrectly, your phone will conduct a factory reset "
365"If passcode is entered incorrectly, your phone will conduct a factory reset "
374"and all personal data will be deleted."
366"and all personal data will be deleted."
375msgstr ""
367msgstr ""
376−
377−#~ msgid "Hello"
378−#~ msgstr "Здравей"
379−
380−#, qt-format
381−#~ msgid "Hello %1"
382−#~ msgstr "Здравей, %1"
po/br.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 07:03+0000\n"
11"PO-Revision-Date: 2014-10-07 07:03+0000\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
13"Language-Team: Breton <br@li.org>\n"
13"Language-Team: Breton <br@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -165,23 +165,23 @@ msgstr ""
165"Mestroniañ a rit ar jestroù ha gallout a rit kregiñ da implijout ar "
165"Mestroniañ a rit ar jestroù ha gallout a rit kregiñ da implijout ar "
166"pellgomzer<br><br>Touchit d'ar skramm evit kregiñ ganti"
166"pellgomzer<br><br>Touchit d'ar skramm evit kregiñ ganti"
167
167
168−#: qml/Components/Lockscreen.qml:218
168+#: qml/Components/Lockscreen.qml:220
169msgid "Emergency Call"
169msgid "Emergency Call"
170msgstr "Pellgomzadenn vallus"
170msgstr "Pellgomzadenn vallus"
171
171
172−#: qml/Components/Lockscreen.qml:250
172+#: qml/Components/Lockscreen.qml:252
173msgid "OK"
173msgid "OK"
174msgstr "Mat eo"
174msgstr "Mat eo"
175
175
176−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
176+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
177msgid "See less"
177msgid "See less"
178msgstr "Gwelet nebeutoc'h"
178msgstr "Gwelet nebeutoc'h"
179
179
180−#: qml/Dash/GenericScopeView.qml:411
180+#: qml/Dash/GenericScopeView.qml:434
181msgid "See all"
181msgid "See all"
182msgstr "Gwelet pep tra"
182msgstr "Gwelet pep tra"
183
183
184−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
184+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
185#: qml/Panel/SearchIndicator.qml:27
185#: qml/Panel/SearchIndicator.qml:27
186msgid "Search"
186msgid "Search"
187msgstr "Klask"
187msgstr "Klask"
@@ -270,18 +270,10 @@ msgstr "Komzit bremañ..."
270msgid "Speaking..."
270msgid "Speaking..."
271msgstr "O komz..."
271msgstr "O komz..."
272
272
273−#: qml/Notifications/NotificationMenuItemFactory.qml:108
273+#: qml/Notifications/NotificationMenuItemFactory.qml:116
274msgid "Show password"
274msgid "Show password"
275msgstr "Diskouez ar ger-tremen"
275msgstr "Diskouez ar ger-tremen"
276
276
277−#: qml/Notifications/NotificationMenuItemFactory.qml:124
278−msgid "Enter SIM PIN"
279−msgstr "Ebarzhit kod PIN ar gartenn SIM"
280−
281−#: qml/Notifications/NotificationMenuItemFactory.qml:125
282−msgid "Sorry, incorrect PIN"
283−msgstr "Siwazh, kod PIN direizh"
284−
285#: qml/Panel/ActiveCallHint.qml:77
277#: qml/Panel/ActiveCallHint.qml:77
286msgid "Tap to return to call..."
278msgid "Tap to return to call..."
287msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
279msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
@@ -326,49 +318,49 @@ msgstr "Dibrennañ ar gartenn SIM"
326msgid "Roaming"
318msgid "Roaming"
327msgstr "O kantren"
319msgstr "O kantren"
328
320
329−#: qml/Shell.qml:340
321+#: qml/Shell.qml:346
330msgid "Enter passphrase"
322msgid "Enter passphrase"
331msgstr "Merkañ ar frazenn-dremen"
323msgstr "Merkañ ar frazenn-dremen"
332
324
333−#: qml/Shell.qml:341
325+#: qml/Shell.qml:347
334msgid "Sorry, incorrect passphrase"
326msgid "Sorry, incorrect passphrase"
335msgstr "Siwazh, frazenn-dremen direizh"
327msgstr "Siwazh, frazenn-dremen direizh"
336
328
337−#: qml/Shell.qml:342
329+#: qml/Shell.qml:348
338msgid "Please re-enter"
330msgid "Please re-enter"
339msgstr "Adverkañ, mar plij"
331msgstr "Adverkañ, mar plij"
340
332
341−#: qml/Shell.qml:344
333+#: qml/Shell.qml:350
342msgid "Enter passcode"
334msgid "Enter passcode"
343msgstr "Merkañ ar c'hod-tremen"
335msgstr "Merkañ ar c'hod-tremen"
344
336
345−#: qml/Shell.qml:345
337+#: qml/Shell.qml:351
346msgid "Sorry, incorrect passcode"
338msgid "Sorry, incorrect passcode"
347msgstr "Digarezit, kod-tremen direizh"
339msgstr "Digarezit, kod-tremen direizh"
348
340
349−#: qml/Shell.qml:348
341+#: qml/Shell.qml:354
350#, qt-format
342#, qt-format
351msgid "Enter %1"
343msgid "Enter %1"
352msgstr "Merkañ %1"
344msgstr "Merkañ %1"
353
345
354−#: qml/Shell.qml:349
346+#: qml/Shell.qml:355
355#, qt-format
347#, qt-format
356msgid "Sorry, incorrect %1"
348msgid "Sorry, incorrect %1"
357msgstr "Siwazh, %1 direizh"
349msgstr "Siwazh, %1 direizh"
358
350
359−#: qml/Shell.qml:384
351+#: qml/Shell.qml:390
360msgid "Sorry, incorrect passphrase."
352msgid "Sorry, incorrect passphrase."
361msgstr "Siwazh, frazenn-dremen direizh"
353msgstr "Siwazh, frazenn-dremen direizh"
362
354
363−#: qml/Shell.qml:385
355+#: qml/Shell.qml:391
364msgid "Sorry, incorrect passcode."
356msgid "Sorry, incorrect passcode."
365msgstr "Siwazh, kod-tremen direizh"
357msgstr "Siwazh, kod-tremen direizh"
366
358
367−#: qml/Shell.qml:386
359+#: qml/Shell.qml:392
368msgid "This will be your last attempt."
360msgid "This will be your last attempt."
369msgstr "Ho taol-esae diwezhañ e vo."
361msgstr "Ho taol-esae diwezhañ e vo."
370
362
371−#: qml/Shell.qml:388
363+#: qml/Shell.qml:394
372msgid ""
364msgid ""
373"If passphrase is entered incorrectly, your phone will conduct a factory "
365"If passphrase is entered incorrectly, your phone will conduct a factory "
374"reset and all personal data will be deleted."
366"reset and all personal data will be deleted."
@@ -376,7 +368,7 @@ msgstr ""
376"Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho pellgomzer "
368"Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho pellgomzer "
377"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel"
369"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel"
378
370
379−#: qml/Shell.qml:389
371+#: qml/Shell.qml:395
380msgid ""
372msgid ""
381"If passcode is entered incorrectly, your phone will conduct a factory reset "
373"If passcode is entered incorrectly, your phone will conduct a factory reset "
382"and all personal data will be deleted."
374"and all personal data will be deleted."
@@ -384,28 +376,8 @@ msgstr ""
384"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
376"Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
385"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
377"gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
386
378
387−#~ msgid "Hello"
379+#~ msgid "Sorry, incorrect PIN"
388−#~ msgstr "Demat"
389−
390−#, qt-format
391−#~ msgid "Hello %1"
392−#~ msgstr "Demat %1"
393−
394−#~ msgid "Swipe to unlock"
395−#~ msgstr "Riklañ evit dibrennañ"
396−
397−#~ msgid "Please wait"
398−#~ msgstr "Gortozit, mar plij"
399−
400−#~ msgid "Too many incorrect attempts"
401−#~ msgstr "Re a daolioù-esae direizh"
380+#~ msgstr "Siwazh, kod PIN direizh"
402−
403−#~ msgid "Enter your passphrase"
404−#~ msgstr "Ebarzhit ho frazenn-dremen"
405−
406−#, qt-format
407−#~ msgid "Enter your %1"
408−#~ msgstr "Ebarzhit ho %1"
409
381
410−#~ msgid "Enter your passcode"
382+#~ msgid "Enter SIM PIN"
411−#~ msgstr "Ebarzhit ho kod-tremen"
383+#~ msgstr "Ebarzhit kod PIN ar gartenn SIM"
po/bs.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-16 22:33+0000\n"
11"PO-Revision-Date: 2014-01-16 22:33+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153"phone<br><br>Tap on the screen to start"
153"phone<br><br>Tap on the screen to start"
154msgstr ""
154msgstr ""
155
155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157msgid "Emergency Call"
157msgid "Emergency Call"
158msgstr ""
158msgstr ""
159
159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161msgid "OK"
161msgid "OK"
162msgstr ""
162msgstr ""
163
163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165msgid "See less"
165msgid "See less"
166msgstr ""
166msgstr ""
167
167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169msgid "See all"
169msgid "See all"
170msgstr ""
170msgstr ""
171
171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173#: qml/Panel/SearchIndicator.qml:27
173#: qml/Panel/SearchIndicator.qml:27
174msgid "Search"
174msgid "Search"
175msgstr ""
175msgstr ""
@@ -258,18 +258,10 @@ msgstr ""
258msgid "Speaking..."
258msgid "Speaking..."
259msgstr ""
259msgstr ""
260
260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262msgid "Show password"
262msgid "Show password"
263msgstr ""
263msgstr ""
264
264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr ""
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr ""
272−
273#: qml/Panel/ActiveCallHint.qml:77
265#: qml/Panel/ActiveCallHint.qml:77
274msgid "Tap to return to call..."
266msgid "Tap to return to call..."
275msgstr ""
267msgstr ""
@@ -314,55 +306,55 @@ msgstr ""
314msgid "Roaming"
306msgid "Roaming"
315msgstr ""
307msgstr ""
316
308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318msgid "Enter passphrase"
310msgid "Enter passphrase"
319msgstr ""
311msgstr ""
320
312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322msgid "Sorry, incorrect passphrase"
314msgid "Sorry, incorrect passphrase"
323msgstr ""
315msgstr ""
324
316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326msgid "Please re-enter"
318msgid "Please re-enter"
327msgstr ""
319msgstr ""
328
320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330msgid "Enter passcode"
322msgid "Enter passcode"
331msgstr ""
323msgstr ""
332
324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334msgid "Sorry, incorrect passcode"
326msgid "Sorry, incorrect passcode"
335msgstr ""
327msgstr ""
336
328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338#, qt-format
330#, qt-format
339msgid "Enter %1"
331msgid "Enter %1"
340msgstr ""
332msgstr ""
341
333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343#, qt-format
335#, qt-format
344msgid "Sorry, incorrect %1"
336msgid "Sorry, incorrect %1"
345msgstr ""
337msgstr ""
346
338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348msgid "Sorry, incorrect passphrase."
340msgid "Sorry, incorrect passphrase."
349msgstr ""
341msgstr ""
350
342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352msgid "Sorry, incorrect passcode."
344msgid "Sorry, incorrect passcode."
353msgstr ""
345msgstr ""
354
346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356msgid "This will be your last attempt."
348msgid "This will be your last attempt."
357msgstr ""
349msgstr ""
358
350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360msgid ""
352msgid ""
361"If passphrase is entered incorrectly, your phone will conduct a factory "
353"If passphrase is entered incorrectly, your phone will conduct a factory "
362"reset and all personal data will be deleted."
354"reset and all personal data will be deleted."
363msgstr ""
355msgstr ""
364
356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366msgid ""
358msgid ""
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368"and all personal data will be deleted."
360"and all personal data will be deleted."
po/ca.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 10:51+0000\n"
11"PO-Revision-Date: 2014-10-07 10:51+0000\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -166,23 +166,23 @@ msgstr ""
166"Ja heu après com utilitzar els gestos de les vores per fer servir el "
166"Ja heu après com utilitzar els gestos de les vores per fer servir el "
167"telèfon<br><br>Feu un toc a la pantalla per començar"
167"telèfon<br><br>Feu un toc a la pantalla per començar"
168
168
169−#: qml/Components/Lockscreen.qml:218
169+#: qml/Components/Lockscreen.qml:220
170msgid "Emergency Call"
170msgid "Emergency Call"
171msgstr "Trucada d'emergència"
171msgstr "Trucada d'emergència"
172
172
173−#: qml/Components/Lockscreen.qml:250
173+#: qml/Components/Lockscreen.qml:252
174msgid "OK"
174msgid "OK"
175msgstr "D'acord"
175msgstr "D'acord"
176
176
177−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
177+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
178msgid "See less"
178msgid "See less"
179msgstr "Mostra'n menys"
179msgstr "Mostra'n menys"
180
180
181−#: qml/Dash/GenericScopeView.qml:411
181+#: qml/Dash/GenericScopeView.qml:434
182msgid "See all"
182msgid "See all"
183msgstr "Mostra-ho tot"
183msgstr "Mostra-ho tot"
184
184
185−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
185+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
186#: qml/Panel/SearchIndicator.qml:27
186#: qml/Panel/SearchIndicator.qml:27
187msgid "Search"
187msgid "Search"
188msgstr "Cerca"
188msgstr "Cerca"
@@ -271,18 +271,10 @@ msgstr "Parleu..."
271msgid "Speaking..."
271msgid "Speaking..."
272msgstr "S'està parlant..."
272msgstr "S'està parlant..."
273
273
274−#: qml/Notifications/NotificationMenuItemFactory.qml:108
274+#: qml/Notifications/NotificationMenuItemFactory.qml:116
275msgid "Show password"
275msgid "Show password"
276msgstr "Mostra la contrasenya"
276msgstr "Mostra la contrasenya"
277
277
278−#: qml/Notifications/NotificationMenuItemFactory.qml:124
279−msgid "Enter SIM PIN"
280−msgstr "Introduïu el PIN de la targeta SIM"
281−
282−#: qml/Notifications/NotificationMenuItemFactory.qml:125
283−msgid "Sorry, incorrect PIN"
284−msgstr "El PIN no és correcte"
285−
286#: qml/Panel/ActiveCallHint.qml:77
278#: qml/Panel/ActiveCallHint.qml:77
287msgid "Tap to return to call..."
279msgid "Tap to return to call..."
288msgstr "Feu un toc per tornar a la trucada..."
280msgstr "Feu un toc per tornar a la trucada..."
@@ -327,49 +319,49 @@ msgstr "Desbloca la SIM"
327msgid "Roaming"
319msgid "Roaming"
328msgstr "Itinerància"
320msgstr "Itinerància"
329
321
330−#: qml/Shell.qml:340
322+#: qml/Shell.qml:346
331msgid "Enter passphrase"
323msgid "Enter passphrase"
332msgstr "Introduïu la contrasenya"
324msgstr "Introduïu la contrasenya"
333
325
334−#: qml/Shell.qml:341
326+#: qml/Shell.qml:347
335msgid "Sorry, incorrect passphrase"
327msgid "Sorry, incorrect passphrase"
336msgstr "La contrasenya no és correcta"
328msgstr "La contrasenya no és correcta"
337
329
338−#: qml/Shell.qml:342
330+#: qml/Shell.qml:348
339msgid "Please re-enter"
331msgid "Please re-enter"
340msgstr "Torneu-ho a introduir"
332msgstr "Torneu-ho a introduir"
341
333
342−#: qml/Shell.qml:344
334+#: qml/Shell.qml:350
343msgid "Enter passcode"
335msgid "Enter passcode"
344msgstr "Introduïu el codi d'accés"
336msgstr "Introduïu el codi d'accés"
345
337
346−#: qml/Shell.qml:345
338+#: qml/Shell.qml:351
347msgid "Sorry, incorrect passcode"
339msgid "Sorry, incorrect passcode"
348msgstr "El codi d'accés no és correcte"
340msgstr "El codi d'accés no és correcte"
349
341
350−#: qml/Shell.qml:348
342+#: qml/Shell.qml:354
351#, qt-format
343#, qt-format
352msgid "Enter %1"
344msgid "Enter %1"
353msgstr "Introduïu: %1"
345msgstr "Introduïu: %1"
354
346
355−#: qml/Shell.qml:349
347+#: qml/Shell.qml:355
356#, qt-format
348#, qt-format
357msgid "Sorry, incorrect %1"
349msgid "Sorry, incorrect %1"
358msgstr "Incorrecte (%1)"
350msgstr "Incorrecte (%1)"
359
351
360−#: qml/Shell.qml:384
352+#: qml/Shell.qml:390
361msgid "Sorry, incorrect passphrase."
353msgid "Sorry, incorrect passphrase."
362msgstr "La contrasenya és incorrecta"
354msgstr "La contrasenya és incorrecta"
363
355
364−#: qml/Shell.qml:385
356+#: qml/Shell.qml:391
365msgid "Sorry, incorrect passcode."
357msgid "Sorry, incorrect passcode."
366msgstr "El codi d'accés no és correcte"
358msgstr "El codi d'accés no és correcte"
367
359
368−#: qml/Shell.qml:386
360+#: qml/Shell.qml:392
369msgid "This will be your last attempt."
361msgid "This will be your last attempt."
370msgstr "Aquest serà el darrer intent."
362msgstr "Aquest serà el darrer intent."
371
363
372−#: qml/Shell.qml:388
364+#: qml/Shell.qml:394
373msgid ""
365msgid ""
374"If passphrase is entered incorrectly, your phone will conduct a factory "
366"If passphrase is entered incorrectly, your phone will conduct a factory "
375"reset and all personal data will be deleted."
367"reset and all personal data will be deleted."
@@ -378,7 +370,7 @@ msgstr ""
378"reinicialitzarà a l'estat de fàbrica i se suprimiran totes les dades "
370"reinicialitzarà a l'estat de fàbrica i se suprimiran totes les dades "
379"personals."
371"personals."
380
372
381−#: qml/Shell.qml:389
373+#: qml/Shell.qml:395
382msgid ""
374msgid ""
383"If passcode is entered incorrectly, your phone will conduct a factory reset "
375"If passcode is entered incorrectly, your phone will conduct a factory reset "
384"and all personal data will be deleted."
376"and all personal data will be deleted."
@@ -387,28 +379,8 @@ msgstr ""
387"reinicialitzarà a l'estat de fàbrica i se suprimiran totes les dades "
379"reinicialitzarà a l'estat de fàbrica i se suprimiran totes les dades "
388"personals."
380"personals."
389
381
390−#~ msgid "Hello"
382+#~ msgid "Sorry, incorrect PIN"
391−#~ msgstr "Hola"
383+#~ msgstr "El PIN no és correcte"
392−
393−#, qt-format
394−#~ msgid "Hello %1"
395−#~ msgstr "Hola %1"
396−
397−#~ msgid "Swipe to unlock"
398−#~ msgstr "Feu lliscar el dit per desbloquejar"
399−
400−#~ msgid "Please wait"
401−#~ msgstr "Espereu"
402−
403−#~ msgid "Too many incorrect attempts"
404−#~ msgstr "Massa intents incorrectes"
405−
406−#, qt-format
407−#~ msgid "Enter your %1"
408−#~ msgstr "Introduïu la %1"
409−
410−#~ msgid "Enter your passphrase"
411−#~ msgstr "Escriviu la contrasenya"
412
384
413−#~ msgid "Enter your passcode"
385+#~ msgid "Enter SIM PIN"
414−#~ msgstr "Introduïu el codi d'accés"
386+#~ msgstr "Introduïu el PIN de la targeta SIM"
po/ckb.po+20−35
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "هێڵی فریاگوزاری"
157msgstr "هێڵی فریاگوزاری"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "گەڕان"
174msgstr "گەڕان"
@@ -257,18 +257,10 @@ msgstr "ئێستا قسە بکە"
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "قسە دەکات..."
258msgstr "قسە دەکات..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr "تێپەڕەوشە پیشان بدە"
262msgstr "تێپەڕەوشە پیشان بدە"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "سڵاو %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "سڵاو"
po/cs.po+20−35
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-08 10:11+0000\n"
11"PO-Revision-Date: 2014-01-08 10:11+0000\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
13"Language-Team: Czech <cs@li.org>\n"
13"Language-Team: Czech <cs@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "Tísňové volání"
157msgstr "Tísňové volání"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "Hledat"
174msgstr "Hledat"
@@ -257,18 +257,10 @@ msgstr "Mluvte..."
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "Mluvte..."
258msgstr "Mluvte..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr "Zobrazit heslo"
262msgstr "Zobrazit heslo"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369−
370−#~ msgid "Hello"
371−#~ msgstr "Ahoj"
372−
373−#, qt-format
374−#~ msgid "Hello %1"
375−#~ msgstr "Ahoj %1"
po/da.po+20−38
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
11+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
12"PO-Revision-Date: 2014-07-30 12:37+0000\n"
12"PO-Revision-Date: 2014-07-30 12:37+0000\n"
13"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
13"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
14"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
14"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgstr ""
155"Du mestrer nu kantbevægelserne og kan begynde at bruge telefonen<br><br>Tryk "
155"Du mestrer nu kantbevægelserne og kan begynde at bruge telefonen<br><br>Tryk "
156"på skærmen for at starte"
156"på skærmen for at starte"
157
157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159msgid "Emergency Call"
159msgid "Emergency Call"
160msgstr "Nødopkald"
160msgstr "Nødopkald"
161
161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163msgid "OK"
163msgid "OK"
164msgstr "O.k."
164msgstr "O.k."
165
165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167msgid "See less"
167msgid "See less"
168msgstr "Vis mindre"
168msgstr "Vis mindre"
169
169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171msgid "See all"
171msgid "See all"
172msgstr "Se alle"
172msgstr "Se alle"
173
173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175#: qml/Panel/SearchIndicator.qml:27
175#: qml/Panel/SearchIndicator.qml:27
176msgid "Search"
176msgid "Search"
177msgstr "Søg"
177msgstr "Søg"
@@ -260,18 +260,10 @@ msgstr "Tal nu..."
260msgid "Speaking..."
260msgid "Speaking..."
261msgstr "Taler..."
261msgstr "Taler..."
262
262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264msgid "Show password"
264msgid "Show password"
265msgstr "Vis adgangskode"
265msgstr "Vis adgangskode"
266
266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr ""
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr ""
274−
275#: qml/Panel/ActiveCallHint.qml:77
267#: qml/Panel/ActiveCallHint.qml:77
276msgid "Tap to return to call..."
268msgid "Tap to return to call..."
277msgstr "Tryk for at besvare opkaldet..."
269msgstr "Tryk for at besvare opkaldet..."
@@ -316,66 +308,56 @@ msgstr ""
316msgid "Roaming"
308msgid "Roaming"
317msgstr ""
309msgstr ""
318
310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320msgid "Enter passphrase"
312msgid "Enter passphrase"
321msgstr ""
313msgstr ""
322
314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324msgid "Sorry, incorrect passphrase"
316msgid "Sorry, incorrect passphrase"
325msgstr ""
317msgstr ""
326
318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328msgid "Please re-enter"
320msgid "Please re-enter"
329msgstr ""
321msgstr ""
330
322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332msgid "Enter passcode"
324msgid "Enter passcode"
333msgstr ""
325msgstr ""
334
326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336msgid "Sorry, incorrect passcode"
328msgid "Sorry, incorrect passcode"
337msgstr ""
329msgstr ""
338
330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340#, qt-format
332#, qt-format
341msgid "Enter %1"
333msgid "Enter %1"
342msgstr ""
334msgstr ""
343
335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345#, qt-format
337#, qt-format
346msgid "Sorry, incorrect %1"
338msgid "Sorry, incorrect %1"
347msgstr ""
339msgstr ""
348
340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350msgid "Sorry, incorrect passphrase."
342msgid "Sorry, incorrect passphrase."
351msgstr ""
343msgstr ""
352
344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354msgid "Sorry, incorrect passcode."
346msgid "Sorry, incorrect passcode."
355msgstr ""
347msgstr ""
356
348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358msgid "This will be your last attempt."
350msgid "This will be your last attempt."
359msgstr ""
351msgstr ""
360
352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362msgid ""
354msgid ""
363"If passphrase is entered incorrectly, your phone will conduct a factory "
355"If passphrase is entered incorrectly, your phone will conduct a factory "
364"reset and all personal data will be deleted."
356"reset and all personal data will be deleted."
365msgstr ""
357msgstr ""
366
358
367−#: qml/Shell.qml:389
359+#: qml/Shell.qml:395
368msgid ""
360msgid ""
369"If passcode is entered incorrectly, your phone will conduct a factory reset "
361"If passcode is entered incorrectly, your phone will conduct a factory reset "
370"and all personal data will be deleted."
362"and all personal data will be deleted."
371msgstr ""
363msgstr ""
372−
373−#, qt-format
374−#~ msgid "Hello %1"
375−#~ msgstr "Hej %1"
376−
377−#~ msgid "Hello"
378−#~ msgstr "Hej"
379−
380−#~ msgid "Swipe to unlock"
381−#~ msgstr "Stryg for at låse op"
po/de.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-29 06:33+0000\n"
11"PO-Revision-Date: 2014-09-29 06:33+0000\n"
12"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
12"Last-Translator: Niklas Wenzel <nikwen.developer@gmail.com>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -159,23 +159,23 @@ msgstr ""
159"Sie haben nun die Kantengesten erfolgreich erlernt und können das Telefon "
159"Sie haben nun die Kantengesten erfolgreich erlernt und können das Telefon "
160"nun nutzen<br><br>Zum Starten auf den Bildschirm tippen"
160"nun nutzen<br><br>Zum Starten auf den Bildschirm tippen"
161
161
162−#: qml/Components/Lockscreen.qml:218
162+#: qml/Components/Lockscreen.qml:220
163msgid "Emergency Call"
163msgid "Emergency Call"
164msgstr "Notruf"
164msgstr "Notruf"
165
165
166−#: qml/Components/Lockscreen.qml:250
166+#: qml/Components/Lockscreen.qml:252
167msgid "OK"
167msgid "OK"
168msgstr "OK"
168msgstr "OK"
169
169
170−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
170+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
171msgid "See less"
171msgid "See less"
172msgstr "Weniger ansehen"
172msgstr "Weniger ansehen"
173
173
174−#: qml/Dash/GenericScopeView.qml:411
174+#: qml/Dash/GenericScopeView.qml:434
175msgid "See all"
175msgid "See all"
176msgstr "Alle anzeigen"
176msgstr "Alle anzeigen"
177
177
178−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
178+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
179#: qml/Panel/SearchIndicator.qml:27
179#: qml/Panel/SearchIndicator.qml:27
180msgid "Search"
180msgid "Search"
181msgstr "Suchen"
181msgstr "Suchen"
@@ -264,18 +264,10 @@ msgstr "Sprechen Sie jetzt …"
264msgid "Speaking..."
264msgid "Speaking..."
265msgstr "Sprechen Sie …"
265msgstr "Sprechen Sie …"
266
266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:108
267+#: qml/Notifications/NotificationMenuItemFactory.qml:116
268msgid "Show password"
268msgid "Show password"
269msgstr "Passwort anzeigen"
269msgstr "Passwort anzeigen"
270
270
271−#: qml/Notifications/NotificationMenuItemFactory.qml:124
272−msgid "Enter SIM PIN"
273−msgstr "Geben Sie die SIM-PIN ein"
274−
275−#: qml/Notifications/NotificationMenuItemFactory.qml:125
276−msgid "Sorry, incorrect PIN"
277−msgstr "Die PIN ist nicht korrekt"
278−
279#: qml/Panel/ActiveCallHint.qml:77
271#: qml/Panel/ActiveCallHint.qml:77
280msgid "Tap to return to call..."
272msgid "Tap to return to call..."
281msgstr "Tippen um zum Anruf zurückzugehen"
273msgstr "Tippen um zum Anruf zurückzugehen"
@@ -320,49 +312,49 @@ msgstr "SIM-Karte entsperren"
320msgid "Roaming"
312msgid "Roaming"
321msgstr "Roaming"
313msgstr "Roaming"
322
314
323−#: qml/Shell.qml:340
315+#: qml/Shell.qml:346
324msgid "Enter passphrase"
316msgid "Enter passphrase"
325msgstr ""
317msgstr ""
326
318
327−#: qml/Shell.qml:341
319+#: qml/Shell.qml:347
328msgid "Sorry, incorrect passphrase"
320msgid "Sorry, incorrect passphrase"
329msgstr "Das Passwort ist nicht korrekt"
321msgstr "Das Passwort ist nicht korrekt"
330
322
331−#: qml/Shell.qml:342
323+#: qml/Shell.qml:348
332msgid "Please re-enter"
324msgid "Please re-enter"
333msgstr ""
325msgstr ""
334
326
335−#: qml/Shell.qml:344
327+#: qml/Shell.qml:350
336msgid "Enter passcode"
328msgid "Enter passcode"
337msgstr ""
329msgstr ""
338
330
339−#: qml/Shell.qml:345
331+#: qml/Shell.qml:351
340msgid "Sorry, incorrect passcode"
332msgid "Sorry, incorrect passcode"
341msgstr "Falsches Passwort"
333msgstr "Falsches Passwort"
342
334
343−#: qml/Shell.qml:348
335+#: qml/Shell.qml:354
344#, qt-format
336#, qt-format
345msgid "Enter %1"
337msgid "Enter %1"
346msgstr ""
338msgstr ""
347
339
348−#: qml/Shell.qml:349
340+#: qml/Shell.qml:355
349#, qt-format
341#, qt-format
350msgid "Sorry, incorrect %1"
342msgid "Sorry, incorrect %1"
351msgstr "%1 falsch"
343msgstr "%1 falsch"
352
344
353−#: qml/Shell.qml:384
345+#: qml/Shell.qml:390
354msgid "Sorry, incorrect passphrase."
346msgid "Sorry, incorrect passphrase."
355msgstr "Falsches Passwort."
347msgstr "Falsches Passwort."
356
348
357−#: qml/Shell.qml:385
349+#: qml/Shell.qml:391
358msgid "Sorry, incorrect passcode."
350msgid "Sorry, incorrect passcode."
359msgstr "Falsche PIN"
351msgstr "Falsche PIN"
360
352
361−#: qml/Shell.qml:386
353+#: qml/Shell.qml:392
362msgid "This will be your last attempt."
354msgid "This will be your last attempt."
363msgstr "Dies ist Ihr letzter Versuch."
355msgstr "Dies ist Ihr letzter Versuch."
364
356
365−#: qml/Shell.qml:388
357+#: qml/Shell.qml:394
366msgid ""
358msgid ""
367"If passphrase is entered incorrectly, your phone will conduct a factory "
359"If passphrase is entered incorrectly, your phone will conduct a factory "
368"reset and all personal data will be deleted."
360"reset and all personal data will be deleted."
@@ -370,7 +362,7 @@ msgstr ""
370"Wird das Passwort falsch eingegeben, wird das Telefon auf den Werkszustand "
362"Wird das Passwort falsch eingegeben, wird das Telefon auf den Werkszustand "
371"zurückgesetzt und alle Daten werden gelöscht."
363"zurückgesetzt und alle Daten werden gelöscht."
372
364
373−#: qml/Shell.qml:389
365+#: qml/Shell.qml:395
374msgid ""
366msgid ""
375"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
376"and all personal data will be deleted."
368"and all personal data will be deleted."
@@ -378,28 +370,8 @@ msgstr ""
378"Wird die PIN falsch eingegeben, wird das Telefon auf den Werkszustand "
370"Wird die PIN falsch eingegeben, wird das Telefon auf den Werkszustand "
379"zurückgesetzt und alle Daten werden gelöscht."
371"zurückgesetzt und alle Daten werden gelöscht."
380
372
381−#, qt-format
373+#~ msgid "Sorry, incorrect PIN"
382−#~ msgid "Hello %1"
374+#~ msgstr "Die PIN ist nicht korrekt"
383−#~ msgstr "Hallo %1"
384−
385−#~ msgid "Hello"
386−#~ msgstr "Hallo"
387−
388−#~ msgid "Swipe to unlock"
389−#~ msgstr "Wischen zum Entsperren"
390−
391−#~ msgid "Please wait"
392−#~ msgstr "Bitte warten"
393−
394−#~ msgid "Too many incorrect attempts"
395−#~ msgstr "Zu viele falsche Versuche"
396−
397−#, qt-format
398−#~ msgid "Enter your %1"
399−#~ msgstr "%1 eingeben"
400−
401−#~ msgid "Enter your passphrase"
402−#~ msgstr "Geben Sie Ihr Passwort ein"
403
375
404−#~ msgid "Enter your passcode"
376+#~ msgid "Enter SIM PIN"
405−#~ msgstr "Passwort eingeben"
377+#~ msgstr "Geben Sie die SIM-PIN ein"
po/el.po+20−48
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-08-21 12:06+0000\n"
11"PO-Revision-Date: 2014-08-21 12:06+0000\n"
12"Last-Translator: Chris Taklis (aka Kailor) <ctaklis@gmail.com>\n"
12"Last-Translator: Chris Taklis (aka Kailor) <ctaklis@gmail.com>\n"
13"Language-Team: Greek <el@li.org>\n"
13"Language-Team: Greek <el@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156"Πλέον γνωρίζετε τις χειρονομίες από τα άκρα και μπορείτε να ξεκινήσετε να "
156"Πλέον γνωρίζετε τις χειρονομίες από τα άκρα και μπορείτε να ξεκινήσετε να "
157"χρησιμοποιείτε το τηλέφωνο<br><br>Αγγίξτε την οθόνη για να ξεκινήσετε"
157"χρησιμοποιείτε το τηλέφωνο<br><br>Αγγίξτε την οθόνη για να ξεκινήσετε"
158
158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160msgid "Emergency Call"
160msgid "Emergency Call"
161msgstr "Κλήση έκτακτης ανάγκης"
161msgstr "Κλήση έκτακτης ανάγκης"
162
162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164msgid "OK"
164msgid "OK"
165msgstr "OK"
165msgstr "OK"
166
166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168msgid "See less"
168msgid "See less"
169msgstr "Λιγότερα"
169msgstr "Λιγότερα"
170
170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172msgid "See all"
172msgid "See all"
173msgstr "Εμφάνιση όλων"
173msgstr "Εμφάνιση όλων"
174
174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176#: qml/Panel/SearchIndicator.qml:27
176#: qml/Panel/SearchIndicator.qml:27
177msgid "Search"
177msgid "Search"
178msgstr "Αναζήτηση"
178msgstr "Αναζήτηση"
@@ -261,18 +261,10 @@ msgstr "Μιλήστε τώρα..."
261msgid "Speaking..."
261msgid "Speaking..."
262msgstr "Ομιλία..."
262msgstr "Ομιλία..."
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265msgid "Show password"
265msgid "Show password"
266msgstr "Εμφάνιση κωδικού"
266msgstr "Εμφάνιση κωδικού"
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr ""
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr ""
275−
276#: qml/Panel/ActiveCallHint.qml:77
268#: qml/Panel/ActiveCallHint.qml:77
277msgid "Tap to return to call..."
269msgid "Tap to return to call..."
278msgstr "Πατήστε για να γυρίσετε στην κλήση..."
270msgstr "Πατήστε για να γυρίσετε στην κλήση..."
@@ -317,76 +309,56 @@ msgstr "Ξεκλείδωμα SIM"
317msgid "Roaming"
309msgid "Roaming"
318msgstr "Περιαγωγή"
310msgstr "Περιαγωγή"
319
311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321msgid "Enter passphrase"
313msgid "Enter passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325msgid "Sorry, incorrect passphrase"
317msgid "Sorry, incorrect passphrase"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329msgid "Please re-enter"
321msgid "Please re-enter"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333msgid "Enter passcode"
325msgid "Enter passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337msgid "Sorry, incorrect passcode"
329msgid "Sorry, incorrect passcode"
338msgstr ""
330msgstr ""
339
331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341#, qt-format
333#, qt-format
342msgid "Enter %1"
334msgid "Enter %1"
343msgstr ""
335msgstr ""
344
336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346#, qt-format
338#, qt-format
347msgid "Sorry, incorrect %1"
339msgid "Sorry, incorrect %1"
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351msgid "Sorry, incorrect passphrase."
343msgid "Sorry, incorrect passphrase."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355msgid "Sorry, incorrect passcode."
347msgid "Sorry, incorrect passcode."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359msgid "This will be your last attempt."
351msgid "This will be your last attempt."
360msgstr ""
352msgstr ""
361
353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363msgid ""
355msgid ""
364"If passphrase is entered incorrectly, your phone will conduct a factory "
356"If passphrase is entered incorrectly, your phone will conduct a factory "
365"reset and all personal data will be deleted."
357"reset and all personal data will be deleted."
366msgstr ""
358msgstr ""
367
359
368−#: qml/Shell.qml:389
360+#: qml/Shell.qml:395
369msgid ""
361msgid ""
370"If passcode is entered incorrectly, your phone will conduct a factory reset "
362"If passcode is entered incorrectly, your phone will conduct a factory reset "
371"and all personal data will be deleted."
363"and all personal data will be deleted."
372msgstr ""
364msgstr ""
373−
374−#~ msgid "Hello"
375−#~ msgstr "Γεια σας"
376−
377−#, qt-format
378−#~ msgid "Hello %1"
379−#~ msgstr "Γεια σας %1"
380−
381−#~ msgid "Swipe to unlock"
382−#~ msgstr "Σύρετε για να ξεκλειδώσετε"
383−
384−#~ msgid "Please wait"
385−#~ msgstr "Παρακαλώ περιμένετε"
386−
387−#~ msgid "Too many incorrect attempts"
388−#~ msgstr "Πολλές άκυρες προσπάθειες"
389−
390−#, qt-format
391−#~ msgid "Enter your %1"
392−#~ msgstr "Εισάγετε το %1"
po/en_AU.po+35−69
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2014-09-23 01:24+0000\n"
11+"PO-Revision-Date: 2014-10-12 09:41+0000\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-13 06:15+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -33,22 +33,22 @@ msgstr "Unpin shortcut"
33
33
34#: qml/Components/DelayedLockscreen.qml:47
34#: qml/Components/DelayedLockscreen.qml:47
35msgid "Device Locked"
35msgid "Device Locked"
36−msgstr ""
36+msgstr "Device Locked"
37
37
38#: qml/Components/DelayedLockscreen.qml:62
38#: qml/Components/DelayedLockscreen.qml:62
39msgid "You have been locked out due to too many failed passphrase attempts."
39msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr ""
40+msgstr "You have been locked out due to too many failed passphrase attempts."
41
41
42#: qml/Components/DelayedLockscreen.qml:63
42#: qml/Components/DelayedLockscreen.qml:63
43msgid "You have been locked out due to too many failed passcode attempts."
43msgid "You have been locked out due to too many failed passcode attempts."
44−msgstr ""
44+msgstr "You have been locked out due to too many failed passcode attempts."
45
45
46#: qml/Components/DelayedLockscreen.qml:72
46#: qml/Components/DelayedLockscreen.qml:72
47#, qt-format
47#, qt-format
48msgid "Please wait %1 minute and then try again…"
48msgid "Please wait %1 minute and then try again…"
49msgid_plural "Please wait %1 minutes and then try again…"
49msgid_plural "Please wait %1 minutes and then try again…"
50−msgstr[0] ""
50+msgstr[0] "Please wait %1 minute and then try again…"
51−msgstr[1] ""
51+msgstr[1] "Please wait %1 minutes and then try again…"
52
52
53#: qml/Components/Dialogs.qml:70
53#: qml/Components/Dialogs.qml:70
54msgid "Log out"
54msgid "Log out"
@@ -156,23 +156,23 @@ msgstr ""
156"You have now mastered the edge gestures and can start using the "
156"You have now mastered the edge gestures and can start using the "
157"phone<br><br>Tap on the screen to start"
157"phone<br><br>Tap on the screen to start"
158
158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160msgid "Emergency Call"
160msgid "Emergency Call"
161msgstr "Emergency Call"
161msgstr "Emergency Call"
162
162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164msgid "OK"
164msgid "OK"
165msgstr "OK"
165msgstr "OK"
166
166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168msgid "See less"
168msgid "See less"
169msgstr "See less"
169msgstr "See less"
170
170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172msgid "See all"
172msgid "See all"
173msgstr "See all"
173msgstr "See all"
174
174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176#: qml/Panel/SearchIndicator.qml:27
176#: qml/Panel/SearchIndicator.qml:27
177msgid "Search"
177msgid "Search"
178msgstr "Search"
178msgstr "Search"
@@ -211,15 +211,15 @@ msgstr "Send"
211
211
212#: qml/Dash/PullToRefreshScopeStyle.qml:55
212#: qml/Dash/PullToRefreshScopeStyle.qml:55
213msgid "Pull to refresh…"
213msgid "Pull to refresh…"
214−msgstr ""
214+msgstr "Pull to refresh…"
215
215
216#: qml/Dash/PullToRefreshScopeStyle.qml:60
216#: qml/Dash/PullToRefreshScopeStyle.qml:60
217msgid "Release to refresh…"
217msgid "Release to refresh…"
218−msgstr ""
218+msgstr "Release to refresh…"
219
219
220#: qml/Dash/ScopesOverview.qml:206
220#: qml/Dash/ScopesOverview.qml:206
221msgid "Manage Scopes"
221msgid "Manage Scopes"
222−msgstr ""
222+msgstr "Manage Scopes"
223
223
224#: qml/Dash/ScopesOverview.qml:428
224#: qml/Dash/ScopesOverview.qml:428
225msgid "Done"
225msgid "Done"
@@ -239,7 +239,7 @@ msgstr "All"
239
239
240#: qml/Greeter/Greeter.qml:157
240#: qml/Greeter/Greeter.qml:157
241msgid "Unlock"
241msgid "Unlock"
242−msgstr ""
242+msgstr "Unlock"
243
243
244#: qml/Hud/HudParametrizedActionsPage.qml:139
244#: qml/Hud/HudParametrizedActionsPage.qml:139
245msgid "Confirm"
245msgid "Confirm"
@@ -261,18 +261,10 @@ msgstr "Speak Now..."
261msgid "Speaking..."
261msgid "Speaking..."
262msgstr "Speaking..."
262msgstr "Speaking..."
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265msgid "Show password"
265msgid "Show password"
266msgstr "Show password"
266msgstr "Show password"
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr "Enter SIM PIN"
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr "Sorry, incorrect PIN"
275−
276#: qml/Panel/ActiveCallHint.qml:77
268#: qml/Panel/ActiveCallHint.qml:77
277msgid "Tap to return to call..."
269msgid "Tap to return to call..."
278msgstr "Tap to return to call..."
270msgstr "Tap to return to call..."
@@ -283,7 +275,7 @@ msgstr "Conference"
283
275
284#: qml/Panel/Indicators/MenuItemFactory.qml:600
276#: qml/Panel/Indicators/MenuItemFactory.qml:600
285msgid "Nothing is playing"
277msgid "Nothing is playing"
286−msgstr ""
278+msgstr "Nothing is playing"
287
279
288#: qml/Panel/Indicators/MenuItemFactory.qml:748
280#: qml/Panel/Indicators/MenuItemFactory.qml:748
289msgid "In queue…"
281msgid "In queue…"
@@ -317,49 +309,49 @@ msgstr "Unlock SIM"
317msgid "Roaming"
309msgid "Roaming"
318msgstr "Roaming"
310msgstr "Roaming"
319
311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321msgid "Enter passphrase"
313msgid "Enter passphrase"
322−msgstr ""
314+msgstr "Enter passphrase"
323
315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325msgid "Sorry, incorrect passphrase"
317msgid "Sorry, incorrect passphrase"
326msgstr "Sorry, incorrect passphrase"
318msgstr "Sorry, incorrect passphrase"
327
319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329msgid "Please re-enter"
321msgid "Please re-enter"
330−msgstr ""
322+msgstr "Please re-enter"
331
323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333msgid "Enter passcode"
325msgid "Enter passcode"
334−msgstr ""
326+msgstr "Enter passcode"
335
327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337msgid "Sorry, incorrect passcode"
329msgid "Sorry, incorrect passcode"
338msgstr "Sorry, incorrect passcode"
330msgstr "Sorry, incorrect passcode"
339
331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341#, qt-format
333#, qt-format
342msgid "Enter %1"
334msgid "Enter %1"
343−msgstr ""
335+msgstr "Enter %1"
344
336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346#, qt-format
338#, qt-format
347msgid "Sorry, incorrect %1"
339msgid "Sorry, incorrect %1"
348msgstr "Sorry, incorrect %1"
340msgstr "Sorry, incorrect %1"
349
341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351msgid "Sorry, incorrect passphrase."
343msgid "Sorry, incorrect passphrase."
352msgstr "Sorry, incorrect passphrase."
344msgstr "Sorry, incorrect passphrase."
353
345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355msgid "Sorry, incorrect passcode."
347msgid "Sorry, incorrect passcode."
356msgstr "Sorry, incorrect passcode."
348msgstr "Sorry, incorrect passcode."
357
349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359msgid "This will be your last attempt."
351msgid "This will be your last attempt."
360msgstr "This will be your last attempt."
352msgstr "This will be your last attempt."
361
353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363msgid ""
355msgid ""
364"If passphrase is entered incorrectly, your phone will conduct a factory "
356"If passphrase is entered incorrectly, your phone will conduct a factory "
365"reset and all personal data will be deleted."
357"reset and all personal data will be deleted."
@@ -367,36 +359,10 @@ msgstr ""
367"If passphrase is entered incorrectly, your phone will conduct a factory "
359"If passphrase is entered incorrectly, your phone will conduct a factory "
368"reset and all personal data will be deleted."
360"reset and all personal data will be deleted."
369
361
370−#: qml/Shell.qml:389
362+#: qml/Shell.qml:395
371msgid ""
363msgid ""
372"If passcode is entered incorrectly, your phone will conduct a factory reset "
364"If passcode is entered incorrectly, your phone will conduct a factory reset "
373"and all personal data will be deleted."
365"and all personal data will be deleted."
374msgstr ""
366msgstr ""
375"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
376"and all personal data will be deleted."
368"and all personal data will be deleted."
377−
378−#, qt-format
379−#~ msgid "Hello %1"
380−#~ msgstr "Hello %1"
381−
382−#~ msgid "Hello"
383−#~ msgstr "Hello"
384−
385−#~ msgid "Swipe to unlock"
386−#~ msgstr "Swipe to unlock"
387−
388−#~ msgid "Please wait"
389−#~ msgstr "Please wait"
390−
391−#~ msgid "Too many incorrect attempts"
392−#~ msgstr "Too many incorrect attempts"
393−
394−#, qt-format
395−#~ msgid "Enter your %1"
396−#~ msgstr "Enter your %1"
397−
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "Enter your passphrase"
400−
401−#~ msgid "Enter your passcode"
402−#~ msgstr "Enter your passcode"
po/en_GB.po+26−54
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-03 12:46+0000\n"
11"PO-Revision-Date: 2014-10-03 12:46+0000\n"
12"Last-Translator: Andi Chandler <Unknown>\n"
12"Last-Translator: Andi Chandler <Unknown>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156"You have now mastered the edge gestures and can start using the "
156"You have now mastered the edge gestures and can start using the "
157"phone<br><br>Tap on the screen to start"
157"phone<br><br>Tap on the screen to start"
158
158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160msgid "Emergency Call"
160msgid "Emergency Call"
161msgstr "Emergency Call"
161msgstr "Emergency Call"
162
162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164msgid "OK"
164msgid "OK"
165msgstr "OK"
165msgstr "OK"
166
166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168msgid "See less"
168msgid "See less"
169msgstr "See less"
169msgstr "See less"
170
170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172msgid "See all"
172msgid "See all"
173msgstr "See all"
173msgstr "See all"
174
174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176#: qml/Panel/SearchIndicator.qml:27
176#: qml/Panel/SearchIndicator.qml:27
177msgid "Search"
177msgid "Search"
178msgstr "Search"
178msgstr "Search"
@@ -211,11 +211,11 @@ msgstr "Send"
211
211
212#: qml/Dash/PullToRefreshScopeStyle.qml:55
212#: qml/Dash/PullToRefreshScopeStyle.qml:55
213msgid "Pull to refresh…"
213msgid "Pull to refresh…"
214−msgstr ""
214+msgstr "Pull to refresh…"
215
215
216#: qml/Dash/PullToRefreshScopeStyle.qml:60
216#: qml/Dash/PullToRefreshScopeStyle.qml:60
217msgid "Release to refresh…"
217msgid "Release to refresh…"
218−msgstr ""
218+msgstr "Release to refresh…"
219
219
220#: qml/Dash/ScopesOverview.qml:206
220#: qml/Dash/ScopesOverview.qml:206
221msgid "Manage Scopes"
221msgid "Manage Scopes"
@@ -261,18 +261,10 @@ msgstr "Speak Now..."
261msgid "Speaking..."
261msgid "Speaking..."
262msgstr "Speaking..."
262msgstr "Speaking..."
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265msgid "Show password"
265msgid "Show password"
266msgstr "Show password"
266msgstr "Show password"
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr "Enter SIM PIN"
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr "Sorry, incorrect PIN"
275−
276#: qml/Panel/ActiveCallHint.qml:77
268#: qml/Panel/ActiveCallHint.qml:77
277msgid "Tap to return to call..."
269msgid "Tap to return to call..."
278msgstr "Tap to return to call..."
270msgstr "Tap to return to call..."
@@ -317,49 +309,49 @@ msgstr "Unlock SIM"
317msgid "Roaming"
309msgid "Roaming"
318msgstr "Roaming"
310msgstr "Roaming"
319
311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321msgid "Enter passphrase"
313msgid "Enter passphrase"
322msgstr "Enter passphrase"
314msgstr "Enter passphrase"
323
315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325msgid "Sorry, incorrect passphrase"
317msgid "Sorry, incorrect passphrase"
326msgstr "Sorry, incorrect passphrase"
318msgstr "Sorry, incorrect passphrase"
327
319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329msgid "Please re-enter"
321msgid "Please re-enter"
330msgstr "Please re-enter"
322msgstr "Please re-enter"
331
323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333msgid "Enter passcode"
325msgid "Enter passcode"
334msgstr "Enter passcode"
326msgstr "Enter passcode"
335
327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337msgid "Sorry, incorrect passcode"
329msgid "Sorry, incorrect passcode"
338msgstr "Sorry, incorrect passcode"
330msgstr "Sorry, incorrect passcode"
339
331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341#, qt-format
333#, qt-format
342msgid "Enter %1"
334msgid "Enter %1"
343msgstr "Enter %1"
335msgstr "Enter %1"
344
336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346#, qt-format
338#, qt-format
347msgid "Sorry, incorrect %1"
339msgid "Sorry, incorrect %1"
348msgstr "Sorry, incorrect %1"
340msgstr "Sorry, incorrect %1"
349
341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351msgid "Sorry, incorrect passphrase."
343msgid "Sorry, incorrect passphrase."
352msgstr "Sorry, incorrect passphrase."
344msgstr "Sorry, incorrect passphrase."
353
345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355msgid "Sorry, incorrect passcode."
347msgid "Sorry, incorrect passcode."
356msgstr "Sorry, incorrect passcode."
348msgstr "Sorry, incorrect passcode."
357
349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359msgid "This will be your last attempt."
351msgid "This will be your last attempt."
360msgstr "This will be your last attempt."
352msgstr "This will be your last attempt."
361
353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363msgid ""
355msgid ""
364"If passphrase is entered incorrectly, your phone will conduct a factory "
356"If passphrase is entered incorrectly, your phone will conduct a factory "
365"reset and all personal data will be deleted."
357"reset and all personal data will be deleted."
@@ -367,7 +359,7 @@ msgstr ""
367"If passphrase is entered incorrectly, your phone will conduct a factory "
359"If passphrase is entered incorrectly, your phone will conduct a factory "
368"reset and all personal data will be deleted."
360"reset and all personal data will be deleted."
369
361
370−#: qml/Shell.qml:389
362+#: qml/Shell.qml:395
371msgid ""
363msgid ""
372"If passcode is entered incorrectly, your phone will conduct a factory reset "
364"If passcode is entered incorrectly, your phone will conduct a factory reset "
373"and all personal data will be deleted."
365"and all personal data will be deleted."
@@ -375,28 +367,8 @@ msgstr ""
375"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
376"and all personal data will be deleted."
368"and all personal data will be deleted."
377
369
378−#, qt-format
370+#~ msgid "Sorry, incorrect PIN"
379−#~ msgid "Hello %1"
371+#~ msgstr "Sorry, incorrect PIN"
380−#~ msgstr "Hello %1"
381−
382−#~ msgid "Hello"
383−#~ msgstr "Hello"
384−
385−#~ msgid "Swipe to unlock"
386−#~ msgstr "Swipe to unlock"
387−
388−#~ msgid "Please wait"
389−#~ msgstr "Please wait"
390−
391−#~ msgid "Too many incorrect attempts"
392−#~ msgstr "Too many incorrect attempts"
393−
394−#, qt-format
395−#~ msgid "Enter your %1"
396−#~ msgstr "Enter your %1"
397−
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "Enter your passphrase"
400
372
401−#~ msgid "Enter your passcode"
373+#~ msgid "Enter SIM PIN"
402−#~ msgstr "Enter your passcode"
374+#~ msgstr "Enter SIM PIN"
po/eo.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr ""
174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr ""
258msgstr ""
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/es.po+28−56
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2014-10-05 08:50+0000\n"
11+"PO-Revision-Date: 2014-10-09 07:43+0000\n"
12−"Last-Translator: Paco Molinero <paco@byasl.com>\n"
12+"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -163,23 +163,23 @@ msgstr ""
163"Ahora domina los gestos de los bordes y puede usar el teléfono<br><br>Toque "
163"Ahora domina los gestos de los bordes y puede usar el teléfono<br><br>Toque "
164"la pantalla para comenzar"
164"la pantalla para comenzar"
165
165
166−#: qml/Components/Lockscreen.qml:218
166+#: qml/Components/Lockscreen.qml:220
167msgid "Emergency Call"
167msgid "Emergency Call"
168msgstr "Llamada de emergencia"
168msgstr "Llamada de emergencia"
169
169
170−#: qml/Components/Lockscreen.qml:250
170+#: qml/Components/Lockscreen.qml:252
171msgid "OK"
171msgid "OK"
172msgstr "Aceptar"
172msgstr "Aceptar"
173
173
174−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
174+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
175msgid "See less"
175msgid "See less"
176msgstr "Ver menos"
176msgstr "Ver menos"
177
177
178−#: qml/Dash/GenericScopeView.qml:411
178+#: qml/Dash/GenericScopeView.qml:434
179msgid "See all"
179msgid "See all"
180msgstr "Ver todo"
180msgstr "Ver todo"
181
181
182−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
182+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
183#: qml/Panel/SearchIndicator.qml:27
183#: qml/Panel/SearchIndicator.qml:27
184msgid "Search"
184msgid "Search"
185msgstr "Buscar"
185msgstr "Buscar"
@@ -218,11 +218,11 @@ msgstr "Enviar"
218
218
219#: qml/Dash/PullToRefreshScopeStyle.qml:55
219#: qml/Dash/PullToRefreshScopeStyle.qml:55
220msgid "Pull to refresh…"
220msgid "Pull to refresh…"
221−msgstr ""
221+msgstr "Deslice para actualizar…"
222
222
223#: qml/Dash/PullToRefreshScopeStyle.qml:60
223#: qml/Dash/PullToRefreshScopeStyle.qml:60
224msgid "Release to refresh…"
224msgid "Release to refresh…"
225−msgstr ""
225+msgstr "Suelte para actualizar…"
226
226
227#: qml/Dash/ScopesOverview.qml:206
227#: qml/Dash/ScopesOverview.qml:206
228msgid "Manage Scopes"
228msgid "Manage Scopes"
@@ -268,18 +268,10 @@ msgstr "Hable ahora…"
268msgid "Speaking..."
268msgid "Speaking..."
269msgstr "Hablando…"
269msgstr "Hablando…"
270
270
271−#: qml/Notifications/NotificationMenuItemFactory.qml:108
271+#: qml/Notifications/NotificationMenuItemFactory.qml:116
272msgid "Show password"
272msgid "Show password"
273msgstr "Mostrar contraseña"
273msgstr "Mostrar contraseña"
274
274
275−#: qml/Notifications/NotificationMenuItemFactory.qml:124
276−msgid "Enter SIM PIN"
277−msgstr "Escriba el PIN de la SIM"
278−
279−#: qml/Notifications/NotificationMenuItemFactory.qml:125
280−msgid "Sorry, incorrect PIN"
281−msgstr "El PIN es incorrecto"
282−
283#: qml/Panel/ActiveCallHint.qml:77
275#: qml/Panel/ActiveCallHint.qml:77
284msgid "Tap to return to call..."
276msgid "Tap to return to call..."
285msgstr "Toque para volver a llamar..."
277msgstr "Toque para volver a llamar..."
@@ -324,49 +316,49 @@ msgstr "Desbloquear SIM"
324msgid "Roaming"
316msgid "Roaming"
325msgstr "Itinerancia"
317msgstr "Itinerancia"
326
318
327−#: qml/Shell.qml:340
319+#: qml/Shell.qml:346
328msgid "Enter passphrase"
320msgid "Enter passphrase"
329msgstr "Introduzca la contraseña"
321msgstr "Introduzca la contraseña"
330
322
331−#: qml/Shell.qml:341
323+#: qml/Shell.qml:347
332msgid "Sorry, incorrect passphrase"
324msgid "Sorry, incorrect passphrase"
333msgstr "La contraseña es incorrecta"
325msgstr "La contraseña es incorrecta"
334
326
335−#: qml/Shell.qml:342
327+#: qml/Shell.qml:348
336msgid "Please re-enter"
328msgid "Please re-enter"
337msgstr "Reintroduzca"
329msgstr "Reintroduzca"
338
330
339−#: qml/Shell.qml:344
331+#: qml/Shell.qml:350
340msgid "Enter passcode"
332msgid "Enter passcode"
341msgstr "Introduzca el código"
333msgstr "Introduzca el código"
342
334
343−#: qml/Shell.qml:345
335+#: qml/Shell.qml:351
344msgid "Sorry, incorrect passcode"
336msgid "Sorry, incorrect passcode"
345msgstr "El código es incorrecto"
337msgstr "El código es incorrecto"
346
338
347−#: qml/Shell.qml:348
339+#: qml/Shell.qml:354
348#, qt-format
340#, qt-format
349msgid "Enter %1"
341msgid "Enter %1"
350msgstr "Introduzca %1"
342msgstr "Introduzca %1"
351
343
352−#: qml/Shell.qml:349
344+#: qml/Shell.qml:355
353#, qt-format
345#, qt-format
354msgid "Sorry, incorrect %1"
346msgid "Sorry, incorrect %1"
355msgstr "Incorrecto (%1)"
347msgstr "Incorrecto (%1)"
356
348
357−#: qml/Shell.qml:384
349+#: qml/Shell.qml:390
358msgid "Sorry, incorrect passphrase."
350msgid "Sorry, incorrect passphrase."
359msgstr "La contraseña es incorrecta."
351msgstr "La contraseña es incorrecta."
360
352
361−#: qml/Shell.qml:385
353+#: qml/Shell.qml:391
362msgid "Sorry, incorrect passcode."
354msgid "Sorry, incorrect passcode."
363msgstr "Código de acceso incorrecto."
355msgstr "Código de acceso incorrecto."
364
356
365−#: qml/Shell.qml:386
357+#: qml/Shell.qml:392
366msgid "This will be your last attempt."
358msgid "This will be your last attempt."
367msgstr "Este será su último intento."
359msgstr "Este será su último intento."
368
360
369−#: qml/Shell.qml:388
361+#: qml/Shell.qml:394
370msgid ""
362msgid ""
371"If passphrase is entered incorrectly, your phone will conduct a factory "
363"If passphrase is entered incorrectly, your phone will conduct a factory "
372"reset and all personal data will be deleted."
364"reset and all personal data will be deleted."
@@ -374,7 +366,7 @@ msgstr ""
374"Si se introduce la frase incorrectamente, el teléfono volverá a la "
366"Si se introduce la frase incorrectamente, el teléfono volverá a la "
375"configuración de fábrica y se perderán todos los datos personales."
367"configuración de fábrica y se perderán todos los datos personales."
376
368
377−#: qml/Shell.qml:389
369+#: qml/Shell.qml:395
378msgid ""
370msgid ""
379"If passcode is entered incorrectly, your phone will conduct a factory reset "
371"If passcode is entered incorrectly, your phone will conduct a factory reset "
380"and all personal data will be deleted."
372"and all personal data will be deleted."
@@ -382,28 +374,8 @@ msgstr ""
382"Si se introduce el código incorrectamente, el teléfono volverá a la "
374"Si se introduce el código incorrectamente, el teléfono volverá a la "
383"configuración de fábrica y se perderán todos los datos personales."
375"configuración de fábrica y se perderán todos los datos personales."
384
376
385−#~ msgid "Hello"
377+#~ msgid "Enter SIM PIN"
386−#~ msgstr "Hola"
387−
388−#, qt-format
389−#~ msgid "Hello %1"
390−#~ msgstr "Hola, %1"
391−
392−#~ msgid "Swipe to unlock"
393−#~ msgstr "Deslice para desbloquear"
394−
395−#~ msgid "Please wait"
396−#~ msgstr "Espere un momento"
397−
398−#~ msgid "Too many incorrect attempts"
399−#~ msgstr "Demasiados intentos incorrectos"
400−
401−#, qt-format
402−#~ msgid "Enter your %1"
403−#~ msgstr "Introduzca su %1"
404−
405−#~ msgid "Enter your passcode"
406−#~ msgstr "Escriba su código de acceso"
378+#~ msgstr "Escriba el PIN de la SIM"
407
379
408−#~ msgid "Enter your passphrase"
380+#~ msgid "Sorry, incorrect PIN"
409−#~ msgstr "Escriba su contraseña"
381+#~ msgstr "El PIN es incorrecto"
po/eu.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 19:21+0000\n"
11"PO-Revision-Date: 2014-10-07 19:21+0000\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
13"Language-Team: Basque <eu@li.org>\n"
13"Language-Team: Basque <eu@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -160,23 +160,23 @@ msgstr ""
160"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
160"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
161"zaitezke<br><br>Sakatu pantailan hasteko"
161"zaitezke<br><br>Sakatu pantailan hasteko"
162
162
163−#: qml/Components/Lockscreen.qml:218
163+#: qml/Components/Lockscreen.qml:220
164msgid "Emergency Call"
164msgid "Emergency Call"
165msgstr "Larrialdi-deia"
165msgstr "Larrialdi-deia"
166
166
167−#: qml/Components/Lockscreen.qml:250
167+#: qml/Components/Lockscreen.qml:252
168msgid "OK"
168msgid "OK"
169msgstr "Ados"
169msgstr "Ados"
170
170
171−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
171+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
172msgid "See less"
172msgid "See less"
173msgstr "Ikusi gutxiago"
173msgstr "Ikusi gutxiago"
174
174
175−#: qml/Dash/GenericScopeView.qml:411
175+#: qml/Dash/GenericScopeView.qml:434
176msgid "See all"
176msgid "See all"
177msgstr "Ikusi guztiak"
177msgstr "Ikusi guztiak"
178
178
179−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
179+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
180#: qml/Panel/SearchIndicator.qml:27
180#: qml/Panel/SearchIndicator.qml:27
181msgid "Search"
181msgid "Search"
182msgstr "Bilatu"
182msgstr "Bilatu"
@@ -265,18 +265,10 @@ msgstr "Hitz egin orain..."
265msgid "Speaking..."
265msgid "Speaking..."
266msgstr "Hitz egiten..."
266msgstr "Hitz egiten..."
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:108
268+#: qml/Notifications/NotificationMenuItemFactory.qml:116
269msgid "Show password"
269msgid "Show password"
270msgstr "Erakutsi pasahitza"
270msgstr "Erakutsi pasahitza"
271
271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:124
273−msgid "Enter SIM PIN"
274−msgstr "Sartu SIMaren PINa"
275−
276−#: qml/Notifications/NotificationMenuItemFactory.qml:125
277−msgid "Sorry, incorrect PIN"
278−msgstr "Sentitzen dugu, PINa okerrekoa da"
279−
280#: qml/Panel/ActiveCallHint.qml:77
272#: qml/Panel/ActiveCallHint.qml:77
281msgid "Tap to return to call..."
273msgid "Tap to return to call..."
282msgstr "Sakatu deira itzultzeko..."
274msgstr "Sakatu deira itzultzeko..."
@@ -321,49 +313,49 @@ msgstr "Desblokeatu SIMa"
321msgid "Roaming"
313msgid "Roaming"
322msgstr "Ibiltaritza"
314msgstr "Ibiltaritza"
323
315
324−#: qml/Shell.qml:340
316+#: qml/Shell.qml:346
325msgid "Enter passphrase"
317msgid "Enter passphrase"
326msgstr "Sartu pasaesaldia"
318msgstr "Sartu pasaesaldia"
327
319
328−#: qml/Shell.qml:341
320+#: qml/Shell.qml:347
329msgid "Sorry, incorrect passphrase"
321msgid "Sorry, incorrect passphrase"
330msgstr "Sentitzen dugu, pasaesaldia okerrekoa da"
322msgstr "Sentitzen dugu, pasaesaldia okerrekoa da"
331
323
332−#: qml/Shell.qml:342
324+#: qml/Shell.qml:348
333msgid "Please re-enter"
325msgid "Please re-enter"
334msgstr "Errepikatu"
326msgstr "Errepikatu"
335
327
336−#: qml/Shell.qml:344
328+#: qml/Shell.qml:350
337msgid "Enter passcode"
329msgid "Enter passcode"
338msgstr "Sartu pasakodea"
330msgstr "Sartu pasakodea"
339
331
340−#: qml/Shell.qml:345
332+#: qml/Shell.qml:351
341msgid "Sorry, incorrect passcode"
333msgid "Sorry, incorrect passcode"
342msgstr "Sentitzen dugu, pasakodea okerrekoa da"
334msgstr "Sentitzen dugu, pasakodea okerrekoa da"
343
335
344−#: qml/Shell.qml:348
336+#: qml/Shell.qml:354
345#, qt-format
337#, qt-format
346msgid "Enter %1"
338msgid "Enter %1"
347msgstr "Sartu %1"
339msgstr "Sartu %1"
348
340
349−#: qml/Shell.qml:349
341+#: qml/Shell.qml:355
350#, qt-format
342#, qt-format
351msgid "Sorry, incorrect %1"
343msgid "Sorry, incorrect %1"
352msgstr "Sentitzen dugu, %1 okerrekoa da"
344msgstr "Sentitzen dugu, %1 okerrekoa da"
353
345
354−#: qml/Shell.qml:384
346+#: qml/Shell.qml:390
355msgid "Sorry, incorrect passphrase."
347msgid "Sorry, incorrect passphrase."
356msgstr "Sentitzen dugu, pasaesaldia okerrekoa da."
348msgstr "Sentitzen dugu, pasaesaldia okerrekoa da."
357
349
358−#: qml/Shell.qml:385
350+#: qml/Shell.qml:391
359msgid "Sorry, incorrect passcode."
351msgid "Sorry, incorrect passcode."
360msgstr "Sentitzen dugu, pasakodea okerrekoa da."
352msgstr "Sentitzen dugu, pasakodea okerrekoa da."
361
353
362−#: qml/Shell.qml:386
354+#: qml/Shell.qml:392
363msgid "This will be your last attempt."
355msgid "This will be your last attempt."
364msgstr "Hau duzu azken saiakera."
356msgstr "Hau duzu azken saiakera."
365
357
366−#: qml/Shell.qml:388
358+#: qml/Shell.qml:394
367msgid ""
359msgid ""
368"If passphrase is entered incorrectly, your phone will conduct a factory "
360"If passphrase is entered incorrectly, your phone will conduct a factory "
369"reset and all personal data will be deleted."
361"reset and all personal data will be deleted."
@@ -371,7 +363,7 @@ msgstr ""
371"Okerreko pasaesaldia sartzen baduzu, telefonoaren jatorrizko ezarpenak "
363"Okerreko pasaesaldia sartzen baduzu, telefonoaren jatorrizko ezarpenak "
372"berrezarri eta datu pertsonal guztiak ezabatuko dira."
364"berrezarri eta datu pertsonal guztiak ezabatuko dira."
373
365
374−#: qml/Shell.qml:389
366+#: qml/Shell.qml:395
375msgid ""
367msgid ""
376"If passcode is entered incorrectly, your phone will conduct a factory reset "
368"If passcode is entered incorrectly, your phone will conduct a factory reset "
377"and all personal data will be deleted."
369"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379"Okerreko pasakodea sartzen baduzu, telefonoaren jatorrizko ezarpenak "
371"Okerreko pasakodea sartzen baduzu, telefonoaren jatorrizko ezarpenak "
380"berrezarri eta datu pertsonal guztiak ezabatuko dira."
372"berrezarri eta datu pertsonal guztiak ezabatuko dira."
381
373
382−#, qt-format
374+#~ msgid "Sorry, incorrect PIN"
383−#~ msgid "Hello %1"
375+#~ msgstr "Sentitzen dugu, PINa okerrekoa da"
384−#~ msgstr "Kaixo %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "Kaixo"
388
376
389−#~ msgid "Swipe to unlock"
377+#~ msgid "Enter SIM PIN"
390−#~ msgstr "Pasatu hatza desblokeatzeko"
391−
392−#~ msgid "Please wait"
393−#~ msgstr "Itxaron"
394−
395−#~ msgid "Too many incorrect attempts"
396−#~ msgstr "Okerreko saiakera gehiegi"
397−
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "Sartu pasaesaldia"
400−
401−#~ msgid "Enter your passcode"
402−#~ msgstr "Sartu pasakodea"
378+#~ msgstr "Sartu SIMaren PINa"
403−
404−#, qt-format
405−#~ msgid "Enter your %1"
406−#~ msgstr "Sartu %1"
po/fa.po+23−57
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2014-10-02 23:07+0000\n"
11+"PO-Revision-Date: 2014-10-11 23:41+0000\n"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
13"Language-Team: Persian <fa@li.org>\n"
13"Language-Team: Persian <fa@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-12 06:55+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156"هم اکنون در استفاده از ژست های حرکتی مهارت لازم را دارید و می‌توانید استفاده "
156"هم اکنون در استفاده از ژست های حرکتی مهارت لازم را دارید و می‌توانید استفاده "
157"از تلفن را آغاز کنید<br><br>برای شروع صفحه را لمس کنید"
157"از تلفن را آغاز کنید<br><br>برای شروع صفحه را لمس کنید"
158
158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160msgid "Emergency Call"
160msgid "Emergency Call"
161msgstr "تماس اضطراری"
161msgstr "تماس اضطراری"
162
162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164msgid "OK"
164msgid "OK"
165msgstr "قبول"
165msgstr "قبول"
166
166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168msgid "See less"
168msgid "See less"
169msgstr "کم‌تر ببینید"
169msgstr "کم‌تر ببینید"
170
170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172msgid "See all"
172msgid "See all"
173msgstr "دیدن همه"
173msgstr "دیدن همه"
174
174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176#: qml/Panel/SearchIndicator.qml:27
176#: qml/Panel/SearchIndicator.qml:27
177msgid "Search"
177msgid "Search"
178msgstr "جست‌وجو"
178msgstr "جست‌وجو"
@@ -211,11 +211,11 @@ msgstr "ارسال"
211
211
212#: qml/Dash/PullToRefreshScopeStyle.qml:55
212#: qml/Dash/PullToRefreshScopeStyle.qml:55
213msgid "Pull to refresh…"
213msgid "Pull to refresh…"
214−msgstr ""
214+msgstr "برای تازه‌سازی بکشید…"
215
215
216#: qml/Dash/PullToRefreshScopeStyle.qml:60
216#: qml/Dash/PullToRefreshScopeStyle.qml:60
217msgid "Release to refresh…"
217msgid "Release to refresh…"
218−msgstr ""
218+msgstr "برای تازه‌سازی رها کنید…"
219
219
220#: qml/Dash/ScopesOverview.qml:206
220#: qml/Dash/ScopesOverview.qml:206
221msgid "Manage Scopes"
221msgid "Manage Scopes"
@@ -261,18 +261,10 @@ msgstr "اکنون صحبت کنید…"
261msgid "Speaking..."
261msgid "Speaking..."
262msgstr "در حال صحبت کردن…"
262msgstr "در حال صحبت کردن…"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265msgid "Show password"
265msgid "Show password"
266msgstr "نمایش گذرواژه"
266msgstr "نمایش گذرواژه"
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr "PIN سیم‌کارت را وارد کنید"
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr "متأسّفیم، PIN نادرست بود"
275−
276#: qml/Panel/ActiveCallHint.qml:77
268#: qml/Panel/ActiveCallHint.qml:77
277msgid "Tap to return to call..."
269msgid "Tap to return to call..."
278msgstr "برای بازگشت به تماس ضربه بزنید…"
270msgstr "برای بازگشت به تماس ضربه بزنید…"
@@ -317,49 +309,49 @@ msgstr "باز کردن قفل سیم‌کارت"
317msgid "Roaming"
309msgid "Roaming"
318msgstr "رومینگ"
310msgstr "رومینگ"
319
311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321msgid "Enter passphrase"
313msgid "Enter passphrase"
322msgstr "عبارت‌عبور را وارد کنید"
314msgstr "عبارت‌عبور را وارد کنید"
323
315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325msgid "Sorry, incorrect passphrase"
317msgid "Sorry, incorrect passphrase"
326msgstr "متأسّفیم، عبارت‌عبور نادرست بود"
318msgstr "متأسّفیم، عبارت‌عبور نادرست بود"
327
319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329msgid "Please re-enter"
321msgid "Please re-enter"
330msgstr "لطفاً دوباره وارد کنید"
322msgstr "لطفاً دوباره وارد کنید"
331
323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333msgid "Enter passcode"
325msgid "Enter passcode"
334msgstr "رمزعبور را وارد کنید"
326msgstr "رمزعبور را وارد کنید"
335
327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337msgid "Sorry, incorrect passcode"
329msgid "Sorry, incorrect passcode"
338msgstr "متأسّفیم، رمزعبور نادرست بود"
330msgstr "متأسّفیم، رمزعبور نادرست بود"
339
331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341#, qt-format
333#, qt-format
342msgid "Enter %1"
334msgid "Enter %1"
343msgstr "%1 را وارد کنید"
335msgstr "%1 را وارد کنید"
344
336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346#, qt-format
338#, qt-format
347msgid "Sorry, incorrect %1"
339msgid "Sorry, incorrect %1"
348msgstr "متأسّفیم، %1 نادرست بود"
340msgstr "متأسّفیم، %1 نادرست بود"
349
341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351msgid "Sorry, incorrect passphrase."
343msgid "Sorry, incorrect passphrase."
352msgstr "متأسّفیم، عبارت‌عبور نادرست است."
344msgstr "متأسّفیم، عبارت‌عبور نادرست است."
353
345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355msgid "Sorry, incorrect passcode."
347msgid "Sorry, incorrect passcode."
356msgstr "متأسّفیم، رمزعبور نادرست است."
348msgstr "متأسّفیم، رمزعبور نادرست است."
357
349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359msgid "This will be your last attempt."
351msgid "This will be your last attempt."
360msgstr "این آخرین تلاش شما خواهد بود."
352msgstr "این آخرین تلاش شما خواهد بود."
361
353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363msgid ""
355msgid ""
364"If passphrase is entered incorrectly, your phone will conduct a factory "
356"If passphrase is entered incorrectly, your phone will conduct a factory "
365"reset and all personal data will be deleted."
357"reset and all personal data will be deleted."
@@ -367,36 +359,10 @@ msgstr ""
367"اگر عبارت‌عبور نادرست وارد شود، تلفن شما بازنشانی کارخانه خواهد شد و تمامی "
359"اگر عبارت‌عبور نادرست وارد شود، تلفن شما بازنشانی کارخانه خواهد شد و تمامی "
368"اطّلاعات شخصی حذف خواهند شد."
360"اطّلاعات شخصی حذف خواهند شد."
369
361
370−#: qml/Shell.qml:389
362+#: qml/Shell.qml:395
371msgid ""
363msgid ""
372"If passcode is entered incorrectly, your phone will conduct a factory reset "
364"If passcode is entered incorrectly, your phone will conduct a factory reset "
373"and all personal data will be deleted."
365"and all personal data will be deleted."
374msgstr ""
366msgstr ""
375"اگر رمزعبور نادرست وارد شود، تلفن شما بازنشانی کارخانه خواهد شد و تمامی "
367"اگر رمزعبور نادرست وارد شود، تلفن شما بازنشانی کارخانه خواهد شد و تمامی "
376"اطّلاعات شخصی حذف خواهند شد."
368"اطّلاعات شخصی حذف خواهند شد."
377−
378−#, qt-format
379−#~ msgid "Hello %1"
380−#~ msgstr "سلام %1"
381−
382−#~ msgid "Hello"
383−#~ msgstr "سلام"
384−
385−#~ msgid "Swipe to unlock"
386−#~ msgstr "برای باز کردن قفل بکشد"
387−
388−#~ msgid "Please wait"
389−#~ msgstr "لطفاً صبر کنید"
390−
391−#~ msgid "Too many incorrect attempts"
392−#~ msgstr "تلاش‌های ناموفّق زیاد"
393−
394−#, qt-format
395−#~ msgid "Enter your %1"
396−#~ msgstr "%1 خود را وارد کنید"
397−
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "عبارت‌عبورتان را وارد کنید"
400−
401−#~ msgid "Enter your passcode"
402−#~ msgstr "رمزعبورتان را وارد کنید"
po/fi.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 13:10+0000\n"
11"PO-Revision-Date: 2014-10-07 13:10+0000\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
13"Language-Team: Finnish <fi@li.org>\n"
13"Language-Team: Finnish <fi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
158"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
159"käytön<br><br>Napauta näyttöä aloittaaksesi"
159"käytön<br><br>Napauta näyttöä aloittaaksesi"
160
160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162msgid "Emergency Call"
162msgid "Emergency Call"
163msgstr "Hätäpuhelu"
163msgstr "Hätäpuhelu"
164
164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166msgid "OK"
166msgid "OK"
167msgstr "OK"
167msgstr "OK"
168
168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170msgid "See less"
170msgid "See less"
171msgstr "Näytä vähemmän"
171msgstr "Näytä vähemmän"
172
172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174msgid "See all"
174msgid "See all"
175msgstr "Näytä kaikki"
175msgstr "Näytä kaikki"
176
176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178#: qml/Panel/SearchIndicator.qml:27
178#: qml/Panel/SearchIndicator.qml:27
179msgid "Search"
179msgid "Search"
180msgstr "Hae"
180msgstr "Hae"
@@ -263,18 +263,10 @@ msgstr "Puhu nyt..."
263msgid "Speaking..."
263msgid "Speaking..."
264msgstr "Puhutaan..."
264msgstr "Puhutaan..."
265
265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267msgid "Show password"
267msgid "Show password"
268msgstr "Näytä salasana"
268msgstr "Näytä salasana"
269
269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Anna SIM-kortin PIN-koodi"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "Väärä PIN-koodi"
277−
278#: qml/Panel/ActiveCallHint.qml:77
270#: qml/Panel/ActiveCallHint.qml:77
279msgid "Tap to return to call..."
271msgid "Tap to return to call..."
280msgstr "Napauta palataksesi puheluun..."
272msgstr "Napauta palataksesi puheluun..."
@@ -319,49 +311,49 @@ msgstr "Avaa SIM-kortin lukitus"
319msgid "Roaming"
311msgid "Roaming"
320msgstr "Verkkovierailu"
312msgstr "Verkkovierailu"
321
313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323msgid "Enter passphrase"
315msgid "Enter passphrase"
324msgstr "Anna tunnuslause"
316msgstr "Anna tunnuslause"
325
317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327msgid "Sorry, incorrect passphrase"
319msgid "Sorry, incorrect passphrase"
328msgstr "Virheellinen tunnuslause"
320msgstr "Virheellinen tunnuslause"
329
321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331msgid "Please re-enter"
323msgid "Please re-enter"
332msgstr "Anna uudelleen"
324msgstr "Anna uudelleen"
333
325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335msgid "Enter passcode"
327msgid "Enter passcode"
336msgstr "Anna suojakoodi"
328msgstr "Anna suojakoodi"
337
329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339msgid "Sorry, incorrect passcode"
331msgid "Sorry, incorrect passcode"
340msgstr "Väärä suojakoodi"
332msgstr "Väärä suojakoodi"
341
333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343#, qt-format
335#, qt-format
344msgid "Enter %1"
336msgid "Enter %1"
345msgstr "Anna %1"
337msgstr "Anna %1"
346
338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348#, qt-format
340#, qt-format
349msgid "Sorry, incorrect %1"
341msgid "Sorry, incorrect %1"
350msgstr "Väärä %1"
342msgstr "Väärä %1"
351
343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353msgid "Sorry, incorrect passphrase."
345msgid "Sorry, incorrect passphrase."
354msgstr "Virheellinen tunnuslause."
346msgstr "Virheellinen tunnuslause."
355
347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357msgid "Sorry, incorrect passcode."
349msgid "Sorry, incorrect passcode."
358msgstr "Virheellinen suojakoodi."
350msgstr "Virheellinen suojakoodi."
359
351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361msgid "This will be your last attempt."
353msgid "This will be your last attempt."
362msgstr "Tämä on viimeinen yritys."
354msgstr "Tämä on viimeinen yritys."
363
355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365msgid ""
357msgid ""
366"If passphrase is entered incorrectly, your phone will conduct a factory "
358"If passphrase is entered incorrectly, your phone will conduct a factory "
367"reset and all personal data will be deleted."
359"reset and all personal data will be deleted."
@@ -369,7 +361,7 @@ msgstr ""
369"Jos kirjoitat tunnuslauseen virheellisesti, puhelimesi palautetaan "
361"Jos kirjoitat tunnuslauseen virheellisesti, puhelimesi palautetaan "
370"tehdastilaan ja kaikki henkilökohtaiset tietosi poistetaan."
362"tehdastilaan ja kaikki henkilökohtaiset tietosi poistetaan."
371
363
372−#: qml/Shell.qml:389
364+#: qml/Shell.qml:395
373msgid ""
365msgid ""
374"If passcode is entered incorrectly, your phone will conduct a factory reset "
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
375"and all personal data will be deleted."
367"and all personal data will be deleted."
@@ -377,28 +369,8 @@ msgstr ""
377"Jos kirjoitat suojakoodin virheellisesti, puhelimesi palautetaan "
369"Jos kirjoitat suojakoodin virheellisesti, puhelimesi palautetaan "
378"tehdastilaan ja kaikki henkilökohtaiset tietosi poistetaan."
370"tehdastilaan ja kaikki henkilökohtaiset tietosi poistetaan."
379
371
380−#~ msgid "Hello"
372+#~ msgid "Sorry, incorrect PIN"
381−#~ msgstr "Hei"
373+#~ msgstr "Väärä PIN-koodi"
382−
383−#, qt-format
384−#~ msgid "Hello %1"
385−#~ msgstr "Hei %1!"
386−
387−#~ msgid "Swipe to unlock"
388−#~ msgstr "Avaa pyyhkäisemällä"
389−
390−#~ msgid "Please wait"
391−#~ msgstr "Odota hetki"
392−
393−#~ msgid "Too many incorrect attempts"
394−#~ msgstr "Liian monta virheellistä yritystä"
395−
396−#, qt-format
397−#~ msgid "Enter your %1"
398−#~ msgstr "Anna %1"
399−
400−#~ msgid "Enter your passphrase"
401−#~ msgstr "Anna tunnuslause"
402
374
403−#~ msgid "Enter your passcode"
375+#~ msgid "Enter SIM PIN"
404−#~ msgstr "Anna suojakoodi"
376+#~ msgstr "Anna SIM-kortin PIN-koodi"
po/fo.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
13"Language-Team: Faroese <fo@li.org>\n"
13"Language-Team: Faroese <fo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "Leita"
174msgstr "Leita"
@@ -257,18 +257,10 @@ msgstr "Snakka nú..."
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "Snakkar..."
258msgstr "Snakkar..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/fr.po+28−56
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2014-10-06 19:06+0000\n"
11+"PO-Revision-Date: 2014-10-09 19:00+0000\n"
12−"Last-Translator: Jean Marc <Unknown>\n"
12+"Last-Translator: Anne <anneonyme017@gmail.com>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -167,23 +167,23 @@ msgstr ""
167"Vous maîtrisez maintenant les différents gestes et pouvez commencer à "
167"Vous maîtrisez maintenant les différents gestes et pouvez commencer à "
168"utiliser le téléphone<br><br>Appuyez sur l'écran pour commencer"
168"utiliser le téléphone<br><br>Appuyez sur l'écran pour commencer"
169
169
170−#: qml/Components/Lockscreen.qml:218
170+#: qml/Components/Lockscreen.qml:220
171msgid "Emergency Call"
171msgid "Emergency Call"
172msgstr "Appel d'urgence"
172msgstr "Appel d'urgence"
173
173
174−#: qml/Components/Lockscreen.qml:250
174+#: qml/Components/Lockscreen.qml:252
175msgid "OK"
175msgid "OK"
176msgstr "OK"
176msgstr "OK"
177
177
178−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
178+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
179msgid "See less"
179msgid "See less"
180msgstr "Voir moins"
180msgstr "Voir moins"
181
181
182−#: qml/Dash/GenericScopeView.qml:411
182+#: qml/Dash/GenericScopeView.qml:434
183msgid "See all"
183msgid "See all"
184msgstr "Tout voir"
184msgstr "Tout voir"
185
185
186−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
186+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
187#: qml/Panel/SearchIndicator.qml:27
187#: qml/Panel/SearchIndicator.qml:27
188msgid "Search"
188msgid "Search"
189msgstr "Rechercher"
189msgstr "Rechercher"
@@ -222,11 +222,11 @@ msgstr "Envoyer"
222
222
223#: qml/Dash/PullToRefreshScopeStyle.qml:55
223#: qml/Dash/PullToRefreshScopeStyle.qml:55
224msgid "Pull to refresh…"
224msgid "Pull to refresh…"
225−msgstr ""
225+msgstr "Tirer pour actualiser..."
226
226
227#: qml/Dash/PullToRefreshScopeStyle.qml:60
227#: qml/Dash/PullToRefreshScopeStyle.qml:60
228msgid "Release to refresh…"
228msgid "Release to refresh…"
229−msgstr ""
229+msgstr "Relâcher pour actualiser..."
230
230
231#: qml/Dash/ScopesOverview.qml:206
231#: qml/Dash/ScopesOverview.qml:206
232msgid "Manage Scopes"
232msgid "Manage Scopes"
@@ -272,18 +272,10 @@ msgstr "Parlez maintenant…"
272msgid "Speaking..."
272msgid "Speaking..."
273msgstr "En cours d'écoute..."
273msgstr "En cours d'écoute..."
274
274
275−#: qml/Notifications/NotificationMenuItemFactory.qml:108
275+#: qml/Notifications/NotificationMenuItemFactory.qml:116
276msgid "Show password"
276msgid "Show password"
277msgstr "Afficher le mot de passe"
277msgstr "Afficher le mot de passe"
278
278
279−#: qml/Notifications/NotificationMenuItemFactory.qml:124
280−msgid "Enter SIM PIN"
281−msgstr "Entrez le code PIN de la SIM"
282−
283−#: qml/Notifications/NotificationMenuItemFactory.qml:125
284−msgid "Sorry, incorrect PIN"
285−msgstr "Désolé, code PIN incorrect"
286−
287#: qml/Panel/ActiveCallHint.qml:77
279#: qml/Panel/ActiveCallHint.qml:77
288msgid "Tap to return to call..."
280msgid "Tap to return to call..."
289msgstr "Appuyez pour revenir à l'appel…"
281msgstr "Appuyez pour revenir à l'appel…"
@@ -328,49 +320,49 @@ msgstr "Déverrouiller la carte SIM"
328msgid "Roaming"
320msgid "Roaming"
329msgstr "Roaming"
321msgstr "Roaming"
330
322
331−#: qml/Shell.qml:340
323+#: qml/Shell.qml:346
332msgid "Enter passphrase"
324msgid "Enter passphrase"
333msgstr "Saisissez la phrase de passe"
325msgstr "Saisissez la phrase de passe"
334
326
335−#: qml/Shell.qml:341
327+#: qml/Shell.qml:347
336msgid "Sorry, incorrect passphrase"
328msgid "Sorry, incorrect passphrase"
337msgstr "Désolé, phrase secrète incorrecte"
329msgstr "Désolé, phrase secrète incorrecte"
338
330
339−#: qml/Shell.qml:342
331+#: qml/Shell.qml:348
340msgid "Please re-enter"
332msgid "Please re-enter"
341msgstr "Veuillez ressaisir"
333msgstr "Veuillez ressaisir"
342
334
343−#: qml/Shell.qml:344
335+#: qml/Shell.qml:350
344msgid "Enter passcode"
336msgid "Enter passcode"
345msgstr "Saisissez le mot de passe"
337msgstr "Saisissez le mot de passe"
346
338
347−#: qml/Shell.qml:345
339+#: qml/Shell.qml:351
348msgid "Sorry, incorrect passcode"
340msgid "Sorry, incorrect passcode"
349msgstr "Désolé, code incorrect"
341msgstr "Désolé, code incorrect"
350
342
351−#: qml/Shell.qml:348
343+#: qml/Shell.qml:354
352#, qt-format
344#, qt-format
353msgid "Enter %1"
345msgid "Enter %1"
354msgstr "Saisissez %1"
346msgstr "Saisissez %1"
355
347
356−#: qml/Shell.qml:349
348+#: qml/Shell.qml:355
357#, qt-format
349#, qt-format
358msgid "Sorry, incorrect %1"
350msgid "Sorry, incorrect %1"
359msgstr "Désolé, %1 incorrect"
351msgstr "Désolé, %1 incorrect"
360
352
361−#: qml/Shell.qml:384
353+#: qml/Shell.qml:390
362msgid "Sorry, incorrect passphrase."
354msgid "Sorry, incorrect passphrase."
363msgstr "Désolé, phrase secrète incorrecte."
355msgstr "Désolé, phrase secrète incorrecte."
364
356
365−#: qml/Shell.qml:385
357+#: qml/Shell.qml:391
366msgid "Sorry, incorrect passcode."
358msgid "Sorry, incorrect passcode."
367msgstr "Désolé, code incorrect."
359msgstr "Désolé, code incorrect."
368
360
369−#: qml/Shell.qml:386
361+#: qml/Shell.qml:392
370msgid "This will be your last attempt."
362msgid "This will be your last attempt."
371msgstr "Ceci sera votre dernière tentative."
363msgstr "Ceci sera votre dernière tentative."
372
364
373−#: qml/Shell.qml:388
365+#: qml/Shell.qml:394
374msgid ""
366msgid ""
375"If passphrase is entered incorrectly, your phone will conduct a factory "
367"If passphrase is entered incorrectly, your phone will conduct a factory "
376"reset and all personal data will be deleted."
368"reset and all personal data will be deleted."
@@ -379,7 +371,7 @@ msgstr ""
379"effectuera une réinitialisation aux paramètres d'usine et toutes les données "
371"effectuera une réinitialisation aux paramètres d'usine et toutes les données "
380"personnelles seront supprimées."
372"personnelles seront supprimées."
381
373
382−#: qml/Shell.qml:389
374+#: qml/Shell.qml:395
383msgid ""
375msgid ""
384"If passcode is entered incorrectly, your phone will conduct a factory reset "
376"If passcode is entered incorrectly, your phone will conduct a factory reset "
385"and all personal data will be deleted."
377"and all personal data will be deleted."
@@ -388,28 +380,8 @@ msgstr ""
388"réinitialisation aux paramètres d'usine et toutes les données personnelles "
380"réinitialisation aux paramètres d'usine et toutes les données personnelles "
389"seront supprimées."
381"seront supprimées."
390
382
391−#~ msgid "Hello"
383+#~ msgid "Sorry, incorrect PIN"
392−#~ msgstr "Bonjour"
384+#~ msgstr "Désolé, code PIN incorrect"
393−
394−#, qt-format
395−#~ msgid "Hello %1"
396−#~ msgstr "Bonjour %1"
397−
398−#~ msgid "Swipe to unlock"
399−#~ msgstr "Faites glisser pour déverrouiller"
400−
401−#~ msgid "Please wait"
402−#~ msgstr "Veuillez patienter"
403−
404−#~ msgid "Too many incorrect attempts"
405−#~ msgstr "Trop de tentatives incorrectes"
406−
407−#, qt-format
408−#~ msgid "Enter your %1"
409−#~ msgstr "Saisissez votre %1"
410−
411−#~ msgid "Enter your passphrase"
412−#~ msgstr "Entrez votre phrase secrète"
413
385
414−#~ msgid "Enter your passcode"
386+#~ msgid "Enter SIM PIN"
415−#~ msgstr "Entrez votre code"
387+#~ msgstr "Entrez le code PIN de la SIM"
po/gd.po+27−55
@@ -7,8 +7,8 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2014-10-03 19:54+0000\n"
11+"PO-Revision-Date: 2014-10-09 18:09+0000\n"
12"Last-Translator: GunChleoc <Unknown>\n"
12"Last-Translator: GunChleoc <Unknown>\n"
13"Language-Team: Fòram na Gàidhlig\n"
13"Language-Team: Fòram na Gàidhlig\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18"(n > 2 && n < 20) ? 2 : 3;\n"
18"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21"Language: gd\n"
21"Language: gd\n"
22
22
@@ -170,23 +170,23 @@ msgstr ""
170"Fhuair thu air na gluasadan oire ceart a dhèanamh a-nis agus is urrainn dhut "
170"Fhuair thu air na gluasadan oire ceart a dhèanamh a-nis agus is urrainn dhut "
171"am fòn a chleachdadh<br><br>Thoir gnogag air an sgrìn airson tòiseachadh"
171"am fòn a chleachdadh<br><br>Thoir gnogag air an sgrìn airson tòiseachadh"
172
172
173−#: qml/Components/Lockscreen.qml:218
173+#: qml/Components/Lockscreen.qml:220
174msgid "Emergency Call"
174msgid "Emergency Call"
175msgstr "Gairm èiginn"
175msgstr "Gairm èiginn"
176
176
177−#: qml/Components/Lockscreen.qml:250
177+#: qml/Components/Lockscreen.qml:252
178msgid "OK"
178msgid "OK"
179msgstr "Ceart ma-thà"
179msgstr "Ceart ma-thà"
180
180
181−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
181+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
182msgid "See less"
182msgid "See less"
183msgstr "Seall nas lugha"
183msgstr "Seall nas lugha"
184
184
185−#: qml/Dash/GenericScopeView.qml:411
185+#: qml/Dash/GenericScopeView.qml:434
186msgid "See all"
186msgid "See all"
187msgstr "Seall na h-uile"
187msgstr "Seall na h-uile"
188
188
189−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
189+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
190#: qml/Panel/SearchIndicator.qml:27
190#: qml/Panel/SearchIndicator.qml:27
191msgid "Search"
191msgid "Search"
192msgstr "Lorg"
192msgstr "Lorg"
@@ -225,11 +225,11 @@ msgstr "Cuir"
225
225
226#: qml/Dash/PullToRefreshScopeStyle.qml:55
226#: qml/Dash/PullToRefreshScopeStyle.qml:55
227msgid "Pull to refresh…"
227msgid "Pull to refresh…"
228−msgstr ""
228+msgstr "Tarraing airson ath-nuadhachadh…"
229
229
230#: qml/Dash/PullToRefreshScopeStyle.qml:60
230#: qml/Dash/PullToRefreshScopeStyle.qml:60
231msgid "Release to refresh…"
231msgid "Release to refresh…"
232−msgstr ""
232+msgstr "Leig às airson ath-nuadhachadh…"
233
233
234#: qml/Dash/ScopesOverview.qml:206
234#: qml/Dash/ScopesOverview.qml:206
235msgid "Manage Scopes"
235msgid "Manage Scopes"
@@ -275,18 +275,10 @@ msgstr "Can rud a-nis..."
275msgid "Speaking..."
275msgid "Speaking..."
276msgstr "A' bruidhinn..."
276msgstr "A' bruidhinn..."
277
277
278−#: qml/Notifications/NotificationMenuItemFactory.qml:108
278+#: qml/Notifications/NotificationMenuItemFactory.qml:116
279msgid "Show password"
279msgid "Show password"
280msgstr "Seall am facal-faire"
280msgstr "Seall am facal-faire"
281
281
282−#: qml/Notifications/NotificationMenuItemFactory.qml:124
283−msgid "Enter SIM PIN"
284−msgstr "Cuir a-steach PIN an t-SIM"
285−
286−#: qml/Notifications/NotificationMenuItemFactory.qml:125
287−msgid "Sorry, incorrect PIN"
288−msgstr "Duilich ach tha a' PIN cearr"
289−
290#: qml/Panel/ActiveCallHint.qml:77
282#: qml/Panel/ActiveCallHint.qml:77
291msgid "Tap to return to call..."
283msgid "Tap to return to call..."
292msgstr "Gnog gus tilleadh dhan ghairm..."
284msgstr "Gnog gus tilleadh dhan ghairm..."
@@ -331,49 +323,49 @@ msgstr "Thoir a' ghlas far an SIM"
331msgid "Roaming"
323msgid "Roaming"
332msgstr "Air fàrsan"
324msgstr "Air fàrsan"
333
325
334−#: qml/Shell.qml:340
326+#: qml/Shell.qml:346
335msgid "Enter passphrase"
327msgid "Enter passphrase"
336msgstr "Cuir abairt-fhaire a-steach"
328msgstr "Cuir abairt-fhaire a-steach"
337
329
338−#: qml/Shell.qml:341
330+#: qml/Shell.qml:347
339msgid "Sorry, incorrect passphrase"
331msgid "Sorry, incorrect passphrase"
340msgstr "Duilich ach tha an abairt-fhaire cearr"
332msgstr "Duilich ach tha an abairt-fhaire cearr"
341
333
342−#: qml/Shell.qml:342
334+#: qml/Shell.qml:348
343msgid "Please re-enter"
335msgid "Please re-enter"
344msgstr "Cuir a-steach e a-rithist"
336msgstr "Cuir a-steach e a-rithist"
345
337
346−#: qml/Shell.qml:344
338+#: qml/Shell.qml:350
347msgid "Enter passcode"
339msgid "Enter passcode"
348msgstr "Cuir còd-faire a-steach"
340msgstr "Cuir còd-faire a-steach"
349
341
350−#: qml/Shell.qml:345
342+#: qml/Shell.qml:351
351msgid "Sorry, incorrect passcode"
343msgid "Sorry, incorrect passcode"
352msgstr "Duilich ach tha an còd-faire cearr"
344msgstr "Duilich ach tha an còd-faire cearr"
353
345
354−#: qml/Shell.qml:348
346+#: qml/Shell.qml:354
355#, qt-format
347#, qt-format
356msgid "Enter %1"
348msgid "Enter %1"
357msgstr "Cuir a-steach %1"
349msgstr "Cuir a-steach %1"
358
350
359−#: qml/Shell.qml:349
351+#: qml/Shell.qml:355
360#, qt-format
352#, qt-format
361msgid "Sorry, incorrect %1"
353msgid "Sorry, incorrect %1"
362msgstr "Duilich ach tha a' %1 cearr"
354msgstr "Duilich ach tha a' %1 cearr"
363
355
364−#: qml/Shell.qml:384
356+#: qml/Shell.qml:390
365msgid "Sorry, incorrect passphrase."
357msgid "Sorry, incorrect passphrase."
366msgstr "Duilich ach tha an abairt-fhaire cearr."
358msgstr "Duilich ach tha an abairt-fhaire cearr."
367
359
368−#: qml/Shell.qml:385
360+#: qml/Shell.qml:391
369msgid "Sorry, incorrect passcode."
361msgid "Sorry, incorrect passcode."
370msgstr "Duilich ach tha an còd-faire cearr."
362msgstr "Duilich ach tha an còd-faire cearr."
371
363
372−#: qml/Shell.qml:386
364+#: qml/Shell.qml:392
373msgid "This will be your last attempt."
365msgid "This will be your last attempt."
374msgstr "Seo an oidhirp mu dheireadh agad."
366msgstr "Seo an oidhirp mu dheireadh agad."
375
367
376−#: qml/Shell.qml:388
368+#: qml/Shell.qml:394
377msgid ""
369msgid ""
378"If passphrase is entered incorrectly, your phone will conduct a factory "
370"If passphrase is entered incorrectly, your phone will conduct a factory "
379"reset and all personal data will be deleted."
371"reset and all personal data will be deleted."
@@ -382,7 +374,7 @@ msgstr ""
382"ath-shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta "
374"ath-shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta "
383"pearsanta a sguabadh às."
375"pearsanta a sguabadh às."
384
376
385−#: qml/Shell.qml:389
377+#: qml/Shell.qml:395
386msgid ""
378msgid ""
387"If passcode is entered incorrectly, your phone will conduct a factory reset "
379"If passcode is entered incorrectly, your phone will conduct a factory reset "
388"and all personal data will be deleted."
380"and all personal data will be deleted."
@@ -391,28 +383,8 @@ msgstr ""
391"shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta pearsanta "
383"shuidheachadh air roghainnean an fhactaraidh agus thèid gach dàta pearsanta "
392"a sguabadh às."
384"a sguabadh às."
393
385
394−#, qt-format
386+#~ msgid "Enter SIM PIN"
395−#~ msgid "Hello %1"
387+#~ msgstr "Cuir a-steach PIN an t-SIM"
396−#~ msgstr "Shin thu, %1"
397−
398−#~ msgid "Hello"
399−#~ msgstr "Shin thu"
400−
401−#~ msgid "Swipe to unlock"
402−#~ msgstr "Dèan grad-shlaighdeadh gus a' ghlas a thoirt dheth"
403−
404−#~ msgid "Please wait"
405−#~ msgstr "Fuirich ort"
406−
407−#~ msgid "Too many incorrect attempts"
408−#~ msgstr "Cus oidhirpean leis nach do shoirbhich"
409
388
410−#~ msgid "Enter your passphrase"
389+#~ msgid "Sorry, incorrect PIN"
411−#~ msgstr "Cuir an abairt-fhaire agad a-steach"
390+#~ msgstr "Duilich ach tha a' PIN cearr"
412−
413−#~ msgid "Enter your passcode"
414−#~ msgstr "Cuir an còd-faire agad a-steach"
415−
416−#, qt-format
417−#~ msgid "Enter your %1"
418−#~ msgstr "Cuir a-steach a' %1 agad"
po/gl.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 10:01+0000\n"
11"PO-Revision-Date: 2014-10-07 10:01+0000\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
13"Language-Team: Galician <gl@li.org>\n"
13"Language-Team: Galician <gl@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgstr ""
156"Agora xa domina os xestos dos bordos e pode comezar a usar o "
156"Agora xa domina os xestos dos bordos e pode comezar a usar o "
157"teléfono<br><br>Toque na pantalla para comezar"
157"teléfono<br><br>Toque na pantalla para comezar"
158
158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160msgid "Emergency Call"
160msgid "Emergency Call"
161msgstr "Chamada de emerxencia"
161msgstr "Chamada de emerxencia"
162
162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164msgid "OK"
164msgid "OK"
165msgstr "Aceptar"
165msgstr "Aceptar"
166
166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168msgid "See less"
168msgid "See less"
169msgstr "Ver menos"
169msgstr "Ver menos"
170
170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172msgid "See all"
172msgid "See all"
173msgstr "Ver todo"
173msgstr "Ver todo"
174
174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176#: qml/Panel/SearchIndicator.qml:27
176#: qml/Panel/SearchIndicator.qml:27
177msgid "Search"
177msgid "Search"
178msgstr "Buscar"
178msgstr "Buscar"
@@ -261,18 +261,10 @@ msgstr "Fale agora…"
261msgid "Speaking..."
261msgid "Speaking..."
262msgstr "Falando…"
262msgstr "Falando…"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265msgid "Show password"
265msgid "Show password"
266msgstr "Mostrar contrasinal"
266msgstr "Mostrar contrasinal"
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr "Introduza o PIN da SIM"
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr "Sentímolo, o PIN é incorrecto"
275−
276#: qml/Panel/ActiveCallHint.qml:77
268#: qml/Panel/ActiveCallHint.qml:77
277msgid "Tap to return to call..."
269msgid "Tap to return to call..."
278msgstr "Toque para volver a chamar..."
270msgstr "Toque para volver a chamar..."
@@ -317,49 +309,49 @@ msgstr "Desbloquear a SIM"
317msgid "Roaming"
309msgid "Roaming"
318msgstr "Itinerancia"
310msgstr "Itinerancia"
319
311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321msgid "Enter passphrase"
313msgid "Enter passphrase"
322msgstr "Introduza a frase secreta"
314msgstr "Introduza a frase secreta"
323
315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325msgid "Sorry, incorrect passphrase"
317msgid "Sorry, incorrect passphrase"
326msgstr "Sentímolo a frase é incorrecta"
318msgstr "Sentímolo a frase é incorrecta"
327
319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329msgid "Please re-enter"
321msgid "Please re-enter"
330msgstr "Introducir de novo"
322msgstr "Introducir de novo"
331
323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333msgid "Enter passcode"
325msgid "Enter passcode"
334msgstr "Introduza a clave"
326msgstr "Introduza a clave"
335
327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337msgid "Sorry, incorrect passcode"
329msgid "Sorry, incorrect passcode"
338msgstr "Sentímolo, a clave é incorrecta"
330msgstr "Sentímolo, a clave é incorrecta"
339
331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341#, qt-format
333#, qt-format
342msgid "Enter %1"
334msgid "Enter %1"
343msgstr "Introducir %1"
335msgstr "Introducir %1"
344
336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346#, qt-format
338#, qt-format
347msgid "Sorry, incorrect %1"
339msgid "Sorry, incorrect %1"
348msgstr "Sentímolo, %1 non coincide"
340msgstr "Sentímolo, %1 non coincide"
349
341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351msgid "Sorry, incorrect passphrase."
343msgid "Sorry, incorrect passphrase."
352msgstr "Sentímolo a frase é incorrecta."
344msgstr "Sentímolo a frase é incorrecta."
353
345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355msgid "Sorry, incorrect passcode."
347msgid "Sorry, incorrect passcode."
356msgstr "Sentímolo, a clave é incorrecta."
348msgstr "Sentímolo, a clave é incorrecta."
357
349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359msgid "This will be your last attempt."
351msgid "This will be your last attempt."
360msgstr "Este será o seu último intento."
352msgstr "Este será o seu último intento."
361
353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363msgid ""
355msgid ""
364"If passphrase is entered incorrectly, your phone will conduct a factory "
356"If passphrase is entered incorrectly, your phone will conduct a factory "
365"reset and all personal data will be deleted."
357"reset and all personal data will be deleted."
@@ -367,7 +359,7 @@ msgstr ""
367"Se a frase de paso introducida é incorrecta, o teléfono restabelecerá os "
359"Se a frase de paso introducida é incorrecta, o teléfono restabelecerá os "
368"valores de fábrica e perderá todos os datos persoais."
360"valores de fábrica e perderá todos os datos persoais."
369
361
370−#: qml/Shell.qml:389
362+#: qml/Shell.qml:395
371msgid ""
363msgid ""
372"If passcode is entered incorrectly, your phone will conduct a factory reset "
364"If passcode is entered incorrectly, your phone will conduct a factory reset "
373"and all personal data will be deleted."
365"and all personal data will be deleted."
@@ -375,28 +367,8 @@ msgstr ""
375"Se a clave introducida é incorrecta, o teléfono restabelecerá os valores de "
367"Se a clave introducida é incorrecta, o teléfono restabelecerá os valores de "
376"fábrica e perderá todos os datos persoais."
368"fábrica e perderá todos os datos persoais."
377
369
378−#, qt-format
370+#~ msgid "Sorry, incorrect PIN"
379−#~ msgid "Hello %1"
371+#~ msgstr "Sentímolo, o PIN é incorrecto"
380−#~ msgstr "Ola %1"
381−
382−#~ msgid "Hello"
383−#~ msgstr "Ola"
384−
385−#~ msgid "Swipe to unlock"
386−#~ msgstr "Esvare o dedo para desbloquear"
387−
388−#~ msgid "Please wait"
389−#~ msgstr "Agarde"
390−
391−#~ msgid "Too many incorrect attempts"
392−#~ msgstr "Demasiados erros"
393−
394−#, qt-format
395−#~ msgid "Enter your %1"
396−#~ msgstr "Introducir %1"
397−
398−#~ msgid "Enter your passcode"
399−#~ msgstr "Introduza a clave"
400
372
401−#~ msgid "Enter your passphrase"
373+#~ msgid "Enter SIM PIN"
402−#~ msgstr "Introduza a frase secreta"
374+#~ msgstr "Introduza o PIN da SIM"
po/he.po+20−47
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-08-23 14:19+0000\n"
11"PO-Revision-Date: 2014-08-23 14:19+0000\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
13"Language-Team: Hebrew <he@li.org>\n"
13"Language-Team: Hebrew <he@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -154,23 +154,23 @@ msgstr ""
154"ברגעים אלו סיימת את התמחותך בשימוש במחוות קצה והטלפון פתוח לשימושך<br><br>נא "
154"ברגעים אלו סיימת את התמחותך בשימוש במחוות קצה והטלפון פתוח לשימושך<br><br>נא "
155"לגעת במסך כדי להתחיל"
155"לגעת במסך כדי להתחיל"
156
156
157−#: qml/Components/Lockscreen.qml:218
157+#: qml/Components/Lockscreen.qml:220
158msgid "Emergency Call"
158msgid "Emergency Call"
159msgstr "שיחת חירום"
159msgstr "שיחת חירום"
160
160
161−#: qml/Components/Lockscreen.qml:250
161+#: qml/Components/Lockscreen.qml:252
162msgid "OK"
162msgid "OK"
163msgstr "אישור"
163msgstr "אישור"
164
164
165−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
165+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
166msgid "See less"
166msgid "See less"
167msgstr "לראות פחות"
167msgstr "לראות פחות"
168
168
169−#: qml/Dash/GenericScopeView.qml:411
169+#: qml/Dash/GenericScopeView.qml:434
170msgid "See all"
170msgid "See all"
171msgstr "להציג הכול"
171msgstr "להציג הכול"
172
172
173−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
173+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
174#: qml/Panel/SearchIndicator.qml:27
174#: qml/Panel/SearchIndicator.qml:27
175msgid "Search"
175msgid "Search"
176msgstr "חיפוש"
176msgstr "חיפוש"
@@ -259,18 +259,10 @@ msgstr "יש לדבר כעת..."
259msgid "Speaking..."
259msgid "Speaking..."
260msgstr "הדיבור מושמע…"
260msgstr "הדיבור מושמע…"
261
261
262−#: qml/Notifications/NotificationMenuItemFactory.qml:108
262+#: qml/Notifications/NotificationMenuItemFactory.qml:116
263msgid "Show password"
263msgid "Show password"
264msgstr "הצגת הססמה"
264msgstr "הצגת הססמה"
265
265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:124
267−msgid "Enter SIM PIN"
268−msgstr ""
269−
270−#: qml/Notifications/NotificationMenuItemFactory.qml:125
271−msgid "Sorry, incorrect PIN"
272−msgstr ""
273−
274#: qml/Panel/ActiveCallHint.qml:77
266#: qml/Panel/ActiveCallHint.qml:77
275msgid "Tap to return to call..."
267msgid "Tap to return to call..."
276msgstr "יש לגעת כדי להחזיר שיחה…"
268msgstr "יש לגעת כדי להחזיר שיחה…"
@@ -315,75 +307,56 @@ msgstr ""
315msgid "Roaming"
307msgid "Roaming"
316msgstr "נדידה"
308msgstr "נדידה"
317
309
318−#: qml/Shell.qml:340
310+#: qml/Shell.qml:346
319msgid "Enter passphrase"
311msgid "Enter passphrase"
320msgstr ""
312msgstr ""
321
313
322−#: qml/Shell.qml:341
314+#: qml/Shell.qml:347
323msgid "Sorry, incorrect passphrase"
315msgid "Sorry, incorrect passphrase"
324msgstr "מילת הצופן שגויה, עמך הסליחה."
316msgstr "מילת הצופן שגויה, עמך הסליחה."
325
317
326−#: qml/Shell.qml:342
318+#: qml/Shell.qml:348
327msgid "Please re-enter"
319msgid "Please re-enter"
328msgstr ""
320msgstr ""
329
321
330−#: qml/Shell.qml:344
322+#: qml/Shell.qml:350
331msgid "Enter passcode"
323msgid "Enter passcode"
332msgstr ""
324msgstr ""
333
325
334−#: qml/Shell.qml:345
326+#: qml/Shell.qml:351
335msgid "Sorry, incorrect passcode"
327msgid "Sorry, incorrect passcode"
336msgstr ""
328msgstr ""
337
329
338−#: qml/Shell.qml:348
330+#: qml/Shell.qml:354
339#, qt-format
331#, qt-format
340msgid "Enter %1"
332msgid "Enter %1"
341msgstr ""
333msgstr ""
342
334
343−#: qml/Shell.qml:349
335+#: qml/Shell.qml:355
344#, qt-format
336#, qt-format
345msgid "Sorry, incorrect %1"
337msgid "Sorry, incorrect %1"
346msgstr ""
338msgstr ""
347
339
348−#: qml/Shell.qml:384
340+#: qml/Shell.qml:390
349msgid "Sorry, incorrect passphrase."
341msgid "Sorry, incorrect passphrase."
350msgstr "מילת הצופן שגויה, עמך הסליחה."
342msgstr "מילת הצופן שגויה, עמך הסליחה."
351
343
352−#: qml/Shell.qml:385
344+#: qml/Shell.qml:391
353msgid "Sorry, incorrect passcode."
345msgid "Sorry, incorrect passcode."
354msgstr "הצופן שגוי, עם הסליחה."
346msgstr "הצופן שגוי, עם הסליחה."
355
347
356−#: qml/Shell.qml:386
348+#: qml/Shell.qml:392
357msgid "This will be your last attempt."
349msgid "This will be your last attempt."
358msgstr "זה יהיה הניסיון האחרון שלך."
350msgstr "זה יהיה הניסיון האחרון שלך."
359
351
360−#: qml/Shell.qml:388
352+#: qml/Shell.qml:394
361msgid ""
353msgid ""
362"If passphrase is entered incorrectly, your phone will conduct a factory "
354"If passphrase is entered incorrectly, your phone will conduct a factory "
363"reset and all personal data will be deleted."
355"reset and all personal data will be deleted."
364msgstr ""
356msgstr ""
365
357
366−#: qml/Shell.qml:389
358+#: qml/Shell.qml:395
367msgid ""
359msgid ""
368"If passcode is entered incorrectly, your phone will conduct a factory reset "
360"If passcode is entered incorrectly, your phone will conduct a factory reset "
369"and all personal data will be deleted."
361"and all personal data will be deleted."
370msgstr ""
362msgstr ""
371−
372−#, qt-format
373−#~ msgid "Hello %1"
374−#~ msgstr "שלום %1"
375−
376−#~ msgid "Hello"
377−#~ msgstr "שלום"
378−
379−#~ msgid "Swipe to unlock"
380−#~ msgstr "יש להחליק לפתיחה"
381−
382−#~ msgid "Please wait"
383−#~ msgstr "נא להמתין"
384−
385−#~ msgid "Enter your passphrase"
386−#~ msgstr "נא להזין את מילת הצופן שלך"
387−
388−#~ msgid "Too many incorrect attempts"
389−#~ msgstr "יותר מדי ניסיונות שגויים"
po/hi.po+20−31
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
12"Last-Translator: Siddhanathan S. <Unknown>\n"
12"Last-Translator: Siddhanathan S. <Unknown>\n"
13"Language-Team: Hindi <hi@li.org>\n"
13"Language-Team: Hindi <hi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "आपातकालीन कॉल"
157msgstr "आपातकालीन कॉल"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "खोजें"
174msgstr "खोजें"
@@ -257,18 +257,10 @@ msgstr "अब बात करें"
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "अब बोल रहे हैं"
258msgstr "अब बोल रहे हैं"
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,59 +305,56 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369−
370−#~ msgid "Hello"
371−#~ msgstr "नमस्ते"
po/hr.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Croatian <hr@li.org>\n"
13"Language-Team: Croatian <hr@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153"phone<br><br>Tap on the screen to start"
153"phone<br><br>Tap on the screen to start"
154msgstr ""
154msgstr ""
155
155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157msgid "Emergency Call"
157msgid "Emergency Call"
158msgstr ""
158msgstr ""
159
159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161msgid "OK"
161msgid "OK"
162msgstr ""
162msgstr ""
163
163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165msgid "See less"
165msgid "See less"
166msgstr ""
166msgstr ""
167
167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169msgid "See all"
169msgid "See all"
170msgstr ""
170msgstr ""
171
171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173#: qml/Panel/SearchIndicator.qml:27
173#: qml/Panel/SearchIndicator.qml:27
174msgid "Search"
174msgid "Search"
175msgstr "Pretraživanje"
175msgstr "Pretraživanje"
@@ -258,18 +258,10 @@ msgstr "Recite..."
258msgid "Speaking..."
258msgid "Speaking..."
259msgstr "Govor..."
259msgstr "Govor..."
260
260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262msgid "Show password"
262msgid "Show password"
263msgstr ""
263msgstr ""
264
264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr ""
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr ""
272−
273#: qml/Panel/ActiveCallHint.qml:77
265#: qml/Panel/ActiveCallHint.qml:77
274msgid "Tap to return to call..."
266msgid "Tap to return to call..."
275msgstr ""
267msgstr ""
@@ -314,55 +306,55 @@ msgstr ""
314msgid "Roaming"
306msgid "Roaming"
315msgstr ""
307msgstr ""
316
308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318msgid "Enter passphrase"
310msgid "Enter passphrase"
319msgstr ""
311msgstr ""
320
312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322msgid "Sorry, incorrect passphrase"
314msgid "Sorry, incorrect passphrase"
323msgstr ""
315msgstr ""
324
316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326msgid "Please re-enter"
318msgid "Please re-enter"
327msgstr ""
319msgstr ""
328
320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330msgid "Enter passcode"
322msgid "Enter passcode"
331msgstr ""
323msgstr ""
332
324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334msgid "Sorry, incorrect passcode"
326msgid "Sorry, incorrect passcode"
335msgstr ""
327msgstr ""
336
328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338#, qt-format
330#, qt-format
339msgid "Enter %1"
331msgid "Enter %1"
340msgstr ""
332msgstr ""
341
333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343#, qt-format
335#, qt-format
344msgid "Sorry, incorrect %1"
336msgid "Sorry, incorrect %1"
345msgstr ""
337msgstr ""
346
338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348msgid "Sorry, incorrect passphrase."
340msgid "Sorry, incorrect passphrase."
349msgstr ""
341msgstr ""
350
342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352msgid "Sorry, incorrect passcode."
344msgid "Sorry, incorrect passcode."
353msgstr ""
345msgstr ""
354
346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356msgid "This will be your last attempt."
348msgid "This will be your last attempt."
357msgstr ""
349msgstr ""
358
350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360msgid ""
352msgid ""
361"If passphrase is entered incorrectly, your phone will conduct a factory "
353"If passphrase is entered incorrectly, your phone will conduct a factory "
362"reset and all personal data will be deleted."
354"reset and all personal data will be deleted."
363msgstr ""
355msgstr ""
364
356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366msgid ""
358msgid ""
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368"and all personal data will be deleted."
360"and all personal data will be deleted."
po/hu.po+24−58
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2014-10-03 10:57+0000\n"
11+"PO-Revision-Date: 2014-10-11 10:50+0000\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-12 06:55+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158"Elsajátította a gesztusokat, és megkezdheti a telefon "
158"Elsajátította a gesztusokat, és megkezdheti a telefon "
159"használatát.<br><br>Koppintson a képernyőre a kezdéshez."
159"használatát.<br><br>Koppintson a képernyőre a kezdéshez."
160
160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162msgid "Emergency Call"
162msgid "Emergency Call"
163msgstr "Vészhívás"
163msgstr "Vészhívás"
164
164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166msgid "OK"
166msgid "OK"
167msgstr "Ok"
167msgstr "Ok"
168
168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170msgid "See less"
170msgid "See less"
171msgstr "Kevesebb"
171msgstr "Kevesebb"
172
172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174msgid "See all"
174msgid "See all"
175msgstr "Összes megtekintése"
175msgstr "Összes megtekintése"
176
176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178#: qml/Panel/SearchIndicator.qml:27
178#: qml/Panel/SearchIndicator.qml:27
179msgid "Search"
179msgid "Search"
180msgstr "Keresés"
180msgstr "Keresés"
@@ -213,11 +213,11 @@ msgstr "Küldés"
213
213
214#: qml/Dash/PullToRefreshScopeStyle.qml:55
214#: qml/Dash/PullToRefreshScopeStyle.qml:55
215msgid "Pull to refresh…"
215msgid "Pull to refresh…"
216−msgstr ""
216+msgstr "Húzza a frissítéshez…"
217
217
218#: qml/Dash/PullToRefreshScopeStyle.qml:60
218#: qml/Dash/PullToRefreshScopeStyle.qml:60
219msgid "Release to refresh…"
219msgid "Release to refresh…"
220−msgstr ""
220+msgstr "Engedje el a frissítéshez…"
221
221
222#: qml/Dash/ScopesOverview.qml:206
222#: qml/Dash/ScopesOverview.qml:206
223msgid "Manage Scopes"
223msgid "Manage Scopes"
@@ -263,18 +263,10 @@ msgstr "Most beszéljen…"
263msgid "Speaking..."
263msgid "Speaking..."
264msgstr "Beszéd…"
264msgstr "Beszéd…"
265
265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267msgid "Show password"
267msgid "Show password"
268msgstr "Jelszó megjelenítése"
268msgstr "Jelszó megjelenítése"
269
269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Adja meg a SIM PIN kódját"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "Sajnáljuk, helytelen PIN"
277−
278#: qml/Panel/ActiveCallHint.qml:77
270#: qml/Panel/ActiveCallHint.qml:77
279msgid "Tap to return to call..."
271msgid "Tap to return to call..."
280msgstr "Érintse meg, hogy visszatérjen a híváshoz..."
272msgstr "Érintse meg, hogy visszatérjen a híváshoz..."
@@ -319,49 +311,49 @@ msgstr "SIM feloldása"
319msgid "Roaming"
311msgid "Roaming"
320msgstr "Barangolás"
312msgstr "Barangolás"
321
313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323msgid "Enter passphrase"
315msgid "Enter passphrase"
324msgstr "Jelmondat megadása"
316msgstr "Jelmondat megadása"
325
317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327msgid "Sorry, incorrect passphrase"
319msgid "Sorry, incorrect passphrase"
328msgstr "Sajnáljuk, helytelen jelmondat"
320msgstr "Sajnáljuk, helytelen jelmondat"
329
321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331msgid "Please re-enter"
323msgid "Please re-enter"
332−msgstr "Kérjük adja meg újra"
324+msgstr "Kérjük próbálja újra"
333
325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335msgid "Enter passcode"
327msgid "Enter passcode"
336msgstr "Jelkód megadása"
328msgstr "Jelkód megadása"
337
329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339msgid "Sorry, incorrect passcode"
331msgid "Sorry, incorrect passcode"
340msgstr "Sajnáljuk, helytelen jelkód"
332msgstr "Sajnáljuk, helytelen jelkód"
341
333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343#, qt-format
335#, qt-format
344msgid "Enter %1"
336msgid "Enter %1"
345msgstr "Adja meg: %1"
337msgstr "Adja meg: %1"
346
338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348#, qt-format
340#, qt-format
349msgid "Sorry, incorrect %1"
341msgid "Sorry, incorrect %1"
350msgstr "Sajnáljuk, helytelen %1"
342msgstr "Sajnáljuk, helytelen %1"
351
343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353msgid "Sorry, incorrect passphrase."
345msgid "Sorry, incorrect passphrase."
354msgstr "Sajnáljuk, helytelen jelmondat."
346msgstr "Sajnáljuk, helytelen jelmondat."
355
347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357msgid "Sorry, incorrect passcode."
349msgid "Sorry, incorrect passcode."
358msgstr "Sajnáljuk, helytelen jelkód."
350msgstr "Sajnáljuk, helytelen jelkód."
359
351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361msgid "This will be your last attempt."
353msgid "This will be your last attempt."
362msgstr "Ez az utolsó próbálkozási lehetősége."
354msgstr "Ez az utolsó próbálkozási lehetősége."
363
355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365msgid ""
357msgid ""
366"If passphrase is entered incorrectly, your phone will conduct a factory "
358"If passphrase is entered incorrectly, your phone will conduct a factory "
367"reset and all personal data will be deleted."
359"reset and all personal data will be deleted."
@@ -369,36 +361,10 @@ msgstr ""
369"Ha helytelen jelmondatot ad meg, a telefonja visszaállítja a gyári "
361"Ha helytelen jelmondatot ad meg, a telefonja visszaállítja a gyári "
370"beállításokat és törli minden személyes adatát."
362"beállításokat és törli minden személyes adatát."
371
363
372−#: qml/Shell.qml:389
364+#: qml/Shell.qml:395
373msgid ""
365msgid ""
374"If passcode is entered incorrectly, your phone will conduct a factory reset "
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
375"and all personal data will be deleted."
367"and all personal data will be deleted."
376msgstr ""
368msgstr ""
377"Ha helytelen jelkódot ad meg, a telefonja visszaállítja a gyári "
369"Ha helytelen jelkódot ad meg, a telefonja visszaállítja a gyári "
378"beállításokat és törli minden személyes adatát."
370"beállításokat és törli minden személyes adatát."
379−
380−#, qt-format
381−#~ msgid "Hello %1"
382−#~ msgstr "Üdv %1"
383−
384−#~ msgid "Swipe to unlock"
385−#~ msgstr "Csúsztasson a feloldáshoz"
386−
387−#~ msgid "Hello"
388−#~ msgstr "Üdvözöljük"
389−
390−#~ msgid "Please wait"
391−#~ msgstr "Kérem várjon"
392−
393−#~ msgid "Too many incorrect attempts"
394−#~ msgstr "Túl sok sikertelen kísérlet"
395−
396−#~ msgid "Enter your passphrase"
397−#~ msgstr "Adja meg a jelmondatot"
398−
399−#, qt-format
400−#~ msgid "Enter your %1"
401−#~ msgstr "Kérjük adja meg: %1"
402−
403−#~ msgid "Enter your passcode"
404−#~ msgstr "Adja meg a jelkódját"
po/hy.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
13"Language-Team: Armenian <hy@li.org>\n"
13"Language-Team: Armenian <hy@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "Որոնում"
174msgstr "Որոնում"
@@ -257,18 +257,10 @@ msgstr "Խոսի՛ր"
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "Խոսում եմ..."
258msgstr "Խոսում եմ..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/id.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Indonesian <id@li.org>\n"
13"Language-Team: Indonesian <id@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr ""
174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr ""
258msgstr ""
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/is.po+32−60
@@ -9,15 +9,15 @@ msgid ""
9msgstr ""
9msgstr ""
10"Project-Id-Version: po_unity8-is\n"
10"Project-Id-Version: po_unity8-is\n"
11"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
12−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
12+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
13−"PO-Revision-Date: 2014-10-05 08:44+0000\n"
13+"PO-Revision-Date: 2014-10-09 10:49+0000\n"
14"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
14"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
15"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
15"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
16"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
20+"X-Launchpad-Export-Date: 2014-10-10 05:23+0000\n"
21"X-Generator: Launchpad (build 17196)\n"
21"X-Generator: Launchpad (build 17196)\n"
22"Language: is\n"
22"Language: is\n"
23
23
@@ -36,7 +36,7 @@ msgstr "Losa flýtilykil"
36
36
37#: qml/Components/DelayedLockscreen.qml:47
37#: qml/Components/DelayedLockscreen.qml:47
38msgid "Device Locked"
38msgid "Device Locked"
39−msgstr ""
39+msgstr "Tæki læst"
40
40
41#: qml/Components/DelayedLockscreen.qml:62
41#: qml/Components/DelayedLockscreen.qml:62
42msgid "You have been locked out due to too many failed passphrase attempts."
42msgid "You have been locked out due to too many failed passphrase attempts."
@@ -50,8 +50,8 @@ msgstr ""
50#, qt-format
50#, qt-format
51msgid "Please wait %1 minute and then try again…"
51msgid "Please wait %1 minute and then try again…"
52msgid_plural "Please wait %1 minutes and then try again…"
52msgid_plural "Please wait %1 minutes and then try again…"
53−msgstr[0] ""
53+msgstr[0] "Bíddu í %1 mínútu og reyndu svo aftur"
54−msgstr[1] ""
54+msgstr[1] "Bíddu í %1 mínútur og reyndu svo aftur"
55
55
56#: qml/Components/Dialogs.qml:70
56#: qml/Components/Dialogs.qml:70
57msgid "Log out"
57msgid "Log out"
@@ -160,23 +160,23 @@ msgstr ""
160"Þú ert núna með æfingu í að nota skjáhreyfingar og getur því farið að nota "
160"Þú ert núna með æfingu í að nota skjáhreyfingar og getur því farið að nota "
161"símann<br><br>Sláðu létt á skjáinn til að byrja"
161"símann<br><br>Sláðu létt á skjáinn til að byrja"
162
162
163−#: qml/Components/Lockscreen.qml:218
163+#: qml/Components/Lockscreen.qml:220
164msgid "Emergency Call"
164msgid "Emergency Call"
165msgstr "Neyðarsímtal"
165msgstr "Neyðarsímtal"
166
166
167−#: qml/Components/Lockscreen.qml:250
167+#: qml/Components/Lockscreen.qml:252
168msgid "OK"
168msgid "OK"
169msgstr "Í lagi"
169msgstr "Í lagi"
170
170
171−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
171+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
172msgid "See less"
172msgid "See less"
173msgstr "Sjá minna"
173msgstr "Sjá minna"
174
174
175−#: qml/Dash/GenericScopeView.qml:411
175+#: qml/Dash/GenericScopeView.qml:434
176msgid "See all"
176msgid "See all"
177msgstr "Sjá allt"
177msgstr "Sjá allt"
178
178
179−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
179+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
180#: qml/Panel/SearchIndicator.qml:27
180#: qml/Panel/SearchIndicator.qml:27
181msgid "Search"
181msgid "Search"
182msgstr "Leita"
182msgstr "Leita"
@@ -219,7 +219,7 @@ msgstr ""
219
219
220#: qml/Dash/PullToRefreshScopeStyle.qml:60
220#: qml/Dash/PullToRefreshScopeStyle.qml:60
221msgid "Release to refresh…"
221msgid "Release to refresh…"
222−msgstr ""
222+msgstr "Slepptu til að endurlesa..."
223
223
224#: qml/Dash/ScopesOverview.qml:206
224#: qml/Dash/ScopesOverview.qml:206
225msgid "Manage Scopes"
225msgid "Manage Scopes"
@@ -243,7 +243,7 @@ msgstr "Allt"
243
243
244#: qml/Greeter/Greeter.qml:157
244#: qml/Greeter/Greeter.qml:157
245msgid "Unlock"
245msgid "Unlock"
246−msgstr ""
246+msgstr "Aflæsa"
247
247
248#: qml/Hud/HudParametrizedActionsPage.qml:139
248#: qml/Hud/HudParametrizedActionsPage.qml:139
249msgid "Confirm"
249msgid "Confirm"
@@ -265,18 +265,10 @@ msgstr "Tala núna..."
265msgid "Speaking..."
265msgid "Speaking..."
266msgstr "Tala..."
266msgstr "Tala..."
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:108
268+#: qml/Notifications/NotificationMenuItemFactory.qml:116
269msgid "Show password"
269msgid "Show password"
270msgstr "Birta lykilorð"
270msgstr "Birta lykilorð"
271
271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:124
273−msgid "Enter SIM PIN"
274−msgstr "Settu inn PIN-númer SIM-kortsins"
275−
276−#: qml/Notifications/NotificationMenuItemFactory.qml:125
277−msgid "Sorry, incorrect PIN"
278−msgstr "Því miður, rangt PIN-númer"
279−
280#: qml/Panel/ActiveCallHint.qml:77
272#: qml/Panel/ActiveCallHint.qml:77
281msgid "Tap to return to call..."
273msgid "Tap to return to call..."
282msgstr "Slá til að svara símtali..."
274msgstr "Slá til að svara símtali..."
@@ -321,49 +313,49 @@ msgstr "Aflæsa SIM-korti"
321msgid "Roaming"
313msgid "Roaming"
322msgstr "Ráphamur"
314msgstr "Ráphamur"
323
315
324−#: qml/Shell.qml:340
316+#: qml/Shell.qml:346
325msgid "Enter passphrase"
317msgid "Enter passphrase"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:341
320+#: qml/Shell.qml:347
329msgid "Sorry, incorrect passphrase"
321msgid "Sorry, incorrect passphrase"
330msgstr "Því miður, rangt lykilorð"
322msgstr "Því miður, rangt lykilorð"
331
323
332−#: qml/Shell.qml:342
324+#: qml/Shell.qml:348
333msgid "Please re-enter"
325msgid "Please re-enter"
334−msgstr ""
326+msgstr "Settu aftur inn"
335
327
336−#: qml/Shell.qml:344
328+#: qml/Shell.qml:350
337msgid "Enter passcode"
329msgid "Enter passcode"
338msgstr ""
330msgstr ""
339
331
340−#: qml/Shell.qml:345
332+#: qml/Shell.qml:351
341msgid "Sorry, incorrect passcode"
333msgid "Sorry, incorrect passcode"
342msgstr "Því miður, rangur aðgangskóði"
334msgstr "Því miður, rangur aðgangskóði"
343
335
344−#: qml/Shell.qml:348
336+#: qml/Shell.qml:354
345#, qt-format
337#, qt-format
346msgid "Enter %1"
338msgid "Enter %1"
347−msgstr ""
339+msgstr "Settu inn %1"
348
340
349−#: qml/Shell.qml:349
341+#: qml/Shell.qml:355
350#, qt-format
342#, qt-format
351msgid "Sorry, incorrect %1"
343msgid "Sorry, incorrect %1"
352msgstr "Því miður, rangt %1"
344msgstr "Því miður, rangt %1"
353
345
354−#: qml/Shell.qml:384
346+#: qml/Shell.qml:390
355msgid "Sorry, incorrect passphrase."
347msgid "Sorry, incorrect passphrase."
356msgstr "Því miður, rangt lykilorð."
348msgstr "Því miður, rangt lykilorð."
357
349
358−#: qml/Shell.qml:385
350+#: qml/Shell.qml:391
359msgid "Sorry, incorrect passcode."
351msgid "Sorry, incorrect passcode."
360msgstr "Því miður, rangur aðgangskóði."
352msgstr "Því miður, rangur aðgangskóði."
361
353
362−#: qml/Shell.qml:386
354+#: qml/Shell.qml:392
363msgid "This will be your last attempt."
355msgid "This will be your last attempt."
364msgstr "Þetta mun verða síðasta tilraunin þín."
356msgstr "Þetta mun verða síðasta tilraunin þín."
365
357
366−#: qml/Shell.qml:388
358+#: qml/Shell.qml:394
367msgid ""
359msgid ""
368"If passphrase is entered incorrectly, your phone will conduct a factory "
360"If passphrase is entered incorrectly, your phone will conduct a factory "
369"reset and all personal data will be deleted."
361"reset and all personal data will be deleted."
@@ -371,7 +363,7 @@ msgstr ""
371"Ef lykilorð er rangt, mun síminn frumstilla allt á verksmiðjustillingar og "
363"Ef lykilorð er rangt, mun síminn frumstilla allt á verksmiðjustillingar og "
372"öllum einkagögnum verður eytt."
364"öllum einkagögnum verður eytt."
373
365
374−#: qml/Shell.qml:389
366+#: qml/Shell.qml:395
375msgid ""
367msgid ""
376"If passcode is entered incorrectly, your phone will conduct a factory reset "
368"If passcode is entered incorrectly, your phone will conduct a factory reset "
377"and all personal data will be deleted."
369"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379"Ef aðgangskóði er rangur, mun síminn frumstilla allt á verksmiðjustillingar "
371"Ef aðgangskóði er rangur, mun síminn frumstilla allt á verksmiðjustillingar "
380"og öllum einkagögnum verður eytt."
372"og öllum einkagögnum verður eytt."
381
373
382−#, qt-format
374+#~ msgid "Sorry, incorrect PIN"
383−#~ msgid "Hello %1"
375+#~ msgstr "Því miður, rangt PIN-númer"
384−#~ msgstr "Hæ %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "Hæ"
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "Strjúka til að aflæsa"
391−
392−#~ msgid "Please wait"
393−#~ msgstr "Bíddu aðeins"
394
376
395−#~ msgid "Too many incorrect attempts"
377+#~ msgid "Enter SIM PIN"
396−#~ msgstr "Of margar rangar tilraunir"
397−
398−#~ msgid "Enter your passphrase"
399−#~ msgstr "Sláðu inn lykilorðið þitt"
400−
401−#~ msgid "Enter your passcode"
402−#~ msgstr "Settu inn aðgangskóðann þinn"
378+#~ msgstr "Settu inn PIN-númer SIM-kortsins"
403−
404−#, qt-format
405−#~ msgid "Enter your %1"
406−#~ msgstr "Settu inn %1"
po/it.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-30 10:56+0000\n"
11"PO-Revision-Date: 2014-09-30 10:56+0000\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -161,23 +161,23 @@ msgstr ""
161"L'apprendimento dei gesti è stato completato. È ora possibile iniziare a "
161"L'apprendimento dei gesti è stato completato. È ora possibile iniziare a "
162"usare il telefono.<br><br>Toccare lo schermo per iniziare"
162"usare il telefono.<br><br>Toccare lo schermo per iniziare"
163
163
164−#: qml/Components/Lockscreen.qml:218
164+#: qml/Components/Lockscreen.qml:220
165msgid "Emergency Call"
165msgid "Emergency Call"
166msgstr "Chiamata di emergenza"
166msgstr "Chiamata di emergenza"
167
167
168−#: qml/Components/Lockscreen.qml:250
168+#: qml/Components/Lockscreen.qml:252
169msgid "OK"
169msgid "OK"
170msgstr "OK"
170msgstr "OK"
171
171
172−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
172+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
173msgid "See less"
173msgid "See less"
174msgstr "Mostra meno"
174msgstr "Mostra meno"
175
175
176−#: qml/Dash/GenericScopeView.qml:411
176+#: qml/Dash/GenericScopeView.qml:434
177msgid "See all"
177msgid "See all"
178msgstr "Mostra tutto"
178msgstr "Mostra tutto"
179
179
180−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
180+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
181#: qml/Panel/SearchIndicator.qml:27
181#: qml/Panel/SearchIndicator.qml:27
182msgid "Search"
182msgid "Search"
183msgstr "Cerca"
183msgstr "Cerca"
@@ -266,18 +266,10 @@ msgstr "Parla ora..."
266msgid "Speaking..."
266msgid "Speaking..."
267msgstr "Sto parlando..."
267msgstr "Sto parlando..."
268
268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:108
269+#: qml/Notifications/NotificationMenuItemFactory.qml:116
270msgid "Show password"
270msgid "Show password"
271msgstr "Mostra password"
271msgstr "Mostra password"
272
272
273−#: qml/Notifications/NotificationMenuItemFactory.qml:124
274−msgid "Enter SIM PIN"
275−msgstr "Inserire il PIN della SIM"
276−
277−#: qml/Notifications/NotificationMenuItemFactory.qml:125
278−msgid "Sorry, incorrect PIN"
279−msgstr "PIN errato"
280−
281#: qml/Panel/ActiveCallHint.qml:77
273#: qml/Panel/ActiveCallHint.qml:77
282msgid "Tap to return to call..."
274msgid "Tap to return to call..."
283msgstr "Tocca per tornare alla chiamata..."
275msgstr "Tocca per tornare alla chiamata..."
@@ -322,49 +314,49 @@ msgstr "Sblocca SIM"
322msgid "Roaming"
314msgid "Roaming"
323msgstr "Roaming"
315msgstr "Roaming"
324
316
325−#: qml/Shell.qml:340
317+#: qml/Shell.qml:346
326msgid "Enter passphrase"
318msgid "Enter passphrase"
327msgstr ""
319msgstr ""
328
320
329−#: qml/Shell.qml:341
321+#: qml/Shell.qml:347
330msgid "Sorry, incorrect passphrase"
322msgid "Sorry, incorrect passphrase"
331msgstr "Passphrase errata"
323msgstr "Passphrase errata"
332
324
333−#: qml/Shell.qml:342
325+#: qml/Shell.qml:348
334msgid "Please re-enter"
326msgid "Please re-enter"
335msgstr ""
327msgstr ""
336
328
337−#: qml/Shell.qml:344
329+#: qml/Shell.qml:350
338msgid "Enter passcode"
330msgid "Enter passcode"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:345
333+#: qml/Shell.qml:351
342msgid "Sorry, incorrect passcode"
334msgid "Sorry, incorrect passcode"
343msgstr "Passcode non corretto"
335msgstr "Passcode non corretto"
344
336
345−#: qml/Shell.qml:348
337+#: qml/Shell.qml:354
346#, qt-format
338#, qt-format
347msgid "Enter %1"
339msgid "Enter %1"
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:349
342+#: qml/Shell.qml:355
351#, qt-format
343#, qt-format
352msgid "Sorry, incorrect %1"
344msgid "Sorry, incorrect %1"
353msgstr "%1 non corretto"
345msgstr "%1 non corretto"
354
346
355−#: qml/Shell.qml:384
347+#: qml/Shell.qml:390
356msgid "Sorry, incorrect passphrase."
348msgid "Sorry, incorrect passphrase."
357msgstr "Passphrase non corretta"
349msgstr "Passphrase non corretta"
358
350
359−#: qml/Shell.qml:385
351+#: qml/Shell.qml:391
360msgid "Sorry, incorrect passcode."
352msgid "Sorry, incorrect passcode."
361msgstr "Passcode non corretto"
353msgstr "Passcode non corretto"
362
354
363−#: qml/Shell.qml:386
355+#: qml/Shell.qml:392
364msgid "This will be your last attempt."
356msgid "This will be your last attempt."
365msgstr "Questo sarà l'ultimo tentativo."
357msgstr "Questo sarà l'ultimo tentativo."
366
358
367−#: qml/Shell.qml:388
359+#: qml/Shell.qml:394
368msgid ""
360msgid ""
369"If passphrase is entered incorrectly, your phone will conduct a factory "
361"If passphrase is entered incorrectly, your phone will conduct a factory "
370"reset and all personal data will be deleted."
362"reset and all personal data will be deleted."
@@ -372,7 +364,7 @@ msgstr ""
372"Se verrà inserita una passphrase errata, il telefono eseguirà un ripristino "
364"Se verrà inserita una passphrase errata, il telefono eseguirà un ripristino "
373"delle impostazioni di fabbrica e tutti i dati personali verranno eliminati."
365"delle impostazioni di fabbrica e tutti i dati personali verranno eliminati."
374
366
375−#: qml/Shell.qml:389
367+#: qml/Shell.qml:395
376msgid ""
368msgid ""
377"If passcode is entered incorrectly, your phone will conduct a factory reset "
369"If passcode is entered incorrectly, your phone will conduct a factory reset "
378"and all personal data will be deleted."
370"and all personal data will be deleted."
@@ -380,28 +372,8 @@ msgstr ""
380"Se verrà inserito una passcode errato, il telefono eseguirà un ripristino "
372"Se verrà inserito una passcode errato, il telefono eseguirà un ripristino "
381"delle impostazioni di fabbrica e tutti i dati personali verranno eliminati."
373"delle impostazioni di fabbrica e tutti i dati personali verranno eliminati."
382
374
383−#, qt-format
375+#~ msgid "Sorry, incorrect PIN"
384−#~ msgid "Hello %1"
385−#~ msgstr "Ciao %1"
386−
387−#~ msgid "Hello"
388−#~ msgstr "Ciao"
389−
390−#~ msgid "Swipe to unlock"
391−#~ msgstr "Scorrere per sbloccare"
392−
393−#~ msgid "Please wait"
394−#~ msgstr "Attendere"
395−
396−#~ msgid "Too many incorrect attempts"
397−#~ msgstr "Troppi tentativi errati"
398−
399−#, qt-format
400−#~ msgid "Enter your %1"
401−#~ msgstr "Inserire %1"
376+#~ msgstr "PIN errato"
402−
403−#~ msgid "Enter your passphrase"
404−#~ msgstr "Digitare la passphrase"
405
377
406−#~ msgid "Enter your passcode"
378+#~ msgid "Enter SIM PIN"
407−#~ msgstr "Inserire il passcode"
379+#~ msgstr "Inserire il PIN della SIM"
po/ja.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-18 09:47+0000\n"
11"PO-Revision-Date: 2014-09-18 09:47+0000\n"
12"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
12"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
13"Language-Team: Japanese <ja@li.org>\n"
13"Language-Team: Japanese <ja@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153msgstr ""
153msgstr ""
154"これでスマートフォンの操作に必要な、画面端を用いたジェスチャーを習得できました。<br><br>利用を開始するなら画面をタップしてください"
154"これでスマートフォンの操作に必要な、画面端を用いたジェスチャーを習得できました。<br><br>利用を開始するなら画面をタップしてください"
155
155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157msgid "Emergency Call"
157msgid "Emergency Call"
158msgstr "緊急通報"
158msgstr "緊急通報"
159
159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161msgid "OK"
161msgid "OK"
162msgstr "OK"
162msgstr "OK"
163
163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165msgid "See less"
165msgid "See less"
166msgstr "隠す"
166msgstr "隠す"
167
167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169msgid "See all"
169msgid "See all"
170msgstr "すべて表示する"
170msgstr "すべて表示する"
171
171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173#: qml/Panel/SearchIndicator.qml:27
173#: qml/Panel/SearchIndicator.qml:27
174msgid "Search"
174msgid "Search"
175msgstr "検索"
175msgstr "検索"
@@ -258,18 +258,10 @@ msgstr "音声入力を開始..."
258msgid "Speaking..."
258msgid "Speaking..."
259msgstr "入力中..."
259msgstr "入力中..."
260
260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262msgid "Show password"
262msgid "Show password"
263msgstr "パスワードを表示"
263msgstr "パスワードを表示"
264
264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr "SIM PINの入力"
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr "PINが違います"
272−
273#: qml/Panel/ActiveCallHint.qml:77
265#: qml/Panel/ActiveCallHint.qml:77
274msgid "Tap to return to call..."
266msgid "Tap to return to call..."
275msgstr "タップすると通話に戻ります..."
267msgstr "タップすると通話に戻ります..."
@@ -314,82 +306,62 @@ msgstr "SIMのアンロック"
314msgid "Roaming"
306msgid "Roaming"
315msgstr "ローミング"
307msgstr "ローミング"
316
308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318msgid "Enter passphrase"
310msgid "Enter passphrase"
319msgstr ""
311msgstr ""
320
312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322msgid "Sorry, incorrect passphrase"
314msgid "Sorry, incorrect passphrase"
323msgstr "パスフレーズが違います"
315msgstr "パスフレーズが違います"
324
316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326msgid "Please re-enter"
318msgid "Please re-enter"
327msgstr ""
319msgstr ""
328
320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330msgid "Enter passcode"
322msgid "Enter passcode"
331msgstr ""
323msgstr ""
332
324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334msgid "Sorry, incorrect passcode"
326msgid "Sorry, incorrect passcode"
335msgstr "パスコードが違います"
327msgstr "パスコードが違います"
336
328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338#, qt-format
330#, qt-format
339msgid "Enter %1"
331msgid "Enter %1"
340msgstr ""
332msgstr ""
341
333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343#, qt-format
335#, qt-format
344msgid "Sorry, incorrect %1"
336msgid "Sorry, incorrect %1"
345msgstr "%1が違います"
337msgstr "%1が違います"
346
338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348msgid "Sorry, incorrect passphrase."
340msgid "Sorry, incorrect passphrase."
349msgstr "パスフレーズが間違っています。"
341msgstr "パスフレーズが間違っています。"
350
342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352msgid "Sorry, incorrect passcode."
344msgid "Sorry, incorrect passcode."
353msgstr "パスコードが間違っています。"
345msgstr "パスコードが間違っています。"
354
346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356msgid "This will be your last attempt."
348msgid "This will be your last attempt."
357msgstr "これが最後のチャンスです。"
349msgstr "これが最後のチャンスです。"
358
350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360msgid ""
352msgid ""
361"If passphrase is entered incorrectly, your phone will conduct a factory "
353"If passphrase is entered incorrectly, your phone will conduct a factory "
362"reset and all personal data will be deleted."
354"reset and all personal data will be deleted."
363msgstr "パスフレーズが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
355msgstr "パスフレーズが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
364
356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366msgid ""
358msgid ""
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368"and all personal data will be deleted."
360"and all personal data will be deleted."
369msgstr "パスコードが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
361msgstr "パスコードが間違っている場合、ファクトリーリセットを実施し、すべての個人データは削除されます。"
370
362
371−#, qt-format
363+#~ msgid "Sorry, incorrect PIN"
372−#~ msgid "Hello %1"
364+#~ msgstr "PINが違います"
373−#~ msgstr "こんにちは %1 さん"
374−
375−#~ msgid "Hello"
376−#~ msgstr "こんにちは"
377−
378−#~ msgid "Swipe to unlock"
379−#~ msgstr "スワイプしてロック解除"
380−
381−#~ msgid "Too many incorrect attempts"
382−#~ msgstr "失敗回数が上限に達しました"
383−
384−#~ msgid "Please wait"
385−#~ msgstr "お待ちください"
386−
387−#, qt-format
388−#~ msgid "Enter your %1"
389−#~ msgstr "%1を入力してください"
390−
391−#~ msgid "Enter your passphrase"
392−#~ msgstr "パスフレーズの入力"
393
365
394−#~ msgid "Enter your passcode"
366+#~ msgid "Enter SIM PIN"
395−#~ msgstr "パスコードの入力"
367+#~ msgstr "SIM PINの入力"
po/km.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-08-20 02:48+0000\n"
11"PO-Revision-Date: 2014-08-20 02:48+0000\n"
12"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
12"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
13"Language-Team: Khmer <km@li.org>\n"
13"Language-Team: Khmer <km@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
158"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
159"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
159"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
160
160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162msgid "Emergency Call"
162msgid "Emergency Call"
163msgstr "ការ​ហៅ​ពេល​អាសន្ន"
163msgstr "ការ​ហៅ​ពេល​អាសន្ន"
164
164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166msgid "OK"
166msgid "OK"
167msgstr "យល់ព្រម"
167msgstr "យល់ព្រម"
168
168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170msgid "See less"
170msgid "See less"
171msgstr "មើល​តិច​ជាង"
171msgstr "មើល​តិច​ជាង"
172
172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174msgid "See all"
174msgid "See all"
175msgstr "មើល​ទាំងអស់"
175msgstr "មើល​ទាំងអស់"
176
176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178#: qml/Panel/SearchIndicator.qml:27
178#: qml/Panel/SearchIndicator.qml:27
179msgid "Search"
179msgid "Search"
180msgstr "ស្វែង​រក"
180msgstr "ស្វែង​រក"
@@ -263,18 +263,10 @@ msgstr "និយាយ​ឥឡូវ..."
263msgid "Speaking..."
263msgid "Speaking..."
264msgstr "កំពុង​និយាយ..."
264msgstr "កំពុង​និយាយ..."
265
265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267msgid "Show password"
267msgid "Show password"
268msgstr "បង្ហាញ​ពាក្យ​សម្ងាត់"
268msgstr "បង្ហាញ​ពាក្យ​សម្ងាត់"
269
269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "បញ្ចូល​លេខ​កូដ PIN ស៊ីម"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "សូមទោស! លេខ​កូដ PIN មិន​ត្រឹមត្រូវ"
277−
278#: qml/Panel/ActiveCallHint.qml:77
270#: qml/Panel/ActiveCallHint.qml:77
279msgid "Tap to return to call..."
271msgid "Tap to return to call..."
280msgstr "ប៉ះ​ដើម្បី​ត្រឡប់​ទៅ​ការ​ហៅ..."
272msgstr "ប៉ះ​ដើម្បី​ត្រឡប់​ទៅ​ការ​ហៅ..."
@@ -319,49 +311,49 @@ msgstr "ដោះ​សោ​ស៊ីម"
319msgid "Roaming"
311msgid "Roaming"
320msgstr "រ៉ូមីង"
312msgstr "រ៉ូមីង"
321
313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323msgid "Enter passphrase"
315msgid "Enter passphrase"
324msgstr ""
316msgstr ""
325
317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327msgid "Sorry, incorrect passphrase"
319msgid "Sorry, incorrect passphrase"
328msgstr "សូមទោស! ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ"
320msgstr "សូមទោស! ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ"
329
321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331msgid "Please re-enter"
323msgid "Please re-enter"
332msgstr ""
324msgstr ""
333
325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335msgid "Enter passcode"
327msgid "Enter passcode"
336msgstr ""
328msgstr ""
337
329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339msgid "Sorry, incorrect passcode"
331msgid "Sorry, incorrect passcode"
340msgstr "សូមទោស! កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ"
332msgstr "សូមទោស! កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ"
341
333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343#, qt-format
335#, qt-format
344msgid "Enter %1"
336msgid "Enter %1"
345msgstr ""
337msgstr ""
346
338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348#, qt-format
340#, qt-format
349msgid "Sorry, incorrect %1"
341msgid "Sorry, incorrect %1"
350msgstr "សូមទោស! %1 មិន​ត្រឹមត្រូវ"
342msgstr "សូមទោស! %1 មិន​ត្រឹមត្រូវ"
351
343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353msgid "Sorry, incorrect passphrase."
345msgid "Sorry, incorrect passphrase."
354msgstr "សូមទោស! ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
346msgstr "សូមទោស! ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
355
347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357msgid "Sorry, incorrect passcode."
349msgid "Sorry, incorrect passcode."
358msgstr "សូមទោស! កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
350msgstr "សូមទោស! កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
359
351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361msgid "This will be your last attempt."
353msgid "This will be your last attempt."
362msgstr "នេះ​គឺ​ការ​ព្យាយាម​លើក​ចុងក្រោយ។"
354msgstr "នេះ​គឺ​ការ​ព្យាយាម​លើក​ចុងក្រោយ។"
363
355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365msgid ""
357msgid ""
366"If passphrase is entered incorrectly, your phone will conduct a factory "
358"If passphrase is entered incorrectly, your phone will conduct a factory "
367"reset and all personal data will be deleted."
359"reset and all personal data will be deleted."
@@ -370,7 +362,7 @@ msgstr ""
370"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
362"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
371"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
363"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
372
364
373−#: qml/Shell.qml:389
365+#: qml/Shell.qml:395
374msgid ""
366msgid ""
375"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
376"and all personal data will be deleted."
368"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
371"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
380"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
372"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
381
373
382−#, qt-format
374+#~ msgid "Sorry, incorrect PIN"
383−#~ msgid "Hello %1"
375+#~ msgstr "សូមទោស! លេខ​កូដ PIN មិន​ត្រឹមត្រូវ"
384−#~ msgstr "សួស្ដី %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "សួស្តី"
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "អូស​ដើម្បី​ដោះសោ"
391−
392−#~ msgid "Please wait"
393−#~ msgstr "សូមរង់ចាំ"
394−
395−#~ msgid "Too many incorrect attempts"
396−#~ msgstr "បាន​ព្យាយាម​ខុស​ច្រើន​ដង​ពេក"
397−
398−#, qt-format
399−#~ msgid "Enter your %1"
400−#~ msgstr "បញ្ចូល %1 របស់​អ្នក"
401−
402−#~ msgid "Enter your passphrase"
403−#~ msgstr "បញ្ចូល​ឃ្លា​សម្ងាត់​របស់​អ្នក"
404
376
405−#~ msgid "Enter your passcode"
377+#~ msgid "Enter SIM PIN"
406−#~ msgstr "បញ្ចូល​កូដ​សម្ងាត់​របស់​អ្នក"
378+#~ msgstr "បញ្ចូល​លេខ​កូដ PIN ស៊ីម"
po/kn.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kannada <kn@li.org>\n"
13"Language-Team: Kannada <kn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "ಹುಡುಕು"
174msgstr "ಹುಡುಕು"
@@ -257,18 +257,10 @@ msgstr "ಈಗ ಮಾತನಾಡಿ ..."
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "ಮಾತನಾಡುತಿದ್ದೀರಿ"
258msgstr "ಮಾತನಾಡುತಿದ್ದೀರಿ"
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/ko.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-08-19 13:02+0000\n"
11"PO-Revision-Date: 2014-08-19 13:02+0000\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
13"Language-Team: Korean <ko@li.org>\n"
13"Language-Team: Korean <ko@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152msgstr ""
152msgstr ""
153"여러분은 가장자리에서 끌어오기 제스쳐를 완벽히 익히셨고 휴대 전화를 사용할 수 있습니다. <br><br> 스크린을 터치해서 시작하세요."
153"여러분은 가장자리에서 끌어오기 제스쳐를 완벽히 익히셨고 휴대 전화를 사용할 수 있습니다. <br><br> 스크린을 터치해서 시작하세요."
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "긴급 통화"
157msgstr "긴급 통화"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr "확인"
161msgstr "확인"
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr "간단히 표시"
165msgstr "간단히 표시"
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr "모두 보기"
169msgstr "모두 보기"
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "검색"
174msgstr "검색"
@@ -257,18 +257,10 @@ msgstr "지금 말하세요..."
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "말하는 중..."
258msgstr "말하는 중..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr "암호 표시"
262msgstr "암호 표시"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr "심 카드의 개인 식별 번호 입력"
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr "죄송합니다. 개인 식별 번호가 올바르지 않습니다."
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr "통화로 돌아가려면 터치하세요..."
266msgstr "통화로 돌아가려면 터치하세요..."
@@ -313,82 +305,62 @@ msgstr "심 카드 잠금 해제"
313msgid "Roaming"
305msgid "Roaming"
314msgstr "로밍"
306msgstr "로밍"
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr "패스프레이즈를 입력해주십시오."
310msgstr "패스프레이즈를 입력해주십시오."
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr "죄송합니다. 패스프레이즈가 올바르지 않습니다."
314msgstr "죄송합니다. 패스프레이즈가 올바르지 않습니다."
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr "다시 입력해주십시오."
318msgstr "다시 입력해주십시오."
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr "패스코드를 입력해주십시오."
322msgstr "패스코드를 입력해주십시오."
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr "죄송합니다. 패스코드가 올바르지 않습니다."
326msgstr "죄송합니다. 패스코드가 올바르지 않습니다."
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr "%1 입력"
331msgstr "%1 입력"
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr "죄송합니다. %1이(가) 올바르지 않습니다."
336msgstr "죄송합니다. %1이(가) 올바르지 않습니다."
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr "올바르지 않은 패스프레이즈입니다."
340msgstr "올바르지 않은 패스프레이즈입니다."
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr "최송합니다. 패스코드가 올바르지 않습니다."
344msgstr "최송합니다. 패스코드가 올바르지 않습니다."
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr "마지막 시도입니다."
348msgstr "마지막 시도입니다."
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr "이번에도 올바르지 않은 패스프레이즈를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
354msgstr "이번에도 올바르지 않은 패스프레이즈를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr "이번에도 올바르지 않은 패스코드를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
360msgstr "이번에도 올바르지 않은 패스코드를 입력하면 휴대 전화를 공장 초기화하여 모든 개인 정보를 삭제합니다."
369
361
370−#, qt-format
362+#~ msgid "Sorry, incorrect PIN"
371−#~ msgid "Hello %1"
363+#~ msgstr "죄송합니다. 개인 식별 번호가 올바르지 않습니다."
372−#~ msgstr "안녕하세요 %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "안녕하세요"
376
364
377−#~ msgid "Please wait"
365+#~ msgid "Enter SIM PIN"
378−#~ msgstr "기다려주십시오"
366+#~ msgstr "심 카드의 개인 식별 번호 입력"
379−
380−#~ msgid "Too many incorrect attempts"
381−#~ msgstr "너무 많이 틀리셨습니다"
382−
383−#~ msgid "Enter your passphrase"
384−#~ msgstr "패스프레이즈를 입력해주십시오."
385−
386−#~ msgid "Enter your passcode"
387−#~ msgstr "패스코드를 입력해주십시오."
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "쓸어서 잠금 해제"
391−
392−#, qt-format
393−#~ msgid "Enter your %1"
394−#~ msgstr "%1을(를) 입력해주십시오."
po/ku.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-10 13:14+0000\n"
11"PO-Revision-Date: 2014-09-10 13:14+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Kurdish <ku@li.org>\n"
13"Language-Team: Kurdish <ku@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgid ""
155msgstr ""
155msgstr ""
156"Tu tevgerên kêlekê fêr bûyî<br><br>Ji bo destpêkirinê ekranê bipelîne"
156"Tu tevgerên kêlekê fêr bûyî<br><br>Ji bo destpêkirinê ekranê bipelîne"
157
157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159msgid "Emergency Call"
159msgid "Emergency Call"
160msgstr "Lêgerîna Lezgîn"
160msgstr "Lêgerîna Lezgîn"
161
161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163msgid "OK"
163msgid "OK"
164msgstr "BAŞ E"
164msgstr "BAŞ E"
165
165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167msgid "See less"
167msgid "See less"
168msgstr "Hindiktir bibîne"
168msgstr "Hindiktir bibîne"
169
169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171msgid "See all"
171msgid "See all"
172msgstr "Tevî bibîne"
172msgstr "Tevî bibîne"
173
173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175#: qml/Panel/SearchIndicator.qml:27
175#: qml/Panel/SearchIndicator.qml:27
176msgid "Search"
176msgid "Search"
177msgstr "Lêgerîn"
177msgstr "Lêgerîn"
@@ -260,18 +260,10 @@ msgstr "Niha biaxive..."
260msgid "Speaking..."
260msgid "Speaking..."
261msgstr "Diaxive..."
261msgstr "Diaxive..."
262
262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264msgid "Show password"
264msgid "Show password"
265msgstr "Şîfreyê nîşan bide"
265msgstr "Şîfreyê nîşan bide"
266
266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr "PINa SIMê binivîse"
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "Bibore, PIN çewt e"
274−
275#: qml/Panel/ActiveCallHint.qml:77
267#: qml/Panel/ActiveCallHint.qml:77
276msgid "Tap to return to call..."
268msgid "Tap to return to call..."
277msgstr "Ji bo vegerî lêgerînê bipelîne..."
269msgstr "Ji bo vegerî lêgerînê bipelîne..."
@@ -316,49 +308,49 @@ msgstr "Kilîda SIMê veke"
316msgid "Roaming"
308msgid "Roaming"
317msgstr "Geriyan"
309msgstr "Geriyan"
318
310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320msgid "Enter passphrase"
312msgid "Enter passphrase"
321msgstr ""
313msgstr ""
322
314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324msgid "Sorry, incorrect passphrase"
316msgid "Sorry, incorrect passphrase"
325msgstr "Bibore, parola çewt e"
317msgstr "Bibore, parola çewt e"
326
318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328msgid "Please re-enter"
320msgid "Please re-enter"
329msgstr ""
321msgstr ""
330
322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332msgid "Enter passcode"
324msgid "Enter passcode"
333msgstr ""
325msgstr ""
334
326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336msgid "Sorry, incorrect passcode"
328msgid "Sorry, incorrect passcode"
337msgstr "Bibore, parola çewrt e"
329msgstr "Bibore, parola çewrt e"
338
330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340#, qt-format
332#, qt-format
341msgid "Enter %1"
333msgid "Enter %1"
342msgstr ""
334msgstr ""
343
335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345#, qt-format
337#, qt-format
346msgid "Sorry, incorrect %1"
338msgid "Sorry, incorrect %1"
347msgstr "Bibore, %1 çewt e"
339msgstr "Bibore, %1 çewt e"
348
340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350msgid "Sorry, incorrect passphrase."
342msgid "Sorry, incorrect passphrase."
351msgstr "Bibore, parola çewt e."
343msgstr "Bibore, parola çewt e."
352
344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354msgid "Sorry, incorrect passcode."
346msgid "Sorry, incorrect passcode."
355msgstr "Bibore, parola çewt e."
347msgstr "Bibore, parola çewt e."
356
348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358msgid "This will be your last attempt."
350msgid "This will be your last attempt."
359msgstr "Ev ê ceribandina dawiyê be."
351msgstr "Ev ê ceribandina dawiyê be."
360
352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362msgid ""
354msgid ""
363"If passphrase is entered incorrectly, your phone will conduct a factory "
355"If passphrase is entered incorrectly, your phone will conduct a factory "
364"reset and all personal data will be deleted."
356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
358"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
367"hemû daneyên te yên taybet dê bên jêbirin."
359"hemû daneyên te yên taybet dê bên jêbirin."
368
360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370msgid ""
362msgid ""
371"If passcode is entered incorrectly, your phone will conduct a factory reset "
363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372"and all personal data will be deleted."
364"and all personal data will be deleted."
@@ -374,28 +366,8 @@ msgstr ""
374"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
366"Eger parola çewt bê nivîsandin, telefona te dê vegere eyarên fabrîkayê û "
375"hemû daneyên te yên taybet dê bên jêbirin."
367"hemû daneyên te yên taybet dê bên jêbirin."
376
368
377−#~ msgid "Please wait"
369+#~ msgid "Sorry, incorrect PIN"
378−#~ msgstr "Tika ye li bendê bimîne"
370+#~ msgstr "Bibore, PIN çewt e"
379−
380−#, qt-format
381−#~ msgid "Hello %1"
382−#~ msgstr "Silav %1"
383−
384−#~ msgid "Hello"
385−#~ msgstr "Silav"
386−
387−#~ msgid "Too many incorrect attempts"
388−#~ msgstr "Te gelek caran ceribandinên çewt kirin"
389−
390−#~ msgid "Swipe to unlock"
391−#~ msgstr "Ji bo vekirinê kaş bike"
392−
393−#~ msgid "Enter your passphrase"
394−#~ msgstr "Parolaya xwe binivîse"
395−
396−#, qt-format
397−#~ msgid "Enter your %1"
398−#~ msgstr "%1a xwe binivîse"
399
371
400−#~ msgid "Enter your passcode"
372+#~ msgid "Enter SIM PIN"
401−#~ msgstr "Parolaya xwe binivîse"
373+#~ msgstr "PINa SIMê binivîse"
po/ky.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "Издөө"
174msgstr "Издөө"
@@ -257,18 +257,10 @@ msgstr "Азыр сүйлөңүз..."
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "Сүйлөнүүдө..."
258msgstr "Сүйлөнүүдө..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/lo.po+20−35
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
13"Language-Team: Lao <lo@li.org>\n"
13"Language-Team: Lao <lo@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "ຊອກຫາ"
174msgstr "ຊອກຫາ"
@@ -257,18 +257,10 @@ msgstr "ເວົ້າໂລດ"
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "ກໍາລັງເວົ້າ"
258msgstr "ກໍາລັງເວົ້າ"
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "ສະບາຍດີ %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "ສະບາຍດີ"
po/lt.po+20−38
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"(n%100<10 || n%100>=20) ? 1 : 2;\n"
18"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -156,23 +156,23 @@ msgid ""
156"phone<br><br>Tap on the screen to start"
156"phone<br><br>Tap on the screen to start"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:218
159+#: qml/Components/Lockscreen.qml:220
160msgid "Emergency Call"
160msgid "Emergency Call"
161msgstr "Pagalbos skambutis"
161msgstr "Pagalbos skambutis"
162
162
163−#: qml/Components/Lockscreen.qml:250
163+#: qml/Components/Lockscreen.qml:252
164msgid "OK"
164msgid "OK"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
167+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
168msgid "See less"
168msgid "See less"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:411
171+#: qml/Dash/GenericScopeView.qml:434
172msgid "See all"
172msgid "See all"
173msgstr ""
173msgstr ""
174
174
175−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
175+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
176#: qml/Panel/SearchIndicator.qml:27
176#: qml/Panel/SearchIndicator.qml:27
177msgid "Search"
177msgid "Search"
178msgstr "Paieška"
178msgstr "Paieška"
@@ -261,18 +261,10 @@ msgstr "Kalbėkite..."
261msgid "Speaking..."
261msgid "Speaking..."
262msgstr "Kalbama..."
262msgstr "Kalbama..."
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:108
264+#: qml/Notifications/NotificationMenuItemFactory.qml:116
265msgid "Show password"
265msgid "Show password"
266msgstr "Rodyti slaptažodį"
266msgstr "Rodyti slaptažodį"
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:124
269−msgid "Enter SIM PIN"
270−msgstr ""
271−
272−#: qml/Notifications/NotificationMenuItemFactory.qml:125
273−msgid "Sorry, incorrect PIN"
274−msgstr ""
275−
276#: qml/Panel/ActiveCallHint.qml:77
268#: qml/Panel/ActiveCallHint.qml:77
277msgid "Tap to return to call..."
269msgid "Tap to return to call..."
278msgstr ""
270msgstr ""
@@ -317,66 +309,56 @@ msgstr ""
317msgid "Roaming"
309msgid "Roaming"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:340
312+#: qml/Shell.qml:346
321msgid "Enter passphrase"
313msgid "Enter passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:341
316+#: qml/Shell.qml:347
325msgid "Sorry, incorrect passphrase"
317msgid "Sorry, incorrect passphrase"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:342
320+#: qml/Shell.qml:348
329msgid "Please re-enter"
321msgid "Please re-enter"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:344
324+#: qml/Shell.qml:350
333msgid "Enter passcode"
325msgid "Enter passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:345
328+#: qml/Shell.qml:351
337msgid "Sorry, incorrect passcode"
329msgid "Sorry, incorrect passcode"
338msgstr ""
330msgstr ""
339
331
340−#: qml/Shell.qml:348
332+#: qml/Shell.qml:354
341#, qt-format
333#, qt-format
342msgid "Enter %1"
334msgid "Enter %1"
343msgstr ""
335msgstr ""
344
336
345−#: qml/Shell.qml:349
337+#: qml/Shell.qml:355
346#, qt-format
338#, qt-format
347msgid "Sorry, incorrect %1"
339msgid "Sorry, incorrect %1"
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:384
342+#: qml/Shell.qml:390
351msgid "Sorry, incorrect passphrase."
343msgid "Sorry, incorrect passphrase."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:385
346+#: qml/Shell.qml:391
355msgid "Sorry, incorrect passcode."
347msgid "Sorry, incorrect passcode."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:386
350+#: qml/Shell.qml:392
359msgid "This will be your last attempt."
351msgid "This will be your last attempt."
360msgstr ""
352msgstr ""
361
353
362−#: qml/Shell.qml:388
354+#: qml/Shell.qml:394
363msgid ""
355msgid ""
364"If passphrase is entered incorrectly, your phone will conduct a factory "
356"If passphrase is entered incorrectly, your phone will conduct a factory "
365"reset and all personal data will be deleted."
357"reset and all personal data will be deleted."
366msgstr ""
358msgstr ""
367
359
368−#: qml/Shell.qml:389
360+#: qml/Shell.qml:395
369msgid ""
361msgid ""
370"If passcode is entered incorrectly, your phone will conduct a factory reset "
362"If passcode is entered incorrectly, your phone will conduct a factory reset "
371"and all personal data will be deleted."
363"and all personal data will be deleted."
372msgstr ""
364msgstr ""
373−
374−#, qt-format
375−#~ msgid "Hello %1"
376−#~ msgstr "Laba diena, %1"
377−
378−#~ msgid "Hello"
379−#~ msgstr "Sveiki"
380−
381−#~ msgid "Swipe to unlock"
382−#~ msgstr "Braukite ir atrakinsite"
po/lv.po+22−41
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-08-21 09:46+0000\n"
11"PO-Revision-Date: 2014-08-21 09:46+0000\n"
12"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
12"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
13"Language-Team: Latvian <lv@li.org>\n"
13"Language-Team: Latvian <lv@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "Neatliekamās Palīdzības zvans"
157msgstr "Neatliekamās Palīdzības zvans"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr "LABI"
161msgstr "LABI"
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr "Redzēt mazāk"
165msgstr "Redzēt mazāk"
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr "Skatīt visus"
169msgstr "Skatīt visus"
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "Meklēt"
174msgstr "Meklēt"
@@ -257,18 +257,10 @@ msgstr "Runajiet Tagad"
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "Runa..."
258msgstr "Runa..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr "Rādīt paroli"
262msgstr "Rādīt paroli"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr "Ievadiet SIM PIN"
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,70 +305,59 @@ msgstr "Atbloķēt SIM"
313msgid "Roaming"
305msgid "Roaming"
314msgstr "Viesabonēšana"
306msgstr "Viesabonēšana"
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr "Šīs būs jūs pēdējais mēģinājums."
348msgstr "Šīs būs jūs pēdējais mēģinājums."
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369
361
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "Sveiki, %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "Sveiki"
376−
377−#, qt-format
378−#~ msgid "Enter your %1"
362+#~ msgid "Enter SIM PIN"
379−#~ msgstr "Ievadiet jūsu %1"
363+#~ msgstr "Ievadiet SIM PIN"
380−
381−#~ msgid "Please wait"
382−#~ msgstr "Lūdzu, uzgaidiet"
po/ml.po+20−35
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
12"Last-Translator: ST Alfas <Unknown>\n"
12"Last-Translator: ST Alfas <Unknown>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -154,23 +154,23 @@ msgid ""
154"phone<br><br>Tap on the screen to start"
154"phone<br><br>Tap on the screen to start"
155msgstr ""
155msgstr ""
156
156
157−#: qml/Components/Lockscreen.qml:218
157+#: qml/Components/Lockscreen.qml:220
158msgid "Emergency Call"
158msgid "Emergency Call"
159msgstr "അടിയന്തിര വിളി"
159msgstr "അടിയന്തിര വിളി"
160
160
161−#: qml/Components/Lockscreen.qml:250
161+#: qml/Components/Lockscreen.qml:252
162msgid "OK"
162msgid "OK"
163msgstr ""
163msgstr ""
164
164
165−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
165+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
166msgid "See less"
166msgid "See less"
167msgstr ""
167msgstr ""
168
168
169−#: qml/Dash/GenericScopeView.qml:411
169+#: qml/Dash/GenericScopeView.qml:434
170msgid "See all"
170msgid "See all"
171msgstr ""
171msgstr ""
172
172
173−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
173+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
174#: qml/Panel/SearchIndicator.qml:27
174#: qml/Panel/SearchIndicator.qml:27
175msgid "Search"
175msgid "Search"
176msgstr "തിരയുക"
176msgstr "തിരയുക"
@@ -259,18 +259,10 @@ msgstr "ഇപ്പോള്‍ സംസാരിക്കുക..."
259msgid "Speaking..."
259msgid "Speaking..."
260msgstr "സംസാരിക്കുന്നു..."
260msgstr "സംസാരിക്കുന്നു..."
261
261
262−#: qml/Notifications/NotificationMenuItemFactory.qml:108
262+#: qml/Notifications/NotificationMenuItemFactory.qml:116
263msgid "Show password"
263msgid "Show password"
264msgstr "രഹസ്യവാക്ക് കാണിക്കുക"
264msgstr "രഹസ്യവാക്ക് കാണിക്കുക"
265
265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:124
267−msgid "Enter SIM PIN"
268−msgstr ""
269−
270−#: qml/Notifications/NotificationMenuItemFactory.qml:125
271−msgid "Sorry, incorrect PIN"
272−msgstr ""
273−
274#: qml/Panel/ActiveCallHint.qml:77
266#: qml/Panel/ActiveCallHint.qml:77
275msgid "Tap to return to call..."
267msgid "Tap to return to call..."
276msgstr ""
268msgstr ""
@@ -315,63 +307,56 @@ msgstr ""
315msgid "Roaming"
307msgid "Roaming"
316msgstr ""
308msgstr ""
317
309
318−#: qml/Shell.qml:340
310+#: qml/Shell.qml:346
319msgid "Enter passphrase"
311msgid "Enter passphrase"
320msgstr ""
312msgstr ""
321
313
322−#: qml/Shell.qml:341
314+#: qml/Shell.qml:347
323msgid "Sorry, incorrect passphrase"
315msgid "Sorry, incorrect passphrase"
324msgstr ""
316msgstr ""
325
317
326−#: qml/Shell.qml:342
318+#: qml/Shell.qml:348
327msgid "Please re-enter"
319msgid "Please re-enter"
328msgstr ""
320msgstr ""
329
321
330−#: qml/Shell.qml:344
322+#: qml/Shell.qml:350
331msgid "Enter passcode"
323msgid "Enter passcode"
332msgstr ""
324msgstr ""
333
325
334−#: qml/Shell.qml:345
326+#: qml/Shell.qml:351
335msgid "Sorry, incorrect passcode"
327msgid "Sorry, incorrect passcode"
336msgstr ""
328msgstr ""
337
329
338−#: qml/Shell.qml:348
330+#: qml/Shell.qml:354
339#, qt-format
331#, qt-format
340msgid "Enter %1"
332msgid "Enter %1"
341msgstr ""
333msgstr ""
342
334
343−#: qml/Shell.qml:349
335+#: qml/Shell.qml:355
344#, qt-format
336#, qt-format
345msgid "Sorry, incorrect %1"
337msgid "Sorry, incorrect %1"
346msgstr ""
338msgstr ""
347
339
348−#: qml/Shell.qml:384
340+#: qml/Shell.qml:390
349msgid "Sorry, incorrect passphrase."
341msgid "Sorry, incorrect passphrase."
350msgstr ""
342msgstr ""
351
343
352−#: qml/Shell.qml:385
344+#: qml/Shell.qml:391
353msgid "Sorry, incorrect passcode."
345msgid "Sorry, incorrect passcode."
354msgstr ""
346msgstr ""
355
347
356−#: qml/Shell.qml:386
348+#: qml/Shell.qml:392
357msgid "This will be your last attempt."
349msgid "This will be your last attempt."
358msgstr ""
350msgstr ""
359
351
360−#: qml/Shell.qml:388
352+#: qml/Shell.qml:394
361msgid ""
353msgid ""
362"If passphrase is entered incorrectly, your phone will conduct a factory "
354"If passphrase is entered incorrectly, your phone will conduct a factory "
363"reset and all personal data will be deleted."
355"reset and all personal data will be deleted."
364msgstr ""
356msgstr ""
365
357
366−#: qml/Shell.qml:389
358+#: qml/Shell.qml:395
367msgid ""
359msgid ""
368"If passcode is entered incorrectly, your phone will conduct a factory reset "
360"If passcode is entered incorrectly, your phone will conduct a factory reset "
369"and all personal data will be deleted."
361"and all personal data will be deleted."
370msgstr ""
362msgstr ""
371−
372−#, qt-format
373−#~ msgid "Hello %1"
374−#~ msgstr "ഹലോ %1"
375−
376−#~ msgid "Hello"
377−#~ msgstr "ഹലോ"
po/mr.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
13"Language-Team: Marathi <mr@li.org>\n"
13"Language-Team: Marathi <mr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr ""
174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr ""
258msgstr ""
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/ms.po+20−35
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
12"Last-Translator: abuyop <Unknown>\n"
12"Last-Translator: abuyop <Unknown>\n"
13"Language-Team: Malay <ms@li.org>\n"
13"Language-Team: Malay <ms@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "panggilan Kecemasan"
157msgstr "panggilan Kecemasan"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "Gelintar"
174msgstr "Gelintar"
@@ -257,18 +257,10 @@ msgstr "Cakap Sekarang..."
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "Bercakap..."
258msgstr "Bercakap..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr "Tunjuk kata laluan"
262msgstr "Tunjuk kata laluan"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "Hai %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "Hello"
po/my.po+20−35
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
13"Language-Team: Burmese <my@li.org>\n"
13"Language-Team: Burmese <my@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "အရေးပေါ်ခေါ်မည်"
157msgstr "အရေးပေါ်ခေါ်မည်"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "ရှာဖွေ"
174msgstr "ရှာဖွေ"
@@ -257,18 +257,10 @@ msgstr "ယခုပြောပါ"
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "ပြောနေသည်"
258msgstr "ပြောနေသည်"
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr "စကားဝှက်ကိုပြ"
262msgstr "စကားဝှက်ကိုပြ"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,63 +305,56 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "ဟဲလို %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "ဟဲလို"
po/nb.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 10:32+0000\n"
11"PO-Revision-Date: 2014-10-07 10:32+0000\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158"Du har nå mestret kantbevegelsene, og er klar til å bruke "
158"Du har nå mestret kantbevegelsene, og er klar til å bruke "
159"telefonen<br><br>Trykk på skjermen for å begynne"
159"telefonen<br><br>Trykk på skjermen for å begynne"
160
160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162msgid "Emergency Call"
162msgid "Emergency Call"
163msgstr "Nødanrop"
163msgstr "Nødanrop"
164
164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166msgid "OK"
166msgid "OK"
167msgstr "OK"
167msgstr "OK"
168
168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170msgid "See less"
170msgid "See less"
171msgstr "Vis mindre"
171msgstr "Vis mindre"
172
172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174msgid "See all"
174msgid "See all"
175msgstr "Vis alt"
175msgstr "Vis alt"
176
176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178#: qml/Panel/SearchIndicator.qml:27
178#: qml/Panel/SearchIndicator.qml:27
179msgid "Search"
179msgid "Search"
180msgstr "Søk"
180msgstr "Søk"
@@ -263,18 +263,10 @@ msgstr "Snakk nå …"
263msgid "Speaking..."
263msgid "Speaking..."
264msgstr "Snakker …"
264msgstr "Snakker …"
265
265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267msgid "Show password"
267msgid "Show password"
268msgstr "Vis passord"
268msgstr "Vis passord"
269
269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Tast SIM-kortets PIN-kode"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "Feil PIN"
277−
278#: qml/Panel/ActiveCallHint.qml:77
270#: qml/Panel/ActiveCallHint.qml:77
279msgid "Tap to return to call..."
271msgid "Tap to return to call..."
280msgstr "Trykk for å gå tilbake til anrop …"
272msgstr "Trykk for å gå tilbake til anrop …"
@@ -319,49 +311,49 @@ msgstr "Lås opp SIM"
319msgid "Roaming"
311msgid "Roaming"
320msgstr "Fremmednett"
312msgstr "Fremmednett"
321
313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323msgid "Enter passphrase"
315msgid "Enter passphrase"
324msgstr "Skriv inn passordfrase"
316msgstr "Skriv inn passordfrase"
325
317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327msgid "Sorry, incorrect passphrase"
319msgid "Sorry, incorrect passphrase"
328msgstr "Feil passordfrase"
320msgstr "Feil passordfrase"
329
321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331msgid "Please re-enter"
323msgid "Please re-enter"
332msgstr "Skriv inn på nytt"
324msgstr "Skriv inn på nytt"
333
325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335msgid "Enter passcode"
327msgid "Enter passcode"
336msgstr "Tast kode"
328msgstr "Tast kode"
337
329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339msgid "Sorry, incorrect passcode"
331msgid "Sorry, incorrect passcode"
340msgstr "Feil kode"
332msgstr "Feil kode"
341
333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343#, qt-format
335#, qt-format
344msgid "Enter %1"
336msgid "Enter %1"
345msgstr "Skriv inn %1"
337msgstr "Skriv inn %1"
346
338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348#, qt-format
340#, qt-format
349msgid "Sorry, incorrect %1"
341msgid "Sorry, incorrect %1"
350msgstr "Feil %1"
342msgstr "Feil %1"
351
343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353msgid "Sorry, incorrect passphrase."
345msgid "Sorry, incorrect passphrase."
354msgstr "Feil passordfrase."
346msgstr "Feil passordfrase."
355
347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357msgid "Sorry, incorrect passcode."
349msgid "Sorry, incorrect passcode."
358msgstr "Feil kode."
350msgstr "Feil kode."
359
351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361msgid "This will be your last attempt."
353msgid "This will be your last attempt."
362msgstr "Dette er ditt siste forsøk."
354msgstr "Dette er ditt siste forsøk."
363
355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365msgid ""
357msgid ""
366"If passphrase is entered incorrectly, your phone will conduct a factory "
358"If passphrase is entered incorrectly, your phone will conduct a factory "
367"reset and all personal data will be deleted."
359"reset and all personal data will be deleted."
@@ -369,7 +361,7 @@ msgstr ""
369"Hvis du skriver feil passordfrase en gang til, tilbakestilles telefonen til "
361"Hvis du skriver feil passordfrase en gang til, tilbakestilles telefonen til "
370"fabrikkinnstillinger, og alle personlige data slettes."
362"fabrikkinnstillinger, og alle personlige data slettes."
371
363
372−#: qml/Shell.qml:389
364+#: qml/Shell.qml:395
373msgid ""
365msgid ""
374"If passcode is entered incorrectly, your phone will conduct a factory reset "
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
375"and all personal data will be deleted."
367"and all personal data will be deleted."
@@ -377,28 +369,8 @@ msgstr ""
377"Hvis du skriver feil kode en gang til, tilbakestilles telefonen til "
369"Hvis du skriver feil kode en gang til, tilbakestilles telefonen til "
378"fabrikkinnstillinger, og alle personlige data slettes."
370"fabrikkinnstillinger, og alle personlige data slettes."
379
371
380−#~ msgid "Hello"
372+#~ msgid "Sorry, incorrect PIN"
381−#~ msgstr "Hei"
373+#~ msgstr "Feil PIN"
382−
383−#, qt-format
384−#~ msgid "Hello %1"
385−#~ msgstr "Hei, %1"
386−
387−#~ msgid "Please wait"
388−#~ msgstr "Vent litt"
389−
390−#~ msgid "Too many incorrect attempts"
391−#~ msgstr "Du har tastet feil for mange ganger"
392−
393−#, qt-format
394−#~ msgid "Enter your %1"
395−#~ msgstr "Skriv inn %1"
396−
397−#~ msgid "Enter your passphrase"
398−#~ msgstr "Skriv inn passordfrasen din"
399−
400−#~ msgid "Swipe to unlock"
401−#~ msgstr "Skyv for å låse opp"
402
374
403−#~ msgid "Enter your passcode"
375+#~ msgid "Enter SIM PIN"
404−#~ msgstr "Tast koden din"
376+#~ msgstr "Tast SIM-kortets PIN-kode"
po/nl.po+27−55
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2014-10-03 18:53+0000\n"
11+"PO-Revision-Date: 2014-10-08 19:53+0000\n"
12"Last-Translator: rob <linuxned@gmail.com>\n"
12"Last-Translator: rob <linuxned@gmail.com>\n"
13"Language-Team: Dutch <nl@li.org>\n"
13"Language-Team: Dutch <nl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -160,23 +160,23 @@ msgstr ""
160"Nu u de bewegingen vanuit de randen onder de knie heeft, kunt u beginnen met "
160"Nu u de bewegingen vanuit de randen onder de knie heeft, kunt u beginnen met "
161"het gebruiken van de telefoon<br><br>Tik op het scherm om te beginnen"
161"het gebruiken van de telefoon<br><br>Tik op het scherm om te beginnen"
162
162
163−#: qml/Components/Lockscreen.qml:218
163+#: qml/Components/Lockscreen.qml:220
164msgid "Emergency Call"
164msgid "Emergency Call"
165msgstr "Noodoproep"
165msgstr "Noodoproep"
166
166
167−#: qml/Components/Lockscreen.qml:250
167+#: qml/Components/Lockscreen.qml:252
168msgid "OK"
168msgid "OK"
169msgstr "Ok"
169msgstr "Ok"
170
170
171−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
171+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
172msgid "See less"
172msgid "See less"
173msgstr "Minder zien"
173msgstr "Minder zien"
174
174
175−#: qml/Dash/GenericScopeView.qml:411
175+#: qml/Dash/GenericScopeView.qml:434
176msgid "See all"
176msgid "See all"
177msgstr "Alles zien"
177msgstr "Alles zien"
178
178
179−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
179+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
180#: qml/Panel/SearchIndicator.qml:27
180#: qml/Panel/SearchIndicator.qml:27
181msgid "Search"
181msgid "Search"
182msgstr "Zoeken"
182msgstr "Zoeken"
@@ -215,11 +215,11 @@ msgstr "Versturen"
215
215
216#: qml/Dash/PullToRefreshScopeStyle.qml:55
216#: qml/Dash/PullToRefreshScopeStyle.qml:55
217msgid "Pull to refresh…"
217msgid "Pull to refresh…"
218−msgstr ""
218+msgstr "Trekken om te verversen…"
219
219
220#: qml/Dash/PullToRefreshScopeStyle.qml:60
220#: qml/Dash/PullToRefreshScopeStyle.qml:60
221msgid "Release to refresh…"
221msgid "Release to refresh…"
222−msgstr ""
222+msgstr "Loslaten om te verversen…"
223
223
224#: qml/Dash/ScopesOverview.qml:206
224#: qml/Dash/ScopesOverview.qml:206
225msgid "Manage Scopes"
225msgid "Manage Scopes"
@@ -265,18 +265,10 @@ msgstr "Nu inspreken…"
265msgid "Speaking..."
265msgid "Speaking..."
266msgstr "Inspreken…"
266msgstr "Inspreken…"
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:108
268+#: qml/Notifications/NotificationMenuItemFactory.qml:116
269msgid "Show password"
269msgid "Show password"
270msgstr "Wachtwoord tonen"
270msgstr "Wachtwoord tonen"
271
271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:124
273−msgid "Enter SIM PIN"
274−msgstr "Voer simpincode in"
275−
276−#: qml/Notifications/NotificationMenuItemFactory.qml:125
277−msgid "Sorry, incorrect PIN"
278−msgstr "Sorry, onjuiste pincode"
279−
280#: qml/Panel/ActiveCallHint.qml:77
272#: qml/Panel/ActiveCallHint.qml:77
281msgid "Tap to return to call..."
273msgid "Tap to return to call..."
282msgstr "Tik om terug te keren naar gesprek…"
274msgstr "Tik om terug te keren naar gesprek…"
@@ -321,49 +313,49 @@ msgstr "Simkaart deblokkeren"
321msgid "Roaming"
313msgid "Roaming"
322msgstr "Roaming"
314msgstr "Roaming"
323
315
324−#: qml/Shell.qml:340
316+#: qml/Shell.qml:346
325msgid "Enter passphrase"
317msgid "Enter passphrase"
326msgstr "Voer wachtwoordzin in"
318msgstr "Voer wachtwoordzin in"
327
319
328−#: qml/Shell.qml:341
320+#: qml/Shell.qml:347
329msgid "Sorry, incorrect passphrase"
321msgid "Sorry, incorrect passphrase"
330msgstr "Sorry, onjuiste wachtwoordzin"
322msgstr "Sorry, onjuiste wachtwoordzin"
331
323
332−#: qml/Shell.qml:342
324+#: qml/Shell.qml:348
333msgid "Please re-enter"
325msgid "Please re-enter"
334msgstr "Herhaal deze a.u.b."
326msgstr "Herhaal deze a.u.b."
335
327
336−#: qml/Shell.qml:344
328+#: qml/Shell.qml:350
337msgid "Enter passcode"
329msgid "Enter passcode"
338msgstr "Voer toegangscode in"
330msgstr "Voer toegangscode in"
339
331
340−#: qml/Shell.qml:345
332+#: qml/Shell.qml:351
341msgid "Sorry, incorrect passcode"
333msgid "Sorry, incorrect passcode"
342msgstr "Sorry, onjuiste toegangscode"
334msgstr "Sorry, onjuiste toegangscode"
343
335
344−#: qml/Shell.qml:348
336+#: qml/Shell.qml:354
345#, qt-format
337#, qt-format
346msgid "Enter %1"
338msgid "Enter %1"
347msgstr "Voer %1 in"
339msgstr "Voer %1 in"
348
340
349−#: qml/Shell.qml:349
341+#: qml/Shell.qml:355
350#, qt-format
342#, qt-format
351msgid "Sorry, incorrect %1"
343msgid "Sorry, incorrect %1"
352msgstr "Sorry, onjuiste %1"
344msgstr "Sorry, onjuiste %1"
353
345
354−#: qml/Shell.qml:384
346+#: qml/Shell.qml:390
355msgid "Sorry, incorrect passphrase."
347msgid "Sorry, incorrect passphrase."
356msgstr "Sorry, onjuiste wachtwoordzin."
348msgstr "Sorry, onjuiste wachtwoordzin."
357
349
358−#: qml/Shell.qml:385
350+#: qml/Shell.qml:391
359msgid "Sorry, incorrect passcode."
351msgid "Sorry, incorrect passcode."
360msgstr "Sorry, onjuiste toegangscode."
352msgstr "Sorry, onjuiste toegangscode."
361
353
362−#: qml/Shell.qml:386
354+#: qml/Shell.qml:392
363msgid "This will be your last attempt."
355msgid "This will be your last attempt."
364msgstr "Dit zal uw laatste poging worden."
356msgstr "Dit zal uw laatste poging worden."
365
357
366−#: qml/Shell.qml:388
358+#: qml/Shell.qml:394
367msgid ""
359msgid ""
368"If passphrase is entered incorrectly, your phone will conduct a factory "
360"If passphrase is entered incorrectly, your phone will conduct a factory "
369"reset and all personal data will be deleted."
361"reset and all personal data will be deleted."
@@ -371,7 +363,7 @@ msgstr ""
371"Wanneer de wachtwoordzin nu opnieuw onjuist wordt ingevoerd, zal uw telefoon "
363"Wanneer de wachtwoordzin nu opnieuw onjuist wordt ingevoerd, zal uw telefoon "
372"teruggaan naar de fabrieksinstellingen en zal al uw eigen data verloren gaan."
364"teruggaan naar de fabrieksinstellingen en zal al uw eigen data verloren gaan."
373
365
374−#: qml/Shell.qml:389
366+#: qml/Shell.qml:395
375msgid ""
367msgid ""
376"If passcode is entered incorrectly, your phone will conduct a factory reset "
368"If passcode is entered incorrectly, your phone will conduct a factory reset "
377"and all personal data will be deleted."
369"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379"Wanneer de toegangscode nu opnieuw onjuist wordt ingevoerd, zal uw telefoon "
371"Wanneer de toegangscode nu opnieuw onjuist wordt ingevoerd, zal uw telefoon "
380"teruggaan naar de fabrieksinstellingen en zal al uw eigen data verloren gaan."
372"teruggaan naar de fabrieksinstellingen en zal al uw eigen data verloren gaan."
381
373
382−#, qt-format
374+#~ msgid "Sorry, incorrect PIN"
383−#~ msgid "Hello %1"
375+#~ msgstr "Sorry, onjuiste pincode"
384−#~ msgstr "Hallo %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "Hallo"
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "Veeg om te ontgrendelen"
391−
392−#~ msgid "Please wait"
393−#~ msgstr "Even geduld a.u.b."
394−
395−#, qt-format
396−#~ msgid "Enter your %1"
397−#~ msgstr "Voer uw %1 in"
398−
399−#~ msgid "Too many incorrect attempts"
400−#~ msgstr "Te veel mislukte pogingen"
401−
402−#~ msgid "Enter your passphrase"
403−#~ msgstr "Voer uw wachtwoordzin in"
404
376
405−#~ msgid "Enter your passcode"
377+#~ msgid "Enter SIM PIN"
406−#~ msgstr "Voer uw toegangscode in"
378+#~ msgstr "Voer simpincode in"
po/pl.po+20−38
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-08-18 20:25+0000\n"
11"PO-Revision-Date: 2014-08-18 20:25+0000\n"
12"Last-Translator: Paweł Stroka <pawstr@gmail.com>\n"
12"Last-Translator: Paweł Stroka <pawstr@gmail.com>\n"
13"Language-Team: Polish <pl@li.org>\n"
13"Language-Team: Polish <pl@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
18"|| n%100>=20) ? 1 : 2;\n"
18"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -157,23 +157,23 @@ msgstr ""
157"Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do "
157"Wydawanie poleceń krawędzi zostało opanowane. Urządzenie gotowe do "
158"pracy.<br><br>Dotknij ekranu by rozpocząć"
158"pracy.<br><br>Dotknij ekranu by rozpocząć"
159
159
160−#: qml/Components/Lockscreen.qml:218
160+#: qml/Components/Lockscreen.qml:220
161msgid "Emergency Call"
161msgid "Emergency Call"
162msgstr "Telefon ratunkowy"
162msgstr "Telefon ratunkowy"
163
163
164−#: qml/Components/Lockscreen.qml:250
164+#: qml/Components/Lockscreen.qml:252
165msgid "OK"
165msgid "OK"
166msgstr "OK"
166msgstr "OK"
167
167
168−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
168+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
169msgid "See less"
169msgid "See less"
170msgstr "Zobacz mniej"
170msgstr "Zobacz mniej"
171
171
172−#: qml/Dash/GenericScopeView.qml:411
172+#: qml/Dash/GenericScopeView.qml:434
173msgid "See all"
173msgid "See all"
174msgstr "Zobacz wszystko"
174msgstr "Zobacz wszystko"
175
175
176−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
176+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
177#: qml/Panel/SearchIndicator.qml:27
177#: qml/Panel/SearchIndicator.qml:27
178msgid "Search"
178msgid "Search"
179msgstr "Szukaj"
179msgstr "Szukaj"
@@ -262,18 +262,10 @@ msgstr "Mów teraz..."
262msgid "Speaking..."
262msgid "Speaking..."
263msgstr "Rozpoznanie..."
263msgstr "Rozpoznanie..."
264
264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:108
265+#: qml/Notifications/NotificationMenuItemFactory.qml:116
266msgid "Show password"
266msgid "Show password"
267msgstr "Wyświetl hasło"
267msgstr "Wyświetl hasło"
268
268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:124
270−msgid "Enter SIM PIN"
271−msgstr ""
272−
273−#: qml/Notifications/NotificationMenuItemFactory.qml:125
274−msgid "Sorry, incorrect PIN"
275−msgstr ""
276−
277#: qml/Panel/ActiveCallHint.qml:77
269#: qml/Panel/ActiveCallHint.qml:77
278msgid "Tap to return to call..."
270msgid "Tap to return to call..."
279msgstr "Dotknij aby powrócić do połączenia..."
271msgstr "Dotknij aby powrócić do połączenia..."
@@ -318,66 +310,56 @@ msgstr ""
318msgid "Roaming"
310msgid "Roaming"
319msgstr ""
311msgstr ""
320
312
321−#: qml/Shell.qml:340
313+#: qml/Shell.qml:346
322msgid "Enter passphrase"
314msgid "Enter passphrase"
323msgstr ""
315msgstr ""
324
316
325−#: qml/Shell.qml:341
317+#: qml/Shell.qml:347
326msgid "Sorry, incorrect passphrase"
318msgid "Sorry, incorrect passphrase"
327msgstr ""
319msgstr ""
328
320
329−#: qml/Shell.qml:342
321+#: qml/Shell.qml:348
330msgid "Please re-enter"
322msgid "Please re-enter"
331msgstr ""
323msgstr ""
332
324
333−#: qml/Shell.qml:344
325+#: qml/Shell.qml:350
334msgid "Enter passcode"
326msgid "Enter passcode"
335msgstr ""
327msgstr ""
336
328
337−#: qml/Shell.qml:345
329+#: qml/Shell.qml:351
338msgid "Sorry, incorrect passcode"
330msgid "Sorry, incorrect passcode"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:348
333+#: qml/Shell.qml:354
342#, qt-format
334#, qt-format
343msgid "Enter %1"
335msgid "Enter %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:349
338+#: qml/Shell.qml:355
347#, qt-format
339#, qt-format
348msgid "Sorry, incorrect %1"
340msgid "Sorry, incorrect %1"
349msgstr ""
341msgstr ""
350
342
351−#: qml/Shell.qml:384
343+#: qml/Shell.qml:390
352msgid "Sorry, incorrect passphrase."
344msgid "Sorry, incorrect passphrase."
353msgstr "Niestety, błędne hasło"
345msgstr "Niestety, błędne hasło"
354
346
355−#: qml/Shell.qml:385
347+#: qml/Shell.qml:391
356msgid "Sorry, incorrect passcode."
348msgid "Sorry, incorrect passcode."
357msgstr "Niestety, błędny kod"
349msgstr "Niestety, błędny kod"
358
350
359−#: qml/Shell.qml:386
351+#: qml/Shell.qml:392
360msgid "This will be your last attempt."
352msgid "This will be your last attempt."
361msgstr ""
353msgstr ""
362
354
363−#: qml/Shell.qml:388
355+#: qml/Shell.qml:394
364msgid ""
356msgid ""
365"If passphrase is entered incorrectly, your phone will conduct a factory "
357"If passphrase is entered incorrectly, your phone will conduct a factory "
366"reset and all personal data will be deleted."
358"reset and all personal data will be deleted."
367msgstr ""
359msgstr ""
368
360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370msgid ""
362msgid ""
371"If passcode is entered incorrectly, your phone will conduct a factory reset "
363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372"and all personal data will be deleted."
364"and all personal data will be deleted."
373msgstr ""
365msgstr ""
374−
375−#, qt-format
376−#~ msgid "Hello %1"
377−#~ msgstr "Witaj %1"
378−
379−#~ msgid "Hello"
380−#~ msgstr "Witaj"
381−
382−#~ msgid "Swipe to unlock"
383−#~ msgstr "Przeciągnij aby odblokować"
po/pt.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 08:31+0000\n"
11"PO-Revision-Date: 2014-10-07 08:31+0000\n"
12"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
12"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -157,23 +157,23 @@ msgstr ""
157"Já domina os gestos dos limites e pode começar a usar o "
157"Já domina os gestos dos limites e pode começar a usar o "
158"telefone<br><br>Toque no ecrã para começar"
158"telefone<br><br>Toque no ecrã para começar"
159
159
160−#: qml/Components/Lockscreen.qml:218
160+#: qml/Components/Lockscreen.qml:220
161msgid "Emergency Call"
161msgid "Emergency Call"
162msgstr "Chamada de emergência"
162msgstr "Chamada de emergência"
163
163
164−#: qml/Components/Lockscreen.qml:250
164+#: qml/Components/Lockscreen.qml:252
165msgid "OK"
165msgid "OK"
166msgstr "OK"
166msgstr "OK"
167
167
168−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
168+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
169msgid "See less"
169msgid "See less"
170msgstr "Ver menos"
170msgstr "Ver menos"
171
171
172−#: qml/Dash/GenericScopeView.qml:411
172+#: qml/Dash/GenericScopeView.qml:434
173msgid "See all"
173msgid "See all"
174msgstr "Ver todos"
174msgstr "Ver todos"
175
175
176−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
176+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
177#: qml/Panel/SearchIndicator.qml:27
177#: qml/Panel/SearchIndicator.qml:27
178msgid "Search"
178msgid "Search"
179msgstr "Procurar"
179msgstr "Procurar"
@@ -262,18 +262,10 @@ msgstr "Fale agora..."
262msgid "Speaking..."
262msgid "Speaking..."
263msgstr "A falar..."
263msgstr "A falar..."
264
264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:108
265+#: qml/Notifications/NotificationMenuItemFactory.qml:116
266msgid "Show password"
266msgid "Show password"
267msgstr "Mostrar palavra-passe"
267msgstr "Mostrar palavra-passe"
268
268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:124
270−msgid "Enter SIM PIN"
271−msgstr "Introduza o PIN do SIM"
272−
273−#: qml/Notifications/NotificationMenuItemFactory.qml:125
274−msgid "Sorry, incorrect PIN"
275−msgstr "Desculpe, PIN incorreto"
276−
277#: qml/Panel/ActiveCallHint.qml:77
269#: qml/Panel/ActiveCallHint.qml:77
278msgid "Tap to return to call..."
270msgid "Tap to return to call..."
279msgstr "Tocar para ligar de volta..."
271msgstr "Tocar para ligar de volta..."
@@ -318,49 +310,49 @@ msgstr "Desbloquear SIM"
318msgid "Roaming"
310msgid "Roaming"
319msgstr "Roaming"
311msgstr "Roaming"
320
312
321−#: qml/Shell.qml:340
313+#: qml/Shell.qml:346
322msgid "Enter passphrase"
314msgid "Enter passphrase"
323msgstr "Indique a frase-senha"
315msgstr "Indique a frase-senha"
324
316
325−#: qml/Shell.qml:341
317+#: qml/Shell.qml:347
326msgid "Sorry, incorrect passphrase"
318msgid "Sorry, incorrect passphrase"
327msgstr "Desculpe, frase-senha incorreta"
319msgstr "Desculpe, frase-senha incorreta"
328
320
329−#: qml/Shell.qml:342
321+#: qml/Shell.qml:348
330msgid "Please re-enter"
322msgid "Please re-enter"
331msgstr "Por favor, volte a introduzir"
323msgstr "Por favor, volte a introduzir"
332
324
333−#: qml/Shell.qml:344
325+#: qml/Shell.qml:350
334msgid "Enter passcode"
326msgid "Enter passcode"
335msgstr "Introduza senha"
327msgstr "Introduza senha"
336
328
337−#: qml/Shell.qml:345
329+#: qml/Shell.qml:351
338msgid "Sorry, incorrect passcode"
330msgid "Sorry, incorrect passcode"
339msgstr "Desculpe, senha incorreta"
331msgstr "Desculpe, senha incorreta"
340
332
341−#: qml/Shell.qml:348
333+#: qml/Shell.qml:354
342#, qt-format
334#, qt-format
343msgid "Enter %1"
335msgid "Enter %1"
344msgstr "Introduziu %1"
336msgstr "Introduziu %1"
345
337
346−#: qml/Shell.qml:349
338+#: qml/Shell.qml:355
347#, qt-format
339#, qt-format
348msgid "Sorry, incorrect %1"
340msgid "Sorry, incorrect %1"
349msgstr "Desculpe, incorreto %1"
341msgstr "Desculpe, incorreto %1"
350
342
351−#: qml/Shell.qml:384
343+#: qml/Shell.qml:390
352msgid "Sorry, incorrect passphrase."
344msgid "Sorry, incorrect passphrase."
353msgstr "Desculpe, frase de acesso incorreta."
345msgstr "Desculpe, frase de acesso incorreta."
354
346
355−#: qml/Shell.qml:385
347+#: qml/Shell.qml:391
356msgid "Sorry, incorrect passcode."
348msgid "Sorry, incorrect passcode."
357msgstr "Desculpe, senha incorreta."
349msgstr "Desculpe, senha incorreta."
358
350
359−#: qml/Shell.qml:386
351+#: qml/Shell.qml:392
360msgid "This will be your last attempt."
352msgid "This will be your last attempt."
361msgstr "Esta será a sua última tentativa."
353msgstr "Esta será a sua última tentativa."
362
354
363−#: qml/Shell.qml:388
355+#: qml/Shell.qml:394
364msgid ""
356msgid ""
365"If passphrase is entered incorrectly, your phone will conduct a factory "
357"If passphrase is entered incorrectly, your phone will conduct a factory "
366"reset and all personal data will be deleted."
358"reset and all personal data will be deleted."
@@ -368,7 +360,7 @@ msgstr ""
368"Se a frase de acesso for introduzida incorretamente, o seu telemóvel vai "
360"Se a frase de acesso for introduzida incorretamente, o seu telemóvel vai "
369"proceder ao restauro de fábrica e apagará toda a sua informação pessoal."
361"proceder ao restauro de fábrica e apagará toda a sua informação pessoal."
370
362
371−#: qml/Shell.qml:389
363+#: qml/Shell.qml:395
372msgid ""
364msgid ""
373"If passcode is entered incorrectly, your phone will conduct a factory reset "
365"If passcode is entered incorrectly, your phone will conduct a factory reset "
374"and all personal data will be deleted."
366"and all personal data will be deleted."
@@ -376,28 +368,8 @@ msgstr ""
376"Se a senha for introduzida incorretamente, o seu telemóvel vai apagar todos "
368"Se a senha for introduzida incorretamente, o seu telemóvel vai apagar todos "
377"os seus dados pessoais."
369"os seus dados pessoais."
378
370
379−#, qt-format
371+#~ msgid "Sorry, incorrect PIN"
380−#~ msgid "Hello %1"
372+#~ msgstr "Desculpe, PIN incorreto"
381−#~ msgstr "Olá %1"
382−
383−#~ msgid "Hello"
384−#~ msgstr "Olá"
385−
386−#~ msgid "Swipe to unlock"
387−#~ msgstr "Deslize para desbloquear"
388−
389−#~ msgid "Please wait"
390−#~ msgstr "Por favor aguarde"
391−
392−#~ msgid "Too many incorrect attempts"
393−#~ msgstr "Demasiadas tentativas incorrectas"
394−
395−#, qt-format
396−#~ msgid "Enter your %1"
397−#~ msgstr "Introduza o seu %1"
398−
399−#~ msgid "Enter your passphrase"
400−#~ msgstr "Introduza a sua frase-senha"
401
373
402−#~ msgid "Enter your passcode"
374+#~ msgid "Enter SIM PIN"
403−#~ msgstr "Introduza a sua senha"
375+#~ msgstr "Introduza o PIN do SIM"
po/pt_BR.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-30 17:37+0000\n"
11"PO-Revision-Date: 2014-09-30 17:37+0000\n"
12"Last-Translator: Rafael Neri <Unknown>\n"
12"Last-Translator: Rafael Neri <Unknown>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -158,23 +158,23 @@ msgstr ""
158"Agora você já domina os gestos das bordas e pode começar a usar o "
158"Agora você já domina os gestos das bordas e pode começar a usar o "
159"telefone<br><br>Toque na tela para iniciar"
159"telefone<br><br>Toque na tela para iniciar"
160
160
161−#: qml/Components/Lockscreen.qml:218
161+#: qml/Components/Lockscreen.qml:220
162msgid "Emergency Call"
162msgid "Emergency Call"
163msgstr "Chamada de emergência"
163msgstr "Chamada de emergência"
164
164
165−#: qml/Components/Lockscreen.qml:250
165+#: qml/Components/Lockscreen.qml:252
166msgid "OK"
166msgid "OK"
167msgstr "OK"
167msgstr "OK"
168
168
169−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
169+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
170msgid "See less"
170msgid "See less"
171msgstr "Ver menos"
171msgstr "Ver menos"
172
172
173−#: qml/Dash/GenericScopeView.qml:411
173+#: qml/Dash/GenericScopeView.qml:434
174msgid "See all"
174msgid "See all"
175msgstr "Ver todos"
175msgstr "Ver todos"
176
176
177−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
177+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
178#: qml/Panel/SearchIndicator.qml:27
178#: qml/Panel/SearchIndicator.qml:27
179msgid "Search"
179msgid "Search"
180msgstr "Pesquisar"
180msgstr "Pesquisar"
@@ -263,18 +263,10 @@ msgstr "Fale agora..."
263msgid "Speaking..."
263msgid "Speaking..."
264msgstr "Falando..."
264msgstr "Falando..."
265
265
266−#: qml/Notifications/NotificationMenuItemFactory.qml:108
266+#: qml/Notifications/NotificationMenuItemFactory.qml:116
267msgid "Show password"
267msgid "Show password"
268msgstr "Exibir senha"
268msgstr "Exibir senha"
269
269
270−#: qml/Notifications/NotificationMenuItemFactory.qml:124
271−msgid "Enter SIM PIN"
272−msgstr "Digite o PIN do SIM"
273−
274−#: qml/Notifications/NotificationMenuItemFactory.qml:125
275−msgid "Sorry, incorrect PIN"
276−msgstr "Desculpe, PIN incorreto"
277−
278#: qml/Panel/ActiveCallHint.qml:77
270#: qml/Panel/ActiveCallHint.qml:77
279msgid "Tap to return to call..."
271msgid "Tap to return to call..."
280msgstr "Toque para retornar para a chamada..."
272msgstr "Toque para retornar para a chamada..."
@@ -319,49 +311,49 @@ msgstr "Desbloquear SIM"
319msgid "Roaming"
311msgid "Roaming"
320msgstr "Roaming"
312msgstr "Roaming"
321
313
322−#: qml/Shell.qml:340
314+#: qml/Shell.qml:346
323msgid "Enter passphrase"
315msgid "Enter passphrase"
324msgstr ""
316msgstr ""
325
317
326−#: qml/Shell.qml:341
318+#: qml/Shell.qml:347
327msgid "Sorry, incorrect passphrase"
319msgid "Sorry, incorrect passphrase"
328msgstr "Desculpe, senha incorreta"
320msgstr "Desculpe, senha incorreta"
329
321
330−#: qml/Shell.qml:342
322+#: qml/Shell.qml:348
331msgid "Please re-enter"
323msgid "Please re-enter"
332msgstr ""
324msgstr ""
333
325
334−#: qml/Shell.qml:344
326+#: qml/Shell.qml:350
335msgid "Enter passcode"
327msgid "Enter passcode"
336msgstr ""
328msgstr ""
337
329
338−#: qml/Shell.qml:345
330+#: qml/Shell.qml:351
339msgid "Sorry, incorrect passcode"
331msgid "Sorry, incorrect passcode"
340msgstr "Desculpe, senha incorreta"
332msgstr "Desculpe, senha incorreta"
341
333
342−#: qml/Shell.qml:348
334+#: qml/Shell.qml:354
343#, qt-format
335#, qt-format
344msgid "Enter %1"
336msgid "Enter %1"
345msgstr ""
337msgstr ""
346
338
347−#: qml/Shell.qml:349
339+#: qml/Shell.qml:355
348#, qt-format
340#, qt-format
349msgid "Sorry, incorrect %1"
341msgid "Sorry, incorrect %1"
350msgstr "Desculpe, %1 incorreto"
342msgstr "Desculpe, %1 incorreto"
351
343
352−#: qml/Shell.qml:384
344+#: qml/Shell.qml:390
353msgid "Sorry, incorrect passphrase."
345msgid "Sorry, incorrect passphrase."
354msgstr "Desculpe, senha incorreta."
346msgstr "Desculpe, senha incorreta."
355
347
356−#: qml/Shell.qml:385
348+#: qml/Shell.qml:391
357msgid "Sorry, incorrect passcode."
349msgid "Sorry, incorrect passcode."
358msgstr "Desculpe, código de acesso incorreto."
350msgstr "Desculpe, código de acesso incorreto."
359
351
360−#: qml/Shell.qml:386
352+#: qml/Shell.qml:392
361msgid "This will be your last attempt."
353msgid "This will be your last attempt."
362msgstr "Esta será a sua última tentativa."
354msgstr "Esta será a sua última tentativa."
363
355
364−#: qml/Shell.qml:388
356+#: qml/Shell.qml:394
365msgid ""
357msgid ""
366"If passphrase is entered incorrectly, your phone will conduct a factory "
358"If passphrase is entered incorrectly, your phone will conduct a factory "
367"reset and all personal data will be deleted."
359"reset and all personal data will be deleted."
@@ -369,7 +361,7 @@ msgstr ""
369"Se a senha for digitada incorretamente, o telefone será restaurado aos "
361"Se a senha for digitada incorretamente, o telefone será restaurado aos "
370"padrões de fábrica e todos os dados pessoais serão apagados."
362"padrões de fábrica e todos os dados pessoais serão apagados."
371
363
372−#: qml/Shell.qml:389
364+#: qml/Shell.qml:395
373msgid ""
365msgid ""
374"If passcode is entered incorrectly, your phone will conduct a factory reset "
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
375"and all personal data will be deleted."
367"and all personal data will be deleted."
@@ -377,28 +369,8 @@ msgstr ""
377"Se o código de acesso for digitado incorretamente, o telefone será "
369"Se o código de acesso for digitado incorretamente, o telefone será "
378"restaurado aos padrões de fábrica e todos os dados pessoais serão apagados."
370"restaurado aos padrões de fábrica e todos os dados pessoais serão apagados."
379
371
380−#, qt-format
372+#~ msgid "Sorry, incorrect PIN"
381−#~ msgid "Hello %1"
373+#~ msgstr "Desculpe, PIN incorreto"
382−#~ msgstr "Olá %1"
383−
384−#~ msgid "Hello"
385−#~ msgstr "Olá"
386−
387−#~ msgid "Swipe to unlock"
388−#~ msgstr "Deslizar para desbloquear"
389−
390−#~ msgid "Too many incorrect attempts"
391−#~ msgstr "Muitas tentativas incorretas"
392−
393−#, qt-format
394−#~ msgid "Enter your %1"
395−#~ msgstr "Digite o seu %1"
396−
397−#~ msgid "Please wait"
398−#~ msgstr "Por favor, aguarde"
399−
400−#~ msgid "Enter your passphrase"
401−#~ msgstr "Digite sua senha"
402
374
403−#~ msgid "Enter your passcode"
375+#~ msgid "Enter SIM PIN"
404−#~ msgstr "Digite sua senha"
376+#~ msgstr "Digite o PIN do SIM"
po/ro.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 15:54+0000\n"
11"PO-Revision-Date: 2014-10-07 15:54+0000\n"
12"Last-Translator: Marian Vasile <marianvasile1972@gmail.com>\n"
12"Last-Translator: Marian Vasile <marianvasile1972@gmail.com>\n"
13"Language-Team: Romanian <ro@li.org>\n"
13"Language-Team: Romanian <ro@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
18"== 0) && (n != 0))) ? 2: 1));\n"
18"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -164,23 +164,23 @@ msgstr ""
164"De acum stăpâniți gesturile de control și puteți începe să utilizați "
164"De acum stăpâniți gesturile de control și puteți începe să utilizați "
165"telefonul<br><br>Atingeți ecranul pentru a începe"
165"telefonul<br><br>Atingeți ecranul pentru a începe"
166
166
167−#: qml/Components/Lockscreen.qml:218
167+#: qml/Components/Lockscreen.qml:220
168msgid "Emergency Call"
168msgid "Emergency Call"
169msgstr "Apel de urgență"
169msgstr "Apel de urgență"
170
170
171−#: qml/Components/Lockscreen.qml:250
171+#: qml/Components/Lockscreen.qml:252
172msgid "OK"
172msgid "OK"
173msgstr "În regulă"
173msgstr "În regulă"
174
174
175−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
175+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
176msgid "See less"
176msgid "See less"
177msgstr "Afișează mai puține"
177msgstr "Afișează mai puține"
178
178
179−#: qml/Dash/GenericScopeView.qml:411
179+#: qml/Dash/GenericScopeView.qml:434
180msgid "See all"
180msgid "See all"
181msgstr "Afișează tot"
181msgstr "Afișează tot"
182
182
183−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
183+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
184#: qml/Panel/SearchIndicator.qml:27
184#: qml/Panel/SearchIndicator.qml:27
185msgid "Search"
185msgid "Search"
186msgstr "Căutare"
186msgstr "Căutare"
@@ -269,18 +269,10 @@ msgstr "Vorbiți acum..."
269msgid "Speaking..."
269msgid "Speaking..."
270msgstr "Vorbire..."
270msgstr "Vorbire..."
271
271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:108
272+#: qml/Notifications/NotificationMenuItemFactory.qml:116
273msgid "Show password"
273msgid "Show password"
274msgstr "Arată parola"
274msgstr "Arată parola"
275
275
276−#: qml/Notifications/NotificationMenuItemFactory.qml:124
277−msgid "Enter SIM PIN"
278−msgstr "Introduceți codul PIN pentru SIM"
279−
280−#: qml/Notifications/NotificationMenuItemFactory.qml:125
281−msgid "Sorry, incorrect PIN"
282−msgstr "Cod PIN incorect"
283−
284#: qml/Panel/ActiveCallHint.qml:77
276#: qml/Panel/ActiveCallHint.qml:77
285msgid "Tap to return to call..."
277msgid "Tap to return to call..."
286msgstr "Atingeți pentru a vă întoarce la convorbire..."
278msgstr "Atingeți pentru a vă întoarce la convorbire..."
@@ -325,49 +317,49 @@ msgstr "Deblocare SIM"
325msgid "Roaming"
317msgid "Roaming"
326msgstr "Roaming"
318msgstr "Roaming"
327
319
328−#: qml/Shell.qml:340
320+#: qml/Shell.qml:346
329msgid "Enter passphrase"
321msgid "Enter passphrase"
330msgstr "Introduceți fraza parolă"
322msgstr "Introduceți fraza parolă"
331
323
332−#: qml/Shell.qml:341
324+#: qml/Shell.qml:347
333msgid "Sorry, incorrect passphrase"
325msgid "Sorry, incorrect passphrase"
334msgstr "Frază secretă incorectă"
326msgstr "Frază secretă incorectă"
335
327
336−#: qml/Shell.qml:342
328+#: qml/Shell.qml:348
337msgid "Please re-enter"
329msgid "Please re-enter"
338msgstr "Introduceți din nou"
330msgstr "Introduceți din nou"
339
331
340−#: qml/Shell.qml:344
332+#: qml/Shell.qml:350
341msgid "Enter passcode"
333msgid "Enter passcode"
342msgstr "Introduceți parola"
334msgstr "Introduceți parola"
343
335
344−#: qml/Shell.qml:345
336+#: qml/Shell.qml:351
345msgid "Sorry, incorrect passcode"
337msgid "Sorry, incorrect passcode"
346msgstr "Parolă incorectă"
338msgstr "Parolă incorectă"
347
339
348−#: qml/Shell.qml:348
340+#: qml/Shell.qml:354
349#, qt-format
341#, qt-format
350msgid "Enter %1"
342msgid "Enter %1"
351msgstr "Introducere %1"
343msgstr "Introducere %1"
352
344
353−#: qml/Shell.qml:349
345+#: qml/Shell.qml:355
354#, qt-format
346#, qt-format
355msgid "Sorry, incorrect %1"
347msgid "Sorry, incorrect %1"
356msgstr "%1 incorectă"
348msgstr "%1 incorectă"
357
349
358−#: qml/Shell.qml:384
350+#: qml/Shell.qml:390
359msgid "Sorry, incorrect passphrase."
351msgid "Sorry, incorrect passphrase."
360msgstr "Frază parolă greșită"
352msgstr "Frază parolă greșită"
361
353
362−#: qml/Shell.qml:385
354+#: qml/Shell.qml:391
363msgid "Sorry, incorrect passcode."
355msgid "Sorry, incorrect passcode."
364msgstr "Parolă greșită"
356msgstr "Parolă greșită"
365
357
366−#: qml/Shell.qml:386
358+#: qml/Shell.qml:392
367msgid "This will be your last attempt."
359msgid "This will be your last attempt."
368msgstr "Aceasta va fi ultima încercare"
360msgstr "Aceasta va fi ultima încercare"
369
361
370−#: qml/Shell.qml:388
362+#: qml/Shell.qml:394
371msgid ""
363msgid ""
372"If passphrase is entered incorrectly, your phone will conduct a factory "
364"If passphrase is entered incorrectly, your phone will conduct a factory "
373"reset and all personal data will be deleted."
365"reset and all personal data will be deleted."
@@ -376,7 +368,7 @@ msgstr ""
376"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
368"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
377"șterse."
369"șterse."
378
370
379−#: qml/Shell.qml:389
371+#: qml/Shell.qml:395
380msgid ""
372msgid ""
381"If passcode is entered incorrectly, your phone will conduct a factory reset "
373"If passcode is entered incorrectly, your phone will conduct a factory reset "
382"and all personal data will be deleted."
374"and all personal data will be deleted."
@@ -385,28 +377,8 @@ msgstr ""
385"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
377"configurările inițiale, ale fabricantului, iar toate datele personale vor fi "
386"șterse."
378"șterse."
387
379
388−#, qt-format
380+#~ msgid "Enter SIM PIN"
389−#~ msgid "Hello %1"
381+#~ msgstr "Introduceți codul PIN pentru SIM"
390−#~ msgstr "Salutări %1"
391−
392−#~ msgid "Hello"
393−#~ msgstr "Salutări"
394−
395−#~ msgid "Swipe to unlock"
396−#~ msgstr "Glisați pentru deblocare"
397−
398−#~ msgid "Please wait"
399−#~ msgstr "Așteptați"
400−
401−#~ msgid "Too many incorrect attempts"
402−#~ msgstr "Prea multe încercări greșite"
403−
404−#, qt-format
405−#~ msgid "Enter your %1"
406−#~ msgstr "Introduceți %1"
407−
408−#~ msgid "Enter your passphrase"
409−#~ msgstr "Introduceți fraza dumneavoastră secretă"
410
382
411−#~ msgid "Enter your passcode"
383+#~ msgid "Sorry, incorrect PIN"
412−#~ msgstr "Introduceți parola"
384+#~ msgstr "Cod PIN incorect"
po/ru.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-08-29 08:06+0000\n"
11"PO-Revision-Date: 2014-08-29 08:06+0000\n"
12"Last-Translator: Jay ZDLin <Unknown>\n"
12"Last-Translator: Jay ZDLin <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -160,23 +160,23 @@ msgstr ""
160"Вы научились пользоваться Ubuntu и можете начать использовать свой "
160"Вы научились пользоваться Ubuntu и можете начать использовать свой "
161"телефон<br><br>Нажмите на экран"
161"телефон<br><br>Нажмите на экран"
162
162
163−#: qml/Components/Lockscreen.qml:218
163+#: qml/Components/Lockscreen.qml:220
164msgid "Emergency Call"
164msgid "Emergency Call"
165msgstr "Экстренный вызов"
165msgstr "Экстренный вызов"
166
166
167−#: qml/Components/Lockscreen.qml:250
167+#: qml/Components/Lockscreen.qml:252
168msgid "OK"
168msgid "OK"
169msgstr "ОК"
169msgstr "ОК"
170
170
171−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
171+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
172msgid "See less"
172msgid "See less"
173msgstr "Вкратце"
173msgstr "Вкратце"
174
174
175−#: qml/Dash/GenericScopeView.qml:411
175+#: qml/Dash/GenericScopeView.qml:434
176msgid "See all"
176msgid "See all"
177msgstr "Показать всё"
177msgstr "Показать всё"
178
178
179−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
179+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
180#: qml/Panel/SearchIndicator.qml:27
180#: qml/Panel/SearchIndicator.qml:27
181msgid "Search"
181msgid "Search"
182msgstr "Поиск"
182msgstr "Поиск"
@@ -265,18 +265,10 @@ msgstr "Говорите..."
265msgid "Speaking..."
265msgid "Speaking..."
266msgstr "Говорите..."
266msgstr "Говорите..."
267
267
268−#: qml/Notifications/NotificationMenuItemFactory.qml:108
268+#: qml/Notifications/NotificationMenuItemFactory.qml:116
269msgid "Show password"
269msgid "Show password"
270msgstr "Показать пароль"
270msgstr "Показать пароль"
271
271
272−#: qml/Notifications/NotificationMenuItemFactory.qml:124
273−msgid "Enter SIM PIN"
274−msgstr "Введите ПИН-код SIM-карты"
275−
276−#: qml/Notifications/NotificationMenuItemFactory.qml:125
277−msgid "Sorry, incorrect PIN"
278−msgstr "Введён неверный ПИН-код"
279−
280#: qml/Panel/ActiveCallHint.qml:77
272#: qml/Panel/ActiveCallHint.qml:77
281msgid "Tap to return to call..."
273msgid "Tap to return to call..."
282msgstr "Коснитесь для возврата к вызову..."
274msgstr "Коснитесь для возврата к вызову..."
@@ -321,49 +313,49 @@ msgstr "Разблокировать SIM-карту"
321msgid "Roaming"
313msgid "Roaming"
322msgstr "Роуминг"
314msgstr "Роуминг"
323
315
324−#: qml/Shell.qml:340
316+#: qml/Shell.qml:346
325msgid "Enter passphrase"
317msgid "Enter passphrase"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:341
320+#: qml/Shell.qml:347
329msgid "Sorry, incorrect passphrase"
321msgid "Sorry, incorrect passphrase"
330msgstr "Введена неверная кодовая фраза"
322msgstr "Введена неверная кодовая фраза"
331
323
332−#: qml/Shell.qml:342
324+#: qml/Shell.qml:348
333msgid "Please re-enter"
325msgid "Please re-enter"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:344
328+#: qml/Shell.qml:350
337msgid "Enter passcode"
329msgid "Enter passcode"
338msgstr ""
330msgstr ""
339
331
340−#: qml/Shell.qml:345
332+#: qml/Shell.qml:351
341msgid "Sorry, incorrect passcode"
333msgid "Sorry, incorrect passcode"
342msgstr "Секретный код введён неверно"
334msgstr "Секретный код введён неверно"
343
335
344−#: qml/Shell.qml:348
336+#: qml/Shell.qml:354
345#, qt-format
337#, qt-format
346msgid "Enter %1"
338msgid "Enter %1"
347msgstr ""
339msgstr ""
348
340
349−#: qml/Shell.qml:349
341+#: qml/Shell.qml:355
350#, qt-format
342#, qt-format
351msgid "Sorry, incorrect %1"
343msgid "Sorry, incorrect %1"
352msgstr "Некорректный ввод %1"
344msgstr "Некорректный ввод %1"
353
345
354−#: qml/Shell.qml:384
346+#: qml/Shell.qml:390
355msgid "Sorry, incorrect passphrase."
347msgid "Sorry, incorrect passphrase."
356msgstr "Неверная ключевая фраза."
348msgstr "Неверная ключевая фраза."
357
349
358−#: qml/Shell.qml:385
350+#: qml/Shell.qml:391
359msgid "Sorry, incorrect passcode."
351msgid "Sorry, incorrect passcode."
360msgstr "Неверный секретный код."
352msgstr "Неверный секретный код."
361
353
362−#: qml/Shell.qml:386
354+#: qml/Shell.qml:392
363msgid "This will be your last attempt."
355msgid "This will be your last attempt."
364msgstr "Осталась последняя попытка."
356msgstr "Осталась последняя попытка."
365
357
366−#: qml/Shell.qml:388
358+#: qml/Shell.qml:394
367msgid ""
359msgid ""
368"If passphrase is entered incorrectly, your phone will conduct a factory "
360"If passphrase is entered incorrectly, your phone will conduct a factory "
369"reset and all personal data will be deleted."
361"reset and all personal data will be deleted."
@@ -371,7 +363,7 @@ msgstr ""
371"Если ключевая фраза будет введена неверно, то телефон вернётся к заводским "
363"Если ключевая фраза будет введена неверно, то телефон вернётся к заводским "
372"настройкам, а все личные данные будут удалены."
364"настройкам, а все личные данные будут удалены."
373
365
374−#: qml/Shell.qml:389
366+#: qml/Shell.qml:395
375msgid ""
367msgid ""
376"If passcode is entered incorrectly, your phone will conduct a factory reset "
368"If passcode is entered incorrectly, your phone will conduct a factory reset "
377"and all personal data will be deleted."
369"and all personal data will be deleted."
@@ -379,28 +371,8 @@ msgstr ""
379"Если секретный код будет введен неверно, то телефон вернётся к заводским "
371"Если секретный код будет введен неверно, то телефон вернётся к заводским "
380"настройкам, а все личные данные будут удалены."
372"настройкам, а все личные данные будут удалены."
381
373
382−#, qt-format
374+#~ msgid "Sorry, incorrect PIN"
383−#~ msgid "Hello %1"
375+#~ msgstr "Введён неверный ПИН-код"
384−#~ msgstr "Привет, %1"
385−
386−#~ msgid "Hello"
387−#~ msgstr "Привет"
388−
389−#~ msgid "Swipe to unlock"
390−#~ msgstr "Смахните, чтобы разблокировать"
391−
392−#, qt-format
393−#~ msgid "Enter your %1"
394−#~ msgstr "Введите %1"
395−
396−#~ msgid "Please wait"
397−#~ msgstr "Подождите"
398−
399−#~ msgid "Too many incorrect attempts"
400−#~ msgstr "Слишком много ошибок ввода"
401−
402−#~ msgid "Enter your passphrase"
403−#~ msgstr "Введите кодовую фразу"
404
376
405−#~ msgid "Enter your passcode"
377+#~ msgid "Enter SIM PIN"
406−#~ msgstr "Введите секретный код"
378+#~ msgstr "Введите ПИН-код SIM-карты"
po/shn.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Shan <shn@li.org>\n"
13"Language-Team: Shan <shn@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
17"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr ""
174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr ""
258msgstr ""
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/si.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr ""
174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr ""
258msgstr ""
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/sl.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 09:28+0000\n"
11"PO-Revision-Date: 2014-10-07 09:28+0000\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18"n%100==4 ? 3 : 0);\n"
18"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -161,23 +161,23 @@ msgstr ""
161"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "
161"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "
162"telefon<br><br>Tapnite na zaslon za začetek"
162"telefon<br><br>Tapnite na zaslon za začetek"
163
163
164−#: qml/Components/Lockscreen.qml:218
164+#: qml/Components/Lockscreen.qml:220
165msgid "Emergency Call"
165msgid "Emergency Call"
166msgstr "Klic v sili"
166msgstr "Klic v sili"
167
167
168−#: qml/Components/Lockscreen.qml:250
168+#: qml/Components/Lockscreen.qml:252
169msgid "OK"
169msgid "OK"
170msgstr "V REDU"
170msgstr "V REDU"
171
171
172−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
172+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
173msgid "See less"
173msgid "See less"
174msgstr "Pokaži manj"
174msgstr "Pokaži manj"
175
175
176−#: qml/Dash/GenericScopeView.qml:411
176+#: qml/Dash/GenericScopeView.qml:434
177msgid "See all"
177msgid "See all"
178msgstr "Ogled vsega"
178msgstr "Ogled vsega"
179
179
180−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
180+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
181#: qml/Panel/SearchIndicator.qml:27
181#: qml/Panel/SearchIndicator.qml:27
182msgid "Search"
182msgid "Search"
183msgstr "Iskanje"
183msgstr "Iskanje"
@@ -266,18 +266,10 @@ msgstr "Govorite zdaj ..."
266msgid "Speaking..."
266msgid "Speaking..."
267msgstr "Govorjenje ..."
267msgstr "Govorjenje ..."
268
268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:108
269+#: qml/Notifications/NotificationMenuItemFactory.qml:116
270msgid "Show password"
270msgid "Show password"
271msgstr "Pokaži geslo"
271msgstr "Pokaži geslo"
272
272
273−#: qml/Notifications/NotificationMenuItemFactory.qml:124
274−msgid "Enter SIM PIN"
275−msgstr "Vnesite PIN kartice SIM"
276−
277−#: qml/Notifications/NotificationMenuItemFactory.qml:125
278−msgid "Sorry, incorrect PIN"
279−msgstr "Oprostite, napačen PIN"
280−
281#: qml/Panel/ActiveCallHint.qml:77
273#: qml/Panel/ActiveCallHint.qml:77
282msgid "Tap to return to call..."
274msgid "Tap to return to call..."
283msgstr "Tapnite za vrnitev v klic ..."
275msgstr "Tapnite za vrnitev v klic ..."
@@ -322,49 +314,49 @@ msgstr "Odkleni SIM"
322msgid "Roaming"
314msgid "Roaming"
323msgstr "Gostovanje"
315msgstr "Gostovanje"
324
316
325−#: qml/Shell.qml:340
317+#: qml/Shell.qml:346
326msgid "Enter passphrase"
318msgid "Enter passphrase"
327msgstr "Vnesite šifrirno reklo"
319msgstr "Vnesite šifrirno reklo"
328
320
329−#: qml/Shell.qml:341
321+#: qml/Shell.qml:347
330msgid "Sorry, incorrect passphrase"
322msgid "Sorry, incorrect passphrase"
331msgstr "Oprostite, napačno šifrirno reklo"
323msgstr "Oprostite, napačno šifrirno reklo"
332
324
333−#: qml/Shell.qml:342
325+#: qml/Shell.qml:348
334msgid "Please re-enter"
326msgid "Please re-enter"
335msgstr "Ponovno vnesite"
327msgstr "Ponovno vnesite"
336
328
337−#: qml/Shell.qml:344
329+#: qml/Shell.qml:350
338msgid "Enter passcode"
330msgid "Enter passcode"
339msgstr "Vnesite geslo"
331msgstr "Vnesite geslo"
340
332
341−#: qml/Shell.qml:345
333+#: qml/Shell.qml:351
342msgid "Sorry, incorrect passcode"
334msgid "Sorry, incorrect passcode"
343msgstr "Nepravilno geslo"
335msgstr "Nepravilno geslo"
344
336
345−#: qml/Shell.qml:348
337+#: qml/Shell.qml:354
346#, qt-format
338#, qt-format
347msgid "Enter %1"
339msgid "Enter %1"
348msgstr "Vnesite %1"
340msgstr "Vnesite %1"
349
341
350−#: qml/Shell.qml:349
342+#: qml/Shell.qml:355
351#, qt-format
343#, qt-format
352msgid "Sorry, incorrect %1"
344msgid "Sorry, incorrect %1"
353msgstr "Oprostite, napačen %1"
345msgstr "Oprostite, napačen %1"
354
346
355−#: qml/Shell.qml:384
347+#: qml/Shell.qml:390
356msgid "Sorry, incorrect passphrase."
348msgid "Sorry, incorrect passphrase."
357msgstr "Nepravilno geslo."
349msgstr "Nepravilno geslo."
358
350
359−#: qml/Shell.qml:385
351+#: qml/Shell.qml:391
360msgid "Sorry, incorrect passcode."
352msgid "Sorry, incorrect passcode."
361msgstr "Nepravilno geslo."
353msgstr "Nepravilno geslo."
362
354
363−#: qml/Shell.qml:386
355+#: qml/Shell.qml:392
364msgid "This will be your last attempt."
356msgid "This will be your last attempt."
365msgstr "To je vaš zadnji poskus"
357msgstr "To je vaš zadnji poskus"
366
358
367−#: qml/Shell.qml:388
359+#: qml/Shell.qml:394
368msgid ""
360msgid ""
369"If passphrase is entered incorrectly, your phone will conduct a factory "
361"If passphrase is entered incorrectly, your phone will conduct a factory "
370"reset and all personal data will be deleted."
362"reset and all personal data will be deleted."
@@ -372,7 +364,7 @@ msgstr ""
372"Če je vneseno nepravilno šifrirno reklo, bo telefon ponastavljen na "
364"Če je vneseno nepravilno šifrirno reklo, bo telefon ponastavljen na "
373"tovarniške nastavitve ter vsi osebni podatki bodo izbrisani."
365"tovarniške nastavitve ter vsi osebni podatki bodo izbrisani."
374
366
375−#: qml/Shell.qml:389
367+#: qml/Shell.qml:395
376msgid ""
368msgid ""
377"If passcode is entered incorrectly, your phone will conduct a factory reset "
369"If passcode is entered incorrectly, your phone will conduct a factory reset "
378"and all personal data will be deleted."
370"and all personal data will be deleted."
@@ -380,28 +372,8 @@ msgstr ""
380"Če je vneseno nepravilno geslo, bo telefon ponastavljen na tovarniške "
372"Če je vneseno nepravilno geslo, bo telefon ponastavljen na tovarniške "
381"nastavitve ter vsi osebni podatki bodo izbrisani."
373"nastavitve ter vsi osebni podatki bodo izbrisani."
382
374
383−#, qt-format
375+#~ msgid "Sorry, incorrect PIN"
384−#~ msgid "Hello %1"
376+#~ msgstr "Oprostite, napačen PIN"
385−#~ msgstr "Pozdravljeni, %1"
386−
387−#~ msgid "Hello"
388−#~ msgstr "Pozdravljeni"
389−
390−#~ msgid "Swipe to unlock"
391−#~ msgstr "Podrsajte za odklenitev"
392−
393−#~ msgid "Please wait"
394−#~ msgstr "Počakajte"
395−
396−#~ msgid "Too many incorrect attempts"
397−#~ msgstr "Preveč nepravilnih poskusov"
398−
399−#, qt-format
400−#~ msgid "Enter your %1"
401−#~ msgstr "Vnesite vaš %1"
402−
403−#~ msgid "Enter your passphrase"
404−#~ msgstr "Vnesite svoje šifrirno reklo"
405
377
406−#~ msgid "Enter your passcode"
378+#~ msgid "Enter SIM PIN"
407−#~ msgstr "Vnesite svoje geslo"
379+#~ msgstr "Vnesite PIN kartice SIM"
po/sq.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-15 13:51+0000\n"
11"PO-Revision-Date: 2014-01-15 13:51+0000\n"
12"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
12"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
13"Language-Team: Albanian <sq@li.org>\n"
13"Language-Team: Albanian <sq@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:58+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -153,23 +153,23 @@ msgid ""
153"phone<br><br>Tap on the screen to start"
153"phone<br><br>Tap on the screen to start"
154msgstr ""
154msgstr ""
155
155
156−#: qml/Components/Lockscreen.qml:218
156+#: qml/Components/Lockscreen.qml:220
157msgid "Emergency Call"
157msgid "Emergency Call"
158msgstr ""
158msgstr ""
159
159
160−#: qml/Components/Lockscreen.qml:250
160+#: qml/Components/Lockscreen.qml:252
161msgid "OK"
161msgid "OK"
162msgstr ""
162msgstr ""
163
163
164−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
164+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
165msgid "See less"
165msgid "See less"
166msgstr ""
166msgstr ""
167
167
168−#: qml/Dash/GenericScopeView.qml:411
168+#: qml/Dash/GenericScopeView.qml:434
169msgid "See all"
169msgid "See all"
170msgstr ""
170msgstr ""
171
171
172−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
172+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
173#: qml/Panel/SearchIndicator.qml:27
173#: qml/Panel/SearchIndicator.qml:27
174msgid "Search"
174msgid "Search"
175msgstr ""
175msgstr ""
@@ -258,18 +258,10 @@ msgstr ""
258msgid "Speaking..."
258msgid "Speaking..."
259msgstr ""
259msgstr ""
260
260
261−#: qml/Notifications/NotificationMenuItemFactory.qml:108
261+#: qml/Notifications/NotificationMenuItemFactory.qml:116
262msgid "Show password"
262msgid "Show password"
263msgstr ""
263msgstr ""
264
264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:124
266−msgid "Enter SIM PIN"
267−msgstr ""
268−
269−#: qml/Notifications/NotificationMenuItemFactory.qml:125
270−msgid "Sorry, incorrect PIN"
271−msgstr ""
272−
273#: qml/Panel/ActiveCallHint.qml:77
265#: qml/Panel/ActiveCallHint.qml:77
274msgid "Tap to return to call..."
266msgid "Tap to return to call..."
275msgstr ""
267msgstr ""
@@ -314,55 +306,55 @@ msgstr ""
314msgid "Roaming"
306msgid "Roaming"
315msgstr ""
307msgstr ""
316
308
317−#: qml/Shell.qml:340
309+#: qml/Shell.qml:346
318msgid "Enter passphrase"
310msgid "Enter passphrase"
319msgstr ""
311msgstr ""
320
312
321−#: qml/Shell.qml:341
313+#: qml/Shell.qml:347
322msgid "Sorry, incorrect passphrase"
314msgid "Sorry, incorrect passphrase"
323msgstr ""
315msgstr ""
324
316
325−#: qml/Shell.qml:342
317+#: qml/Shell.qml:348
326msgid "Please re-enter"
318msgid "Please re-enter"
327msgstr ""
319msgstr ""
328
320
329−#: qml/Shell.qml:344
321+#: qml/Shell.qml:350
330msgid "Enter passcode"
322msgid "Enter passcode"
331msgstr ""
323msgstr ""
332
324
333−#: qml/Shell.qml:345
325+#: qml/Shell.qml:351
334msgid "Sorry, incorrect passcode"
326msgid "Sorry, incorrect passcode"
335msgstr ""
327msgstr ""
336
328
337−#: qml/Shell.qml:348
329+#: qml/Shell.qml:354
338#, qt-format
330#, qt-format
339msgid "Enter %1"
331msgid "Enter %1"
340msgstr ""
332msgstr ""
341
333
342−#: qml/Shell.qml:349
334+#: qml/Shell.qml:355
343#, qt-format
335#, qt-format
344msgid "Sorry, incorrect %1"
336msgid "Sorry, incorrect %1"
345msgstr ""
337msgstr ""
346
338
347−#: qml/Shell.qml:384
339+#: qml/Shell.qml:390
348msgid "Sorry, incorrect passphrase."
340msgid "Sorry, incorrect passphrase."
349msgstr ""
341msgstr ""
350
342
351−#: qml/Shell.qml:385
343+#: qml/Shell.qml:391
352msgid "Sorry, incorrect passcode."
344msgid "Sorry, incorrect passcode."
353msgstr ""
345msgstr ""
354
346
355−#: qml/Shell.qml:386
347+#: qml/Shell.qml:392
356msgid "This will be your last attempt."
348msgid "This will be your last attempt."
357msgstr ""
349msgstr ""
358
350
359−#: qml/Shell.qml:388
351+#: qml/Shell.qml:394
360msgid ""
352msgid ""
361"If passphrase is entered incorrectly, your phone will conduct a factory "
353"If passphrase is entered incorrectly, your phone will conduct a factory "
362"reset and all personal data will be deleted."
354"reset and all personal data will be deleted."
363msgstr ""
355msgstr ""
364
356
365−#: qml/Shell.qml:389
357+#: qml/Shell.qml:395
366msgid ""
358msgid ""
367"If passcode is entered incorrectly, your phone will conduct a factory reset "
359"If passcode is entered incorrectly, your phone will conduct a factory reset "
368"and all personal data will be deleted."
360"and all personal data will be deleted."
po/sr.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-09-24 13:29+0000\n"
11"PO-Revision-Date: 2014-09-24 13:29+0000\n"
12"Last-Translator: Данило Шеган <Unknown>\n"
12"Last-Translator: Данило Шеган <Unknown>\n"
13"Language-Team: Serbian <sr@li.org>\n"
13"Language-Team: Serbian <sr@li.org>\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -157,23 +157,23 @@ msgstr ""
157"Сада сте савладали превлачења са ивица и можете да користите "
157"Сада сте савладали превлачења са ивица и можете да користите "
158"телефон<br><br>Тапните на екран да почнете"
158"телефон<br><br>Тапните на екран да почнете"
159
159
160−#: qml/Components/Lockscreen.qml:218
160+#: qml/Components/Lockscreen.qml:220
161msgid "Emergency Call"
161msgid "Emergency Call"
162msgstr "Хитан позив"
162msgstr "Хитан позив"
163
163
164−#: qml/Components/Lockscreen.qml:250
164+#: qml/Components/Lockscreen.qml:252
165msgid "OK"
165msgid "OK"
166msgstr "У реду"
166msgstr "У реду"
167
167
168−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
168+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
169msgid "See less"
169msgid "See less"
170msgstr "Сажетије"
170msgstr "Сажетије"
171
171
172−#: qml/Dash/GenericScopeView.qml:411
172+#: qml/Dash/GenericScopeView.qml:434
173msgid "See all"
173msgid "See all"
174msgstr "Опширније"
174msgstr "Опширније"
175
175
176−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
176+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
177#: qml/Panel/SearchIndicator.qml:27
177#: qml/Panel/SearchIndicator.qml:27
178msgid "Search"
178msgid "Search"
179msgstr "Претрага"
179msgstr "Претрага"
@@ -262,18 +262,10 @@ msgstr "Изговорите сада..."
262msgid "Speaking..."
262msgid "Speaking..."
263msgstr "Говор..."
263msgstr "Говор..."
264
264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:108
265+#: qml/Notifications/NotificationMenuItemFactory.qml:116
266msgid "Show password"
266msgid "Show password"
267msgstr "Прикажи лозинку"
267msgstr "Прикажи лозинку"
268
268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:124
270−msgid "Enter SIM PIN"
271−msgstr "Унеси пин СИМ картице"
272−
273−#: qml/Notifications/NotificationMenuItemFactory.qml:125
274−msgid "Sorry, incorrect PIN"
275−msgstr "Жао ми је, погрешан ПИН код"
276−
277#: qml/Panel/ActiveCallHint.qml:77
269#: qml/Panel/ActiveCallHint.qml:77
278msgid "Tap to return to call..."
270msgid "Tap to return to call..."
279msgstr "Тапните да одговорите на позив"
271msgstr "Тапните да одговорите на позив"
@@ -318,49 +310,49 @@ msgstr "Откључај СИМ картицу"
318msgid "Roaming"
310msgid "Roaming"
319msgstr "Роминг"
311msgstr "Роминг"
320
312
321−#: qml/Shell.qml:340
313+#: qml/Shell.qml:346
322msgid "Enter passphrase"
314msgid "Enter passphrase"
323msgstr ""
315msgstr ""
324
316
325−#: qml/Shell.qml:341
317+#: qml/Shell.qml:347
326msgid "Sorry, incorrect passphrase"
318msgid "Sorry, incorrect passphrase"
327msgstr "Жао ми је, погрешна лозинка"
319msgstr "Жао ми је, погрешна лозинка"
328
320
329−#: qml/Shell.qml:342
321+#: qml/Shell.qml:348
330msgid "Please re-enter"
322msgid "Please re-enter"
331msgstr ""
323msgstr ""
332
324
333−#: qml/Shell.qml:344
325+#: qml/Shell.qml:350
334msgid "Enter passcode"
326msgid "Enter passcode"
335msgstr ""
327msgstr ""
336
328
337−#: qml/Shell.qml:345
329+#: qml/Shell.qml:351
338msgid "Sorry, incorrect passcode"
330msgid "Sorry, incorrect passcode"
339msgstr "Жао ми је, погрешан код"
331msgstr "Жао ми је, погрешан код"
340
332
341−#: qml/Shell.qml:348
333+#: qml/Shell.qml:354
342#, qt-format
334#, qt-format
343msgid "Enter %1"
335msgid "Enter %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:349
338+#: qml/Shell.qml:355
347#, qt-format
339#, qt-format
348msgid "Sorry, incorrect %1"
340msgid "Sorry, incorrect %1"
349msgstr "Жао ми је, погрешан %1"
341msgstr "Жао ми је, погрешан %1"
350
342
351−#: qml/Shell.qml:384
343+#: qml/Shell.qml:390
352msgid "Sorry, incorrect passphrase."
344msgid "Sorry, incorrect passphrase."
353msgstr "Жао ми је, погрешна лозинка."
345msgstr "Жао ми је, погрешна лозинка."
354
346
355−#: qml/Shell.qml:385
347+#: qml/Shell.qml:391
356msgid "Sorry, incorrect passcode."
348msgid "Sorry, incorrect passcode."
357msgstr "Жао ми је, погрешан код."
349msgstr "Жао ми је, погрешан код."
358
350
359−#: qml/Shell.qml:386
351+#: qml/Shell.qml:392
360msgid "This will be your last attempt."
352msgid "This will be your last attempt."
361msgstr "Ово је ваш последњи покушај."
353msgstr "Ово је ваш последњи покушај."
362
354
363−#: qml/Shell.qml:388
355+#: qml/Shell.qml:394
364msgid ""
356msgid ""
365"If passphrase is entered incorrectly, your phone will conduct a factory "
357"If passphrase is entered incorrectly, your phone will conduct a factory "
366"reset and all personal data will be deleted."
358"reset and all personal data will be deleted."
@@ -368,7 +360,7 @@ msgstr ""
368"Ако се унесе погрешна лозинка, ваш телефон ће се ресетовати и сви лични "
360"Ако се унесе погрешна лозинка, ваш телефон ће се ресетовати и сви лични "
369"подаци ће бити обрисани."
361"подаци ће бити обрисани."
370
362
371−#: qml/Shell.qml:389
363+#: qml/Shell.qml:395
372msgid ""
364msgid ""
373"If passcode is entered incorrectly, your phone will conduct a factory reset "
365"If passcode is entered incorrectly, your phone will conduct a factory reset "
374"and all personal data will be deleted."
366"and all personal data will be deleted."
@@ -376,28 +368,8 @@ msgstr ""
376"Ако се унесе погрешан код, ваш телефон ће се ресетовати и сви лични подаци "
368"Ако се унесе погрешан код, ваш телефон ће се ресетовати и сви лични подаци "
377"ће бити обрисани."
369"ће бити обрисани."
378
370
379−#, qt-format
380−#~ msgid "Hello %1"
381−#~ msgstr "Здраво %1"
382−
383−#~ msgid "Please wait"
384−#~ msgstr "Сачекајте"
385−
386−#~ msgid "Too many incorrect attempts"
387−#~ msgstr "Превише нетачних покушаја"
388−
389−#~ msgid "Hello"
390−#~ msgstr "Здраво"
391−
392−#~ msgid "Enter your passphrase"
371+#~ msgid "Enter SIM PIN"
393−#~ msgstr "Унесите вашу лозинку"
372+#~ msgstr "Унеси пин СИМ картице"
394−
395−#, qt-format
396−#~ msgid "Enter your %1"
397−#~ msgstr "Унесите ваш %1"
398−
399−#~ msgid "Enter your passcode"
400−#~ msgstr "Унесите ваш код"
401
373
402−#~ msgid "Swipe to unlock"
374+#~ msgid "Sorry, incorrect PIN"
403−#~ msgstr "Повуците да откључате"
375+#~ msgstr "Жао ми је, погрешан ПИН код"
po/sv.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 14:28+0000\n"
11"PO-Revision-Date: 2014-10-07 14:28+0000\n"
12"Last-Translator: Josef Andersson <Unknown>\n"
12"Last-Translator: Josef Andersson <Unknown>\n"
13"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
13"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20"Language: sv\n"
20"Language: sv\n"
21
21
@@ -157,23 +157,23 @@ msgstr ""
157"Du har nu bemästrat kantgesterna och kan börja använda "
157"Du har nu bemästrat kantgesterna och kan börja använda "
158"telefonen<br><br>Tryck på skärmen för att starta"
158"telefonen<br><br>Tryck på skärmen för att starta"
159
159
160−#: qml/Components/Lockscreen.qml:218
160+#: qml/Components/Lockscreen.qml:220
161msgid "Emergency Call"
161msgid "Emergency Call"
162msgstr "Nödsamtal"
162msgstr "Nödsamtal"
163
163
164−#: qml/Components/Lockscreen.qml:250
164+#: qml/Components/Lockscreen.qml:252
165msgid "OK"
165msgid "OK"
166msgstr "Ok"
166msgstr "Ok"
167
167
168−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
168+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
169msgid "See less"
169msgid "See less"
170msgstr "Visa mindre"
170msgstr "Visa mindre"
171
171
172−#: qml/Dash/GenericScopeView.qml:411
172+#: qml/Dash/GenericScopeView.qml:434
173msgid "See all"
173msgid "See all"
174msgstr "Visa alla"
174msgstr "Visa alla"
175
175
176−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
176+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
177#: qml/Panel/SearchIndicator.qml:27
177#: qml/Panel/SearchIndicator.qml:27
178msgid "Search"
178msgid "Search"
179msgstr "Sök"
179msgstr "Sök"
@@ -262,18 +262,10 @@ msgstr "Tala nu…"
262msgid "Speaking..."
262msgid "Speaking..."
263msgstr "Talar…"
263msgstr "Talar…"
264
264
265−#: qml/Notifications/NotificationMenuItemFactory.qml:108
265+#: qml/Notifications/NotificationMenuItemFactory.qml:116
266msgid "Show password"
266msgid "Show password"
267msgstr "Visa lösenord"
267msgstr "Visa lösenord"
268
268
269−#: qml/Notifications/NotificationMenuItemFactory.qml:124
270−msgid "Enter SIM PIN"
271−msgstr "Ange SIM PIN-kod"
272−
273−#: qml/Notifications/NotificationMenuItemFactory.qml:125
274−msgid "Sorry, incorrect PIN"
275−msgstr "Felaktig PIN"
276−
277#: qml/Panel/ActiveCallHint.qml:77
269#: qml/Panel/ActiveCallHint.qml:77
278msgid "Tap to return to call..."
270msgid "Tap to return to call..."
279msgstr "Tryck för att återgå till samtal..."
271msgstr "Tryck för att återgå till samtal..."
@@ -318,49 +310,49 @@ msgstr "Lås upp SIM-kort"
318msgid "Roaming"
310msgid "Roaming"
319msgstr "Roaming"
311msgstr "Roaming"
320
312
321−#: qml/Shell.qml:340
313+#: qml/Shell.qml:346
322msgid "Enter passphrase"
314msgid "Enter passphrase"
323msgstr "Ange lösenfras"
315msgstr "Ange lösenfras"
324
316
325−#: qml/Shell.qml:341
317+#: qml/Shell.qml:347
326msgid "Sorry, incorrect passphrase"
318msgid "Sorry, incorrect passphrase"
327msgstr "Felaktig lösenfras"
319msgstr "Felaktig lösenfras"
328
320
329−#: qml/Shell.qml:342
321+#: qml/Shell.qml:348
330msgid "Please re-enter"
322msgid "Please re-enter"
331msgstr "Ange igen"
323msgstr "Ange igen"
332
324
333−#: qml/Shell.qml:344
325+#: qml/Shell.qml:350
334msgid "Enter passcode"
326msgid "Enter passcode"
335msgstr "Ange lösenkod"
327msgstr "Ange lösenkod"
336
328
337−#: qml/Shell.qml:345
329+#: qml/Shell.qml:351
338msgid "Sorry, incorrect passcode"
330msgid "Sorry, incorrect passcode"
339msgstr "Felaktig lösenkod"
331msgstr "Felaktig lösenkod"
340
332
341−#: qml/Shell.qml:348
333+#: qml/Shell.qml:354
342#, qt-format
334#, qt-format
343msgid "Enter %1"
335msgid "Enter %1"
344msgstr "Ange %1"
336msgstr "Ange %1"
345
337
346−#: qml/Shell.qml:349
338+#: qml/Shell.qml:355
347#, qt-format
339#, qt-format
348msgid "Sorry, incorrect %1"
340msgid "Sorry, incorrect %1"
349msgstr "Felaktig %1"
341msgstr "Felaktig %1"
350
342
351−#: qml/Shell.qml:384
343+#: qml/Shell.qml:390
352msgid "Sorry, incorrect passphrase."
344msgid "Sorry, incorrect passphrase."
353msgstr "Felaktig lösenfras."
345msgstr "Felaktig lösenfras."
354
346
355−#: qml/Shell.qml:385
347+#: qml/Shell.qml:391
356msgid "Sorry, incorrect passcode."
348msgid "Sorry, incorrect passcode."
357msgstr "Felaktig lösenkod."
349msgstr "Felaktig lösenkod."
358
350
359−#: qml/Shell.qml:386
351+#: qml/Shell.qml:392
360msgid "This will be your last attempt."
352msgid "This will be your last attempt."
361msgstr "Detta är ditt sista försök."
353msgstr "Detta är ditt sista försök."
362
354
363−#: qml/Shell.qml:388
355+#: qml/Shell.qml:394
364msgid ""
356msgid ""
365"If passphrase is entered incorrectly, your phone will conduct a factory "
357"If passphrase is entered incorrectly, your phone will conduct a factory "
366"reset and all personal data will be deleted."
358"reset and all personal data will be deleted."
@@ -368,7 +360,7 @@ msgstr ""
368"Om lösenfrasen anges inkorrekt kommer telefonen att fabrikåterställas och "
360"Om lösenfrasen anges inkorrekt kommer telefonen att fabrikåterställas och "
369"all personlig data kommer att tas bort."
361"all personlig data kommer att tas bort."
370
362
371−#: qml/Shell.qml:389
363+#: qml/Shell.qml:395
372msgid ""
364msgid ""
373"If passcode is entered incorrectly, your phone will conduct a factory reset "
365"If passcode is entered incorrectly, your phone will conduct a factory reset "
374"and all personal data will be deleted."
366"and all personal data will be deleted."
@@ -376,28 +368,8 @@ msgstr ""
376"Om lösenkoden anges felaktigt kommer telefonen att fabrikåterställas och all "
368"Om lösenkoden anges felaktigt kommer telefonen att fabrikåterställas och all "
377"personlig data kommer att tas bort."
369"personlig data kommer att tas bort."
378
370
379−#, qt-format
380−#~ msgid "Hello %1"
381−#~ msgstr "Hej %1"
382−
383−#~ msgid "Hello"
384−#~ msgstr "Hej"
385−
386−#~ msgid "Swipe to unlock"
387−#~ msgstr "Svep för att låsa upp"
388−
389−#~ msgid "Please wait"
390−#~ msgstr "Var god vänta"
391−
392−#, qt-format
393−#~ msgid "Enter your %1"
371+#~ msgid "Enter SIM PIN"
394−#~ msgstr "Skriv in din %1"
395−
396−#~ msgid "Too many incorrect attempts"
397−#~ msgstr "För många felaktiga försök"
398−
399−#~ msgid "Enter your passphrase"
400−#~ msgstr "Ange din lösenfras"
372+#~ msgstr "Ange SIM PIN-kod"
401
373
402−#~ msgid "Enter your passcode"
374+#~ msgid "Sorry, incorrect PIN"
403−#~ msgstr "Ange din lösenkod"
375+#~ msgstr "Felaktig PIN"
po/sw.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-14 19:28+0000\n"
11"PO-Revision-Date: 2014-01-14 19:28+0000\n"
12"Last-Translator: Damas <Unknown>\n"
12"Last-Translator: Damas <Unknown>\n"
13"Language-Team: Swahili <sw@li.org>\n"
13"Language-Team: Swahili <sw@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:36+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "Tafuta"
174msgstr "Tafuta"
@@ -257,18 +257,10 @@ msgstr ""
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr ""
258msgstr ""
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/ta.po+20−35
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20"Language: ta\n"
20"Language: ta\n"
21
21
@@ -155,23 +155,23 @@ msgid ""
155"phone<br><br>Tap on the screen to start"
155"phone<br><br>Tap on the screen to start"
156msgstr ""
156msgstr ""
157
157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159msgid "Emergency Call"
159msgid "Emergency Call"
160msgstr "அவசர அழைப்பு"
160msgstr "அவசர அழைப்பு"
161
161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163msgid "OK"
163msgid "OK"
164msgstr ""
164msgstr ""
165
165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167msgid "See less"
167msgid "See less"
168msgstr ""
168msgstr ""
169
169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171msgid "See all"
171msgid "See all"
172msgstr ""
172msgstr ""
173
173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175#: qml/Panel/SearchIndicator.qml:27
175#: qml/Panel/SearchIndicator.qml:27
176msgid "Search"
176msgid "Search"
177msgstr "தெடு"
177msgstr "தெடு"
@@ -260,18 +260,10 @@ msgstr "இப்பொது பேசு..."
260msgid "Speaking..."
260msgid "Speaking..."
261msgstr "பேசுகிறது..."
261msgstr "பேசுகிறது..."
262
262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264msgid "Show password"
264msgid "Show password"
265msgstr ""
265msgstr ""
266
266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr ""
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr ""
274−
275#: qml/Panel/ActiveCallHint.qml:77
267#: qml/Panel/ActiveCallHint.qml:77
276msgid "Tap to return to call..."
268msgid "Tap to return to call..."
277msgstr ""
269msgstr ""
@@ -316,63 +308,56 @@ msgstr ""
316msgid "Roaming"
308msgid "Roaming"
317msgstr ""
309msgstr ""
318
310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320msgid "Enter passphrase"
312msgid "Enter passphrase"
321msgstr ""
313msgstr ""
322
314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324msgid "Sorry, incorrect passphrase"
316msgid "Sorry, incorrect passphrase"
325msgstr ""
317msgstr ""
326
318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328msgid "Please re-enter"
320msgid "Please re-enter"
329msgstr ""
321msgstr ""
330
322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332msgid "Enter passcode"
324msgid "Enter passcode"
333msgstr ""
325msgstr ""
334
326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336msgid "Sorry, incorrect passcode"
328msgid "Sorry, incorrect passcode"
337msgstr ""
329msgstr ""
338
330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340#, qt-format
332#, qt-format
341msgid "Enter %1"
333msgid "Enter %1"
342msgstr ""
334msgstr ""
343
335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345#, qt-format
337#, qt-format
346msgid "Sorry, incorrect %1"
338msgid "Sorry, incorrect %1"
347msgstr ""
339msgstr ""
348
340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350msgid "Sorry, incorrect passphrase."
342msgid "Sorry, incorrect passphrase."
351msgstr ""
343msgstr ""
352
344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354msgid "Sorry, incorrect passcode."
346msgid "Sorry, incorrect passcode."
355msgstr ""
347msgstr ""
356
348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358msgid "This will be your last attempt."
350msgid "This will be your last attempt."
359msgstr ""
351msgstr ""
360
352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362msgid ""
354msgid ""
363"If passphrase is entered incorrectly, your phone will conduct a factory "
355"If passphrase is entered incorrectly, your phone will conduct a factory "
364"reset and all personal data will be deleted."
356"reset and all personal data will be deleted."
365msgstr ""
357msgstr ""
366
358
367−#: qml/Shell.qml:389
359+#: qml/Shell.qml:395
368msgid ""
360msgid ""
369"If passcode is entered incorrectly, your phone will conduct a factory reset "
361"If passcode is entered incorrectly, your phone will conduct a factory reset "
370"and all personal data will be deleted."
362"and all personal data will be deleted."
371msgstr ""
363msgstr ""
372−
373−#, qt-format
374−#~ msgid "Hello %1"
375−#~ msgstr "வணக்கம் %1"
376−
377−#~ msgid "Hello"
378−#~ msgstr "வணக்கம்"
po/te.po+20−38
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
13"Language-Team: Telugu <te@li.org>\n"
13"Language-Team: Telugu <te@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "అత్యవసర పిలుపు"
157msgstr "అత్యవసర పిలుపు"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr "సరే"
161msgstr "సరే"
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "వెతుకు"
174msgstr "వెతుకు"
@@ -257,18 +257,10 @@ msgstr "ఇప్పుడు మాట్లాడండి..."
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "మాట్లాడుతున్నారు..."
258msgstr "మాట్లాడుతున్నారు..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr "సంకేతపదాన్ని చూపించు"
262msgstr "సంకేతపదాన్ని చూపించు"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,66 +305,56 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "హలో %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "హలో"
376−
377−#~ msgid "Swipe to unlock"
378−#~ msgstr "తాళంతీయుటకు గీకండి"
po/th.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-02 04:55+0000\n"
11"PO-Revision-Date: 2014-10-02 04:55+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Thai <th@li.org>\n"
13"Language-Team: Thai <th@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr ""
174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr ""
258msgstr ""
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/tr.po+22−46
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-07-16 17:58+0000\n"
11"PO-Revision-Date: 2014-07-16 17:58+0000\n"
12"Last-Translator: Volkan Gezer <Unknown>\n"
12"Last-Translator: Volkan Gezer <Unknown>\n"
13"Language-Team: Turkish <tr@li.org>\n"
13"Language-Team: Turkish <tr@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgstr ""
155"Kenar haraketlerini öğrendiniz ve telefonu kullanmaya "
155"Kenar haraketlerini öğrendiniz ve telefonu kullanmaya "
156"başlayabilirsiniz<br><br>Başlamak için ekrana dokunun"
156"başlayabilirsiniz<br><br>Başlamak için ekrana dokunun"
157
157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159msgid "Emergency Call"
159msgid "Emergency Call"
160msgstr "Acil Arama"
160msgstr "Acil Arama"
161
161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163msgid "OK"
163msgid "OK"
164msgstr "Tamam"
164msgstr "Tamam"
165
165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167msgid "See less"
167msgid "See less"
168msgstr "Daha azını gör"
168msgstr "Daha azını gör"
169
169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171msgid "See all"
171msgid "See all"
172msgstr "Tümünü gör"
172msgstr "Tümünü gör"
173
173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175#: qml/Panel/SearchIndicator.qml:27
175#: qml/Panel/SearchIndicator.qml:27
176msgid "Search"
176msgid "Search"
177msgstr "Ara"
177msgstr "Ara"
@@ -260,18 +260,10 @@ msgstr "Şimdi Konuşun..."
260msgid "Speaking..."
260msgid "Speaking..."
261msgstr "Konuşuyor..."
261msgstr "Konuşuyor..."
262
262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264msgid "Show password"
264msgid "Show password"
265msgstr "Parolayı göster"
265msgstr "Parolayı göster"
266
266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr ""
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "Üzgünüm, hatalı PIN"
274−
275#: qml/Panel/ActiveCallHint.qml:77
267#: qml/Panel/ActiveCallHint.qml:77
276msgid "Tap to return to call..."
268msgid "Tap to return to call..."
277msgstr ""
269msgstr ""
@@ -316,49 +308,49 @@ msgstr "SIM kilidini aç"
316msgid "Roaming"
308msgid "Roaming"
317msgstr ""
309msgstr ""
318
310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320msgid "Enter passphrase"
312msgid "Enter passphrase"
321msgstr ""
313msgstr ""
322
314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324msgid "Sorry, incorrect passphrase"
316msgid "Sorry, incorrect passphrase"
325msgstr "Üzgünüm, hatalı parola"
317msgstr "Üzgünüm, hatalı parola"
326
318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328msgid "Please re-enter"
320msgid "Please re-enter"
329msgstr ""
321msgstr ""
330
322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332msgid "Enter passcode"
324msgid "Enter passcode"
333msgstr ""
325msgstr ""
334
326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336msgid "Sorry, incorrect passcode"
328msgid "Sorry, incorrect passcode"
337msgstr "Üzgünüm, hatalı parola"
329msgstr "Üzgünüm, hatalı parola"
338
330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340#, qt-format
332#, qt-format
341msgid "Enter %1"
333msgid "Enter %1"
342msgstr ""
334msgstr ""
343
335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345#, qt-format
337#, qt-format
346msgid "Sorry, incorrect %1"
338msgid "Sorry, incorrect %1"
347msgstr "Üzgünüm, hatalı %1"
339msgstr "Üzgünüm, hatalı %1"
348
340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350msgid "Sorry, incorrect passphrase."
342msgid "Sorry, incorrect passphrase."
351msgstr "Üzgünüm, hatalı parola."
343msgstr "Üzgünüm, hatalı parola."
352
344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354msgid "Sorry, incorrect passcode."
346msgid "Sorry, incorrect passcode."
355msgstr "Üzgünüm, hatalı parola."
347msgstr "Üzgünüm, hatalı parola."
356
348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358msgid "This will be your last attempt."
350msgid "This will be your last attempt."
359msgstr "Bu son denemeniz olacak."
351msgstr "Bu son denemeniz olacak."
360
352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362msgid ""
354msgid ""
363"If passphrase is entered incorrectly, your phone will conduct a factory "
355"If passphrase is entered incorrectly, your phone will conduct a factory "
364"reset and all personal data will be deleted."
356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366"Eğer hatalı parola girilirse, telefonunuz fabrika ayarlarına dönecek ve tüm "
358"Eğer hatalı parola girilirse, telefonunuz fabrika ayarlarına dönecek ve tüm "
367"kişisel verileriniz silinecek."
359"kişisel verileriniz silinecek."
368
360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370msgid ""
362msgid ""
371"If passcode is entered incorrectly, your phone will conduct a factory reset "
363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372"and all personal data will be deleted."
364"and all personal data will be deleted."
@@ -374,21 +366,5 @@ msgstr ""
374"Eğer hatalı parola girilirse, telefonunuz fabrika ayarlarına dönecek ve tüm "
366"Eğer hatalı parola girilirse, telefonunuz fabrika ayarlarına dönecek ve tüm "
375"kişisel verileriniz silinecek."
367"kişisel verileriniz silinecek."
376
368
377−#~ msgid "Hello"
369+#~ msgid "Sorry, incorrect PIN"
378−#~ msgstr "Merhaba"
379−
380−#, qt-format
381−#~ msgid "Hello %1"
382−#~ msgstr "Merhaba %1"
383−
384−#~ msgid "Swipe to unlock"
385−#~ msgstr "Açmak için kaydırın"
386−
387−#~ msgid "Too many incorrect attempts"
388−#~ msgstr "Çok fazla hatalı deneme yaptınız"
370+#~ msgstr "Üzgünüm, hatalı PIN"
389−
390−#~ msgid "Enter your passphrase"
391−#~ msgstr "Parolanızı girin"
392−
393−#~ msgid "Enter your passcode"
394−#~ msgstr "Parolanızı girin"
po/ug.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-10-07 09:00+0000\n"
11"PO-Revision-Date: 2014-10-07 09:00+0000\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-08 07:39+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -155,23 +155,23 @@ msgstr ""
155"ئېكراننى چېكىپ باشلاڭ<br><br>سىز ھازىر گىرۋەك بارماق ئىشارەتلىرىنى ئىگىلەپ "
155"ئېكراننى چېكىپ باشلاڭ<br><br>سىز ھازىر گىرۋەك بارماق ئىشارەتلىرىنى ئىگىلەپ "
156"بولدىڭىز،ئەمدى تېلېفوننى ئىشلىتىشنى باشلىسىڭىز بولىدۇ"
156"بولدىڭىز،ئەمدى تېلېفوننى ئىشلىتىشنى باشلىسىڭىز بولىدۇ"
157
157
158−#: qml/Components/Lockscreen.qml:218
158+#: qml/Components/Lockscreen.qml:220
159msgid "Emergency Call"
159msgid "Emergency Call"
160msgstr "جىددىي تېلېفون"
160msgstr "جىددىي تېلېفون"
161
161
162−#: qml/Components/Lockscreen.qml:250
162+#: qml/Components/Lockscreen.qml:252
163msgid "OK"
163msgid "OK"
164msgstr "تامام"
164msgstr "تامام"
165
165
166−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
166+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
167msgid "See less"
167msgid "See less"
168msgstr "ئازراق كۆرۈش"
168msgstr "ئازراق كۆرۈش"
169
169
170−#: qml/Dash/GenericScopeView.qml:411
170+#: qml/Dash/GenericScopeView.qml:434
171msgid "See all"
171msgid "See all"
172msgstr "ھەممىنى كۆرۈش…"
172msgstr "ھەممىنى كۆرۈش…"
173
173
174−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
174+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
175#: qml/Panel/SearchIndicator.qml:27
175#: qml/Panel/SearchIndicator.qml:27
176msgid "Search"
176msgid "Search"
177msgstr "ئىزدە"
177msgstr "ئىزدە"
@@ -260,18 +260,10 @@ msgstr "ئەمدى سۆزلەڭ…"
260msgid "Speaking..."
260msgid "Speaking..."
261msgstr "سۆزلەۋاتىسىز…"
261msgstr "سۆزلەۋاتىسىز…"
262
262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:108
263+#: qml/Notifications/NotificationMenuItemFactory.qml:116
264msgid "Show password"
264msgid "Show password"
265msgstr "ئىم كۆرسەت"
265msgstr "ئىم كۆرسەت"
266
266
267−#: qml/Notifications/NotificationMenuItemFactory.qml:124
268−msgid "Enter SIM PIN"
269−msgstr "SIM نىڭ ئىمى(PIN) نى كىرگۈزۈڭ"
270−
271−#: qml/Notifications/NotificationMenuItemFactory.qml:125
272−msgid "Sorry, incorrect PIN"
273−msgstr "كەچۈرۈڭ، PIN توغرا ئەمەس"
274−
275#: qml/Panel/ActiveCallHint.qml:77
267#: qml/Panel/ActiveCallHint.qml:77
276msgid "Tap to return to call..."
268msgid "Tap to return to call..."
277msgstr "سۆزلىشىشكە قايتىش ئۈچۈن چېكىڭ…"
269msgstr "سۆزلىشىشكە قايتىش ئۈچۈن چېكىڭ…"
@@ -316,49 +308,49 @@ msgstr "SIM نى قۇلۇپسىزلاش"
316msgid "Roaming"
308msgid "Roaming"
317msgstr "كەزمە"
309msgstr "كەزمە"
318
310
319−#: qml/Shell.qml:340
311+#: qml/Shell.qml:346
320msgid "Enter passphrase"
312msgid "Enter passphrase"
321msgstr "ئىم كىرگۈزۈڭ"
313msgstr "ئىم كىرگۈزۈڭ"
322
314
323−#: qml/Shell.qml:341
315+#: qml/Shell.qml:347
324msgid "Sorry, incorrect passphrase"
316msgid "Sorry, incorrect passphrase"
325msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
317msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
326
318
327−#: qml/Shell.qml:342
319+#: qml/Shell.qml:348
328msgid "Please re-enter"
320msgid "Please re-enter"
329msgstr "قايتا كىرگۈزۈڭ"
321msgstr "قايتا كىرگۈزۈڭ"
330
322
331−#: qml/Shell.qml:344
323+#: qml/Shell.qml:350
332msgid "Enter passcode"
324msgid "Enter passcode"
333msgstr "ئىم كودى(passcode)نى كىرگۈزۈڭ"
325msgstr "ئىم كودى(passcode)نى كىرگۈزۈڭ"
334
326
335−#: qml/Shell.qml:345
327+#: qml/Shell.qml:351
336msgid "Sorry, incorrect passcode"
328msgid "Sorry, incorrect passcode"
337msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
329msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
338
330
339−#: qml/Shell.qml:348
331+#: qml/Shell.qml:354
340#, qt-format
332#, qt-format
341msgid "Enter %1"
333msgid "Enter %1"
342msgstr "%1 نى كىرگۈزۈڭ"
334msgstr "%1 نى كىرگۈزۈڭ"
343
335
344−#: qml/Shell.qml:349
336+#: qml/Shell.qml:355
345#, qt-format
337#, qt-format
346msgid "Sorry, incorrect %1"
338msgid "Sorry, incorrect %1"
347msgstr "كەچۈرۈڭ، %1 توغرا ئەمەس"
339msgstr "كەچۈرۈڭ، %1 توغرا ئەمەس"
348
340
349−#: qml/Shell.qml:384
341+#: qml/Shell.qml:390
350msgid "Sorry, incorrect passphrase."
342msgid "Sorry, incorrect passphrase."
351msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
343msgstr "كەچۈرۈڭ، ئىم توغرا ئەمەس"
352
344
353−#: qml/Shell.qml:385
345+#: qml/Shell.qml:391
354msgid "Sorry, incorrect passcode."
346msgid "Sorry, incorrect passcode."
355msgstr "كەچۈرۈڭ، ئىم كودى ئەمەس"
347msgstr "كەچۈرۈڭ، ئىم كودى ئەمەس"
356
348
357−#: qml/Shell.qml:386
349+#: qml/Shell.qml:392
358msgid "This will be your last attempt."
350msgid "This will be your last attempt."
359msgstr "بۇ سىزنىڭ ئەڭ ئاخىرقى پۇرسىتىڭىز"
351msgstr "بۇ سىزنىڭ ئەڭ ئاخىرقى پۇرسىتىڭىز"
360
352
361−#: qml/Shell.qml:388
353+#: qml/Shell.qml:394
362msgid ""
354msgid ""
363"If passphrase is entered incorrectly, your phone will conduct a factory "
355"If passphrase is entered incorrectly, your phone will conduct a factory "
364"reset and all personal data will be deleted."
356"reset and all personal data will be deleted."
@@ -366,7 +358,7 @@ msgstr ""
366"ئەگەر ئىم توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن چىققان "
358"ئەگەر ئىم توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن چىققان "
367"ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
359"ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
368
360
369−#: qml/Shell.qml:389
361+#: qml/Shell.qml:395
370msgid ""
362msgid ""
371"If passcode is entered incorrectly, your phone will conduct a factory reset "
363"If passcode is entered incorrectly, your phone will conduct a factory reset "
372"and all personal data will be deleted."
364"and all personal data will be deleted."
@@ -374,28 +366,8 @@ msgstr ""
374"ئەگەر ئىم كودى توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن "
366"ئەگەر ئىم كودى توغرا بولمىسا، تېلېفونىڭىز ئەسلىگە قايتۇرۇلۇپ، زاۋۇتتىن "
375"چىققان ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
367"چىققان ھالەتكە كېلىپ قالىدۇ. بارلىق مەزمۇنلار يوقىلىدۇ."
376
368
377−#, qt-format
369+#~ msgid "Enter SIM PIN"
378−#~ msgid "Hello %1"
370+#~ msgstr "SIM نىڭ ئىمى(PIN) نى كىرگۈزۈڭ"
379−#~ msgstr "سالام %1"
380−
381−#~ msgid "Swipe to unlock"
382−#~ msgstr "سىيرىسىڭىز قۇلۇپسىزلىنىدۇ"
383
371
384−#~ msgid "Hello"
372+#~ msgid "Sorry, incorrect PIN"
385−#~ msgstr "ئەسسالامۇئەلەيكۇم"
373+#~ msgstr "كەچۈرۈڭ، PIN توغرا ئەمەس"
386−
387−#~ msgid "Please wait"
388−#~ msgstr "سەل ساقلاڭ"
389−
390−#~ msgid "Enter your passphrase"
391−#~ msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
392−
393−#~ msgid "Enter your passcode"
394−#~ msgstr "ئىمىڭىزنى كىرگۈزۈڭ"
395−
396−#~ msgid "Too many incorrect attempts"
397−#~ msgstr "مەغلۇپ بولۇش سانى چەكتىن ئېشىپ كەتتى"
398−
399−#, qt-format
400−#~ msgid "Enter your %1"
401−#~ msgstr "%1 نى كىرگۈزۈڭ"
po/uk.po+27−55
@@ -7,8 +7,8 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11−"PO-Revision-Date: 2014-10-03 12:44+0000\n"
11+"PO-Revision-Date: 2014-10-08 12:02+0000\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
@@ -16,7 +16,7 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
19+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
20"X-Generator: Launchpad (build 17196)\n"
20"X-Generator: Launchpad (build 17196)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:130
22#: plugins/LightDM/Greeter.cpp:130
@@ -165,23 +165,23 @@ msgstr ""
165"Вами налаштовано дії у відповідь на дотики на краях екрана. Тепер телефоном "
165"Вами налаштовано дії у відповідь на дотики на краях екрана. Тепер телефоном "
166"можна користуватися.<br><br>Торкніться екрана, щоб розпочати."
166"можна користуватися.<br><br>Торкніться екрана, щоб розпочати."
167
167
168−#: qml/Components/Lockscreen.qml:218
168+#: qml/Components/Lockscreen.qml:220
169msgid "Emergency Call"
169msgid "Emergency Call"
170msgstr "Терміновий виклик"
170msgstr "Терміновий виклик"
171
171
172−#: qml/Components/Lockscreen.qml:250
172+#: qml/Components/Lockscreen.qml:252
173msgid "OK"
173msgid "OK"
174msgstr "Гаразд"
174msgstr "Гаразд"
175
175
176−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
176+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
177msgid "See less"
177msgid "See less"
178msgstr "Стисліше"
178msgstr "Стисліше"
179
179
180−#: qml/Dash/GenericScopeView.qml:411
180+#: qml/Dash/GenericScopeView.qml:434
181msgid "See all"
181msgid "See all"
182msgstr "Детальніше"
182msgstr "Детальніше"
183
183
184−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
184+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
185#: qml/Panel/SearchIndicator.qml:27
185#: qml/Panel/SearchIndicator.qml:27
186msgid "Search"
186msgid "Search"
187msgstr "Пошук"
187msgstr "Пошук"
@@ -220,11 +220,11 @@ msgstr "Надіслати"
220
220
221#: qml/Dash/PullToRefreshScopeStyle.qml:55
221#: qml/Dash/PullToRefreshScopeStyle.qml:55
222msgid "Pull to refresh…"
222msgid "Pull to refresh…"
223−msgstr ""
223+msgstr "Потягніть для оновлення…"
224
224
225#: qml/Dash/PullToRefreshScopeStyle.qml:60
225#: qml/Dash/PullToRefreshScopeStyle.qml:60
226msgid "Release to refresh…"
226msgid "Release to refresh…"
227−msgstr ""
227+msgstr "Відпустіть для оновлення…"
228
228
229#: qml/Dash/ScopesOverview.qml:206
229#: qml/Dash/ScopesOverview.qml:206
230msgid "Manage Scopes"
230msgid "Manage Scopes"
@@ -270,18 +270,10 @@ msgstr "Можна говорити…"
270msgid "Speaking..."
270msgid "Speaking..."
271msgstr "Мовлення…"
271msgstr "Мовлення…"
272
272
273−#: qml/Notifications/NotificationMenuItemFactory.qml:108
273+#: qml/Notifications/NotificationMenuItemFactory.qml:116
274msgid "Show password"
274msgid "Show password"
275msgstr "Показати пароль"
275msgstr "Показати пароль"
276
276
277−#: qml/Notifications/NotificationMenuItemFactory.qml:124
278−msgid "Enter SIM PIN"
279−msgstr "Введіть PIN-код SIM-картки"
280−
281−#: qml/Notifications/NotificationMenuItemFactory.qml:125
282−msgid "Sorry, incorrect PIN"
283−msgstr "Вибачте, помилковий PIN-код"
284−
285#: qml/Panel/ActiveCallHint.qml:77
277#: qml/Panel/ActiveCallHint.qml:77
286msgid "Tap to return to call..."
278msgid "Tap to return to call..."
287msgstr "Торкніться, щоб повернутися до дзвінка…"
279msgstr "Торкніться, щоб повернутися до дзвінка…"
@@ -326,49 +318,49 @@ msgstr "Розблокувати SIM"
326msgid "Roaming"
318msgid "Roaming"
327msgstr "Роумінг"
319msgstr "Роумінг"
328
320
329−#: qml/Shell.qml:340
321+#: qml/Shell.qml:346
330msgid "Enter passphrase"
322msgid "Enter passphrase"
331msgstr "Введіть пароль"
323msgstr "Введіть пароль"
332
324
333−#: qml/Shell.qml:341
325+#: qml/Shell.qml:347
334msgid "Sorry, incorrect passphrase"
326msgid "Sorry, incorrect passphrase"
335msgstr "Вибачте, помилковий пароль"
327msgstr "Вибачте, помилковий пароль"
336
328
337−#: qml/Shell.qml:342
329+#: qml/Shell.qml:348
338msgid "Please re-enter"
330msgid "Please re-enter"
339msgstr "Ввведіть ще раз"
331msgstr "Ввведіть ще раз"
340
332
341−#: qml/Shell.qml:344
333+#: qml/Shell.qml:350
342msgid "Enter passcode"
334msgid "Enter passcode"
343msgstr "Введіть код"
335msgstr "Введіть код"
344
336
345−#: qml/Shell.qml:345
337+#: qml/Shell.qml:351
346msgid "Sorry, incorrect passcode"
338msgid "Sorry, incorrect passcode"
347msgstr "Вибачте, помилковий код-пароль"
339msgstr "Вибачте, помилковий код-пароль"
348
340
349−#: qml/Shell.qml:348
341+#: qml/Shell.qml:354
350#, qt-format
342#, qt-format
351msgid "Enter %1"
343msgid "Enter %1"
352msgstr "Введіть %1"
344msgstr "Введіть %1"
353
345
354−#: qml/Shell.qml:349
346+#: qml/Shell.qml:355
355#, qt-format
347#, qt-format
356msgid "Sorry, incorrect %1"
348msgid "Sorry, incorrect %1"
357msgstr "Вибачте, помилковий %1"
349msgstr "Вибачте, помилковий %1"
358
350
359−#: qml/Shell.qml:384
351+#: qml/Shell.qml:390
360msgid "Sorry, incorrect passphrase."
352msgid "Sorry, incorrect passphrase."
361msgstr "Вибачте, помилковий пароль."
353msgstr "Вибачте, помилковий пароль."
362
354
363−#: qml/Shell.qml:385
355+#: qml/Shell.qml:391
364msgid "Sorry, incorrect passcode."
356msgid "Sorry, incorrect passcode."
365msgstr "Вибачте, помилковий код-пароль."
357msgstr "Вибачте, помилковий код-пароль."
366
358
367−#: qml/Shell.qml:386
359+#: qml/Shell.qml:392
368msgid "This will be your last attempt."
360msgid "This will be your last attempt."
369msgstr "Ця спроба буде останньою."
361msgstr "Ця спроба буде останньою."
370
362
371−#: qml/Shell.qml:388
363+#: qml/Shell.qml:394
372msgid ""
364msgid ""
373"If passphrase is entered incorrectly, your phone will conduct a factory "
365"If passphrase is entered incorrectly, your phone will conduct a factory "
374"reset and all personal data will be deleted."
366"reset and all personal data will be deleted."
@@ -376,7 +368,7 @@ msgstr ""
376"Якщо пароль буде вказано неправильно, телефон повернеться до початкового "
368"Якщо пароль буде вказано неправильно, телефон повернеться до початкового "
377"стану, усі особисті дані буде вилучено."
369"стану, усі особисті дані буде вилучено."
378
370
379−#: qml/Shell.qml:389
371+#: qml/Shell.qml:395
380msgid ""
372msgid ""
381"If passcode is entered incorrectly, your phone will conduct a factory reset "
373"If passcode is entered incorrectly, your phone will conduct a factory reset "
382"and all personal data will be deleted."
374"and all personal data will be deleted."
@@ -384,28 +376,8 @@ msgstr ""
384"Якщо код-пароль буде вказано неправильно, телефон повернеться до початкового "
376"Якщо код-пароль буде вказано неправильно, телефон повернеться до початкового "
385"стану, усі особисті дані буде вилучено."
377"стану, усі особисті дані буде вилучено."
386
378
387−#, qt-format
379+#~ msgid "Sorry, incorrect PIN"
388−#~ msgid "Hello %1"
380+#~ msgstr "Вибачте, помилковий PIN-код"
389−#~ msgstr "Привіт, %1"
390−
391−#~ msgid "Hello"
392−#~ msgstr "Привіт!"
393−
394−#~ msgid "Swipe to unlock"
395−#~ msgstr "Проведіть пальцем, щоб розблокувати"
396−
397−#~ msgid "Please wait"
398−#~ msgstr "Будь ласка, зачекайте"
399−
400−#~ msgid "Too many incorrect attempts"
401−#~ msgstr "Забагато помилкових спроб"
402−
403−#, qt-format
404−#~ msgid "Enter your %1"
405−#~ msgstr "Вкажіть ваш %1"
406−
407−#~ msgid "Enter your passphrase"
408−#~ msgstr "Введіть ваш пароль"
409
381
410−#~ msgid "Enter your passcode"
382+#~ msgid "Enter SIM PIN"
411−#~ msgstr "Введіть ваш код-пароль"
383+#~ msgstr "Введіть PIN-код SIM-картки"
po/vi.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr ""
174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr ""
258msgstr ""
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/xh.po+20−28
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr ""
153msgstr ""
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr ""
157msgstr ""
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr ""
161msgstr ""
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr ""
165msgstr ""
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr ""
174msgstr ""
@@ -257,18 +257,10 @@ msgstr ""
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr ""
258msgstr ""
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr ""
262msgstr ""
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr ""
266msgstr ""
@@ -313,55 +305,55 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
po/zh_CN.po+20−38
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-08-12 14:09+0000\n"
11"PO-Revision-Date: 2014-08-12 14:09+0000\n"
12"Last-Translator: Anthony Wong <anthony.wong@ubuntu.com>\n"
12"Last-Translator: Anthony Wong <anthony.wong@ubuntu.com>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr "您现在已经掌握了边缘滑动手势,可以开始使用手机了<br><br>请点击屏幕开始使用"
153msgstr "您现在已经掌握了边缘滑动手势,可以开始使用手机了<br><br>请点击屏幕开始使用"
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "紧急电话"
157msgstr "紧急电话"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr "确定"
161msgstr "确定"
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr "显示更少"
165msgstr "显示更少"
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr "查看全部"
169msgstr "查看全部"
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "搜索"
174msgstr "搜索"
@@ -257,18 +257,10 @@ msgstr "现在请讲..."
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "讲话中..."
258msgstr "讲话中..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr "显示密码"
262msgstr "显示密码"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr "点击回到通话..."
266msgstr "点击回到通话..."
@@ -313,66 +305,56 @@ msgstr "解开 SIM"
313msgid "Roaming"
305msgid "Roaming"
314msgstr "漫游"
306msgstr "漫游"
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "你好,%1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "你好"
376−
377−#~ msgid "Swipe to unlock"
378−#~ msgstr "滑动解锁"
po/zh_HK.po+20−38
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-08-10 11:45+0000\n"
11"PO-Revision-Date: 2014-08-10 11:45+0000\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -152,23 +152,23 @@ msgid ""
152"phone<br><br>Tap on the screen to start"
152"phone<br><br>Tap on the screen to start"
153msgstr "您現在已熟練邊緣手勢,可以開始使用手機了<br><br>輕觸螢幕開始使用"
153msgstr "您現在已熟練邊緣手勢,可以開始使用手機了<br><br>輕觸螢幕開始使用"
154
154
155−#: qml/Components/Lockscreen.qml:218
155+#: qml/Components/Lockscreen.qml:220
156msgid "Emergency Call"
156msgid "Emergency Call"
157msgstr "緊急電話"
157msgstr "緊急電話"
158
158
159−#: qml/Components/Lockscreen.qml:250
159+#: qml/Components/Lockscreen.qml:252
160msgid "OK"
160msgid "OK"
161msgstr "確定"
161msgstr "確定"
162
162
163−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
163+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
164msgid "See less"
164msgid "See less"
165msgstr "縮減查看"
165msgstr "縮減查看"
166
166
167−#: qml/Dash/GenericScopeView.qml:411
167+#: qml/Dash/GenericScopeView.qml:434
168msgid "See all"
168msgid "See all"
169msgstr "查看全部"
169msgstr "查看全部"
170
170
171−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
171+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
172#: qml/Panel/SearchIndicator.qml:27
172#: qml/Panel/SearchIndicator.qml:27
173msgid "Search"
173msgid "Search"
174msgstr "搜尋"
174msgstr "搜尋"
@@ -257,18 +257,10 @@ msgstr "請講..."
257msgid "Speaking..."
257msgid "Speaking..."
258msgstr "正在講..."
258msgstr "正在講..."
259
259
260−#: qml/Notifications/NotificationMenuItemFactory.qml:108
260+#: qml/Notifications/NotificationMenuItemFactory.qml:116
261msgid "Show password"
261msgid "Show password"
262msgstr "顯示密碼"
262msgstr "顯示密碼"
263
263
264−#: qml/Notifications/NotificationMenuItemFactory.qml:124
265−msgid "Enter SIM PIN"
266−msgstr ""
267−
268−#: qml/Notifications/NotificationMenuItemFactory.qml:125
269−msgid "Sorry, incorrect PIN"
270−msgstr ""
271−
272#: qml/Panel/ActiveCallHint.qml:77
264#: qml/Panel/ActiveCallHint.qml:77
273msgid "Tap to return to call..."
265msgid "Tap to return to call..."
274msgstr "輕觸可返回通話…"
266msgstr "輕觸可返回通話…"
@@ -313,66 +305,56 @@ msgstr ""
313msgid "Roaming"
305msgid "Roaming"
314msgstr ""
306msgstr ""
315
307
316−#: qml/Shell.qml:340
308+#: qml/Shell.qml:346
317msgid "Enter passphrase"
309msgid "Enter passphrase"
318msgstr ""
310msgstr ""
319
311
320−#: qml/Shell.qml:341
312+#: qml/Shell.qml:347
321msgid "Sorry, incorrect passphrase"
313msgid "Sorry, incorrect passphrase"
322msgstr ""
314msgstr ""
323
315
324−#: qml/Shell.qml:342
316+#: qml/Shell.qml:348
325msgid "Please re-enter"
317msgid "Please re-enter"
326msgstr ""
318msgstr ""
327
319
328−#: qml/Shell.qml:344
320+#: qml/Shell.qml:350
329msgid "Enter passcode"
321msgid "Enter passcode"
330msgstr ""
322msgstr ""
331
323
332−#: qml/Shell.qml:345
324+#: qml/Shell.qml:351
333msgid "Sorry, incorrect passcode"
325msgid "Sorry, incorrect passcode"
334msgstr ""
326msgstr ""
335
327
336−#: qml/Shell.qml:348
328+#: qml/Shell.qml:354
337#, qt-format
329#, qt-format
338msgid "Enter %1"
330msgid "Enter %1"
339msgstr ""
331msgstr ""
340
332
341−#: qml/Shell.qml:349
333+#: qml/Shell.qml:355
342#, qt-format
334#, qt-format
343msgid "Sorry, incorrect %1"
335msgid "Sorry, incorrect %1"
344msgstr ""
336msgstr ""
345
337
346−#: qml/Shell.qml:384
338+#: qml/Shell.qml:390
347msgid "Sorry, incorrect passphrase."
339msgid "Sorry, incorrect passphrase."
348msgstr ""
340msgstr ""
349
341
350−#: qml/Shell.qml:385
342+#: qml/Shell.qml:391
351msgid "Sorry, incorrect passcode."
343msgid "Sorry, incorrect passcode."
352msgstr ""
344msgstr ""
353
345
354−#: qml/Shell.qml:386
346+#: qml/Shell.qml:392
355msgid "This will be your last attempt."
347msgid "This will be your last attempt."
356msgstr ""
348msgstr ""
357
349
358−#: qml/Shell.qml:388
350+#: qml/Shell.qml:394
359msgid ""
351msgid ""
360"If passphrase is entered incorrectly, your phone will conduct a factory "
352"If passphrase is entered incorrectly, your phone will conduct a factory "
361"reset and all personal data will be deleted."
353"reset and all personal data will be deleted."
362msgstr ""
354msgstr ""
363
355
364−#: qml/Shell.qml:389
356+#: qml/Shell.qml:395
365msgid ""
357msgid ""
366"If passcode is entered incorrectly, your phone will conduct a factory reset "
358"If passcode is entered incorrectly, your phone will conduct a factory reset "
367"and all personal data will be deleted."
359"and all personal data will be deleted."
368msgstr ""
360msgstr ""
369−
370−#, qt-format
371−#~ msgid "Hello %1"
372−#~ msgstr "您好 %1"
373−
374−#~ msgid "Hello"
375−#~ msgstr "您好"
376−
377−#~ msgid "Swipe to unlock"
378−#~ msgstr "滑動解除鎖定"
po/zh_TW.po+24−52
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-10-03 08:13-0400\n"
10+"POT-Creation-Date: 2014-10-07 11:37+0300\n"
11"PO-Revision-Date: 2014-07-26 16:21+0000\n"
11"PO-Revision-Date: 2014-07-26 16:21+0000\n"
12"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
12"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-10-07 06:59+0000\n"
18+"X-Launchpad-Export-Date: 2014-10-09 06:37+0000\n"
19"X-Generator: Launchpad (build 17196)\n"
19"X-Generator: Launchpad (build 17196)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:130
21#: plugins/LightDM/Greeter.cpp:130
@@ -151,23 +151,23 @@ msgid ""
151"phone<br><br>Tap on the screen to start"
151"phone<br><br>Tap on the screen to start"
152msgstr "您現在已熟練邊緣手勢,可以開始使用手機了<br><br>輕觸螢幕開始使用"
152msgstr "您現在已熟練邊緣手勢,可以開始使用手機了<br><br>輕觸螢幕開始使用"
153
153
154−#: qml/Components/Lockscreen.qml:218
154+#: qml/Components/Lockscreen.qml:220
155msgid "Emergency Call"
155msgid "Emergency Call"
156msgstr "緊急通話"
156msgstr "緊急通話"
157
157
158−#: qml/Components/Lockscreen.qml:250
158+#: qml/Components/Lockscreen.qml:252
159msgid "OK"
159msgid "OK"
160msgstr "確定"
160msgstr "確定"
161
161
162−#: qml/Dash/GenericScopeView.qml:411 qml/Dash/GenericScopeView.qml:568
162+#: qml/Dash/GenericScopeView.qml:434 qml/Dash/GenericScopeView.qml:591
163msgid "See less"
163msgid "See less"
164msgstr "縮減查看"
164msgstr "縮減查看"
165
165
166−#: qml/Dash/GenericScopeView.qml:411
166+#: qml/Dash/GenericScopeView.qml:434
167msgid "See all"
167msgid "See all"
168msgstr "查看全部"
168msgstr "查看全部"
169
169
170−#: qml/Dash/GenericScopeView.qml:473 qml/Dash/PageHeader.qml:258
170+#: qml/Dash/GenericScopeView.qml:496 qml/Dash/PageHeader.qml:258
171#: qml/Panel/SearchIndicator.qml:27
171#: qml/Panel/SearchIndicator.qml:27
172msgid "Search"
172msgid "Search"
173msgstr "搜尋"
173msgstr "搜尋"
@@ -256,18 +256,10 @@ msgstr "請說..."
256msgid "Speaking..."
256msgid "Speaking..."
257msgstr "說話中..."
257msgstr "說話中..."
258
258
259−#: qml/Notifications/NotificationMenuItemFactory.qml:108
259+#: qml/Notifications/NotificationMenuItemFactory.qml:116
260msgid "Show password"
260msgid "Show password"
261msgstr "顯示密碼"
261msgstr "顯示密碼"
262
262
263−#: qml/Notifications/NotificationMenuItemFactory.qml:124
264−msgid "Enter SIM PIN"
265−msgstr "輸入 SIM 卡 PIN 碼"
266−
267−#: qml/Notifications/NotificationMenuItemFactory.qml:125
268−msgid "Sorry, incorrect PIN"
269−msgstr "抱歉,PIN 碼不對"
270−
271#: qml/Panel/ActiveCallHint.qml:77
263#: qml/Panel/ActiveCallHint.qml:77
272msgid "Tap to return to call..."
264msgid "Tap to return to call..."
273msgstr "輕觸可返回通話…"
265msgstr "輕觸可返回通話…"
@@ -312,82 +304,62 @@ msgstr "為 SIM 卡解鎖"
312msgid "Roaming"
304msgid "Roaming"
313msgstr "漫遊"
305msgstr "漫遊"
314
306
315−#: qml/Shell.qml:340
307+#: qml/Shell.qml:346
316msgid "Enter passphrase"
308msgid "Enter passphrase"
317msgstr "輸入密語"
309msgstr "輸入密語"
318
310
319−#: qml/Shell.qml:341
311+#: qml/Shell.qml:347
320msgid "Sorry, incorrect passphrase"
312msgid "Sorry, incorrect passphrase"
321msgstr "抱歉,密語不對"
313msgstr "抱歉,密語不對"
322
314
323−#: qml/Shell.qml:342
315+#: qml/Shell.qml:348
324msgid "Please re-enter"
316msgid "Please re-enter"
325msgstr "請再輸入"
317msgstr "請再輸入"
326
318
327−#: qml/Shell.qml:344
319+#: qml/Shell.qml:350
328msgid "Enter passcode"
320msgid "Enter passcode"
329msgstr "輸入 passcode"
321msgstr "輸入 passcode"
330
322
331−#: qml/Shell.qml:345
323+#: qml/Shell.qml:351
332msgid "Sorry, incorrect passcode"
324msgid "Sorry, incorrect passcode"
333msgstr "抱歉,passcode 不對"
325msgstr "抱歉,passcode 不對"
334
326
335−#: qml/Shell.qml:348
327+#: qml/Shell.qml:354
336#, qt-format
328#, qt-format
337msgid "Enter %1"
329msgid "Enter %1"
338msgstr "輸入 %1"
330msgstr "輸入 %1"
339
331
340−#: qml/Shell.qml:349
332+#: qml/Shell.qml:355
341#, qt-format
333#, qt-format
342msgid "Sorry, incorrect %1"
334msgid "Sorry, incorrect %1"
343msgstr "抱歉,%1不對"
335msgstr "抱歉,%1不對"
344
336
345−#: qml/Shell.qml:384
337+#: qml/Shell.qml:390
346msgid "Sorry, incorrect passphrase."
338msgid "Sorry, incorrect passphrase."
347msgstr "抱歉,密語不對"
339msgstr "抱歉,密語不對"
348
340
349−#: qml/Shell.qml:385
341+#: qml/Shell.qml:391
350msgid "Sorry, incorrect passcode."
342msgid "Sorry, incorrect passcode."
351msgstr "抱歉,passcode 不對。"
343msgstr "抱歉,passcode 不對。"
352
344
353−#: qml/Shell.qml:386
345+#: qml/Shell.qml:392
354msgid "This will be your last attempt."
346msgid "This will be your last attempt."
355msgstr "這將會是您最後一次嘗試的機會。"
347msgstr "這將會是您最後一次嘗試的機會。"
356
348
357−#: qml/Shell.qml:388
349+#: qml/Shell.qml:394
358msgid ""
350msgid ""
359"If passphrase is entered incorrectly, your phone will conduct a factory "
351"If passphrase is entered incorrectly, your phone will conduct a factory "
360"reset and all personal data will be deleted."
352"reset and all personal data will be deleted."
361msgstr "如輸入的密語不對,本電話會進行重設,所有個人資料都會刪除。"
353msgstr "如輸入的密語不對,本電話會進行重設,所有個人資料都會刪除。"
362
354
363−#: qml/Shell.qml:389
355+#: qml/Shell.qml:395
364msgid ""
356msgid ""
365"If passcode is entered incorrectly, your phone will conduct a factory reset "
357"If passcode is entered incorrectly, your phone will conduct a factory reset "
366"and all personal data will be deleted."
358"and all personal data will be deleted."
367msgstr "如輸入的 passcode 不對,本電話會進行重設,所有個人資料都會刪除。"
359msgstr "如輸入的 passcode 不對,本電話會進行重設,所有個人資料都會刪除。"
368
360
369−#, qt-format
370−#~ msgid "Hello %1"
371−#~ msgstr "%1 您好"
372−
373−#~ msgid "Hello"
374−#~ msgstr "您好"
375−
376−#~ msgid "Swipe to unlock"
377−#~ msgstr "滑開解除鎖定"
378−
379−#~ msgid "Please wait"
380−#~ msgstr "請稍候"
381−
382−#, qt-format
383−#~ msgid "Enter your %1"
361+#~ msgid "Enter SIM PIN"
384−#~ msgstr "輸入您的 %1"
362+#~ msgstr "輸入 SIM 卡 PIN 碼"
385−
386−#~ msgid "Too many incorrect attempts"
387−#~ msgstr "錯得太多次"
388−
389−#~ msgid "Enter your passphrase"
390−#~ msgstr "輸入密語"
391
363
392−#~ msgid "Enter your passcode"
364+#~ msgid "Sorry, incorrect PIN"
393−#~ msgstr "輸入密碼"
365+#~ msgstr "抱歉,PIN 碼不對"
qml/Components/Carousel.qml+2−3
@@ -17,6 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import "carousel.js" as CarouselJS
19import "carousel.js" as CarouselJS
20+import "Flickables" as Flickables
20
21
21/*! The Carousel component presents the items of a model in a carousel view. It's similar to a
22/*! The Carousel component presents the items of a model in a carousel view. It's similar to a
22 cover flow. But it stops at it's boundaries (therefore no PathView is used).
23 cover flow. But it stops at it's boundaries (therefore no PathView is used).
@@ -63,7 +64,7 @@ Item {
63 and footer item to compensate that.
64 and footer item to compensate that.
64
65
65 The scaling of the items is controlled by the variable continuousIndex, described below. */
66 The scaling of the items is controlled by the variable continuousIndex, described below. */
66− ListView {
67+ Flickables.ListView {
67 id: listView
68 id: listView
68 objectName: "listView"
69 objectName: "listView"
69
70
@@ -135,8 +136,6 @@ Item {
135
136
136 boundsBehavior: Flickable.DragOverBounds
137 boundsBehavior: Flickable.DragOverBounds
137 cacheBuffer: carousel.cacheBuffer
138 cacheBuffer: carousel.cacheBuffer
138− flickDeceleration: Math.max(1500 * Math.pow(realWidth / referenceWidth, 1.5), 1500) // 1500 is platform default
139− maximumFlickVelocity: Math.max(2500 * Math.pow(realWidth / referenceWidth, 1.5), 2500) // 2500 is platform default
140 orientation: ListView.Horizontal
139 orientation: ListView.Horizontal
141
140
142 function getXFromContinuousIndex(index) {
141 function getXFromContinuousIndex(index) {
qml/Components/DragHandle.qml+2−2
@@ -47,12 +47,12 @@ EdgeDragArea {
47 id: dragArea
47 id: dragArea
48 objectName: "dragHandle"
48 objectName: "dragHandle"
49
49
50− // Disable most of the gesture recognition parameters by default when hinting is used as
50+ // Disable gesture recognition by default when hinting is used as
51 // it conflicts with the hinting idea.
51 // it conflicts with the hinting idea.
52− // The only part we keep in this situation is that it must be a single-finger gesture.
53 distanceThreshold: hintDisplacement > 0 ? 0 : defaultDistanceThreshold
52 distanceThreshold: hintDisplacement > 0 ? 0 : defaultDistanceThreshold
54 maxSilenceTime: hintDisplacement > 0 ? 60*60*1000 : defaultMaxSilenceTime
53 maxSilenceTime: hintDisplacement > 0 ? 60*60*1000 : defaultMaxSilenceTime
55 maxDeviation: hintDisplacement > 0 ? 999999 : defaultMaxDeviation
54 maxDeviation: hintDisplacement > 0 ? 999999 : defaultMaxDeviation
55+ compositionTime: hintDisplacement > 0 ? 0 : defaultCompositionTime
56
56
57 property bool stretch: false
57 property bool stretch: false
58
58
qml/Components/EdgeDragArea.qml+2
@@ -34,6 +34,7 @@ DirectionalDragArea {
34 distanceThreshold: defaultDistanceThreshold
34 distanceThreshold: defaultDistanceThreshold
35 minSpeed: defaultMinSpeed
35 minSpeed: defaultMinSpeed
36 maxSilenceTime: defaultMaxSilenceTime
36 maxSilenceTime: defaultMaxSilenceTime
37+ compositionTime: defaultCompositionTime
37
38
38 readonly property real defaultMaxDeviation: units.gu(3)
39 readonly property real defaultMaxDeviation: units.gu(3)
39 readonly property real defaultWideningAngle: 50
40 readonly property real defaultWideningAngle: 50
@@ -41,4 +42,5 @@ DirectionalDragArea {
41 // some people were getting false negatives with it enabled.
42 // some people were getting false negatives with it enabled.
42 readonly property real defaultMinSpeed: units.gu(0)
43 readonly property real defaultMinSpeed: units.gu(0)
43 readonly property int defaultMaxSilenceTime: 200
44 readonly property int defaultMaxSilenceTime: 200
45+ readonly property int defaultCompositionTime: 60
44}
46}
qml/Components/Flickables/Flickable.qmlnew file+23
@@ -0,0 +1,23 @@
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 as QtQuick
18+import Ubuntu.Components 1.1
19+
20+QtQuick.Flickable {
21+ flickDeceleration: 1500 * units.gridUnit / 8
22+ maximumFlickVelocity: 2500 * units.gridUnit / 8
23+}
qml/Components/Flickables/GridView.qmlnew file+25
@@ -0,0 +1,25 @@
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 as QtQuick
18+import Ubuntu.Components 1.1
19+
20+QtQuick.GridView {
21+ // Attached components and usages like GridView.onRemove are known not to work
22+ // please use GridView directly from QtQuick if needed
23+ flickDeceleration: 1500 * units.gridUnit / 8
24+ maximumFlickVelocity: 2500 * units.gridUnit / 8
25+}
qml/Components/Flickables/ListView.qmlnew file+25
@@ -0,0 +1,25 @@
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 as QtQuick
18+import Ubuntu.Components 1.1
19+
20+QtQuick.ListView {
21+ // Attached components and usages like ListView.onRemove are known not to work
22+ // please use ListView directly from QtQuick if needed
23+ flickDeceleration: 1500 * units.gridUnit / 8
24+ maximumFlickVelocity: 2500 * units.gridUnit / 8
25+}
qml/Components/Flickables/ListViewWithPageHeader.qmlnew file+23
@@ -0,0 +1,23 @@
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 Dash 0.1
18+import Ubuntu.Components 1.1
19+
20+ListViewWithPageHeader {
21+ flickDeceleration: 1500 * units.gridUnit / 8
22+ maximumFlickVelocity: 2500 * units.gridUnit / 8
23+}
qml/Components/InputMethod.qml+13
@@ -17,6 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Unity.Application 0.1
18import Unity.Application 0.1
19import Ubuntu.Components 0.1
19import Ubuntu.Components 0.1
20+import Ubuntu.Gestures 0.1
20
21
21Item {
22Item {
22 id: root
23 id: root
@@ -25,6 +26,18 @@ Item {
25
26
26 property int transitionDuration: UbuntuAnimation.FastDuration
27 property int transitionDuration: UbuntuAnimation.FastDuration
27
28
29+ Binding { target: surface; property: "z"; value: 0 }
30+
31+ TouchGate {
32+ x: UbuntuKeyboardInfo.x
33+ y: UbuntuKeyboardInfo.y
34+ z: 1
35+ width: UbuntuKeyboardInfo.width
36+ height: UbuntuKeyboardInfo.height
37+
38+ targetItem: root.surface
39+ }
40+
28 state: {
41 state: {
29 if (surface && surface.state != MirSurfaceItem.Minimized) {
42 if (surface && surface.state != MirSurfaceItem.Minimized) {
30 return "shown";
43 return "shown";
qml/Components/ListItems/Base.qmldeleted−125
@@ -1,125 +0,0 @@
1−/*
2− * Copyright (C) 2012 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−
20−AbstractButton {
21− id: emptyListItem
22− width: parent ? parent.width : units.gu(31)
23− height: body.height + bottomDividerLine.height
24−
25− /*!
26− \preliminary
27− Specifies whether the list item is selected.
28− */
29− property bool selected: false
30−
31− /*!
32− \preliminary
33− Highlight the list item when it is pressed.
34− This is used to disable the highlighting of the full list item
35− when custom highlighting needs to be implemented (for example in
36− ListItem.Standard which can have a split).
37− */
38− property bool highlightWhenPressed: true
39−
40− /*!
41− \preliminary
42− Set to show or hide the thin bottom divider line (drawn by the \l ThinDivider component).
43− This line is shown by default except in cases where this item is the delegate of a ListView.
44− */
45− property bool showDivider: __showDivider()
46−
47− /*!
48− \internal
49− Method to automatically determine if the bottom divider line should be drawn.
50− This always returns true, unless item is a delegate in a ListView. If in a ListView
51− it will return false only when:
52− + if this is the final item in the list, and ListView.footer is set (again as thin
53− divider line won't look well with footer below it)
54− */
55− function __showDivider() {
56− // if we're not in ListView, always show a thin dividing line at the bottom
57− var model = null;
58− if (typeof ListViewWithPageHeader !== 'undefined') {
59− if (typeof ListViewWithPageHeader.model !== 'undefined') {
60− model = ListViewWithPageHeader.model;
61− }
62− } else if (ListView.view !== null) {
63− model = ListView.view.model;
64− }
65− // if we're last item in ListView don't show divider
66− if (model && index === model.count - 1) return false;
67−
68− return true;
69− }
70−
71− /* Relevant really only for ListViewWithPageHeader case: specify how many pixels we can overlap with the section header */
72− readonly property int allowedOverlap: units.dp(1)
73−
74− property real __heightToClip: {
75− // Check this is in position where clipping is needed
76− if (typeof ListViewWithPageHeader !== 'undefined') {
77− if (typeof heightToClip !== 'undefined') {
78− if (heightToClip >= allowedOverlap) {
79− return heightToClip - allowedOverlap;
80− }
81− }
82− }
83− return 0;
84− }
85−
86− /*!
87− \internal
88− Reparent so that the visuals of the children does not
89− occlude the bottom divider line.
90− */
91− default property alias children: body.children
92−
93− Item {
94− id: clippingContainer
95− height: parent.height - __heightToClip
96− anchors { left: parent.left; right: parent.right; bottom: parent.bottom }
97− clip: __heightToClip > 0
98−
99− Item {
100− id: body
101− anchors {
102− left: parent.left
103− right: parent.right
104− bottom: bottomDividerLine.top
105− }
106− height: childrenRect.height
107− }
108−
109− ThinDivider {
110− id: bottomDividerLine
111− anchors.bottom: parent.bottom
112− visible: showDivider
113− }
114−
115− Highlight {
116− anchors {
117− top: parent.top
118− left: parent.left
119− right: parent.right
120− bottom: bottomDividerLine.top
121− }
122− pressed: (emptyListItem.selected || (emptyListItem.highlightWhenPressed && emptyListItem.pressed)) ? "pressed" : ""
123− }
124− }
125−}
qml/Components/ListItems/Highlight.qmldeleted−46
@@ -1,46 +0,0 @@
1−/*
2− * Copyright (C) 2013 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−
19−Rectangle {
20− id: highlight
21−
22− property bool pressed: false
23− property real pressedOpacity: 0.3
24−
25− color: "black"
26− opacity: 0
27− state: pressed ? "pressed" : ""
28− states: [
29− State {
30− name: "pressed"
31− PropertyChanges { target: highlight; opacity: pressedOpacity}
32− }
33− ]
34− transitions: [
35− Transition {
36− from: ""
37− to: "pressed"
38− NumberAnimation { target: highlight; property: "opacity"; duration: 50}
39− },
40− Transition {
41− from: "pressed"
42− to: ""
43− NumberAnimation { target: highlight; property: "opacity"; duration: 100}
44− }
45− ]
46−}
qml/Components/PinLockscreen.qml+1
@@ -114,6 +114,7 @@ Column {
114 horizontalAlignment: Text.AlignHCenter
114 horizontalAlignment: Text.AlignHCenter
115 text: root.errorText
115 text: root.errorText
116 visible: pinentryField.incorrectOverride
116 visible: pinentryField.incorrectOverride
117+ scale: Math.min(1, parent.width / width)
117 }
118 }
118
119
119 AbstractButton {
120 AbstractButton {
qml/Components/ResponsiveGridView.qml+2−1
@@ -16,6 +16,7 @@
16
16
17import QtQuick 2.3
17import QtQuick 2.3
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19+import "Flickables" as Flickables
19
20
20/*
21/*
21 Essentially a GridView where you can specify the maximum number of columns it can have.
22 Essentially a GridView where you can specify the maximum number of columns it can have.
@@ -55,7 +56,7 @@ Item {
55 return rows * height
56 return rows * height
56 }
57 }
57
58
58− GridView {
59+ Flickables.GridView {
59 id: gridView
60 id: gridView
60 objectName: "responsiveGridViewGrid"
61 objectName: "responsiveGridViewGrid"
61 anchors {
62 anchors {
qml/Components/ResponsiveVerticalJournal.qml+3−2
@@ -47,7 +47,9 @@ Item {
47 property alias delegate: verticalJournalView.delegate
47 property alias delegate: verticalJournalView.delegate
48 property alias displayMarginBeginning: verticalJournalView.displayMarginBeginning
48 property alias displayMarginBeginning: verticalJournalView.displayMarginBeginning
49 property alias displayMarginEnd: verticalJournalView.displayMarginEnd
49 property alias displayMarginEnd: verticalJournalView.displayMarginEnd
50+
50− implicitHeight: verticalJournalView.implicitHeight
51+ implicitHeight: verticalJournalView.implicitHeight + rowSpacing
52+ clip: height < implicitHeight
51
53
52 VerticalJournal {
54 VerticalJournal {
53 id: verticalJournalView
55 id: verticalJournalView
@@ -59,7 +61,6 @@ Item {
59 topMargin: rowSpacing / 2
61 topMargin: rowSpacing / 2
60 bottomMargin: rowSpacing / 2
62 bottomMargin: rowSpacing / 2
61 }
63 }
62− clip: parent.height != implicitHeight
63
64
64 function px2gu(pixels) {
65 function px2gu(pixels) {
65 return Math.floor(pixels / units.gu(1))
66 return Math.floor(pixels / units.gu(1))
qml/Components/ZoomableImage.qml+2−2
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19−import "../Components"
19+import "Flickables" as Flickables
20
20
21/*! \brief Zoomable for image.
21/*! \brief Zoomable for image.
22
22
@@ -32,7 +32,7 @@ Item {
32 property alias scaleTo: lazyImage.scaleTo
32 property alias scaleTo: lazyImage.scaleTo
33 property alias asynchronous: lazyImage.asynchronous
33 property alias asynchronous: lazyImage.asynchronous
34
34
35− Flickable {
35+ Flickables.Flickable {
36 id: flickable
36 id: flickable
37 objectName: "flickable"
37 objectName: "flickable"
38 clip: true
38 clip: true
qml/Dash/CardHorizontalList.qml+2−1
@@ -17,6 +17,7 @@
17import QtQuick 2.2
17import QtQuick 2.2
18import Ubuntu.Components 1.1
18import Ubuntu.Components 1.1
19import "../Components"
19import "../Components"
20+import "../Components/Flickables" as Flickables
20
21
21DashRenderer {
22DashRenderer {
22 id: root
23 id: root
@@ -25,7 +26,7 @@ DashRenderer {
25 collapsedHeight: expandedHeight
26 collapsedHeight: expandedHeight
26 clip: true
27 clip: true
27
28
28− ListView {
29+ Flickables.ListView {
29 id: listView
30 id: listView
30 anchors {
31 anchors {
31 fill: parent
32 fill: parent
qml/Dash/Dash.qml+32−11
@@ -29,7 +29,6 @@ Showable {
29 visible: shown
29 visible: shown
30
30
31 property string showScopeOnLoaded: "clickscope"
31 property string showScopeOnLoaded: "clickscope"
32− property real contentScale: 1.0
33
32
34 DashCommunicatorService {
33 DashCommunicatorService {
35 objectName: "dashCommunicatorService"
34 objectName: "dashCommunicatorService"
@@ -41,8 +40,9 @@ Showable {
41 if (window.active) {
40 if (window.active) {
42 dashContentCache.scheduleUpdate();
41 dashContentCache.scheduleUpdate();
43 }
42 }
44− overviewController.enableAnimation = window.active;
43+ overviewController.enableAnimation = window.active && !scopesOverview.showingNonFavoriteScope;
45 overviewController.progress = 0;
44 overviewController.progress = 0;
45+ scopesOverview.closeTempScope();
46 }
46 }
47 }
47 }
48 }
48 }
@@ -190,7 +190,6 @@ Showable {
190 dash.showScopeOnLoaded = ""
190 dash.showScopeOnLoaded = ""
191 }
191 }
192 }
192 }
193− scale: dash.contentScale
194 clip: scale != 1.0 || scopeItem.visible || overviewController.progress != 0
193 clip: scale != 1.0 || scopeItem.visible || overviewController.progress != 0
195 Behavior on x {
194 Behavior on x {
196 UbuntuNumberAnimation {
195 UbuntuNumberAnimation {
@@ -208,6 +207,12 @@ Showable {
208 }
207 }
209 }
208 }
210
209
210+ // This is to avoid the situation where a bottom-edge swipe would bring up the dash overview
211+ // (as expected) but would also cause the dash content flickable to move a bit, because
212+ // that flickable was getting the touch events while overviewDragHandle was still undecided
213+ // about whether that touch was indeed performing a directional drag gesture.
214+ forceNonInteractive: overviewDragHandle.status != DirectionalDragArea.WaitingForTouch
215+
211 enabled: overviewController.progress == 0
216 enabled: overviewController.progress == 0
212 opacity: enabled ? 1 : 0
217 opacity: enabled ? 1 : 0
213 }
218 }
@@ -245,7 +250,7 @@ Showable {
245 y: overviewController.progress == 0 ? dashContent.y : overviewProgressY
250 y: overviewController.progress == 0 ? dashContent.y : overviewProgressY
246 width: parent.width
251 width: parent.width
247 height: parent.height
252 height: parent.height
248− scale: dash.contentScale * overviewProgressScale
253+ scale: overviewProgressScale
249 enabled: opacity == 1
254 enabled: opacity == 1
250 opacity: 1 - overviewController.progress
255 opacity: 1 - overviewController.progress
251 clip: scale != 1.0
256 clip: scale != 1.0
@@ -364,16 +369,32 @@ Showable {
364 height: units.gu(2)
369 height: units.gu(2)
365
370
366 onSceneDistanceChanged: {
371 onSceneDistanceChanged: {
372+ if (status == DirectionalDragArea.Recognized && initialSceneDistance != -1) {
367− if (overviewController.enableAnimation) {
373+ if (overviewController.enableAnimation) {
368− dashContentCache.scheduleUpdate();
374+ dashContentCache.scheduleUpdate();
375+ }
376+ overviewController.enableAnimation = false;
377+ var deltaDistance = sceneDistance - initialSceneDistance;
378+ overviewController.progress = Math.max(0, Math.min(1, deltaDistance / fullMovement));
369 }
379 }
370− overviewController.enableAnimation = false;
371− overviewController.progress = Math.max(0, Math.min(1, sceneDistance / fullMovement));
372 }
380 }
373
381
374− onDraggingChanged: {
382+ property int previousStatus: -1
383+ property int currentStatus: DirectionalDragArea.WaitingForTouch
384+ property real initialSceneDistance: -1
385+
386+ onStatusChanged: {
387+ previousStatus = currentStatus;
388+ currentStatus = status;
389+
390+ if (status == DirectionalDragArea.Recognized) {
391+ initialSceneDistance = sceneDistance;
392+ } else if (status == DirectionalDragArea.WaitingForTouch &&
393+ previousStatus == DirectionalDragArea.Recognized) {
375− overviewController.enableAnimation = true;
394+ overviewController.enableAnimation = true;
376− overviewController.progress = (overviewController.progress > 0.7) ? 1 : 0;
395+ overviewController.progress = (overviewController.progress > 0.7) ? 1 : 0;
396+ initialSceneDistance = -1;
397+ }
377 }
398 }
378 }
399 }
379
400
qml/Dash/DashCategoryBase.qmlnew file+62
@@ -0,0 +1,62 @@
1+/*
2+ * Copyright (C) 2012-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+
20+Item {
21+ width: parent.width
22+ height: body.height
23+
24+ /* Relevant really only for ListViewWithPageHeader case: specify how many pixels we can overlap with the section header */
25+ readonly property int allowedOverlap: units.dp(1)
26+
27+ property real __heightToClip: {
28+ // Check this is in position where clipping is needed
29+ if (typeof ListViewWithPageHeader !== 'undefined') {
30+ if (typeof heightToClip !== 'undefined') {
31+ if (heightToClip >= allowedOverlap) {
32+ return heightToClip - allowedOverlap;
33+ }
34+ }
35+ }
36+ return 0;
37+ }
38+
39+ /*!
40+ \internal
41+ Reparent so that the visuals of the children does not
42+ occlude the bottom divider line.
43+ */
44+ default property alias children: body.children
45+
46+ Item {
47+ id: clippingContainer
48+ height: parent.height - __heightToClip
49+ anchors { left: parent.left; right: parent.right; bottom: parent.bottom }
50+ clip: __heightToClip > 0
51+
52+ Item {
53+ id: body
54+ anchors {
55+ left: parent.left
56+ right: parent.right
57+ bottom: parent.bottom
58+ }
59+ height: childrenRect.height
60+ }
61+ }
62+}
qml/Dash/DashContent.qml+6−4
@@ -19,10 +19,12 @@ import Ubuntu.Components 0.1
19import Unity 0.2
19import Unity 0.2
20import Utils 0.1
20import Utils 0.1
21import "../Components"
21import "../Components"
22+import "../Components/Flickables" as Flickables
22
23
23Item {
24Item {
24 id: dashContent
25 id: dashContent
25
26
27+ property bool forceNonInteractive: false
26 property alias scopes: dashContentList.model
28 property alias scopes: dashContentList.model
27 readonly property alias currentIndex: dashContentList.currentIndex
29 readonly property alias currentIndex: dashContentList.currentIndex
28 readonly property string currentScopeId: dashContentList.currentItem ? dashContentList.currentItem.scopeId : ""
30 readonly property string currentScopeId: dashContentList.currentItem ? dashContentList.currentItem.scopeId : ""
@@ -97,16 +99,15 @@ Item {
97 anchors.fill: parent
99 anchors.fill: parent
98 }
100 }
99
101
100− ListView {
102+ Flickables.ListView {
101 id: dashContentList
103 id: dashContentList
102 objectName: "dashContentList"
104 objectName: "dashContentList"
103
105
106+ interactive: !dashContent.forceNonInteractive && dashContent.scopes.loaded && currentItem
104− interactive: dashContent.scopes.loaded && currentItem && !currentItem.moving && !currentItem.navigationShown && !currentItem.subPageShown
107+ && !currentItem.moving && !currentItem.navigationShown && !currentItem.subPageShown
105 anchors.fill: parent
108 anchors.fill: parent
106 orientation: ListView.Horizontal
109 orientation: ListView.Horizontal
107 boundsBehavior: Flickable.DragAndOvershootBounds
110 boundsBehavior: Flickable.DragAndOvershootBounds
108− flickDeceleration: units.gu(625)
109− maximumFlickVelocity: width * 5
110 snapMode: ListView.SnapOneItem
111 snapMode: ListView.SnapOneItem
111 highlightMoveDuration: 250
112 highlightMoveDuration: 250
112 highlightRangeMode: ListView.StrictlyEnforceRange
113 highlightRangeMode: ListView.StrictlyEnforceRange
@@ -180,6 +181,7 @@ Item {
180 item.paginationCount = Qt.binding(function() { return dashContentList.count } )
181 item.paginationCount = Qt.binding(function() { return dashContentList.count } )
181 item.paginationIndex = Qt.binding(function() { return dashContentList.currentIndex } )
182 item.paginationIndex = Qt.binding(function() { return dashContentList.currentIndex } )
182 item.holdingList = dashContentList;
183 item.holdingList = dashContentList;
184+ item.forceNonInteractive = Qt.binding(function() { return dashContent.forceNonInteractive } )
183 }
185 }
184 Connections {
186 Connections {
185 target: isCurrent ? scope : null
187 target: isCurrent ? scope : null
qml/Dash/DashNavigationButton.qml+2−1
@@ -16,6 +16,7 @@
16
16
17import QtQuick 2.2
17import QtQuick 2.2
18import Ubuntu.Components 1.1
18import Ubuntu.Components 1.1
19+import "../Components/Flickables" as Flickables
19
20
20AbstractButton {
21AbstractButton {
21 id: root
22 id: root
@@ -75,7 +76,7 @@ AbstractButton {
75 }
76 }
76
77
77 // navigationListView is outside root
78 // navigationListView is outside root
78− ListView {
79+ Flickables.ListView {
79 id: navigationListView
80 id: navigationListView
80 objectName: "navigationListView"
81 objectName: "navigationListView"
81 visible: height > 0
82 visible: height > 0
qml/Dash/DashNavigationList.qml+2−1
@@ -17,6 +17,7 @@
17import QtQuick 2.2
17import QtQuick 2.2
18import Ubuntu.Components 1.1
18import Ubuntu.Components 1.1
19import "../Components"
19import "../Components"
20+import "../Components/Flickables" as Flickables
20
21
21Item {
22Item {
22 id: root
23 id: root
@@ -45,7 +46,7 @@ Item {
45 }
46 }
46 }
47 }
47
48
48− Flickable {
49+ Flickables.Flickable {
49 id: flickable
50 id: flickable
50
51
51 anchors.fill: parent
52 anchors.fill: parent
qml/Dash/DashRenderer.qml+2−2
@@ -17,9 +17,9 @@
17import QtQuick 2.0
17import QtQuick 2.0
18
18
19Item {
19Item {
20− property int collapsedHeight
20+ property real collapsedHeight
21
21
22− property int expandedHeight
22+ property real expandedHeight
23
23
24 property int collapsedItemCount: -1
24 property int collapsedItemCount: -1
25
25
qml/Dash/GenericScopeView.qml+4−4
@@ -26,6 +26,7 @@ FocusScope {
26 id: scopeView
26 id: scopeView
27
27
28 readonly property bool navigationShown: pageHeaderLoader.item ? pageHeaderLoader.item.bottomItem[0].openList : false
28 readonly property bool navigationShown: pageHeaderLoader.item ? pageHeaderLoader.item.bottomItem[0].openList : false
29+ property bool forceNonInteractive: false
29 property var scope: null
30 property var scope: null
30 property SortFilterProxyModel categories: categoryFilter
31 property SortFilterProxyModel categories: categoryFilter
31 property bool isCurrent: false
32 property bool isCurrent: false
@@ -149,6 +150,7 @@ FocusScope {
149 ScopeListView {
150 ScopeListView {
150 id: categoryView
151 id: categoryView
151 objectName: "categoryListView"
152 objectName: "categoryListView"
153+ interactive: !forceNonInteractive
152
154
153 x: subPageLoader.open ? -width : 0
155 x: subPageLoader.open ? -width : 0
154 visible: x != -width
156 visible: x != -width
@@ -210,11 +212,9 @@ FocusScope {
210 }
212 }
211 }
213 }
212
214
213− delegate: ListItems.Base {
215+ delegate: DashCategoryBase {
214 id: baseItem
216 id: baseItem
215 objectName: "dashCategory" + category
217 objectName: "dashCategory" + category
216− highlightWhenPressed: false
217− showDivider: false
218
218
219 property Item seeAllButton: seeAll
219 property Item seeAllButton: seeAll
220
220
@@ -237,7 +237,7 @@ FocusScope {
237 CardTool {
237 CardTool {
238 id: cardTool
238 id: cardTool
239 objectName: "cardTool"
239 objectName: "cardTool"
240− count: results.count
240+ count: results ? results.count : 0
241 template: model.renderer
241 template: model.renderer
242 components: model.components
242 components: model.components
243 viewWidth: parent.width
243 viewWidth: parent.width
qml/Dash/PageHeader.qml+2−1
@@ -21,6 +21,7 @@ import Ubuntu.Components.Popups 1.0
21import Ubuntu.Components.ListItems 1.0
21import Ubuntu.Components.ListItems 1.0
22import "../Components"
22import "../Components"
23import "../Components/SearchHistoryModel"
23import "../Components/SearchHistoryModel"
24+import "../Components/Flickables" as Flickables
24
25
25Item {
26Item {
26 id: root
27 id: root
@@ -127,7 +128,7 @@ Item {
127 }
128 }
128 }
129 }
129
130
130− Flickable {
131+ Flickables.Flickable {
131 id: headerContainer
132 id: headerContainer
132 objectName: "headerContainer"
133 objectName: "headerContainer"
133 clip: contentY < height
134 clip: contentY < height
qml/Dash/PreviewListView.qml+2−3
@@ -18,6 +18,7 @@ import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Unity 0.2
19import Unity 0.2
20import "../Components"
20import "../Components"
21+import "../Components/Flickables" as Flickables
21import "Previews" as Previews
22import "Previews" as Previews
22
23
23Item {
24Item {
@@ -52,7 +53,7 @@ Item {
52 onBackClicked: root.backClicked()
53 onBackClicked: root.backClicked()
53 }
54 }
54
55
55− ListView {
56+ Flickables.ListView {
56 id: previewListView
57 id: previewListView
57 objectName: "listView"
58 objectName: "listView"
58 anchors {
59 anchors {
@@ -66,8 +67,6 @@ Item {
66 snapMode: ListView.SnapOneItem
67 snapMode: ListView.SnapOneItem
67 boundsBehavior: Flickable.DragAndOvershootBounds
68 boundsBehavior: Flickable.DragAndOvershootBounds
68 highlightMoveDuration: 250
69 highlightMoveDuration: 250
69− flickDeceleration: units.gu(625)
70− maximumFlickVelocity: width * 5
71 cacheBuffer: 0
70 cacheBuffer: 0
72
71
73 property bool open: false
72 property bool open: false
qml/Dash/Previews/Preview.qml+2−1
@@ -16,6 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19+import "../../Components/Flickables" as Flickables
19
20
20/*! \brief This component constructs the Preview UI.
21/*! \brief This component constructs the Preview UI.
21 *
22 *
@@ -63,7 +64,7 @@ Item {
63 Repeater {
64 Repeater {
64 model: previewModel
65 model: previewModel
65
66
66− delegate: ListView {
67+ delegate: Flickables.ListView {
67 id: column
68 id: column
68 anchors { top: parent.top; bottom: parent.bottom }
69 anchors { top: parent.top; bottom: parent.bottom }
69 width: row.columnWidth
70 width: row.columnWidth
qml/Dash/Previews/PreviewImageGallery.qml+3−2
@@ -17,6 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 1.1
18import Ubuntu.Components 1.1
19import "../../Components"
19import "../../Components"
20+import "../../Components/Flickables" as Flickables
20
21
21/*! This preview widget shows a horizontal list of images.
22/*! This preview widget shows a horizontal list of images.
22 * The URIs for the images should be an array in widgetData["sources"].
23 * The URIs for the images should be an array in widgetData["sources"].
@@ -28,7 +29,7 @@ PreviewWidget {
28
29
29 property Item rootItem: QuickUtils.rootItem(root)
30 property Item rootItem: QuickUtils.rootItem(root)
30
31
31− ListView {
32+ Flickables.ListView {
32 id: previewImageListView
33 id: previewImageListView
33 objectName: "previewImageListView"
34 objectName: "previewImageListView"
34 spacing: units.gu(1)
35 spacing: units.gu(1)
@@ -102,7 +103,7 @@ PreviewWidget {
102 UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
103 UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
103 }
104 }
104
105
105− ListView {
106+ Flickables.ListView {
106 id: slideShowListView
107 id: slideShowListView
107 objectName: "slideShowListView"
108 objectName: "slideShowListView"
108 anchors.fill: parent
109 anchors.fill: parent
qml/Dash/Previews/PreviewTextSummary.qml+1−1
@@ -63,7 +63,7 @@ PreviewWidget {
63 lineHeight: 1.2
63 lineHeight: 1.2
64 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText
64 color: root.scopeStyle ? root.scopeStyle.foreground : Theme.palette.normal.baseText
65 opacity: .8
65 opacity: .8
66− text: widgetData["text"]
66+ text: widgetData["text"] || ""
67 wrapMode: Text.Wrap
67 wrapMode: Text.Wrap
68
68
69 Behavior on height {
69 Behavior on height {
qml/Dash/ScopeListView.qml+3−6
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -14,11 +14,8 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−import QtQuick 2.0
17+import "../Components/Flickables" as Flickables
18−import Dash 0.1
19
18
20−ListViewWithPageHeader {
19+Flickables.ListViewWithPageHeader {
21− maximumFlickVelocity: height * 10
22− flickDeceleration: height * 2
23 cacheBuffer: Number.MAX_VALUE
20 cacheBuffer: Number.MAX_VALUE
24}
21}
qml/Dash/ScopeSettingsPage.qml+2−1
@@ -18,6 +18,7 @@ import QtQuick 2.2
18import Ubuntu.Components 1.1
18import Ubuntu.Components 1.1
19import Unity 0.2
19import Unity 0.2
20import "../Components"
20import "../Components"
21+import "../Components/Flickables" as Flickables
21import "ScopeSettings"
22import "ScopeSettings"
22
23
23Item {
24Item {
@@ -39,7 +40,7 @@ Item {
39 onBackClicked: root.backClicked()
40 onBackClicked: root.backClicked()
40 }
41 }
41
42
42− ListView {
43+ Flickables.ListView {
43 id: scopeSettings
44 id: scopeSettings
44 objectName: "scopeSettings"
45 objectName: "scopeSettings"
45 anchors {
46 anchors {
qml/Dash/ScopesOverview.qml+9−1
@@ -89,6 +89,7 @@ Item {
89 } else {
89 } else {
90 root.allFavoriteSelected(scopeId);
90 root.allFavoriteSelected(scopeId);
91 }
91 }
92+ previewListView.open = false;
92 }
93 }
93 }
94 }
94
95
@@ -98,6 +99,14 @@ Item {
98 value: progress === 1
99 value: progress === 1
99 }
100 }
100
101
102+ function closeTempScope() {
103+ if (tempScopeItem.scope) {
104+ root.scope.closeScope(tempScopeItem.scope);
105+ tempScopeItem.scope = null;
106+ tempScopeItem.backClicked()
107+ }
108+ }
109+
101 function animateDashFromAll(scopeId) {
110 function animateDashFromAll(scopeId) {
102 var currentScopePos = allScopeCardPosition(scopeId);
111 var currentScopePos = allScopeCardPosition(scopeId);
103 if (currentScopePos) {
112 if (currentScopePos) {
@@ -531,7 +540,6 @@ Item {
531
540
532 width: parent.width
541 width: parent.width
533 height: parent.height
542 height: parent.height
534− scale: dash.contentScale
535 clip: scale != 1.0
543 clip: scale != 1.0
536 visible: scope != null
544 visible: scope != null
537 hasBackAction: true
545 hasBackAction: true
qml/Dash/ScopesOverviewAll.qml+2−1
@@ -16,8 +16,9 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19+import "../Components/Flickables" as Flickables
19
20
20−Flickable {
21+Flickables.Flickable {
21 id: root
22 id: root
22
23
23 property alias model: cardGrid.model
24 property alias model: cardGrid.model
qml/Dash/ScopesOverviewFavorites.qml+4−2
@@ -14,9 +14,11 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−import QtQuick 2.0
17+import QtQuick 2.3
18+import Ubuntu.Components 1.1
19+import "../Components/Flickables" as Flickables
18
20
19−Flickable {
21+Flickables.Flickable {
20 id: root
22 id: root
21
23
22 signal clicked(int index, var result, var itemModel)
24 signal clicked(int index, var result, var itemModel)
qml/Greeter/Greeter.qml+13−1
@@ -36,7 +36,7 @@ Showable {
36
36
37 property alias dragHandleWidth: dragHandle.width
37 property alias dragHandleWidth: dragHandle.width
38 property alias model: greeterContentLoader.model
38 property alias model: greeterContentLoader.model
39− property bool locked: shown && !LightDM.Greeter.promptless
39+ property bool locked: true
40
40
41 readonly property bool narrowMode: !multiUser && height > width
41 readonly property bool narrowMode: !multiUser && height > width
42 readonly property bool multiUser: LightDM.Users.count > 1
42 readonly property bool multiUser: LightDM.Users.count > 1
@@ -57,6 +57,18 @@ Showable {
57 }
57 }
58 }
58 }
59
59
60+ function tryToUnlock() {
61+ if (created) {
62+ greeterContentLoader.item.tryToUnlock()
63+ }
64+ }
65+
66+ function reset() {
67+ if (created) {
68+ greeterContentLoader.item.reset()
69+ }
70+ }
71+
60 onRequiredChanged: {
72 onRequiredChanged: {
61 // Reset hide animation to default once we're finished with it
73 // Reset hide animation to default once we're finished with it
62 if (required) {
74 if (required) {
qml/Greeter/GreeterContent.qml+12
@@ -29,6 +29,18 @@ Item {
29 signal selected(int uid)
29 signal selected(int uid)
30 signal unlocked(int uid)
30 signal unlocked(int uid)
31
31
32+ function tryToUnlock() {
33+ if (loginLoader.item) {
34+ loginLoader.item.tryToUnlock()
35+ }
36+ }
37+
38+ function reset() {
39+ if (loginLoader.item) {
40+ loginLoader.item.reset()
41+ }
42+ }
43+
32 Rectangle {
44 Rectangle {
33 // In case background fails to load
45 // In case background fails to load
34 id: backgroundBackup
46 id: backgroundBackup
qml/Greeter/LoginList.qml+21−8
@@ -18,6 +18,7 @@ import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import LightDM 0.1 as LightDM
19import LightDM 0.1 as LightDM
20import "../Components"
20import "../Components"
21+import "../Components/Flickables" as Flickables
21
22
22Item {
23Item {
23 id: root
24 id: root
@@ -35,6 +36,22 @@ Item {
35 signal selected(int uid)
36 signal selected(int uid)
36 signal unlocked(int uid)
37 signal unlocked(int uid)
37
38
39+ function tryToUnlock() {
40+ if (LightDM.Greeter.promptless) {
41+ if (LightDM.Greeter.authenticated) {
42+ root.unlocked(userList.currentIndex)
43+ } else {
44+ root.resetAuthentication()
45+ }
46+ } else {
47+ passwordInput.forceActiveFocus()
48+ }
49+ }
50+
51+ function reset() {
52+ root.resetAuthentication()
53+ }
54+
38 Keys.onEscapePressed: root.resetAuthentication()
55 Keys.onEscapePressed: root.resetAuthentication()
39
56
40 Rectangle {
57 Rectangle {
@@ -52,7 +69,7 @@ Item {
52 antialiasing: true
69 antialiasing: true
53 }
70 }
54
71
55− ListView {
72+ Flickables.ListView {
56 id: userList
73 id: userList
57 objectName: "userList"
74 objectName: "userList"
58
75
@@ -62,7 +79,6 @@ Item {
62 preferredHighlightEnd: userList.height / 2 - root.highlightedHeight / 2
79 preferredHighlightEnd: userList.height / 2 - root.highlightedHeight / 2
63 highlightRangeMode: ListView.StrictlyEnforceRange
80 highlightRangeMode: ListView.StrictlyEnforceRange
64 highlightMoveDuration: root.moveDuration
81 highlightMoveDuration: root.moveDuration
65− flickDeceleration: 10000
66
82
67 readonly property bool movingInternally: moveTimer.running || userList.moving
83 readonly property bool movingInternally: moveTimer.running || userList.moving
68
84
@@ -229,14 +245,11 @@ Item {
229 }
245 }
230
246
231 MouseArea {
247 MouseArea {
248+ id: passwordMouseArea
249+ objectName: "passwordMouseArea"
232 anchors.fill: passwordInput
250 anchors.fill: passwordInput
233 enabled: LightDM.Greeter.promptless
251 enabled: LightDM.Greeter.promptless
234− onClicked: {
252+ onClicked: root.tryToUnlock()
235− if (LightDM.Greeter.authenticated)
236− root.unlocked(userList.currentIndex);
237− else
238− root.resetAuthentication();
239− }
240 }
253 }
241
254
242 function resetAuthentication() {
255 function resetAuthentication() {
qml/Hud/Hud.qml+2−1
@@ -19,6 +19,7 @@ import Ubuntu.Components 0.1
19import HudClient 0.1
19import HudClient 0.1
20
20
21import "../Components"
21import "../Components"
22+import "../Components/Flickables" as Flickables
22
23
23Item {
24Item {
24 id: hud
25 id: hud
@@ -400,7 +401,7 @@ Item {
400 }
401 }
401 progress: MathUtils.clamp((y - hudShowable.y + height - units.gu(8))/elementsYSliding, 0, 1)
402 progress: MathUtils.clamp((y - hudShowable.y + height - units.gu(8))/elementsYSliding, 0, 1)
402
403
403− Flickable {
404+ Flickables.Flickable {
404 anchors.left: parent.left
405 anchors.left: parent.left
405 anchors.right: parent.right
406 anchors.right: parent.right
406 contentHeight: resultList.height
407 contentHeight: resultList.height
qml/Hud/HudParametrizedActionsPage.qml+2−1
@@ -18,6 +18,7 @@ import QtQuick 2.0
18import Ubuntu.Components 1.1
18import Ubuntu.Components 1.1
19import Ubuntu.Components.Themes.Ambiance 1.1
19import Ubuntu.Components.Themes.Ambiance 1.1
20import "../Components"
20import "../Components"
21+import "../Components/Flickables" as Flickables
21
22
22Item {
23Item {
23 property alias header: header.title
24 property alias header: header.title
@@ -74,7 +75,7 @@ Item {
74 return values
75 return values
75 }
76 }
76
77
77− Flickable {
78+ Flickables.Flickable {
78 anchors.top: parent.top
79 anchors.top: parent.top
79 anchors.bottom: buttons.top
80 anchors.bottom: buttons.top
80 anchors.left: parent.left
81 anchors.left: parent.left
qml/Launcher/Launcher.qml+3−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -76,6 +76,7 @@ Item {
76
76
77 Timer {
77 Timer {
78 id: dismissTimer
78 id: dismissTimer
79+ objectName: "dismissTimer"
79 interval: 5000
80 interval: 5000
80 onTriggered: {
81 onTriggered: {
81 if (!panel.preventHiding) {
82 if (!panel.preventHiding) {
@@ -218,6 +219,7 @@ Item {
218
219
219 EdgeDragArea {
220 EdgeDragArea {
220 id: dragArea
221 id: dragArea
222+ objectName: "launcherDragArea"
221
223
222 direction: Direction.Rightwards
224 direction: Direction.Rightwards
223
225
qml/Launcher/LauncherDelegate.qml+20−33
@@ -27,7 +27,7 @@ Item {
27 property bool itemFocused: false
27 property bool itemFocused: false
28 property real maxAngle: 0
28 property real maxAngle: 0
29 property bool inverted: false
29 property bool inverted: false
30− property bool clipCorner: false
30+ property alias pinned: pin.visible
31
31
32 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
32 readonly property int effectiveHeight: Math.cos(angle * Math.PI / 180) * itemHeight
33 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
33 readonly property real foldedHeight: Math.cos(maxAngle * Math.PI / 180) * itemHeight
@@ -71,14 +71,31 @@ Item {
71 height: root.itemHeight - units.gu(1)
71 height: root.itemHeight - units.gu(1)
72 }
72 }
73
73
74+ Rectangle {
75+ id: pin
76+ anchors {
77+ left: iconShape.left
78+ top: iconShape.top
79+ topMargin: -units.dp(2)
80+ }
81+ width: units.gu(1)
82+ height: width
83+ radius: width / 2
84+ color: "white"
85+ }
86+
74 UbuntuShape {
87 UbuntuShape {
88+ id: countEmblem
75 objectName: "countEmblem"
89 objectName: "countEmblem"
90+
91+ readonly property real pinMargin: pin.visible ? pin.width + units.gu(1) - anchors.leftMargin : 0
92+
76 anchors {
93 anchors {
77 right: parent.right
94 right: parent.right
78 top: parent.top
95 top: parent.top
79 margins: units.dp(3)
96 margins: units.dp(3)
80 }
97 }
81− width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
98+ width: Math.min(root.itemWidth - pinMargin, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
82 height: units.gu(2)
99 height: units.gu(2)
83 color: UbuntuColors.orange
100 color: UbuntuColors.orange
84 visible: root.countVisible
101 visible: root.countVisible
@@ -92,7 +109,7 @@ Item {
92 // FIXME: verticalCenter seems to be off wee bit and QML doesn't have a centerLine
109 // FIXME: verticalCenter seems to be off wee bit and QML doesn't have a centerLine
93 // property for Text: https://bugreports.qt-project.org/browse/QTBUG-40479
110 // property for Text: https://bugreports.qt-project.org/browse/QTBUG-40479
94 anchors.verticalCenterOffset: -units.dp(.5)
111 anchors.verticalCenterOffset: -units.dp(.5)
95− width: root.itemWidth - units.gu(1)
112+ width: root.itemWidth - units.gu(1) - countEmblem.pinMargin
96 horizontalAlignment: Text.AlignHCenter
113 horizontalAlignment: Text.AlignHCenter
97 elide: Text.ElideRight
114 elide: Text.ElideRight
98 color: "white"
115 color: "white"
@@ -149,24 +166,6 @@ Item {
149 }
166 }
150 }
167 }
151
168
152− Item {
153− id: clipper
154− anchors.centerIn: parent
155− width: iconItem.width
156− height: iconItem.height
157− Rectangle {
158− anchors {
159− fill: parent
160− topMargin: -units.gu(2)
161− leftMargin: -units.gu(2)
162− rightMargin: -units.gu(2)
163− bottomMargin: units.gu(1.2)
164− }
165− color: "red"
166− rotation: root.rotation + 45
167− }
168− }
169−
170 ShaderEffect {
169 ShaderEffect {
171 id: transformEffect
170 id: transformEffect
172 anchors.centerIn: parent
171 anchors.centerIn: parent
@@ -176,7 +175,6 @@ Item {
176 property real itemOpacity: root.itemOpacity
175 property real itemOpacity: root.itemOpacity
177 property real brightness: Math.max(-1, root.brightness)
176 property real brightness: Math.max(-1, root.brightness)
178 property real angle: root.angle
177 property real angle: root.angle
179− property bool clipCorner: root.clipCorner
180 rotation: root.inverted ? 180 : 0
178 rotation: root.inverted ? 180 : 0
181
179
182 property variant source: ShaderEffectSource {
180 property variant source: ShaderEffectSource {
@@ -185,11 +183,6 @@ Item {
185 hideSource: true
183 hideSource: true
186 }
184 }
187
185
188− property var mask: ShaderEffectSource {
189− sourceItem: clipper
190− hideSource: true
191− }
192−
193 transform: [
186 transform: [
194 // Rotating 3 times at top/bottom because that increases the perspective.
187 // Rotating 3 times at top/bottom because that increases the perspective.
195 // This is a hack, but as QML does not support real 3D coordinates
188 // This is a hack, but as QML does not support real 3D coordinates
@@ -224,19 +217,13 @@ Item {
224 fragmentShader: "
217 fragmentShader: "
225 varying highp vec2 qt_TexCoord0;
218 varying highp vec2 qt_TexCoord0;
226 uniform sampler2D source;
219 uniform sampler2D source;
227− uniform sampler2D mask;
228 uniform lowp float brightness;
220 uniform lowp float brightness;
229 uniform lowp float itemOpacity;
221 uniform lowp float itemOpacity;
230− uniform bool clipCorner;
231 void main(void)
222 void main(void)
232 {
223 {
233 highp vec4 sourceColor = texture2D(source, qt_TexCoord0);
224 highp vec4 sourceColor = texture2D(source, qt_TexCoord0);
234− highp vec4 maskColor = texture2D(mask, qt_TexCoord0);
235 sourceColor.rgb = mix(sourceColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
225 sourceColor.rgb = mix(sourceColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
236 sourceColor *= itemOpacity;
226 sourceColor *= itemOpacity;
237− if (clipCorner) {
238− sourceColor *= maskColor.a;
239− }
240 gl_FragColor = sourceColor;
227 gl_FragColor = sourceColor;
241 }"
228 }"
242 }
229 }
qml/Launcher/LauncherPanel.qml+8−15
@@ -21,6 +21,7 @@ import Unity.Launcher 0.1
21import Ubuntu.Components.Popups 0.1
21import Ubuntu.Components.Popups 0.1
22import "../Components/ListItems"
22import "../Components/ListItems"
23import "../Components/"
23import "../Components/"
24+import "../Components/Flickables" as Flickables
24
25
25Rectangle {
26Rectangle {
26 id: root
27 id: root
@@ -45,6 +46,7 @@ Rectangle {
45 }
46 }
46
47
47 Rectangle {
48 Rectangle {
49+ objectName: "buttonShowDashHome"
48 width: parent.width
50 width: parent.width
49 height: units.gu(7)
51 height: units.gu(7)
50 color: UbuntuColors.orange
52 color: UbuntuColors.orange
@@ -65,15 +67,6 @@ Rectangle {
65 }
67 }
66 }
68 }
67
69
68− ThinDivider {
69− anchors {
70− left: parent.left
71− right: parent.right
72− margins: -mainColumn.anchors.leftMargin
73− }
74− rotation: root.rotation
75− }
76−
77 Item {
70 Item {
78 anchors.left: parent.left
71 anchors.left: parent.left
79 anchors.right: parent.right
72 anchors.right: parent.right
@@ -83,7 +76,7 @@ Rectangle {
83 anchors.fill: parent
76 anchors.fill: parent
84 clip: true
77 clip: true
85
78
86− ListView {
79+ Flickables.ListView {
87 id: launcherListView
80 id: launcherListView
88 objectName: "launcherListView"
81 objectName: "launcherListView"
89 anchors {
82 anchors {
@@ -158,7 +151,7 @@ Rectangle {
158 count: model.count
151 count: model.count
159 countVisible: model.countVisible
152 countVisible: model.countVisible
160 progress: model.progress
153 progress: model.progress
161− clipCorner: model.pinned
154+ pinned: model.pinned
162 itemFocused: model.focused
155 itemFocused: model.focused
163 inverted: root.inverted
156 inverted: root.inverted
164 z: -Math.abs(offset)
157 z: -Math.abs(offset)
@@ -469,10 +462,10 @@ Rectangle {
469 width: itemWidth
462 width: itemWidth
470 rotation: root.rotation
463 rotation: root.rotation
471 itemOpacity: 0.9
464 itemOpacity: 0.9
472− clipCorner: dndArea.draggedIndex > -1 &&
465+ pinned: dndArea.draggedIndex > -1 &&
473− LauncherModel.get(dndArea.draggedIndex).pinned &&
466+ LauncherModel.get(dndArea.draggedIndex).pinned &&
474− !dndArea.preDragging &&
467+ !dndArea.preDragging &&
475− !dndArea.dragging
468+ !dndArea.dragging
476
469
477 function flatten() {
470 function flatten() {
478 fakeDragItemAnimation.start();
471 fakeDragItemAnimation.start();
qml/Notifications/Notification.qml+2−1
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.1
20import Unity.Notifications 1.0
20import Unity.Notifications 1.0
21import QMenuModel 0.1
21import QMenuModel 0.1
22import Utils 0.1
22import Utils 0.1
23+import "../Components/Flickables" as Flickables
23
24
24import Ubuntu.Components.ListItems 0.1 as ListItem
25import Ubuntu.Components.ListItems 0.1 as ListItem
25
26
@@ -455,7 +456,7 @@ Item {
455 onClicked: notification.notification.invokeAction(comboRepeater.itemAt(2).actionId)
456 onClicked: notification.notification.invokeAction(comboRepeater.itemAt(2).actionId)
456 expanded: false
457 expanded: false
457 expandedHeight: (comboRepeater.count - 2) * units.gu(4) + units.gu(.5)
458 expandedHeight: (comboRepeater.count - 2) * units.gu(4) + units.gu(.5)
458− comboList: Flickable {
459+ comboList: Flickables.Flickable {
459 // this has to be wrapped inside a flickable
460 // this has to be wrapped inside a flickable
460 // to work around a feature/bug? of the
461 // to work around a feature/bug? of the
461 // ComboButton SDK-element, making a regular
462 // ComboButton SDK-element, making a regular
qml/Notifications/Notifications.qml+2−1
@@ -19,8 +19,9 @@ import Ubuntu.Components 0.1
19import Unity.Notifications 1.0 as UnityNotifications
19import Unity.Notifications 1.0 as UnityNotifications
20import Utils 0.1
20import Utils 0.1
21import "../Components"
21import "../Components"
22+import "../Components/Flickables" as Flickables
22
23
23−ListView {
24+Flickables.ListView {
24 id: notificationList
25 id: notificationList
25
26
26 objectName: "notificationList"
27 objectName: "notificationList"
qml/Panel/IndicatorRow.qml+2−1
@@ -18,6 +18,7 @@ import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Unity.Indicators 0.1 as Indicators
19import Unity.Indicators 0.1 as Indicators
20import "../Components"
20import "../Components"
21+import "../Components/Flickables" as Flickables
21
22
22Item {
23Item {
23 id: indicatorRow
24 id: indicatorRow
@@ -60,7 +61,7 @@ Item {
60 }
61 }
61 }
62 }
62
63
63− ListView {
64+ Flickables.ListView {
64 id: itemView
65 id: itemView
65 objectName: "indicatorRowItems"
66 objectName: "indicatorRowItems"
66 interactive: false
67 interactive: false
qml/Panel/Indicators/DefaultIndicatorPage.qml+2−1
@@ -21,6 +21,7 @@
21import QtQuick 2.0
21import QtQuick 2.0
22import Ubuntu.Components 0.1 as Components
22import Ubuntu.Components 0.1 as Components
23import Unity.Indicators 0.1 as Indicators
23import Unity.Indicators 0.1 as Indicators
24+import "../../Components/Flickables" as Flickables
24
25
25IndicatorBase {
26IndicatorBase {
26 id: main
27 id: main
@@ -65,7 +66,7 @@ IndicatorBase {
65 }
66 }
66 }
67 }
67
68
68− ListView {
69+ Flickables.ListView {
69 id: mainMenu
70 id: mainMenu
70 objectName: "mainMenu"
71 objectName: "mainMenu"
71 model: menuStack.rootMenu
72 model: menuStack.rootMenu
qml/Panel/Indicators/MenuItemFactory.qml+18−3
@@ -283,12 +283,17 @@ Item {
283 objectName: "checkableMenu"
283 objectName: "checkableMenu"
284 property QtObject menuData: null
284 property QtObject menuData: null
285 property int menuIndex: -1
285 property int menuIndex: -1
286+ property bool serverChecked: menuData && menuData.isToggled || false
286
287
287 text: menuData && menuData.label || ""
288 text: menuData && menuData.label || ""
288 enabled: menuData && menuData.sensitive || false
289 enabled: menuData && menuData.sensitive || false
289− checked: menuData && menuData.isToggled || false
290+ checked: serverChecked
290 highlightWhenPressed: false
291 highlightWhenPressed: false
291
292
293+ onServerCheckedChanged: {
294+ // value can be changed by menu, so a binding won't work.
295+ checked = serverChecked;
296+ }
292 onTriggered: {
297 onTriggered: {
293 menuModel.activate(menuIndex);
298 menuModel.activate(menuIndex);
294 }
299 }
@@ -302,13 +307,18 @@ Item {
302 objectName: "switchMenu"
307 objectName: "switchMenu"
303 property QtObject menuData: null
308 property QtObject menuData: null
304 property int menuIndex: -1
309 property int menuIndex: -1
310+ property bool serverChecked: menuData && menuData.isToggled || false
305
311
306 text: menuData && menuData.label || ""
312 text: menuData && menuData.label || ""
307 iconSource: menuData && menuData.icon || ""
313 iconSource: menuData && menuData.icon || ""
308 enabled: menuData && menuData.sensitive || false
314 enabled: menuData && menuData.sensitive || false
309− checked: menuData && menuData.isToggled || false
315+ checked: serverChecked
310 highlightWhenPressed: false
316 highlightWhenPressed: false
311
317
318+ onServerCheckedChanged: {
319+ // value can be changed by menu, so a binding won't work.
320+ checked = serverChecked;
321+ }
312 onTriggered: {
322 onTriggered: {
313 menuModel.activate(menuIndex);
323 menuModel.activate(menuIndex);
314 }
324 }
@@ -431,6 +441,7 @@ Item {
431 property var menuModel: menuFactory.menuModel
441 property var menuModel: menuFactory.menuModel
432 property int menuIndex: -1
442 property int menuIndex: -1
433 property var extendedData: menuData && menuData.ext || undefined
443 property var extendedData: menuData && menuData.ext || undefined
444+ property bool serverChecked: menuData && menuData.isToggled || false
434
445
435 property var strengthAction: UnityMenuAction {
446 property var strengthAction: UnityMenuAction {
436 model: menuModel
447 model: menuModel
@@ -440,12 +451,16 @@ Item {
440
451
441 text: menuData && menuData.label || ""
452 text: menuData && menuData.label || ""
442 enabled: menuData && menuData.sensitive || false
453 enabled: menuData && menuData.sensitive || false
443− active: menuData && menuData.isToggled || false
454+ active: serverChecked
444 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
455 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
445 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
456 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
446 signalStrength: strengthAction.valid ? strengthAction.state : 0
457 signalStrength: strengthAction.valid ? strengthAction.state : 0
447 highlightWhenPressed: false
458 highlightWhenPressed: false
448
459
460+ onServerCheckedChanged: {
461+ // value can be changed by menu, so a binding won't work.
462+ active = serverChecked;
463+ }
449 onMenuModelChanged: {
464 onMenuModelChanged: {
450 loadAttributes();
465 loadAttributes();
451 }
466 }
qml/Panel/Indicators/client/IndicatorsList.qml+2−1
@@ -22,6 +22,7 @@ import Ubuntu.Components 0.1
22import Ubuntu.Components.ListItems 0.1 as ListItem
22import Ubuntu.Components.ListItems 0.1 as ListItem
23import Unity.Indicators 0.1 as Indicators
23import Unity.Indicators 0.1 as Indicators
24import "../.."
24import "../.."
25+import "../../../Components/Flickables" as Flickables
25
26
26Page {
27Page {
27 id: page
28 id: page
@@ -35,7 +36,7 @@ Page {
35 Component.onCompleted: load(profile)
36 Component.onCompleted: load(profile)
36 }
37 }
37
38
38− ListView {
39+ Flickables.ListView {
39 id: mainMenu
40 id: mainMenu
40 objectName: "mainMenu"
41 objectName: "mainMenu"
41 anchors.fill: parent
42 anchors.fill: parent
qml/Panel/Indicators/client/IndicatorsTree.qml+2−1
@@ -22,6 +22,7 @@ import Ubuntu.Components 0.1
22import Unity.Indicators 0.1 as Indicators
22import Unity.Indicators 0.1 as Indicators
23import QMenuModel 0.1
23import QMenuModel 0.1
24import Ubuntu.Components.ListItems 0.1 as ListItem
24import Ubuntu.Components.ListItems 0.1 as ListItem
25+import "../../../Components/Flickables" as Flickables
25
26
26Page {
27Page {
27 id: page
28 id: page
@@ -52,7 +53,7 @@ Page {
52 model: unityModel
53 model: unityModel
53 }
54 }
54
55
55− Flickable {
56+ Flickables.Flickable {
56 anchors.fill: parent
57 anchors.fill: parent
57 contentHeight: all_data.height
58 contentHeight: all_data.height
58 clip:true
59 clip:true
qml/Panel/MenuContent.qml+3−2
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.1
20import Unity.Indicators 0.1 as Indicators
20import Unity.Indicators 0.1 as Indicators
21import Utils 0.1
21import Utils 0.1
22import "../Components"
22import "../Components"
23+import "../Components/Flickables" as Flickables
23import "Indicators"
24import "Indicators"
24
25
25Rectangle {
26Rectangle {
@@ -39,7 +40,7 @@ Rectangle {
39 listViewHeader.currentIndex = index;
40 listViewHeader.currentIndex = index;
40 }
41 }
41
42
42− ListView {
43+ Flickables.ListView {
43 id: listViewHeader
44 id: listViewHeader
44 objectName: "indicatorsHeaderListView"
45 objectName: "indicatorsHeaderListView"
45 model: content.indicatorsModel
46 model: content.indicatorsModel
@@ -80,7 +81,7 @@ Rectangle {
80 }
81 }
81 }
82 }
82
83
83− ListView {
84+ Flickables.ListView {
84 id: listViewContent
85 id: listViewContent
85 objectName: "indicatorsContentListView"
86 objectName: "indicatorsContentListView"
86 anchors {
87 anchors {
qml/Shell.qml+115−47
@@ -53,7 +53,9 @@ Item {
53 property url background
53 property url background
54 readonly property real panelHeight: panel.panelHeight
54 readonly property real panelHeight: panel.panelHeight
55
55
56− readonly property bool locked: LightDM.Greeter.active && !LightDM.Greeter.authenticated
56+ readonly property bool locked: LightDM.Greeter.active && !LightDM.Greeter.authenticated && !forcedUnlock
57+ readonly property bool forcedUnlock: edgeDemo.running
58+ onForcedUnlockChanged: if (forcedUnlock) lockscreen.hide()
57
59
58 property bool sideStageEnabled: shell.width >= units.gu(100)
60 property bool sideStageEnabled: shell.width >= units.gu(100)
59 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
61 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
@@ -87,11 +89,13 @@ Item {
87 }
89 }
88 }
90 }
89
91
90− function setFakeActiveForApp(app) {
92+ function startLockedApp(app) {
91− if (shell.locked) {
93+ if (!shell.locked) {
92− greeter.fakeActiveForApp = app
94+ console.warn("Called startLockedApp(%1) when not locked, ignoring".arg(app))
93− lockscreen.hide()
95+ return
94 }
96 }
97+ greeter.lockedApp = app
98+ shell.activateApplication(app)
95 }
99 }
96
100
97 Binding {
101 Binding {
@@ -169,31 +173,41 @@ Item {
169 Connections {
173 Connections {
170 target: ApplicationManager
174 target: ApplicationManager
171 onFocusRequested: {
175 onFocusRequested: {
176+ if (greeter.narrowMode) {
172− if (appId === "dialer-app") {
177+ if (appId === "dialer-app" && callManager.hasCalls) {
173− // Always let the dialer-app through. Either user asked
178+ // If we are in the middle of a call, make dialer lockedApp and show it.
174− // for an emergency call or accepted an incoming call.
179+ // This can happen if user backs out of dialer back to greeter, then
175− setFakeActiveForApp(appId)
180+ // launches dialer again.
176− } else if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== appId) {
181+ greeter.lockedApp = appId;
177− lockscreen.show();
182+ }
183+ if (greeter.hasLockedApp) {
184+ if (appId === greeter.lockedApp) {
185+ lockscreen.hide() // show locked app
186+ } else {
187+ greeter.startUnlock() // show lockscreen if necessary
188+ }
189+ }
190+ greeter.hide();
191+ } else {
192+ if (LightDM.Greeter.active) {
193+ greeter.startUnlock()
194+ }
178 }
195 }
179− greeter.hide();
180 }
196 }
181
197
182 onFocusedApplicationIdChanged: {
198 onFocusedApplicationIdChanged: {
183− if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== ApplicationManager.focusedApplicationId) {
199+ if (greeter.hasLockedApp && greeter.lockedApp !== ApplicationManager.focusedApplicationId) {
184− lockscreen.show();
200+ greeter.startUnlock()
185 }
201 }
186 panel.indicators.hide();
202 panel.indicators.hide();
187 }
203 }
188
204
189 onApplicationAdded: {
205 onApplicationAdded: {
190 if (greeter.shown && appId != "unity8-dash") {
206 if (greeter.shown && appId != "unity8-dash") {
191− greeter.hide();
207+ greeter.startUnlock()
192 }
208 }
193− if (appId === "dialer-app") {
209+ if (greeter.narrowMode && greeter.hasLockedApp && appId === greeter.lockedApp) {
194− // Always let the dialer-app through. Either user asked
210+ lockscreen.hide() // show locked app
195− // for an emergency call or accepted an incoming call.
196− setFakeActiveForApp(appId)
197 }
211 }
198 launcher.hide();
212 launcher.hide();
199 }
213 }
@@ -201,9 +215,19 @@ Item {
201
215
202 Loader {
216 Loader {
203 id: applicationsDisplayLoader
217 id: applicationsDisplayLoader
218+ objectName: "applicationsDisplayLoader"
204 anchors.fill: parent
219 anchors.fill: parent
205
220
221+ // When we have a locked app, we only want to show that one app.
222+ // FIXME: do this in a less traumatic way. We currently only allow
223+ // locked apps in phone mode (see FIXME in Lockscreen component in
224+ // this same file). When that changes, we need to do something
225+ // nicer here. But this code is currently just to prevent a
226+ // theoretical attack where user enters lockedApp mode, then makes
227+ // the screen larger (maybe connects to monitor) and tries to enter
228+ // tablet mode.
229+ property bool tabletMode: shell.sideStageEnabled && !greeter.hasLockedApp
206− source: shell.sideStageEnabled ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
230+ source: tabletMode ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
207
231
208 Binding {
232 Binding {
209 target: applicationsDisplayLoader.item
233 target: applicationsDisplayLoader.item
@@ -229,7 +253,7 @@ Item {
229 Binding {
253 Binding {
230 target: applicationsDisplayLoader.item
254 target: applicationsDisplayLoader.item
231 property: "spreadEnabled"
255 property: "spreadEnabled"
232− value: edgeDemo.stagesEnabled && greeter.fakeActiveForApp === "" // to support emergency dialer hack
256+ value: edgeDemo.stagesEnabled && !greeter.hasLockedApp
233 }
257 }
234 Binding {
258 Binding {
235 target: applicationsDisplayLoader.item
259 target: applicationsDisplayLoader.item
@@ -304,14 +328,20 @@ Item {
304 // and wider screens are tablets which don't. When we do allow this
328 // and wider screens are tablets which don't. When we do allow this
305 // on devices with a side stage and a SIM, work should be done to
329 // on devices with a side stage and a SIM, work should be done to
306 // ensure that the main stage is disabled while the dialer is present
330 // ensure that the main stage is disabled while the dialer is present
307− // in the side stage.
331+ // in the side stage. See the FIXME in the stage loader in this file.
308 showEmergencyCallButton: !shell.sideStageEnabled
332 showEmergencyCallButton: !shell.sideStageEnabled
309
333
310 onEntered: LightDM.Greeter.respond(passphrase);
334 onEntered: LightDM.Greeter.respond(passphrase);
311 onCancel: greeter.show()
335 onCancel: greeter.show()
312− onEmergencyCall: shell.activateApplication("dialer-app") // will automatically enter fake-active mode
336+ onEmergencyCall: startLockedApp("dialer-app")
313
337
314− onShownChanged: if (shown) greeter.fakeActiveForApp = ""
338+ onShownChanged: if (shown) greeter.lockedApp = ""
339+
340+ function maybeShow() {
341+ if (!shell.forcedUnlock) {
342+ show()
343+ }
344+ }
315
345
316 Timer {
346 Timer {
317 id: forcedDelayTimer
347 id: forcedDelayTimer
@@ -355,16 +385,18 @@ Item {
355 lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
385 lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
356 }
386 }
357
387
358− lockscreen.show();
388+ lockscreen.maybeShow();
359 }
389 }
360 }
390 }
361
391
362 onPromptlessChanged: {
392 onPromptlessChanged: {
393+ if (greeter.narrowMode) {
363− if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
394+ if (LightDM.Greeter.promptless && LightDM.Greeter.authenticated) {
364− lockscreen.hide()
395+ lockscreen.hide()
365− } else {
396+ } else {
366− lockscreen.reset();
397+ lockscreen.reset();
367− lockscreen.show();
398+ lockscreen.maybeShow();
399+ }
368 }
400 }
369 }
401 }
370
402
@@ -414,7 +446,7 @@ Item {
414 Binding {
446 Binding {
415 target: LightDM.Greeter
447 target: LightDM.Greeter
416 property: "active"
448 property: "active"
417− value: greeter.shown || lockscreen.shown || greeter.fakeActiveForApp != ""
449+ value: greeter.shown || lockscreen.shown || greeter.hasLockedApp
418 }
450 }
419
451
420 Rectangle {
452 Rectangle {
@@ -426,7 +458,8 @@ Item {
426 Item {
458 Item {
427 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
459 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
428 id: greeterWrapper
460 id: greeterWrapper
461+ objectName: "greeterWrapper"
429− x: launcher.progress
462+ x: greeter.narrowMode ? launcher.progress : 0
430 y: panel.panelHeight
463 y: panel.panelHeight
431 width: parent.width
464 width: parent.width
432 height: parent.height - panel.panelHeight
465 height: parent.height - panel.panelHeight
@@ -439,16 +472,16 @@ Item {
439 property bool fullyShown: showProgress === 1.0
472 property bool fullyShown: showProgress === 1.0
440 onFullyShownChanged: {
473 onFullyShownChanged: {
441 // Wait until the greeter is completely covering lockscreen before resetting it.
474 // Wait until the greeter is completely covering lockscreen before resetting it.
442− if (fullyShown && !LightDM.Greeter.authenticated) {
475+ if (greeter.narrowMode && fullyShown && !LightDM.Greeter.authenticated) {
443 lockscreen.reset();
476 lockscreen.reset();
444− lockscreen.show();
477+ lockscreen.maybeShow();
445 }
478 }
446 }
479 }
447
480
448 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
481 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
449 onShowProgressChanged: {
482 onShowProgressChanged: {
450 if (showProgress === 0) {
483 if (showProgress === 0) {
451− if (LightDM.Greeter.authenticated) {
484+ if ((LightDM.Greeter.promptless && LightDM.Greeter.authenticated) || shell.forcedUnlock) {
452 greeter.login()
485 greeter.login()
453 } else if (greeter.narrowMode) {
486 } else if (greeter.narrowMode) {
454 lockscreen.clear(false) // to reset focus if necessary
487 lockscreen.clear(false) // to reset focus if necessary
@@ -462,13 +495,16 @@ Item {
462
495
463 signal sessionStarted() // helpful for tests
496 signal sessionStarted() // helpful for tests
464
497
465− property string fakeActiveForApp: ""
498+ property string lockedApp: ""
499+ property bool hasLockedApp: lockedApp !== ""
466
500
467 available: true
501 available: true
468 hides: [launcher, panel.indicators]
502 hides: [launcher, panel.indicators]
469 shown: true
503 shown: true
470 loadContent: required || lockscreen.required // keeps content in memory for quick show()
504 loadContent: required || lockscreen.required // keeps content in memory for quick show()
471
505
506+ locked: shell.locked
507+
472 defaultBackground: shell.background
508 defaultBackground: shell.background
473
509
474 width: parent.width
510 width: parent.width
@@ -476,6 +512,18 @@ Item {
476
512
477 dragHandleWidth: shell.edgeSize
513 dragHandleWidth: shell.edgeSize
478
514
515+ function startUnlock() {
516+ if (narrowMode) {
517+ if (!LightDM.Greeter.authenticated) {
518+ lockscreen.maybeShow()
519+ }
520+ hide()
521+ } else {
522+ show()
523+ tryToUnlock()
524+ }
525+ }
526+
479 function login() {
527 function login() {
480 enabled = false;
528 enabled = false;
481 if (LightDM.Greeter.startSessionSync()) {
529 if (LightDM.Greeter.startSessionSync()) {
@@ -491,8 +539,10 @@ Item {
491 if (shown) {
539 if (shown) {
492 if (greeter.narrowMode) {
540 if (greeter.narrowMode) {
493 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
541 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
542+ } else {
543+ reset()
494 }
544 }
495− greeter.fakeActiveForApp = "";
545+ greeter.lockedApp = "";
496 greeter.forceActiveFocus();
546 greeter.forceActiveFocus();
497 }
547 }
498 }
548 }
@@ -520,6 +570,25 @@ Item {
520 }
570 }
521 }
571 }
522
572
573+ Connections {
574+ id: callConnection
575+ target: callManager
576+
577+ onHasCallsChanged: {
578+ if (shell.locked && callManager.hasCalls) {
579+ // We just received an incoming call while locked. The
580+ // indicator will have already launched dialer-app for us, but
581+ // there is a race between "hasCalls" changing and the dialer
582+ // starting up. So in case we lose that race, we'll start/
583+ // focus the dialer ourselves here too. Even if the indicator
584+ // didn't launch the dialer for some reason (or maybe a call
585+ // started via some other means), if an active call is
586+ // happening, we want to be in the dialer.
587+ startLockedApp("dialer-app")
588+ }
589+ }
590+ }
591+
523 Connections {
592 Connections {
524 id: powerConnection
593 id: powerConnection
525 target: Powerd
594 target: Powerd
@@ -537,10 +606,7 @@ Item {
537 }
606 }
538
607
539 if (LightDM.Greeter.active) {
608 if (LightDM.Greeter.active) {
540− if (!LightDM.Greeter.authenticated) {
541− lockscreen.show()
542− }
543− greeter.hide()
609+ greeter.startUnlock()
544 }
610 }
545
611
546 var animate = !LightDM.Greeter.active && !stages.shown
612 var animate = !LightDM.Greeter.active && !stages.shown
@@ -549,7 +615,8 @@ Item {
549 }
615 }
550
616
551 function showDash() {
617 function showDash() {
552− if (greeter.fakeActiveForApp !== "") { // just in case user gets here
618+ if (greeter.hasLockedApp || // just in case user gets here
619+ (!greeter.narrowMode && shell.locked)) {
553 return
620 return
554 }
621 }
555
622
@@ -576,7 +643,7 @@ Item {
576 anchors.fill: parent //because this draws indicator menus
643 anchors.fill: parent //because this draws indicator menus
577 indicators {
644 indicators {
578 hides: [launcher]
645 hides: [launcher]
579− available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && greeter.fakeActiveForApp === ""
646+ available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && !greeter.hasLockedApp
580 contentEnabled: edgeDemo.panelContentEnabled
647 contentEnabled: edgeDemo.panelContentEnabled
581 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
648 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
582 panelHeight: units.gu(3)
649 panelHeight: units.gu(3)
@@ -587,7 +654,7 @@ Item {
587 ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
654 ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
588
655
589 fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
656 fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
590− || greeter.fakeActiveForApp !== ""
657+ || greeter.hasLockedApp
591 }
658 }
592
659
593 Launcher {
660 Launcher {
@@ -600,7 +667,7 @@ Item {
600 anchors.bottom: parent.bottom
667 anchors.bottom: parent.bottom
601 width: parent.width
668 width: parent.width
602 dragAreaWidth: shell.edgeSize
669 dragAreaWidth: shell.edgeSize
603− available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && greeter.fakeActiveForApp === ""
670+ available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && !greeter.hasLockedApp
604
671
605 onShowDashHome: showHome()
672 onShowDashHome: showHome()
606 onDash: showDash()
673 onDash: showDash()
@@ -610,8 +677,8 @@ Item {
610 }
677 }
611 }
678 }
612 onLauncherApplicationSelected: {
679 onLauncherApplicationSelected: {
613− if (greeter.fakeActiveForApp !== "") {
680+ if (greeter.hasLockedApp) {
614− lockscreen.show()
681+ greeter.startUnlock()
615 }
682 }
616 if (!edgeDemo.running)
683 if (!edgeDemo.running)
617 shell.activateApplication(appId)
684 shell.activateApplication(appId)
@@ -691,6 +758,7 @@ Item {
691
758
692 EdgeDemo {
759 EdgeDemo {
693 id: edgeDemo
760 id: edgeDemo
761+ objectName: "edgeDemo"
694 z: alphaDisclaimerLabel.z + 10
762 z: alphaDisclaimerLabel.z + 10
695 paused: Powerd.status === Powerd.Off // Saves power
763 paused: Powerd.status === Powerd.Off // Saves power
696 greeter: greeter
764 greeter: greeter
qml/Stages/ApplicationWindow.qml−18
@@ -61,14 +61,6 @@ Item {
61 // Remove this when possible
61 // Remove this when possible
62 property bool surfaceInitialized: false
62 property bool surfaceInitialized: false
63
63
64− function forceSurfaceActiveFocusIfReady() {
65− if (sessionContainer.surface !== null &&
66− sessionContainer.surface.focus &&
67− sessionContainer.surface.parent === sessionContainer.surfaceContainer &&
68− sessionContainer.surface.enabled) {
69− sessionContainer.surface.forceActiveFocus();
70− }
71− }
72 }
64 }
73
65
74 Timer {
66 Timer {
@@ -77,15 +69,6 @@ Item {
77 onTriggered: { if (sessionContainer.surface) {d.surfaceInitialized = true;} }
69 onTriggered: { if (sessionContainer.surface) {d.surfaceInitialized = true;} }
78 }
70 }
79
71
80− Connections {
81− target: sessionContainer.surface
82− // FIXME: I would rather not need to do this, but currently it doesn't get
83− // active focus without it and I don't know why.
84− onFocusChanged: d.forceSurfaceActiveFocusIfReady();
85− onParentChanged: d.forceSurfaceActiveFocusIfReady();
86− onEnabledChanged: d.forceSurfaceActiveFocusIfReady();
87− }
88−
89 Image {
72 Image {
90 id: screenshotImage
73 id: screenshotImage
91 objectName: "screenshotImage"
74 objectName: "screenshotImage"
@@ -132,7 +115,6 @@ Item {
132 onSurfaceChanged: {
115 onSurfaceChanged: {
133 if (sessionContainer.surface) {
116 if (sessionContainer.surface) {
134 surfaceInitTimer.start();
117 surfaceInitTimer.start();
135− d.forceSurfaceActiveFocusIfReady();
136 } else {
118 } else {
137 d.surfaceInitialized = false;
119 d.surfaceInitialized = false;
138 }
120 }
qml/Stages/PhoneStage.qml+24−6
@@ -21,6 +21,7 @@ import Unity.Application 0.1
21import Unity.Session 0.1
21import Unity.Session 0.1
22import Utils 0.1
22import Utils 0.1
23import "../Components"
23import "../Components"
24+import "../Components/Flickables" as Flickables
24
25
25Rectangle {
26Rectangle {
26 id: root
27 id: root
@@ -85,6 +86,14 @@ Rectangle {
85 if (spreadView.closingIndex == -1) {
86 if (spreadView.closingIndex == -1) {
86 spreadView.phase = 0;
87 spreadView.phase = 0;
87 spreadView.contentX = -spreadView.shift;
88 spreadView.contentX = -spreadView.shift;
89+ focusTopMostApp();
90+ }
91+ }
92+
93+ function focusTopMostApp() {
94+ if (ApplicationManager.count > 0) {
95+ var topmostApp = ApplicationManager.get(0);
96+ ApplicationManager.focusApplication(topmostApp.appId);
88 }
97 }
89 }
98 }
90 }
99 }
@@ -112,7 +121,7 @@ Rectangle {
112
121
113 }
122 }
114
123
115− Flickable {
124+ Flickables.Flickable {
116 id: spreadView
125 id: spreadView
117 objectName: "spreadView"
126 objectName: "spreadView"
118 anchors.fill: parent
127 anchors.fill: parent
@@ -123,7 +132,7 @@ Rectangle {
123
132
124 // This indicates when the spreadView is active. That means, all the animations
133 // This indicates when the spreadView is active. That means, all the animations
125 // are activated and tiles need to line up for the spread.
134 // are activated and tiles need to line up for the spread.
126− readonly property bool active: shiftedContentX > 0 || spreadDragArea.dragging
135+ readonly property bool active: shiftedContentX > 0 || spreadDragArea.status === DirectionalDragArea.Recognized
127
136
128 // The flickable needs to fill the screen in order to get touch events all over.
137 // The flickable needs to fill the screen in order to get touch events all over.
129 // However, we don't want to the user to be able to scroll back all the way. For
138 // However, we don't want to the user to be able to scroll back all the way. For
@@ -410,6 +419,7 @@ Rectangle {
410
419
411 EdgeDragArea {
420 EdgeDragArea {
412 id: spreadDragArea
421 id: spreadDragArea
422+ objectName: "spreadDragArea"
413 direction: Direction.Leftwards
423 direction: Direction.Leftwards
414 enabled: spreadView.phase != 2 && root.spreadEnabled
424 enabled: spreadView.phase != 2 && root.spreadEnabled
415
425
@@ -429,9 +439,10 @@ Rectangle {
429 spreadView.phase = 0;
439 spreadView.phase = 0;
430 spreadView.contentX = -spreadView.shift;
440 spreadView.contentX = -spreadView.shift;
431 }
441 }
432− if (dragging && attachedToView) {
442+ if (dragging && status == DirectionalDragArea.Recognized && attachedToView) {
433 // Gesture recognized. Let's move the spreadView with the finger
443 // Gesture recognized. Let's move the spreadView with the finger
444+ var finalX = Math.min(touchX + width, width);
434− spreadView.contentX = -touchX + spreadDragArea.width - spreadView.shift;
445+ spreadView.contentX = -finalX + spreadDragArea.width - spreadView.shift;
435 }
446 }
436 if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
447 if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
437 // We passed positionMarker3. Detach from spreadView and snap it.
448 // We passed positionMarker3. Detach from spreadView and snap it.
@@ -441,7 +452,13 @@ Rectangle {
441 gesturePoints.push(touchX);
452 gesturePoints.push(touchX);
442 }
453 }
443
454
455+ property int previousStatus: -1
456+ property int currentStatus: DirectionalDragArea.WaitingForTouch
457+
444 onStatusChanged: {
458 onStatusChanged: {
459+ previousStatus = currentStatus;
460+ currentStatus = status;
461+
445 if (status == DirectionalDragArea.Recognized) {
462 if (status == DirectionalDragArea.Recognized) {
446 attachedToView = true;
463 attachedToView = true;
447 }
464 }
@@ -449,7 +466,7 @@ Rectangle {
449
466
450 onDraggingChanged: {
467 onDraggingChanged: {
451 if (dragging) {
468 if (dragging) {
452− // Gesture recognized. Start recording this gesture
469+ // A potential edge-drag gesture has started. Start recording it
453 gesturePoints = [];
470 gesturePoints = [];
454 return;
471 return;
455 }
472 }
@@ -466,7 +483,8 @@ Rectangle {
466 }
483 }
467 gesturePoints = [];
484 gesturePoints = [];
468
485
486+ if (previousStatus == DirectionalDragArea.Recognized &&
469− if (oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
487+ oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
470 spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
488 spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
471 // If it was a short one-way movement, do the Alt+Tab switch
489 // If it was a short one-way movement, do the Alt+Tab switch
472 // no matter if we didn't cross positionMarker1 yet.
490 // no matter if we didn't cross positionMarker1 yet.
qml/Stages/SessionContainer.qml+1−13
@@ -23,7 +23,7 @@ Item {
23 property QtObject session
23 property QtObject session
24 readonly property var childSessions: session ? session.childSessions : null
24 readonly property var childSessions: session ? session.childSessions : null
25 readonly property alias surface: _surfaceContainer.surface
25 readonly property alias surface: _surfaceContainer.surface
26− property bool interactive: true
26+ property alias interactive: _surfaceContainer.interactive
27 property int orientation
27 property int orientation
28
28
29 readonly property alias surfaceContainer: _surfaceContainer
29 readonly property alias surfaceContainer: _surfaceContainer
@@ -34,18 +34,6 @@ Item {
34 orientation: root.orientation
34 orientation: root.orientation
35 }
35 }
36
36
37− Binding {
38− target: surfaceContainer.surface
39− when: surfaceContainer.surface
40− property: "enabled"
41− value: root.interactive
42− }
43− Binding {
44− target: surfaceContainer.surface
45− when: surfaceContainer.surface
46− property: "focus"
47− value: root.interactive
48− }
49
37
50 Repeater {
38 Repeater {
51 model: root.childSessions
39 model: root.childSessions
qml/Stages/SurfaceContainer.qml+37−6
@@ -16,6 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 1.1
18import Ubuntu.Components 1.1
19+import Ubuntu.Gestures 0.1 // For TouchGate
19
20
20Item {
21Item {
21 id: root
22 id: root
@@ -23,21 +24,51 @@ Item {
23 property Item surface: null
24 property Item surface: null
24 property bool hadSurface: false
25 property bool hadSurface: false
25 property int orientation
26 property int orientation
27+ property bool interactive
26
28
27 onSurfaceChanged: {
29 onSurfaceChanged: {
28 if (surface) {
30 if (surface) {
29 surface.parent = root;
31 surface.parent = root;
32+ d.forceSurfaceActiveFocusIfReady();
30 } else {
33 } else {
31 hadSurface = true;
34 hadSurface = true;
32 }
35 }
33 }
36 }
34− Binding {
37+ Binding { target: surface; property: "anchors.fill"; value: root }
35− target: surface
38+ Binding { target: surface; property: "orientation"; value: root.orientation }
36− property: "anchors.fill"; value: root
39+ Binding { target: surface; property: "z"; value: 1 }
40+ Binding { target: surface; property: "enabled"; value: root.interactive; when: surface }
41+ Binding { target: surface; property: "focus"; value: root.interactive; when: surface }
42+
43+ TouchGate {
44+ targetItem: surface
45+ anchors.fill: root
46+ enabled: root.surface ? root.surface.enabled : false
47+ z: 2
48+ }
49+
50+ Connections {
51+ target: root.surface
52+ // FIXME: I would rather not need to do this, but currently it doesn't get
53+ // active focus without it and I don't know why.
54+ // Possibly because if an item get focus=true before it has a parent, once
55+ // it gets a parent QQuickWindow won't check its focus and update its activeFocus
56+ // accordingly. Unlike when you focus=true after the item already has a parent.
57+ onFocusChanged: d.forceSurfaceActiveFocusIfReady();
58+ onParentChanged: d.forceSurfaceActiveFocusIfReady();
59+ onEnabledChanged: d.forceSurfaceActiveFocusIfReady();
37 }
60 }
38− Binding {
61+
62+ QtObject {
63+ id: d
64+ function forceSurfaceActiveFocusIfReady() {
65+ if (root.surface !== null &&
66+ root.surface.focus &&
39− target: surface
67+ root.surface.parent === root &&
40− property: "orientation"; value: root.orientation
68+ root.surface.enabled) {
69+ root.surface.forceActiveFocus();
70+ }
71+ }
41 }
72 }
42
73
43 states: [
74 states: [
qml/Stages/TabletStage.qml+9−1
@@ -20,6 +20,7 @@ import Ubuntu.Gestures 0.1
20import Unity.Application 0.1
20import Unity.Application 0.1
21import Utils 0.1
21import Utils 0.1
22import "../Components"
22import "../Components"
23+import "../Components/Flickables" as Flickables
23
24
24Rectangle {
25Rectangle {
25 id: root
26 id: root
@@ -139,14 +140,21 @@ Rectangle {
139 if (priv.sideStageAppId == appId) {
140 if (priv.sideStageAppId == appId) {
140 priv.sideStageAppId = "";
141 priv.sideStageAppId = "";
141 }
142 }
143+
142 if (ApplicationManager.count == 0) {
144 if (ApplicationManager.count == 0) {
143 spreadView.phase = 0;
145 spreadView.phase = 0;
144 spreadView.contentX = -spreadView.shift;
146 spreadView.contentX = -spreadView.shift;
147+ } else if (spreadView.closingIndex == -1) {
148+ // Unless we're closing the app ourselves in the spread,
149+ // lets make sure the spread doesn't mess up by the changing app list.
150+ spreadView.phase = 0;
151+ spreadView.contentX = -spreadView.shift;
152+ ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
145 }
153 }
146 }
154 }
147 }
155 }
148
156
149− Flickable {
157+ Flickables.Flickable {
150 id: spreadView
158 id: spreadView
151 anchors.fill: parent
159 anchors.fill: parent
152 interactive: (spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1)
160 interactive: (spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1)
run_on_device.sh+4−5
@@ -130,11 +130,10 @@ if [ -z "${PASSWORD}" ]; then
130 usage
130 usage
131fi
131fi
132
132
133−PASSFILE=$( adb shell "FILE=\`mktemp\`
133+PASSFILE=$(adb shell 'mktemp' | tr -d '\r')
134− echo \"#!/bin/sh\" > \$FILE
134+adb shell "echo '#!/bin/sh' > ${PASSFILE}"
135− echo \"echo \\\"${PASSWORD}\\\"\" >> \$FILE
135+adb shell "echo \"echo \\\"${PASSWORD}\\\"\" >> ${PASSFILE}"
136− chmod +x \$FILE
136+adb shell "chmod +x ${PASSFILE}"
137− echo \$FILE" | tr -d '\r' )
138
137
139setup_adb_forwarding
138setup_adb_forwarding
140
139
src/CMakeLists.txt+6
@@ -1,5 +1,6 @@
1include_directories(
1include_directories(
2 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
2 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
3+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
3)
4)
4
5
5file(GLOB_RECURSE QML_FILES
6file(GLOB_RECURSE QML_FILES
@@ -29,6 +30,11 @@ if (NOT "${XCB_INCLUDE_DIRS}" STREQUAL "")
29 target_link_libraries(${SHELL_APP} ${XCB_LDFLAGS})
30 target_link_libraries(${SHELL_APP} ${XCB_LDFLAGS})
30endif()
31endif()
31
32
33+target_link_libraries(${SHELL_APP} UbuntuGestures)
34+
35+# For it to find libUbuntuGestures.so
36+set_target_properties(${SHELL_APP} PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
37+
32# install binaries
38# install binaries
33install(TARGETS ${SHELL_APP}
39install(TARGETS ${SHELL_APP}
34 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
40 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
src/Dash/CMakeLists.txt+5
@@ -9,6 +9,11 @@ add_executable(unity8-dash ${DASH_SRCS})
9
9
10qt5_use_modules(unity8-dash Gui Qml Quick Test)
10qt5_use_modules(unity8-dash Gui Qml Quick Test)
11
11
12+# For it to find libUbuntuGestures.so, needed by Ubuntu.Gestures QML module.
13+set_target_properties(unity8-dash PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}")
14+
15+target_link_libraries(unity8-dash UbuntuGestures)
16+
12set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
17set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
13
18
14# install binaries
19# install binaries
src/Dash/main.cpp+6
@@ -31,6 +31,9 @@
31#include "../ApplicationArguments.h"
31#include "../ApplicationArguments.h"
32#include "../CachingNetworkManagerFactory.h"
32#include "../CachingNetworkManagerFactory.h"
33
33
34+// Ubuntu Gestures
35+#include <TouchRegistry.h>
36+
34int main(int argc, const char *argv[])
37int main(int argc, const char *argv[])
35{
38{
36 QGuiApplication *application = new QGuiApplication(argc, (char**)argv);
39 QGuiApplication *application = new QGuiApplication(argc, (char**)argv);
@@ -88,6 +91,9 @@ int main(int argc, const char *argv[])
88 view->setTitle("Scopes");
91 view->setTitle("Scopes");
89 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
92 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
90
93
94+ TouchRegistry touchRegistry;
95+ view->installEventFilter(&touchRegistry);
96+
91 // You will need this if you want to interact with touch-only components using a mouse
97 // You will need this if you want to interact with touch-only components using a mouse
92 // Needed only when manually testing on a desktop.
98 // Needed only when manually testing on a desktop.
93 MouseTouchAdaptor *mouseTouchAdaptor = 0;
99 MouseTouchAdaptor *mouseTouchAdaptor = 0;
src/main.cpp+5
@@ -34,6 +34,9 @@
34#include "ApplicationArguments.h"
34#include "ApplicationArguments.h"
35#include "CachingNetworkManagerFactory.h"
35#include "CachingNetworkManagerFactory.h"
36
36
37+// Ubuntu Gestures
38+#include <TouchRegistry.h>
39+
37int main(int argc, const char *argv[])
40int main(int argc, const char *argv[])
38{
41{
39 bool isMirServer = false;
42 bool isMirServer = false;
@@ -120,6 +123,8 @@ Load the testability driver");
120 if (parser.isSet(framelessOption)) {
123 if (parser.isSet(framelessOption)) {
121 view->setFlags(Qt::FramelessWindowHint);
124 view->setFlags(Qt::FramelessWindowHint);
122 }
125 }
126+ TouchRegistry touchRegistry;
127+ view->installEventFilter(&touchRegistry);
123
128
124 // You will need this if you want to interact with touch-only components using a mouse
129 // You will need this if you want to interact with touch-only components using a mouse
125 // Needed only when manually testing on a desktop.
130 // Needed only when manually testing on a desktop.
tests/CMakeLists.txt+1
@@ -7,6 +7,7 @@ add_custom_target(qmluitests)
7add_custom_target(qmltests)
7add_custom_target(qmltests)
8add_dependencies(qmltests qmlunittests qmluitests)
8add_dependencies(qmltests qmlunittests qmluitests)
9
9
10+add_subdirectory(libs)
10add_subdirectory(qmltests)
11add_subdirectory(qmltests)
11add_subdirectory(mocks)
12add_subdirectory(mocks)
12add_subdirectory(whitespace)
13add_subdirectory(whitespace)
tests/autopilot/unity8/indicators/tests/test_indicators.py+2−2
@@ -72,11 +72,11 @@ class IndicatorPageTitleMatchesWidgetTestCase(IndicatorTestCase):
72 ('Bluetooth', dict(indicator_name='indicator-bluetooth',
72 ('Bluetooth', dict(indicator_name='indicator-bluetooth',
73 title='Bluetooth')),
73 title='Bluetooth')),
74 ('Datetime', dict(indicator_name='indicator-datetime',
74 ('Datetime', dict(indicator_name='indicator-datetime',
75− title='Upcoming events')),
75+ title='Time & Date')),
76 ('Location', dict(indicator_name='indicator-location',
76 ('Location', dict(indicator_name='indicator-location',
77 title='Location')),
77 title='Location')),
78 ('Messaging', dict(indicator_name='indicator-messages',
78 ('Messaging', dict(indicator_name='indicator-messages',
79− title='Notification center')),
79+ title='Notifications')),
80 ('Network', dict(indicator_name='indicator-network',
80 ('Network', dict(indicator_name='indicator-network',
81 title='Network')),
81 title='Network')),
82 ('Power', dict(indicator_name='indicator-power',
82 ('Power', dict(indicator_name='indicator-power',
tests/autopilot/unity8/shell/emulators/dash.py+1−1
@@ -206,7 +206,7 @@ class GenericScopeView(emulators.UnityEmulatorBase):
206 def _get_category_element(self, category):
206 def _get_category_element(self, category):
207 try:
207 try:
208 return self.wait_select_single(
208 return self.wait_select_single(
209− 'Base', objectName='dashCategory{}'.format(category))
209+ 'DashCategoryBase', objectName='dashCategory{}'.format(category))
210 except dbus.StateNotFoundError:
210 except dbus.StateNotFoundError:
211 raise emulators.UnityEmulatorException(
211 raise emulators.UnityEmulatorException(
212 'No category found with name {}'.format(category))
212 'No category found with name {}'.format(category))
tests/libs/CMakeLists.txtnew file+1
@@ -0,0 +1 @@
1+add_subdirectory(UbuntuGestures)
tests/libs/UbuntuGestures/CMakeLists.txtnew file+20
@@ -0,0 +1,20 @@
1+include_directories(
2+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
3+ ${CMAKE_CURRENT_BINARY_DIR}
4+ )
5+
6+macro(add_gesture_test CLASSNAME)
7+ set(testCommand
8+ ${CLASSNAME}TestExec -o ${CMAKE_BINARY_DIR}/test${CLASSNAME}.xml,xunitxml -o -,txt)
9+
10+ add_test(NAME test${CLASSNAME} COMMAND ${testCommand})
11+
12+ set_tests_properties(test${CLASSNAME} PROPERTIES
13+ ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/libs/UbuntuGestures)
14+
15+ add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp)
16+ qt5_use_modules(${CLASSNAME}TestExec Test Core Gui Quick)
17+ target_link_libraries(${CLASSNAME}TestExec UbuntuGestures)
18+endmacro(add_gesture_test)
19+
20+add_gesture_test(TouchRegistry)
tests/libs/UbuntuGestures/tst_TouchRegistry.cppnew file+803
@@ -0,0 +1,803 @@
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+#include <QtTest>
18+#include <QSet>
19+#include <QTouchEvent>
20+
21+#include <Timer.h>
22+#include <TouchOwnershipEvent.h>
23+#include <TouchRegistry.h>
24+#include <UnownedTouchEvent.h>
25+
26+using namespace UbuntuGestures;
27+
28+class TouchMemento {
29+public:
30+ TouchMemento(const QTouchEvent *touchEvent);
31+ Qt::TouchPointStates touchPointStates;
32+ QList<QTouchEvent::TouchPoint> touchPoints;
33+
34+ bool containsTouchWithId(int touchId) const;
35+};
36+
37+class DummyCandidate : public QQuickItem
38+{
39+ Q_OBJECT
40+public:
41+ bool event(QEvent *e) override;
42+ QSet<int> ownedTouches;
43+ QSet<int> lostTouches;
44+ QList<TouchMemento> unownedTouchEvents;
45+};
46+
47+class tst_TouchRegistry : public QObject
48+{
49+ Q_OBJECT
50+public:
51+ tst_TouchRegistry() : QObject(0) { }
52+private Q_SLOTS:
53+ void initTestCase() {} // will be called before the first test function is executed
54+ void cleanupTestCase() {} // will be called after the last test function was executed.
55+
56+ void init() {} // called right before each and every test function is executed
57+ void cleanup() {} // called right after each and every test function is executed
58+
59+ void requestWithNoCandidates();
60+ void lateCandidateRequestGetsNothing();
61+ void lateCandidateGestOwnershipOnceEarlyCandidateQuits();
62+ void dispatchesTouchEventsToCandidates();
63+ void dispatchesTouchEventsToWatchers();
64+ void keepDispatchingToWatchersAfterLastCandidateGivesUp();
65+ void candidatesAndWatchers_1();
66+ void candidatesAndWatchers_2();
67+ void rejectingTouchfterItsEnd();
68+ void removeOldUndecidedCandidates();
69+};
70+
71+void tst_TouchRegistry::requestWithNoCandidates()
72+{
73+ TouchRegistry touchRegistry;
74+ DummyCandidate candidate;
75+
76+ {
77+ QList<QTouchEvent::TouchPoint> touchPoints;
78+ touchPoints.append(QTouchEvent::TouchPoint(0));
79+ touchPoints[0].setState(Qt::TouchPointPressed);
80+ QTouchEvent touchEvent(QEvent::TouchBegin,
81+ 0 /* device */,
82+ Qt::NoModifier,
83+ Qt::TouchPointPressed,
84+ touchPoints);
85+ touchRegistry.update(&touchEvent);
86+ }
87+
88+ touchRegistry.requestTouchOwnership(0, &candidate);
89+
90+ QVERIFY(candidate.ownedTouches.contains(0));
91+}
92+
93+void tst_TouchRegistry::lateCandidateRequestGetsNothing()
94+{
95+ TouchRegistry touchRegistry;
96+ DummyCandidate earlyCandidate;
97+ earlyCandidate.setObjectName("early");
98+ DummyCandidate lateCandidate;
99+ lateCandidate.setObjectName("late");
100+
101+ {
102+ QList<QTouchEvent::TouchPoint> touchPoints;
103+ touchPoints.append(QTouchEvent::TouchPoint(0));
104+ touchPoints[0].setState(Qt::TouchPointPressed);
105+ QTouchEvent touchEvent(QEvent::TouchBegin,
106+ 0 /* device */,
107+ Qt::NoModifier,
108+ Qt::TouchPointPressed,
109+ touchPoints);
110+ touchRegistry.update(&touchEvent);
111+ }
112+
113+ touchRegistry.addCandidateOwnerForTouch(0, &earlyCandidate);
114+ touchRegistry.addCandidateOwnerForTouch(0, &lateCandidate);
115+
116+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
117+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
118+
119+ touchRegistry.requestTouchOwnership(0, &lateCandidate);
120+
121+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
122+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
123+
124+ touchRegistry.requestTouchOwnership(0, &earlyCandidate);
125+
126+ QVERIFY(earlyCandidate.ownedTouches.contains(0));
127+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
128+}
129+
130+void tst_TouchRegistry::lateCandidateGestOwnershipOnceEarlyCandidateQuits()
131+{
132+ TouchRegistry touchRegistry;
133+ DummyCandidate earlyCandidate;
134+ DummyCandidate lateCandidate;
135+
136+ {
137+ QList<QTouchEvent::TouchPoint> touchPoints;
138+ touchPoints.append(QTouchEvent::TouchPoint(0));
139+ touchPoints[0].setState(Qt::TouchPointPressed);
140+ QTouchEvent touchEvent(QEvent::TouchBegin,
141+ 0 /* device */,
142+ Qt::NoModifier,
143+ Qt::TouchPointPressed,
144+ touchPoints);
145+ touchRegistry.update(&touchEvent);
146+ }
147+
148+ touchRegistry.addCandidateOwnerForTouch(0, &earlyCandidate);
149+ touchRegistry.addCandidateOwnerForTouch(0, &lateCandidate);
150+
151+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
152+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
153+
154+ touchRegistry.requestTouchOwnership(0, &lateCandidate);
155+
156+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
157+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
158+
159+ touchRegistry.removeCandidateOwnerForTouch(0, &earlyCandidate);
160+
161+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
162+ QVERIFY(lateCandidate.ownedTouches.contains(0));
163+}
164+
165+void tst_TouchRegistry::dispatchesTouchEventsToCandidates()
166+{
167+ TouchRegistry touchRegistry;
168+ QQuickItem rootItem;
169+
170+ DummyCandidate candidate0;
171+ candidate0.setObjectName("0");
172+ candidate0.setParentItem(&rootItem);
173+ candidate0.setX(1);
174+ candidate0.setY(2);
175+
176+ DummyCandidate candidate1;
177+ candidate1.setObjectName("1");
178+ candidate0.setParentItem(&rootItem);
179+ candidate1.setX(3);
180+ candidate1.setY(4);
181+
182+ {
183+ QList<QTouchEvent::TouchPoint> touchPoints;
184+ touchPoints.append(QTouchEvent::TouchPoint(0));
185+ touchPoints[0].setState(Qt::TouchPointPressed);
186+ touchPoints[0].setRect(QRect(10, 10, 0, 0));
187+ QTouchEvent touchEvent(QEvent::TouchBegin,
188+ 0 /* device */,
189+ Qt::NoModifier,
190+ Qt::TouchPointPressed,
191+ touchPoints);
192+ touchRegistry.update(&touchEvent);
193+ }
194+
195+ touchRegistry.addCandidateOwnerForTouch(0, &candidate0);
196+
197+ {
198+ QList<QTouchEvent::TouchPoint> touchPoints;
199+ touchPoints.append(QTouchEvent::TouchPoint(0));
200+ touchPoints[0].setState(Qt::TouchPointMoved);
201+ touchPoints[0].setRect(QRect(11, 11, 0, 0));
202+ touchPoints.append(QTouchEvent::TouchPoint(1));
203+ touchPoints[1].setState(Qt::TouchPointPressed);
204+ touchPoints[1].setRect(QRect(20, 20, 0, 0));
205+ QTouchEvent touchEvent(QEvent::TouchUpdate,
206+ 0 /* device */,
207+ Qt::NoModifier,
208+ Qt::TouchPointPressed | Qt::TouchPointMoved,
209+ touchPoints);
210+ touchRegistry.update(&touchEvent);
211+ }
212+
213+ // candidate0 should have received an update on the touch he's interested on.
214+ QCOMPARE(candidate0.unownedTouchEvents.count(), 1);
215+ // make sure only touch 0 is there (i.e. no mention of touch 1)
216+ QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints.count(), 1);
217+ QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].id(), 0);
218+ // Check that the points local coordinates have been mapped to candidate0's coordinate system.
219+ QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().x(), 11 - candidate0.x());
220+ QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().y(), 11 - candidate0.y());
221+
222+ touchRegistry.addCandidateOwnerForTouch(1, &candidate1);
223+
224+ {
225+ QList<QTouchEvent::TouchPoint> touchPoints;
226+ touchPoints.append(QTouchEvent::TouchPoint(0));
227+ touchPoints[0].setState(Qt::TouchPointMoved);
228+ touchPoints[0].setRect(QRect(12, 12, 0, 0));
229+ touchPoints.append(QTouchEvent::TouchPoint(1));
230+ touchPoints[1].setState(Qt::TouchPointMoved);
231+ touchPoints[1].setRect(QRect(21, 21, 0, 0));
232+ QTouchEvent touchEvent(QEvent::TouchUpdate,
233+ 0 /* device */,
234+ Qt::NoModifier,
235+ Qt::TouchPointPressed | Qt::TouchPointMoved,
236+ touchPoints);
237+ touchRegistry.update(&touchEvent);
238+ }
239+
240+ // candidate0 gets updates only for touch 0 and
241+ // candidate1 gets updates only for touch 1
242+
243+ QCOMPARE(candidate0.unownedTouchEvents.count(), 2);
244+ QCOMPARE(candidate0.unownedTouchEvents[1].touchPoints.count(), 1);
245+ QCOMPARE(candidate0.unownedTouchEvents[1].touchPoints[0].id(), 0);
246+
247+ QCOMPARE(candidate1.unownedTouchEvents.count(), 1);
248+ QCOMPARE(candidate1.unownedTouchEvents[0].touchPoints.count(), 1);
249+ QCOMPARE(candidate1.unownedTouchEvents[0].touchPoints[0].id(), 1);
250+}
251+
252+void tst_TouchRegistry::dispatchesTouchEventsToWatchers()
253+{
254+ TouchRegistry touchRegistry;
255+ QQuickItem rootItem;
256+
257+ DummyCandidate watcher;
258+ watcher.setObjectName("watcher");
259+ watcher.setParentItem(&rootItem);
260+ watcher.setX(1);
261+ watcher.setY(2);
262+
263+ {
264+ QList<QTouchEvent::TouchPoint> touchPoints;
265+ touchPoints.append(QTouchEvent::TouchPoint(0));
266+ touchPoints[0].setState(Qt::TouchPointPressed);
267+ touchPoints[0].setRect(QRect(10, 10, 0, 0));
268+ QTouchEvent touchEvent(QEvent::TouchBegin,
269+ 0 /* device */,
270+ Qt::NoModifier,
271+ Qt::TouchPointPressed,
272+ touchPoints);
273+ touchRegistry.update(&touchEvent);
274+ }
275+
276+ touchRegistry.addTouchWatcher(0, &watcher);
277+
278+ {
279+ QList<QTouchEvent::TouchPoint> touchPoints;
280+ touchPoints.append(QTouchEvent::TouchPoint(0));
281+ touchPoints[0].setState(Qt::TouchPointMoved);
282+ touchPoints[0].setRect(QRect(11, 11, 0, 0));
283+ touchPoints.append(QTouchEvent::TouchPoint(1));
284+ touchPoints[1].setState(Qt::TouchPointPressed);
285+ touchPoints[1].setRect(QRect(20, 20, 0, 0));
286+ QTouchEvent touchEvent(QEvent::TouchUpdate,
287+ 0 /* device */,
288+ Qt::NoModifier,
289+ Qt::TouchPointPressed | Qt::TouchPointMoved,
290+ touchPoints);
291+ touchRegistry.update(&touchEvent);
292+ }
293+
294+ // watcher should have received an update on the touch he's interested on.
295+ QCOMPARE(watcher.unownedTouchEvents.count(), 1);
296+ // make sure only touch 0 is there (i.e. no mention of touch 1)
297+ QCOMPARE(watcher.unownedTouchEvents[0].touchPoints.count(), 1);
298+ QCOMPARE(watcher.unownedTouchEvents[0].touchPoints[0].id(), 0);
299+ // Check that the points local coordinates have been mapped to watcher's coordinate system.
300+ QCOMPARE(watcher.unownedTouchEvents[0].touchPoints[0].rect().x(), 11 - watcher.x());
301+ QCOMPARE(watcher.unownedTouchEvents[0].touchPoints[0].rect().y(), 11 - watcher.y());
302+
303+ {
304+ QList<QTouchEvent::TouchPoint> touchPoints;
305+ touchPoints.append(QTouchEvent::TouchPoint(0));
306+ touchPoints[0].setState(Qt::TouchPointMoved);
307+ touchPoints[0].setRect(QRect(12, 12, 0, 0));
308+ touchPoints.append(QTouchEvent::TouchPoint(1));
309+ touchPoints[1].setState(Qt::TouchPointMoved);
310+ touchPoints[1].setRect(QRect(21, 21, 0, 0));
311+ QTouchEvent touchEvent(QEvent::TouchUpdate,
312+ 0 /* device */,
313+ Qt::NoModifier,
314+ Qt::TouchPointPressed | Qt::TouchPointMoved,
315+ touchPoints);
316+ touchRegistry.update(&touchEvent);
317+ }
318+
319+ // watcher gets updates only for touch 0
320+
321+ QCOMPARE(watcher.unownedTouchEvents.count(), 2);
322+ QCOMPARE(watcher.unownedTouchEvents[1].touchPoints.count(), 1);
323+ QCOMPARE(watcher.unownedTouchEvents[1].touchPoints[0].id(), 0);
324+}
325+
326+void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
327+{
328+ TouchRegistry touchRegistry;
329+ DummyCandidate item;
330+
331+ {
332+ QList<QTouchEvent::TouchPoint> touchPoints;
333+ touchPoints.append(QTouchEvent::TouchPoint(0));
334+ touchPoints[0].setState(Qt::TouchPointPressed);
335+ QTouchEvent touchEvent(QEvent::TouchBegin,
336+ 0 /* device */,
337+ Qt::NoModifier,
338+ Qt::TouchPointPressed,
339+ touchPoints);
340+ touchRegistry.update(&touchEvent);
341+ }
342+
343+ touchRegistry.addCandidateOwnerForTouch(0, &item);
344+
345+ {
346+ QList<QTouchEvent::TouchPoint> touchPoints;
347+ touchPoints.append(QTouchEvent::TouchPoint(0));
348+ touchPoints[0].setState(Qt::TouchPointMoved);
349+ touchPoints.append(QTouchEvent::TouchPoint(1));
350+ touchPoints[1].setState(Qt::TouchPointPressed);
351+ QTouchEvent touchEvent(QEvent::TouchUpdate,
352+ 0 /* device */,
353+ Qt::NoModifier,
354+ Qt::TouchPointPressed | Qt::TouchPointMoved,
355+ touchPoints);
356+ touchRegistry.update(&touchEvent);
357+ }
358+
359+ QCOMPARE(item.unownedTouchEvents.count(), 1);
360+ QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 1);
361+ QCOMPARE(item.unownedTouchEvents[0].touchPoints[0].id(), 0);
362+ item.unownedTouchEvents.clear();
363+
364+ touchRegistry.addTouchWatcher(1, &item);
365+
366+ {
367+ QList<QTouchEvent::TouchPoint> touchPoints;
368+ touchPoints.append(QTouchEvent::TouchPoint(0));
369+ touchPoints[0].setState(Qt::TouchPointMoved);
370+ touchPoints.append(QTouchEvent::TouchPoint(1));
371+ touchPoints[1].setState(Qt::TouchPointMoved);
372+ QTouchEvent touchEvent(QEvent::TouchUpdate,
373+ 0 /* device */,
374+ Qt::NoModifier,
375+ Qt::TouchPointMoved,
376+ touchPoints);
377+ touchRegistry.update(&touchEvent);
378+ }
379+
380+ QCOMPARE(item.unownedTouchEvents.count(), 1);
381+ QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 2);
382+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(0));
383+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
384+ item.unownedTouchEvents.clear();
385+
386+ {
387+ QList<QTouchEvent::TouchPoint> touchPoints;
388+ touchPoints.append(QTouchEvent::TouchPoint(0));
389+ touchPoints[0].setState(Qt::TouchPointReleased);
390+ touchPoints.append(QTouchEvent::TouchPoint(1));
391+ touchPoints[1].setState(Qt::TouchPointMoved);
392+ QTouchEvent touchEvent(QEvent::TouchUpdate,
393+ 0 /* device */,
394+ Qt::NoModifier,
395+ Qt::TouchPointReleased | Qt::TouchPointMoved,
396+ touchPoints);
397+ touchRegistry.update(&touchEvent);
398+ }
399+
400+ QCOMPARE(item.unownedTouchEvents.count(), 1);
401+ QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 2);
402+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(0));
403+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
404+ item.unownedTouchEvents.clear();
405+
406+ touchRegistry.removeCandidateOwnerForTouch(0, &item);
407+
408+ {
409+ QList<QTouchEvent::TouchPoint> touchPoints;
410+ touchPoints.append(QTouchEvent::TouchPoint(1));
411+ touchPoints[0].setState(Qt::TouchPointReleased);
412+ QTouchEvent touchEvent(QEvent::TouchEnd,
413+ 0 /* device */,
414+ Qt::NoModifier,
415+ Qt::TouchPointReleased,
416+ touchPoints);
417+ touchRegistry.update(&touchEvent);
418+ }
419+
420+ QCOMPARE(item.unownedTouchEvents.count(), 1);
421+ QCOMPARE(item.unownedTouchEvents[0].touchPoints.count(), 1);
422+ QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
423+ item.unownedTouchEvents.clear();
424+
425+ QVERIFY(touchRegistry.m_touchInfoPool.isEmpty());
426+}
427+
428+/*
429+ Regression test that reproduces a problematic scenario that came up during manual testing.
430+ It reproduces the interaction between TouchRegistry and a DirectionalDragArea
431+ */
432+void tst_TouchRegistry::candidatesAndWatchers_1()
433+{
434+ TouchRegistry touchRegistry;
435+ DummyCandidate item;
436+
437+ {
438+ QList<QTouchEvent::TouchPoint> touchPoints;
439+ touchPoints.append(QTouchEvent::TouchPoint(0));
440+ touchPoints[0].setState(Qt::TouchPointPressed);
441+ QTouchEvent touchEvent(QEvent::TouchBegin,
442+ 0 /* device */,
443+ Qt::NoModifier,
444+ Qt::TouchPointPressed,
445+ touchPoints);
446+ touchRegistry.update(&touchEvent);
447+ }
448+
449+ touchRegistry.addCandidateOwnerForTouch(0, &item);
450+
451+ {
452+ QList<QTouchEvent::TouchPoint> touchPoints;
453+ touchPoints.append(QTouchEvent::TouchPoint(0));
454+ touchPoints[0].setState(Qt::TouchPointMoved);
455+ touchPoints.append(QTouchEvent::TouchPoint(1));
456+ touchPoints[1].setState(Qt::TouchPointPressed);
457+ QTouchEvent touchEvent(QEvent::TouchUpdate,
458+ 0 /* device */,
459+ Qt::NoModifier,
460+ Qt::TouchPointPressed | Qt::TouchPointMoved,
461+ touchPoints);
462+ touchRegistry.update(&touchEvent);
463+ }
464+
465+ touchRegistry.addTouchWatcher(1, &item);
466+
467+ touchRegistry.removeCandidateOwnerForTouch(0, &item);
468+
469+ touchRegistry.addTouchWatcher(0, &item);
470+
471+ {
472+ QList<QTouchEvent::TouchPoint> touchPoints;
473+ touchPoints.append(QTouchEvent::TouchPoint(0));
474+ touchPoints[0].setState(Qt::TouchPointReleased);
475+ touchPoints.append(QTouchEvent::TouchPoint(1));
476+ touchPoints[1].setState(Qt::TouchPointMoved);
477+ QTouchEvent touchEvent(QEvent::TouchUpdate,
478+ 0 /* device */,
479+ Qt::NoModifier,
480+ Qt::TouchPointReleased | Qt::TouchPointMoved,
481+ touchPoints);
482+ touchRegistry.update(&touchEvent);
483+ }
484+
485+ {
486+ QList<QTouchEvent::TouchPoint> touchPoints;
487+ touchPoints.append(QTouchEvent::TouchPoint(1));
488+ touchPoints[0].setState(Qt::TouchPointReleased);
489+ QTouchEvent touchEvent(QEvent::TouchEnd,
490+ 0 /* device */,
491+ Qt::NoModifier,
492+ Qt::TouchPointReleased,
493+ touchPoints);
494+ touchRegistry.update(&touchEvent);
495+ }
496+
497+ QVERIFY(touchRegistry.m_touchInfoPool.isEmpty());
498+
499+ item.unownedTouchEvents.clear();
500+
501+ {
502+ QList<QTouchEvent::TouchPoint> touchPoints;
503+ touchPoints.append(QTouchEvent::TouchPoint(0));
504+ touchPoints[0].setState(Qt::TouchPointPressed);
505+ QTouchEvent touchEvent(QEvent::TouchBegin,
506+ 0 /* device */,
507+ Qt::NoModifier,
508+ Qt::TouchPointPressed,
509+ touchPoints);
510+ touchRegistry.update(&touchEvent);
511+ }
512+
513+ // Haven't made any subscription for that new touch 0.
514+ QCOMPARE(item.unownedTouchEvents.count(), 0);
515+}
516+
517+/*
518+ Regression test that reproduces a problematic scenario that came up during manual testing.
519+ It reproduces the interaction between TouchRegistry, DirectionalDragArea and a TouchGate.
520+ */
521+void tst_TouchRegistry::candidatesAndWatchers_2()
522+{
523+ TouchRegistry touchRegistry;
524+
525+ DummyCandidate directionalDragArea;
526+ directionalDragArea.setObjectName("DirectionalDragArea");
527+
528+ DummyCandidate touchGate;
529+ touchGate.setObjectName("TouchGate");
530+
531+ // [DDA] 1298 TouchBegin (id:0, state:pressed, scenePos:(147,1023))
532+ {
533+ QList<QTouchEvent::TouchPoint> touchPoints;
534+ touchPoints.append(QTouchEvent::TouchPoint(0));
535+ touchPoints[0].setState(Qt::TouchPointPressed);
536+ QTouchEvent touchEvent(QEvent::TouchBegin,
537+ 0 /* device */,
538+ Qt::NoModifier,
539+ Qt::TouchPointPressed,
540+ touchPoints);
541+ touchRegistry.update(&touchEvent);
542+ }
543+
544+ // [TouchRegistry] addCandidateOwnerForTouch id 0 candidate DirectionalDragArea
545+ touchRegistry.addCandidateOwnerForTouch(0, &directionalDragArea);
546+
547+ // [TouchRegistry] requestTouchOwnership id 0 candidate TouchGate
548+ touchRegistry.requestTouchOwnership(0, &touchGate);
549+
550+ //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(147,1023)) (id:1, state:pressed, scenePos:(327,792))
551+ {
552+ QList<QTouchEvent::TouchPoint> touchPoints;
553+ touchPoints.append(QTouchEvent::TouchPoint(0));
554+ touchPoints[0].setState(Qt::TouchPointMoved);
555+ touchPoints.append(QTouchEvent::TouchPoint(1));
556+ touchPoints[1].setState(Qt::TouchPointPressed);
557+ QTouchEvent touchEvent(QEvent::TouchUpdate,
558+ 0 /* device */,
559+ Qt::NoModifier,
560+ Qt::TouchPointPressed | Qt::TouchPointMoved,
561+ touchPoints);
562+ touchRegistry.update(&touchEvent);
563+ }
564+
565+ // [TouchRegistry] addTouchWatcher id 1 watcher DirectionalDragArea
566+ touchRegistry.addTouchWatcher(1, &directionalDragArea);
567+
568+ // [TouchRegistry] removeCandidateOwnerForTouch id 0 candidate DirectionalDragArea
569+ touchRegistry.removeCandidateOwnerForTouch(0, &directionalDragArea);
570+
571+ //[TouchRegistry] sending TouchWonershipEvent(id = 0 gained) to candidate TouchGate
572+ QCOMPARE(touchGate.ownedTouches.count(), 1);
573+ QVERIFY(touchGate.ownedTouches.contains(0));
574+
575+ // [TouchRegistry] addTouchWatcher id 0 watcher DirectionalDragArea
576+ touchRegistry.addTouchWatcher(0, &directionalDragArea);
577+
578+ // [TouchRegistry] requestTouchOwnership id 1 candidate TouchGate
579+ touchRegistry.requestTouchOwnership(1, &touchGate);
580+
581+ //[TouchRegistry] sending TouchWonershipEvent(id = 1 gained) to candidate TouchGate
582+ QCOMPARE(touchGate.ownedTouches.count(), 2);
583+ QVERIFY(touchGate.ownedTouches.contains(1));
584+
585+ directionalDragArea.unownedTouchEvents.clear();
586+ touchGate.unownedTouchEvents.clear();
587+
588+ //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(148,1025)) (id:1, state:moved, scenePos:(329,795))
589+ {
590+ QList<QTouchEvent::TouchPoint> touchPoints;
591+ touchPoints.append(QTouchEvent::TouchPoint(0));
592+ touchPoints[0].setState(Qt::TouchPointMoved);
593+ touchPoints.append(QTouchEvent::TouchPoint(1));
594+ touchPoints[1].setState(Qt::TouchPointMoved);
595+ QTouchEvent touchEvent(QEvent::TouchUpdate,
596+ 0 /* device */,
597+ Qt::NoModifier,
598+ Qt::TouchPointMoved,
599+ touchPoints);
600+ touchRegistry.update(&touchEvent);
601+ }
602+
603+ //vvvvv DDA Watchers are being ignored from now on vvvvvvv
604+
605+ QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
606+ QCOMPARE(directionalDragArea.unownedTouchEvents.first().touchPoints.count(), 2);
607+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(0));
608+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(1));
609+
610+ QVERIFY(touchGate.unownedTouchEvents.isEmpty());
611+
612+ directionalDragArea.unownedTouchEvents.clear();
613+
614+ //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(151,1029)) (id:1, state:released, scenePos:(329,795))
615+ {
616+ QList<QTouchEvent::TouchPoint> touchPoints;
617+ touchPoints.append(QTouchEvent::TouchPoint(0));
618+ touchPoints[0].setState(Qt::TouchPointMoved);
619+ touchPoints.append(QTouchEvent::TouchPoint(1));
620+ touchPoints[1].setState(Qt::TouchPointReleased);
621+ QTouchEvent touchEvent(QEvent::TouchUpdate,
622+ 0 /* device */,
623+ Qt::NoModifier,
624+ Qt::TouchPointMoved | Qt::TouchPointReleased,
625+ touchPoints);
626+ touchRegistry.update(&touchEvent);
627+ }
628+
629+ QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
630+ QCOMPARE(directionalDragArea.unownedTouchEvents.first().touchPoints.count(), 2);
631+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(0));
632+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(1));
633+
634+ QVERIFY(touchGate.unownedTouchEvents.isEmpty());
635+
636+ directionalDragArea.unownedTouchEvents.clear();
637+
638+ //[TouchRegistry] got TouchEnd (id:0, state:released, scenePos:(157,1034))
639+ {
640+ QList<QTouchEvent::TouchPoint> touchPoints;
641+ touchPoints.append(QTouchEvent::TouchPoint(0));
642+ touchPoints[0].setState(Qt::TouchPointReleased);
643+ QTouchEvent touchEvent(QEvent::TouchEnd,
644+ 0 /* device */,
645+ Qt::NoModifier,
646+ Qt::TouchPointReleased,
647+ touchPoints);
648+ touchRegistry.update(&touchEvent);
649+ }
650+
651+ QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
652+ QCOMPARE(directionalDragArea.unownedTouchEvents.first().touchPoints.count(), 1);
653+ QVERIFY(directionalDragArea.unownedTouchEvents.first().containsTouchWithId(0));
654+
655+ QVERIFY(touchGate.unownedTouchEvents.isEmpty());
656+}
657+
658+void tst_TouchRegistry::rejectingTouchfterItsEnd()
659+{
660+ TouchRegistry touchRegistry;
661+ DummyCandidate earlyCandidate;
662+ DummyCandidate lateCandidate;
663+
664+ {
665+ QList<QTouchEvent::TouchPoint> touchPoints;
666+ touchPoints.append(QTouchEvent::TouchPoint(0));
667+ touchPoints[0].setState(Qt::TouchPointPressed);
668+ QTouchEvent touchEvent(QEvent::TouchBegin,
669+ 0 /* device */,
670+ Qt::NoModifier,
671+ Qt::TouchPointPressed,
672+ touchPoints);
673+ touchRegistry.update(&touchEvent);
674+ }
675+
676+ touchRegistry.addCandidateOwnerForTouch(0, &earlyCandidate);
677+ touchRegistry.addCandidateOwnerForTouch(0, &lateCandidate);
678+
679+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
680+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
681+
682+ touchRegistry.requestTouchOwnership(0, &lateCandidate);
683+
684+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
685+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
686+
687+ {
688+ QList<QTouchEvent::TouchPoint> touchPoints;
689+ touchPoints.append(QTouchEvent::TouchPoint(0));
690+ touchPoints[0].setState(Qt::TouchPointReleased);
691+ QTouchEvent touchEvent(QEvent::TouchEnd,
692+ 0 /* device */,
693+ Qt::NoModifier,
694+ Qt::TouchPointPressed,
695+ touchPoints);
696+ touchRegistry.update(&touchEvent);
697+ }
698+
699+ QVERIFY(earlyCandidate.ownedTouches.isEmpty());
700+ QVERIFY(lateCandidate.ownedTouches.isEmpty());
701+
702+ touchRegistry.removeCandidateOwnerForTouch(0, &earlyCandidate);
703+
704+ QCOMPARE(lateCandidate.ownedTouches.count(), 1);
705+ QCOMPARE(lateCandidate.ownedTouches.contains(0), 1);
706+
707+ // Check that there's no trace left of touch 0 as we no longer need to keep tabs on it.
708+ QVERIFY(!touchRegistry.findTouchInfo(0));
709+}
710+
711+void tst_TouchRegistry::removeOldUndecidedCandidates()
712+{
713+ FakeTimerFactory *fakeTimerFactory = new FakeTimerFactory;
714+ TouchRegistry *touchRegistry = new TouchRegistry(nullptr, fakeTimerFactory);
715+
716+ DummyCandidate undecidedCandidate;
717+ undecidedCandidate.setObjectName("undecided");
718+
719+ DummyCandidate candidateThatWantsTouch;
720+ candidateThatWantsTouch.setObjectName("wantsTouch");
721+
722+ {
723+ QList<QTouchEvent::TouchPoint> touchPoints;
724+ touchPoints.append(QTouchEvent::TouchPoint(0));
725+ touchPoints[0].setState(Qt::TouchPointPressed);
726+ QTouchEvent touchEvent(QEvent::TouchBegin,
727+ 0 /* device */,
728+ Qt::NoModifier,
729+ Qt::TouchPointPressed,
730+ touchPoints);
731+ touchRegistry->update(&touchEvent);
732+ }
733+
734+ touchRegistry->addCandidateOwnerForTouch(0, &undecidedCandidate);
735+
736+ touchRegistry->requestTouchOwnership(0, &candidateThatWantsTouch);
737+
738+ QVERIFY(undecidedCandidate.ownedTouches.isEmpty());
739+ QVERIFY(undecidedCandidate.lostTouches.isEmpty());
740+ QVERIFY(candidateThatWantsTouch.ownedTouches.isEmpty());
741+ QVERIFY(candidateThatWantsTouch.lostTouches.isEmpty());
742+
743+ // Simulate that enough time has passed to cause the CandidateInactivityTimer to timeout,
744+ // making TouchRegistry consider that undecidedCantidate defaulted.
745+ fakeTimerFactory->makeRunningTimersTimeout();
746+
747+ QVERIFY(undecidedCandidate.ownedTouches.isEmpty());
748+ QVERIFY(undecidedCandidate.lostTouches.contains(0));
749+ QVERIFY(candidateThatWantsTouch.ownedTouches.contains(0));
750+ QVERIFY(candidateThatWantsTouch.lostTouches.isEmpty());
751+
752+ delete touchRegistry;
753+}
754+
755+////////////// TouchMemento //////////
756+
757+TouchMemento::TouchMemento(const QTouchEvent *touchEvent)
758+ : touchPointStates(touchEvent->touchPointStates()), touchPoints(touchEvent->touchPoints())
759+{
760+}
761+
762+bool TouchMemento::containsTouchWithId(int touchId) const
763+{
764+ for (int i = 0; i < touchPoints.count(); ++i) {
765+ if (touchPoints.at(i).id() == touchId) {
766+ return true;
767+ }
768+ }
769+ return false;
770+}
771+
772+////////////// DummyCandidate //////////
773+
774+bool DummyCandidate::event(QEvent *e)
775+{
776+ if (e->type() == TouchOwnershipEvent::touchOwnershipEventType()) {
777+ TouchOwnershipEvent *touchOwnershipEvent = static_cast<TouchOwnershipEvent *>(e);
778+
779+ // NB: Cannot use QVERIFY here because the macro doesn't return a boolean and is
780+ // meant for use only directly in the body of a test function
781+ if (ownedTouches.contains(touchOwnershipEvent->touchId()))
782+ qFatal("Sent ownership event for a touch that is already owned.");
783+ if (lostTouches.contains(touchOwnershipEvent->touchId()))
784+ qFatal("Sent ownership event for a touch that has already been lost.");
785+
786+ if (touchOwnershipEvent->gained()) {
787+ ownedTouches.insert(touchOwnershipEvent->touchId());
788+ } else {
789+ lostTouches.insert(touchOwnershipEvent->touchId());
790+ }
791+ return true;
792+ } else if (e->type() == UnownedTouchEvent::unownedTouchEventType()) {
793+ UnownedTouchEvent *unownedTouchEvent = static_cast<UnownedTouchEvent *>(e);
794+ unownedTouchEvents.append(TouchMemento(unownedTouchEvent->touchEvent()));
795+ return true;
796+ } else {
797+ return QObject::event(e);
798+ }
799+}
800+
801+QTEST_GUILESS_MAIN(tst_TouchRegistry)
802+
803+#include "tst_TouchRegistry.moc"
tests/mocks/AccountsService/AccountsService.cpp+5−3
@@ -26,7 +26,8 @@ AccountsService::AccountsService(QObject* parent)
26 m_enableIndicatorsWhileLocked(true),
26 m_enableIndicatorsWhileLocked(true),
27 m_backgroundFile(qmlDirectory() + "graphics/phone_background.jpg"),
27 m_backgroundFile(qmlDirectory() + "graphics/phone_background.jpg"),
28 m_statsWelcomeScreen(true),
28 m_statsWelcomeScreen(true),
29− m_failedLogins(0)
29+ m_failedLogins(0),
30+ m_demoEdges(false)
30{
31{
31}
32}
32
33
@@ -44,12 +45,13 @@ void AccountsService::setUser(const QString &user)
44
45
45bool AccountsService::demoEdges() const
46bool AccountsService::demoEdges() const
46{
47{
47− return false;
48+ return m_demoEdges;
48}
49}
49
50
50void AccountsService::setDemoEdges(bool demoEdges)
51void AccountsService::setDemoEdges(bool demoEdges)
51{
52{
52− Q_UNUSED(demoEdges)
53+ m_demoEdges = demoEdges;
54+ Q_EMIT demoEdgesChanged();
53}
55}
54
56
55bool AccountsService::enableLauncherWhileLocked() const
57bool AccountsService::enableLauncherWhileLocked() const
tests/mocks/AccountsService/AccountsService.h+1
@@ -101,6 +101,7 @@ private:
101 QString m_user;
101 QString m_user;
102 bool m_statsWelcomeScreen;
102 bool m_statsWelcomeScreen;
103 uint m_failedLogins;
103 uint m_failedLogins;
104+ bool m_demoEdges;
104};
105};
105
106
106#endif
107#endif
tests/mocks/Unity/Application/CMakeLists.txt+1
@@ -13,6 +13,7 @@ set(FakeUnityApplicationQml_SOURCES
13 SessionManager.cpp
13 SessionManager.cpp
14 SurfaceManager.cpp
14 SurfaceManager.cpp
15 SessionModel.h
15 SessionModel.h
16+ UbuntuKeyboardInfo.cpp
16 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
17 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
17 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
18 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
18)
19)
tests/mocks/Unity/Application/MirSurfaceItem.cpp+18−22
@@ -40,6 +40,8 @@ MirSurfaceItem::MirSurfaceItem(const QString& name,
40 , m_state(state)
40 , m_state(state)
41 , m_live(true)
41 , m_live(true)
42 , m_orientation(Qt::PortraitOrientation)
42 , m_orientation(Qt::PortraitOrientation)
43+ , m_touchPressCount(0)
44+ , m_touchReleaseCount(0)
43 , m_qmlItem(nullptr)
45 , m_qmlItem(nullptr)
44 , m_screenshotUrl(screenshot)
46 , m_screenshotUrl(screenshot)
45{
47{
@@ -144,24 +146,12 @@ void MirSurfaceItem::setLive(bool live)
144 }
146 }
145}
147}
146
148
147−void MirSurfaceItem::onQmlWantInputMethodChanged()
148−{
149− QQmlProperty prop(m_qmlItem, "wantInputMethod");
150− bool wantInputMethod = prop.read().toBool();
151−
152− if (hasFocus() && wantInputMethod) {
153− Q_EMIT inputMethodRequested();
154− }
155−}
156−
157void MirSurfaceItem::onFocusChanged()
149void MirSurfaceItem::onFocusChanged()
158{
150{
159− QQmlProperty prop(m_qmlItem, "wantInputMethod");
160− bool wantInputMethod = prop.read().toBool();
161−
162− if (!hasFocus() && wantInputMethod) {
151+ if (!hasFocus()) {
152+ // Causes a crash in tst_Shell.qml, inside the mock Unity.Application itself.
153+ // Didn't have time to debug yet.
163− Q_EMIT inputMethodDismissed();
154+ //Q_EMIT inputMethodDismissed();
164− prop.write(QVariant::fromValue(false));
165 }
155 }
166}
156}
167
157
@@ -194,12 +184,18 @@ void MirSurfaceItem::createQmlContentItem()
194 QQmlProperty screenshotSource(m_qmlItem, "screenshotSource");
184 QQmlProperty screenshotSource(m_qmlItem, "screenshotSource");
195 screenshotSource.write(QVariant::fromValue(m_screenshotUrl));
185 screenshotSource.write(QVariant::fromValue(m_screenshotUrl));
196 }
186 }
187+}
197
188
198− {
189+void MirSurfaceItem::touchEvent(QTouchEvent * event)
199− QQmlProperty prop(m_qmlItem, "wantInputMethod");
190+{
200− if (prop.type() == QQmlProperty::Property) {
191+ if (event->touchPointStates() & Qt::TouchPointPressed) {
201− bool ok = prop.connectNotifySignal(this, SLOT(onQmlWantInputMethodChanged()));
192+ ++m_touchPressCount;
202− if (!ok) qCritical("MirSurfaceItem: failed to connect to wantInputMethod notify signal");
193+ Q_EMIT touchPressCountChanged(m_touchPressCount);
203− }
194+ // Causes a crash in tst_Shell.qml, inside the mock Unity.Application itself.
195+ // Didn't have time to debug yet.
196+ // Q_EMIT inputMethodRequested();
197+ } else if (event->touchPointStates() & Qt::TouchPointReleased) {
198+ ++m_touchReleaseCount;
199+ Q_EMIT touchReleaseCountChanged(m_touchReleaseCount);
204 }
200 }
205}
201}
tests/mocks/Unity/Application/MirSurfaceItem.h+18−1
@@ -36,6 +36,11 @@ class MirSurfaceItem : public QQuickItem
36 Q_PROPERTY(bool live READ live NOTIFY liveChanged)
36 Q_PROPERTY(bool live READ live NOTIFY liveChanged)
37 Q_PROPERTY(Qt::ScreenOrientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged DESIGNABLE false)
37 Q_PROPERTY(Qt::ScreenOrientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged DESIGNABLE false)
38
38
39+ Q_PROPERTY(int touchPressCount READ touchPressCount WRITE setTouchPressCount NOTIFY touchPressCountChanged
40+ DESIGNABLE false)
41+ Q_PROPERTY(int touchReleaseCount READ touchReleaseCount WRITE setTouchReleaseCount NOTIFY touchReleaseCountChanged
42+ DESIGNABLE false)
43+
39public:
44public:
40 enum Type {
45 enum Type {
41 Normal,
46 Normal,
@@ -73,6 +78,12 @@ public:
73 void setScreenshot(const QUrl& screenshot);
78 void setScreenshot(const QUrl& screenshot);
74 void setLive(bool live);
79 void setLive(bool live);
75
80
81+ int touchPressCount() const { return m_touchPressCount; }
82+ void setTouchPressCount(int count) { m_touchPressCount = count; Q_EMIT touchPressCountChanged(count); }
83+
84+ int touchReleaseCount() const { return m_touchReleaseCount; }
85+ void setTouchReleaseCount(int count) { m_touchReleaseCount = count; Q_EMIT touchReleaseCountChanged(count); }
86+
76 Q_INVOKABLE void setState(State newState);
87 Q_INVOKABLE void setState(State newState);
77 Q_INVOKABLE void release();
88 Q_INVOKABLE void release();
78
89
@@ -81,6 +92,8 @@ Q_SIGNALS:
81 void stateChanged(State);
92 void stateChanged(State);
82 void liveChanged(bool live);
93 void liveChanged(bool live);
83 void orientationChanged();
94 void orientationChanged();
95+ void touchPressCountChanged(int count);
96+ void touchReleaseCountChanged(int count);
84
97
85 void inputMethodRequested();
98 void inputMethodRequested();
86 void inputMethodDismissed();
99 void inputMethodDismissed();
@@ -88,10 +101,12 @@ Q_SIGNALS:
88 // internal mock use
101 // internal mock use
89 void deregister();
102 void deregister();
90
103
104+protected:
105+ void touchEvent(QTouchEvent * event) override;
106+
91private Q_SLOTS:
107private Q_SLOTS:
92 void onFocusChanged();
108 void onFocusChanged();
93 void onComponentStatusChanged(QQmlComponent::Status status);
109 void onComponentStatusChanged(QQmlComponent::Status status);
94− void onQmlWantInputMethodChanged();
95
110
96private:
111private:
97 explicit MirSurfaceItem(const QString& name,
112 explicit MirSurfaceItem(const QString& name,
@@ -110,6 +125,8 @@ private:
110 State m_state;
125 State m_state;
111 bool m_live;
126 bool m_live;
112 Qt::ScreenOrientation m_orientation;
127 Qt::ScreenOrientation m_orientation;
128+ int m_touchPressCount;
129+ int m_touchReleaseCount;
113
130
114 QQmlComponent *m_qmlContentComponent;
131 QQmlComponent *m_qmlContentComponent;
115 QQuickItem *m_qmlItem;
132 QQuickItem *m_qmlItem;
tests/mocks/Unity/Application/MirSurfaceItem.qml−12
@@ -17,7 +17,6 @@
17import QtQuick 2.0
17import QtQuick 2.0
18
18
19Rectangle {
19Rectangle {
20− objectName: "fakeSurfaceQML"
21 id: root
20 id: root
22 color: "pink"
21 color: "pink"
23
22
@@ -38,11 +37,6 @@ Rectangle {
38 property alias screenshotSource: screenshotImage.source
37 property alias screenshotSource: screenshotImage.source
39 property int orientation: Qt.PortraitOrientation
38 property int orientation: Qt.PortraitOrientation
40
39
41− property bool wantInputMethod: false
42−
43− property int touchPressCount: 0
44− property int touchReleaseCount: 0
45−
46 Image {
40 Image {
47 id: screenshotImage
41 id: screenshotImage
48 anchors.fill: parent
42 anchors.fill: parent
@@ -58,10 +52,4 @@ Rectangle {
58 minimumPixelSize: 10; font.pixelSize: 200
52 minimumPixelSize: 10; font.pixelSize: 200
59 verticalAlignment: Text.AlignVCenter
53 verticalAlignment: Text.AlignVCenter
60 }
54 }
61−
62− MultiPointTouchArea {
63− anchors.fill: parent
64− onPressed: { root.wantInputMethod = true; root.touchPressCount++; }
65− onReleased: { root.touchReleaseCount++; }
66− }
67}
55}
tests/mocks/Unity/Application/UbuntuKeyboardInfo.cppnew file+28
@@ -0,0 +1,28 @@
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 "UbuntuKeyboardInfo.h"
18+
19+UbuntuKeyboardInfo *UbuntuKeyboardInfo::m_instance = nullptr;
20+
21+UbuntuKeyboardInfo::UbuntuKeyboardInfo(QObject *parent)
22+ : QObject(parent),
23+ m_x(0),
24+ m_y(0),
25+ m_width(200),
26+ m_height(200)
27+{
28+}
tests/mocks/Unity/Application/UbuntuKeyboardInfo.hnew file+60
@@ -0,0 +1,60 @@
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 UBUNTU_KEYBOARD_INFO_H
18+#define UBUNTU_KEYBOARD_INFO_H
19+
20+#include <QLocalSocket>
21+#include <QTimer>
22+
23+class UbuntuKeyboardInfo : public QObject {
24+ Q_OBJECT
25+ Q_PROPERTY(qreal x READ x NOTIFY xChanged)
26+ Q_PROPERTY(qreal y READ y NOTIFY yChanged)
27+ Q_PROPERTY(qreal width READ width NOTIFY widthChanged)
28+ Q_PROPERTY(qreal height READ height NOTIFY heightChanged)
29+public:
30+ UbuntuKeyboardInfo(QObject *parent = 0);
31+ virtual ~UbuntuKeyboardInfo() {}
32+ qreal x() const { return m_x; }
33+ qreal y() const { return m_y; }
34+ qreal width() const { return m_width; }
35+ qreal height() const { return m_height; }
36+
37+ static UbuntuKeyboardInfo *singleton() {
38+ if (!m_instance) {
39+ m_instance = new UbuntuKeyboardInfo;
40+ }
41+ return m_instance;
42+ }
43+
44+Q_SIGNALS:
45+ void xChanged(qreal x);
46+ void yChanged(qreal y);
47+ void widthChanged(qreal width);
48+ void heightChanged(qreal height);
49+
50+private:
51+ QLocalSocket m_socket;
52+ qint32 m_x;
53+ qint32 m_y;
54+ qint32 m_width;
55+ qint32 m_height;
56+
57+ static UbuntuKeyboardInfo *m_instance;
58+};
59+
60+#endif // UBUNTU_KEYBOARD_INFO_H
tests/mocks/Unity/Application/plugin.cpp+7
@@ -24,6 +24,7 @@
24#include "SurfaceManager.h"
24#include "SurfaceManager.h"
25#include "SessionManager.h"
25#include "SessionManager.h"
26#include "ApplicationTestInterface.h"
26#include "ApplicationTestInterface.h"
27+#include "UbuntuKeyboardInfo.h"
27
28
28#include <qqml.h>
29#include <qqml.h>
29#include <QQmlEngine>
30#include <QQmlEngine>
@@ -46,6 +47,11 @@ static QObject* sessionManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEng
46 return SessionManager::singleton();
47 return SessionManager::singleton();
47}
48}
48
49
50+static QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*) {
51+ return UbuntuKeyboardInfo::singleton();
52+}
53+
54+
49ApplicationTestInterface* s_appTestInterface = nullptr;
55ApplicationTestInterface* s_appTestInterface = nullptr;
50
56
51static QObject* applicationTestInterface(QQmlEngine* engine, QJSEngine* scriptEngine) {
57static QObject* applicationTestInterface(QQmlEngine* engine, QJSEngine* scriptEngine) {
@@ -76,6 +82,7 @@ void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
76 qmlRegisterSingletonType<SurfaceManager>(uri, 0, 1, "SurfaceManager", surfaceManagerSingleton);
82 qmlRegisterSingletonType<SurfaceManager>(uri, 0, 1, "SurfaceManager", surfaceManagerSingleton);
77 qmlRegisterSingletonType<SessionManager>(uri, 0, 1, "SessionManager", sessionManagerSingleton);
83 qmlRegisterSingletonType<SessionManager>(uri, 0, 1, "SessionManager", sessionManagerSingleton);
78 qmlRegisterSingletonType<ApplicationTestInterface>(uri, 0, 1, "ApplicationTest", applicationTestInterface);
84 qmlRegisterSingletonType<ApplicationTestInterface>(uri, 0, 1, "ApplicationTest", applicationTestInterface);
85+ qmlRegisterSingletonType<UbuntuKeyboardInfo>(uri, 0, 1, "UbuntuKeyboardInfo", ubuntuKeyboardInfoSingleton);
79
86
80 qRegisterMetaType<MirSurfaceItem::Type>("MirSurfaceItem::Type");
87 qRegisterMetaType<MirSurfaceItem::Type>("MirSurfaceItem::Type");
81 qRegisterMetaType<MirSurfaceItem::State>("MirSurfaceItem::State");
88 qRegisterMetaType<MirSurfaceItem::State>("MirSurfaceItem::State");
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+1
@@ -54,6 +54,7 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
54 item = new MockLauncherItem("ubuntu-weather-app", "/usr/share/applications/ubuntu-weather-app.desktop", "Weather", "weather", this);
54 item = new MockLauncherItem("ubuntu-weather-app", "/usr/share/applications/ubuntu-weather-app.desktop", "Weather", "weather", this);
55 item->setCount(1234567890);
55 item->setCount(1234567890);
56 item->setCountVisible(true);
56 item->setCountVisible(true);
57+ item->setPinned(true);
57 m_list.append(item);
58 m_list.append(item);
58 item = new MockLauncherItem("notes-app", "/usr/share/applications/notes-app.desktop", "Notepad", "notepad", this);
59 item = new MockLauncherItem("notes-app", "/usr/share/applications/notes-app.desktop", "Notepad", "notepad", this);
59 item->setProgress(50);
60 item->setProgress(50);
tests/mocks/libusermetrics/UserMetrics.cpp+2−2
@@ -238,7 +238,7 @@ void UserMetricsPrivate::setUsername(const QString &username)
238 m_username = username;
238 m_username = username;
239
239
240 m_dataIndex = m_fakeData.constFind(m_username);
240 m_dataIndex = m_fakeData.constFind(m_username);
241− if (m_dataIndex == m_fakeData.end())
241+ if (m_dataIndex == m_fakeData.constEnd())
242 {
242 {
243 m_dataIndex = m_fakeData.constFind("");
243 m_dataIndex = m_fakeData.constFind("");
244 }
244 }
@@ -383,7 +383,7 @@ void UserMetricsPrivate::finishSetFakeData()
383void UserMetricsPrivate::nextFakeData()
383void UserMetricsPrivate::nextFakeData()
384{
384{
385 ++m_dataIndex;
385 ++m_dataIndex;
386− if (m_dataIndex == m_fakeData.end() || m_dataIndex.key() != m_username)
386+ if (m_dataIndex == m_fakeData.constEnd() || m_dataIndex.key() != m_username)
387 {
387 {
388 m_dataIndex = m_fakeData.constFind(m_username);
388 m_dataIndex = m_fakeData.constFind(m_username);
389 }
389 }
tests/plugins/Ubuntu/Gestures/CMakeLists.txt+9−2
@@ -1,7 +1,13 @@
1include(QmlTest)
1include(QmlTest)
2
2
3+# DANGER! DANGER! Using Qt's private API!
4+include_directories(
5+ ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
6+)
7+
3include_directories(
8include_directories(
4 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
9 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
10+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
5 ${CMAKE_CURRENT_BINARY_DIR}
11 ${CMAKE_CURRENT_BINARY_DIR}
6 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
12 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
7 )
13 )
@@ -17,7 +23,7 @@ add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
17macro(add_gesture_ui_test CLASSNAME)
23macro(add_gesture_ui_test CLASSNAME)
18 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp GestureTest.cpp)
24 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp GestureTest.cpp)
19 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
25 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
20− target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
26+ target_link_libraries(${CLASSNAME}TestExec UbuntuGesturesQml UbuntuGestures)
21
27
22 add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles "")
28 add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles "")
23 add_manual_qml_test(. ${CLASSNAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
29 add_manual_qml_test(. ${CLASSNAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
@@ -34,10 +40,11 @@ macro(add_gesture_test CLASSNAME)
34
40
35 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp)
41 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp)
36 qt5_use_modules(${CLASSNAME}TestExec Test Core)
42 qt5_use_modules(${CLASSNAME}TestExec Test Core)
37− target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
43+ target_link_libraries(${CLASSNAME}TestExec UbuntuGesturesQml)
38endmacro(add_gesture_test)
44endmacro(add_gesture_test)
39
45
40add_gesture_ui_test(DirectionalDragArea)
46add_gesture_ui_test(DirectionalDragArea)
41add_gesture_ui_test(PressedOutsideNotifier)
47add_gesture_ui_test(PressedOutsideNotifier)
48+add_gesture_ui_test(TouchGate)
42add_gesture_test(Damper)
49add_gesture_test(Damper)
43add_gesture_test(AxisVelocityCalculator)
50add_gesture_test(AxisVelocityCalculator)
tests/plugins/Ubuntu/Gestures/RightwardsLauncher.qml+3
@@ -46,6 +46,9 @@ Item {
46 id: dragArea
46 id: dragArea
47 objectName: "hpDragArea"
47 objectName: "hpDragArea"
48
48
49+ // give some room for items to be dynamically stacked right behind him
50+ z: 10.0
51+
49 width: units.gu(5)
52 width: units.gu(5)
50
53
51 direction: Direction.Rightwards
54 direction: Direction.Rightwards
tests/plugins/Ubuntu/Gestures/touchGateExample.qmlnew file+27
@@ -0,0 +1,27 @@
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.0
18+import Ubuntu.Gestures 0.1
19+
20+Rectangle {
21+ width: 720; height: 720
22+
23+ TouchGate {
24+ anchors.fill: parent
25+ objectName: "touchGate"
26+ }
27+}
tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+491−14
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -19,37 +19,63 @@
19#include <QtQuick/QQuickView>
19#include <QtQuick/QQuickView>
20#include <QtQml/QQmlEngine>
20#include <QtQml/QQmlEngine>
21#include <QPointer>
21#include <QPointer>
22+#include <private/qquickmousearea_p.h>
23+
24+// C++ std lib
25+#include <functional>
22
26
23#include <DirectionalDragArea.h>
27#include <DirectionalDragArea.h>
28+#include <TouchRegistry.h>
24
29
25#include "GestureTest.h"
30#include "GestureTest.h"
26
31
27using namespace UbuntuGestures;
32using namespace UbuntuGestures;
28
33
29−class FakeTimer : public AbstractTimer
34+class TouchMemento {
35+public:
36+ TouchMemento(const QTouchEvent *touchEvent);
37+ Qt::TouchPointStates touchPointStates;
38+ QList<QTouchEvent::TouchPoint> touchPoints;
39+
40+ bool containsTouchWithId(int touchId) const;
41+};
42+
43+class DummyItem : public QQuickItem
30{
44{
31 Q_OBJECT
45 Q_OBJECT
32public:
46public:
47+ DummyItem(QQuickItem *parent = 0);
48+
49+ QList<TouchMemento> touchEvents;
50+ std::function<void(QTouchEvent*)> touchEventHandler;
51+protected:
52+ void touchEvent(QTouchEvent *event) override;
53+private:
54+ static void defaultTouchEventHandler(QTouchEvent *event);
55+};
56+
57+class ComplexFakeTimer : public FakeTimer
58+{
59+ Q_OBJECT
60+public:
33− FakeTimer(const SharedTimeSource &timeSource, QObject *parent = 0)
61+ ComplexFakeTimer(const SharedTimeSource &timeSource, QObject *parent = 0)
34− : UbuntuGestures::AbstractTimer(parent),
62+ : FakeTimer(parent),
35 m_timeSource(timeSource)
63 m_timeSource(timeSource)
36 {}
64 {}
37
65
38− int interval() const override { return m_interval; }
39− void setInterval(int msecs) override { m_interval = msecs; }
40 void start() override {
66 void start() override {
41 AbstractTimer::start();
67 AbstractTimer::start();
42− m_nextTimeoutTime = m_timeSource->msecsSinceReference() + (qint64)m_interval;
68+ m_nextTimeoutTime = m_timeSource->msecsSinceReference() + (qint64)interval();
43 }
69 }
44
70
45 void emitTimeout() {
71 void emitTimeout() {
46− m_nextTimeoutTime += m_interval;
72+ m_nextTimeoutTime += interval();
47 Q_EMIT timeout();
73 Q_EMIT timeout();
48 }
74 }
49
75
50 qint64 nextTimeoutTime() const { return m_nextTimeoutTime; }
76 qint64 nextTimeoutTime() const { return m_nextTimeoutTime; }
77+
51private:
78private:
52− int m_interval;
53 SharedTimeSource m_timeSource;
79 SharedTimeSource m_timeSource;
54 qint64 m_nextTimeoutTime;
80 qint64 m_nextTimeoutTime;
55};
81};
@@ -62,6 +88,30 @@ public:
62 qint64 m_msecsSinceReference;
88 qint64 m_msecsSinceReference;
63};
89};
64
90
91+/*
92+ QQuickMouseArea::canceled() signal is not registered in the meta object system.
93+ So using a QSignalSpy to track it won't work. Thus the only way to connect to it
94+ is using its method address directly.
95+ */
96+class MouseAreaSpy : public QObject
97+{
98+ Q_OBJECT
99+public:
100+ MouseAreaSpy(QQuickMouseArea *mouseArea)
101+ : canceledCount(0)
102+ {
103+ connect(mouseArea, &QQuickMouseArea::canceled,
104+ this, &MouseAreaSpy::onMouseAreaCanceled);
105+ }
106+
107+ int canceledCount;
108+
109+private Q_SLOTS:
110+ void onMouseAreaCanceled() {
111+ ++canceledCount;
112+ }
113+};
114+
65class tst_DirectionalDragArea: public GestureTest
115class tst_DirectionalDragArea: public GestureTest
66{
116{
67 Q_OBJECT
117 Q_OBJECT
@@ -87,10 +137,20 @@ private Q_SLOTS:
87 void sceneDistance();
137 void sceneDistance();
88 void sceneDistance_data();
138 void sceneDistance_data();
89 void disabledWhileDragging();
139 void disabledWhileDragging();
140+ void oneFingerDownFollowedByLateSecondFingerDown();
141+ void givesUpWhenLosesTouch();
142+ void threeFingerDrag();
143+ void immediateRecognitionWhenConstraintsDisabled();
144+ void withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition();
145+ void withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition_data();
146+ void tappedSignal();
147+ void tappedSignal_data();
148+ void gettingTouchOwnershipMakesMouseAreaBehindGetCanceled();
90
149
91private:
150private:
92− void passTime(qint64 timeSpan);
151+ void passTime(qint64 timeSpanMs);
152+ TouchRegistry *touchRegistry;
93− FakeTimer *fakeTimer;
153+ ComplexFakeTimer *fakeTimer;
94 QSharedPointer<FakeTimeSource> fakeTimeSource;
154 QSharedPointer<FakeTimeSource> fakeTimeSource;
95};
155};
96
156
@@ -111,12 +171,19 @@ void tst_DirectionalDragArea::init()
111 QTRY_COMPARE(m_view->width(), (int)m_view->rootObject()->width());
171 QTRY_COMPARE(m_view->width(), (int)m_view->rootObject()->width());
112 QTRY_COMPARE(m_view->height(), (int)m_view->rootObject()->height());
172 QTRY_COMPARE(m_view->height(), (int)m_view->rootObject()->height());
113
173
174+ touchRegistry = new TouchRegistry;
175+ m_view->installEventFilter(touchRegistry);
176+
114 fakeTimeSource.reset(new FakeTimeSource);
177 fakeTimeSource.reset(new FakeTimeSource);
115− fakeTimer = new FakeTimer(fakeTimeSource);
178+ fakeTimer = new ComplexFakeTimer(fakeTimeSource);
116}
179}
117
180
118void tst_DirectionalDragArea::cleanup()
181void tst_DirectionalDragArea::cleanup()
119{
182{
183+ m_view->removeEventFilter(touchRegistry);
184+ delete touchRegistry;
185+ touchRegistry = nullptr;
186+
120 delete fakeTimer;
187 delete fakeTimer;
121 fakeTimer = 0;
188 fakeTimer = 0;
122
189
@@ -125,9 +192,9 @@ void tst_DirectionalDragArea::cleanup()
125 GestureTest::cleanup();
192 GestureTest::cleanup();
126}
193}
127
194
128−void tst_DirectionalDragArea::passTime(qint64 timeSpan)
195+void tst_DirectionalDragArea::passTime(qint64 timeSpanMs)
129{
196{
130− qint64 finalTime = fakeTimeSource->m_msecsSinceReference + timeSpan;
197+ qint64 finalTime = fakeTimeSource->m_msecsSinceReference + timeSpanMs;
131
198
132 if (fakeTimer->isRunning() && finalTime >= fakeTimer->nextTimeoutTime()) {
199 if (fakeTimer->isRunning() && finalTime >= fakeTimer->nextTimeoutTime()) {
133 fakeTimeSource->m_msecsSinceReference = fakeTimer->nextTimeoutTime();
200 fakeTimeSource->m_msecsSinceReference = fakeTimer->nextTimeoutTime();
@@ -849,6 +916,416 @@ void tst_DirectionalDragArea::disabledWhileDragging()
849 QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
916 QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
850}
917}
851
918
919+void tst_DirectionalDragArea::oneFingerDownFollowedByLateSecondFingerDown()
920+{
921+ DirectionalDragArea *edgeDragArea =
922+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
923+ Q_ASSERT(edgeDragArea != 0);
924+ edgeDragArea->setRecognitionTimer(fakeTimer);
925+ edgeDragArea->setTimeSource(fakeTimeSource);
926+
927+ // Disable some constraints we're not interested in
928+ edgeDragArea->setMaxSilenceTime(60 * 1000);
929+ edgeDragArea->setMinSpeed(0);
930+
931+ // And ensure others have the values we want
932+ edgeDragArea->setCompositionTime(60);
933+
934+ // Put an item right behind edgeDragArea to receive the touches ignored by it
935+ DummyItem *dummyItem = new DummyItem;
936+ dummyItem->setParentItem(edgeDragArea->parentItem());
937+ dummyItem->setX(edgeDragArea->x());
938+ dummyItem->setY(edgeDragArea->y());
939+ dummyItem->setZ(edgeDragArea->z() - 1.0);
940+ dummyItem->setWidth(edgeDragArea->width());
941+ dummyItem->setHeight(edgeDragArea->height());
942+
943+ // Make touches evenly spaced along the edgeDragArea
944+ QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()*0.33f);
945+ QPoint touch1Pos(edgeDragArea->width()/2.0f, m_view->height()*0.66f);
946+
947+ QTest::touchEvent(m_view, m_device).press(0, touch0Pos);
948+
949+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
950+
951+ // We are now going to be way beyond compositionTime
952+ passTime(edgeDragArea->compositionTime()*3);
953+
954+ QTest::touchEvent(m_view, m_device)
955+ .move(0, touch0Pos)
956+ .press(1, touch1Pos);
957+
958+ // A new touch has come, but as it can't be composed with touch 0, it should be
959+ // ignored/rejected by the DirectionalDragArea
960+ // Therefore the last event received by dummyItem must have both touch points (0 and 1)
961+ {
962+ TouchMemento &touchMemento = dummyItem->touchEvents.last();
963+ QCOMPARE(touchMemento.touchPoints.count(), 2);
964+ QVERIFY(touchMemento.containsTouchWithId(0));
965+ QVERIFY(touchMemento.containsTouchWithId(1));
966+ }
967+
968+ passTime(30);
969+
970+ QTest::touchEvent(m_view, m_device)
971+ .move(0, touch0Pos)
972+ .move(1, touch1Pos);
973+
974+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
975+
976+ passTime(5);
977+
978+ QTest::touchEvent(m_view, m_device)
979+ .release(0, touch0Pos)
980+ .move(1, touch1Pos);
981+
982+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
983+
984+ passTime(5);
985+
986+ QTest::touchEvent(m_view, m_device)
987+ .release(1, touch1Pos);
988+
989+ // Shouldn't be keepping info about touches that no longer exist or interest us
990+ QVERIFY(edgeDragArea->m_activeTouches.isEmpty());
991+
992+ delete dummyItem;
993+}
994+
995+void tst_DirectionalDragArea::givesUpWhenLosesTouch()
996+{
997+ DirectionalDragArea *edgeDragArea =
998+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
999+ Q_ASSERT(edgeDragArea != 0);
1000+ edgeDragArea->setRecognitionTimer(fakeTimer);
1001+ edgeDragArea->setTimeSource(fakeTimeSource);
1002+
1003+ // Disable some constraints we're not interested in
1004+ edgeDragArea->setMaxSilenceTime(60 * 1000);
1005+ edgeDragArea->setMinSpeed(0);
1006+
1007+ // Put an item right in front of edgeDragArea
1008+ DummyItem *dummyItem = new DummyItem(edgeDragArea->parentItem());
1009+ dummyItem->setX(edgeDragArea->x());
1010+ dummyItem->setY(edgeDragArea->y());
1011+ dummyItem->setZ(edgeDragArea->z() + 1.0);
1012+ dummyItem->setWidth(edgeDragArea->width());
1013+ dummyItem->setHeight(edgeDragArea->height());
1014+
1015+ QPoint touchPos(edgeDragArea->width()/2.0f, m_view->height()/2.0f);
1016+
1017+ dummyItem->touchEventHandler = [&](QTouchEvent *event) {
1018+ touchRegistry->addCandidateOwnerForTouch(0, dummyItem);
1019+ event->ignore();
1020+ };
1021+
1022+ QTest::touchEvent(m_view, m_device).press(0, touchPos);
1023+
1024+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
1025+
1026+ touchRegistry->requestTouchOwnership(0, dummyItem);
1027+
1028+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1029+
1030+ dummyItem->grabTouchPoints({0});
1031+ dummyItem->touchEventHandler = [&](QTouchEvent *event) { event->accept(); };
1032+
1033+ passTime(5);
1034+ QTest::touchEvent(m_view, m_device).release(0, touchPos);
1035+
1036+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1037+
1038+ QVERIFY(edgeDragArea->m_activeTouches.isEmpty());
1039+}
1040+
1041+void tst_DirectionalDragArea::threeFingerDrag()
1042+{
1043+ DirectionalDragArea *edgeDragArea =
1044+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1045+ Q_ASSERT(edgeDragArea != 0);
1046+ edgeDragArea->setRecognitionTimer(fakeTimer);
1047+ edgeDragArea->setTimeSource(fakeTimeSource);
1048+
1049+ // Disable some constraints we're not interested in
1050+ edgeDragArea->setMaxSilenceTime(60 * 1000);
1051+ edgeDragArea->setMinSpeed(0);
1052+
1053+ // And ensure others have the values we want
1054+ edgeDragArea->setCompositionTime(60);
1055+
1056+ // Make touches evenly spaced along the edgeDragArea
1057+ QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()*0.25f);
1058+ QPoint touch1Pos(edgeDragArea->width()/2.0f, m_view->height()*0.50f);
1059+ QPoint touch2Pos(edgeDragArea->width()/2.0f, m_view->height()*0.75f);
1060+
1061+ QTest::touchEvent(m_view, m_device)
1062+ .press(0, touch0Pos);
1063+
1064+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
1065+
1066+ passTime(5);
1067+ QTest::touchEvent(m_view, m_device)
1068+ .move(0, touch0Pos)
1069+ .press(1, touch1Pos);
1070+
1071+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1072+
1073+ passTime(5);
1074+ QTest::touchEvent(m_view, m_device)
1075+ .move(0, touch0Pos)
1076+ .move(1, touch1Pos)
1077+ .press(2, touch2Pos);
1078+
1079+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1080+
1081+ passTime(10);
1082+ QTest::touchEvent(m_view, m_device)
1083+ .move(0, touch0Pos)
1084+ .move(1, touch1Pos)
1085+ .move(2, touch2Pos);
1086+
1087+ passTime(200);
1088+ QTest::touchEvent(m_view, m_device)
1089+ .move(0, touch0Pos)
1090+ .release(1, touch1Pos)
1091+ .move(2, touch2Pos);
1092+
1093+ passTime(10);
1094+ QTest::touchEvent(m_view, m_device)
1095+ .move(0, touch0Pos)
1096+ .release(2, touch2Pos);
1097+
1098+ passTime(5);
1099+ QTest::touchEvent(m_view, m_device)
1100+ .release(0, touch0Pos);
1101+
1102+ // Shouldn't be keepping info about touches that no longer exist or interest us
1103+ QVERIFY(edgeDragArea->m_activeTouches.isEmpty());
1104+}
1105+
1106+/*
1107+ If all the relevant gesture recognition constraints/parameters have been disabled,
1108+ it means that the gesture recognition itself has been disabled and DirectionalDragArea
1109+ will therefore work like a simple touch area, merely reporting touch movement.
1110+ */
1111+void tst_DirectionalDragArea::immediateRecognitionWhenConstraintsDisabled()
1112+{
1113+ DirectionalDragArea *edgeDragArea =
1114+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1115+ Q_ASSERT(edgeDragArea != 0);
1116+ edgeDragArea->setRecognitionTimer(fakeTimer);
1117+ edgeDragArea->setTimeSource(fakeTimeSource);
1118+
1119+ // Disable the minimum amount of constraints to ensure immediate recognition
1120+ edgeDragArea->setDistanceThreshold(0);
1121+ edgeDragArea->setCompositionTime(0);
1122+
1123+ // Put an item right behind edgeDragArea to receive the touches ignored by it
1124+ DummyItem *dummyItem = new DummyItem;
1125+ dummyItem->setParentItem(edgeDragArea->parentItem());
1126+ dummyItem->setX(edgeDragArea->x());
1127+ dummyItem->setY(edgeDragArea->y());
1128+ dummyItem->setZ(edgeDragArea->z() - 1.0);
1129+ dummyItem->setWidth(edgeDragArea->width());
1130+ dummyItem->setHeight(edgeDragArea->height());
1131+
1132+ QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()/2.0f);
1133+
1134+ QTest::touchEvent(m_view, m_device).press(0, touch0Pos);
1135+
1136+ // check for immediate recognition
1137+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Recognized);
1138+
1139+ // and therefore it should have immediately grabbed the touch point,
1140+ // not letting it leak to items behind him.
1141+ QCOMPARE(dummyItem->touchEvents.count(), 0);
1142+}
1143+
1144+void tst_DirectionalDragArea::withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition()
1145+{
1146+ DirectionalDragArea *edgeDragArea =
1147+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1148+ Q_ASSERT(edgeDragArea != 0);
1149+ edgeDragArea->setRecognitionTimer(fakeTimer);
1150+ edgeDragArea->setTimeSource(fakeTimeSource);
1151+
1152+ QPointF touchPoint = calculateInitialTouchPos(edgeDragArea);
1153+
1154+ // Move less than the minimum needed for the drag gesture recognition
1155+ qreal desiredDragDistance = edgeDragArea->distanceThreshold()*0.5f;
1156+ QPointF dragDirectionVector(1., 0.); // horizontal positive
1157+
1158+ qreal movementStepDistance = edgeDragArea->distanceThreshold() * 0.1f;
1159+ QPointF touchMovement = dragDirectionVector * movementStepDistance;
1160+ int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
1161+ int movementTimeStepMs = (edgeDragArea->compositionTime() * 0.8f) / totalMovementSteps;
1162+
1163+ QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
1164+
1165+ for (int i = 0; i < totalMovementSteps; ++i) {
1166+ touchPoint += touchMovement;
1167+ passTime(movementTimeStepMs);
1168+ QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
1169+ }
1170+
1171+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Undecided);
1172+
1173+ // edgeDragArea should be an undecided candidate
1174+ {
1175+ auto touchInfo = touchRegistry->findTouchInfo(0);
1176+ QCOMPARE(touchInfo->candidates.size(), 1);
1177+ QCOMPARE(touchInfo->candidates.at(0).item.data(), edgeDragArea);
1178+ QCOMPARE(touchInfo->candidates.at(0).undecided, true);
1179+ }
1180+
1181+ // disable the dragArea while it's still recognizing a possible drag gesture.
1182+ QFETCH(bool, disable);
1183+ if (disable) {
1184+ edgeDragArea->setEnabled(false);
1185+ } else {
1186+ edgeDragArea->setVisible(false);
1187+ }
1188+
1189+ // edgeDragArea should no longer be a candidate
1190+ {
1191+ auto touchInfo = touchRegistry->findTouchInfo(0);
1192+ QCOMPARE(touchInfo->candidates.size(), 0);
1193+ }
1194+
1195+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
1196+
1197+ QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
1198+}
1199+
1200+void tst_DirectionalDragArea::withdrawTouchOwnershipCandidacyIfDisabledDuringRecognition_data()
1201+{
1202+ QTest::addColumn<bool>("disable");
1203+
1204+ QTest::newRow("disabled") << true;
1205+ QTest::newRow("invisible") << false;
1206+}
1207+
1208+void tst_DirectionalDragArea::tappedSignal()
1209+{
1210+ DirectionalDragArea *edgeDragArea =
1211+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1212+ QVERIFY(edgeDragArea != 0);
1213+ edgeDragArea->setRecognitionTimer(fakeTimer);
1214+ edgeDragArea->setTimeSource(fakeTimeSource);
1215+
1216+ QFETCH(bool, immediateGestureRecognition);
1217+ if (immediateGestureRecognition) {
1218+ // Disable the minimum amount of constraints to ensure immediate recognition
1219+ edgeDragArea->setDistanceThreshold(0);
1220+ edgeDragArea->setCompositionTime(0);
1221+ }
1222+
1223+ QPoint touch0Pos(edgeDragArea->width()/2.0f, m_view->height()/2.0f);
1224+
1225+ QSignalSpy tappedSpy(edgeDragArea, SIGNAL(tapped()));
1226+
1227+ QTest::touchEvent(m_view, m_device).press(0, touch0Pos);
1228+ passTime(edgeDragArea->maxTapDuration() / 2);
1229+ QTest::touchEvent(m_view, m_device).release(0, touch0Pos);
1230+
1231+ QCOMPARE(tappedSpy.count(), 1);
1232+}
1233+
1234+void tst_DirectionalDragArea::tappedSignal_data()
1235+{
1236+ QTest::addColumn<bool>("immediateGestureRecognition");
1237+
1238+ QTest::newRow("immediate gesture recognition") << true;
1239+ QTest::newRow("default gesture recognition") << false;
1240+}
1241+
1242+void tst_DirectionalDragArea::gettingTouchOwnershipMakesMouseAreaBehindGetCanceled()
1243+{
1244+ DirectionalDragArea *edgeDragArea =
1245+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1246+ QVERIFY(edgeDragArea != nullptr);
1247+ edgeDragArea->setRecognitionTimer(fakeTimer);
1248+ edgeDragArea->setTimeSource(fakeTimeSource);
1249+
1250+ QQuickMouseArea *mouseArea =
1251+ m_view->rootObject()->findChild<QQuickMouseArea*>("mouseArea");
1252+ QVERIFY(mouseArea != nullptr);
1253+
1254+ MouseAreaSpy mouseAreaSpy(mouseArea);
1255+
1256+ QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
1257+ QPointF touchPoint = initialTouchPos;
1258+
1259+ qreal desiredDragDistance = edgeDragArea->distanceThreshold()*2;
1260+ QPointF dragDirectionVector(1.0f, 0.0f); // rightwards
1261+ qreal movementStepDistance = edgeDragArea->distanceThreshold() * 0.1f;
1262+ QPointF touchMovement = dragDirectionVector * movementStepDistance;
1263+ int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
1264+ int movementTimeStepMs = (edgeDragArea->compositionTime() * 1.5f) / totalMovementSteps;
1265+
1266+ QCOMPARE(mouseArea->pressed(), false);
1267+
1268+ QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
1269+
1270+ // The TouchBegin passes through the DirectionalDragArea and reaches the MouseArea behind it,
1271+ // where it's converted to a MouseEvent by QQuickWindow and sent to the MouseArea which then
1272+ // accepts it. Making it get pressed.
1273+ QCOMPARE(mouseArea->pressed(), true);
1274+ QCOMPARE(mouseAreaSpy.canceledCount, 0);
1275+
1276+ for (int i = 0; i < totalMovementSteps; ++i) {
1277+ touchPoint += touchMovement;
1278+ passTime(movementTimeStepMs);
1279+ QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
1280+ }
1281+
1282+ // As the DirectionalDragArea recognizes the gesture, it grabs the touch from the MouseArea,
1283+ // which should make the MouseArea get a cancelation event, which will then cause it to
1284+ // reset its state (going back to "unpressed"/"released").
1285+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Recognized);
1286+ QCOMPARE(mouseArea->pressed(), false);
1287+ QCOMPARE(mouseAreaSpy.canceledCount, 1);
1288+
1289+ QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
1290+}
1291+
1292+////////////////////////// TouchMemento /////////////////////////////
1293+
1294+TouchMemento::TouchMemento(const QTouchEvent *touchEvent)
1295+ : touchPointStates(touchEvent->touchPointStates()), touchPoints(touchEvent->touchPoints())
1296+{
1297+
1298+}
1299+
1300+bool TouchMemento::containsTouchWithId(int touchId) const
1301+{
1302+ for (int i = 0; i < touchPoints.count(); ++i) {
1303+ if (touchPoints.at(i).id() == touchId) {
1304+ return true;
1305+ }
1306+ }
1307+ return false;
1308+}
1309+
1310+////////////////////////// DummyItem /////////////////////////////
1311+
1312+DummyItem::DummyItem(QQuickItem *parent)
1313+ : QQuickItem(parent)
1314+{
1315+ touchEventHandler = defaultTouchEventHandler;
1316+}
1317+
1318+void DummyItem::touchEvent(QTouchEvent *event)
1319+{
1320+ touchEvents.append(TouchMemento(event));
1321+ touchEventHandler(event);
1322+}
1323+
1324+void DummyItem::defaultTouchEventHandler(QTouchEvent *event)
1325+{
1326+ event->accept();
1327+}
1328+
852QTEST_MAIN(tst_DirectionalDragArea)
1329QTEST_MAIN(tst_DirectionalDragArea)
853
1330
854#include "tst_DirectionalDragArea.moc"
1331#include "tst_DirectionalDragArea.moc"
tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.qml+1
@@ -24,6 +24,7 @@ Rectangle {
24
24
25 MouseArea {
25 MouseArea {
26 id: mouseArea
26 id: mouseArea
27+ objectName: "mouseArea"
27 anchors.fill: parent
28 anchors.fill: parent
28 onClicked: {
29 onClicked: {
29 hpLauncher.reset()
30 hpLauncher.reset()
tests/plugins/Ubuntu/Gestures/tst_TouchGate.cppnew file+345
@@ -0,0 +1,345 @@
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+#include <qpa/qwindowsysteminterface.h>
18+#include <QtTest>
19+#include <QQmlEngine>
20+#include <QQuickView>
21+#include <QSharedPointer>
22+
23+// C++ std lib
24+#include <functional>
25+
26+#include <TouchGate.h>
27+#include <TouchRegistry.h>
28+
29+class TestItem : public QQuickItem
30+{
31+ Q_OBJECT
32+
33+public:
34+ QList<QSharedPointer<QTouchEvent>> touchEventsReceived;
35+
36+protected:
37+ void touchEvent(QTouchEvent *event) override;
38+};
39+
40+class CandidateItem : public QQuickItem
41+{
42+ Q_OBJECT
43+
44+public:
45+ std::function<void(QTouchEvent*)> touchEventHandler;
46+
47+protected:
48+ void touchEvent(QTouchEvent *event) override;
49+};
50+
51+class tst_TouchGate : public QObject
52+{
53+ Q_OBJECT
54+public:
55+ tst_TouchGate(QObject *parent = nullptr);
56+private Q_SLOTS:
57+ void initTestCase(); // will be called before the first test function is executed
58+ void cleanupTestCase(); // will be called after the last test function was executed.
59+
60+ void init(); // called right before each and every test function is executed
61+ void cleanup(); // called right after each and every test function is executed
62+
63+ void onlyCandidate_passThrough();
64+ void holdsEventsUntilGainsOwnership();
65+ void holdsEventsUntilGainsOwnership_data();
66+ void holdsEventsUntilGainsOwnership_repeatingTouchId();
67+ void dontDispacthToDisabledOrInvisibleTarget();
68+ void dontDispacthToDisabledOrInvisibleTarget_data();
69+
70+private:
71+ QQuickView *createView();
72+ TouchRegistry *touchRegistry;
73+ QQuickView *view;
74+ QTouchDevice *device;
75+};
76+
77+tst_TouchGate::tst_TouchGate(QObject *parent)
78+ : QObject(parent)
79+ , touchRegistry(nullptr)
80+ , view(nullptr)
81+ , device(nullptr)
82+{
83+}
84+
85+void tst_TouchGate::initTestCase()
86+{
87+ if (!device) {
88+ device = new QTouchDevice;
89+ device->setType(QTouchDevice::TouchScreen);
90+ QWindowSystemInterface::registerTouchDevice(device);
91+ }
92+}
93+
94+void tst_TouchGate::cleanupTestCase()
95+{
96+}
97+
98+void tst_TouchGate::init()
99+{
100+ touchRegistry = new TouchRegistry;
101+
102+ view = createView();
103+ view->installEventFilter(touchRegistry);
104+ view->setSource(QUrl::fromLocalFile("touchGateExample.qml"));
105+ view->show();
106+ QVERIFY(QTest::qWaitForWindowExposed(view));
107+ QVERIFY(view->rootObject() != 0);
108+ qApp->processEvents();
109+}
110+
111+void tst_TouchGate::cleanup()
112+{
113+ delete view;
114+ view = 0;
115+
116+ delete touchRegistry;
117+ touchRegistry = nullptr;
118+}
119+
120+QQuickView *tst_TouchGate::createView()
121+{
122+ QQuickView *window = new QQuickView(0);
123+ window->setResizeMode(QQuickView::SizeRootObjectToView);
124+ window->resize(720, 720);
125+ window->engine()->addImportPath(QLatin1String(UBUNTU_GESTURES_PLUGIN_DIR));
126+
127+ return window;
128+}
129+
130+/*
131+ Simplest case. TouchGate is the only candidate for the touch point, thus it
132+ will instantly gain ownership causing the event to pass through it directly to
133+ its child.
134+ */
135+void tst_TouchGate::onlyCandidate_passThrough()
136+{
137+ TouchGate *touchGate = view->rootObject()->findChild<TouchGate*>("touchGate");
138+ Q_ASSERT(touchGate);
139+
140+ TestItem *testItem = new TestItem;
141+ testItem->setWidth(touchGate->width());
142+ testItem->setHeight(touchGate->height());
143+ testItem->setParentItem(view->rootObject());
144+ testItem->setZ(0.0);
145+
146+ touchGate->setZ(1.0);
147+ touchGate->setTargetItem(testItem);
148+
149+ QTest::touchEvent(view, device)
150+ .press(0, QPoint(100,100));
151+
152+ QCOMPARE(testItem->touchEventsReceived.count(), 1);
153+ QVERIFY(touchGate->m_storedEvents.isEmpty());
154+}
155+
156+void tst_TouchGate::holdsEventsUntilGainsOwnership()
157+{
158+ TouchGate *touchGate = view->rootObject()->findChild<TouchGate*>("touchGate");
159+ Q_ASSERT(touchGate);
160+ QFETCH(bool, ownershipAfterTouchEnd);
161+
162+ TestItem *testItem = new TestItem;
163+ testItem->setWidth(touchGate->width());
164+ testItem->setHeight(touchGate->height());
165+ testItem->setParentItem(view->rootObject());
166+ testItem->setZ(0.0);
167+
168+ touchGate->setZ(1.0);
169+ touchGate->setTargetItem(testItem);
170+
171+ // Put it in front of touchGate
172+ CandidateItem *candidateItem = new CandidateItem;
173+ candidateItem->setWidth(touchGate->width());
174+ candidateItem->setHeight(touchGate->height());
175+ candidateItem->setParentItem(view->rootObject());
176+ candidateItem->setZ(2.0);
177+
178+ candidateItem->touchEventHandler = [&](QTouchEvent* event) {
179+ touchRegistry->addCandidateOwnerForTouch(0, candidateItem);
180+ event->ignore();
181+ };
182+
183+ QTest::touchEvent(view, device)
184+ .press(0, QPoint(100,100));
185+
186+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
187+
188+ QTest::touchEvent(view, device)
189+ .move(0, QPoint(101,101));
190+
191+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
192+
193+ if (!ownershipAfterTouchEnd) {
194+ touchRegistry->removeCandidateOwnerForTouch(0, candidateItem);
195+ // TouchGate should now open its flood gates and let testItem get all
196+ // events from touch 0 produced so far
197+ QCOMPARE(testItem->touchEventsReceived.count(), 2);
198+ }
199+
200+ QTest::touchEvent(view, device)
201+ .release(0, QPoint(101,101));
202+
203+ if (ownershipAfterTouchEnd) {
204+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
205+ touchRegistry->removeCandidateOwnerForTouch(0, candidateItem);
206+ // TouchGate should now open its flood gates and let testItem get all
207+ // events from touch 0 produced so far
208+ }
209+
210+ QCOMPARE(testItem->touchEventsReceived.count(), 3);
211+
212+ QVERIFY(touchGate->m_storedEvents.isEmpty());
213+ QVERIFY(touchGate->m_touchInfoMap.isEmpty());
214+}
215+
216+void tst_TouchGate::holdsEventsUntilGainsOwnership_data()
217+{
218+ QTest::addColumn<bool>("ownershipAfterTouchEnd");
219+
220+ QTest::newRow("touch end after touch ownership") << false;
221+ QTest::newRow("touch ownership after touch end") << true;
222+}
223+
224+/*
225+ A touch point of id 0 starts and ends. Then the next touch point is also given
226+ id 0. Check that TouchGate behaves correcly recognizing them as two distinct touch
227+ points.
228+
229+ Note that this won't be a problem with Mir as it assigns unique ids for the touch
230+ points it produces.
231+ */
232+void tst_TouchGate::holdsEventsUntilGainsOwnership_repeatingTouchId()
233+{
234+ TouchGate *touchGate = view->rootObject()->findChild<TouchGate*>("touchGate");
235+ Q_ASSERT(touchGate);
236+
237+ TestItem *testItem = new TestItem;
238+ testItem->setWidth(touchGate->width());
239+ testItem->setHeight(touchGate->height());
240+ testItem->setParentItem(view->rootObject());
241+ testItem->setZ(0.0);
242+
243+ touchGate->setZ(1.0);
244+ touchGate->setTargetItem(testItem);
245+
246+ QTest::touchEvent(view, device)
247+ .press(0, QPoint(100,100));
248+ QTest::touchEvent(view, device)
249+ .move(0, QPoint(101,101));
250+ QTest::touchEvent(view, device)
251+ .release(0, QPoint(101,101));
252+
253+ QCOMPARE(testItem->touchEventsReceived.count(), 3);
254+ testItem->touchEventsReceived.clear();
255+
256+ // Put it in front of touchGate
257+ CandidateItem *candidateItem = new CandidateItem;
258+ candidateItem->setWidth(touchGate->width());
259+ candidateItem->setHeight(touchGate->height());
260+ candidateItem->setParentItem(view->rootObject());
261+ candidateItem->setZ(2.0);
262+
263+ candidateItem->touchEventHandler = [&](QTouchEvent* event) {
264+ touchRegistry->addCandidateOwnerForTouch(0, candidateItem);
265+ event->ignore();
266+ };
267+
268+ // A brand new touch, but with the same id as the previous one
269+ QTest::touchEvent(view, device)
270+ .press(0, QPoint(200,200));
271+ QTest::touchEvent(view, device)
272+ .move(0, QPoint(201,201));
273+ QTest::touchEvent(view, device)
274+ .release(0, QPoint(201,201));
275+
276+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
277+
278+ touchRegistry->requestTouchOwnership(0, candidateItem);
279+
280+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
281+
282+ QVERIFY(touchGate->m_storedEvents.isEmpty());
283+}
284+
285+void tst_TouchGate::dontDispacthToDisabledOrInvisibleTarget()
286+{
287+ TouchGate *touchGate = view->rootObject()->findChild<TouchGate*>("touchGate");
288+ Q_ASSERT(touchGate);
289+
290+ TestItem *testItem = new TestItem;
291+ testItem->setWidth(touchGate->width());
292+ testItem->setHeight(touchGate->height());
293+ testItem->setParentItem(view->rootObject());
294+ testItem->setZ(0.0);
295+
296+ QFETCH(bool, isEnabled);
297+ testItem->setEnabled(isEnabled);
298+
299+ QFETCH(bool, isVisible);
300+ testItem->setVisible(isVisible);
301+
302+ touchGate->setZ(1.0);
303+ touchGate->setTargetItem(testItem);
304+
305+ QTest::touchEvent(view, device)
306+ .press(0, QPoint(100,100));
307+
308+ QCOMPARE(testItem->touchEventsReceived.count(), 0);
309+ QVERIFY(touchGate->m_storedEvents.isEmpty());
310+}
311+
312+void tst_TouchGate::dontDispacthToDisabledOrInvisibleTarget_data()
313+{
314+ QTest::addColumn<bool>("isEnabled");
315+ QTest::addColumn<bool>("isVisible");
316+
317+ QTest::newRow("disabled visible") << false << true;
318+ QTest::newRow("enabled invisible") << true << false;
319+ QTest::newRow("disabled invisible") << false << false;
320+}
321+
322+///////////// TestItem /////////////////////////////////////////////////////////////
323+
324+void TestItem::touchEvent(QTouchEvent *event)
325+{
326+ QTouchEvent *clonedEvent = new QTouchEvent(event->type(),
327+ event->device(),
328+ event->modifiers(),
329+ event->touchPointStates(),
330+ event->touchPoints());
331+
332+ touchEventsReceived.append(QSharedPointer<QTouchEvent>(clonedEvent));
333+}
334+
335+///////////// CandidateItem /////////////////////////////////////////////////////////////
336+
337+void CandidateItem::touchEvent(QTouchEvent *event)
338+{
339+ touchEventHandler(event);
340+}
341+
342+
343+QTEST_MAIN(tst_TouchGate)
344+
345+#include "tst_TouchGate.moc"
tests/qmltests/CMakeLists.txt+1
@@ -21,6 +21,7 @@ set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
21
21
22add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
22add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
23add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin")
23add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin")
24+add_qml_test(. TabletShell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full")
24add_qml_test(Components Background)
25add_qml_test(Components Background)
25add_qml_test(Components Carousel)
26add_qml_test(Components Carousel)
26add_qml_test(Components DraggingArea)
27add_qml_test(Components DraggingArea)
tests/qmltests/Components/CMakeLists.txt+2−1
@@ -2,13 +2,14 @@
2
2
3include_directories(
3include_directories(
4 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
4 ${CMAKE_SOURCE_DIR}/plugins/Ubuntu/Gestures
5+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
5 ${CMAKE_CURRENT_BINARY_DIR}
6 ${CMAKE_CURRENT_BINARY_DIR}
6 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
7 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
7 )
8 )
8
9
9add_executable(DragHandleTestExec tst_DragHandle.cpp)
10add_executable(DragHandleTestExec tst_DragHandle.cpp)
10qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
11qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
11−target_link_libraries(DragHandleTestExec UbuntuGestureQml)
12+target_link_libraries(DragHandleTestExec UbuntuGesturesQml UbuntuGestures)
12
13
13add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "" "")
14add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "" "")
14add_manual_qml_test(. DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
15add_manual_qml_test(. DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
tests/qmltests/Components/tst_DragHandle.cpp+12−15
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -22,22 +22,12 @@
22#include <QtQml/QQmlEngine>
22#include <QtQml/QQmlEngine>
23
23
24#include <DirectionalDragArea.h>
24#include <DirectionalDragArea.h>
25+#include <Timer.h>
26+#include <TouchRegistry.h>
25
27
26−class FakeTimer : public UbuntuGestures::AbstractTimer
27−{
28− Q_OBJECT
29−public:
30− FakeTimer(QObject *parent = 0)
31− : UbuntuGestures::AbstractTimer(parent)
28+using namespace UbuntuGestures;
32− {}
33−
34− virtual int interval() const { return m_duration; }
35− virtual void setInterval(int msecs) { m_duration = msecs; }
36−private:
37− int m_duration;
38−};
39
29
40−class FakeTimeSource : public UbuntuGestures::TimeSource
30+class FakeTimeSource : public TimeSource
41{
31{
42public:
32public:
43 FakeTimeSource() { m_msecsSinceReference = 0; }
33 FakeTimeSource() { m_msecsSinceReference = 0; }
@@ -77,6 +67,7 @@ private:
77
67
78 QQuickView *createView();
68 QQuickView *createView();
79 QQuickView *m_view;
69 QQuickView *m_view;
70+ TouchRegistry *m_touchRegistry;
80 QTouchDevice *m_device;
71 QTouchDevice *m_device;
81 FakeTimer *m_fakeTimer;
72 FakeTimer *m_fakeTimer;
82 QSharedPointer<FakeTimeSource> m_fakeTimeSource;
73 QSharedPointer<FakeTimeSource> m_fakeTimeSource;
@@ -100,7 +91,10 @@ void tst_DragHandle::cleanupTestCase()
100
91
101void tst_DragHandle::init()
92void tst_DragHandle::init()
102{
93{
94+ m_touchRegistry = new TouchRegistry;
95+
103 m_view = createView();
96 m_view = createView();
97+ m_view->installEventFilter(m_touchRegistry);
104 m_view->setSource(QUrl::fromLocalFile(TEST_DIR"/tst_DragHandle.qml"));
98 m_view->setSource(QUrl::fromLocalFile(TEST_DIR"/tst_DragHandle.qml"));
105 m_view->show();
99 m_view->show();
106 QVERIFY(QTest::qWaitForWindowExposed(m_view));
100 QVERIFY(QTest::qWaitForWindowExposed(m_view));
@@ -116,6 +110,9 @@ void tst_DragHandle::cleanup()
116 delete m_view;
110 delete m_view;
117 m_view = 0;
111 m_view = 0;
118
112
113+ delete m_touchRegistry;
114+ m_touchRegistry = 0;
115+
119 delete m_fakeTimer;
116 delete m_fakeTimer;
120 m_fakeTimer = 0;
117 m_fakeTimer = 0;
121
118
tests/qmltests/Greeter/tst_MultiGreeter.qml+2−2
@@ -29,6 +29,7 @@ Item {
29 Greeter {
29 Greeter {
30 id: greeter
30 id: greeter
31 anchors.fill: parent
31 anchors.fill: parent
32+ locked: !LightDM.Greeter.authenticated
32 }
33 }
33
34
34 Component {
35 Component {
@@ -115,8 +116,7 @@ Item {
115 var waitForSignal = data.uid != 0 && userList.currentIndex != data.uid
116 var waitForSignal = data.uid != 0 && userList.currentIndex != data.uid
116 select_index(data.uid)
117 select_index(data.uid)
117 tryCompare(userList, "currentIndex", data.uid)
118 tryCompare(userList, "currentIndex", data.uid)
118− tryCompare(greeter, "locked", data.tag !== "no-password" &&
119+ tryCompare(greeter, "locked", data.tag !== "no-password")
119− data.tag !== "auth-error")
120 if (waitForSignal) {
120 if (waitForSignal) {
121 selectionSpy.wait()
121 selectionSpy.wait()
122 tryCompare(selectionSpy, "count", 1)
122 tryCompare(selectionSpy, "count", 1)
tests/qmltests/Greeter/tst_SingleGreeter.qml+1−1
@@ -87,7 +87,7 @@ Item {
87
87
88 function test_teasingArea(data) {
88 function test_teasingArea(data) {
89 teaseSpy.clear()
89 teaseSpy.clear()
90− mouseClick(greeter, data.posX, greeter.height - units.gu(1))
90+ tap(greeter, data.posX, greeter.height - units.gu(1))
91 teaseSpy.wait()
91 teaseSpy.wait()
92 tryCompare(teaseSpy, "count", 1)
92 tryCompare(teaseSpy, "count", 1)
93 }
93 }
tests/qmltests/Launcher/tst_Launcher.qml+117−101
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2013 Canonical Ltd.
2+ * Copyright 2013-2014 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -28,25 +28,49 @@ Item {
28 width: units.gu(50)
28 width: units.gu(50)
29 height: units.gu(55)
29 height: units.gu(55)
30
30
31+ Loader {
32+ id: launcherLoader
33+ anchors.fill: parent
34+ property bool itemDestroyed: false
35+ sourceComponent: Component {
31− Launcher {
36+ Launcher {
32− id: launcher
37+ id: launcher
33− x: 0
38+ x: 0
34− y: 0
39+ y: 0
35− width: units.gu(40)
40+ width: units.gu(40)
36− height: parent.height
41+ height: root.height
42+
43+ property string lastSelectedApplication
44+
45+ onLauncherApplicationSelected: {
46+ lastSelectedApplication = appId
47+ }
37
48
38− property string lastSelectedApplication
49+ property int showDashHome_count: 0
50+ onShowDashHome: {
51+ showDashHome_count++;
52+ }
39
53
40− onLauncherApplicationSelected: {
54+ property int maxPanelX: 0
41− lastSelectedApplication = appId
42− }
43
55
44− property int showDashHome_count: 0
56+ Connections {
45− onShowDashHome: {
57+ target: testCase.findChild(launcher, "launcherPanel")
46− showDashHome_count++;
58+
59+ onXChanged: {
60+ if (target.x > launcher.maxPanelX) {
61+ launcher.maxPanelX = target.x;
62+ }
63+ }
47− }
64+ }
48
65
49− property int maxPanelX: 0
66+ Component.onCompleted: {
67+ launcherLoader.itemDestroyed = false;
68+ }
69+ Component.onDestruction: {
70+ launcherLoader.itemDestroyed = true;
71+ }
72+ }
73+ }
50 }
74 }
51
75
52 SignalSpy {
76 SignalSpy {
@@ -54,19 +78,45 @@ Item {
54 target: LauncherModel
78 target: LauncherModel
55 }
79 }
56
80
57− Connections {
81+ UT.UnityTestCase {
58− target: testCase.findChild(launcher, "launcherPanel")
82+ id: testCase
83+ name: "Launcher"
84+ when: windowShown
59
85
60− onXChanged: {
86+ property Item launcher: launcherLoader.status === Loader.Ready ? launcherLoader.item : null
61− if (target.x > launcher.maxPanelX) {
87+ function cleanup() {
62− launcher.maxPanelX = target.x;
88+ launcherLoader.active = false;
63− }
89+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
90+ // item might still be alive. So if we set Loader.active back to true
91+ // again right now we will get the very same Shell instance back. So no reload
92+ // actually took place. Likely because Loader waits until the next event loop
93+ // iteration to do its work. So to ensure the reload, we will wait until the
94+ // Shell instance gets destroyed.
95+ tryCompare(launcherLoader, "itemDestroyed", true);
96+ launcherLoader.active = true;
64 }
97 }
65− }
98+ function init() {
99+ var listView = findChild(launcher, "launcherListView");
100+ // wait for it to settle before doing the flick. Otherwise the flick
101+ // might fail.
102+ // On startup that listView is already moving. maybe because of its contents
103+ // growing while populating it with icons etc.
104+ tryCompare(listView, "flicking", false);
66
105
67− UT.UnityTestCase {
106+ // Make sure noone changed the height of the window. The issue this test case
68− id: revealer
107+ // is verifying only happens on certain heights of the Launcher
69− when: windowShown
108+ compare(root.height, units.gu(55));
109+
110+ compare(listView.contentY, -listView.topMargin, "Launcher did not start up with first item unfolded");
111+
112+ // Now do check that snapping is in fact enabled
113+ compare(listView.snapMode, ListView.SnapToItem, "Snapping is not enabled");
114+
115+ // Tests can be run in a reaaaaally slow environment or machine. Thus ensure
116+ // the dismissTimer doesn't time out inadvertently.
117+ var dismissTimer = findInvisibleChild(launcher, "dismissTimer");
118+ dismissTimer.interval = 60 * 60 * 1000; // one hour
119+ }
70
120
71 function dragLauncherIntoView() {
121 function dragLauncherIntoView() {
72 var startX = launcher.dragAreaWidth/2;
122 var startX = launcher.dragAreaWidth/2;
@@ -87,22 +137,11 @@ Item {
87 var panel = findChild(launcher, "launcherPanel");
137 var panel = findChild(launcher, "launcherPanel");
88 tryCompare(panel, "x", -panel.width, 1000);
138 tryCompare(panel, "x", -panel.width, 1000);
89 }
139 }
90− }
91−
92− UT.UnityTestCase {
93− id: testCase
94− name: "Launcher"
95− when: windowShown && initTestCase.completed
96−
97− function cleanup() {
98− mouseClick(root, root.width / 2, root.height / 2);
99− revealer.waitUntilLauncherDisappears();
100− }
101
140
102 // Drag from the left edge of the screen rightwards and check that the launcher
141 // Drag from the left edge of the screen rightwards and check that the launcher
103 // appears (as if being dragged by the finger/pointer)
142 // appears (as if being dragged by the finger/pointer)
104 function test_dragLeftEdgeToRevealLauncherAndTapCenterToDismiss() {
143 function test_dragLeftEdgeToRevealLauncherAndTapCenterToDismiss() {
105− revealer.waitUntilLauncherDisappears();
144+ waitUntilLauncherDisappears();
106
145
107 var panel = findChild(launcher, "launcherPanel")
146 var panel = findChild(launcher, "launcherPanel")
108 verify(panel != undefined)
147 verify(panel != undefined)
@@ -110,7 +149,7 @@ Item {
110 // it starts out hidden just left of the left launcher edge
149 // it starts out hidden just left of the left launcher edge
111 compare(panel.x, -panel.width)
150 compare(panel.x, -panel.width)
112
151
113− revealer.dragLauncherIntoView()
152+ dragLauncherIntoView()
114
153
115 // tapping on the center of the screen should dismiss the launcher
154 // tapping on the center of the screen should dismiss the launcher
116 mouseClick(launcher, launcher.width/2, launcher.height/2)
155 mouseClick(launcher, launcher.width/2, launcher.height/2)
@@ -124,7 +163,7 @@ Item {
124 corresponding desktop file. E.g. clicking on phone icon should yield
163 corresponding desktop file. E.g. clicking on phone icon should yield
125 launcherApplicationSelected("[...]dialer-app.desktop") */
164 launcherApplicationSelected("[...]dialer-app.desktop") */
126 function test_clickingOnAppIconCausesSignalEmission() {
165 function test_clickingOnAppIconCausesSignalEmission() {
127− revealer.dragLauncherIntoView();
166+ dragLauncherIntoView();
128 launcher.lastSelectedApplication = ""
167 launcher.lastSelectedApplication = ""
129
168
130 var listView = findChild(launcher, "launcherListView");
169 var listView = findChild(launcher, "launcherListView");
@@ -140,7 +179,7 @@ Item {
140 "dialer-app")
179 "dialer-app")
141
180
142 // Tapping on an application icon also dismisses the launcher
181 // Tapping on an application icon also dismisses the launcher
143− revealer.waitUntilLauncherDisappears()
182+ waitUntilLauncherDisappears()
144 }
183 }
145
184
146 /* If I click on the dash icon on the launcher
185 /* If I click on the dash icon on the launcher
@@ -148,7 +187,7 @@ Item {
148 function test_clickingOnDashIconCausesSignalEmission() {
187 function test_clickingOnDashIconCausesSignalEmission() {
149 launcher.showDashHome_count = 0
188 launcher.showDashHome_count = 0
150
189
151− revealer.dragLauncherIntoView()
190+ dragLauncherIntoView()
152
191
153 var dashIcon = findChild(launcher, "dashItem")
192 var dashIcon = findChild(launcher, "dashItem")
154 verify(dashIcon != undefined)
193 verify(dashIcon != undefined)
@@ -158,7 +197,7 @@ Item {
158 tryCompare(launcher, "showDashHome_count", 1)
197 tryCompare(launcher, "showDashHome_count", 1)
159
198
160 // Tapping on the dash icon also dismisses the launcher
199 // Tapping on the dash icon also dismisses the launcher
161− revealer.waitUntilLauncherDisappears()
200+ waitUntilLauncherDisappears()
162 }
201 }
163
202
164 function test_teaseLauncher_data() {
203 function test_teaseLauncher_data() {
@@ -185,12 +224,12 @@ Item {
185 wait(100)
224 wait(100)
186 compare(launcher.maxPanelX, -launcher.panelWidth, "Launcher moved even if it shouldn't")
225 compare(launcher.maxPanelX, -launcher.panelWidth, "Launcher moved even if it shouldn't")
187 }
226 }
188− revealer.waitUntilLauncherDisappears();
227+ waitUntilLauncherDisappears();
189 launcher.available = true;
228 launcher.available = true;
190 }
229 }
191
230
192 function test_countEmblems() {
231 function test_countEmblems() {
193− revealer.dragLauncherIntoView();
232+ dragLauncherIntoView();
194 var launcherListView = findChild(launcher, "launcherListView");
233 var launcherListView = findChild(launcher, "launcherListView");
195 for (var i = 0; i < launcherListView.count; ++i) {
234 for (var i = 0; i < launcherListView.count; ++i) {
196 var delegate = findChild(launcherListView, "launcherDelegate" + i)
235 var delegate = findChild(launcherListView, "launcherDelegate" + i)
@@ -201,7 +240,7 @@ Item {
201 }
240 }
202
241
203 function test_progressOverlays() {
242 function test_progressOverlays() {
204− revealer.dragLauncherIntoView();
243+ dragLauncherIntoView();
205 var launcherListView = findChild(launcher, "launcherListView");
244 var launcherListView = findChild(launcher, "launcherListView");
206 for (var i = 0; i < launcherListView.count; ++i) {
245 for (var i = 0; i < launcherListView.count; ++i) {
207 var delegate = findChild(launcherListView, "launcherDelegate" + i)
246 var delegate = findChild(launcherListView, "launcherDelegate" + i)
@@ -210,35 +249,49 @@ Item {
210 }
249 }
211
250
212 function test_focusedHighlight() {
251 function test_focusedHighlight() {
213− revealer.dragLauncherIntoView();
252+ dragLauncherIntoView();
214 var launcherListView = findChild(launcher, "launcherListView");
253 var launcherListView = findChild(launcher, "launcherListView");
215 for (var i = 0; i < launcherListView.count; ++i) {
254 for (var i = 0; i < launcherListView.count; ++i) {
216 var delegate = findChild(launcherListView, "launcherDelegate" + i)
255 var delegate = findChild(launcherListView, "launcherDelegate" + i)
217 compare(findChild(delegate, "focusedHighlight").visible, LauncherModel.get(i).focused)
256 compare(findChild(delegate, "focusedHighlight").visible, LauncherModel.get(i).focused)
218 }
257 }
219 }
258 }
220− }
221−
222− UT.UnityTestCase {
223− id: clickFlickTestCase
224− when: windowShown && testCase.completed
225
259
226 function test_clickFlick_data() {
260 function test_clickFlick_data() {
227 var listView = findChild(launcher, "launcherListView");
261 var listView = findChild(launcher, "launcherListView");
228 return [
262 return [
263+ {tag: "unfolded top", positionViewAtBeginning: false,
229− {tag: "unfolded top", flickSpeed: units.gu(200), clickY: listView.topMargin + units.gu(2), expectFlick: false},
264+ clickY: listView.topMargin + units.gu(2),
265+ expectFlick: false},
266+
267+ {tag: "folded top", positionViewAtBeginning: true,
230− {tag: "folded top", flickSpeed: -units.gu(200), clickY: listView.topMargin + units.gu(2), expectFlick: true},
268+ clickY: listView.topMargin + units.gu(2),
269+ expectFlick: true},
270+
271+ {tag: "unfolded bottom", positionViewAtBeginning: true,
231− {tag: "unfolded bottom", flickSpeed: -units.gu(200), clickY: listView.height - listView.topMargin - units.gu(1), expectFlick: false},
272+ clickY: listView.height - listView.topMargin - units.gu(1),
273+ expectFlick: false},
274+
275+ {tag: "folded bottom", positionViewAtBeginning: false,
232− {tag: "folded bottom", flickSpeed: units.gu(200), clickY: listView.height - listView.topMargin - units.gu(1), expectFlick: true},
276+ clickY: listView.height - listView.topMargin - units.gu(1),
277+ expectFlick: true},
233 ];
278 ];
234 }
279 }
235
280
236 function test_clickFlick(data) {
281 function test_clickFlick(data) {
237 launcher.lastSelectedApplication = "";
282 launcher.lastSelectedApplication = "";
238− revealer.dragLauncherIntoView();
283+ dragLauncherIntoView();
239 var listView = findChild(launcher, "launcherListView");
284 var listView = findChild(launcher, "launcherListView");
240
285
241− listView.flick(0, data.flickSpeed);
286+ // flicking is unreliable. sometimes it works, sometimes the
287+ // list view moves just a tiny bit or not at all, making tests fail.
288+ // So for stability's sake we just put the listView in the position
289+ // we want to to actually start doing what this tests intends to check.
290+ if (data.positionViewAtBeginning) {
291+ listView.positionViewAtBeginning();
292+ } else {
293+ listView.positionViewAtEnd();
294+ }
242 tryCompare(listView, "flicking", false);
295 tryCompare(listView, "flicking", false);
243
296
244 var oldY = listView.contentY;
297 var oldY = listView.contentY;
@@ -253,44 +306,7 @@ Item {
253 verify(launcher.lastSelectedApplication != "");
306 verify(launcher.lastSelectedApplication != "");
254 compare(listView.contentY, oldY, "Launcher was flicked even though it should only launch an app");
307 compare(listView.contentY, oldY, "Launcher was flicked even though it should only launch an app");
255 }
308 }
256−
257− // Restore position on top
258− listView.flick(0, units.gu(200));
259− tryCompare(listView, "flicking", false)
260− // Click somewhere in the empty space to make it hide in case it isn't
261− mouseClick(launcher, launcher.width - units.gu(1), units.gu(1));
262− revealer.waitUntilLauncherDisappears();
263 }
309 }
264− }
265−
266− UT.UnityTestCase {
267− id: initTestCase
268− name: "LauncherInit"
269− when: windowShown
270−
271− function initTestCase() {
272− var listView = findChild(launcher, "launcherListView");
273− tryCompare(listView, "flicking", false)
274− }
275−
276− function test_initFirstUnfolded() {
277−
278− // Make sure noone changed the height of the window. The issue this test case
279− // is verifying only happens on certain heights of the Launcher
280− compare(root.height, units.gu(55));
281−
282− var listView = findChild(launcher, "launcherListView");
283− compare(listView.contentY, -listView.topMargin, "Launcher did not start up with first item unfolded");
284−
285− // Now do check that snapping is in fact enabled
286− compare(listView.snapMode, ListView.SnapToItem, "Snapping is not enabled");
287− }
288− }
289−
290− UT.UnityTestCase {
291− id: dndTestCase
292− name: "Drag and Drop"
293− when: windowShown && initTestCase.completed
294
310
295 function test_dragndrop_data() {
311 function test_dragndrop_data() {
296 return [
312 return [
@@ -301,7 +317,7 @@ Item {
301 }
317 }
302
318
303 function test_dragndrop(data) {
319 function test_dragndrop(data) {
304− revealer.dragLauncherIntoView();
320+ dragLauncherIntoView();
305 var draggedItem = findChild(launcher, "launcherDelegate4")
321 var draggedItem = findChild(launcher, "launcherDelegate4")
306 var item0 = findChild(launcher, "launcherDelegate0")
322 var item0 = findChild(launcher, "launcherDelegate0")
307 var fakeDragItem = findChild(launcher, "fakeDragItem")
323 var fakeDragItem = findChild(launcher, "fakeDragItem")
@@ -366,11 +382,11 @@ Item {
366
382
367 // Click somewhere in the empty space to make it hide in case it isn't
383 // Click somewhere in the empty space to make it hide in case it isn't
368 mouseClick(launcher, launcher.width - units.gu(1), units.gu(1));
384 mouseClick(launcher, launcher.width - units.gu(1), units.gu(1));
369− revealer.waitUntilLauncherDisappears();
385+ waitUntilLauncherDisappears();
370 }
386 }
371
387
372 function test_quicklist_dismiss() {
388 function test_quicklist_dismiss() {
373− revealer.dragLauncherIntoView();
389+ dragLauncherIntoView();
374 var draggedItem = findChild(launcher, "launcherDelegate5")
390 var draggedItem = findChild(launcher, "launcherDelegate5")
375 var item0 = findChild(launcher, "launcherDelegate0")
391 var item0 = findChild(launcher, "launcherDelegate0")
376 var fakeDragItem = findChild(launcher, "fakeDragItem")
392 var fakeDragItem = findChild(launcher, "fakeDragItem")
@@ -401,7 +417,7 @@ Item {
401 }
417 }
402
418
403 function test_quicklist_positioning(data) {
419 function test_quicklist_positioning(data) {
404− revealer.dragLauncherIntoView();
420+ dragLauncherIntoView();
405 var quickList = findChild(launcher, "quickList")
421 var quickList = findChild(launcher, "quickList")
406 var draggedItem = findChild(launcher, "launcherDelegate" + data.itemIndex)
422 var draggedItem = findChild(launcher, "launcherDelegate" + data.itemIndex)
407 var quickListShape = findChild(launcher, "quickListShape")
423 var quickListShape = findChild(launcher, "quickListShape")
@@ -428,7 +444,7 @@ Item {
428
444
429 // Click somewhere in the empty space to dismiss the launcher
445 // Click somewhere in the empty space to dismiss the launcher
430 mouseClick(launcher, launcher.width - units.gu(1), units.gu(1));
446 mouseClick(launcher, launcher.width - units.gu(1), units.gu(1));
431− revealer.waitUntilLauncherDisappears()
447+ waitUntilLauncherDisappears()
432 }
448 }
433
449
434 function test_quicklist_click_data() {
450 function test_quicklist_click_data() {
@@ -439,7 +455,7 @@ Item {
439 }
455 }
440
456
441 function test_quicklist_click(data) {
457 function test_quicklist_click(data) {
442− revealer.dragLauncherIntoView();
458+ dragLauncherIntoView();
443 var clickedItem = findChild(launcher, "launcherDelegate5")
459 var clickedItem = findChild(launcher, "launcherDelegate5")
444 var quickList = findChild(launcher, "quickList")
460 var quickList = findChild(launcher, "quickList")
445 var quickListShape = findChild(launcher, "quickListShape")
461 var quickListShape = findChild(launcher, "quickListShape")
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+24
@@ -37,6 +37,11 @@ Item {
37 property int modelIndex: 0
37 property int modelIndex: 0
38 property var data
38 property var data
39
39
40+ anchors {
41+ left: parent.left
42+ right: parent.right
43+ }
44+
40 onLoaded: {
45 onLoaded: {
41 if (item.hasOwnProperty("menuData")) {
46 if (item.hasOwnProperty("menuData")) {
42 item.menuData = data;
47 item.menuData = data;
@@ -734,5 +739,24 @@ Item {
734 compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
739 compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
735 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
740 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
736 }
741 }
742+
743+ function test_lp1336715_broken_checkbox_bindings() {
744+ menuData.type = "com.canonical.indicator.switch";
745+ menuData.sensitive = true;
746+ menuData.isToggled = false;
747+
748+ loader.data = menuData;
749+ loader.sourceComponent = factory.load(menuData);
750+
751+ compare(loader.item.checked, false, "Loader did not load check state");
752+ mouseClick(loader.item,
753+ loader.item.width / 2, loader.item.height / 2);
754+ compare(loader.item.checked, true, "Clicking switch menu should toggle check");
755+
756+ menuData.isToggled = true; // toggled will not update in mock
757+ menuData.isToggled = false;
758+
759+ compare(loader.item.checked, false, "Server updates no longer working");
760+ }
737 }
761 }
738}
762}
tests/qmltests/Stages/tst_ApplicationWindow.qml+2−2
@@ -51,6 +51,7 @@ Rectangle {
51 anchors.fill: parent
51 anchors.fill: parent
52 application: fakeApplication
52 application: fakeApplication
53 orientation: Qt.PortraitOrientation
53 orientation: Qt.PortraitOrientation
54+ interactive: true
54 }
55 }
55 }
56 }
56 Loader {
57 Loader {
@@ -375,8 +376,7 @@ Rectangle {
375
376
376 waitUntilTransitionsEnd();
377 waitUntilTransitionsEnd();
377
378
378− // Because doing stuff in C++ is a PITA we keep the counter in the interal qml impl.
379− var fakeSurface = findChild(fakeSession.surface, "fakeSurfaceQML");
379+ var fakeSurface = fakeSession.surface;
380 fakeSurface.touchPressCount = 0;
380 fakeSurface.touchPressCount = 0;
381 fakeSurface.touchReleaseCount = 0;
381 fakeSurface.touchReleaseCount = 0;
382
382
tests/qmltests/Stages/tst_PhoneStage.qml+19−1
@@ -178,7 +178,8 @@ Item {
178 var startX = phoneStage.width - 2;
178 var startX = phoneStage.width - 2;
179 var startY = phoneStage.height / 2;
179 var startY = phoneStage.height / 2;
180 var endY = startY;
180 var endY = startY;
181− var endX = spreadView.width - (spreadView.width * spreadView[data.positionMarker]) - data.offset;
181+ var endX = spreadView.width - (spreadView.width * spreadView[data.positionMarker]) - data.offset
182+ - phoneStage.dragAreaWidth;
182
183
183 var oldFocusedApp = ApplicationManager.get(0);
184 var oldFocusedApp = ApplicationManager.get(0);
184 var newFocusedApp = ApplicationManager.get(data.newFocusedIndex);
185 var newFocusedApp = ApplicationManager.get(data.newFocusedIndex);
@@ -322,5 +323,22 @@ Item {
322 }
323 }
323 phoneStage.orientation = Qt.PortraitOrientation;
324 phoneStage.orientation = Qt.PortraitOrientation;
324 }
325 }
326+
327+ function test_focusNewTopMostAppAfterFocusedOneClosesItself() {
328+ addApps(2);
329+
330+ var secondApp = ApplicationManager.get(0);
331+ tryCompare(secondApp, "state", ApplicationInfoInterface.Running);
332+ tryCompare(secondApp, "focused", true);
333+
334+ var firstApp = ApplicationManager.get(1);
335+ tryCompare(firstApp, "state", ApplicationInfoInterface.Suspended);
336+ tryCompare(firstApp, "focused", false);
337+
338+ ApplicationManager.stopApplication(secondApp.appId);
339+
340+ tryCompare(firstApp, "state", ApplicationInfoInterface.Running);
341+ tryCompare(firstApp, "focused", true);
342+ }
325 }
343 }
326}
344}
tests/qmltests/Stages/tst_SurfaceContainer.qml+26−1
@@ -99,6 +99,9 @@ Rectangle {
99 name: "SurfaceContainer"
99 name: "SurfaceContainer"
100 when: windowShown
100 when: windowShown
101
101
102+ property var surfaceContainer:
103+ surfaceContainerLoader.status === Loader.Ready ? surfaceContainerLoader.item : null
104+
102 function cleanup() {
105 function cleanup() {
103 // reload our test subject to get it in a fresh state once again
106 // reload our test subject to get it in a fresh state once again
104 surfaceContainerLoader.active = false;
107 surfaceContainerLoader.active = false;
@@ -126,7 +129,6 @@ Rectangle {
126
129
127 function test_animateRemoval() {
130 function test_animateRemoval() {
128 surfaceCheckbox.checked = true;
131 surfaceCheckbox.checked = true;
129− var surfaceContainer = surfaceContainerLoader.item;
130
132
131 verify(surfaceContainer.surface !== null);
133 verify(surfaceContainer.surface !== null);
132
134
@@ -135,5 +137,28 @@ Rectangle {
135 compare(surfaceContainer.state, "zombie");
137 compare(surfaceContainer.state, "zombie");
136 tryCompare(surfaceContainer, "surface", null);
138 tryCompare(surfaceContainer, "surface", null);
137 }
139 }
140+
141+ function test_surfaceGetsNoTouchesWhenContainerNotInteractive() {
142+ surfaceCheckbox.checked = true;
143+ verify(surfaceContainer.surface !== null);
144+
145+ surfaceContainer.surface.touchPressCount = 0;
146+ surfaceContainer.surface.touchReleaseCount = 0;
147+
148+ surfaceContainer.interactive = true;
149+ tap(surfaceContainer, surfaceContainer.width / 2, surfaceContainer.height / 2);
150+
151+ // surface got touches as the surfaceContainer is interactive
152+ compare(surfaceContainer.surface.touchPressCount, 1)
153+ compare(surfaceContainer.surface.touchReleaseCount, 1);
154+
155+ surfaceContainer.interactive = false;
156+ tap(surfaceContainer, surfaceContainer.width / 2, surfaceContainer.height / 2);
157+
158+ // surface shouldn't get the touches from the second tap as the surfaceContainer
159+ // was *not* interactive when it happened.
160+ compare(surfaceContainer.surface.touchPressCount, 1)
161+ compare(surfaceContainer.surface.touchReleaseCount, 1);
162+ }
138 }
163 }
139}
164}
tests/qmltests/tst_Shell.qml+160−50
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
3 *
3 *
4 * Authors:
4 * Authors:
5 * Daniel d'Andrada <daniel.dandrada@canonical.com>
5 * Daniel d'Andrada <daniel.dandrada@canonical.com>
@@ -31,9 +31,10 @@ import Powerd 0.1
31
31
32import "../../qml"
32import "../../qml"
33
33
34−Row {
34+Item {
35 id: root
35 id: root
36− spacing: 0
36+ width: units.gu(60)
37+ height: units.gu(71)
37
38
38 QtObject {
39 QtObject {
39 id: applicationArguments
40 id: applicationArguments
@@ -51,23 +52,43 @@ Row {
51 }
52 }
52 }
53 }
53
54
54− Loader {
55+ Row {
56+ anchors.fill: parent
57+ Loader {
55− id: shellLoader
58+ id: shellLoader
56−
59+
57− // Copied from Shell.qml
58− property bool tablet: false
59− width: tablet ? units.gu(160)
60− : applicationArguments.hasGeometry() ? applicationArguments.width()
61− : units.gu(40)
62− height: tablet ? units.gu(100)
63− : applicationArguments.hasGeometry() ? applicationArguments.height()
64− : units.gu(71)
65−
66− property bool itemDestroyed: false
60+ property bool itemDestroyed: false
67− sourceComponent: Component {
61+ sourceComponent: Component {
68− Shell {
62+ Shell {
69− Component.onDestruction: {
63+ Component.onDestruction: {
70− shellLoader.itemDestroyed = true;
64+ shellLoader.itemDestroyed = true;
65+ }
66+ }
67+ }
68+ }
69+
70+ Rectangle {
71+ color: "white"
72+ width: units.gu(30)
73+ height: shellLoader.height
74+
75+ Column {
76+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
77+ spacing: units.gu(1)
78+ Row {
79+ anchors { left: parent.left; right: parent.right }
80+ Button {
81+ text: "Show Greeter"
82+ onClicked: {
83+ if (shellLoader.status !== Loader.Ready)
84+ return;
85+
86+ var greeter = testCase.findChild(shellLoader.item, "greeter");
87+ if (!greeter.shown) {
88+ greeter.show();
89+ }
90+ }
91+ }
71 }
92 }
72 }
93 }
73 }
94 }
@@ -82,7 +103,6 @@ Row {
82 }
103 }
83 }
104 }
84 }
105 }
85−
86 ListModel {
106 ListModel {
87 id: mockNotificationsModel
107 id: mockNotificationsModel
88
108
@@ -99,30 +119,9 @@ Row {
99 }
119 }
100 }
120 }
101
121
102− Rectangle {
122+ SignalSpy {
103− color: "white"
123+ id: launcherShowDashHomeSpy
104− width: units.gu(30)
124+ signalName: "showDashHome"
105− height: shellLoader.height
106−
107− Column {
108− anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
109− spacing: units.gu(1)
110− Row {
111− anchors { left: parent.left; right: parent.right }
112− Button {
113− text: "Show Greeter"
114− onClicked: {
115− if (shellLoader.status !== Loader.Ready)
116− return;
117−
118− var greeter = testCase.findChild(shellLoader.item, "greeter");
119− if (!greeter.shown) {
120− greeter.show();
121− }
122− }
123− }
124− }
125− }
126 }
125 }
127
126
128 SignalSpy {
127 SignalSpy {
@@ -164,9 +163,14 @@ Row {
164
163
165 sessionSpy.target = findChild(shell, "greeter")
164 sessionSpy.target = findChild(shell, "greeter")
166 dashCommunicatorSpy.target = findInvisibleChild(shell, "dashCommunicator");
165 dashCommunicatorSpy.target = findInvisibleChild(shell, "dashCommunicator");
166+
167+ var launcher = findChild(shell, "launcher");
168+ launcherShowDashHomeSpy.target = launcher;
167 }
169 }
168
170
169 function cleanup() {
171 function cleanup() {
172+ launcherShowDashHomeSpy.target = null;
173+
170 shellLoader.itemDestroyed = false;
174 shellLoader.itemDestroyed = false;
171
175
172 shellLoader.active = false;
176 shellLoader.active = false;
@@ -208,7 +212,7 @@ Row {
208 // Open an application and focus
212 // Open an application and focus
209 waitUntilApplicationWindowIsFullyVisible(app);
213 waitUntilApplicationWindowIsFullyVisible(app);
210 ApplicationManager.focusApplication(app);
214 ApplicationManager.focusApplication(app);
211− compare(app.session.surface.activeFocus, true, "Focused application didn't have activeFocus");
215+ compare(app.session.surface.focus, true, "Focused application didn't have activeFocus");
212
216
213 notifications.model = mockNotificationsModel;
217 notifications.model = mockNotificationsModel;
214
218
@@ -228,7 +232,7 @@ Row {
228 verify(notification !== undefined && notification != null, "notification wasn't found");
232 verify(notification !== undefined && notification != null, "notification wasn't found");
229
233
230 // Make sure activeFocus went away from the app window
234 // Make sure activeFocus went away from the app window
231− compare(app.session.surface.activeFocus, false, "Notification didn't take active focus");
235+ compare(app.session.surface.focus, false, "Notification didn't take active focus");
232 compare(stage.interactive, false, "the stage is interactive with a notification showing")
236 compare(stage.interactive, false, "the stage is interactive with a notification showing")
233
237
234 // Clicking the button should dismiss the notification and return focus
238 // Clicking the button should dismiss the notification and return focus
@@ -236,7 +240,7 @@ Row {
236 mouseClick(buttonAccept, buttonAccept.width / 2, buttonAccept.height / 2);
240 mouseClick(buttonAccept, buttonAccept.width / 2, buttonAccept.height / 2);
237
241
238 // Make sure we're back to normal
242 // Make sure we're back to normal
239− compare(app.session.surface.activeFocus, true, "App didn't take active focus after snap notification was dismissed");
243+ compare(app.session.surface.focus, true, "App didn't take active focus after snap notification was dismissed");
240 compare(stage.interactive, true, "Stages not interactive again after modal notification has closed");
244 compare(stage.interactive, true, "Stages not interactive again after modal notification has closed");
241 }
245 }
242
246
@@ -494,8 +498,7 @@ Row {
494 touchFlick(launcherPanel, touchStartX, touchStartY, touchStartX, 0);
498 touchFlick(launcherPanel, touchStartX, touchStartY, touchStartX, 0);
495 tryCompare(launcherPanel, "moving", false);
499 tryCompare(launcherPanel, "moving", false);
496
500
497− // NB tapping (i.e., using touch events) doesn't activate the icon... go figure...
498− mouseClick(appIcon, appIcon.width / 2, appIcon.height / 2);
501+ tap(appIcon, appIcon.width / 2, appIcon.height / 2);
499 }
502 }
500
503
501 function showIndicators() {
504 function showIndicators() {
@@ -574,6 +577,7 @@ Row {
574 tryCompare(greeter, "showProgress", 0)
577 tryCompare(greeter, "showProgress", 0)
575 waitForRendering(greeter);
578 waitForRendering(greeter);
576 LightDM.Greeter.showGreeter()
579 LightDM.Greeter.showGreeter()
580+ waitForRendering(greeter)
577 tryCompare(greeter, "showProgress", 1)
581 tryCompare(greeter, "showProgress", 1)
578 LightDM.Greeter.hideGreeter()
582 LightDM.Greeter.hideGreeter()
579 tryCompare(greeter, "showProgress", 0)
583 tryCompare(greeter, "showProgress", 0)
@@ -661,5 +665,111 @@ Row {
661
665
662 tryCompare(greeter, "showProgress", data.unlocked ? 0 : 1);
666 tryCompare(greeter, "showProgress", data.unlocked ? 0 : 1);
663 }
667 }
668+
669+ function test_tapOnRightEdgeReachesApplicationSurface() {
670+ var topmostSpreadDelegate = findChild(shell, "appDelegate0");
671+ var topmostSurface = findChild(topmostSpreadDelegate, "surfaceContainer").surface;
672+ var rightEdgeDragArea = findChild(shell, "spreadDragArea");
673+
674+ topmostSurface.touchPressCount = 0;
675+ topmostSurface.touchReleaseCount = 0;
676+
677+ var tapPoint = rightEdgeDragArea.mapToItem(shell, rightEdgeDragArea.width / 2,
678+ rightEdgeDragArea.height / 2);
679+
680+ tap(shell, tapPoint.x, tapPoint.y);
681+
682+ tryCompare(topmostSurface, "touchPressCount", 1);
683+ tryCompare(topmostSurface, "touchReleaseCount", 1);
684+ }
685+
686+ /*
687+ Perform a right edge drag over an application surface and check
688+ that no touch event was sent to it (ie, they were all consumed
689+ by the right-edge drag area)
690+ */
691+ function test_rightEdgeDragDoesNotReachApplicationSurface() {
692+ var topmostSpreadDelegate = findChild(shell, "appDelegate0");
693+ var topmostSurface = findChild(topmostSpreadDelegate, "surfaceContainer").surface;
694+ var rightEdgeDragArea = findChild(shell, "spreadDragArea");
695+
696+ topmostSurface.touchPressCount = 0;
697+ topmostSurface.touchReleaseCount = 0;
698+
699+ var gestureStartPoint = rightEdgeDragArea.mapToItem(shell, rightEdgeDragArea.width / 2,
700+ rightEdgeDragArea.height / 2);
701+
702+ touchFlick(shell,
703+ gestureStartPoint.x /* fromX */, gestureStartPoint.y /* fromY */,
704+ units.gu(1) /* toX */, gestureStartPoint.y /* toY */);
705+
706+ tryCompare(topmostSurface, "touchPressCount", 0);
707+ tryCompare(topmostSurface, "touchReleaseCount", 0);
708+ }
709+
710+ function waitUntilFocusedApplicationIsShowingItsSurface()
711+ {
712+ var spreadDelegate = findChild(shell, "appDelegate0");
713+ var appState = findInvisibleChild(spreadDelegate, "applicationWindowStateGroup");
714+ tryCompare(appState, "state", "surface");
715+ var transitions = appState.transitions;
716+ for (var i = 0; i < transitions.length; ++i) {
717+ var transition = transitions[i];
718+ tryCompare(transition, "running", false, 2000);
719+ }
720+ }
721+
722+ function swipeFromRightEdgeToShowAppSpread()
723+ {
724+ // perform a right-edge drag to show the spread
725+ var touchStartX = shell.width - (shell.edgeSize / 2)
726+ var touchStartY = shell.height / 2;
727+ touchFlick(shell, touchStartX, touchStartY, units.gu(1) /* endX */, touchStartY /* endY */);
728+
729+ // check if it's indeed showing the spread
730+ var stage = findChild(shell, "stage");
731+ var spreadView = findChild(stage, "spreadView");
732+ tryCompare(spreadView, "phase", 2);
733+ }
734+
735+ function test_tapUbuntuIconInLauncherOverAppSpread() {
736+
737+ waitUntilFocusedApplicationIsShowingItsSurface();
738+
739+ swipeFromRightEdgeToShowAppSpread();
740+
741+ var launcher = findChild(shell, "launcher");
742+
743+ // ensure the launcher dimissal timer never gets triggered during the test run
744+ var dismissTimer = findInvisibleChild(launcher, "dismissTimer");
745+ dismissTimer.interval = 60 * 60 * 1000;
746+
747+ dragLauncherIntoView();
748+
749+ // Emulate a tap with a finger, where the touch position drifts during the tap.
750+ {
751+ var buttonShowDashHome = findChild(launcher, "buttonShowDashHome");
752+ var startPos = buttonShowDashHome.mapToItem(shell,
753+ buttonShowDashHome.width * 0.2,
754+ buttonShowDashHome.height * 0.2);
755+ var endPos = buttonShowDashHome.mapToItem(shell,
756+ buttonShowDashHome.width * 0.8,
757+ buttonShowDashHome.height * 0.8);
758+ touchFlick(shell, startPos.x, startPos.y, endPos.x, endPos.y);
759+ }
760+
761+ compare(launcherShowDashHomeSpy.count, 1);
762+
763+ // check that the stage has left spread mode.
764+ {
765+ var stage = findChild(shell, "stage");
766+ var spreadView = findChild(stage, "spreadView");
767+ tryCompare(spreadView, "phase", 0);
768+ }
769+
770+ // check that the launcher got dismissed
771+ var launcherPanel = findChild(shell, "launcherPanel");
772+ tryCompare(launcherPanel, "x", -launcherPanel.width);
773+ }
664 }
774 }
665}
775}
tests/qmltests/tst_ShellWithPin.qml+160−32
@@ -21,6 +21,7 @@ import AccountsService 0.1
21import GSettings 1.0
21import GSettings 1.0
22import LightDM 0.1 as LightDM
22import LightDM 0.1 as LightDM
23import Ubuntu.SystemImage 0.1
23import Ubuntu.SystemImage 0.1
24+import Ubuntu.Telephony 0.1 as Telephony
24import Unity.Application 0.1
25import Unity.Application 0.1
25import Unity.Test 0.1 as UT
26import Unity.Test 0.1 as UT
26import Powerd 0.1
27import Powerd 0.1
@@ -29,8 +30,8 @@ import "../../qml"
29
30
30Item {
31Item {
31 id: root
32 id: root
32− width: shell.width + units.gu(20)
33+ width: contentRow.width
33− height: shell.height
34+ height: contentRow.height
34
35
35 QtObject {
36 QtObject {
36 id: applicationArguments
37 id: applicationArguments
@@ -48,21 +49,57 @@ Item {
48 }
49 }
49 }
50 }
50
51
51− Shell {
52+ Row {
52− id: shell
53+ id: contentRow
53− maxFailedLogins: maxRetriesTextField.text
54+
54− }
55+ Loader {
55− Column {
56+ id: shellLoader
56− anchors { top: parent.top; right: parent.right; bottom: parent.bottom; margins:units.gu(1) }
57− width: units.gu(18)
58
57
59− Label {
58+ width: units.gu(40)
60− text: "Max retries:"
59+ height: units.gu(71)
61− color: "black"
60+
61+ property bool itemDestroyed: false
62+ sourceComponent: Component {
63+ Shell {
64+ Component.onDestruction: {
65+ shellLoader.itemDestroyed = true
66+ }
67+ maxFailedLogins: maxRetriesTextField.text
68+ }
69+ }
62 }
70 }
71+
72+ Rectangle {
73+ color: "white"
74+ width: units.gu(30)
75+ height: shellLoader.height
76+
77+ Column {
78+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
79+ spacing: units.gu(1)
80+ Button {
81+ anchors { left: parent.left; right: parent.right }
82+ text: "Show Greeter"
83+ onClicked: {
84+ if (shellLoader.status !== Loader.Ready)
85+ return
86+
87+ var greeter = testCase.findChild(shellLoader.item, "greeter")
88+ if (!greeter.shown) {
89+ greeter.show()
90+ }
91+ }
92+ }
93+
94+ Label {
95+ text: "Max retries:"
96+ color: "black"
97+ }
63− TextField {
98+ TextField {
64− id: maxRetriesTextField
99+ id: maxRetriesTextField
65− text: "-1"
100+ text: "-1"
101+ }
102+ }
66 }
103 }
67 }
104 }
68
105
@@ -77,30 +114,53 @@ Item {
77 signalName: "resettingDevice"
114 signalName: "resettingDevice"
78 }
115 }
79
116
117+ Telephony.CallEntry {
118+ id: phoneCall
119+ phoneNumber: "+447812221111"
120+ }
121+
80 UT.UnityTestCase {
122 UT.UnityTestCase {
123+ id: testCase
81 name: "ShellWithPin"
124 name: "ShellWithPin"
82 when: windowShown
125 when: windowShown
83
126
84− function initTestCase() {
127+ property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
85−
86− sessionSpy.target = findChild(shell, "greeter")
87− }
88
128
89 function init() {
129 function init() {
130+ sessionSpy.target = findChild(shell, "greeter")
90 swipeAwayGreeter()
131 swipeAwayGreeter()
132+ waitForLockscreen()
91 shell.failedLoginsDelayAttempts = -1
133 shell.failedLoginsDelayAttempts = -1
92 maxRetriesTextField.text = "-1"
134 maxRetriesTextField.text = "-1"
93− AccountsService.enableLauncherWhileLocked = true
94− AccountsService.enableIndicatorsWhileLocked = true
95 }
135 }
96
136
97 function cleanup() {
137 function cleanup() {
98− LightDM.Greeter.showGreeter()
138+ shellLoader.itemDestroyed = false
99− var greeter = findChild(shell, "greeter")
139+
100− tryCompare(greeter, "showProgress", 1)
140+ shellLoader.active = false
141+
142+ tryCompare(shellLoader, "status", Loader.Null)
143+ tryCompare(shellLoader, "item", null)
144+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
145+ // item might still be alive. So if we set Loader.active back to true
146+ // again right now we will get the very same Shell instance back. So no reload
147+ // actually took place. Likely because Loader waits until the next event loop
148+ // iteration to do its work. So to ensure the reload, we will wait until the
149+ // Shell instance gets destroyed.
150+ tryCompare(shellLoader, "itemDestroyed", true)
101
151
102 // kill all (fake) running apps
152 // kill all (fake) running apps
103 killApps()
153 killApps()
154+
155+ AccountsService.enableLauncherWhileLocked = true
156+ AccountsService.enableIndicatorsWhileLocked = true
157+ AccountsService.demoEdges = false
158+
159+ // reload our test subject to get it in a fresh state once again
160+ shellLoader.active = true
161+
162+ tryCompare(shellLoader, "status", Loader.Ready)
163+ removeTimeConstraintsFromDirectionalDragAreas(shellLoader.item)
104 }
164 }
105
165
106 function killApps() {
166 function killApps() {
@@ -113,6 +173,7 @@ Item {
113
173
114 function swipeAwayGreeter() {
174 function swipeAwayGreeter() {
115 var greeter = findChild(shell, "greeter");
175 var greeter = findChild(shell, "greeter");
176+ waitForRendering(greeter)
116 tryCompare(greeter, "showProgress", 1);
177 tryCompare(greeter, "showProgress", 1);
117
178
118 var touchX = shell.width - (shell.edgeSize / 2);
179 var touchX = shell.width - (shell.edgeSize / 2);
@@ -121,8 +182,9 @@ Item {
121
182
122 // wait until the animation has finished
183 // wait until the animation has finished
123 tryCompare(greeter, "showProgress", 0);
184 tryCompare(greeter, "showProgress", 0);
185+ }
124
186
125− // and for pin to be ready
187+ function waitForLockscreen() {
126 var lockscreen = findChild(shell, "lockscreen");
188 var lockscreen = findChild(shell, "lockscreen");
127 var pinPadLoader = findChild(lockscreen, "pinPadLoader");
189 var pinPadLoader = findChild(lockscreen, "pinPadLoader");
128 tryCompare(pinPadLoader, "status", Loader.Ready)
190 tryCompare(pinPadLoader, "status", Loader.Ready)
@@ -134,10 +196,20 @@ Item {
134 for (var i = 0; i < pin.length; ++i) {
196 for (var i = 0; i < pin.length; ++i) {
135 var character = pin.charAt(i)
197 var character = pin.charAt(i)
136 var button = findChild(shell, "pinPadButton" + character)
198 var button = findChild(shell, "pinPadButton" + character)
137− mouseClick(button, units.gu(1), units.gu(1))
199+ tap(button)
138 }
200 }
139 }
201 }
140
202
203+ function confirmLockedApp(app) {
204+ var greeter = findChild(shell, "greeter")
205+ var lockscreen = findChild(shell, "lockscreen")
206+ tryCompare(greeter, "shown", false)
207+ tryCompare(lockscreen, "shown", false)
208+ tryCompare(greeter, "hasLockedApp", true)
209+ tryCompare(greeter, "lockedApp", app)
210+ tryCompare(ApplicationManager, "focusedApplicationId", app)
211+ }
212+
141 function test_login() {
213 function test_login() {
142 sessionSpy.clear()
214 sessionSpy.clear()
143 tryCompare(sessionSpy, "count", 0)
215 tryCompare(sessionSpy, "count", 0)
@@ -145,6 +217,25 @@ Item {
145 tryCompare(sessionSpy, "count", 1)
217 tryCompare(sessionSpy, "count", 1)
146 }
218 }
147
219
220+ function test_edgeDemoHidesLockscreen() {
221+ LightDM.Greeter.showGreeter()
222+ sessionSpy.clear()
223+ var lockscreen = findChild(shell, "lockscreen")
224+
225+ tryCompare(lockscreen, "shown", true)
226+ AccountsService.demoEdges = true
227+ tryCompare(lockscreen, "shown", false)
228+
229+ swipeAwayGreeter()
230+ tryCompare(sessionSpy, "count", 1)
231+
232+ // Lockscreen is only hidden by the edge demo, so if we turn that
233+ // off and show greeter again, lockscreen should appear
234+ AccountsService.demoEdges = false
235+ LightDM.Greeter.showGreeter()
236+ tryCompare(lockscreen, "shown", true)
237+ }
238+
148 function test_disabledEdges() {
239 function test_disabledEdges() {
149 var launcher = findChild(shell, "launcher")
240 var launcher = findChild(shell, "launcher")
150 tryCompare(launcher, "available", true)
241 tryCompare(launcher, "available", true)
@@ -166,9 +257,10 @@ Item {
166 var launcher = findChild(shell, "launcher")
257 var launcher = findChild(shell, "launcher")
167 var stage = findChild(shell, "stage")
258 var stage = findChild(shell, "stage")
168
259
169− mouseClick(emergencyButton, units.gu(1), units.gu(1))
260+ tap(emergencyButton)
170
261
171− tryCompare(greeter, "fakeActiveForApp", "dialer-app")
262+ tryCompare(greeter, "lockedApp", "dialer-app")
263+ tryCompare(greeter, "hasLockedApp", true)
172 tryCompare(lockscreen, "shown", false)
264 tryCompare(lockscreen, "shown", false)
173 tryCompare(panel, "fullscreenMode", true)
265 tryCompare(panel, "fullscreenMode", true)
174 tryCompare(indicators, "available", false)
266 tryCompare(indicators, "available", false)
@@ -180,7 +272,8 @@ Item {
180 LightDM.Greeter.showGreeter()
272 LightDM.Greeter.showGreeter()
181
273
182 tryCompare(greeter, "shown", true)
274 tryCompare(greeter, "shown", true)
183− tryCompare(greeter, "fakeActiveForApp", "")
275+ tryCompare(greeter, "lockedApp", "")
276+ tryCompare(greeter, "hasLockedApp", false)
184 tryCompare(lockscreen, "shown", true)
277 tryCompare(lockscreen, "shown", true)
185 tryCompare(panel, "fullscreenMode", false)
278 tryCompare(panel, "fullscreenMode", false)
186 tryCompare(indicators, "available", true)
279 tryCompare(indicators, "available", true)
@@ -191,7 +284,7 @@ Item {
191 function test_emergencyCallCrash() {
284 function test_emergencyCallCrash() {
192 var lockscreen = findChild(shell, "lockscreen")
285 var lockscreen = findChild(shell, "lockscreen")
193 var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
286 var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
194− mouseClick(emergencyButton, units.gu(1), units.gu(1))
287+ tap(emergencyButton)
195
288
196 tryCompare(lockscreen, "shown", false)
289 tryCompare(lockscreen, "shown", false)
197 killApps() // kill dialer-app, as if it crashed
290 killApps() // kill dialer-app, as if it crashed
@@ -201,7 +294,7 @@ Item {
201 function test_emergencyCallAppLaunch() {
294 function test_emergencyCallAppLaunch() {
202 var lockscreen = findChild(shell, "lockscreen")
295 var lockscreen = findChild(shell, "lockscreen")
203 var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
296 var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
204− mouseClick(emergencyButton, units.gu(1), units.gu(1))
297+ tap(emergencyButton)
205
298
206 tryCompare(lockscreen, "shown", false)
299 tryCompare(lockscreen, "shown", false)
207 ApplicationManager.startApplication("gallery-app", ApplicationManager.NoFlag)
300 ApplicationManager.startApplication("gallery-app", ApplicationManager.NoFlag)
@@ -246,12 +339,47 @@ Item {
246
339
247 var dialog = findChild(root, "infoPopup")
340 var dialog = findChild(root, "infoPopup")
248 var button = findChild(dialog, "infoPopupOkButton")
341 var button = findChild(dialog, "infoPopupOkButton")
249− mouseClick(button, units.gu(1), units.gu(1))
342+ tap(button)
250 tryCompareFunction(function() {return findChild(root, "infoPopup")}, null)
343 tryCompareFunction(function() {return findChild(root, "infoPopup")}, null)
251
344
252 tryCompare(resetSpy, "count", 0)
345 tryCompare(resetSpy, "count", 0)
253 enterPin("1111")
346 enterPin("1111")
254 tryCompare(resetSpy, "count", 1)
347 tryCompare(resetSpy, "count", 1)
255 }
348 }
349+
350+ function test_emergencyDialerLockOut() {
351+ // This is a theoretical attack on the lockscreen: Enter emergency
352+ // dialer mode on a phone, then plug into a larger screen,
353+ // switching to a tablet interface. This would in theory move the
354+ // dialer to a side stage and give access to other apps. So just
355+ // confirm that such an attack doesn't work.
356+
357+ var applicationsDisplayLoader = findChild(shell, "applicationsDisplayLoader")
358+
359+ // We start in phone mode
360+ tryCompare(shell, "sideStageEnabled", false)
361+ tryCompare(applicationsDisplayLoader, "tabletMode", false)
362+
363+ var lockscreen = findChild(shell, "lockscreen")
364+ lockscreen.emergencyCall()
365+ confirmLockedApp("dialer-app")
366+
367+ // OK, we're in. Now try (but fail) to switch to tablet mode
368+ shell.tablet = true
369+ tryCompare(shell, "sideStageEnabled", true)
370+ tryCompare(applicationsDisplayLoader, "tabletMode", false)
371+
372+ // And when we kill the app, we go back to locked tablet mode
373+ killApps()
374+ var greeter = findChild(shell, "greeter")
375+ tryCompare(greeter, "showProgress", 1)
376+ tryCompare(shell, "sideStageEnabled", true)
377+ tryCompare(applicationsDisplayLoader, "tabletMode", true)
378+ }
379+
380+ function test_emergencyDialerIncoming() {
381+ callManager.foregroundCall = phoneCall
382+ confirmLockedApp("dialer-app")
383+ }
256 }
384 }
257}
385}
tests/qmltests/tst_TabletShell.qmlnew file+297
@@ -0,0 +1,297 @@
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 AccountsService 0.1
20+import GSettings 1.0
21+import LightDM 0.1 as LightDM
22+import Ubuntu.Components 1.1
23+import Ubuntu.Telephony 0.1 as Telephony
24+import Unity.Application 0.1
25+import Unity.Connectivity 0.1
26+import Unity.Test 0.1 as UT
27+import Powerd 0.1
28+
29+import "../../qml"
30+
31+Row {
32+ id: root
33+ spacing: 0
34+
35+ QtObject {
36+ id: applicationArguments
37+
38+ function hasGeometry() {
39+ return false
40+ }
41+
42+ function width() {
43+ return 0
44+ }
45+
46+ function height() {
47+ return 0
48+ }
49+ }
50+
51+ Loader {
52+ id: shellLoader
53+
54+ width: units.gu(100)
55+ height: units.gu(80)
56+
57+ property bool itemDestroyed: false
58+ sourceComponent: Component {
59+ Shell {
60+ Component.onDestruction: {
61+ shellLoader.itemDestroyed = true
62+ }
63+ }
64+ }
65+ }
66+
67+ Rectangle {
68+ color: "white"
69+ width: units.gu(20)
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+ }
92+
93+ SignalSpy {
94+ id: sessionSpy
95+ signalName: "sessionStarted"
96+ }
97+
98+ SignalSpy {
99+ id: dashCommunicatorSpy
100+ signalName: "setCurrentScopeCalled"
101+ }
102+
103+ SignalSpy {
104+ id: unlockAllModemsSpy
105+ target: Connectivity
106+ signalName: "unlockingAllModems"
107+ }
108+
109+ Telephony.CallEntry {
110+ id: phoneCall
111+ phoneNumber: "+447812221111"
112+ }
113+
114+ UT.UnityTestCase {
115+ id: testCase
116+ name: "TabletShell"
117+ when: windowShown
118+
119+ property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
120+
121+ function init() {
122+ sessionSpy.clear()
123+ sessionSpy.target = findChild(shell, "greeter")
124+ dashCommunicatorSpy.target = findInvisibleChild(shell, "dashCommunicator")
125+ }
126+
127+ function cleanup() {
128+ shellLoader.itemDestroyed = false
129+
130+ shellLoader.active = false
131+
132+ tryCompare(shellLoader, "status", Loader.Null)
133+ tryCompare(shellLoader, "item", null)
134+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
135+ // item might still be alive. So if we set Loader.active back to true
136+ // again right now we will get the very same Shell instance back. So no reload
137+ // actually took place. Likely because Loader waits until the next event loop
138+ // iteration to do its work. So to ensure the reload, we will wait until the
139+ // Shell instance gets destroyed.
140+ tryCompare(shellLoader, "itemDestroyed", true)
141+
142+ // kill all (fake) running apps
143+ killApps()
144+
145+ unlockAllModemsSpy.clear()
146+ AccountsService.demoEdges = false
147+
148+ // reload our test subject to get it in a fresh state once again
149+ shellLoader.active = true
150+
151+ tryCompare(shellLoader, "status", Loader.Ready)
152+ removeTimeConstraintsFromDirectionalDragAreas(shellLoader.item)
153+ }
154+
155+ function killApps() {
156+ while (ApplicationManager.count > 1) {
157+ var appIndex = ApplicationManager.get(0).appId == "unity8-dash" ? 1 : 0
158+ ApplicationManager.stopApplication(ApplicationManager.get(appIndex).appId)
159+ }
160+ compare(ApplicationManager.count, 1)
161+ }
162+
163+ function selectIndex(i) {
164+ // We could be anywhere in list; find target index to know which direction
165+ var greeter = findChild(shell, "greeter")
166+ var userlist = findChild(greeter, "userList")
167+ if (userlist.currentIndex == i)
168+ keyClick(Qt.Key_Escape) // Reset state if we're not moving
169+ while (userlist.currentIndex != i) {
170+ var next = userlist.currentIndex + 1
171+ if (userlist.currentIndex > i) {
172+ next = userlist.currentIndex - 1
173+ }
174+ var account = findChild(greeter, "username"+next)
175+ mouseClick(account, 1, 1)
176+ tryCompare(userlist, "currentIndex", next)
177+ tryCompare(userlist, "movingInternally", false)
178+ }
179+ }
180+
181+ function selectUser(name) {
182+ // Find index of user with the right name
183+ var greeter = findChild(shell, "greeter")
184+ for (var i = 0; i < greeter.model.count; i++) {
185+ if (greeter.model.data(i, LightDM.UserRoles.NameRole) == name) {
186+ break
187+ }
188+ }
189+ if (i == greeter.model.count) {
190+ fail("Didn't find name")
191+ return -1
192+ }
193+ selectIndex(i)
194+ return i
195+ }
196+
197+ function clickPasswordInput(isButton) {
198+ var greeter = findChild(shell, "greeter")
199+ tryCompare(greeter, "showProgress", 1)
200+
201+ var passwordMouseArea = findChild(shell, "passwordMouseArea")
202+ tryCompare(passwordMouseArea, "enabled", isButton)
203+
204+ var passwordInput = findChild(shell, "passwordInput")
205+ mouseClick(passwordInput, passwordInput.width / 2, passwordInput.height / 2)
206+ }
207+
208+ function confirmLoggedIn(loggedIn) {
209+ var greeterWrapper = findChild(shell, "greeterWrapper")
210+ tryCompare(greeterWrapper, "showProgress", loggedIn ? 0 : 1)
211+ tryCompare(sessionSpy, "count", loggedIn ? 1 : 0)
212+ }
213+
214+ function swipeFromLeftEdge(swipeLength) {
215+ var touchStartX = 2
216+ var touchStartY = shell.height / 2
217+ touchFlick(shell, touchStartX, touchStartY, swipeLength, touchStartY)
218+ }
219+
220+ function test_noLockscreen() {
221+ selectUser("has-password")
222+ var lockscreen = findChild(shell, "lockscreen")
223+ tryCompare(lockscreen, "shown", false)
224+ }
225+
226+ function test_showAndHideGreeterDBusCalls() {
227+ var greeter = findChild(shell, "greeter")
228+ LightDM.Greeter.hideGreeter()
229+ tryCompare(greeter, "showProgress", 0)
230+ LightDM.Greeter.showGreeter()
231+ tryCompare(greeter, "showProgress", 1)
232+ }
233+
234+ function test_login_data() {
235+ return [
236+ {tag: "auth error", user: "auth-error", loggedIn: false, password: ""},
237+ {tag: "with password", user: "has-password", loggedIn: true, password: "password"},
238+ {tag: "without password", user: "no-password", loggedIn: true, password: ""},
239+ ]
240+ }
241+
242+ function test_login(data) {
243+ selectUser(data.user)
244+
245+ clickPasswordInput(data.password === "")
246+
247+ if (data.password !== "") {
248+ typeString(data.password)
249+ keyClick(Qt.Key_Enter)
250+ }
251+
252+ confirmLoggedIn(data.loggedIn)
253+ }
254+
255+ function test_appLaunchDuringGreeter_data() {
256+ return [
257+ {tag: "auth error", user: "auth-error", loggedIn: false, passwordFocus: false},
258+ {tag: "without password", user: "no-password", loggedIn: true, passwordFocus: false},
259+ {tag: "with password", user: "has-password", loggedIn: false, passwordFocus: true},
260+ ]
261+ }
262+
263+ function test_appLaunchDuringGreeter(data) {
264+ selectUser(data.user)
265+
266+ var greeter = findChild(shell, "greeter")
267+ var app = ApplicationManager.startApplication("dialer-app")
268+
269+ confirmLoggedIn(data.loggedIn)
270+
271+ if (data.passwordFocus) {
272+ var passwordInput = findChild(greeter, "passwordInput")
273+ tryCompare(passwordInput, "focus", true)
274+ }
275+ }
276+
277+ function test_leftEdgeDrag_data() {
278+ return [
279+ {tag: "without password", user: "no-password", loggedIn: true, demo: false},
280+ {tag: "with password", user: "has-password", loggedIn: false, demo: false},
281+ {tag: "with demo", user: "has-password", loggedIn: true, demo: true},
282+ ]
283+ }
284+
285+ function test_leftEdgeDrag(data) {
286+ selectUser(data.user)
287+
288+ AccountsService.demoEdges = data.demo
289+ var edgeDemo = findChild(shell, "edgeDemo")
290+ tryCompare(edgeDemo, "running", data.demo)
291+
292+ swipeFromLeftEdge(shell.width * 0.75)
293+ wait(500) // to give time to handle dash() signal from Launcher
294+ confirmLoggedIn(data.loggedIn)
295+ }
296+ }
297+}
tests/uqmlscene/CMakeLists.txt+2
@@ -10,6 +10,7 @@ pkg_check_modules(XCB REQUIRED xcb)
10include_directories(
10include_directories(
11 ${CMAKE_SOURCE_DIR}/src
11 ${CMAKE_SOURCE_DIR}/src
12 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
12 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
13+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
13)
14)
14
15
15if (NOT "${XCB_INCLUDE_DIRS}" STREQUAL "")
16if (NOT "${XCB_INCLUDE_DIRS}" STREQUAL "")
@@ -20,4 +21,5 @@ target_link_libraries(uqmlscene
20 ${Qt5Qml_LIBRARIES}
21 ${Qt5Qml_LIBRARIES}
21 ${Qt5Quick_LIBRARIES}
22 ${Qt5Quick_LIBRARIES}
22 ${XCB_LDFLAGS}
23 ${XCB_LDFLAGS}
24+ UbuntuGestures
23 )
25 )
tests/uqmlscene/README+3−1
@@ -1 +1,3 @@
1+Qt's qmlscene tool with the following modifications:
1−Qt's qmlscene tool modified to use MouseTouchAdaptor. That way we can interact with touch-only components
2+ - Added MouseTouchAdaptor. That way we can interact with touch-only components
3+ - Added TouchRegistry. So that DirectionalDragArea, TouchGate and others can negotiate touch ownership etc.
tests/uqmlscene/main.cpp+9
@@ -65,6 +65,9 @@
65
65
66#include <MouseTouchAdaptor.h>
66#include <MouseTouchAdaptor.h>
67
67
68+// UbuntuGestures lib
69+#include <TouchRegistry.h>
70+
68#ifdef QML_RUNTIME_TESTING
71#ifdef QML_RUNTIME_TESTING
69class RenderStatistics
72class RenderStatistics
70{
73{
@@ -496,6 +499,12 @@ int main(int argc, char ** argv)
496 QQuickItem *contentItem = qobject_cast<QQuickItem *>(topLevel);
499 QQuickItem *contentItem = qobject_cast<QQuickItem *>(topLevel);
497 if (contentItem) {
500 if (contentItem) {
498 qxView = new QQuickView(&engine, nullptr);
501 qxView = new QQuickView(&engine, nullptr);
502+ if (TouchRegistry::instance() == nullptr) {
503+ new TouchRegistry(qxView);
504+ } else {
505+ TouchRegistry::instance()->setParent(qxView);
506+ }
507+ qxView->installEventFilter(TouchRegistry::instance());
499 window = qxView;
508 window = qxView;
500 // Set window default properties; the qml can still override them
509 // Set window default properties; the qml can still override them
501 QString oname = contentItem->objectName();
510 QString oname = contentItem->objectName();
tests/utils/modules/Unity/Test/CMakeLists.txt+2
@@ -4,6 +4,7 @@ add_definitions(-DQT_NO_KEYWORDS)
4
4
5include_directories(
5include_directories(
6 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
6 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
7+ ${CMAKE_SOURCE_DIR}/libs/UbuntuGestures
7)
8)
8
9
9set(UnityTestQML_SOURCES
10set(UnityTestQML_SOURCES
@@ -13,6 +14,7 @@ set(UnityTestQML_SOURCES
13)
14)
14
15
15add_library(UnityTestQml MODULE ${UnityTestQML_SOURCES})
16add_library(UnityTestQml MODULE ${UnityTestQML_SOURCES})
17+target_link_libraries(UnityTestQml UbuntuGestures)
16
18
17qt5_use_modules(UnityTestQml Core Quick Test)
19qt5_use_modules(UnityTestQml Core Quick Test)
18
20
tests/utils/modules/Unity/Test/UnityTestCase.qml+20
@@ -20,8 +20,17 @@ import Ubuntu.Components 0.1
20import Unity.Test 0.1 as UT
20import Unity.Test 0.1 as UT
21
21
22TestCase {
22TestCase {
23+ id: testCase
23 TestUtil {id:util}
24 TestUtil {id:util}
24
25
26+ ActivityIndicator {
27+ visible: testCase.running
28+ anchors.centerIn: parent
29+ Component.onCompleted: parent = testCase.parent
30+ z: 100
31+ running: visible
32+ }
33+
25 // Fake implementation to be provided to items under test
34 // Fake implementation to be provided to items under test
26 property var fakeDateTime: new function() {
35 property var fakeDateTime: new function() {
27 this.currentTimeMs = 0
36 this.currentTimeMs = 0
@@ -312,7 +321,16 @@ TestCase {
312 event.commit()
321 event.commit()
313 }
322 }
314
323
324+ /*! \brief Tap the item with a touch event.
325+
326+ \param item The item to be tapped
327+ \param x The x coordinate of the tap, defaults to horizontal center
328+ \param y The y coordinate of the tap, defaults to vertical center
329+ */
315 function tap(item, x, y) {
330 function tap(item, x, y) {
331+ if (typeof x !== "number") x = item.width / 2;
332+ if (typeof y !== "number") y = item.height / 2;
333+
316 var root = fetchRootItem(item)
334 var root = fetchRootItem(item)
317 var rootPoint = item.mapToItem(root, x, y)
335 var rootPoint = item.mapToItem(root, x, y)
318
336
@@ -326,6 +344,8 @@ TestCase {
326 }
344 }
327
345
328 Component.onCompleted: {
346 Component.onCompleted: {
347+ UT.Util.ensureTouchRegistryInstalled();
348+
329 var rootItem = parent;
349 var rootItem = parent;
330 while (rootItem.parent != undefined) {
350 while (rootItem.parent != undefined) {
331 rootItem = rootItem.parent;
351 rootItem = rootItem.parent;
tests/utils/modules/Unity/Test/testutil.cpp+41−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2012, 2013 Canonical, Ltd.
2+ * Copyright (C) 2012, 2013, 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -19,11 +19,19 @@
19
19
20#include <qpa/qwindowsysteminterface.h>
20#include <qpa/qwindowsysteminterface.h>
21#include <QtGui/QGuiApplication>
21#include <QtGui/QGuiApplication>
22+#include <QQuickView>
23+
24+// UbuntuGestures lib
25+#include <TouchRegistry.h>
26+#include <Timer.h>
27+
28+using namespace UbuntuGestures;
22
29
23TestUtil::TestUtil(QObject *parent)
30TestUtil::TestUtil(QObject *parent)
24 : QObject(parent)
31 : QObject(parent)
25 , m_targetWindow(0)
32 , m_targetWindow(0)
26 , m_touchDevice(0)
33 , m_touchDevice(0)
34+ , m_installedTouchRegistry(false)
27{
35{
28}
36}
29
37
@@ -52,6 +60,7 @@ TouchEventSequenceWrapper *TestUtil::touchEvent()
52{
60{
53 ensureTargetWindow();
61 ensureTargetWindow();
54 ensureTouchDevice();
62 ensureTouchDevice();
63+ ensureTouchRegistryInstalled();
55
64
56 return new TouchEventSequenceWrapper(
65 return new TouchEventSequenceWrapper(
57 QTest::touchEvent(m_targetWindow, m_touchDevice, /* autoCommit */ false));
66 QTest::touchEvent(m_targetWindow, m_touchDevice, /* autoCommit */ false));
@@ -59,7 +68,7 @@ TouchEventSequenceWrapper *TestUtil::touchEvent()
59
68
60void TestUtil::ensureTargetWindow()
69void TestUtil::ensureTargetWindow()
61{
70{
62− if (!m_targetWindow)
71+ if (!m_targetWindow && !QGuiApplication::topLevelWindows().isEmpty())
63 m_targetWindow = QGuiApplication::topLevelWindows()[0];
72 m_targetWindow = QGuiApplication::topLevelWindows()[0];
64}
73}
65
74
@@ -71,3 +80,33 @@ void TestUtil::ensureTouchDevice()
71 QWindowSystemInterface::registerTouchDevice(m_touchDevice);
80 QWindowSystemInterface::registerTouchDevice(m_touchDevice);
72 }
81 }
73}
82}
83+
84+void TestUtil::ensureTouchRegistryInstalled()
85+{
86+ if (m_installedTouchRegistry)
87+ return;
88+
89+ TouchRegistry *touchRegistry;
90+ if (TouchRegistry::instance() == nullptr) {
91+ // Tests can be *very* slow to run and we don't want things timing out because
92+ // of that. So give it fake timers to use (they will never time out)
93+ touchRegistry = new TouchRegistry(this, new FakeTimerFactory);
94+ } else {
95+ touchRegistry = TouchRegistry::instance();
96+ if (touchRegistry->parent() != this) {
97+ // someone else created it. leave it alone
98+ m_installedTouchRegistry = true;
99+ }
100+ }
101+
102+ ensureTargetWindow();
103+
104+ if (m_targetWindow) {
105+ QQuickView *view = qobject_cast<QQuickView*>(m_targetWindow);
106+ if (view) {
107+ view->installEventFilter(touchRegistry);
108+ touchRegistry->setParent(view);
109+ m_installedTouchRegistry = true;
110+ }
111+ }
112+}
tests/utils/modules/Unity/Test/testutil.h+3−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2012, 2013 Canonical, Ltd.
2+ * Copyright (C) 2012, 2013, 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -34,6 +34,7 @@ public:
34
34
35 Q_INVOKABLE bool isInstanceOf(QObject*, QString);
35 Q_INVOKABLE bool isInstanceOf(QObject*, QString);
36 Q_INVOKABLE TouchEventSequenceWrapper *touchEvent();
36 Q_INVOKABLE TouchEventSequenceWrapper *touchEvent();
37+ Q_INVOKABLE void ensureTouchRegistryInstalled();
37
38
38private:
39private:
39 void ensureTargetWindow();
40 void ensureTargetWindow();
@@ -41,6 +42,7 @@ private:
41
42
42 QWindow *m_targetWindow;
43 QWindow *m_targetWindow;
43 QTouchDevice *m_touchDevice;
44 QTouchDevice *m_touchDevice;
45+ bool m_installedTouchRegistry;
44};
46};
45
47
46QML_DECLARE_TYPE(TestUtil)
48QML_DECLARE_TYPE(TestUtil)