on xenial help sign in
Merge trunk
247b8a3Albert Astals
debian/changelog+72
@@ -1,3 +1,75 @@
1+unity8 (8.00+14.10.20140822-0ubuntu1) utopic; urgency=low
2+
3+ [ Albert Astals ]
4+ * More stable dash overview tests
5+ * PreviewExpandable: "widgets" is a model, not an array
6+
7+ [ Alberto Aguirre ]
8+ * Proxy inactivity timeout values from gsettings into Unity.Screen
9+ (LP: #1230345)
10+
11+ [ Gerry Boland ]
12+ * Cancel open PAM interactions on shutdown - fixes hang on logout on
13+ desktop (LP: #1353041)
14+
15+ [ Diego Sarmentero ]
16+ * Show progress bar on payment button click The payment process has a
17+ small delay before the UI comes up which might cause confusion. Show
18+ a progress bar with unknown value to indicate activity. (LP:
19+ #1354139)
20+
21+ [ Mirco Müller ]
22+ * Made notification qml-test pass again by using Component.onCompleted
23+ instead of onOpacityChanged for the time being.
24+
25+ [ Michael Zanetti ]
26+ * Implement new lockscreen designs
27+
28+ [ Michael Terry ]
29+ * Show the SIM unlock dialog immediately after booting, and enable its
30+ emergency call button.
31+ * Always keep indicator/launcher locked state in sync with whether the
32+ user is authenticated. (LP:# 1357230) (LP: #1357230)
33+ * Allow logging into a desktop or tablet session again, by properly
34+ dismissing old PAM conversations. (LP: #1350878) In a desktop or
35+ tablet, we were accidentally starting two PAM conversations in
36+ sequence on startup. Which is a small bug; it shouldn't normally be
37+ a problem, since each new PAM conversation should kill the old
38+ one.But the way we were killing the old one was subject to a thread
39+ race condition. See, a PAM conversation thread won't exit until all
40+ its prompts are answered. And what we do when we kill a PAM
41+ conversation is to answer all prompts with empty strings.But it's
42+ possible that when we want to kill a PAM conversation that it hasn't
43+ actually gotten to the point of prompting us yet. And when those
44+ prompts do come through, we were treating them as prompts for the
45+ new PAM conversation.So I've changed the PAM conversation logic to
46+ include a pam_handle and compare the handle with the current handle
47+ when being prompted. If it's an old handle, we just dismiss the
48+ prompt with an empty string response.Oh, and I fixed the bug that
49+ caused two prompts on startup in the first place. (But we still need
50+ the above logic anyway, for when you switch users quickly.) (LP:
51+ #1350878)
52+
53+ [ Martin Pitt ]
54+ * Mark for using language packs.
55+
56+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 22 Aug 2014 09:29:41 +0000
57+
58+unity8 (8.00+14.10.20140820-0ubuntu1) utopic; urgency=low
59+
60+ [ CI bot ]
61+ * Resync trunk
62+
63+ [ Nick Dedekind ]
64+ * Fixed CachedUnityMenuModel destruction unhinging indicators. (LP:
65+ #1328646)
66+
67+ [ Mirco Müller ]
68+ * Temporarily disable any opacity-animation for notifications to
69+ unblock the train due to LP: 1354406. (LP: #1354406)
70+
71+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 20 Aug 2014 20:03:55 +0000
72+
1unity8 (8.00+14.10.20140817-0ubuntu1) utopic; urgency=low
73unity8 (8.00+14.10.20140817-0ubuntu1) utopic; urgency=low
2
74
3 [ CI bot ]
75 [ CI bot ]
debian/control+2−1
@@ -54,6 +54,7 @@ Homepage: http://launchpad.net/unity
54# and sync up the code again.
54# and sync up the code again.
55Vcs-Bzr: https://code.launchpad.net/unity8
55Vcs-Bzr: https://code.launchpad.net/unity8
56Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
56Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
57+X-Ubuntu-Use-Langpack: yes
57
58
58Package: indicators-client
59Package: indicators-client
59Architecture: amd64 armhf i386
60Architecture: amd64 armhf i386
@@ -168,7 +169,7 @@ Architecture: any
168Multi-Arch: same
169Multi-Arch: same
169Pre-Depends: ${misc:Pre-Depends},
170Pre-Depends: ${misc:Pre-Depends},
170Depends: accountsservice-ubuntu-schemas,
171Depends: accountsservice-ubuntu-schemas,
171− gsettings-ubuntu-schemas,
172+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
172 libhardware2,
173 libhardware2,
173 libunity-core-6.0-9,
174 libunity-core-6.0-9,
174 pay-service,
175 pay-service,
plugins/LightDM/Greeter.cpp+2
@@ -106,6 +106,7 @@ void Greeter::authenticate(const QString &username)
106 }
106 }
107
107
108 d->m_greeter->authenticate(username);
108 d->m_greeter->authenticate(username);
109+ Q_EMIT isAuthenticatedChanged();
109 Q_EMIT authenticationUserChanged(username);
110 Q_EMIT authenticationUserChanged(username);
110}
111}
111
112
@@ -150,5 +151,6 @@ void Greeter::authenticationCompleteFilter()
150 Q_EMIT promptlessChanged();
151 Q_EMIT promptlessChanged();
151 }
152 }
152
153
154+ Q_EMIT isAuthenticatedChanged();
153 Q_EMIT authenticationComplete();
155 Q_EMIT authenticationComplete();
154}
156}
plugins/LightDM/Greeter.h+2−1
@@ -35,7 +35,7 @@ class Greeter : public QObject
35 Q_OBJECT
35 Q_OBJECT
36
36
37 Q_PROPERTY(bool active READ isActive WRITE setIsActive NOTIFY isActiveChanged)
37 Q_PROPERTY(bool active READ isActive WRITE setIsActive NOTIFY isActiveChanged)
38− Q_PROPERTY(bool authenticated READ isAuthenticated)
38+ Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
39 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
39 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
40 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
40 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
41
41
@@ -59,6 +59,7 @@ Q_SIGNALS:
59 void authenticationComplete();
59 void authenticationComplete();
60 void authenticationUserChanged(const QString &user);
60 void authenticationUserChanged(const QString &user);
61 void isActiveChanged();
61 void isActiveChanged();
62+ void isAuthenticatedChanged();
62 void promptlessChanged();
63 void promptlessChanged();
63 void showGreeter();
64 void showGreeter();
64
65
plugins/Powerd/Powerd.cpp+16
@@ -25,6 +25,18 @@ void autoBrightnessChanged(GSettings *settings, const gchar *key, QDBusInterface
25 unityScreen->asyncCall("userAutobrightnessEnable", QVariant(value));
25 unityScreen->asyncCall("userAutobrightnessEnable", QVariant(value));
26}
26}
27
27
28+void activityTimeoutChanged(GSettings *settings, const gchar *key, QDBusInterface *unityScreen)
29+{
30+ int value = g_settings_get_uint(settings, key);
31+ unityScreen->asyncCall("setInactivityTimeouts", QVariant(value), QVariant(-1));
32+}
33+
34+void dimTimeoutChanged(GSettings *settings, const gchar *key, QDBusInterface *unityScreen)
35+{
36+ int value = g_settings_get_uint(settings, key);
37+ unityScreen->asyncCall("setInactivityTimeouts", QVariant(-1), QVariant(value));
38+}
39+
28Powerd::Powerd(QObject* parent)
40Powerd::Powerd(QObject* parent)
29 : QObject(parent),
41 : QObject(parent),
30 unityScreen(NULL)
42 unityScreen(NULL)
@@ -43,7 +55,11 @@ Powerd::Powerd(QObject* parent)
43
55
44 systemSettings = g_settings_new("com.ubuntu.touch.system");
56 systemSettings = g_settings_new("com.ubuntu.touch.system");
45 g_signal_connect(systemSettings, "changed::auto-brightness", G_CALLBACK(autoBrightnessChanged), unityScreen);
57 g_signal_connect(systemSettings, "changed::auto-brightness", G_CALLBACK(autoBrightnessChanged), unityScreen);
58+ g_signal_connect(systemSettings, "changed::activity-timeout", G_CALLBACK(activityTimeoutChanged), unityScreen);
59+ g_signal_connect(systemSettings, "changed::dim-timeout", G_CALLBACK(dimTimeoutChanged), unityScreen);
46 autoBrightnessChanged(systemSettings, "auto-brightness", unityScreen);
60 autoBrightnessChanged(systemSettings, "auto-brightness", unityScreen);
61+ activityTimeoutChanged(systemSettings, "activity-timeout", unityScreen);
62+ dimTimeoutChanged(systemSettings, "dim-timeout", unityScreen);
47}
63}
48
64
49Powerd::~Powerd()
65Powerd::~Powerd()
plugins/Ubuntu/CMakeLists.txt+1
@@ -1,3 +1,4 @@
1+add_subdirectory(Connectivity)
1add_subdirectory(Gestures)
2add_subdirectory(Gestures)
2add_subdirectory(DownloadDaemonListener)
3add_subdirectory(DownloadDaemonListener)
3add_subdirectory(Payments)
4add_subdirectory(Payments)
plugins/Ubuntu/Connectivity/CMakeLists.txtnew file+10
@@ -0,0 +1,10 @@
1+set(CONNECTIVITY_SOURCES
2+ plugin.cpp
3+ Connectivity.cpp
4+)
5+
6+add_library(Connectivity MODULE ${CONNECTIVITY_SOURCES})
7+
8+qt5_use_modules(Connectivity Qml DBus Core)
9+
10+add_unity8_plugin(Ubuntu.Connectivity 0.1 Ubuntu/Connectivity TARGETS Connectivity)
plugins/Ubuntu/Connectivity/Connectivity.cppnew file+33
@@ -0,0 +1,33 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
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 "Connectivity.h"
18+#include <QDBusConnection>
19+#include <QDBusInterface>
20+#include <QDBusPendingCall>
21+
22+Connectivity::Connectivity(QObject *parent)
23+ : QObject(parent)
24+{
25+}
26+
27+void Connectivity::unlockAllModems()
28+{
29+ QDBusInterface iface("com.ubuntu.connectivity1",
30+ "/com/ubuntu/connectivity1/Private",
31+ "com.ubuntu.connectivity1.Private");
32+ iface.asyncCall("UnlockAllModems");
33+}
plugins/Ubuntu/Connectivity/Connectivity.hnew file+33
@@ -0,0 +1,33 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
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 CONNECTIVITY_H
18+#define CONNECTIVITY_H
19+
20+#include <QObject>
21+
22+class Connectivity : public QObject
23+{
24+ Q_OBJECT
25+ Q_DISABLE_COPY(Connectivity)
26+
27+public:
28+ explicit Connectivity(QObject *parent = 0);
29+
30+ Q_INVOKABLE void unlockAllModems();
31+};
32+
33+#endif // CONNECTIVITY_H
plugins/Ubuntu/Connectivity/Connectivity.qmltypesnew file+17
@@ -0,0 +1,17 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.Connectivity 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "Connectivity"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.Connectivity/Connectivity 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Method { name: "unlockAllModems" }
16+ }
17+}
plugins/Ubuntu/Connectivity/plugin.cppnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
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 "plugin.h"
18+#include "Connectivity.h"
19+
20+#include <QtQml>
21+
22+static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
23+{
24+ Q_UNUSED(engine)
25+ Q_UNUSED(scriptEngine)
26+ return new Connectivity();
27+}
28+
29+void BackendPlugin::registerTypes(const char *uri)
30+{
31+ Q_ASSERT(uri == QLatin1String("Ubuntu.Connectivity"));
32+
33+ qmlRegisterSingletonType<Connectivity>(uri, 0, 1, "Connectivity", service_provider);
34+}
plugins/Ubuntu/Connectivity/plugin.hnew file+31
@@ -0,0 +1,31 @@
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 CONNECTIVITY_PLUGIN_H
18+#define CONNECTIVITY_PLUGIN_H
19+
20+#include <QQmlExtensionPlugin>
21+
22+class BackendPlugin : public QQmlExtensionPlugin
23+{
24+ Q_OBJECT
25+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26+
27+public:
28+ void registerTypes(const char *uri);
29+};
30+
31+#endif // CONNECTIVITY_PLUGIN_H
plugins/Ubuntu/Connectivity/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Ubuntu.Connectivity
2+plugin Connectivity
3+typeinfo Connectivity.qmltypes
plugins/Unity/Indicators/CachedUnityMenuModel.qmldeleted−60
@@ -1,60 +0,0 @@
1−/*
2− * Copyright 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 Lesser 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 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− * Authors:
17− * Nick Dedekind <nick.dedekind@canonical.com>
18− */
19−
20−import QtQuick 2.0
21−import QMenuModel 0.1 as QMenuModel
22−import Unity.Indicators 0.1 as Indicators
23−
24−// Make sure we don't duplicate models.
25−Item {
26− id: cachedModel
27− property string busName: ""
28− property string actionsObjectPath: ""
29− property string menuObjectPath: ""
30−
31− readonly property bool ready: busName!=="" && actionsObjectPath!=="" && menuObjectPath!==""
32−
33− property QtObject model: {
34− if (!ready) {
35− return null;
36− }
37−
38− var component = Indicators.UnityMenuModelCache.model(menuObjectPath);
39− if (!component) {
40− component = modelComponent.createObject(cachedModel);
41− return component;
42− }
43− return component;
44− }
45−
46− Component {
47− id: modelComponent
48−
49− QMenuModel.UnityMenuModel {
50− id: unityModel
51− busName: cachedModel.busName
52− actions: { "indicator": cachedModel.actionsObjectPath }
53− menuObjectPath: cachedModel.menuObjectPath
54−
55− Component.onCompleted: {
56− Indicators.UnityMenuModelCache.registerModel(cachedModel.menuObjectPath, unityModel);
57− }
58− }
59− }
60−}
plugins/Unity/Indicators/qmldir−3
@@ -1,6 +1,3 @@
1module Unity.Indicators
1module Unity.Indicators
2plugin IndicatorsQml
2plugin IndicatorsQml
3typeinfo Indicators.qmltypes
3typeinfo Indicators.qmltypes
4−
5−CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
6−IndicatorBase 0.1 IndicatorBase.qml
plugins/Unity/Indicators/unitymenumodelcache.cpp+22−7
@@ -29,14 +29,29 @@ UnityMenuModelCache::~UnityMenuModelCache()
29{
29{
30}
30}
31
31
32−
33−UnityMenuModel* UnityMenuModelCache::model(const QString& path) const
32+UnityMenuModel* UnityMenuModelCache::model(const QByteArray& bus,
33+ const QByteArray& path,
34+ const QVariantMap& actions)
34{
35{
35− return m_menuModels.value(path, NULL);
36+ if (m_registry.contains(path))
37+ return m_registry[path];
38+
39+ UnityMenuModel* menuModel = new UnityMenuModel;
40+ connect(menuModel, &QObject::destroyed, this, [menuModel, this](QObject*) {
41+ QList<QByteArray> keys = m_registry.keys(menuModel);
42+ Q_FOREACH(const QByteArray& key, keys) {
43+ m_registry.remove(key);
44+ }
45+ });
46+ m_registry[path] = menuModel;
47+
48+ menuModel->setBusName(bus);
49+ menuModel->setMenuObjectPath(path);
50+ menuModel->setActions(actions);
51+ return menuModel;
36}
52}
37
53
38−void UnityMenuModelCache::registerModel(const QString& path, UnityMenuModel* menuModel)
54+bool UnityMenuModelCache::contains(const QByteArray& path)
39{
55{
40− menuModel->setParent(this);
56+ return m_registry.contains(path);
41− m_menuModels[path] = menuModel;
42−}
57+}
plugins/Unity/Indicators/unitymenumodelcache.h+5−3
@@ -34,11 +34,13 @@ public:
34 UnityMenuModelCache(QObject*parent=NULL);
34 UnityMenuModelCache(QObject*parent=NULL);
35 ~UnityMenuModelCache();
35 ~UnityMenuModelCache();
36
36
37− Q_INVOKABLE UnityMenuModel* model(const QString& path) const;
37+ Q_INVOKABLE UnityMenuModel* model(const QByteArray& bus,
38− Q_INVOKABLE void registerModel(const QString& path, UnityMenuModel* menuModel);
38+ const QByteArray& path,
39+ const QVariantMap& actions);
40+ Q_INVOKABLE bool contains(const QByteArray& path);
39
41
40private:
42private:
41− QHash<QString, UnityMenuModel*> m_menuModels;
43+ QHash<QByteArray, UnityMenuModel*> m_registry;
42};
44};
43
45
44#endif // UNITYMENUMODELCACHE_H
46#endif // UNITYMENUMODELCACHE_H
po/de.po+20−16
@@ -8,14 +8,14 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-17 21:46+0000\n"
11+"PO-Revision-Date: 2014-08-21 16:18+0000\n"
12−"Last-Translator: Phillip Sz <Unknown>\n"
12+"Last-Translator: Martin Pitt <martin.pitt@ubuntu.com>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@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−"X-Launchpad-Export-Date: 2014-08-18 07:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-22 07:39+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
18+"X-Generator: Launchpad (build 17163)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
@@ -32,7 +32,7 @@ msgstr "Verknüpfung entfernen"
32
32
33#: qml/Components/Dialogs.qml:142
33#: qml/Components/Dialogs.qml:142
34msgid "Are you sure you would like to turn power off?"
34msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Sind Sie sicher dass das Telefon ausgeschaltet werden soll?"
36
36
37#: qml/Components/Dialogs.qml:144
37#: qml/Components/Dialogs.qml:144
38msgid "Power off"
38msgid "Power off"
@@ -99,7 +99,7 @@ msgstr ""
99
99
100#: qml/Components/Lockscreen.qml:161
100#: qml/Components/Lockscreen.qml:161
101msgid "Too many incorrect attempts"
101msgid "Too many incorrect attempts"
102−msgstr ""
102+msgstr "Zu viele falsche Versuche"
103
103
104#: qml/Components/Lockscreen.qml:163
104#: qml/Components/Lockscreen.qml:163
105msgid "Please wait"
105msgid "Please wait"
@@ -164,7 +164,7 @@ msgstr "Senden"
164
164
165#: qml/Dash/ScopesOverview.qml:201
165#: qml/Dash/ScopesOverview.qml:201
166msgid "Manage Dash"
166msgid "Manage Dash"
167−msgstr ""
167+msgstr "Dash verwalten"
168
168
169#: qml/Dash/ScopesOverview.qml:408
169#: qml/Dash/ScopesOverview.qml:408
170msgid "Done"
170msgid "Done"
@@ -172,7 +172,7 @@ msgstr "Erledigt"
172
172
173#: qml/Dash/ScopesOverview.qml:434
173#: qml/Dash/ScopesOverview.qml:434
174msgid "Store"
174msgid "Store"
175−msgstr ""
175+msgstr "Store"
176
176
177#: qml/Dash/ScopesOverviewTab.qml:36
177#: qml/Dash/ScopesOverviewTab.qml:36
178msgid "Favorites"
178msgid "Favorites"
@@ -248,7 +248,7 @@ msgstr "Fehlgeschlagen, tippen Sie zum Wiederholen"
248
248
249#: qml/Panel/Indicators/ModemInfoItem.qml:105
249#: qml/Panel/Indicators/ModemInfoItem.qml:105
250msgid "Unlock SIM"
250msgid "Unlock SIM"
251−msgstr ""
251+msgstr "SIM-Karte entsprerren"
252
252
253#: qml/Panel/Indicators/RoamingIndication.qml:27
253#: qml/Panel/Indicators/RoamingIndication.qml:27
254msgid "Roaming"
254msgid "Roaming"
@@ -260,42 +260,46 @@ msgstr "Passwort"
260
260
261#: qml/Shell.qml:267
261#: qml/Shell.qml:267
262msgid "passcode"
262msgid "passcode"
263−msgstr ""
263+msgstr "Passwort"
264
264
265#: qml/Shell.qml:269
265#: qml/Shell.qml:269
266#, qt-format
266#, qt-format
267msgid "Enter your %1"
267msgid "Enter your %1"
268−msgstr ""
268+msgstr "%1 eingeben"
269
269
270#: qml/Shell.qml:270
270#: qml/Shell.qml:270
271#, qt-format
271#, qt-format
272msgid "Incorrect %1"
272msgid "Incorrect %1"
273−msgstr ""
273+msgstr "%1 falsch"
274
274
275#: qml/Shell.qml:272
275#: qml/Shell.qml:272
276msgid "Please re-enter"
276msgid "Please re-enter"
277−msgstr ""
277+msgstr "Bitte neu eingeben"
278
278
279#: qml/Shell.qml:306
279#: qml/Shell.qml:306
280msgid "Sorry, incorrect passphrase."
280msgid "Sorry, incorrect passphrase."
281−msgstr ""
281+msgstr "Falsches Passwort."
282
282
283#: qml/Shell.qml:307
283#: qml/Shell.qml:307
284msgid "Sorry, incorrect passcode."
284msgid "Sorry, incorrect passcode."
285−msgstr ""
285+msgstr "Falsche PIN"
286
286
287#: qml/Shell.qml:308
287#: qml/Shell.qml:308
288msgid "This will be your last attempt."
288msgid "This will be your last attempt."
289−msgstr ""
289+msgstr "Dies ist Ihr letzter Versuch."
290
290
291#: qml/Shell.qml:310
291#: qml/Shell.qml:310
292msgid ""
292msgid ""
293"If passphrase is entered incorrectly, your phone will conduct a factory "
293"If passphrase is entered incorrectly, your phone will conduct a factory "
294"reset and all personal data will be deleted."
294"reset and all personal data will be deleted."
295msgstr ""
295msgstr ""
296+"Wird das Passwort falsch eingegeben, wird das Telefon auf den Werkszustand "
297+"zurückgesetzt und alle Daten werden gelöscht."
296
298
297#: qml/Shell.qml:311
299#: qml/Shell.qml:311
298msgid ""
300msgid ""
299"If passcode is entered incorrectly, your phone will conduct a factory reset "
301"If passcode is entered incorrectly, your phone will conduct a factory reset "
300"and all personal data will be deleted."
302"and all personal data will be deleted."
301msgstr ""
303msgstr ""
304+"Wird die PIN falsch eingegeben, wird das Telefon auf den Werkszustand "
305+"zurückgesetzt und alle Daten werden gelöscht."
po/el.po+18−18
@@ -8,18 +8,18 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-08 13:03+0000\n"
11+"PO-Revision-Date: 2014-08-21 12:06+0000\n"
12−"Last-Translator: Simos Xenitellis <Unknown>\n"
12+"Last-Translator: Chris Taklis (aka Kailor) <ctaklis@gmail.com>\n"
13"Language-Team: Greek <el@li.org>\n"
13"Language-Team: Greek <el@li.org>\n"
14"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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-22 07:39+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
18+"X-Generator: Launchpad (build 17163)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
22−msgstr ""
22+msgstr "Κωδικός πρόσβασης: "
23
23
24#: plugins/Unity/Launcher/launcheritem.cpp:43
24#: plugins/Unity/Launcher/launcheritem.cpp:43
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -36,15 +36,15 @@ msgstr ""
36
36
37#: qml/Components/Dialogs.qml:144
37#: qml/Components/Dialogs.qml:144
38msgid "Power off"
38msgid "Power off"
39−msgstr ""
39+msgstr "Τερματισμός"
40
40
41#: qml/Components/Dialogs.qml:153
41#: qml/Components/Dialogs.qml:153
42msgid "Restart"
42msgid "Restart"
43−msgstr ""
43+msgstr "Επανεκκίνηση"
44
44
45#: qml/Components/Dialogs.qml:162
45#: qml/Components/Dialogs.qml:162
46msgid "Cancel"
46msgid "Cancel"
47−msgstr ""
47+msgstr "Ακύρωση"
48
48
49#: qml/Components/EdgeDemoOverlay.qml:151
49#: qml/Components/EdgeDemoOverlay.qml:151
50msgid "Skip intro"
50msgid "Skip intro"
@@ -98,11 +98,11 @@ msgstr ""
98
98
99#: qml/Components/Lockscreen.qml:161
99#: qml/Components/Lockscreen.qml:161
100msgid "Too many incorrect attempts"
100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "Πολλές άκυρες προσπάθειες"
102
102
103#: qml/Components/Lockscreen.qml:163
103#: qml/Components/Lockscreen.qml:163
104msgid "Please wait"
104msgid "Please wait"
105−msgstr ""
105+msgstr "Παρακαλώ περιμένετε"
106
106
107#: qml/Components/Lockscreen.qml:245
107#: qml/Components/Lockscreen.qml:245
108msgid "Emergency Call"
108msgid "Emergency Call"
@@ -167,19 +167,19 @@ msgstr ""
167
167
168#: qml/Dash/ScopesOverview.qml:408
168#: qml/Dash/ScopesOverview.qml:408
169msgid "Done"
169msgid "Done"
170−msgstr ""
170+msgstr "Ολοκληρώθηκε"
171
171
172#: qml/Dash/ScopesOverview.qml:434
172#: qml/Dash/ScopesOverview.qml:434
173msgid "Store"
173msgid "Store"
174−msgstr ""
174+msgstr "Κατάστημα"
175
175
176#: qml/Dash/ScopesOverviewTab.qml:36
176#: qml/Dash/ScopesOverviewTab.qml:36
177msgid "Favorites"
177msgid "Favorites"
178−msgstr ""
178+msgstr "Αγαπημένα"
179
179
180#: qml/Dash/ScopesOverviewTab.qml:54
180#: qml/Dash/ScopesOverviewTab.qml:54
181msgid "All"
181msgid "All"
182−msgstr ""
182+msgstr "Όλα"
183
183
184#: qml/Greeter/Greeter.qml:157
184#: qml/Greeter/Greeter.qml:157
185msgid "Swipe to unlock"
185msgid "Swipe to unlock"
@@ -247,11 +247,11 @@ msgstr "Αποτυχία, πατήστε για να ξαναπροσπαθήσ
247
247
248#: qml/Panel/Indicators/ModemInfoItem.qml:105
248#: qml/Panel/Indicators/ModemInfoItem.qml:105
249msgid "Unlock SIM"
249msgid "Unlock SIM"
250−msgstr ""
250+msgstr "Ξεκλείδωμα SIM"
251
251
252#: qml/Panel/Indicators/RoamingIndication.qml:27
252#: qml/Panel/Indicators/RoamingIndication.qml:27
253msgid "Roaming"
253msgid "Roaming"
254−msgstr ""
254+msgstr "Περιαγωγή"
255
255
256#: qml/Shell.qml:267
256#: qml/Shell.qml:267
257msgid "passphrase"
257msgid "passphrase"
@@ -264,7 +264,7 @@ msgstr ""
264#: qml/Shell.qml:269
264#: qml/Shell.qml:269
265#, qt-format
265#, qt-format
266msgid "Enter your %1"
266msgid "Enter your %1"
267−msgstr ""
267+msgstr "Εισάγετε το %1"
268
268
269#: qml/Shell.qml:270
269#: qml/Shell.qml:270
270#, qt-format
270#, qt-format
@@ -273,7 +273,7 @@ msgstr ""
273
273
274#: qml/Shell.qml:272
274#: qml/Shell.qml:272
275msgid "Please re-enter"
275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Παρακαλούμε εισάγετε ξανά"
277
277
278#: qml/Shell.qml:306
278#: qml/Shell.qml:306
279msgid "Sorry, incorrect passphrase."
279msgid "Sorry, incorrect passphrase."
po/gl.po+4−4
@@ -8,14 +8,14 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-14 14:23+0000\n"
11+"PO-Revision-Date: 2014-08-21 14:32+0000\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
13"Language-Team: Galician <gl@li.org>\n"
13"Language-Team: Galician <gl@li.org>\n"
14"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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-22 07:39+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
18+"X-Generator: Launchpad (build 17163)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
@@ -163,7 +163,7 @@ msgstr "Enviar"
163
163
164#: qml/Dash/ScopesOverview.qml:201
164#: qml/Dash/ScopesOverview.qml:201
165msgid "Manage Dash"
165msgid "Manage Dash"
166−msgstr "Xestionar o Panel"
166+msgstr "Xestión do Panel"
167
167
168#: qml/Dash/ScopesOverview.qml:408
168#: qml/Dash/ScopesOverview.qml:408
169msgid "Done"
169msgid "Done"
po/hu.po+33−29
@@ -8,14 +8,14 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-16 12:36+0000\n"
11+"PO-Revision-Date: 2014-08-19 07:08+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−"X-Launchpad-Export-Date: 2014-08-18 07:20+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-20 06:23+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
18+"X-Generator: Launchpad (build 17163)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
@@ -32,7 +32,7 @@ msgstr "Indító feloldása"
32
32
33#: qml/Components/Dialogs.qml:142
33#: qml/Components/Dialogs.qml:142
34msgid "Are you sure you would like to turn power off?"
34msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Biztos benne, hogy ki szeretné kapcsolni?"
36
36
37#: qml/Components/Dialogs.qml:144
37#: qml/Components/Dialogs.qml:144
38msgid "Power off"
38msgid "Power off"
@@ -44,7 +44,7 @@ msgstr "Újraindítás"
44
44
45#: qml/Components/Dialogs.qml:162
45#: qml/Components/Dialogs.qml:162
46msgid "Cancel"
46msgid "Cancel"
47−msgstr ""
47+msgstr "Mégse"
48
48
49#: qml/Components/EdgeDemoOverlay.qml:151
49#: qml/Components/EdgeDemoOverlay.qml:151
50msgid "Skip intro"
50msgid "Skip intro"
@@ -98,46 +98,46 @@ msgstr ""
98
98
99#: qml/Components/Lockscreen.qml:161
99#: qml/Components/Lockscreen.qml:161
100msgid "Too many incorrect attempts"
100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "Túl sok sikertelen kísérlet"
102
102
103#: qml/Components/Lockscreen.qml:163
103#: qml/Components/Lockscreen.qml:163
104msgid "Please wait"
104msgid "Please wait"
105msgstr "Kérem várjon"
105msgstr "Kérem várjon"
106
106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108msgid "Emergency Call"
108msgid "Emergency Call"
109msgstr "Vészhívás"
109msgstr "Vészhívás"
110
110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112msgid "OK"
112msgid "OK"
113msgstr "Ok"
113msgstr "Ok"
114
114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116#, qt-format
116#, qt-format
117msgid "Hello %1"
117msgid "Hello %1"
118msgstr "Üdv %1"
118msgstr "Üdv %1"
119
119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121msgid "Hello"
121msgid "Hello"
122msgstr "Üdvözöljük"
122msgstr "Üdvözöljük"
123
123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125msgid "CANCEL"
125msgid "CANCEL"
126msgstr "MÉGSE"
126msgstr "MÉGSE"
127
127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129msgid "DONE"
129msgid "DONE"
130msgstr "KÉSZ"
130msgstr "KÉSZ"
131
131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133msgid "See less"
133msgid "See less"
134msgstr "Kevesebb"
134msgstr "Kevesebb"
135
135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137msgid "See all"
137msgid "See all"
138msgstr "Összes megtekintése"
138msgstr "Összes megtekintése"
139
139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141msgid "Search"
141msgid "Search"
142msgstr "Keresés"
142msgstr "Keresés"
143
143
@@ -161,17 +161,17 @@ msgstr "Értékelés hozzáadása"
161msgid "Send"
161msgid "Send"
162msgstr "Küldés"
162msgstr "Küldés"
163
163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165msgid "Manage Dash"
165msgid "Manage Dash"
166−msgstr ""
166+msgstr "Dash kezelése"
167
167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169msgid "Done"
169msgid "Done"
170−msgstr ""
170+msgstr "Kész"
171
171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173msgid "Store"
173msgid "Store"
174−msgstr ""
174+msgstr "Áruház"
175
175
176#: qml/Dash/ScopesOverviewTab.qml:36
176#: qml/Dash/ScopesOverviewTab.qml:36
177msgid "Favorites"
177msgid "Favorites"
@@ -255,46 +255,50 @@ msgstr "Barangolás"
255
255
256#: qml/Shell.qml:267
256#: qml/Shell.qml:267
257msgid "passphrase"
257msgid "passphrase"
258−msgstr ""
258+msgstr "jelmondat"
259
259
260#: qml/Shell.qml:267
260#: qml/Shell.qml:267
261msgid "passcode"
261msgid "passcode"
262−msgstr ""
262+msgstr "jelkód"
263
263
264#: qml/Shell.qml:269
264#: qml/Shell.qml:269
265#, qt-format
265#, qt-format
266msgid "Enter your %1"
266msgid "Enter your %1"
267−msgstr ""
267+msgstr "Adja meg a következőt: %1"
268
268
269#: qml/Shell.qml:270
269#: qml/Shell.qml:270
270#, qt-format
270#, qt-format
271msgid "Incorrect %1"
271msgid "Incorrect %1"
272−msgstr ""
272+msgstr "Helytelen %1"
273
273
274#: qml/Shell.qml:272
274#: qml/Shell.qml:272
275msgid "Please re-enter"
275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Kérjük adja meg újra"
277
277
278#: qml/Shell.qml:306
278#: qml/Shell.qml:306
279msgid "Sorry, incorrect passphrase."
279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "Sajnáljuk, helytelen jelmondat."
281
281
282#: qml/Shell.qml:307
282#: qml/Shell.qml:307
283msgid "Sorry, incorrect passcode."
283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "Sajnáljuk, helytelen jelkód."
285
285
286#: qml/Shell.qml:308
286#: qml/Shell.qml:308
287msgid "This will be your last attempt."
287msgid "This will be your last attempt."
288−msgstr ""
288+msgstr "Ez az utolsó próbálkozási lehetősége."
289
289
290#: qml/Shell.qml:310
290#: qml/Shell.qml:310
291msgid ""
291msgid ""
292"If passphrase is entered incorrectly, your phone will conduct a factory "
292"If passphrase is entered incorrectly, your phone will conduct a factory "
293"reset and all personal data will be deleted."
293"reset and all personal data will be deleted."
294msgstr ""
294msgstr ""
295+"Ha helytelen jelmondatot ad meg, a telefonja visszaállítja a gyári "
296+"beállításokat és törli minden személyes adatát."
295
297
296#: qml/Shell.qml:311
298#: qml/Shell.qml:311
297msgid ""
299msgid ""
298"If passcode is entered incorrectly, your phone will conduct a factory reset "
300"If passcode is entered incorrectly, your phone will conduct a factory reset "
299"and all personal data will be deleted."
301"and all personal data will be deleted."
300msgstr ""
302msgstr ""
303+"Ha helytelen jelkódot ad meg, a telefonja visszaállítja a gyári "
304+"beállításokat és törli minden személyes adatát."
po/ja.po+53−52
@@ -8,43 +8,43 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-12 07:14+0000\n"
11+"PO-Revision-Date: 2014-08-18 15:03+0000\n"
12−"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\n"
12+"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
13"Language-Team: Japanese <ja@li.org>\n"
13"Language-Team: Japanese <ja@li.org>\n"
14"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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-19 06:59+0000\n"
18"X-Generator: Launchpad (build 17156)\n"
18"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
22−msgstr ""
22+msgstr "パスワード: "
23
23
24#: plugins/Unity/Launcher/launcheritem.cpp:43
24#: plugins/Unity/Launcher/launcheritem.cpp:43
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Pin shortcut"
26msgid "Pin shortcut"
27−msgstr ""
27+msgstr "ショートカットを追加する"
28
28
29#: plugins/Unity/Launcher/launcheritem.cpp:73
29#: plugins/Unity/Launcher/launcheritem.cpp:73
30msgid "Unpin shortcut"
30msgid "Unpin shortcut"
31−msgstr ""
31+msgstr "ショートカットを削除する"
32
32
33#: qml/Components/Dialogs.qml:142
33#: qml/Components/Dialogs.qml:142
34msgid "Are you sure you would like to turn power off?"
34msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "本当に電源を切りますか?"
36
36
37#: qml/Components/Dialogs.qml:144
37#: qml/Components/Dialogs.qml:144
38msgid "Power off"
38msgid "Power off"
39−msgstr ""
39+msgstr "電源を切る"
40
40
41#: qml/Components/Dialogs.qml:153
41#: qml/Components/Dialogs.qml:153
42msgid "Restart"
42msgid "Restart"
43−msgstr ""
43+msgstr "再起動"
44
44
45#: qml/Components/Dialogs.qml:162
45#: qml/Components/Dialogs.qml:162
46msgid "Cancel"
46msgid "Cancel"
47−msgstr ""
47+msgstr "キャンセル"
48
48
49#: qml/Components/EdgeDemoOverlay.qml:151
49#: qml/Components/EdgeDemoOverlay.qml:151
50msgid "Skip intro"
50msgid "Skip intro"
@@ -56,7 +56,7 @@ msgstr "右端"
56
56
57#: qml/Components/EdgeDemo.qml:113
57#: qml/Components/EdgeDemo.qml:113
58msgid "Try swiping from the right edge to unlock the phone"
58msgid "Try swiping from the right edge to unlock the phone"
59−msgstr ""
59+msgstr "アンロックするには右端からスワイプしてみてください"
60
60
61#: qml/Components/EdgeDemo.qml:144
61#: qml/Components/EdgeDemo.qml:144
62msgid "Top edge"
62msgid "Top edge"
@@ -91,63 +91,64 @@ msgid ""
91"You have now mastered the edge gestures and can start using the "
91"You have now mastered the edge gestures and can start using the "
92"phone<br><br>Tap on the screen to start"
92"phone<br><br>Tap on the screen to start"
93msgstr ""
93msgstr ""
94+"これでスマートフォンの操作に必要な、画面端を用いたジェスチャーを習得できました。<br><br>利用を開始するなら画面をタップしてください"
94
95
95#: qml/Components/Lockscreen.qml:161
96#: qml/Components/Lockscreen.qml:161
96msgid "Too many incorrect attempts"
97msgid "Too many incorrect attempts"
97−msgstr ""
98+msgstr "失敗回数が上限に達しました"
98
99
99#: qml/Components/Lockscreen.qml:163
100#: qml/Components/Lockscreen.qml:163
100msgid "Please wait"
101msgid "Please wait"
101−msgstr ""
102+msgstr "お待ちください"
102
103
103−#: qml/Components/Lockscreen.qml:245
104+#: qml/Components/Lockscreen.qml:220
104msgid "Emergency Call"
105msgid "Emergency Call"
105msgstr "緊急通報"
106msgstr "緊急通報"
106
107
107−#: qml/Components/Lockscreen.qml:268
108+#: qml/Components/Lockscreen.qml:243
108msgid "OK"
109msgid "OK"
109msgstr "OK"
110msgstr "OK"
110
111
111−#: qml/Components/PassphraseLockscreen.qml:61
112+#: qml/Components/PassphraseLockscreen.qml:62
112#, qt-format
113#, qt-format
113msgid "Hello %1"
114msgid "Hello %1"
114msgstr "こんにちは %1 さん"
115msgstr "こんにちは %1 さん"
115
116
116−#: qml/Components/PassphraseLockscreen.qml:61
117+#: qml/Components/PassphraseLockscreen.qml:62
117msgid "Hello"
118msgid "Hello"
118msgstr "こんにちは"
119msgstr "こんにちは"
119
120
120−#: qml/Components/PinLockscreen.qml:197
121+#: qml/Components/PinLockscreen.qml:198
121msgid "CANCEL"
122msgid "CANCEL"
122−msgstr ""
123+msgstr "キャンセル"
123
124
124−#: qml/Components/PinLockscreen.qml:215
125+#: qml/Components/PinLockscreen.qml:216
125msgid "DONE"
126msgid "DONE"
126−msgstr ""
127+msgstr "完了"
127
128
128−#: qml/Dash/GenericScopeView.qml:360
129+#: qml/Dash/GenericScopeView.qml:358
129msgid "See less"
130msgid "See less"
130msgstr ""
131msgstr ""
131
132
132−#: qml/Dash/GenericScopeView.qml:360
133+#: qml/Dash/GenericScopeView.qml:358
133msgid "See all"
134msgid "See all"
134−msgstr ""
135+msgstr "すべて表示する"
135
136
136−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
137+#: qml/Panel/SearchIndicator.qml:27
137msgid "Search"
138msgid "Search"
138msgstr "検索"
139msgstr "検索"
139
140
140#: qml/Dash/Previews/PreviewActionCombo.qml:34
141#: qml/Dash/Previews/PreviewActionCombo.qml:34
141msgid "More..."
142msgid "More..."
142−msgstr ""
143+msgstr "さらに ..."
143
144
144#: qml/Dash/Previews/PreviewActionCombo.qml:34
145#: qml/Dash/Previews/PreviewActionCombo.qml:34
145msgid "Less..."
146msgid "Less..."
146−msgstr ""
147+msgstr "隠す..."
147
148
148#: qml/Dash/Previews/PreviewRatingInput.qml:81
149#: qml/Dash/Previews/PreviewRatingInput.qml:81
149msgid "Rate this"
150msgid "Rate this"
150−msgstr ""
151+msgstr "評価する"
151
152
152#: qml/Dash/Previews/PreviewRatingInput.qml:126
153#: qml/Dash/Previews/PreviewRatingInput.qml:126
153msgid "Add a review"
154msgid "Add a review"
@@ -157,21 +158,21 @@ msgstr "レビューを追加"
157msgid "Send"
158msgid "Send"
158msgstr "送信"
159msgstr "送信"
159
160
160−#: qml/Dash/ScopesOverview.qml:201
161+#: qml/Dash/ScopesOverview.qml:200
161msgid "Manage Dash"
162msgid "Manage Dash"
162−msgstr ""
163+msgstr "Dashの管理"
163
164
164−#: qml/Dash/ScopesOverview.qml:408
165+#: qml/Dash/ScopesOverview.qml:405
165msgid "Done"
166msgid "Done"
166−msgstr ""
167+msgstr "完了"
167
168
168−#: qml/Dash/ScopesOverview.qml:434
169+#: qml/Dash/ScopesOverview.qml:431
169msgid "Store"
170msgid "Store"
170−msgstr ""
171+msgstr "保存"
171
172
172#: qml/Dash/ScopesOverviewTab.qml:36
173#: qml/Dash/ScopesOverviewTab.qml:36
173msgid "Favorites"
174msgid "Favorites"
174−msgstr ""
175+msgstr "お気に入り"
175
176
176#: qml/Dash/ScopesOverviewTab.qml:54
177#: qml/Dash/ScopesOverviewTab.qml:54
177msgid "All"
178msgid "All"
@@ -179,7 +180,7 @@ msgstr "すべて"
179
180
180#: qml/Greeter/Greeter.qml:157
181#: qml/Greeter/Greeter.qml:157
181msgid "Swipe to unlock"
182msgid "Swipe to unlock"
182−msgstr ""
183+msgstr "スワイプしてロック解除"
183
184
184#: qml/Hud/HudParametrizedActionsPage.qml:132
185#: qml/Hud/HudParametrizedActionsPage.qml:132
185msgid "Confirm"
186msgid "Confirm"
@@ -187,7 +188,7 @@ msgstr "確認"
187
188
188#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
189#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
189msgid "Type or say a command"
190msgid "Type or say a command"
190−msgstr ""
191+msgstr "コマンドを音声かキーボードから入力"
191
192
192#: qml/Hud/Hud.qml:84
193#: qml/Hud/Hud.qml:84
193msgid "Loading. Please Wait..."
194msgid "Loading. Please Wait..."
@@ -207,11 +208,11 @@ msgstr "パスワードを表示"
207
208
208#: qml/Notifications/NotificationMenuItemFactory.qml:115
209#: qml/Notifications/NotificationMenuItemFactory.qml:115
209msgid "Please enter SIM PIN"
210msgid "Please enter SIM PIN"
210−msgstr ""
211+msgstr "SIM PINを入力してください"
211
212
212#: qml/Panel/ActiveCallHint.qml:77
213#: qml/Panel/ActiveCallHint.qml:77
213msgid "Tap to return to call..."
214msgid "Tap to return to call..."
214−msgstr ""
215+msgstr "タップすると通話に戻ります..."
215
216
216#: qml/Panel/ActiveCallHint.qml:90
217#: qml/Panel/ActiveCallHint.qml:90
217msgid "Conference"
218msgid "Conference"
@@ -223,11 +224,11 @@ msgstr ""
223
224
224#: qml/Panel/Indicators/MenuItemFactory.qml:655
225#: qml/Panel/Indicators/MenuItemFactory.qml:655
225msgid "Downloading"
226msgid "Downloading"
226−msgstr ""
227+msgstr "ダウンロード中"
227
228
228#: qml/Panel/Indicators/MenuItemFactory.qml:657
229#: qml/Panel/Indicators/MenuItemFactory.qml:657
229msgid "Paused, tap to resume"
230msgid "Paused, tap to resume"
230−msgstr ""
231+msgstr "停止中、再開するにはタップしてください"
231
232
232#: qml/Panel/Indicators/MenuItemFactory.qml:659
233#: qml/Panel/Indicators/MenuItemFactory.qml:659
233msgid "Canceled"
234msgid "Canceled"
@@ -239,49 +240,49 @@ msgstr ""
239
240
240#: qml/Panel/Indicators/MenuItemFactory.qml:663
241#: qml/Panel/Indicators/MenuItemFactory.qml:663
241msgid "Failed, tap to retry"
242msgid "Failed, tap to retry"
242−msgstr ""
243+msgstr "失敗しました、再試行するにはタップしてください"
243
244
244#: qml/Panel/Indicators/ModemInfoItem.qml:105
245#: qml/Panel/Indicators/ModemInfoItem.qml:105
245msgid "Unlock SIM"
246msgid "Unlock SIM"
246−msgstr ""
247+msgstr "SIMのアンロック"
247
248
248#: qml/Panel/Indicators/RoamingIndication.qml:27
249#: qml/Panel/Indicators/RoamingIndication.qml:27
249msgid "Roaming"
250msgid "Roaming"
250−msgstr ""
251+msgstr "ローミング"
251
252
252#: qml/Shell.qml:267
253#: qml/Shell.qml:267
253msgid "passphrase"
254msgid "passphrase"
254−msgstr ""
255+msgstr "パスフレーズ"
255
256
256#: qml/Shell.qml:267
257#: qml/Shell.qml:267
257msgid "passcode"
258msgid "passcode"
258−msgstr ""
259+msgstr "パスコード"
259
260
260#: qml/Shell.qml:269
261#: qml/Shell.qml:269
261#, qt-format
262#, qt-format
262msgid "Enter your %1"
263msgid "Enter your %1"
263−msgstr ""
264+msgstr "%1を入力してください"
264
265
265#: qml/Shell.qml:270
266#: qml/Shell.qml:270
266#, qt-format
267#, qt-format
267msgid "Incorrect %1"
268msgid "Incorrect %1"
268−msgstr ""
269+msgstr "%1が間違っています"
269
270
270#: qml/Shell.qml:272
271#: qml/Shell.qml:272
271msgid "Please re-enter"
272msgid "Please re-enter"
272−msgstr ""
273+msgstr "再入力してください"
273
274
274#: qml/Shell.qml:306
275#: qml/Shell.qml:306
275msgid "Sorry, incorrect passphrase."
276msgid "Sorry, incorrect passphrase."
276−msgstr ""
277+msgstr "パスフレーズが間違っています。"
277
278
278#: qml/Shell.qml:307
279#: qml/Shell.qml:307
279msgid "Sorry, incorrect passcode."
280msgid "Sorry, incorrect passcode."
280−msgstr ""
281+msgstr "パスコードが間違っています。"
281
282
282#: qml/Shell.qml:308
283#: qml/Shell.qml:308
283msgid "This will be your last attempt."
284msgid "This will be your last attempt."
284−msgstr ""
285+msgstr "これが最後のチャンスです。"
285
286
286#: qml/Shell.qml:310
287#: qml/Shell.qml:310
287msgid ""
288msgid ""
po/km.po+32−26
@@ -8,18 +8,18 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-13 04:57+0000\n"
11+"PO-Revision-Date: 2014-08-20 02:48+0000\n"
12"Last-Translator: Sok Sophea <sksophea@gmail.com>\n"
12"Last-Translator: Sok Sophea <sksophea@gmail.com>\n"
13"Language-Team: Khmer <km@li.org>\n"
13"Language-Team: Khmer <km@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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-21 06:48+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
18+"X-Generator: Launchpad (build 17163)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
22−msgstr ""
22+msgstr "ពាក្យសម្ងាត់៖ "
23
23
24#: plugins/Unity/Launcher/launcheritem.cpp:43
24#: plugins/Unity/Launcher/launcheritem.cpp:43
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -98,46 +98,46 @@ msgstr ""
98
98
99#: qml/Components/Lockscreen.qml:161
99#: qml/Components/Lockscreen.qml:161
100msgid "Too many incorrect attempts"
100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "បាន​ព្យាយាម​ខុស​ច្រើន​ដង​ពេក"
102
102
103#: qml/Components/Lockscreen.qml:163
103#: qml/Components/Lockscreen.qml:163
104msgid "Please wait"
104msgid "Please wait"
105−msgstr ""
105+msgstr "សូមរង់ចាំ"
106
106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108msgid "Emergency Call"
108msgid "Emergency Call"
109msgstr "ការ​ហៅ​ពេល​អាសន្ន"
109msgstr "ការ​ហៅ​ពេល​អាសន្ន"
110
110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112msgid "OK"
112msgid "OK"
113msgstr "យល់ព្រម"
113msgstr "យល់ព្រម"
114
114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116#, qt-format
116#, qt-format
117msgid "Hello %1"
117msgid "Hello %1"
118msgstr "សួស្ដី %1"
118msgstr "សួស្ដី %1"
119
119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121msgid "Hello"
121msgid "Hello"
122msgstr "សួស្តី"
122msgstr "សួស្តី"
123
123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125msgid "CANCEL"
125msgid "CANCEL"
126msgstr "បោះបង់"
126msgstr "បោះបង់"
127
127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129msgid "DONE"
129msgid "DONE"
130msgstr "រួចរាល់"
130msgstr "រួចរាល់"
131
131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133msgid "See less"
133msgid "See less"
134msgstr "មើល​តិច​ជាង"
134msgstr "មើល​តិច​ជាង"
135
135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137msgid "See all"
137msgid "See all"
138msgstr "មើល​ទាំងអស់"
138msgstr "មើល​ទាំងអស់"
139
139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141msgid "Search"
141msgid "Search"
142msgstr "ស្វែង​រក"
142msgstr "ស្វែង​រក"
143
143
@@ -161,15 +161,15 @@ msgstr "បន្ថែម​ការ​ពិនិត្យ"
161msgid "Send"
161msgid "Send"
162msgstr "ផ្ញើ"
162msgstr "ផ្ញើ"
163
163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165msgid "Manage Dash"
165msgid "Manage Dash"
166msgstr "គ្រប់គ្រង​ផ្ទាំង"
166msgstr "គ្រប់គ្រង​ផ្ទាំង"
167
167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169msgid "Done"
169msgid "Done"
170msgstr "ធ្វើរួច"
170msgstr "ធ្វើរួច"
171
171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173msgid "Store"
173msgid "Store"
174msgstr "រក្សាទុក"
174msgstr "រក្សាទុក"
175
175
@@ -255,46 +255,52 @@ msgstr "រ៉ូមីង"
255
255
256#: qml/Shell.qml:267
256#: qml/Shell.qml:267
257msgid "passphrase"
257msgid "passphrase"
258−msgstr ""
258+msgstr "ឃ្លា​សម្ងាត់"
259
259
260#: qml/Shell.qml:267
260#: qml/Shell.qml:267
261msgid "passcode"
261msgid "passcode"
262−msgstr ""
262+msgstr "កូដ​សម្ងាត់"
263
263
264#: qml/Shell.qml:269
264#: qml/Shell.qml:269
265#, qt-format
265#, qt-format
266msgid "Enter your %1"
266msgid "Enter your %1"
267−msgstr ""
267+msgstr "បញ្ចូល %1 របស់​អ្នក"
268
268
269#: qml/Shell.qml:270
269#: qml/Shell.qml:270
270#, qt-format
270#, qt-format
271msgid "Incorrect %1"
271msgid "Incorrect %1"
272−msgstr ""
272+msgstr "មិន​ត្រឹមត្រូវ %1"
273
273
274#: qml/Shell.qml:272
274#: qml/Shell.qml:272
275msgid "Please re-enter"
275msgid "Please re-enter"
276−msgstr ""
276+msgstr "សូម​បញ្ចូល​ឡើងវិញ"
277
277
278#: qml/Shell.qml:306
278#: qml/Shell.qml:306
279msgid "Sorry, incorrect passphrase."
279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "សូមទោស! ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
281
281
282#: qml/Shell.qml:307
282#: qml/Shell.qml:307
283msgid "Sorry, incorrect passcode."
283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "សូមទោស! កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ។"
285
285
286#: qml/Shell.qml:308
286#: qml/Shell.qml:308
287msgid "This will be your last attempt."
287msgid "This will be your last attempt."
288−msgstr ""
288+msgstr "នេះ​គឺ​ការ​ព្យាយាម​លើក​ចុងក្រោយ។"
289
289
290#: qml/Shell.qml:310
290#: qml/Shell.qml:310
291msgid ""
291msgid ""
292"If passphrase is entered incorrectly, your phone will conduct a factory "
292"If passphrase is entered incorrectly, your phone will conduct a factory "
293"reset and all personal data will be deleted."
293"reset and all personal data will be deleted."
294msgstr ""
294msgstr ""
295+"បើ​បញ្ចូល​ឃ្លា​សម្ងាត់​មិន​ត្រឹមត្រូវ "
296+"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
297+"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
295
298
296#: qml/Shell.qml:311
299#: qml/Shell.qml:311
297msgid ""
300msgid ""
298"If passcode is entered incorrectly, your phone will conduct a factory reset "
301"If passcode is entered incorrectly, your phone will conduct a factory reset "
299"and all personal data will be deleted."
302"and all personal data will be deleted."
300msgstr ""
303msgstr ""
304+"បើ​បញ្ចូល​កូដ​សម្ងាត់​មិន​ត្រឹមត្រូវ "
305+"ទូរស័ព្ទ​របស់​អ្នក​នឹង​កំណត់​ទៅ​ទិន្នន័យ​ពី​រោងចក្រ​វិញ "
306+"ហើយ​ទិន្នន័យ​ផ្ទាល់ខ្លួន​ទាំងអស់​របស់​អ្នក​នឹង​ត្រូវ​បាន​លុប។"
po/ko.po+42−40
@@ -8,18 +8,18 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-07-17 03:56+0000\n"
11+"PO-Revision-Date: 2014-08-19 13:02+0000\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
13"Language-Team: Korean <ko@li.org>\n"
13"Language-Team: Korean <ko@li.org>\n"
14"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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-20 06:23+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
18+"X-Generator: Launchpad (build 17163)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
22−msgstr ""
22+msgstr "열쇠글: "
23
23
24#: plugins/Unity/Launcher/launcheritem.cpp:43
24#: plugins/Unity/Launcher/launcheritem.cpp:43
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -32,19 +32,19 @@ msgstr "바로가기를 고정 해제하기"
32
32
33#: qml/Components/Dialogs.qml:142
33#: qml/Components/Dialogs.qml:142
34msgid "Are you sure you would like to turn power off?"
34msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "정말로 전원을 끌까요?"
36
36
37#: qml/Components/Dialogs.qml:144
37#: qml/Components/Dialogs.qml:144
38msgid "Power off"
38msgid "Power off"
39−msgstr ""
39+msgstr "전원 끄기"
40
40
41#: qml/Components/Dialogs.qml:153
41#: qml/Components/Dialogs.qml:153
42msgid "Restart"
42msgid "Restart"
43−msgstr ""
43+msgstr "재시작"
44
44
45#: qml/Components/Dialogs.qml:162
45#: qml/Components/Dialogs.qml:162
46msgid "Cancel"
46msgid "Cancel"
47−msgstr ""
47+msgstr "취소"
48
48
49#: qml/Components/EdgeDemoOverlay.qml:151
49#: qml/Components/EdgeDemoOverlay.qml:151
50msgid "Skip intro"
50msgid "Skip intro"
@@ -96,46 +96,46 @@ msgstr ""
96
96
97#: qml/Components/Lockscreen.qml:161
97#: qml/Components/Lockscreen.qml:161
98msgid "Too many incorrect attempts"
98msgid "Too many incorrect attempts"
99−msgstr ""
99+msgstr "너무 많이 틀리셨습니다"
100
100
101#: qml/Components/Lockscreen.qml:163
101#: qml/Components/Lockscreen.qml:163
102msgid "Please wait"
102msgid "Please wait"
103−msgstr ""
103+msgstr "기다려주십시오"
104
104
105−#: qml/Components/Lockscreen.qml:245
105+#: qml/Components/Lockscreen.qml:220
106msgid "Emergency Call"
106msgid "Emergency Call"
107msgstr "긴급 통화"
107msgstr "긴급 통화"
108
108
109−#: qml/Components/Lockscreen.qml:268
109+#: qml/Components/Lockscreen.qml:243
110msgid "OK"
110msgid "OK"
111msgstr "확인"
111msgstr "확인"
112
112
113−#: qml/Components/PassphraseLockscreen.qml:61
113+#: qml/Components/PassphraseLockscreen.qml:62
114#, qt-format
114#, qt-format
115msgid "Hello %1"
115msgid "Hello %1"
116msgstr "안녕하세요 %1"
116msgstr "안녕하세요 %1"
117
117
118−#: qml/Components/PassphraseLockscreen.qml:61
118+#: qml/Components/PassphraseLockscreen.qml:62
119msgid "Hello"
119msgid "Hello"
120msgstr "안녕하세요"
120msgstr "안녕하세요"
121
121
122−#: qml/Components/PinLockscreen.qml:197
122+#: qml/Components/PinLockscreen.qml:198
123msgid "CANCEL"
123msgid "CANCEL"
124msgstr "취소"
124msgstr "취소"
125
125
126−#: qml/Components/PinLockscreen.qml:215
126+#: qml/Components/PinLockscreen.qml:216
127msgid "DONE"
127msgid "DONE"
128msgstr "완료"
128msgstr "완료"
129
129
130−#: qml/Dash/GenericScopeView.qml:360
130+#: qml/Dash/GenericScopeView.qml:358
131msgid "See less"
131msgid "See less"
132msgstr "간단히 표시하기"
132msgstr "간단히 표시하기"
133
133
134−#: qml/Dash/GenericScopeView.qml:360
134+#: qml/Dash/GenericScopeView.qml:358
135msgid "See all"
135msgid "See all"
136−msgstr ""
136+msgstr "모두 보기"
137
137
138−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
138+#: qml/Panel/SearchIndicator.qml:27
139msgid "Search"
139msgid "Search"
140msgstr "검색"
140msgstr "검색"
141
141
@@ -159,25 +159,25 @@ msgstr "평가 제출하기"
159msgid "Send"
159msgid "Send"
160msgstr "보내기"
160msgstr "보내기"
161
161
162−#: qml/Dash/ScopesOverview.qml:201
162+#: qml/Dash/ScopesOverview.qml:200
163msgid "Manage Dash"
163msgid "Manage Dash"
164−msgstr ""
164+msgstr "대시 관리"
165
165
166−#: qml/Dash/ScopesOverview.qml:408
166+#: qml/Dash/ScopesOverview.qml:405
167msgid "Done"
167msgid "Done"
168−msgstr ""
168+msgstr "완료"
169
169
170−#: qml/Dash/ScopesOverview.qml:434
170+#: qml/Dash/ScopesOverview.qml:431
171msgid "Store"
171msgid "Store"
172−msgstr ""
172+msgstr "장터"
173
173
174#: qml/Dash/ScopesOverviewTab.qml:36
174#: qml/Dash/ScopesOverviewTab.qml:36
175msgid "Favorites"
175msgid "Favorites"
176−msgstr ""
176+msgstr "즐겨찾기"
177
177
178#: qml/Dash/ScopesOverviewTab.qml:54
178#: qml/Dash/ScopesOverviewTab.qml:54
179msgid "All"
179msgid "All"
180−msgstr ""
180+msgstr "모두"
181
181
182#: qml/Greeter/Greeter.qml:157
182#: qml/Greeter/Greeter.qml:157
183msgid "Swipe to unlock"
183msgid "Swipe to unlock"
@@ -213,11 +213,11 @@ msgstr "심카드의 PIN 번호를 입력하세요."
213
213
214#: qml/Panel/ActiveCallHint.qml:77
214#: qml/Panel/ActiveCallHint.qml:77
215msgid "Tap to return to call..."
215msgid "Tap to return to call..."
216−msgstr ""
216+msgstr "통화로 돌아가려면 터치하세요..."
217
217
218#: qml/Panel/ActiveCallHint.qml:90
218#: qml/Panel/ActiveCallHint.qml:90
219msgid "Conference"
219msgid "Conference"
220−msgstr ""
220+msgstr "회의"
221
221
222#: qml/Panel/Indicators/MenuItemFactory.qml:651
222#: qml/Panel/Indicators/MenuItemFactory.qml:651
223msgid "In queue…"
223msgid "In queue…"
@@ -245,54 +245,56 @@ msgstr "실패하였습니다. 재시도하려면 누르세요."
245
245
246#: qml/Panel/Indicators/ModemInfoItem.qml:105
246#: qml/Panel/Indicators/ModemInfoItem.qml:105
247msgid "Unlock SIM"
247msgid "Unlock SIM"
248−msgstr ""
248+msgstr "SIM 카드 보안 해제"
249
249
250#: qml/Panel/Indicators/RoamingIndication.qml:27
250#: qml/Panel/Indicators/RoamingIndication.qml:27
251msgid "Roaming"
251msgid "Roaming"
252−msgstr ""
252+msgstr "로밍"
253
253
254#: qml/Shell.qml:267
254#: qml/Shell.qml:267
255msgid "passphrase"
255msgid "passphrase"
256−msgstr ""
256+msgstr "비밀번호"
257
257
258#: qml/Shell.qml:267
258#: qml/Shell.qml:267
259msgid "passcode"
259msgid "passcode"
260−msgstr ""
260+msgstr "비밀번호"
261
261
262#: qml/Shell.qml:269
262#: qml/Shell.qml:269
263#, qt-format
263#, qt-format
264msgid "Enter your %1"
264msgid "Enter your %1"
265−msgstr ""
265+msgstr "%1를 입력하세요"
266
266
267#: qml/Shell.qml:270
267#: qml/Shell.qml:270
268#, qt-format
268#, qt-format
269msgid "Incorrect %1"
269msgid "Incorrect %1"
270−msgstr ""
270+msgstr "잘못된 %1입니다"
271
271
272#: qml/Shell.qml:272
272#: qml/Shell.qml:272
273msgid "Please re-enter"
273msgid "Please re-enter"
274−msgstr ""
274+msgstr "다시 입력하세요"
275
275
276#: qml/Shell.qml:306
276#: qml/Shell.qml:306
277msgid "Sorry, incorrect passphrase."
277msgid "Sorry, incorrect passphrase."
278−msgstr ""
278+msgstr "잘못된 비밀번호입니다."
279
279
280#: qml/Shell.qml:307
280#: qml/Shell.qml:307
281msgid "Sorry, incorrect passcode."
281msgid "Sorry, incorrect passcode."
282−msgstr ""
282+msgstr "잘못된 비밀번호입니다."
283
283
284#: qml/Shell.qml:308
284#: qml/Shell.qml:308
285msgid "This will be your last attempt."
285msgid "This will be your last attempt."
286−msgstr ""
286+msgstr "마지막 시도입니다."
287
287
288#: qml/Shell.qml:310
288#: qml/Shell.qml:310
289msgid ""
289msgid ""
290"If passphrase is entered incorrectly, your phone will conduct a factory "
290"If passphrase is entered incorrectly, your phone will conduct a factory "
291"reset and all personal data will be deleted."
291"reset and all personal data will be deleted."
292msgstr ""
292msgstr ""
293+"만약 이번 시도에서 잘못 입력하면, 보안을 위해 휴대 전화가 공장 초기화 과정을 거쳐 모든 사용자 데이터를 삭제할 것입니다."
293
294
294#: qml/Shell.qml:311
295#: qml/Shell.qml:311
295msgid ""
296msgid ""
296"If passcode is entered incorrectly, your phone will conduct a factory reset "
297"If passcode is entered incorrectly, your phone will conduct a factory reset "
297"and all personal data will be deleted."
298"and all personal data will be deleted."
298msgstr ""
299msgstr ""
300+"만약 이번 시도에서 잘못 입력하면, 보안을 위해 휴대 전화가 공장 초기화 과정을 거쳐 모든 사용자 데이터를 삭제할 것입니다."
po/lv.po+14−14
@@ -8,18 +8,18 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-12 19:07+0000\n"
11+"PO-Revision-Date: 2014-08-21 09:46+0000\n"
12"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
12"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
13"Language-Team: Latvian <lv@li.org>\n"
13"Language-Team: Latvian <lv@li.org>\n"
14"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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-22 07:39+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
18+"X-Generator: Launchpad (build 17163)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
22−msgstr ""
22+msgstr "Parole: "
23
23
24#: plugins/Unity/Launcher/launcheritem.cpp:43
24#: plugins/Unity/Launcher/launcheritem.cpp:43
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -32,7 +32,7 @@ msgstr ""
32
32
33#: qml/Components/Dialogs.qml:142
33#: qml/Components/Dialogs.qml:142
34msgid "Are you sure you would like to turn power off?"
34msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Vai esat drošs ka vēlaties izslēgt?"
36
36
37#: qml/Components/Dialogs.qml:144
37#: qml/Components/Dialogs.qml:144
38msgid "Power off"
38msgid "Power off"
@@ -98,7 +98,7 @@ msgstr ""
98
98
99#: qml/Components/Lockscreen.qml:163
99#: qml/Components/Lockscreen.qml:163
100msgid "Please wait"
100msgid "Please wait"
101−msgstr ""
101+msgstr "Lūdzu, uzgaidiet"
102
102
103#: qml/Components/Lockscreen.qml:245
103#: qml/Components/Lockscreen.qml:245
104msgid "Emergency Call"
104msgid "Emergency Call"
@@ -167,7 +167,7 @@ msgstr "Pabeigts"
167
167
168#: qml/Dash/ScopesOverview.qml:434
168#: qml/Dash/ScopesOverview.qml:434
169msgid "Store"
169msgid "Store"
170−msgstr ""
170+msgstr "Veikals"
171
171
172#: qml/Dash/ScopesOverviewTab.qml:36
172#: qml/Dash/ScopesOverviewTab.qml:36
173msgid "Favorites"
173msgid "Favorites"
@@ -219,7 +219,7 @@ msgstr "Konference"
219
219
220#: qml/Panel/Indicators/MenuItemFactory.qml:651
220#: qml/Panel/Indicators/MenuItemFactory.qml:651
221msgid "In queue…"
221msgid "In queue…"
222−msgstr ""
222+msgstr "Sarakstā..."
223
223
224#: qml/Panel/Indicators/MenuItemFactory.qml:655
224#: qml/Panel/Indicators/MenuItemFactory.qml:655
225msgid "Downloading"
225msgid "Downloading"
@@ -239,7 +239,7 @@ msgstr "Pabeigts"
239
239
240#: qml/Panel/Indicators/MenuItemFactory.qml:663
240#: qml/Panel/Indicators/MenuItemFactory.qml:663
241msgid "Failed, tap to retry"
241msgid "Failed, tap to retry"
242−msgstr ""
242+msgstr "Neizdevās, spiest lai mēģināt vēlreiz"
243
243
244#: qml/Panel/Indicators/ModemInfoItem.qml:105
244#: qml/Panel/Indicators/ModemInfoItem.qml:105
245msgid "Unlock SIM"
245msgid "Unlock SIM"
@@ -247,7 +247,7 @@ msgstr "Atbloķēt SIM"
247
247
248#: qml/Panel/Indicators/RoamingIndication.qml:27
248#: qml/Panel/Indicators/RoamingIndication.qml:27
249msgid "Roaming"
249msgid "Roaming"
250−msgstr ""
250+msgstr "Viesabonēšana"
251
251
252#: qml/Shell.qml:267
252#: qml/Shell.qml:267
253msgid "passphrase"
253msgid "passphrase"
@@ -260,16 +260,16 @@ msgstr ""
260#: qml/Shell.qml:269
260#: qml/Shell.qml:269
261#, qt-format
261#, qt-format
262msgid "Enter your %1"
262msgid "Enter your %1"
263−msgstr ""
263+msgstr "Ievadiet jūsu %1"
264
264
265#: qml/Shell.qml:270
265#: qml/Shell.qml:270
266#, qt-format
266#, qt-format
267msgid "Incorrect %1"
267msgid "Incorrect %1"
268−msgstr ""
268+msgstr "Nepareizs %1"
269
269
270#: qml/Shell.qml:272
270#: qml/Shell.qml:272
271msgid "Please re-enter"
271msgid "Please re-enter"
272−msgstr ""
272+msgstr "Lūdzu ievadiet vēlreiz"
273
273
274#: qml/Shell.qml:306
274#: qml/Shell.qml:306
275msgid "Sorry, incorrect passphrase."
275msgid "Sorry, incorrect passphrase."
@@ -281,7 +281,7 @@ msgstr ""
281
281
282#: qml/Shell.qml:308
282#: qml/Shell.qml:308
283msgid "This will be your last attempt."
283msgid "This will be your last attempt."
284−msgstr ""
284+msgstr "Šīs būs jūs pēdējais mēģinājums."
285
285
286#: qml/Shell.qml:310
286#: qml/Shell.qml:310
287msgid ""
287msgid ""
po/pl.po+20−20
@@ -8,13 +8,13 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-07-31 13:51+0000\n"
11+"PO-Revision-Date: 2014-08-18 20:25+0000\n"
12−"Last-Translator: Michał Radwański <radwanski.michal@outlook.com>\n"
12+"Last-Translator: Paweł Stroka <pawstr@gmail.com>\n"
13"Language-Team: Polish <pl@li.org>\n"
13"Language-Team: Polish <pl@li.org>\n"
14"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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-19 06:59+0000\n"
18"X-Generator: Launchpad (build 17156)\n"
18"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
@@ -104,40 +104,40 @@ msgstr ""
104msgid "Please wait"
104msgid "Please wait"
105msgstr ""
105msgstr ""
106
106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108msgid "Emergency Call"
108msgid "Emergency Call"
109msgstr "Telefon ratunkowy"
109msgstr "Telefon ratunkowy"
110
110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112msgid "OK"
112msgid "OK"
113msgstr "OK"
113msgstr "OK"
114
114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116#, qt-format
116#, qt-format
117msgid "Hello %1"
117msgid "Hello %1"
118msgstr "Witaj %1"
118msgstr "Witaj %1"
119
119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121msgid "Hello"
121msgid "Hello"
122msgstr "Witaj"
122msgstr "Witaj"
123
123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125msgid "CANCEL"
125msgid "CANCEL"
126msgstr "ANULUJ"
126msgstr "ANULUJ"
127
127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129msgid "DONE"
129msgid "DONE"
130msgstr "ZROBIONE"
130msgstr "ZROBIONE"
131
131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133msgid "See less"
133msgid "See less"
134msgstr "Zobacz mniej"
134msgstr "Zobacz mniej"
135
135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137msgid "See all"
137msgid "See all"
138msgstr "Zobacz wszystko"
138msgstr "Zobacz wszystko"
139
139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141msgid "Search"
141msgid "Search"
142msgstr "Szukaj"
142msgstr "Szukaj"
143
143
@@ -161,15 +161,15 @@ msgstr "Dodaj recenzję"
161msgid "Send"
161msgid "Send"
162msgstr "Wyślij"
162msgstr "Wyślij"
163
163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165msgid "Manage Dash"
165msgid "Manage Dash"
166msgstr ""
166msgstr ""
167
167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169msgid "Done"
169msgid "Done"
170msgstr ""
170msgstr ""
171
171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173msgid "Store"
173msgid "Store"
174msgstr ""
174msgstr ""
175
175
@@ -255,11 +255,11 @@ msgstr ""
255
255
256#: qml/Shell.qml:267
256#: qml/Shell.qml:267
257msgid "passphrase"
257msgid "passphrase"
258−msgstr ""
258+msgstr "hasło"
259
259
260#: qml/Shell.qml:267
260#: qml/Shell.qml:267
261msgid "passcode"
261msgid "passcode"
262−msgstr ""
262+msgstr "kod"
263
263
264#: qml/Shell.qml:269
264#: qml/Shell.qml:269
265#, qt-format
265#, qt-format
@@ -273,15 +273,15 @@ msgstr ""
273
273
274#: qml/Shell.qml:272
274#: qml/Shell.qml:272
275msgid "Please re-enter"
275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Proszę wprowadzić ponownie"
277
277
278#: qml/Shell.qml:306
278#: qml/Shell.qml:306
279msgid "Sorry, incorrect passphrase."
279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "Niestety, błędne hasło"
281
281
282#: qml/Shell.qml:307
282#: qml/Shell.qml:307
283msgid "Sorry, incorrect passcode."
283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "Niestety, błędny kod"
285
285
286#: qml/Shell.qml:308
286#: qml/Shell.qml:308
287msgid "This will be your last attempt."
287msgid "This will be your last attempt."
po/pt_BR.po+33−29
@@ -8,18 +8,18 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-13 04:53+0000\n"
11+"PO-Revision-Date: 2014-08-18 14:14+0000\n"
12−"Last-Translator: Tiago Hillebrandt <tiagohillebrandt@gmail.com>\n"
12+"Last-Translator: Rafael Neri <Unknown>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
14"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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-19 06:59+0000\n"
18"X-Generator: Launchpad (build 17156)\n"
18"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
22−msgstr ""
22+msgstr "Senha: "
23
23
24#: plugins/Unity/Launcher/launcheritem.cpp:43
24#: plugins/Unity/Launcher/launcheritem.cpp:43
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -98,46 +98,46 @@ msgstr ""
98
98
99#: qml/Components/Lockscreen.qml:161
99#: qml/Components/Lockscreen.qml:161
100msgid "Too many incorrect attempts"
100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "Muitas tentativas incorretas"
102
102
103#: qml/Components/Lockscreen.qml:163
103#: qml/Components/Lockscreen.qml:163
104msgid "Please wait"
104msgid "Please wait"
105−msgstr ""
105+msgstr "Por favor, aguarde"
106
106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108msgid "Emergency Call"
108msgid "Emergency Call"
109msgstr "Chamada de emergência"
109msgstr "Chamada de emergência"
110
110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112msgid "OK"
112msgid "OK"
113msgstr "OK"
113msgstr "OK"
114
114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116#, qt-format
116#, qt-format
117msgid "Hello %1"
117msgid "Hello %1"
118msgstr "Olá %1"
118msgstr "Olá %1"
119
119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121msgid "Hello"
121msgid "Hello"
122msgstr "Olá"
122msgstr "Olá"
123
123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125msgid "CANCEL"
125msgid "CANCEL"
126msgstr "CANCELAR"
126msgstr "CANCELAR"
127
127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129msgid "DONE"
129msgid "DONE"
130msgstr "FEITO"
130msgstr "FEITO"
131
131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133msgid "See less"
133msgid "See less"
134msgstr "Ver menos"
134msgstr "Ver menos"
135
135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137msgid "See all"
137msgid "See all"
138msgstr "Ver todos"
138msgstr "Ver todos"
139
139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141msgid "Search"
141msgid "Search"
142msgstr "Pesquisar"
142msgstr "Pesquisar"
143
143
@@ -161,15 +161,15 @@ msgstr "Adicionar uma análise"
161msgid "Send"
161msgid "Send"
162msgstr "Enviar"
162msgstr "Enviar"
163
163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165msgid "Manage Dash"
165msgid "Manage Dash"
166−msgstr ""
166+msgstr "Gerencia painel"
167
167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169msgid "Done"
169msgid "Done"
170−msgstr ""
170+msgstr "Concluído"
171
171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173msgid "Store"
173msgid "Store"
174msgstr "Loja"
174msgstr "Loja"
175
175
@@ -179,7 +179,7 @@ msgstr "Favoritos"
179
179
180#: qml/Dash/ScopesOverviewTab.qml:54
180#: qml/Dash/ScopesOverviewTab.qml:54
181msgid "All"
181msgid "All"
182−msgstr ""
182+msgstr "Tudo"
183
183
184#: qml/Greeter/Greeter.qml:157
184#: qml/Greeter/Greeter.qml:157
185msgid "Swipe to unlock"
185msgid "Swipe to unlock"
@@ -255,46 +255,50 @@ msgstr "Roaming"
255
255
256#: qml/Shell.qml:267
256#: qml/Shell.qml:267
257msgid "passphrase"
257msgid "passphrase"
258−msgstr ""
258+msgstr "senha"
259
259
260#: qml/Shell.qml:267
260#: qml/Shell.qml:267
261msgid "passcode"
261msgid "passcode"
262−msgstr ""
262+msgstr "código de acesso"
263
263
264#: qml/Shell.qml:269
264#: qml/Shell.qml:269
265#, qt-format
265#, qt-format
266msgid "Enter your %1"
266msgid "Enter your %1"
267−msgstr ""
267+msgstr "Digite o seu %1"
268
268
269#: qml/Shell.qml:270
269#: qml/Shell.qml:270
270#, qt-format
270#, qt-format
271msgid "Incorrect %1"
271msgid "Incorrect %1"
272−msgstr ""
272+msgstr "%1 incorreto"
273
273
274#: qml/Shell.qml:272
274#: qml/Shell.qml:272
275msgid "Please re-enter"
275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Por favor, digite novamente"
277
277
278#: qml/Shell.qml:306
278#: qml/Shell.qml:306
279msgid "Sorry, incorrect passphrase."
279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "Desculpe, senha incorreta."
281
281
282#: qml/Shell.qml:307
282#: qml/Shell.qml:307
283msgid "Sorry, incorrect passcode."
283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "Desculpe, código de acesso incorreto."
285
285
286#: qml/Shell.qml:308
286#: qml/Shell.qml:308
287msgid "This will be your last attempt."
287msgid "This will be your last attempt."
288−msgstr ""
288+msgstr "Esta será a sua última tentativa."
289
289
290#: qml/Shell.qml:310
290#: qml/Shell.qml:310
291msgid ""
291msgid ""
292"If passphrase is entered incorrectly, your phone will conduct a factory "
292"If passphrase is entered incorrectly, your phone will conduct a factory "
293"reset and all personal data will be deleted."
293"reset and all personal data will be deleted."
294msgstr ""
294msgstr ""
295+"Se a senha for digitada incorretamente, o telefone será restaurado aos "
296+"padrões de fábrica e todos os dados pessoais serão apagados."
295
297
296#: qml/Shell.qml:311
298#: qml/Shell.qml:311
297msgid ""
299msgid ""
298"If passcode is entered incorrectly, your phone will conduct a factory reset "
300"If passcode is entered incorrectly, your phone will conduct a factory reset "
299"and all personal data will be deleted."
301"and all personal data will be deleted."
300msgstr ""
302msgstr ""
303+"Se o código de acesso for digitado incorretamente, o telefone será "
304+"restaurado aos padrões de fábrica e todos os dados pessoais serão apagados."
po/ru.po+39−35
@@ -8,18 +8,18 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-07-31 09:39+0000\n"
11+"PO-Revision-Date: 2014-08-20 12:41+0000\n"
12"Last-Translator: Jay ZDLin <Unknown>\n"
12"Last-Translator: Jay ZDLin <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@li.org>\n"
14"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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-21 06:48+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
18+"X-Generator: Launchpad (build 17163)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
22−msgstr ""
22+msgstr "Пароль: "
23
23
24#: plugins/Unity/Launcher/launcheritem.cpp:43
24#: plugins/Unity/Launcher/launcheritem.cpp:43
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -32,19 +32,19 @@ msgstr "Изъять ярлык"
32
32
33#: qml/Components/Dialogs.qml:142
33#: qml/Components/Dialogs.qml:142
34msgid "Are you sure you would like to turn power off?"
34msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Отключить питание?"
36
36
37#: qml/Components/Dialogs.qml:144
37#: qml/Components/Dialogs.qml:144
38msgid "Power off"
38msgid "Power off"
39−msgstr ""
39+msgstr "Отключить"
40
40
41#: qml/Components/Dialogs.qml:153
41#: qml/Components/Dialogs.qml:153
42msgid "Restart"
42msgid "Restart"
43−msgstr ""
43+msgstr "Перезапустить"
44
44
45#: qml/Components/Dialogs.qml:162
45#: qml/Components/Dialogs.qml:162
46msgid "Cancel"
46msgid "Cancel"
47−msgstr ""
47+msgstr "Отменить"
48
48
49#: qml/Components/EdgeDemoOverlay.qml:151
49#: qml/Components/EdgeDemoOverlay.qml:151
50msgid "Skip intro"
50msgid "Skip intro"
@@ -101,46 +101,46 @@ msgstr ""
101
101
102#: qml/Components/Lockscreen.qml:161
102#: qml/Components/Lockscreen.qml:161
103msgid "Too many incorrect attempts"
103msgid "Too many incorrect attempts"
104−msgstr ""
104+msgstr "Слишком много ошибок ввода"
105
105
106#: qml/Components/Lockscreen.qml:163
106#: qml/Components/Lockscreen.qml:163
107msgid "Please wait"
107msgid "Please wait"
108−msgstr ""
108+msgstr "Подождите"
109
109
110−#: qml/Components/Lockscreen.qml:245
110+#: qml/Components/Lockscreen.qml:220
111msgid "Emergency Call"
111msgid "Emergency Call"
112msgstr "Экстренный вызов"
112msgstr "Экстренный вызов"
113
113
114−#: qml/Components/Lockscreen.qml:268
114+#: qml/Components/Lockscreen.qml:243
115msgid "OK"
115msgid "OK"
116msgstr "ОК"
116msgstr "ОК"
117
117
118−#: qml/Components/PassphraseLockscreen.qml:61
118+#: qml/Components/PassphraseLockscreen.qml:62
119#, qt-format
119#, qt-format
120msgid "Hello %1"
120msgid "Hello %1"
121msgstr "Привет, %1"
121msgstr "Привет, %1"
122
122
123−#: qml/Components/PassphraseLockscreen.qml:61
123+#: qml/Components/PassphraseLockscreen.qml:62
124msgid "Hello"
124msgid "Hello"
125msgstr "Привет"
125msgstr "Привет"
126
126
127−#: qml/Components/PinLockscreen.qml:197
127+#: qml/Components/PinLockscreen.qml:198
128msgid "CANCEL"
128msgid "CANCEL"
129msgstr "ОТМЕНИТЬ"
129msgstr "ОТМЕНИТЬ"
130
130
131−#: qml/Components/PinLockscreen.qml:215
131+#: qml/Components/PinLockscreen.qml:216
132msgid "DONE"
132msgid "DONE"
133msgstr "ГОТОВО"
133msgstr "ГОТОВО"
134
134
135−#: qml/Dash/GenericScopeView.qml:360
135+#: qml/Dash/GenericScopeView.qml:358
136msgid "See less"
136msgid "See less"
137msgstr "Вкратце"
137msgstr "Вкратце"
138
138
139−#: qml/Dash/GenericScopeView.qml:360
139+#: qml/Dash/GenericScopeView.qml:358
140msgid "See all"
140msgid "See all"
141msgstr "Показать всё"
141msgstr "Показать всё"
142
142
143−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
143+#: qml/Panel/SearchIndicator.qml:27
144msgid "Search"
144msgid "Search"
145msgstr "Поиск"
145msgstr "Поиск"
146
146
@@ -164,25 +164,25 @@ msgstr "Добавьте отзыв"
164msgid "Send"
164msgid "Send"
165msgstr "Отправить"
165msgstr "Отправить"
166
166
167−#: qml/Dash/ScopesOverview.qml:201
167+#: qml/Dash/ScopesOverview.qml:200
168msgid "Manage Dash"
168msgid "Manage Dash"
169msgstr ""
169msgstr ""
170
170
171−#: qml/Dash/ScopesOverview.qml:408
171+#: qml/Dash/ScopesOverview.qml:405
172msgid "Done"
172msgid "Done"
173−msgstr ""
173+msgstr "Готово"
174
174
175−#: qml/Dash/ScopesOverview.qml:434
175+#: qml/Dash/ScopesOverview.qml:431
176msgid "Store"
176msgid "Store"
177msgstr ""
177msgstr ""
178
178
179#: qml/Dash/ScopesOverviewTab.qml:36
179#: qml/Dash/ScopesOverviewTab.qml:36
180msgid "Favorites"
180msgid "Favorites"
181−msgstr ""
181+msgstr "Избранное"
182
182
183#: qml/Dash/ScopesOverviewTab.qml:54
183#: qml/Dash/ScopesOverviewTab.qml:54
184msgid "All"
184msgid "All"
185−msgstr ""
185+msgstr "Все"
186
186
187#: qml/Greeter/Greeter.qml:157
187#: qml/Greeter/Greeter.qml:157
188msgid "Swipe to unlock"
188msgid "Swipe to unlock"
@@ -250,54 +250,58 @@ msgstr "Сбой, коснитесь для повтора"
250
250
251#: qml/Panel/Indicators/ModemInfoItem.qml:105
251#: qml/Panel/Indicators/ModemInfoItem.qml:105
252msgid "Unlock SIM"
252msgid "Unlock SIM"
253−msgstr ""
253+msgstr "Разблокировать SIM-карту"
254
254
255#: qml/Panel/Indicators/RoamingIndication.qml:27
255#: qml/Panel/Indicators/RoamingIndication.qml:27
256msgid "Roaming"
256msgid "Roaming"
257−msgstr ""
257+msgstr "Роуминг"
258
258
259#: qml/Shell.qml:267
259#: qml/Shell.qml:267
260msgid "passphrase"
260msgid "passphrase"
261−msgstr ""
261+msgstr "ключевая фраза"
262
262
263#: qml/Shell.qml:267
263#: qml/Shell.qml:267
264msgid "passcode"
264msgid "passcode"
265−msgstr ""
265+msgstr "секретный код"
266
266
267#: qml/Shell.qml:269
267#: qml/Shell.qml:269
268#, qt-format
268#, qt-format
269msgid "Enter your %1"
269msgid "Enter your %1"
270−msgstr ""
270+msgstr "Введите %1"
271
271
272#: qml/Shell.qml:270
272#: qml/Shell.qml:270
273#, qt-format
273#, qt-format
274msgid "Incorrect %1"
274msgid "Incorrect %1"
275−msgstr ""
275+msgstr "Некорректно введён %1"
276
276
277#: qml/Shell.qml:272
277#: qml/Shell.qml:272
278msgid "Please re-enter"
278msgid "Please re-enter"
279−msgstr ""
279+msgstr "Повторите ввод"
280
280
281#: qml/Shell.qml:306
281#: qml/Shell.qml:306
282msgid "Sorry, incorrect passphrase."
282msgid "Sorry, incorrect passphrase."
283−msgstr ""
283+msgstr "Неверная ключевая фраза."
284
284
285#: qml/Shell.qml:307
285#: qml/Shell.qml:307
286msgid "Sorry, incorrect passcode."
286msgid "Sorry, incorrect passcode."
287−msgstr ""
287+msgstr "Неверный секретный код."
288
288
289#: qml/Shell.qml:308
289#: qml/Shell.qml:308
290msgid "This will be your last attempt."
290msgid "This will be your last attempt."
291−msgstr ""
291+msgstr "Осталась последняя попытка."
292
292
293#: qml/Shell.qml:310
293#: qml/Shell.qml:310
294msgid ""
294msgid ""
295"If passphrase is entered incorrectly, your phone will conduct a factory "
295"If passphrase is entered incorrectly, your phone will conduct a factory "
296"reset and all personal data will be deleted."
296"reset and all personal data will be deleted."
297msgstr ""
297msgstr ""
298+"Если ключевая фраза будет введена неверно, то телефон вернётся к заводским "
299+"настройкам, а все личные данные будут удалены."
298
300
299#: qml/Shell.qml:311
301#: qml/Shell.qml:311
300msgid ""
302msgid ""
301"If passcode is entered incorrectly, your phone will conduct a factory reset "
303"If passcode is entered incorrectly, your phone will conduct a factory reset "
302"and all personal data will be deleted."
304"and all personal data will be deleted."
303msgstr ""
305msgstr ""
306+"Если секретный код будет введен неверно, то телефон вернётся к заводским "
307+"настройкам, а все личные данные будут удалены."
po/sl.po+41−37
@@ -8,18 +8,18 @@ msgstr ""
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-08-13 14:09-0400\n"
10"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11−"PO-Revision-Date: 2014-08-06 06:11+0000\n"
11+"PO-Revision-Date: 2014-08-19 12:54+0000\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
14"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−"X-Launchpad-Export-Date: 2014-08-15 06:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-20 06:23+0000\n"
18−"X-Generator: Launchpad (build 17156)\n"
18+"X-Generator: Launchpad (build 17163)\n"
19
19
20#: plugins/LightDM/Greeter.cpp:129
20#: plugins/LightDM/Greeter.cpp:129
21msgid "Password: "
21msgid "Password: "
22−msgstr ""
22+msgstr "Geslo: "
23
23
24#: plugins/Unity/Launcher/launcheritem.cpp:43
24#: plugins/Unity/Launcher/launcheritem.cpp:43
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -32,19 +32,19 @@ msgstr "Odpni bližnjico"
32
32
33#: qml/Components/Dialogs.qml:142
33#: qml/Components/Dialogs.qml:142
34msgid "Are you sure you would like to turn power off?"
34msgid "Are you sure you would like to turn power off?"
35−msgstr ""
35+msgstr "Ali ste prepričani, da želite izklopiti?"
36
36
37#: qml/Components/Dialogs.qml:144
37#: qml/Components/Dialogs.qml:144
38msgid "Power off"
38msgid "Power off"
39−msgstr ""
39+msgstr "Izklopi"
40
40
41#: qml/Components/Dialogs.qml:153
41#: qml/Components/Dialogs.qml:153
42msgid "Restart"
42msgid "Restart"
43−msgstr ""
43+msgstr "Ponovno zaženi"
44
44
45#: qml/Components/Dialogs.qml:162
45#: qml/Components/Dialogs.qml:162
46msgid "Cancel"
46msgid "Cancel"
47−msgstr ""
47+msgstr "Prekliči"
48
48
49#: qml/Components/EdgeDemoOverlay.qml:151
49#: qml/Components/EdgeDemoOverlay.qml:151
50msgid "Skip intro"
50msgid "Skip intro"
@@ -98,46 +98,46 @@ msgstr ""
98
98
99#: qml/Components/Lockscreen.qml:161
99#: qml/Components/Lockscreen.qml:161
100msgid "Too many incorrect attempts"
100msgid "Too many incorrect attempts"
101−msgstr ""
101+msgstr "Preveč nepravilnih poskusov"
102
102
103#: qml/Components/Lockscreen.qml:163
103#: qml/Components/Lockscreen.qml:163
104msgid "Please wait"
104msgid "Please wait"
105−msgstr ""
105+msgstr "Počakajte"
106
106
107−#: qml/Components/Lockscreen.qml:245
107+#: qml/Components/Lockscreen.qml:220
108msgid "Emergency Call"
108msgid "Emergency Call"
109msgstr "Klic v sili"
109msgstr "Klic v sili"
110
110
111−#: qml/Components/Lockscreen.qml:268
111+#: qml/Components/Lockscreen.qml:243
112msgid "OK"
112msgid "OK"
113msgstr "V REDU"
113msgstr "V REDU"
114
114
115−#: qml/Components/PassphraseLockscreen.qml:61
115+#: qml/Components/PassphraseLockscreen.qml:62
116#, qt-format
116#, qt-format
117msgid "Hello %1"
117msgid "Hello %1"
118msgstr "Pozdravljeni, %1"
118msgstr "Pozdravljeni, %1"
119
119
120−#: qml/Components/PassphraseLockscreen.qml:61
120+#: qml/Components/PassphraseLockscreen.qml:62
121msgid "Hello"
121msgid "Hello"
122msgstr "Pozdravljeni"
122msgstr "Pozdravljeni"
123
123
124−#: qml/Components/PinLockscreen.qml:197
124+#: qml/Components/PinLockscreen.qml:198
125msgid "CANCEL"
125msgid "CANCEL"
126msgstr "PREKLIČI"
126msgstr "PREKLIČI"
127
127
128−#: qml/Components/PinLockscreen.qml:215
128+#: qml/Components/PinLockscreen.qml:216
129msgid "DONE"
129msgid "DONE"
130msgstr "KONČANO"
130msgstr "KONČANO"
131
131
132−#: qml/Dash/GenericScopeView.qml:360
132+#: qml/Dash/GenericScopeView.qml:358
133msgid "See less"
133msgid "See less"
134msgstr "Pokaži manj"
134msgstr "Pokaži manj"
135
135
136−#: qml/Dash/GenericScopeView.qml:360
136+#: qml/Dash/GenericScopeView.qml:358
137msgid "See all"
137msgid "See all"
138msgstr "Ogled vsega"
138msgstr "Ogled vsega"
139
139
140−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
140+#: qml/Panel/SearchIndicator.qml:27
141msgid "Search"
141msgid "Search"
142msgstr "Iskanje"
142msgstr "Iskanje"
143
143
@@ -161,25 +161,25 @@ msgstr "Dodaj oceno"
161msgid "Send"
161msgid "Send"
162msgstr "Pošlji"
162msgstr "Pošlji"
163
163
164−#: qml/Dash/ScopesOverview.qml:201
164+#: qml/Dash/ScopesOverview.qml:200
165msgid "Manage Dash"
165msgid "Manage Dash"
166−msgstr ""
166+msgstr "Upravljaj s pregledno ploščo"
167
167
168−#: qml/Dash/ScopesOverview.qml:408
168+#: qml/Dash/ScopesOverview.qml:405
169msgid "Done"
169msgid "Done"
170−msgstr ""
170+msgstr "Končano"
171
171
172−#: qml/Dash/ScopesOverview.qml:434
172+#: qml/Dash/ScopesOverview.qml:431
173msgid "Store"
173msgid "Store"
174−msgstr ""
174+msgstr "Trgovina"
175
175
176#: qml/Dash/ScopesOverviewTab.qml:36
176#: qml/Dash/ScopesOverviewTab.qml:36
177msgid "Favorites"
177msgid "Favorites"
178−msgstr ""
178+msgstr "Priljubljeni"
179
179
180#: qml/Dash/ScopesOverviewTab.qml:54
180#: qml/Dash/ScopesOverviewTab.qml:54
181msgid "All"
181msgid "All"
182−msgstr ""
182+msgstr "Vse"
183
183
184#: qml/Greeter/Greeter.qml:157
184#: qml/Greeter/Greeter.qml:157
185msgid "Swipe to unlock"
185msgid "Swipe to unlock"
@@ -247,54 +247,58 @@ msgstr "Spodletelo, tapnite za ponovni poskus"
247
247
248#: qml/Panel/Indicators/ModemInfoItem.qml:105
248#: qml/Panel/Indicators/ModemInfoItem.qml:105
249msgid "Unlock SIM"
249msgid "Unlock SIM"
250−msgstr ""
250+msgstr "Odkleni SIM"
251
251
252#: qml/Panel/Indicators/RoamingIndication.qml:27
252#: qml/Panel/Indicators/RoamingIndication.qml:27
253msgid "Roaming"
253msgid "Roaming"
254−msgstr ""
254+msgstr "Gostovanje"
255
255
256#: qml/Shell.qml:267
256#: qml/Shell.qml:267
257msgid "passphrase"
257msgid "passphrase"
258−msgstr ""
258+msgstr "šifrirno reklo"
259
259
260#: qml/Shell.qml:267
260#: qml/Shell.qml:267
261msgid "passcode"
261msgid "passcode"
262−msgstr ""
262+msgstr "geslo"
263
263
264#: qml/Shell.qml:269
264#: qml/Shell.qml:269
265#, qt-format
265#, qt-format
266msgid "Enter your %1"
266msgid "Enter your %1"
267−msgstr ""
267+msgstr "Vnesite vaš %1"
268
268
269#: qml/Shell.qml:270
269#: qml/Shell.qml:270
270#, qt-format
270#, qt-format
271msgid "Incorrect %1"
271msgid "Incorrect %1"
272−msgstr ""
272+msgstr "Nepravilen %1"
273
273
274#: qml/Shell.qml:272
274#: qml/Shell.qml:272
275msgid "Please re-enter"
275msgid "Please re-enter"
276−msgstr ""
276+msgstr "Ponovno vnesite"
277
277
278#: qml/Shell.qml:306
278#: qml/Shell.qml:306
279msgid "Sorry, incorrect passphrase."
279msgid "Sorry, incorrect passphrase."
280−msgstr ""
280+msgstr "Nepravilno geslo."
281
281
282#: qml/Shell.qml:307
282#: qml/Shell.qml:307
283msgid "Sorry, incorrect passcode."
283msgid "Sorry, incorrect passcode."
284−msgstr ""
284+msgstr "Nepravilno geslo."
285
285
286#: qml/Shell.qml:308
286#: qml/Shell.qml:308
287msgid "This will be your last attempt."
287msgid "This will be your last attempt."
288−msgstr ""
288+msgstr "To je vaš zadnji poskus"
289
289
290#: qml/Shell.qml:310
290#: qml/Shell.qml:310
291msgid ""
291msgid ""
292"If passphrase is entered incorrectly, your phone will conduct a factory "
292"If passphrase is entered incorrectly, your phone will conduct a factory "
293"reset and all personal data will be deleted."
293"reset and all personal data will be deleted."
294msgstr ""
294msgstr ""
295+"Če je vneseno nepravilno šifrirno reklo, bo telefon ponastavljen na "
296+"tovarniške nastavitve ter vsi osebni podatki bodo izbrisani."
295
297
296#: qml/Shell.qml:311
298#: qml/Shell.qml:311
297msgid ""
299msgid ""
298"If passcode is entered incorrectly, your phone will conduct a factory reset "
300"If passcode is entered incorrectly, your phone will conduct a factory reset "
299"and all personal data will be deleted."
301"and all personal data will be deleted."
300msgstr ""
302msgstr ""
303+"Če je vneseno nepravilno geslo, bo telefon ponastavljen na tovarniške "
304+"nastavitve ter vsi osebni podatki bodo izbrisani."
po/unity8.pot+31−35
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: \n"
10"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-08-13 14:09-0400\n"
11+"POT-Creation-Date: 2014-08-21 11:36+0200\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -92,19 +92,19 @@ msgid ""
92"phone<br><br>Tap on the screen to start"
92"phone<br><br>Tap on the screen to start"
93msgstr ""
93msgstr ""
94
94
95−#: qml/Components/Lockscreen.qml:161
95+#: qml/Components/Lockscreen.qml:167
96−msgid "Too many incorrect attempts"
96+msgid "Please wait"
97msgstr ""
97msgstr ""
98
98
99−#: qml/Components/Lockscreen.qml:163
99+#: qml/Components/Lockscreen.qml:172
100−msgid "Please wait"
100+msgid "Too many incorrect attempts"
101msgstr ""
101msgstr ""
102
102
103−#: qml/Components/Lockscreen.qml:245
103+#: qml/Components/Lockscreen.qml:206
104msgid "Emergency Call"
104msgid "Emergency Call"
105msgstr ""
105msgstr ""
106
106
107−#: qml/Components/Lockscreen.qml:268
107+#: qml/Components/Lockscreen.qml:226
108msgid "OK"
108msgid "OK"
109msgstr ""
109msgstr ""
110
110
@@ -117,23 +117,15 @@ msgstr ""
117msgid "Hello"
117msgid "Hello"
118msgstr ""
118msgstr ""
119
119
120−#: qml/Components/PinLockscreen.qml:197
121−msgid "CANCEL"
122−msgstr ""
123−
124−#: qml/Components/PinLockscreen.qml:215
125−msgid "DONE"
126−msgstr ""
127−
128−#: qml/Dash/GenericScopeView.qml:360
120+#: qml/Dash/GenericScopeView.qml:361
129msgid "See less"
121msgid "See less"
130msgstr ""
122msgstr ""
131
123
132−#: qml/Dash/GenericScopeView.qml:360
124+#: qml/Dash/GenericScopeView.qml:361
133msgid "See all"
125msgid "See all"
134msgstr ""
126msgstr ""
135
127
136−#: qml/Dash/GenericScopeView.qml:423 qml/Panel/SearchIndicator.qml:27
128+#: qml/Dash/GenericScopeView.qml:424 qml/Panel/SearchIndicator.qml:27
137msgid "Search"
129msgid "Search"
138msgstr ""
130msgstr ""
139
131
@@ -201,12 +193,16 @@ msgstr ""
201msgid "Speaking..."
193msgid "Speaking..."
202msgstr ""
194msgstr ""
203
195
204−#: qml/Notifications/NotificationMenuItemFactory.qml:100
196+#: qml/Notifications/NotificationMenuItemFactory.qml:105
205msgid "Show password"
197msgid "Show password"
206msgstr ""
198msgstr ""
207
199
208−#: qml/Notifications/NotificationMenuItemFactory.qml:115
200+#: qml/Notifications/NotificationMenuItemFactory.qml:120
209−msgid "Please enter SIM PIN"
201+msgid "Enter SIM PIN"
202+msgstr ""
203+
204+#: qml/Notifications/NotificationMenuItemFactory.qml:121 qml/Shell.qml:270
205+msgid "Sorry, incorrect PIN"
210msgstr ""
206msgstr ""
211
207
212#: qml/Panel/ActiveCallHint.qml:77
208#: qml/Panel/ActiveCallHint.qml:77
@@ -249,47 +245,47 @@ msgstr ""
249msgid "Roaming"
245msgid "Roaming"
250msgstr ""
246msgstr ""
251
247
252−#: qml/Shell.qml:267
248+#: qml/Shell.qml:266
253−msgid "passphrase"
249+msgid "Enter your passphrase"
254msgstr ""
250msgstr ""
255
251
256#: qml/Shell.qml:267
252#: qml/Shell.qml:267
257−msgid "passcode"
253+msgid "Sorry, incorrect passphrase"
258msgstr ""
254msgstr ""
259
255
260#: qml/Shell.qml:269
256#: qml/Shell.qml:269
261−#, qt-format
262−msgid "Enter your %1"
257+msgid "Enter your PIN"
263msgstr ""
258msgstr ""
264
259
265−#: qml/Shell.qml:270
260+#: qml/Shell.qml:273
266#, qt-format
261#, qt-format
267−msgid "Incorrect %1"
262+msgid "Enter your %1"
268msgstr ""
263msgstr ""
269
264
270−#: qml/Shell.qml:272
265+#: qml/Shell.qml:274
271−msgid "Please re-enter"
266+#, qt-format
267+msgid "Sorry, incorrect %1"
272msgstr ""
268msgstr ""
273
269
274−#: qml/Shell.qml:306
270+#: qml/Shell.qml:310
275msgid "Sorry, incorrect passphrase."
271msgid "Sorry, incorrect passphrase."
276msgstr ""
272msgstr ""
277
273
278−#: qml/Shell.qml:307
274+#: qml/Shell.qml:311
279msgid "Sorry, incorrect passcode."
275msgid "Sorry, incorrect passcode."
280msgstr ""
276msgstr ""
281
277
282−#: qml/Shell.qml:308
278+#: qml/Shell.qml:312
283msgid "This will be your last attempt."
279msgid "This will be your last attempt."
284msgstr ""
280msgstr ""
285
281
286−#: qml/Shell.qml:310
282+#: qml/Shell.qml:314
287msgid ""
283msgid ""
288"If passphrase is entered incorrectly, your phone will conduct a factory "
284"If passphrase is entered incorrectly, your phone will conduct a factory "
289"reset and all personal data will be deleted."
285"reset and all personal data will be deleted."
290msgstr ""
286msgstr ""
291
287
292−#: qml/Shell.qml:311
288+#: qml/Shell.qml:315
293msgid ""
289msgid ""
294"If passcode is entered incorrectly, your phone will conduct a factory reset "
290"If passcode is entered incorrectly, your phone will conduct a factory reset "
295"and all personal data will be deleted."
291"and all personal data will be deleted."
qml/Components/Lockscreen.qml+33−75
@@ -24,15 +24,14 @@ Showable {
24 // Determine if a numeric or alphanumeric pad is used.
24 // Determine if a numeric or alphanumeric pad is used.
25 property bool alphaNumeric: false
25 property bool alphaNumeric: false
26
26
27− // Placeholder text
27+ // Informational text. (e.g. some text to tell which domain this is pin is entered for)
28− property string placeholderText: ""
29− // Placeholder text while shaking (e.g. Incorrect passprase)
30− property string wrongPlaceholderText: ""
28+ property string infoText: ""
29+
31 // Retries text (e.g. 3 retries left)
30 // Retries text (e.g. 3 retries left)
32 property string retryText: ""
31 property string retryText: ""
33
32
34− // Informational text. (e.g. some text to tell which domain this is pin is entered for.
33+ // The text to be displayed in case the login failed
35− property string infoText: ""
34+ property string errorText: ""
36
35
37 // In case the Lockscreen can show a greeter message, this is the username
36 // In case the Lockscreen can show a greeter message, this is the username
38 property string username: ""
37 property string username: ""
@@ -110,41 +109,6 @@ Showable {
110 anchors.fill: root
109 anchors.fill: root
111 }
110 }
112
111
113− Column {
114− spacing: units.gu(2)
115− anchors {
116− left: parent.left
117− right: parent.right
118− bottom: pinPadLoader.top
119− bottomMargin: units.gu(2)
120− }
121− Label {
122− objectName: "retryCountLabel"
123− anchors {
124− left: parent.left
125− right: parent.right
126− }
127− text: root.retryText
128− horizontalAlignment: Text.AlignHCenter
129− color: "#f3f3e7"
130− opacity: 0.6
131− visible: root.retryText.length > 0
132− }
133− Label {
134− id: infoTextLabel
135− objectName: "infoTextLabel"
136− anchors {
137− left: parent.left
138− right: parent.right
139− }
140− text: root.infoText
141− horizontalAlignment: Text.AlignHCenter
142− color: "#f3f3e7"
143− opacity: 0.6
144− visible: root.infoText.length > 0
145− }
146− }
147−
148 Loader {
112 Loader {
149 id: pinPadLoader
113 id: pinPadLoader
150 objectName: "pinPadLoader"
114 objectName: "pinPadLoader"
@@ -152,21 +116,22 @@ Showable {
152 left: parent.left
116 left: parent.left
153 right: parent.right
117 right: parent.right
154 verticalCenter: parent.verticalCenter
118 verticalCenter: parent.verticalCenter
155− verticalCenterOffset: root.alphaNumeric ? -units.gu(10) : -units.gu(4)
119+ verticalCenterOffset: root.alphaNumeric ? -units.gu(10) : 0
156 }
120 }
157 property bool resetting: false
121 property bool resetting: false
158 property bool waiting: false
122 property bool waiting: false
159 property bool showWrongText: false
123 property bool showWrongText: false
160
124
161− readonly property string forcedDelayText: i18n.tr("Too many incorrect attempts") +
162− "\n" +
163− i18n.tr("Please wait")
164−
165 source: (!resetting && root.required) ? (root.alphaNumeric ? "PassphraseLockscreen.qml" : "PinLockscreen.qml") : ""
125 source: (!resetting && root.required) ? (root.alphaNumeric ? "PassphraseLockscreen.qml" : "PinLockscreen.qml") : ""
166 onSourceChanged: {
126 onSourceChanged: {
167 waiting = false
127 waiting = false
168 showWrongText = false
128 showWrongText = false
169 }
129 }
130+ onLoaded: {
131+ if (forcedDelayTimer.running) {
132+ pinPadLoader.item.clear(true)
133+ }
134+ }
170
135
171 Connections {
136 Connections {
172 target: pinPadLoader.item
137 target: pinPadLoader.item
@@ -193,10 +158,19 @@ Showable {
193 }
158 }
194 Binding {
159 Binding {
195 target: pinPadLoader.item
160 target: pinPadLoader.item
196− property: "placeholderText"
161+ property: "infoText"
162+ value: root.infoText
163+ }
164+ Binding {
165+ target: pinPadLoader.item
166+ property: "retryText"
197− value: forcedDelayTimer.running ? pinPadLoader.forcedDelayText :
167+ value: forcedDelayTimer.running ? i18n.tr("Please wait") : root.retryText
168+ }
169+ Binding {
170+ target: pinPadLoader.item
171+ property: "errorText"
172+ value: forcedDelayTimer.running ? i18n.tr("Too many incorrect attempts") :
198− (pinPadLoader.showWrongText ? root.wrongPlaceholderText :
173+ (pinPadLoader.showWrongText ? root.errorText : "")
199− root.placeholderText)
200 }
174 }
201 Binding {
175 Binding {
202 target: pinPadLoader.item
176 target: pinPadLoader.item
@@ -210,8 +184,9 @@ Showable {
210 }
184 }
211 }
185 }
212
186
213− Column {
187+ Label {
214− id: emergencyCallColumn
188+ id: emergencyCallLabel
189+ objectName: "emergencyCallLabel"
215
190
216 // FIXME: We *should* show emergency dialer if there is a SIM present,
191 // FIXME: We *should* show emergency dialer if there is a SIM present,
217 // regardless of whether the side stage is enabled. But right now,
192 // regardless of whether the side stage is enabled. But right now,
@@ -223,37 +198,20 @@ Showable {
223 visible: !shell.sideStageEnabled
198 visible: !shell.sideStageEnabled
224
199
225 anchors {
200 anchors {
226− left: parent.left
227 bottom: parent.bottom
201 bottom: parent.bottom
228 bottomMargin: units.gu(4)
202 bottomMargin: units.gu(4)
229− right: parent.right
230− }
231− height: childrenRect.height
232− spacing: units.gu(1)
233−
234− Icon {
235− objectName: "emergencyCallIcon"
236− height: units.gu(3)
237− width: height
238− anchors.horizontalCenter: parent.horizontalCenter
203+ horizontalCenter: parent.horizontalCenter
239− name: "phone-app-call-symbolic"
240− color: "#f3f3e7"
241− opacity: 0.6
242 }
204 }
243
205
244− Label {
245− text: i18n.tr("Emergency Call")
206+ text: i18n.tr("Emergency Call")
246− color: "#f3f3e7"
207+ color: "#f3f3e7"
247− opacity: 0.6
208+ opacity: 0.6
248− fontSize: "medium"
249− anchors.horizontalCenter: parent.horizontalCenter
250− }
251 }
209 }
252
210
253 MouseArea {
211 MouseArea {
254− anchors.fill: emergencyCallColumn
212+ anchors.fill: emergencyCallLabel
255 onClicked: root.emergencyCall()
213 onClicked: root.emergencyCall()
256− enabled: emergencyCallColumn.visible
214+ enabled: emergencyCallLabel.visible
257 }
215 }
258
216
259 Component {
217 Component {
qml/Components/PassphraseLockscreen.qml+3−3
@@ -22,7 +22,7 @@ Item {
22 id: root
22 id: root
23 height: highlightItem.height
23 height: highlightItem.height
24
24
25− property string placeholderText
25+ property string infoText
26 property string username: ""
26 property string username: ""
27 property bool entryEnabled: true
27 property bool entryEnabled: true
28
28
@@ -75,8 +75,8 @@ Item {
75 echoMode: TextInput.Password
75 echoMode: TextInput.Password
76 opacity: 0.9
76 opacity: 0.9
77 hasClearButton: false
77 hasClearButton: false
78− enabled: entryEnabled
78+ enabled: root.entryEnabled
79− placeholderText: root.placeholderText
79+ placeholderText: root.infoText
80
80
81 onAccepted: {
81 onAccepted: {
82 if (pinentryField.text) {
82 if (pinentryField.text) {
qml/Components/PinLockscreen.qml+151−163
@@ -22,9 +22,11 @@ import "../Components"
22Column {
22Column {
23 id: root
23 id: root
24 anchors.centerIn: parent
24 anchors.centerIn: parent
25− spacing: units.gu(3.5)
25+ spacing: units.gu(2)
26
26
27− property alias placeholderText: pinentryField.placeholderText
27+ property string infoText
28+ property string retryText
29+ property string errorText
28 property int padWidth: units.gu(34)
30 property int padWidth: units.gu(34)
29 property int padHeight: units.gu(28)
31 property int padHeight: units.gu(28)
30 property int minPinLength: -1
32 property int minPinLength: -1
@@ -35,199 +37,185 @@ Column {
35
37
36 property bool entryEnabled: true
38 property bool entryEnabled: true
37
39
38− function clear(playAnimation) {
40+ function clear(showAnimation) {
39 pinentryField.text = "";
41 pinentryField.text = "";
40− if (playAnimation) {
42+ if (showAnimation) {
43+ pinentryField.incorrectOverride = true;
41 wrongPasswordAnimation.start();
44 wrongPasswordAnimation.start();
42 }
45 }
43 }
46 }
44
47
45− QtObject {
48+ Column {
46− id: priv
49+ id: shakeContainer
47− property bool autoConfirm: root.minPinLength == root.maxPinLength && root.minPinLength != -1
48− }
49−
50− UbuntuShape {
51− id: pinentryField
52− objectName: "pinentryField"
53 anchors.horizontalCenter: parent.horizontalCenter
50 anchors.horizontalCenter: parent.horizontalCenter
54− color: "#55000000"
51+ width: parent.width
55− width:root.padWidth
56− height: units.gu(5)
52+ spacing: units.gu(2)
57− radius: "medium"
58− property string text: ""
59− property string placeholderText: ""
60−
61− function appendChar(character) {
62− if (root.maxPinLength == -1 || pinentryField.text.length < root.maxPinLength) {
63− pinentryField.text = pinentryField.text + character;
64− }
65− }
66−
67− onTextChanged: {
68− pinentryFieldLabel.text = "";
69− for (var i = 0; i < text.length; ++i) {
70− pinentryFieldLabel.text += "•";
71− }
72− if (priv.autoConfirm && text.length === root.maxPinLength) {
73− root.entered(text);
74− }
75− }
76
53
77 Label {
54 Label {
78− id: pinentryFieldLabel
55+ id: infoField
79− anchors.centerIn: parent
56+ objectName: "infoTextLabel"
80− width: parent.width - (backspaceIcon.width + backspaceIcon.anchors.rightMargin) * 2
57+ fontSize: "large"
81− elide: Text.ElideMiddle
82− horizontalAlignment: Text.AlignHCenter
83− font.pixelSize: units.dp(44)
84 color: "#f3f3e7"
58 color: "#f3f3e7"
85− opacity: 0.6
59+ anchors.horizontalCenter: parent.horizontalCenter
86− }
60+ text: root.infoText
87− Label {
88− id: pinentryFieldPlaceHolder
89− objectName: "pinentryFieldPlaceHolder"
90− anchors.centerIn: parent
91− horizontalAlignment: Text.AlignHCenter
92− color: "#f3f3e7"
93− opacity: 0.6
94− text: parent.placeholderText
95− visible: pinentryFieldLabel.text.length == 0
96 }
61 }
97
62
98− Icon {
63+ Item {
99− id: backspaceIcon
64+ id: pinContainer
65+ anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
66+ height: units.gu(4)
67+
68+ Row {
69+ id: pinentryField
100− objectName: "backspaceIcon"
70+ objectName: "pinentryField"
101− anchors {
71+ anchors.horizontalCenter: parent.horizontalCenter
102− top: parent.top
72+ anchors.verticalCenter: parent.verticalCenter
103− topMargin: units.gu(1)
73+ spacing: Math.max(0, Math.min(units.gu(3), (parent.width / root.maxPinLength) - units.gu(3)))
104− right: parent.right
74+
105− rightMargin: units.gu(2)
75+ property string text
106− bottom: parent.bottom
76+ property bool incorrectOverride: false
107− bottomMargin: units.gu(1)
77+
108− }
78+ Repeater {
109− visible: entryEnabled && !priv.autoConfirm
79+ model: pinentryField.text.length
110− width: height
80+ delegate: Rectangle {
111− name: "erase"
112− color: "#f3f3e7"
81+ color: "#f3f3e7"
113− opacity: 0.6
82+ width: Math.min(units.gu(2), (pinContainer.width - pinContainer.height*2 ) / (root.maxPinLength >= 0 ? root.maxPinLength : 16))
114− MouseArea {
83+ height: width
115− anchors.fill: parent
84+ radius: width / 2
116− onClicked: pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1);
117− }
118− }
85+ }
119− }
86+ }
120
87
121− UbuntuShape {
88+ function appendNumber(number) {
122− anchors {
89+ if (incorrectOverride) {
123− left: parent.left
90+ incorrectOverride = false;
124− right: parent.right
125− margins: (parent.width - root.padWidth) / 2
126− }
127− height: root.padHeight
128− color: "#55000000"
129− radius: "medium"
130−
131− ThinDivider {
132− anchors {
133− left: parent.left
134− right: parent.right
135− top: parent.top
136− topMargin: root.padHeight / 4
137− }
138− }
139− ThinDivider {
140− anchors {
141− left: parent.left
142− right: parent.right
143− verticalCenter: parent.verticalCenter
144− }
145− }
146− ThinDivider {
147− anchors {
148− left: parent.left
149− right: parent.right
150− bottom: parent.bottom
151− bottomMargin: root.padHeight / 4
152− }
153− }
91+ }
154
92
155− ThinDivider {
93+ pinentryField.text = pinentryField.text + number
156− anchors.centerIn: parent
94+
157− anchors.horizontalCenterOffset: -root.padWidth / 6
95+ if (root.minPinLength > 0 && root.maxPinLength > 0
158− width: root.padHeight
96+ && root.minPinLength == root.maxPinLength && pinentryField.text.length == root.minPinLength) {
159− rotation: -90
97+ root.entered(pinentryField.text)
160− }
98+ }
161− ThinDivider {
162− anchors.centerIn: parent
163− anchors.horizontalCenterOffset: root.padWidth / 6
164− width: root.padHeight
165− rotation: -90
166− }
99+ }
167
100
168− Grid {
101+ function backspace() {
169− anchors {
102+ pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1)
170− left: parent.left
103+ }
171− right: parent.right
104+ }
172− margins: (parent.width - root.padWidth) / 2
105+ Label {
106+ id: wrongNoticeLabel
107+ objectName: "wrongNoticeLabel"
108+ fontSize: "x-large"
109+ color: "#f3f3e7"
110+ anchors.horizontalCenter: parent.horizontalCenter
111+ text: root.errorText
112+ visible: pinentryField.incorrectOverride
173 }
113 }
174
114
175− columns: 3
115+ AbstractButton {
116+ objectName: "backspaceIcon"
117+ anchors { right: parent.right; top: parent.top; bottom: parent.bottom }
118+ width: height
176
119
177− Repeater {
120+ Icon {
178− model: 9
121+ anchors.fill: parent
122+ name: "erase"
123+ color: "#f3f3e7"
124+ }
179
125
180− PinPadButton {
126+ opacity: (pinentryField.text.length && !pinentryField.incorrectOverride) > 0 ? 1 : 0
181− objectName: "pinPadButton" + (index + 1)
182− width: root.padWidth / 3
183− height: root.padHeight / 4
184− text: index + 1
185− enabled: entryEnabled
186
127
187− onClicked: {
128+ Behavior on opacity {
188− pinentryField.appendChar(text);
129+ UbuntuNumberAnimation {}
189− }
190 }
130 }
191− }
192
131
193− PinPadButton {
132+ onClicked: pinentryField.backspace()
194− objectName: "pinPadButtonBack"
195− width: root.padWidth / 3
196− height: root.padHeight / 4
197− subText: i18n.tr("CANCEL")
198− onClicked: root.cancel();
199 }
133 }
134+ }
200
135
201− PinPadButton {
136+ Label {
202− objectName: "pinPadButton0"
137+ objectName: "retryLabel"
203− width: root.padWidth / 3
138+ fontSize: "x-small"
204− height: root.padHeight / 4
139+ color: "#f3f3e7"
205− text: "0"
140+ anchors.horizontalCenter: parent.horizontalCenter
206− onClicked: pinentryField.appendChar(text);
141+ text: root.retryText || " "
207− enabled: entryEnabled
142+ }
208− }
143+ }
144+
145+ ThinDivider {
146+ anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
147+ }
148+
149+ Grid {
150+ id: numbersGrid
151+ anchors { horizontalCenter: parent.horizontalCenter }
152+ columns: 3
153+
154+ property int buttonHeight: units.gu(8)
155+ property int buttonWidth: units.gu(12)
156+
157+ Repeater {
158+ model: 9
209
159
210 PinPadButton {
160 PinPadButton {
211− objectName: "pinPadButtonErase"
161+ objectName: "pinPadButton" + text
212− width: root.padWidth / 3
162+ text: index + 1
213− height: root.padHeight / 4
163+ height: numbersGrid.buttonHeight
214− iconName: priv.autoConfirm ? "erase" : ""
164+ width: numbersGrid.buttonWidth
215− subText: priv.autoConfirm ? "" : i18n.tr("DONE")
165+ enabled: root.entryEnabled && (root.maxPinLength == -1 ||
166+ pinentryField.text.length < root.maxPinLength ||
167+ pinentryField.incorrectOverride)
168+
216 onClicked: {
169 onClicked: {
217− if (priv.autoConfirm) {
170+ pinentryField.appendNumber(index + 1)
218− pinentryField.text = pinentryField.text.substring(0, pinentryField.text.length-1);
219− } else {
220− root.entered(pinentryField.text);
221− }
222 }
171 }
223− enabled: priv.autoConfirm ? entryEnabled : pinentryField.text.length >= root.minPinLength
224 }
172 }
225 }
173 }
174+ Item {
175+ height: numbersGrid.buttonHeight
176+ width: numbersGrid.buttonWidth
226− }
177+ }
178+ PinPadButton {
179+ text: "0"
180+ height: numbersGrid.buttonHeight
181+ width: numbersGrid.buttonWidth
182+ enabled: root.entryEnabled && (root.maxPinLength == -1 ||
183+ pinentryField.text.length < root.maxPinLength ||
184+ pinentryField.incorrectOverride)
185+
186+ onClicked: {
187+ pinentryField.appendNumber(0)
188+ }
189+ }
190+ Item {
191+ height: numbersGrid.buttonHeight
192+ width: numbersGrid.buttonWidth
193+ }
194+ PinPadButton {
195+ iconName: "close"
196+ height: numbersGrid.buttonHeight
197+ width: numbersGrid.buttonWidth
227
198
199+ onClicked: root.cancel()
200+ }
201+ Item {
202+ height: numbersGrid.buttonHeight
203+ width: numbersGrid.buttonWidth
204+ }
205+ PinPadButton {
206+ iconName: "tick"
207+ objectName: "confirmButton"
208+ height: numbersGrid.buttonHeight
209+ width: numbersGrid.buttonWidth
210+ enabled: root.enabled && pinentryField.text.length >= root.minPinLength
211+ visible: root.minPinLength == -1 || root.minPinLength !== root.maxPinLength
212+
213+ onClicked: root.entered(pinentryField.text)
214+ }
215+ }
228 WrongPasswordAnimation {
216 WrongPasswordAnimation {
229 id: wrongPasswordAnimation
217 id: wrongPasswordAnimation
230 objectName: "wrongPasswordAnimation"
218 objectName: "wrongPasswordAnimation"
231− target: pinentryField
219+ target: shakeContainer
232 }
220 }
233}
221}
qml/Components/PinPadButton.qml+31−45
@@ -15,62 +15,48 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18−import Ubuntu.Components 0.1
18+import Ubuntu.Components 1.1
19
19
20−Item {
20+AbstractButton {
21 id: root
21 id: root
22 opacity: enabled ? 1 : 0.6
22 opacity: enabled ? 1 : 0.6
23
23
24 property alias text: label.text
24 property alias text: label.text
25− property alias subText: subTextLabel.text
26 property string iconName
25 property string iconName
27
26
28− signal clicked()
27+ UbuntuShape {
28+ anchors.fill: parent
29+ opacity: root.pressed ? 1 : 0
30+ Behavior on opacity {
31+ UbuntuNumberAnimation {}
32+ }
33+ }
29
34
30− Column {
35+ Label {
36+ id: label
31 anchors.centerIn: parent
37 anchors.centerIn: parent
32− width: parent.width
33− height: childrenRect.height
34−
35− Item {
36− anchors {
37− left: parent.left
38− right: parent.right
39− }
40− height: label.visible || icon.visible ? Math.max(label.height, icon.height) : 0
41−
42− Label {
43− id: label
44− anchors.centerIn: parent
45− width: parent.width
46− horizontalAlignment: Text.AlignHCenter
38+ horizontalAlignment: Text.AlignHCenter
47− color: "#f3f3e7"
39+ color: "#f3f3e7"
48− fontSize: "large"
40+ fontSize: "x-large"
49− font.weight: Font.DemiBold
41+ font.weight: Font.DemiBold
50− visible: text.length > 0
42+ visible: text.length > 0
51− }
43+ scale: root.pressed ? 0.9 : 1
52−
44+ Behavior on scale {
53− Icon {
45+ UbuntuNumberAnimation {}
54− id: icon
55− height: units.gu(3)
56− width: height
57− anchors.centerIn: parent
58− name: root.iconName
59− color: "#f3f3e7"
60− visible: name.length > 0
61− }
62− }
63− Label {
64− id: subTextLabel
65− fontSize: "small"
66− color: "#f3f3e7"
67− anchors.horizontalCenter: parent.horizontalCenter
68− visible: text.length > 0
69 }
46 }
70 }
47 }
71
48
72− MouseArea {
49+ Icon {
50+ id: icon
51+ height: units.gu(3)
52+ width: height
73− anchors.fill: parent
53+ anchors.centerIn: parent
74− onClicked: root.clicked()
54+ name: root.iconName
55+ color: "#f3f3e7"
56+ visible: name.length > 0
57+ scale: root.pressed ? 0.9 : 1
58+ Behavior on scale {
59+ UbuntuNumberAnimation { duration: UbuntuAnimation.SlowDuration }
60+ }
75 }
61 }
76}
62}
qml/Dash/Previews/PreviewExpandable.qml+3−3
@@ -81,9 +81,9 @@ PreviewWidget {
81 delegate: PreviewWidgetFactory {
81 delegate: PreviewWidgetFactory {
82 height: visible ? implicitHeight : 0
82 height: visible ? implicitHeight : 0
83 width: parent.width
83 width: parent.width
84− widgetId: modelData.widgetId
84+ widgetId: model.widgetId
85− widgetType: modelData.type
85+ widgetType: model.type
86− widgetData: modelData.properties
86+ widgetData: model.properties
87 isCurrentPreview: root.isCurrentPreview
87 isCurrentPreview: root.isCurrentPreview
88 scopeStyle: root.scopeStyle
88 scopeStyle: root.scopeStyle
89 anchors {
89 anchors {
qml/Dash/Previews/PreviewPayments.qml+22−3
@@ -37,9 +37,15 @@ PreviewWidget {
37
37
38 color: Theme.palette.selected.foreground
38 color: Theme.palette.selected.foreground
39 text: paymentClient.formattedPrice
39 text: paymentClient.formattedPrice
40+ onClicked: {
40− onClicked: paymentClient.start()
41+ paymentClient.start();
42+ paymentButton.opacity = 0;
43+ }
41 anchors.right: parent.right
44 anchors.right: parent.right
42 width: (root.width - units.gu(1)) / 2
45 width: (root.width - units.gu(1)) / 2
46+ opacity: 1
47+ visible: paymentButton.opacity == 0 ? false : true
48+ Behavior on opacity { PropertyAnimation { duration: UbuntuAnimation.FastDuration } }
43
49
44 Payments {
50 Payments {
45 id: paymentClient
51 id: paymentClient
@@ -49,8 +55,21 @@ PreviewWidget {
49 price: source["price"]
55 price: source["price"]
50 currency: source["currency"]
56 currency: source["currency"]
51 storeItemId: source["store_item_id"]
57 storeItemId: source["store_item_id"]
58+ onPurchaseCompleted: {
52− onPurchaseCompleted: root.triggered(widgetId, "purchaseCompleted", source)
59+ root.triggered(widgetId, "purchaseCompleted", source);
60+ }
61+ onPurchaseError: {
53− onPurchaseError: root.triggered(widgetId, "purchaseError", source)
62+ root.triggered(widgetId, "purchaseError", source);
63+ }
54 }
64 }
55 }
65 }
66+
67+ ProgressBar {
68+ id: loadingBar
69+ objectName: "loadingBar"
70+ indeterminate: true
71+ anchors.fill: paymentButton
72+ opacity: 1 - paymentButton.opacity
73+ visible: !paymentButton.visible
74+ }
56}
75}
qml/Greeter/Clock.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 "../Panel/Indicators"
19import Unity.Indicators 0.1 as Indicators
20import Unity.Indicators 0.1 as Indicators
20
21
21Item {
22Item {
@@ -33,7 +34,7 @@ Item {
33 }
34 }
34 }
35 }
35
36
36− Indicators.CachedUnityMenuModel {
37+ CachedUnityMenuModel {
37 id: timeModel
38 id: timeModel
38 objectName: "timeModel"
39 objectName: "timeModel"
39
40
qml/Greeter/GreeterContent.qml−1
@@ -87,7 +87,6 @@ Item {
87
87
88 onLoaded: {
88 onLoaded: {
89 item.currentIndex = greeterContentLoader.currentIndex;
89 item.currentIndex = greeterContentLoader.currentIndex;
90− item.resetAuthentication();
91 }
90 }
92
91
93 Binding {
92 Binding {
qml/Notifications/Notification.qml+4−3
@@ -52,7 +52,7 @@ Item {
52 implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 2) : 0
52 implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 2) : 0
53
53
54 color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
54 color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
55− opacity: 0
55+ opacity: 1 // FIXME: 1 because of LP: #1354406 workaround, has to be 0 really
56
56
57 state: {
57 state: {
58 var result = "";
58 var result = "";
@@ -82,7 +82,8 @@ Item {
82 source: hints["suppress-sound"] != "true" && hints["sound-file"] != undefined ? hints["sound-file"] : ""
82 source: hints["suppress-sound"] != "true" && hints["sound-file"] != undefined ? hints["sound-file"] : ""
83 }
83 }
84
84
85− onOpacityChanged: {
85+ // FIXME: using onCompleted because of LP: #1354406 workaround, has to be onOpacityChanged really
86+ Component.onCompleted: {
86 if (opacity == 1.0 && hints["suppress-sound"] != "true" && sound.source) {
87 if (opacity == 1.0 && hints["suppress-sound"] != "true" && sound.source) {
87 sound.play();
88 sound.play();
88 }
89 }
@@ -380,7 +381,7 @@ Item {
380 id: comboRepeater
381 id: comboRepeater
381
382
382 onVisibleChanged: {
383 onVisibleChanged: {
383− comboButton.text = comboRepeater.itemAt(2).actionLabel
384+ comboButton.text = comboRepeater.count >= 3 ? comboRepeater.itemAt(2).actionLabel : ""
384 }
385 }
385
386
386 model: notification.actions
387 model: notification.actions
qml/Notifications/NotificationMenuItemFactory.qml+9−1
@@ -117,7 +117,10 @@ Loader {
117 right: parent.right
117 right: parent.right
118 }
118 }
119 height: menuFactory.maxHeight
119 height: menuFactory.maxHeight
120− placeholderText: i18n.tr("Please enter SIM PIN")
120+ infoText: i18n.tr("Enter SIM PIN")
121+ errorText: i18n.tr("Sorry, incorrect PIN")
122+ minPinLength: 4
123+ maxPinLength: 8
121 background: shell.background
124 background: shell.background
122
125
123 onEntered: {
126 onEntered: {
@@ -127,6 +130,11 @@ Loader {
127 onCancel: {
130 onCancel: {
128 menuModel.activate(menuIndex, false);
131 menuModel.activate(menuIndex, false);
129 }
132 }
133+
134+ onEmergencyCall: {
135+ shell.activateApplication("dialer-app")
136+ menuModel.activate(menuIndex, false)
137+ }
130 }
138 }
131 }
139 }
132}
140}
qml/Notifications/Notifications.qml+5−3
@@ -63,7 +63,8 @@ ListView {
63
63
64 // make sure there's no opacity-difference between the several
64 // make sure there's no opacity-difference between the several
65 // elements in a notification
65 // elements in a notification
66+ // FIXME: disabled all transitions because of LP: #1354406 workaround
66− layer.enabled: add.running || remove.running || populate.running
67+ //layer.enabled: add.running || remove.running || populate.running
67
68
68 Component.onCompleted: {
69 Component.onCompleted: {
69 if (index == 1) {
70 if (index == 1) {
@@ -79,7 +80,8 @@ ListView {
79 }
80 }
80 }
81 }
81
82
83+ // FIXME: disabled all transitions because of LP: #1354406 workaround
82− populate: Transition {
84+ /*populate: Transition {
83 UbuntuNumberAnimation {
85 UbuntuNumberAnimation {
84 property: "opacity"
86 property: "opacity"
85 to: 1
87 to: 1
@@ -107,5 +109,5 @@ ListView {
107 properties: "x,y"
109 properties: "x,y"
108 duration: UbuntuAnimation.SnapDuration
110 duration: UbuntuAnimation.SnapDuration
109 }
111 }
110− }
112+ }*/
111}
113}
tests/mocks/Unity/Indicators/CachedUnityMenuModel.qml → qml/Panel/Indicators/CachedUnityMenuModel.qmlrenamed+14−5
@@ -18,13 +18,22 @@
18 */
18 */
19
19
20import QtQuick 2.0
20import QtQuick 2.0
21+import QMenuModel 0.1
22+import Unity.Indicators 0.1 as Indicators
21
23
24+// Make sure we don't duplicate models.
22Item {
25Item {
26+ id: cachedModel
23− property string busName: ""
27+ property string busName
24− property string actionsObjectPath: ""
28+ property string actionsObjectPath
25− property string menuObjectPath: ""
29+ property string menuObjectPath
30+ readonly property bool ready: busName!=="" && actionsObjectPath!=="" && menuObjectPath!==""
26
31
27− readonly property bool ready: false
32+ property var model: {
33+ if (!ready) return null;
28
34
29− property QtObject model: null
35+ return Indicators.UnityMenuModelCache.model(cachedModel.busName,
36+ cachedModel.menuObjectPath,
37+ { "indicator": cachedModel.actionsObjectPath });
38+ }
30}
39}
qml/Panel/Indicators/DefaultIndicatorWidget.qml+2−1
@@ -63,6 +63,7 @@ IndicatorBase {
63 }
63 }
64
64
65 Row {
65 Row {
66+ id: iconRow
66 anchors {
67 anchors {
67 top: parent.top
68 top: parent.top
68 bottom: parent.bottom
69 bottom: parent.bottom
@@ -73,7 +74,7 @@ IndicatorBase {
73
74
74 Item {
75 Item {
75 width: itemImage.width + units.gu(1)
76 width: itemImage.width + units.gu(1)
76− anchors { top: parent.top; bottom: parent.bottom }
77+ height: iconRow.height
77
78
78 StatusIcon {
79 StatusIcon {
79 id: itemImage
80 id: itemImage
qml/Panel/Indicators/IndicatorBase.qml+4−2
@@ -34,6 +34,7 @@ Item {
34 property string deviceMenuObjectPath: menuObjectPath
34 property string deviceMenuObjectPath: menuObjectPath
35
35
36 property alias menuModel: cachedModel.model
36 property alias menuModel: cachedModel.model
37+ property alias rootActionState: rootAction
37
38
38 CachedUnityMenuModel {
39 CachedUnityMenuModel {
39 id: cachedModel
40 id: cachedModel
@@ -42,8 +43,9 @@ Item {
42 menuObjectPath: indicatorItem.deviceMenuObjectPath
43 menuObjectPath: indicatorItem.deviceMenuObjectPath
43 }
44 }
44
45
45− property RootActionState rootActionState: RootActionState {
46+ RootActionState {
47+ id: rootAction
46− menu: menuModel
48+ menu: menuModel ? menuModel : null
47 onUpdated: indicatorItem.rootActionStateChanged()
49 onUpdated: indicatorItem.rootActionStateChanged()
48 }
50 }
49}
51}
qml/Shell.qml+16−7
@@ -20,6 +20,7 @@ import GSettings 1.0
20import Unity.Application 0.1
20import Unity.Application 0.1
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22import Ubuntu.Components.Popups 1.0
22import Ubuntu.Components.Popups 1.0
23+import Ubuntu.Connectivity 0.1
23import Ubuntu.Gestures 0.1
24import Ubuntu.Gestures 0.1
24import Ubuntu.SystemImage 0.1
25import Ubuntu.SystemImage 0.1
25import Unity.Launcher 0.1
26import Unity.Launcher 0.1
@@ -273,15 +274,19 @@ Item {
273
274
274 onShowPrompt: {
275 onShowPrompt: {
275 if (greeter.narrowMode) {
276 if (greeter.narrowMode) {
276− var promptText = text.toLowerCase()
277 if (isDefaultPrompt) {
277 if (isDefaultPrompt) {
278− promptText = lockscreen.alphaNumeric ?
278+ if (lockscreen.alphaNumeric) {
279− i18n.tr("passphrase") : i18n.tr("passcode")
279+ lockscreen.infoText = i18n.tr("Enter your passphrase")
280+ lockscreen.errorText = i18n.tr("Sorry, incorrect passphrase")
281+ } else {
282+ lockscreen.infoText = i18n.tr("Enter your PIN")
283+ lockscreen.errorText = i18n.tr("Sorry, incorrect PIN")
284+ }
285+ } else {
286+ lockscreen.infoText = i18n.tr("Enter your %1").arg(text.toLowerCase())
287+ lockscreen.errorText = i18n.tr("Sorry, incorrect %1").arg(text.toLowerCase())
280 }
288 }
281− lockscreen.placeholderText = i18n.tr("Enter your %1").arg(promptText)
289+
282− lockscreen.wrongPlaceholderText = i18n.tr("Incorrect %1").arg(promptText) +
283− "\n" +
284− i18n.tr("Please re-enter")
285 lockscreen.show();
290 lockscreen.show();
286 }
291 }
287 }
292 }
@@ -416,6 +421,10 @@ Item {
416 }
421 }
417 }
422 }
418
423
424+ Component.onCompleted: {
425+ Connectivity.unlockAllModems()
426+ }
427+
419 onUnlocked: greeter.hide()
428 onUnlocked: greeter.hide()
420 onSelected: {
429 onSelected: {
421 // Update launcher items for new user
430 // Update launcher items for new user
tests/autopilot/unity8/shell/tests/test_lock_screen.py+2−2
@@ -54,7 +54,7 @@ class TestLockscreen(UnityTestCase):
54 self.main_window.enter_pin_code("1234")
54 self.main_window.enter_pin_code("1234")
55 self.assertThat(lockscreen.shown, Eventually(Equals(False)))
55 self.assertThat(lockscreen.shown, Eventually(Equals(False)))
56 else:
56 else:
57− self._enter_prompt_passphrase("1234")
57+ self._enter_prompt_passphrase("1234\n")
58 self.assertThat(greeter.shown, Eventually(Equals(False)))
58 self.assertThat(greeter.shown, Eventually(Equals(False)))
59
59
60 @with_lightdm_mock("single-passphrase")
60 @with_lightdm_mock("single-passphrase")
@@ -86,7 +86,7 @@ class TestLockscreen(UnityTestCase):
86 self.assertThat(pinentryField.text, Eventually(Equals("")))
86 self.assertThat(pinentryField.text, Eventually(Equals("")))
87 self.assertThat(lockscreen.shown, Eventually(Equals(True)))
87 self.assertThat(lockscreen.shown, Eventually(Equals(True)))
88 else:
88 else:
89− self._enter_prompt_passphrase("4231")
89+ self._enter_prompt_passphrase("4231\n")
90 prompt = self.main_window.get_greeter().get_prompt()
90 prompt = self.main_window.get_greeter().get_prompt()
91 self.assertThat(prompt.text, Eventually(Equals("")))
91 self.assertThat(prompt.text, Eventually(Equals("")))
92 self.assertThat(greeter.shown, Eventually(Equals(True)))
92 self.assertThat(greeter.shown, Eventually(Equals(True)))
tests/mocks/LightDM/demo/GreeterPrivate.cpp+60−21
@@ -33,6 +33,12 @@ class GreeterImpl : public QObject
33{
33{
34 Q_OBJECT
34 Q_OBJECT
35
35
36+ struct AppData
37+ {
38+ GreeterImpl *impl;
39+ pam_handle *handle;
40+ };
41+
36 typedef QFutureInterface<QString> ResponseFuture;
42 typedef QFutureInterface<QString> ResponseFuture;
37
43
38public:
44public:
@@ -46,32 +52,36 @@ public:
46
52
47 connect(&futureWatcher, SIGNAL(finished()),
53 connect(&futureWatcher, SIGNAL(finished()),
48 this, SLOT(finishPam()));
54 this, SLOT(finishPam()));
49− connect(this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)),
55+ connect(this, SIGNAL(showMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)),
50− greeter, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)));
56+ this, SLOT(handleMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)));
51 // This next connect is how we pass ResponseFutures between threads
57 // This next connect is how we pass ResponseFutures between threads
52− connect(this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
58+ connect(this, SIGNAL(showPrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
53− this, SLOT(handlePrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
59+ this, SLOT(handlePrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
60+ }
61+
62+ ~GreeterImpl()
63+ {
64+ cancelPam();
54 }
65 }
55
66
56 void start(QString username)
67 void start(QString username)
57 {
68 {
58− // Clear out any existing PAM interactions first (we can't simply
69+ // Clear out any existing PAM interactions first
59− // cancel our QFuture because QtConcurrent::run doesn't support cancel)
70+ cancelPam();
60− if (pamHandle != NULL) {
71+
61− pam_handle *handle = pamHandle;
72+ AppData *appData = new AppData();
62− pamHandle = NULL; // to disable normal finishPam() handling
73+ appData->impl = this;
63− while (respond(QString())); // clear our local queue of QFutures
64− pam_end(handle, PAM_CONV_ERR);
65− }
66
74
67 // Now actually start a new conversation with PAM
75 // Now actually start a new conversation with PAM
68 pam_conv conversation;
76 pam_conv conversation;
69 conversation.conv = converseWithPam;
77 conversation.conv = converseWithPam;
70− conversation.appdata_ptr = static_cast<void*>(this);
78+ conversation.appdata_ptr = static_cast<void*>(appData);
71
79
72 if (pam_start("lightdm", username.toUtf8(), &conversation, &pamHandle) == PAM_SUCCESS) {
80 if (pam_start("lightdm", username.toUtf8(), &conversation, &pamHandle) == PAM_SUCCESS) {
81+ appData->handle = pamHandle;
73 futureWatcher.setFuture(QtConcurrent::run(authenticateWithPam, pamHandle));
82 futureWatcher.setFuture(QtConcurrent::run(authenticateWithPam, pamHandle));
74 } else {
83 } else {
84+ delete appData;
75 greeterPrivate->authenticated = false;
85 greeterPrivate->authenticated = false;
76 Q_EMIT greeter->showMessage("Internal error: could not start PAM authentication", QLightDM::Greeter::MessageTypeError);
86 Q_EMIT greeter->showMessage("Internal error: could not start PAM authentication", QLightDM::Greeter::MessageTypeError);
77 Q_EMIT greeter->authenticationComplete();
87 Q_EMIT greeter->authenticationComplete();
@@ -103,7 +113,9 @@ public:
103 if (!tmp_response)
113 if (!tmp_response)
104 return PAM_CONV_ERR;
114 return PAM_CONV_ERR;
105
115
106− GreeterImpl* impl = static_cast<GreeterImpl*>(appdata_ptr);
116+ AppData *appData = static_cast<AppData*>(appdata_ptr);
117+ GreeterImpl *impl = appData->impl;
118+ pam_handle *handle = appData->handle;
107
119
108 int count;
120 int count;
109 QVector<ResponseFuture> responses;
121 QVector<ResponseFuture> responses;
@@ -117,7 +129,7 @@ public:
117 QString message(msg[count]->msg);
129 QString message(msg[count]->msg);
118 responses.append(ResponseFuture());
130 responses.append(ResponseFuture());
119 responses.last().reportStarted();
131 responses.last().reportStarted();
120− Q_EMIT impl->showPrompt(message, Greeter::PromptTypeQuestion, responses.last());
132+ Q_EMIT impl->showPrompt(handle, message, Greeter::PromptTypeQuestion, responses.last());
121 break;
133 break;
122 }
134 }
123 case PAM_PROMPT_ECHO_OFF:
135 case PAM_PROMPT_ECHO_OFF:
@@ -125,19 +137,19 @@ public:
125 QString message(msg[count]->msg);
137 QString message(msg[count]->msg);
126 responses.append(ResponseFuture());
138 responses.append(ResponseFuture());
127 responses.last().reportStarted();
139 responses.last().reportStarted();
128− Q_EMIT impl->showPrompt(message, Greeter::PromptTypeSecret, responses.last());
140+ Q_EMIT impl->showPrompt(handle, message, Greeter::PromptTypeSecret, responses.last());
129 break;
141 break;
130 }
142 }
131 case PAM_TEXT_INFO:
143 case PAM_TEXT_INFO:
132 {
144 {
133 QString message(msg[count]->msg);
145 QString message(msg[count]->msg);
134− Q_EMIT impl->showMessage(message, Greeter::MessageTypeInfo);
146+ Q_EMIT impl->showMessage(handle, message, Greeter::MessageTypeInfo);
135 break;
147 break;
136 }
148 }
137 default:
149 default:
138 {
150 {
139 QString message(msg[count]->msg);
151 QString message(msg[count]->msg);
140− Q_EMIT impl->showMessage(message, Greeter::MessageTypeError);
152+ Q_EMIT impl->showMessage(handle, message, Greeter::MessageTypeError);
141 break;
153 break;
142 }
154 }
143 }
155 }
@@ -159,6 +171,8 @@ public:
159 }
171 }
160 }
172 }
161
173
174+ delete appData;
175+
162 if (raise_error)
176 if (raise_error)
163 {
177 {
164 for (int i = 0; i < count; ++i)
178 for (int i = 0; i < count; ++i)
@@ -186,8 +200,8 @@ public Q_SLOTS:
186 }
200 }
187
201
188Q_SIGNALS:
202Q_SIGNALS:
189− void showMessage(QString text, QLightDM::Greeter::MessageType type);
203+ void showMessage(pam_handle *handle, QString text, QLightDM::Greeter::MessageType type);
190− void showPrompt(QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture response);
204+ void showPrompt(pam_handle *handle, QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture response);
191
205
192private Q_SLOTS:
206private Q_SLOTS:
193 void finishPam()
207 void finishPam()
@@ -205,13 +219,38 @@ private Q_SLOTS:
205 Q_EMIT greeter->authenticationComplete();
219 Q_EMIT greeter->authenticationComplete();
206 }
220 }
207
221
222+ void handleMessage(pam_handle *handle, QString text, QLightDM::Greeter::MessageType type)
223+ {
224+ if (handle != pamHandle)
225+ return;
226+
227+ Q_EMIT greeter->showMessage(text, type);
228+ }
229+
208− void handlePrompt(QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture future)
230+ void handlePrompt(pam_handle *handle, QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture future)
209 {
231 {
232+ if (handle != pamHandle) {
233+ future.reportResult(QString());
234+ future.reportFinished();
235+ return;
236+ }
237+
210 futures.enqueue(future);
238 futures.enqueue(future);
211 Q_EMIT greeter->showPrompt(text, type);
239 Q_EMIT greeter->showPrompt(text, type);
212 }
240 }
213
241
214private:
242private:
243+ void cancelPam()
244+ {
245+ // Unfortunately we can't simply cancel our QFuture because QtConcurrent::run doesn't support cancel
246+ if (pamHandle != NULL) {
247+ pam_handle *handle = pamHandle;
248+ pamHandle = NULL; // to disable normal finishPam() handling
249+ while (respond(QString())); // clear our local queue of QFutures
250+ pam_end(handle, PAM_CONV_ERR);
251+ }
252+ }
253+
215 Greeter *greeter;
254 Greeter *greeter;
216 GreeterPrivate *greeterPrivate;
255 GreeterPrivate *greeterPrivate;
217 pam_handle* pamHandle;
256 pam_handle* pamHandle;
tests/mocks/QMenuModel/unitymenumodel.cpp+4−5
@@ -17,7 +17,6 @@
17 */
17 */
18
18
19#include "unitymenumodel.h"
19#include "unitymenumodel.h"
20−#include <QDebug>
21
20
22enum MenuRoles {
21enum MenuRoles {
23 LabelRole = Qt::DisplayRole + 1,
22 LabelRole = Qt::DisplayRole + 1,
@@ -38,6 +37,10 @@ UnityMenuModel::UnityMenuModel(QObject *parent)
38{
37{
39}
38}
40
39
40+UnityMenuModel::~UnityMenuModel()
41+{
42+}
43+
41QVariant UnityMenuModel::modelData() const
44QVariant UnityMenuModel::modelData() const
42{
45{
43 return m_modelData;
46 return m_modelData;
@@ -83,10 +86,6 @@ void UnityMenuModel::removeRow(int row)
83 endRemoveRows();
86 endRemoveRows();
84}
87}
85
88
86−UnityMenuModel::~UnityMenuModel()
87−{
88−}
89−
90QByteArray UnityMenuModel::busName() const
89QByteArray UnityMenuModel::busName() const
91{
90{
92 return m_busName;
91 return m_busName;
tests/mocks/Ubuntu/CMakeLists.txt+1
@@ -1,3 +1,4 @@
1+add_subdirectory(Connectivity)
1add_subdirectory(DownloadDaemonListener)
2add_subdirectory(DownloadDaemonListener)
2add_subdirectory(Payments)
3add_subdirectory(Payments)
3add_subdirectory(SystemImage)
4add_subdirectory(SystemImage)
tests/mocks/Ubuntu/Connectivity/CMakeLists.txtnew file+10
@@ -0,0 +1,10 @@
1+set(MOCK_CONNECTIVITY_SOURCES
2+ plugin.cpp
3+ MockConnectivity.cpp
4+)
5+
6+add_library(MockConnectivity MODULE ${MOCK_CONNECTIVITY_SOURCES})
7+
8+qt5_use_modules(MockConnectivity Qml Quick Core)
9+
10+add_unity8_mock(Ubuntu.Connectivity 0.1 Ubuntu/Connectivity TARGETS MockConnectivity)
tests/mocks/Ubuntu/Connectivity/Connectivity.qmltypesnew file+18
@@ -0,0 +1,18 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Ubuntu.Connectivity 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "MockConnectivity"
12+ prototype: "QObject"
13+ exports: ["Ubuntu.Connectivity/Connectivity 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Signal { name: "unlockingAllModems" }
16+ Method { name: "unlockAllModems" }
17+ }
18+}
tests/mocks/Ubuntu/Connectivity/MockConnectivity.cppnew 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+#include "MockConnectivity.h"
18+
19+MockConnectivity::MockConnectivity(QObject *parent)
20+ : QObject(parent)
21+{
22+}
23+
24+void MockConnectivity::unlockAllModems()
25+{
26+ Q_EMIT unlockingAllModems();
27+}
tests/mocks/Ubuntu/Connectivity/MockConnectivity.hnew file+36
@@ -0,0 +1,36 @@
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 MOCK_CONNECTIVITY_H
18+#define MOCK_CONNECTIVITY_H
19+
20+#include <QObject>
21+
22+class MockConnectivity : public QObject
23+{
24+ Q_OBJECT
25+ Q_DISABLE_COPY(MockConnectivity)
26+
27+public:
28+ explicit MockConnectivity(QObject *parent = 0);
29+
30+ Q_INVOKABLE void unlockAllModems();
31+
32+Q_SIGNALS:
33+ void unlockingAllModems(); // only for mock
34+};
35+
36+#endif // MOCK_CONNECTIVITY_H
tests/mocks/Ubuntu/Connectivity/plugin.cppnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
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 "plugin.h"
18+#include "MockConnectivity.h"
19+
20+#include <QtQml>
21+
22+static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
23+{
24+ Q_UNUSED(engine)
25+ Q_UNUSED(scriptEngine)
26+ return new MockConnectivity();
27+}
28+
29+void BackendPlugin::registerTypes(const char *uri)
30+{
31+ Q_ASSERT(uri == QLatin1String("Ubuntu.Connectivity"));
32+
33+ qmlRegisterSingletonType<MockConnectivity>(uri, 0, 1, "Connectivity", service_provider);
34+}
tests/mocks/Ubuntu/Connectivity/plugin.hnew file+31
@@ -0,0 +1,31 @@
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 MOCK_CONNECTIVITY_PLUGIN_H
18+#define MOCK_CONNECTIVITY_PLUGIN_H
19+
20+#include <QQmlExtensionPlugin>
21+
22+class BackendPlugin : public QQmlExtensionPlugin
23+{
24+ Q_OBJECT
25+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26+
27+public:
28+ void registerTypes(const char *uri);
29+};
30+
31+#endif // MOCK_CONNECTIVITY_PLUGIN_H
tests/mocks/Ubuntu/Connectivity/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Ubuntu.Connectivity
2+plugin MockConnectivity
3+typeinfo Connectivity.qmltypes
tests/mocks/Unity/Indicators/CMakeLists.txt+6−1
@@ -14,6 +14,7 @@ set(IndicatorsFakeQml_SOURCES
14 fakeplugin.cpp
14 fakeplugin.cpp
15 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/indicators.h
15 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/indicators.h
16 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/menucontentactivator.cpp
16 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/menucontentactivator.cpp
17+ ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/unitymenumodelcache.cpp
17 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/unitymenumodelstack.cpp
18 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/unitymenumodelstack.cpp
18 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/visibleindicatorsmodel.cpp
19 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/visibleindicatorsmodel.cpp
19 fakeindicatorsmodel.cpp
20 fakeindicatorsmodel.cpp
@@ -33,7 +34,11 @@ add_library(IndicatorsFakeQml SHARED
33)
34)
34add_definitions(-DUNITYINDICATORS_LIBRARY)
35add_definitions(-DUNITYINDICATORS_LIBRARY)
35
36
37+add_dependencies(IndicatorsFakeQml QMenuModelQml)
36−target_link_libraries(IndicatorsFakeQml)
38+target_link_libraries(IndicatorsFakeQml
39+ -L${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel
40+ -lqmenumodel
41+)
37
42
38qt5_use_modules(IndicatorsFakeQml Core Qml Quick)
43qt5_use_modules(IndicatorsFakeQml Core Qml Quick)
39
44
tests/mocks/Unity/Indicators/fakeplugin.cpp+9
@@ -26,9 +26,16 @@
26#include "fakeindicatorsmodel.h"
26#include "fakeindicatorsmodel.h"
27#include "indicators.h"
27#include "indicators.h"
28#include "menucontentactivator.h"
28#include "menucontentactivator.h"
29+#include "unitymenumodelcache.h"
29#include "unitymenumodelstack.h"
30#include "unitymenumodelstack.h"
30#include "visibleindicatorsmodel.h"
31#include "visibleindicatorsmodel.h"
31
32
33+static QObject* menuModelCacheSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
34+ Q_UNUSED(engine);
35+ Q_UNUSED(scriptEngine);
36+ return new UnityMenuModelCache;
37+}
38+
32void IndicatorsFakePlugin::registerTypes(const char * uri)
39void IndicatorsFakePlugin::registerTypes(const char * uri)
33{
40{
34 Q_INIT_RESOURCE(indicators_fake);
41 Q_INIT_RESOURCE(indicators_fake);
@@ -41,6 +48,8 @@ void IndicatorsFakePlugin::registerTypes(const char * uri)
41 qmlRegisterType<UnityMenuModelStack>(uri, 0, 1, "UnityMenuModelStack");
48 qmlRegisterType<UnityMenuModelStack>(uri, 0, 1, "UnityMenuModelStack");
42 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
49 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
43
50
51+ qmlRegisterSingletonType<UnityMenuModelCache>(uri, 0, 1, "UnityMenuModelCache", menuModelCacheSingleton);
52+
44 // external uncreatables
53 // external uncreatables
45 qmlRegisterUncreatableType<MenuContentState>(uri, 0, 1, "MenuContentState", "Can't create MenuContentState class");
54 qmlRegisterUncreatableType<MenuContentState>(uri, 0, 1, "MenuContentState", "Can't create MenuContentState class");
46 qmlRegisterUncreatableType<ActionState>(uri, 0, 1, "ActionState", "Can't create ActionState class");
55 qmlRegisterUncreatableType<ActionState>(uri, 0, 1, "ActionState", "Can't create ActionState class");
tests/mocks/Unity/Indicators/qmldir−1
@@ -2,7 +2,6 @@ module Unity.Indicators
2plugin IndicatorsFakeQml
2plugin IndicatorsFakeQml
3typeinfo Indicators.qmltypes
3typeinfo Indicators.qmltypes
4
4
5−CachedUnityMenuModel 0.1 CachedUnityMenuModel.qml
6IndicatorsModel 0.1 IndicatorsModel.qml
5IndicatorsModel 0.1 IndicatorsModel.qml
7FakeMenuPage 0.1 FakeMenuPage.qml
6FakeMenuPage 0.1 FakeMenuPage.qml
8RootActionState 0.1 RootActionState.qml
7RootActionState 0.1 RootActionState.qml
tests/qmltests/CMakeLists.txt+1
@@ -73,6 +73,7 @@ add_qml_test(Panel Panel)
73add_qml_test(Panel SearchIndicator)
73add_qml_test(Panel SearchIndicator)
74add_qml_test(Panel/Indicators DefaultIndicatorWidget ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
74add_qml_test(Panel/Indicators DefaultIndicatorWidget ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
75add_qml_test(Panel/Indicators DefaultIndicatorPage ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
75add_qml_test(Panel/Indicators DefaultIndicatorPage ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
76+add_qml_test(Panel/Indicators CachedUnityMenuModel ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
76# These MenuItemFactory tests need the test/mocks/ to come before plugins/
77# These MenuItemFactory tests need the test/mocks/ to come before plugins/
77add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
78add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
78add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
79add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${CMAKE_BINARY_DIR}/tests/mocks ${qmltest_DEFAULT_IMPORT_PATHS})
tests/qmltests/Dash/Previews/tst_PreviewExpandable.qml+12−6
@@ -34,15 +34,21 @@ Rectangle {
34 "values": [ [ "Long Label 1", "Value 1"], [ "Label 2", "Long Value 2"], [ "Label 3", "Value 3"], [ "Label 4", "Value 4"], [ "Label 5", "Value 5"] ]
34 "values": [ [ "Long Label 1", "Value 1"], [ "Label 2", "Long Value 2"], [ "Label 3", "Value 3"], [ "Label 4", "Value 4"], [ "Label 5", "Value 5"] ]
35 }
35 }
36
36
37+ ListModel {
38+ id: widgetsModel
39+ }
40+
37 property var widgetData: {
41 property var widgetData: {
38 "title": "Title here",
42 "title": "Title here",
39 "collapsed-widgets": 2,
43 "collapsed-widgets": 2,
40− "widgets": [
44+ "widgets": widgetsModel
45+ }
46+
47+ Component.onCompleted: {
41− { "type": "text", "widgetId" : "text1", "properties" : { "text": longText } },
48+ widgetsModel.append({"type": "text", "widgetId": "text1", "properties": { "text": longText }});
42− { "type": "table", "widgetId" : "table1", "properties" : tableData },
49+ widgetsModel.append({"type": "text", "widgetId": "table1", "properties": { "text": tableData }});
43− { "type": "text", "widgetId" : "text3", "properties" : { "text": shortText } },
50+ widgetsModel.append({"type": "text", "widgetId": "text3", "properties": { "text": shortText }});
44− { "type": "text", "widgetId" : "text4", "properties" : { "text": longText } }
51+ widgetsModel.append({"type": "text", "widgetId": "text4", "properties": { "text": longText }});
45− ]
46 }
52 }
47
53
48 PreviewExpandable {
54 PreviewExpandable {
tests/qmltests/Dash/Previews/tst_PreviewPayments.qml+24
@@ -52,6 +52,8 @@ Rectangle {
52 function cleanup()
52 function cleanup()
53 {
53 {
54 spy.clear();
54 spy.clear();
55+ var button = findChild(root, "paymentButton");
56+ button.opacity = 1;
55 }
57 }
56
58
57 function test_purchase_text_display() {
59 function test_purchase_text_display() {
@@ -79,6 +81,28 @@ Rectangle {
79 compare(args[2], jsonPurchase["source"]);
81 compare(args[2], jsonPurchase["source"]);
80 }
82 }
81
83
84+ function test_progress_show() {
85+ // Make sure the progress bar is shown.
86+ previewPayments.widgetData = jsonPurchase;
87+
88+ var button = findChild(root, "paymentButton");
89+ var progress = findChild(root, "loadingBar");
90+
91+ tryCompare(progress, "visible", false);
92+ tryCompare(progress, "opacity", 0);
93+ tryCompare(button, "visible", true);
94+ tryCompare(button, "opacity", 1);
95+
96+ mouseClick(button, button.width / 2, button.height / 2);
97+
98+ spy.wait();
99+
100+ tryCompare(progress, "visible", true);
101+ tryCompare(progress, "opacity", 1);
102+ tryCompare(button, "visible", false);
103+ tryCompare(button, "opacity", 0);
104+ }
105+
82 function test_purchase_error() {
106 function test_purchase_error() {
83 // The mock Payments triggers an error when com.example.invalid is
107 // The mock Payments triggers an error when com.example.invalid is
84 // passed to it as store_item_id. Exercise it here
108 // passed to it as store_item_id. Exercise it here
tests/qmltests/Dash/tst_Dash.qml+12−6
@@ -96,8 +96,10 @@ Item {
96 tryCompare(scopes, "loaded", true);
96 tryCompare(scopes, "loaded", true);
97 var dashContentList = findChild(dash, "dashContentList");
97 var dashContentList = findChild(dash, "dashContentList");
98 tryCompare(dashContentList, "count", 6);
98 tryCompare(dashContentList, "count", 6);
99+ tryCompareFunction(function() {
99− var mockScope1Loader = findChild(dash, "MockScope1 loader");
100+ var mockScope1Loader = findChild(dash, "MockScope1 loader");
100− tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
101+ return mockScope1Loader && mockScope1Loader.item != null; },
102+ true);
101
103
102 // Show the overview
104 // Show the overview
103 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
105 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
@@ -159,8 +161,10 @@ Item {
159 tryCompare(scopes, "loaded", true);
161 tryCompare(scopes, "loaded", true);
160 var dashContentList = findChild(dash, "dashContentList");
162 var dashContentList = findChild(dash, "dashContentList");
161 tryCompare(dashContentList, "count", 6);
163 tryCompare(dashContentList, "count", 6);
164+ tryCompareFunction(function() {
162− var mockScope1Loader = findChild(dash, "MockScope1 loader");
165+ var mockScope1Loader = findChild(dash, "MockScope1 loader");
163− tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
166+ return mockScope1Loader && mockScope1Loader.item != null; },
167+ true);
164
168
165 // Show the overview
169 // Show the overview
166 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
170 touchFlick(dash, dash.width / 2, dash.height - 1, dash.width / 2, dash.height - units.gu(18));
@@ -224,8 +228,10 @@ Item {
224 tryCompare(scopes, "loaded", true);
228 tryCompare(scopes, "loaded", true);
225 var dashContentList = findChild(dash, "dashContentList");
229 var dashContentList = findChild(dash, "dashContentList");
226 tryCompare(dashContentList, "count", 6);
230 tryCompare(dashContentList, "count", 6);
231+ tryCompareFunction(function() {
227− var mockScope1Loader = findChild(dash, "MockScope1 loader");
232+ var mockScope1Loader = findChild(dash, "MockScope1 loader");
228− tryCompareFunction(function() { return mockScope1Loader.item != null; }, true);
233+ return mockScope1Loader && mockScope1Loader.item != null; },
234+ true);
229
235
230 // Swipe right to Apps scope
236 // Swipe right to Apps scope
231 touchFlick(dash, dash.width - 1, units.gu(1), dash.width - units.gu(10), units.gu(1));
237 touchFlick(dash, dash.width - 1, units.gu(1), dash.width - units.gu(10), units.gu(1));
tests/qmltests/Greeter/tst_Lockscreen.qml+65−46
@@ -26,22 +26,21 @@ import Unity.Test 0.1 as UT
26Rectangle {
26Rectangle {
27 id: root
27 id: root
28 width: units.gu(80)
28 width: units.gu(80)
29− height: units.gu(80)
29+ height: units.gu(70)
30 color: "orange"
30 color: "orange"
31
31
32 Lockscreen {
32 Lockscreen {
33 id: lockscreen
33 id: lockscreen
34 anchors.fill: parent
34 anchors.fill: parent
35− anchors.rightMargin: units.gu(30)
35+ anchors.rightMargin: units.gu(40)
36− placeholderText: "Please enter your PIN"
36+ infoText: infoTextTextField.text
37− wrongPlaceholderText: "Incorrect PIN"
38 retryText: retryCountTextField.text
37 retryText: retryCountTextField.text
38+ errorText: errorTextTextField.text
39 alphaNumeric: pinPadCheckBox.checked
39 alphaNumeric: pinPadCheckBox.checked
40 minPinLength: minPinLengthTextField.text
40 minPinLength: minPinLengthTextField.text
41 maxPinLength: maxPinLengthTextField.text
41 maxPinLength: maxPinLengthTextField.text
42 username: "Lola"
42 username: "Lola"
43 background: "../../../qml/graphics/phone_background.jpg"
43 background: "../../../qml/graphics/phone_background.jpg"
44− infoText: infoTextTextField.text
45 }
44 }
46
45
47 Connections {
46 Connections {
@@ -68,7 +67,7 @@ Rectangle {
68 } else {
67 } else {
69 pinPadCheckBox.checked = true
68 pinPadCheckBox.checked = true
70 }
69 }
71− lockscreen.placeholderText = text;
70+ lockscreen.infoText = text;
72 }
71 }
73 }
72 }
74
73
@@ -157,7 +156,14 @@ Rectangle {
157 id: infoTextTextField
156 id: infoTextTextField
158 width: parent.width
157 width: parent.width
159 placeholderText: "Infotext"
158 placeholderText: "Infotext"
160− text: "+49 179 3253553"
159+ text: "Enter SIM1 PIN"
160+ }
161+
162+ TextField {
163+ id: errorTextTextField
164+ width: parent.width
165+ placeholderText: "Error text"
166+ text: "Sorry, incorrect PIN"
161 }
167 }
162
168
163 TextField {
169 TextField {
@@ -223,7 +229,7 @@ Rectangle {
223 emergencyCheckBox.checked = false
229 emergencyCheckBox.checked = false
224 pinPadCheckBox.checked = data.alphanumeric
230 pinPadCheckBox.checked = data.alphanumeric
225 waitForLockscreenReady();
231 waitForLockscreenReady();
226− var emergencyButton = findChild(lockscreen, "emergencyCallIcon")
232+ var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
227 mouseClick(emergencyButton, units.gu(1), units.gu(1))
233 mouseClick(emergencyButton, units.gu(1), units.gu(1))
228 tryCompare(emergencyCheckBox, "checked", true)
234 tryCompare(emergencyCheckBox, "checked", true)
229
235
@@ -231,18 +237,20 @@ Rectangle {
231
237
232 function test_labels_data() {
238 function test_labels_data() {
233 return [
239 return [
234− {tag: "numeric", alphanumeric: false, placeholderText: "Please enter your PIN", username: "foobar" },
240+ {tag: "numeric", alphanumeric: false, infoText: "Please enter your PIN", username: "foobar" },
235− {tag: "alphanumeric", alphanumeric: true, placeholderText: "Please enter your password", username: "Lola" }
241+ {tag: "alphanumeric", alphanumeric: true, infoText: "Please enter your password", username: "Lola" }
236 ]
242 ]
237 }
243 }
238
244
239 function test_labels(data) {
245 function test_labels(data) {
240 pinPadCheckBox.checked = data.alphanumeric
246 pinPadCheckBox.checked = data.alphanumeric
241− lockscreen.placeholderText = data.placeholderText
247+ lockscreen.infoText = data.infoText
242 waitForLockscreenReady();
248 waitForLockscreenReady();
243− compare(findChild(lockscreen, "pinentryField").placeholderText, data.placeholderText, "Placeholdertext is not what it should be")
244 if (data.alphanumeric) {
249 if (data.alphanumeric) {
250+ compare(findChild(lockscreen, "pinentryField").placeholderText, data.infoText, "Placeholdertext is not what it should be")
245 compare(findChild(lockscreen, "greeterLabel").text, "Hello " + data.username, "Greeter is not set correctly")
251 compare(findChild(lockscreen, "greeterLabel").text, "Hello " + data.username, "Greeter is not set correctly")
252+ } else {
253+ compare(findChild(lockscreen, "infoTextLabel").text, data.infoText, "Placeholdertext is not what it should be")
246 }
254 }
247 }
255 }
248
256
@@ -276,10 +284,8 @@ Rectangle {
276 var button = findChild(lockscreen, "pinPadButton" + character)
284 var button = findChild(lockscreen, "pinPadButton" + character)
277 mouseClick(button, units.gu(1), units.gu(1))
285 mouseClick(button, units.gu(1), units.gu(1))
278 }
286 }
279− if (data.minPinLength !== data.maxPinLength || data.minPinLength == -1) {
280− var pinPadButtonErase = findChild(lockscreen, "pinPadButtonErase");
287+ var confirmButton = findChild(lockscreen, "confirmButton");
281− mouseClick(pinPadButtonErase, units.gu(1), units.gu(1));
288+ mouseClick(confirmButton, units.gu(1), units.gu(1));
282− }
283 }
289 }
284 tryCompare(enteredLabel, "text", data.password)
290 tryCompare(enteredLabel, "text", data.password)
285 }
291 }
@@ -317,11 +323,9 @@ Rectangle {
317 wait(0) // Trigger event loop to make sure the animation would start running
323 wait(0) // Trigger event loop to make sure the animation would start running
318 compare(animation.running, data.animation)
324 compare(animation.running, data.animation)
319 if (data.animation) {
325 if (data.animation) {
320− if (data.alphanumeric) {
326+ if (!data.alphanumeric) {
321− tryCompare(inputField, "placeholderText", lockscreen.wrongPlaceholderText)
322− } else {
323− var label = findChild(lockscreen, "pinentryFieldPlaceHolder");
327+ var label = findChild(lockscreen, "wrongNoticeLabel");
324− tryCompare(label, "text", lockscreen.wrongPlaceholderText)
328+ tryCompare(label, "visible", true)
325 }
329 }
326 }
330 }
327
331
@@ -343,24 +347,21 @@ Rectangle {
343 maxPinLengthTextField.text = data.maxPinLength
347 maxPinLengthTextField.text = data.maxPinLength
344 waitForLockscreenReady();
348 waitForLockscreenReady();
345
349
346− var pinPadButtonErase = findChild(lockscreen, "pinPadButtonErase");
347 var backspaceIcon = findChild(lockscreen, "backspaceIcon");
350 var backspaceIcon = findChild(lockscreen, "backspaceIcon");
348 var pinEntryField = findChild(lockscreen, "pinentryField");
351 var pinEntryField = findChild(lockscreen, "pinentryField");
349
352
350− var autoConfirmEnabled = data.minPinLength === data.maxPinLength && data.minPinLength !== -1;
351− compare(pinPadButtonErase.iconName, autoConfirmEnabled ? "erase" : "");
352− compare(backspaceIcon.visible, !autoConfirmEnabled);
353+ compare(backspaceIcon.opacity, 0);
353
354
354 var pinPadButton5 = findChild(lockscreen, "pinPadButton5");
355 var pinPadButton5 = findChild(lockscreen, "pinPadButton5");
355 mouseClick(pinPadButton5, units.gu(1), units.gu(1));
356 mouseClick(pinPadButton5, units.gu(1), units.gu(1));
356 compare(pinEntryField.text, "5");
357 compare(pinEntryField.text, "5");
357
358
358− if (data.minPinLength !== data.maxPinLength) {
359− mouseClick(backspaceIcon, units.gu(1), units.gu(1));
359+ tryCompare(backspaceIcon, "opacity", 1);
360− } else {
360+
361− mouseClick(pinPadButtonErase, units.gu(1), units.gu(1));
361+ mouseClick(backspaceIcon, units.gu(1), units.gu(1));
362− }
363 compare(pinEntryField.text, "");
362 compare(pinEntryField.text, "");
363+
364+ tryCompare(backspaceIcon, "opacity", 0);
364 }
365 }
365
366
366 function test_minMaxLength_data() {
367 function test_minMaxLength_data() {
@@ -373,37 +374,55 @@ Rectangle {
373
374
374 function test_minMaxLength(data) {
375 function test_minMaxLength(data) {
375 pinPadCheckBox.checked = false
376 pinPadCheckBox.checked = false
376− minPinLengthTextField.text = data.minPinLength
377+ minPinLengthTextField.text = data.minPinLength;
377− maxPinLengthTextField.text = data.maxPinLength
378+ maxPinLengthTextField.text = data.maxPinLength;
378 waitForLockscreenReady();
379 waitForLockscreenReady();
379
380
380 var pinPadButton5 = findChild(lockscreen, "pinPadButton5");
381 var pinPadButton5 = findChild(lockscreen, "pinPadButton5");
381− var pinPadButtonErase = findChild(lockscreen, "pinPadButtonErase");
382+ var backspaceButton = findChild(lockscreen, "backspaceIcon");
383+ var confirmButton = findChild(lockscreen, "confirmButton");
382− var inputField = findChild(lockscreen, "pinentryField")
384+ var inputField = findChild(lockscreen, "pinentryField");
385+
386+ tryCompare(backspaceButton, "opacity", 0);
387+
388+ tryCompare(confirmButton, "visible", (data.minPinLength != data.maxPinLength) || (data.minPinLength == -1));
383
389
384 for (var i = 0; i < 10; i++) {
390 for (var i = 0; i < 10; i++) {
385 mouseClick(pinPadButton5, units.gu(1), units.gu(1));
391 mouseClick(pinPadButton5, units.gu(1), units.gu(1));
392+ tryCompare(backspaceButton, "opacity", 1)
386
393
387− if (data.minPinLength == data.maxPinLength && data.minPinLength != -1) {
394+ if (data.maxPinLength == data.minPinLength && data.minPinLength > 0) {
388− // auto confirm mode...
395+ // Autoconfirm mode. This will automatically confirm (and with it reset)
396+ // the textfield every data.minPinLength presses
397+ if (i+1 < data.minPinLength) {
389− compare(inputField.text.length, (i+1) % data.minPinLength);
398+ compare(inputField.text.length, i + 1);
399+ } else {
400+ compare(inputField.text.length, (i+1) % data.minPinLength)
401+ }
390 } else {
402 } else {
391− // manual confirm mode
392− tryCompare(pinPadButtonErase, "enabled", (i+1) >= data.minPinLength)
393 if (data.maxPinLength == -1) {
403 if (data.maxPinLength == -1) {
404+ // Undefined maxLength... make sure all presses are recorded
394 compare(inputField.text.length, i+1);
405 compare(inputField.text.length, i+1);
395 } else {
406 } else {
407+ // We have a max length. Make sure we're only accepting maxLength presses
396 compare(inputField.text.length, Math.min(data.maxPinLength, i+1));
408 compare(inputField.text.length, Math.min(data.maxPinLength, i+1));
397 }
409 }
398
410
411+ if (data.minPinLength == -1) {
412+ // Undefined minLength. Make sure confirm button is always enabled
413+ compare(confirmButton.enabled, true);
414+ } else {
415+ // We have a min length. Make sure the confirm button is only enabled when met.
416+ compare(confirmButton.enabled, (i+1) >= data.minPinLength);
417+ }
399 }
418 }
400 }
419 }
401 }
420 }
402
421
403 function test_retryDisplay_data() {
422 function test_retryDisplay_data() {
404 return [
423 return [
405− {tag: "empty", retryText: "", shown: false},
424+ {tag: "empty", retryText: " "},
406− {tag: "3 retries left", retryText: "3 retries left", shown: true},
425+ {tag: "3 retries left", retryText: "3 retries left"},
407 ]
426 ]
408 }
427 }
409
428
@@ -412,8 +431,8 @@ Rectangle {
412 waitForLockscreenReady();
431 waitForLockscreenReady();
413
432
414 retryCountTextField.text = data.retryText;
433 retryCountTextField.text = data.retryText;
415− var label = findChild(lockscreen, "retryCountLabel")
434+ var label = findChild(lockscreen, "retryLabel")
416− compare(label.visible, data.shown);
435+ compare(label.text, data.retryText);
417 }
436 }
418
437
419 function test_infoPopup() {
438 function test_infoPopup() {
@@ -438,8 +457,8 @@ Rectangle {
438
457
439 function test_infoTextDisplay_data() {
458 function test_infoTextDisplay_data() {
440 return [
459 return [
441− {tag: "empty string", text: "", shown: false},
460+ {tag: "empty string", text: ""},
442− {tag: "hello world", text: "hello world", shown: true},
461+ {tag: "hello world", text: "hello world"},
443 ]
462 ]
444 }
463 }
445
464
@@ -449,7 +468,7 @@ Rectangle {
449
468
450 infoTextTextField.text = data.text;
469 infoTextTextField.text = data.text;
451 var label = findChild(lockscreen, "infoTextLabel")
470 var label = findChild(lockscreen, "infoTextLabel")
452− compare(label.visible, data.shown);
471+ compare(label.text, data.text);
453 }
472 }
454 }
473 }
455
474
tests/qmltests/Panel/Indicators/tst_CachedUnityMenuModel.qmlnew file+137
@@ -0,0 +1,137 @@
1+/*
2+ * Copyright 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 Unity.Test 0.1 as UT
20+import QMenuModel 0.1
21+import Unity.Indicators 0.1 as Indicators
22+import "../../../../qml/Panel/Indicators"
23+
24+Item {
25+ id: root
26+ width: units.gu(40)
27+ height: units.gu(70)
28+
29+ Component {
30+ id: model
31+ CachedUnityMenuModel {}
32+ }
33+
34+ UT.UnityTestCase {
35+ name: "CachedUnityMenuModel"
36+ when: windowShown
37+
38+ function cleanup() {
39+ doGC();
40+ }
41+
42+ function doGC() {
43+ // need to put some wait cycles here to get gc going properly.
44+ wait(10);
45+ gc();
46+ wait(10);
47+ }
48+
49+ function test_createDifferent() {
50+ var cachedObject = model.createObject(null,
51+ {
52+ "busName": "com.canonical.test1",
53+ "menuObjectPath": "/com/canonical/test1",
54+ "actionsObjectPath": "/com/canonical/test1"
55+ });
56+
57+ var cachedObject2 = model.createObject(null,
58+ {
59+ "busName": "com.canonical.test2",
60+ "menuObjectPath": "/com/canonical/test2",
61+ "actionsObjectPath": "/com/canonical/test2"
62+ });
63+
64+ verify(cachedObject.model !== cachedObject2.model);
65+ }
66+
67+ function test_createSame() {
68+ var cachedObject = model.createObject(null,
69+ {
70+ "busName": "com.canonical.test3",
71+ "menuObjectPath": "/com/canonical/test3",
72+ "actionsObjectPath": "/com/canonical/test3"
73+ });
74+
75+ var cachedObject2 = model.createObject(null,
76+ {
77+ "busName": "com.canonical.test3",
78+ "menuObjectPath": "/com/canonical/test3",
79+ "actionsObjectPath": "/com/canonical/test3"
80+ });
81+
82+ verify(cachedObject.model === cachedObject2.model);
83+ }
84+
85+ // Tests that changing cached model data does not change the model path of others
86+ function test_lp1328646() {
87+ var cachedObject = model.createObject(null,
88+ {
89+ "busName": "com.canonical.test4",
90+ "menuObjectPath": "/com/canonical/test4",
91+ "actionsObjectPath": "/com/canonical/test4"
92+ });
93+
94+ var cachedObject2 = model.createObject(null,
95+ {
96+ "busName": "com.canonical.test4",
97+ "menuObjectPath": "/com/canonical/test4",
98+ "actionsObjectPath": "/com/canonical/test4"
99+ });
100+
101+ cachedObject.menuObjectPath = "/com/canonical/test5";
102+ compare(cachedObject.model.menuObjectPath, "/com/canonical/test5");
103+ compare(cachedObject2.model.menuObjectPath, "/com/canonical/test4");
104+
105+ verify(cachedObject.model !== cachedObject2.model);
106+ }
107+
108+ function createAndDestroy(test) {
109+ var cachedObject = model.createObject(null,
110+ {
111+ "busName": "com.canonical."+test,
112+ "menuObjectPath": "/com/canonical/"+test,
113+ "actionsObjectPath": "/com/canonical/"+test
114+ });
115+ var cachedObject2 = model.createObject(null,
116+ {
117+ "busName": "com.canonical."+test,
118+ "menuObjectPath": "/com/canonical/"+test,
119+ "actionsObjectPath": "/com/canonical/"+test
120+ });
121+ cachedObject.destroy();
122+ return cachedObject2;
123+ }
124+
125+ function test_destroyAllDeletesModel() {
126+ createAndDestroy("test6");
127+ doGC();
128+ compare(Indicators.UnityMenuModelCache.contains("/com/canonical/test6"), false);
129+ }
130+
131+ function test_destroyPartialKeepsModel() {
132+ var model = createAndDestroy("test7");
133+ doGC();
134+ compare(Indicators.UnityMenuModelCache.contains("/com/canonical/test7"), true);
135+ }
136+ }
137+}
tests/qmltests/tst_Shell.qml+32
@@ -21,6 +21,7 @@ import QtQuick 2.0
21import QtTest 1.0
21import QtTest 1.0
22import GSettings 1.0
22import GSettings 1.0
23import LightDM 0.1 as LightDM
23import LightDM 0.1 as LightDM
24+import Ubuntu.Connectivity 0.1
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
@@ -28,6 +29,7 @@ import Powerd 0.1
28import "../../qml"
29import "../../qml"
29
30
30Item {
31Item {
32+ id: root
31 width: shell.width
33 width: shell.width
32 height: shell.height
34 height: shell.height
33
35
@@ -51,6 +53,11 @@ Item {
51 id: shell
53 id: shell
52 }
54 }
53
55
56+ Component {
57+ id: shellComponent
58+ Shell {}
59+ }
60+
54 SignalSpy {
61 SignalSpy {
55 id: sessionSpy
62 id: sessionSpy
56 signalName: "sessionStarted"
63 signalName: "sessionStarted"
@@ -61,6 +68,12 @@ Item {
61 signalName: "setCurrentScopeCalled"
68 signalName: "setCurrentScopeCalled"
62 }
69 }
63
70
71+ SignalSpy {
72+ id: unlockAllModemsSpy
73+ target: Connectivity
74+ signalName: "unlockingAllModems"
75+ }
76+
64 UT.UnityTestCase {
77 UT.UnityTestCase {
65 name: "Shell"
78 name: "Shell"
66 when: windowShown
79 when: windowShown
@@ -431,5 +444,24 @@ Item {
431
444
432 touchRelease(shell);
445 touchRelease(shell);
433 }
446 }
447+
448+ function test_unlockedProperties() {
449+ // Confirm that various properties have the correct values when unlocked
450+ tryCompare(shell, "locked", false)
451+
452+ var launcher = findChild(shell, "launcher")
453+ tryCompare(launcher, "available", true)
454+
455+ var indicators = findChild(shell, "indicators")
456+ tryCompare(indicators, "available", true)
457+ }
458+
459+ function test_unlockAllModemsOnBoot() {
460+ unlockAllModemsSpy.clear()
461+ // actually create an object so we notice the onCompleted signal
462+ var greeter = shellComponent.createObject(root)
463+ tryCompare(unlockAllModemsSpy, "count", 1)
464+ greeter.destroy()
465+ }
434 }
466 }
435}
467}
tests/qmltests/tst_ShellWithPin.qml+26−11
@@ -15,6 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import Ubuntu.Components 1.0
18import QtTest 1.0
19import QtTest 1.0
19import AccountsService 0.1
20import AccountsService 0.1
20import GSettings 1.0
21import GSettings 1.0
@@ -28,7 +29,7 @@ import "../../qml"
28
29
29Item {
30Item {
30 id: root
31 id: root
31− width: shell.width
32+ width: shell.width + units.gu(20)
32 height: shell.height
33 height: shell.height
33
34
34 QtObject {
35 QtObject {
@@ -49,6 +50,20 @@ Item {
49
50
50 Shell {
51 Shell {
51 id: shell
52 id: shell
53+ maxFailedLogins: maxRetriesTextField.text
54+ }
55+ Column {
56+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom; margins:units.gu(1) }
57+ width: units.gu(18)
58+
59+ Label {
60+ text: "Max retries:"
61+ color: "black"
62+ }
63+ TextField {
64+ id: maxRetriesTextField
65+ text: "-1"
66+ }
52 }
67 }
53
68
54 SignalSpy {
69 SignalSpy {
@@ -74,7 +89,7 @@ Item {
74 function init() {
89 function init() {
75 swipeAwayGreeter()
90 swipeAwayGreeter()
76 shell.failedLoginsDelayAttempts = -1
91 shell.failedLoginsDelayAttempts = -1
77− shell.maxFailedLogins = -1
92+ maxRetriesTextField.text = "-1"
78 }
93 }
79
94
80 function cleanup() {
95 function cleanup() {
@@ -139,7 +154,7 @@ Item {
139 function test_emergencyCall() {
154 function test_emergencyCall() {
140 var greeter = findChild(shell, "greeter")
155 var greeter = findChild(shell, "greeter")
141 var lockscreen = findChild(shell, "lockscreen")
156 var lockscreen = findChild(shell, "lockscreen")
142− var emergencyButton = findChild(lockscreen, "emergencyCallIcon")
157+ var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
143 var panel = findChild(shell, "panel")
158 var panel = findChild(shell, "panel")
144 var indicators = findChild(shell, "indicators")
159 var indicators = findChild(shell, "indicators")
145 var launcher = findChild(shell, "launcher")
160 var launcher = findChild(shell, "launcher")
@@ -170,7 +185,7 @@ Item {
170
185
171 function test_emergencyCallCrash() {
186 function test_emergencyCallCrash() {
172 var lockscreen = findChild(shell, "lockscreen")
187 var lockscreen = findChild(shell, "lockscreen")
173− var emergencyButton = findChild(lockscreen, "emergencyCallIcon")
188+ var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
174 mouseClick(emergencyButton, units.gu(1), units.gu(1))
189 mouseClick(emergencyButton, units.gu(1), units.gu(1))
175
190
176 tryCompare(lockscreen, "shown", false)
191 tryCompare(lockscreen, "shown", false)
@@ -180,7 +195,7 @@ Item {
180
195
181 function test_emergencyCallAppLaunch() {
196 function test_emergencyCallAppLaunch() {
182 var lockscreen = findChild(shell, "lockscreen")
197 var lockscreen = findChild(shell, "lockscreen")
183− var emergencyButton = findChild(lockscreen, "emergencyCallIcon")
198+ var emergencyButton = findChild(lockscreen, "emergencyCallLabel")
184 mouseClick(emergencyButton, units.gu(1), units.gu(1))
199 mouseClick(emergencyButton, units.gu(1), units.gu(1))
185
200
186 tryCompare(lockscreen, "shown", false)
201 tryCompare(lockscreen, "shown", false)
@@ -201,21 +216,21 @@ Item {
201 function test_wrongEntries() {
216 function test_wrongEntries() {
202 shell.failedLoginsDelayAttempts = 3
217 shell.failedLoginsDelayAttempts = 3
203
218
204− var placeHolder = findChild(shell, "pinentryFieldPlaceHolder")
219+ var placeHolder = findChild(shell, "wrongNoticeLabel")
205− tryCompare(placeHolder, "text", "Enter your passcode")
220+ tryCompare(placeHolder, "text", "")
206
221
207 enterPin("1111")
222 enterPin("1111")
208− tryCompare(placeHolder, "text", "Incorrect passcode\nPlease re-enter")
223+ tryCompare(placeHolder, "text", "Sorry, incorrect PIN")
209
224
210 enterPin("1111")
225 enterPin("1111")
211− tryCompare(placeHolder, "text", "Incorrect passcode\nPlease re-enter")
226+ tryCompare(placeHolder, "text", "Sorry, incorrect PIN")
212
227
213 enterPin("1111")
228 enterPin("1111")
214− tryCompare(placeHolder, "text", "Too many incorrect attempts\nPlease wait")
229+ tryCompare(placeHolder, "text", "Too many incorrect attempts")
215 }
230 }
216
231
217 function test_factoryReset() {
232 function test_factoryReset() {
218− shell.maxFailedLogins = 3
233+ maxRetriesTextField.text = "3"
219 resetSpy.clear()
234 resetSpy.clear()
220
235
221 enterPin("1111")
236 enterPin("1111")