on xenial help sign in
Merge
commit499562acf73ddb9722bf829b3e62642a2a5c56e7 authorAlbert Astals Cid <albert.astals@canonical.com> dateTue 3 May 2016, 11:45 (11 years ago) parentf2f6ca37b76a57
708 files changed+66451−31866
CMakeLists.txt+15−1 CODING+2 cmake/modules/QmlTest.cmake+1−1 data/com.canonical.Unity8.gschema.xml+16 data/devices.conf+30 data/unity8-dash.conf+1 data/unity8-dash.desktop.in−1 data/unity8.conf+6−8 debian/bileto_pre_release_hook+5 debian/changelog+551 debian/control+26−19 debian/rules−12 debian/tests/autopilot.sh+13 debian/tests/control+5 debian/tests/qmluitests.sh+4−2 debian/unity8-common.udev+2 debian/unity8-doc.install+1 debian/unity8-private.install+2 debian/unity8.install+1 doc/devices.conf+45 libs/UbuntuGestures/Timer.h+5 libs/UbuntuGestures/TouchRegistry.cpp+15−10 plugins/AccountsService/AccountsService.cpp+256−280 plugins/AccountsService/AccountsService.h+48−21 plugins/AccountsService/AccountsService.qmltypes+5 plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+23−6 plugins/AccountsService/AccountsServiceDBusAdaptor.h+5−6 plugins/AccountsService/CMakeLists.txt+5 plugins/AccountsService/com.canonical.unity.AccountsService.xml+5 plugins/CMakeLists.txt+2 plugins/Cursor/Cursor.qmltypes+78 plugins/Cursor/MousePointer.cpp+4 plugins/Cursor/MousePointer.h+1 plugins/Dash/AudioProgressBar.qml+54 plugins/Dash/CMakeLists.txt+3 plugins/Dash/CardAudioProgress.qml+59 plugins/Dash/CardCreator.js+244−58 plugins/Dash/CardCreatorCache.qml+3−3 plugins/Dash/DashAudioPlayer.qml+96 plugins/Dash/ScopeStyle.qml+1−1 plugins/Dash/graphics/music_progress_bg.png plugins/Dash/listviewwithpageheader.cpp+50−20 plugins/Dash/listviewwithpageheader.h+3−1 plugins/Dash/plugin.cpp+35 plugins/Dash/qmldir+3 plugins/GlobalShortcut/GlobalShortcut.qmltypes+31 plugins/GlobalShortcut/globalshortcutregistry.cpp+4−4 plugins/IntegratedLightDM/liblightdm/CMakeLists.txt+19−3 plugins/IntegratedLightDM/liblightdm/UsersModel.cpp+4−18 plugins/IntegratedLightDM/liblightdm/UsersModel.h+1−1 plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+59−9 plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.h+15−3 plugins/Powerd/CMakeLists.txt−2 plugins/ScreenGrabber/screengrabber.cpp−2 plugins/SessionBroadcast/CMakeLists.txt+5 plugins/SessionBroadcast/SessionBroadcast.cpp+5−1 plugins/SessionBroadcast/SessionBroadcast.h+3 plugins/UInput/CMakeLists.txt+7 plugins/UInput/UInput.qmltypes+44 plugins/UInput/plugin.cpp+26 plugins/UInput/plugin.h+32 plugins/UInput/qmldir+3 plugins/UInput/uinput.cpp+182 plugins/UInput/uinput.h+61 plugins/Ubuntu/Gestures/CMakeLists.txt+1 plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+51−7 plugins/Ubuntu/Gestures/DirectionalDragArea.h+8 plugins/Ubuntu/Gestures/DirectionalDragArea_p.h+2 plugins/Ubuntu/Gestures/Gestures.qmltypes+86−45 plugins/Ubuntu/Gestures/TouchGestureArea.cpp+875 plugins/Ubuntu/Gestures/TouchGestureArea.h+229 plugins/Ubuntu/Gestures/plugin.cpp+3 plugins/Unity/DashCommunicator/dashcommunicator.cpp+6 plugins/Unity/DashCommunicator/dashcommunicator.h+1−1 plugins/Unity/Indicators/CMakeLists.txt−4 plugins/Unity/Indicators/indicatorsmanager.cpp+5−7 plugins/Unity/Indicators/modelactionrootstate.cpp+76−1 plugins/Unity/Indicators/modelactionrootstate.h+15−4 plugins/Unity/Indicators/rootstateparser.h+1 plugins/Unity/InputInfo/InputInfo.qmltypes+71 plugins/Unity/Launcher/CMakeLists.txt+2 plugins/Unity/Launcher/asadapter.cpp+6−2 plugins/Unity/Launcher/desktopfilehandler.cpp+2−2 plugins/Unity/Launcher/launcheritem.cpp+1 plugins/Unity/Launcher/launcheritem.h+1−1 plugins/Unity/Launcher/launchermodel.cpp+15−5 plugins/Unity/Launcher/launchermodel.h+1−1 plugins/Unity/Platform/Platform.qmltypes+20 plugins/Unity/Session/CMakeLists.txt+2−2 plugins/Unity/Session/dbusunitysessionservice.cpp+8−7 plugins/Utils/CMakeLists.txt+5−4 plugins/Utils/EdgeBarrierSettings.qml+1−1 plugins/Utils/HomeKeyWatcher.h−74 plugins/Utils/Utils.qmltypes+2−2 plugins/Utils/HomeKeyWatcher.cpp → plugins/Utils/WindowInputMonitor.cpp+19−12 plugins/Utils/WindowInputMonitor.h+91 plugins/Utils/deviceconfigparser.cpp+158 plugins/Utils/deviceconfigparser.h+63 plugins/Utils/globalfunctions.cpp+56 plugins/Utils/globalfunctions.h+42 plugins/Utils/inputeventgenerator.cpp+34 plugins/Utils/inputeventgenerator.h+40 plugins/Utils/plugin.cpp+17−4 plugins/Utils/timezoneFormatter.cpp+10 plugins/Utils/timezoneFormatter.h+1 plugins/Utils/windowkeysfilter.cpp → plugins/Utils/windowinputfilter.cpp+14−16 plugins/Utils/windowkeysfilter.h → plugins/Utils/windowinputfilter.h+11−11 plugins/Utils/windowstatestorage.cpp+36−4 plugins/Utils/windowstatestorage.h+3 plugins/WindowManager/CMakeLists.txt+13 plugins/WindowManager/TopLevelSurfaceList.cpp+486 plugins/WindowManager/TopLevelSurfaceList.h+223 plugins/WindowManager/WindowManagerPlugin.cpp+28 plugins/WindowManager/WindowManagerPlugin.h+32 plugins/WindowManager/qmldir+2 plugins/Wizard/CMakeLists.txt+7−1 plugins/Wizard/LocalePlugin.cpp+291 plugins/Wizard/LocalePlugin.h+58 plugins/Wizard/PageList.cpp+4−4 plugins/Wizard/Status.cpp+143 plugins/Wizard/Status.h+60 plugins/Wizard/System.cpp+5−4 plugins/Wizard/System.h+3−2 plugins/Wizard/plugin.cpp+7−8 plugins/Wizard/plugin.h+1−2 plugins/Wizard/timezonemodel.cpp+244 plugins/Wizard/timezonemodel.h+80 po/aa.po+767 po/am.po+530−266 po/ar.po+501−256 po/ast.po+532−273 po/az.po+295−206 po/be.po+524−265 po/bg.po+276−202 po/bn.po+486−268 po/br.po+536−274 po/bs.po+525−263 po/ca.po+533−271 po/ca@valencia.po+430−246 po/ce.po+276−202 po/ckb.po+276−202 po/cs.po+547−260 po/cy.po+522−260 po/da.po+523−261 po/de.po+553−271 po/el.po+550−278 po/en_AU.po+550−279 po/en_GB.po+546−275 po/eo.po+379−235 po/es.po+549−270 po/eu.po+522−263 po/fa.po+548−274 po/fi.po+547−271 po/fo.po+276−202 po/fr.po+571−278 po/ga.po+531−265 po/gd.po+575−279 po/gl.po+549−272 po/gv.po+287−207 po/he.po+443−240 po/hi.po+276−202 po/hr.po+550−266 po/hu.po+552−273 po/hy.po+291−208 po/ia.po+561−283 po/id.po+295−209 po/is.po+295−209 po/it.po+563−283 po/ja.po+312−214 po/km.po+387−240 po/kn.po+276−202 po/ko.po+529−270 po/ku.po+295−206 po/ky.po+276−202 po/lo.po+276−202 po/lt.po+276−202 po/lv.po+521−262 po/ml.po+276−202 po/mr.po+276−202 po/ms.po+524−265 po/my.po+289−205 po/nb.po+552−278 po/ne.po+276−202 po/nl.po+539−271 po/nn.po+276−202 po/oc.po+603−280 po/or.po+276−202 po/pa.po+522−263 po/pl.po+554−272 po/pt.po+562−288 po/pt_BR.po+533−274 po/ro.po+524−265 po/ru.po+530−267 po/shn.po+276−202 po/si.po+279−205 po/sk.po+621−330 po/sl.po+586−280 po/sq.po+448−245 po/sr.po+573−301 po/sv.po+555−280 po/sw.po+451−242 po/ta.po+276−202 po/te.po+276−202 po/th.po+276−202 po/tr.po+522−263 po/ug.po+503−258 po/uk.po+552−272 po/unity8.pot+274−200 po/ur.po+276−202 po/uz.po+276−202 po/vi.po+276−202 po/wo.po+522−263 po/xh.po+276−202 po/zh_CN.po+528−263 po/zh_HK.po+284−204 po/zh_TW.po+526−267 qml/Components/Dialogs.qml+8−52 qml/Components/EdgeBarrier.qml+1−1 qml/Components/EdgeBarrierController.qml+2 qml/Components/Header.qml+1 qml/Components/InputMethod.qml+5−10 qml/Components/KeymapSwitcher.qml+65 qml/Components/Lockscreen.qml+82−96 qml/Components/ModeSwitchWarningDialog.qml+1−1 qml/Components/NotificationAudio.qml+4−7 qml/Components/PanelState/PanelState.qml+2−1 qml/Components/PassphraseLockscreen.qml+5−4 qml/Components/PhysicalKeysMapper.qml+56−2 qml/Components/PinLockscreen.qml+24−2 qml/Components/PinPadButton.qml+17−2 qml/Components/ResponsiveGridView.qml+2−4 qml/Components/ShellDialog.qml+10 qml/Components/Showable.qml+10 qml/Components/UbuntuShapeForItem.qml+1 qml/Components/Unity8Settings.qml−50 qml/Components/VirtualTouchPad.qml+138 qml/Components/VolumeControl.qml+1−6 qml/Components/WindowControlButtons.qml+8−6 qml/Components/ZoomableImage.qml+1−1 qml/Dash/CardCarousel.qml−2 qml/Dash/CardGrid.qml+3−3 qml/Dash/CardHorizontalList.qml−2 qml/Dash/CardTool.qml+2−27 qml/Dash/CardVerticalJournal.qml−2 qml/Dash/Dash.qml+19−19 qml/Dash/DashBackground.qml+6−2 qml/Dash/DashContent.qml+2−2 qml/Dash/DashNavigation.qml+159−78 qml/Dash/DashNavigationButton.qml−233 qml/Dash/DashNavigationHeader.qml+73 qml/Dash/DashNavigationList.qml+33−85 qml/Dash/DashPageHeader.qml+144−130 qml/Dash/Filters/FilterOptionSelector.qml+91 qml/Dash/Filters/FilterRangeInput.qml+136 qml/Dash/Filters/FilterValueSlider.qml+87 qml/Dash/Filters/FilterWidget.qml+29 qml/Dash/Filters/FilterWidgetFactory.qml+80 qml/Dash/FiltersPopover.qml+105 qml/Dash/GenericScopeView.qml+115−101 qml/Dash/PageHeaderExtraPanel.qml+176 qml/Dash/PreviewListView.qml−140 qml/Dash/PreviewView.qml+76 qml/Dash/Previews/Preview.qml+4−5 qml/Dash/Previews/PreviewAudioPlayback.qml+21−76 qml/Dash/Previews/PreviewExpandable.qml−1 qml/Dash/Previews/PreviewHeader.qml+38−10 qml/Dash/Previews/PreviewImageGallery.qml+2−2 qml/Dash/Previews/PreviewMediaToolbar.qml+2−1 qml/Dash/Previews/PreviewOverlay.qml+1−1 qml/Dash/Previews/PreviewPayments.qml+1−3 qml/Dash/Previews/PreviewRatingDisplay.qml−1 qml/Dash/Previews/PreviewRatingEdit.qml+1−1 qml/Dash/Previews/PreviewSharing.qml+20−11 qml/Dash/Previews/PreviewVideoPlayback.qml+1−1 qml/Dash/Previews/PreviewWidget.qml−3 qml/Dash/Previews/PreviewWidgetFactory.qml−4 qml/Dash/Previews/PreviewZoomableImage.qml+3−3 qml/Dash/Previews/graphics/music_progress_bg.png qml/Dash/ScopesList.qml+1−1 qml/Dash/ScopesListCategoryItem.qml+8−4 qml/Dash/graphics/paper.png qml/Dash/graphics/paper_landscape@27.png qml/Dash/graphics/paper_portrait@27.png qml/DeviceConfiguration.qml+54−16 qml/DisabledScreenNotice.qml+98−21 qml/Greeter/CoverPage.qml+13−2 qml/Greeter/Greeter.qml+29−15 qml/Greeter/Infographics.qml+2−1 qml/Greeter/LoginList.qml+3 qml/Greeter/NarrowView.qml+14−1 qml/Greeter/WideView.qml+1−1 qml/Launcher/Launcher.qml+162−37 qml/Launcher/LauncherDelegate.qml+58−25 qml/Launcher/LauncherPanel.qml+174−83 qml/Launcher/graphics/launcher-app-focus-ring.svg+12 qml/Launcher/graphics/quicklist_tooltip@30.png qml/Notifications/Notification.qml+134−126 qml/Notifications/NotificationButton.qml+72 qml/Notifications/NotificationMenuItemFactory.qml+5−11 qml/Notifications/Notifications.qml+4−3 qml/Notifications/OptionToggle.qml+12−10 qml/Notifications/ShapedIcon.qml+1 qml/Notifications/SwipeToAct.qml+16−20 qml/Notifications/grip-large.svg−150 qml/OrientedShell.qml+87−23 qml/Panel/Handle.qml+2−2 qml/Panel/IndicatorItem.qml+60−17 qml/Panel/IndicatorItemRow.qml+5−2 qml/Panel/Indicators/MenuItemFactory.qml+50−10 qml/Panel/Indicators/ModemInfoItem.qml−111 qml/Panel/Indicators/RoamingIndication.qml−40 qml/Panel/Indicators/client/IndicatorsClient.qml+2−2 qml/Panel/IndicatorsMenu.qml+2−4 qml/Panel/MenuContent.qml+1−1 qml/Panel/Panel.qml+8−3 qml/Panel/graphics/Battery@18.png qml/Panel/graphics/Bluetooth@18.png qml/Panel/graphics/Clock@18.png qml/Panel/graphics/Location@18.png qml/Panel/graphics/Messages@18.png qml/Panel/graphics/Network@18.png qml/Panel/graphics/Sound@18.png qml/Panel/graphics/Sync@18.png qml/Panel/graphics/System@18.png qml/Panel/graphics/Time@18.png qml/Panel/graphics/VerticalDivider@18.png qml/Panel/graphics/handle@12.png qml/Panel/graphics/handle@12.sci−5 qml/Panel/graphics/search@12.png qml/Panel/graphics/time_and_date@18.png qml/ScopeTool.qml−8 qml/Shell.qml+176−119 qml/Stages/AbstractStage.qml+20−4 qml/Stages/Animations/BaseSessionAnimation.qml−96 qml/Stages/Animations/SwipeFromBottomAnimation.qml−53 qml/Stages/ApplicationWindow.qml+124−71 qml/Stages/DecoratedWindow.qml+13−6 qml/Stages/DesktopSpread.qml+86−35 qml/Stages/DesktopSpreadDelegate.qml+19−4 qml/Stages/DesktopStage.qml+273−128 qml/Stages/PhoneStage.qml+247−99 qml/Stages/PromptSurfaceAnimations.qml+81 qml/Stages/SessionContainer.qml−178 qml/Stages/SideStage.qml+118 qml/Stages/Splash.qml+11−4 qml/Stages/SpreadDelegate.qml+34−4 qml/Stages/StagedFullscreenPolicy.qml+56 qml/Stages/SurfaceContainer.qml+97−39 qml/Stages/TabletSideStageTouchGesture.qml+154 qml/Stages/TabletStage.qml+665−287 qml/Stages/TopLevelSurfaceRepeater.qml+52 qml/Stages/TransformedSpreadDelegate.qml+4−4 qml/Stages/TransformedTabletSpreadDelegate.qml+94−60 qml/Stages/WindowDecoration.qml+4−3 qml/Stages/WindowResizeArea.qml+103−21 qml/Stages/WindowedFullscreenPolicy.qml+39 qml/Stages/graphics/sidestage_drag.svg+207 qml/Stages/graphics/sidestage_open.svg+181 qml/Tutorial/Arrow.qml−56 qml/Tutorial/InactivityTimer.qml+62 qml/Tutorial/Slider.qml−123 qml/Tutorial/Tutorial.qml+39−14 qml/Tutorial/TutorialBottom.qml+86−66 qml/Tutorial/TutorialContent.qml+227−55 qml/Tutorial/TutorialLeft.qml+21−68 qml/Tutorial/TutorialLeftLong.qml+54 qml/Tutorial/TutorialPage.qml+62−186 qml/Tutorial/TutorialRight.qml+31−192 qml/Tutorial/TutorialTop.qml+61 qml/Tutorial/graphics/arrow.svg+19 qml/Tutorial/graphics/background1.png qml/Tutorial/graphics/background2.png qml/Tutorial/graphics/camera.png qml/Tutorial/graphics/chevron.png qml/Tutorial/graphics/dialer.png qml/Tutorial/graphics/facebook.png qml/Tutorial/graphics/gallery.png qml/Tutorial/graphics/tick.png qml/Wizard/CheckableSetting.qml+11−3 qml/Wizard/Page.qml+261−44 qml/Wizard/Pages.qml+75−31 qml/Wizard/Pages/10-welcome.qml+128−48 qml/Wizard/Pages/20-sim.qml−77 qml/Wizard/Pages/30-passwd-type.qml−135 qml/Wizard/Pages/30-wifi.qml+210 qml/Wizard/Pages/40-location.qml+290 qml/Wizard/Pages/40-wifi.qml−219 qml/Wizard/Pages/50-location.qml−150 qml/Wizard/Pages/50-timezone.qml+275 qml/Wizard/Pages/60-reporting.qml → qml/Wizard/Pages/60-account.qml+30−20 qml/Wizard/Pages/70-passwd-type.qml+166 qml/Wizard/Pages/75-report-check.qml+91 qml/Wizard/Pages/80-finished.qml+94−16 qml/Wizard/Pages/data/Desktop_header_bkg.png qml/Wizard/Pages/data/Desktop_splash_screen_bkg.png qml/Wizard/Pages/data/Phone_header_bkg.png qml/Wizard/Pages/data/Phone_splash_screen_bkg.png qml/Wizard/Pages/data/Tick@30.png qml/Wizard/Pages/data/meet_ubuntu_simcard@30.png qml/Wizard/Pages/data/timezonemap/map.png qml/Wizard/Pages/data/timezonemap/pin.png qml/Wizard/Pages/data/timezonemap/timezone_-1.png qml/Wizard/Pages/data/timezonemap/timezone_-10.png qml/Wizard/Pages/data/timezonemap/timezone_-11.png qml/Wizard/Pages/data/timezonemap/timezone_-2.png qml/Wizard/Pages/data/timezonemap/timezone_-3.5.png qml/Wizard/Pages/data/timezonemap/timezone_-3.png qml/Wizard/Pages/data/timezonemap/timezone_-4.5.png qml/Wizard/Pages/data/timezonemap/timezone_-4.png qml/Wizard/Pages/data/timezonemap/timezone_-5.png qml/Wizard/Pages/data/timezonemap/timezone_-6.png qml/Wizard/Pages/data/timezonemap/timezone_-7.png qml/Wizard/Pages/data/timezonemap/timezone_-8.png qml/Wizard/Pages/data/timezonemap/timezone_-9.5.png qml/Wizard/Pages/data/timezonemap/timezone_-9.png qml/Wizard/Pages/data/timezonemap/timezone_0.png qml/Wizard/Pages/data/timezonemap/timezone_1.png qml/Wizard/Pages/data/timezonemap/timezone_10.5.png qml/Wizard/Pages/data/timezonemap/timezone_10.png qml/Wizard/Pages/data/timezonemap/timezone_11.png qml/Wizard/Pages/data/timezonemap/timezone_12.75.png qml/Wizard/Pages/data/timezonemap/timezone_12.png qml/Wizard/Pages/data/timezonemap/timezone_13.png qml/Wizard/Pages/data/timezonemap/timezone_2.png qml/Wizard/Pages/data/timezonemap/timezone_3.5.png qml/Wizard/Pages/data/timezonemap/timezone_3.png qml/Wizard/Pages/data/timezonemap/timezone_4.5.png qml/Wizard/Pages/data/timezonemap/timezone_4.png qml/Wizard/Pages/data/timezonemap/timezone_5.5.png qml/Wizard/Pages/data/timezonemap/timezone_5.75.png qml/Wizard/Pages/data/timezonemap/timezone_5.png qml/Wizard/Pages/data/timezonemap/timezone_6.5.png qml/Wizard/Pages/data/timezonemap/timezone_6.png qml/Wizard/Pages/data/timezonemap/timezone_7.png qml/Wizard/Pages/data/timezonemap/timezone_8.5.png qml/Wizard/Pages/data/timezonemap/timezone_8.png qml/Wizard/Pages/data/timezonemap/timezone_9.5.png qml/Wizard/Pages/data/timezonemap/timezone_9.png qml/Wizard/Pages/here-terms.qml+71−66 qml/Wizard/Pages/passwd-confirm.qml → qml/Wizard/Pages/passcode-confirm.qml+13−30 qml/Wizard/Pages/passcode-desktop.qml+132 qml/Wizard/Pages/passwd-set.qml → qml/Wizard/Pages/passcode-set.qml+13−29 qml/Wizard/Pages/password-set.qml+149 qml/Wizard/Pages/sim.qml+108 qml/Wizard/PasswordMeter.qml+106 qml/Wizard/StackButton.qml+7−12 qml/Wizard/Wizard.qml−9 qml/Wizard/WizardTextField.qml+25 src/CMakeLists.txt+14−8 src/CachingNetworkManagerFactory.cpp+2−2 src/CachingNetworkManagerFactory.h+3−2 src/Dash/CMakeLists.txt+9−9 src/Dash/main.cpp+14−5 src/MouseTouchAdaptor.cpp+227−24 src/MouseTouchAdaptor.h+12−3 src/ShellApplication.cpp+5−5 src/ShellApplication.h+12−4 src/ShellView.cpp+6−2 src/UnityCommandLineParser.cpp+6 src/UnityCommandLineParser.h+8 src/main.cpp+5 src/qmldebuggerutils.h+33 tests/autopilot/unity8/dash.py+1−2 tests/autopilot/unity8/settings_wizard/__init__.py−555 tests/autopilot/unity8/settings_wizard/fixture_setup.py−58 tests/autopilot/unity8/settings_wizard/ofono_helper.py−116 tests/autopilot/unity8/settings_wizard/tests/__init__.py tests/autopilot/unity8/settings_wizard/tests/test_settings_wizard.py−99 tests/autopilot/unity8/shell/emulators.py−2 tests/autopilot/unity8/shell/tests/test_helpers.py−2 tests/autopilot/unity8/shell/tests/test_tutorial.py−57 tests/autopilot/unity8/tutorial.py−73 tests/libs/UbuntuGestures/tst_TouchRegistry.cpp+60−1 tests/mocks/AccountsService/AccountsService.cpp+60−3 tests/mocks/AccountsService/AccountsService.h+30−5 tests/mocks/AccountsService/AccountsService.qmltypes+5 tests/mocks/CMakeLists.txt+1 tests/mocks/Cursor/Cursor.qml+1 tests/mocks/GSettings.1.0/fake_gsettings.cpp+178−26 tests/mocks/GSettings.1.0/fake_gsettings.h+61−18 tests/mocks/IntegratedLightDM/liblightdm/UsersModel.cpp−14 tests/mocks/MeeGo/QOfono/MockOfonoSimManager.qml+1 tests/mocks/QMenuModel/QDBusActionGroup.qml+5−5 tests/mocks/QtMultimedia/CMakeLists.txt+1 tests/mocks/QtMultimedia/declarativeplaylist.cpp+73 tests/mocks/QtMultimedia/declarativeplaylist.h+54 tests/mocks/QtMultimedia/mediaplayer.cpp+17−1 tests/mocks/QtMultimedia/mediaplayer.h+9−3 tests/mocks/QtMultimedia/plugin.cpp+2 tests/mocks/UInput/CMakeLists.txt+7 tests/mocks/UInput/mockuinput.cpp+73 tests/mocks/UInput/mockuinput.h+63 tests/mocks/UInput/plugin.cpp+26 tests/mocks/UInput/plugin.h+32 tests/mocks/UInput/qmldir+2 tests/mocks/Ubuntu/Connectivity/plugin.cpp+1 tests/mocks/Ubuntu/SystemSettings/CMakeLists.txt+2 tests/mocks/Ubuntu/SystemSettings/Diagnostics/CMakeLists.txt+1 qml/Tutorial/Tick.qml → tests/mocks/Ubuntu/SystemSettings/Diagnostics/MockDiagnostics.qml+4−9 tests/mocks/Ubuntu/SystemSettings/Diagnostics/qmldir+2 tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockKeyboardPlugin.qml+21 tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockLanguagePlugin.qml+2−2 tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/qmldir+1 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/CMakeLists.txt+1−1 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.cpp+9−2 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.h+8 tests/mocks/Ubuntu/SystemSettings/TimeDate/CMakeLists.txt+1 tests/mocks/Ubuntu/SystemSettings/TimeDate/MockTimeDate.qml+25 tests/mocks/Ubuntu/SystemSettings/TimeDate/qmldir+2 tests/mocks/Unity/Application/ApplicationInfo.cpp+205−101 tests/mocks/Unity/Application/ApplicationInfo.h+48−26 tests/mocks/Unity/Application/ApplicationManager.cpp+119−97 tests/mocks/Unity/Application/ApplicationManager.h+12−22 tests/mocks/Unity/Application/ApplicationScreenshotProvider.cpp−79 tests/mocks/Unity/Application/ApplicationTestInterface.cpp−117 tests/mocks/Unity/Application/ApplicationTestInterface.h−45 tests/mocks/Unity/Application/CMakeLists.txt+3−5 tests/mocks/Unity/Application/MirSurface.cpp+253−8 tests/mocks/Unity/Application/MirSurface.h+82−9 tests/mocks/Unity/Application/MirSurfaceItem.cpp+47−12 tests/mocks/Unity/Application/MirSurfaceItem.h+16 tests/mocks/Unity/Application/MirSurfaceListModel.cpp+121 tests/mocks/Unity/Application/MirSurfaceListModel.h+56 tests/mocks/Unity/Application/ObjectListModel.h+2 tests/mocks/Unity/Application/Session.cpp−184 tests/mocks/Unity/Application/Session.h−97 tests/mocks/Unity/Application/SessionManager.cpp−55 tests/mocks/Unity/Application/SurfaceManager.cpp+79−17 tests/mocks/Unity/Application/SurfaceManager.h+47−4 tests/mocks/Unity/Application/UbuntuKeyboardInfo.cpp−2 tests/mocks/Unity/Application/UbuntuKeyboardInfo.h−9 tests/mocks/Unity/Application/plugin.cpp+35−39 tests/mocks/Unity/Application/resources/MirSurfaceItem.qml+59 tests/mocks/Unity/CMakeLists.txt+15−3 tests/mocks/Unity/Indicators/ModelActionRootState.qml+33−1 tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock.cpp+1−1 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+2 tests/mocks/Unity/Notifications/MockNotificationModel.cpp+6−11 tests/mocks/Unity/Screens/CMakeLists.txt+14 tests/mocks/Unity/Application/ApplicationScreenshotProvider.h → tests/mocks/Unity/Screens/plugin.cpp+9−14 tests/mocks/Unity/Application/SessionModel.h → tests/mocks/Unity/Screens/plugin.h+6−16 tests/mocks/Unity/Screens/qmldir+2 tests/mocks/Unity/Screens/screens.cpp+71 tests/mocks/Unity/Screens/screens.h+82 tests/mocks/Unity/Unity.qmltypes+33−50 tests/mocks/Unity/fake_categories.cpp+1−1 tests/mocks/Unity/fake_filters.cpp+125 tests/mocks/Unity/fake_filters.h+46 tests/mocks/Unity/fake_navigation.cpp+9−10 tests/mocks/Unity/fake_optionselectorfilter.cpp+65 tests/mocks/Unity/fake_optionselectorfilter.h+52 tests/mocks/Unity/fake_optionselectoroptions.cpp+77 tests/mocks/Unity/fake_optionselectoroptions.h+47 tests/mocks/Unity/fake_previewstack.cpp−68 tests/mocks/Unity/fake_previewstack.h−52 tests/mocks/Unity/fake_rangeinputfilter.cpp+167 tests/mocks/Unity/fake_rangeinputfilter.h+79 tests/mocks/Unity/fake_scope.cpp+59−29 tests/mocks/Unity/fake_scope.h+23−9 tests/mocks/Unity/fake_unity_plugin.cpp+8−2 tests/mocks/Unity/fake_valuesliderfilter.cpp+84 tests/mocks/Unity/fake_valuesliderfilter.h+55 tests/mocks/Unity/fake_valueslidervalues.cpp+51 tests/mocks/Unity/Application/SessionManager.h → tests/mocks/Unity/fake_valueslidervalues.h+11−19 tests/mocks/Utils/CMakeLists.txt+9−4 tests/mocks/Utils/Utils.qmltypes+2−2 tests/mocks/Utils/HomeKeyWatcher.qml → tests/mocks/Utils/WindowInputMonitor.qml+3−1 tests/mocks/Utils/plugin.cpp+19−3 tests/mocks/Utils/qmldir+1−1 tests/mocks/Utils/windowstatestorage.cpp+13 tests/mocks/Utils/windowstatestorage.h+4 tests/mocks/Wizard/CMakeLists.txt+6−1 tests/mocks/Wizard/MockSystem.cpp+4−2 tests/mocks/Wizard/MockSystem.h+2−2 tests/mocks/Wizard/mockplugin.cpp+7−8 tests/mocks/indicator-service/CMakeLists.txt−1 tests/plugins/AccountsService/CMakeLists.txt+12−1 tests/plugins/AccountsService/PropertiesServer.cpp+55−4 tests/plugins/AccountsService/PropertiesServer.h+9−2 tests/plugins/AccountsService/UscServer.cpp+28 tests/plugins/AccountsService/UscServer.h+39 tests/plugins/AccountsService/client.cpp+168−13 tests/plugins/AccountsService/interfaces.xml+29 tests/plugins/AccountsService/server.cpp+12 tests/plugins/AccountsService/types.h+25 tests/plugins/Dash/cardcreator/1.res+13−23 tests/plugins/Dash/cardcreator/1.res.cardcreator+112 tests/plugins/Dash/cardcreator/10.res+139 tests/plugins/Dash/cardcreator/10.res.cardcreator+137 tests/plugins/Dash/cardcreator/10.tst+3 tests/plugins/Dash/cardcreator/11.res+207 tests/plugins/Dash/cardcreator/11.res.cardcreator+203 tests/plugins/Dash/cardcreator/11.tst+3 tests/plugins/Dash/cardcreator/2.res+3−6 tests/plugins/Dash/cardcreator/2.res.cardcreator+136 tests/plugins/Dash/cardcreator/3.res+12−21 tests/plugins/Dash/cardcreator/3.res.cardcreator+130 tests/plugins/Dash/cardcreator/3.tst+1−1 tests/plugins/Dash/cardcreator/4.res+3−6 tests/plugins/Dash/cardcreator/4.res.cardcreator+109 tests/plugins/Dash/cardcreator/5.res+13−23 tests/plugins/Dash/cardcreator/5.res.cardcreator+149 tests/plugins/Dash/cardcreator/5.tst+1−1 tests/plugins/Dash/cardcreator/6.res+3−6 tests/plugins/Dash/cardcreator/6.res.cardcreator+126 tests/plugins/Dash/cardcreator/7.res+3−6 tests/plugins/Dash/cardcreator/7.res.cardcreator+149 tests/plugins/Dash/cardcreator/8.res+4−7 tests/plugins/Dash/cardcreator/8.res.cardcreator+107 tests/plugins/Dash/cardcreator/9.res+120 tests/plugins/Dash/cardcreator/9.res.cardcreator+119 tests/plugins/Dash/cardcreator/9.tst+3 tests/plugins/Dash/cardcreatortest.cpp+33−22 tests/plugins/Dash/cardcreatortest.qml+4−4 tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+15 tests/plugins/Dash/listviewwithpageheadertest.cpp+38 tests/plugins/Dash/listviewwithpageheadertest.qml−1 tests/plugins/Dash/listviewwithpageheadertestsection.qml+1−1 tests/plugins/Dash/tst_ScopeStyle.qml+1−1 tests/plugins/IntegratedLightDM/CMakeLists.txt+26 tests/plugins/IntegratedLightDM/dbus.cpp+3−5 tests/plugins/IntegratedLightDM/integrated.cpp+88 tests/plugins/IntegratedLightDM/pam.cpp+3−1 tests/plugins/Ubuntu/Gestures/CMakeLists.txt+7−1 tests/plugins/Ubuntu/Gestures/GestureTest.cpp+44 tests/plugins/Ubuntu/Gestures/GestureTest.h+13−1 tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp−56 tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.cpp+2 tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.cpp+270 tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.qml+90 tests/plugins/Unity/Indicators/CMakeLists.txt−4 tests/plugins/Unity/Launcher/CMakeLists.txt+2 tests/plugins/Unity/Launcher/launchermodeltest.cpp+10−6 tests/plugins/Unity/Session/CMakeLists.txt+2 tests/plugins/Unity/Session/sessionbackendtest.cpp+1 tests/plugins/Utils/CMakeLists.txt+8−2 tests/plugins/Utils/DeviceConfigParserTest.cpp+70 tests/plugins/Utils/HomeKeyWatcherTest.cpp → tests/plugins/Utils/WindowInputMonitorTest.cpp+14−14 tests/qmltests/CMakeLists.txt+10−4 tests/qmltests/Components/CMakeLists.txt+1−1 tests/qmltests/Components/tst_Dialogs.qml+4−2 tests/qmltests/Components/tst_DragHandle.qml+6−6 qml/Tutorial/TutorialBottomFinish.qml → tests/qmltests/Components/tst_DragHandle/SimpleButton.qml+15−20 tests/qmltests/Components/tst_LazyImage.qml+27−8 tests/qmltests/Components/tst_Lockscreen.qml+14−7 tests/qmltests/Components/tst_PhysicalKeysMapper.qml+136−62 tests/qmltests/Components/tst_ResponsiveGridView.qml−36 tests/qmltests/Components/tst_VirtualTouchPad.qml+143 tests/qmltests/Components/tst_ZoomableImage.qml+8−5 tests/qmltests/Dash/CardHelpers.js+1−1 tests/qmltests/Dash/Filters/tst_FilterOptionSelector.qml+96 tests/qmltests/Dash/Filters/tst_FilterRangeInput.qml+247 tests/qmltests/Dash/Filters/tst_FilterValueSlider.qml+101 tests/qmltests/Dash/Filters/tst_FilterWidgetFactory.qml+58 tests/qmltests/Dash/Previews/tst_Preview.qml+6−6 tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml+16−11 tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+33−1 tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+22−2 tests/qmltests/Dash/Previews/tst_PreviewMediaToolbar.qml+69 tests/qmltests/Dash/Previews/tst_PreviewSharing.qml+16−14 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+12 tests/qmltests/Dash/tst_Card.qml+40−17 tests/qmltests/Dash/tst_CardBenchmark.qml−2 tests/qmltests/Dash/tst_CardTool.qml+4−4 tests/qmltests/Dash/tst_Dash.qml+89 tests/qmltests/Dash/tst_DashContent.qml+165−152 tests/qmltests/Dash/tst_DashPageHeader.qml+24−15 tests/qmltests/Dash/tst_DashShell.qml+6−2 tests/qmltests/Dash/tst_GenericScopeView.qml+31−38 tests/qmltests/Dash/tst_PreviewListView.qml → tests/qmltests/Dash/tst_PreviewView.qml+23−16 tests/qmltests/Greeter/tst_Greeter.qml+48−5 tests/qmltests/Greeter/tst_NarrowView.qml+12−1 tests/qmltests/Greeter/tst_WideView.qml+11 tests/qmltests/Launcher/tst_Launcher.qml+299−18 tests/qmltests/Notifications/tst_Notifications.qml+53−52 tests/qmltests/Notifications/tst_OptionToggle.qml+11−2 tests/qmltests/Notifications/tst_SwipeToAct.qml+11−1 tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+16−6 tests/qmltests/Panel/IndicatorTest.qml+2−1 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+2−4 tests/qmltests/Panel/tst_ActiveCallHint.qml+3−2 tests/qmltests/Panel/tst_IndicatorItem.qml+16−17 tests/qmltests/Panel/tst_IndicatorItemRow.qml+1−2 tests/qmltests/Panel/tst_IndicatorsMenu.qml+3−4 tests/qmltests/Panel/tst_Panel.qml+4−2 tests/qmltests/Stages/ApplicationCheckBox.qml+103−58 tests/qmltests/Stages/RecursingChildSessionControl.qml+10−61 tests/qmltests/Stages/SizeHintField.qml+33 tests/qmltests/Stages/SurfaceManagerControls.qml+32 qml/Tutorial/TutorialLeftFinish.qml → tests/qmltests/Stages/SurfaceManagerField.qml+17−18 tests/qmltests/Stages/tst_ApplicationWindow.qml+73−59 tests/qmltests/Stages/tst_DesktopStage.qml+303−179 tests/qmltests/Stages/tst_PhoneStage.qml+282−79 tests/qmltests/Stages/tst_SessionContainer.qml−309 tests/qmltests/Stages/tst_SpreadDelegate.qml+10−2 tests/qmltests/Stages/tst_SurfaceContainer.qml+242−46 tests/qmltests/Stages/tst_TabletStage.qml+409−85 tests/qmltests/Stages/tst_WindowResizeArea.qml+232−30 tests/qmltests/Tutorial/tst_Tutorial.qml+628−198 tests/qmltests/Wizard/tst_Wizard.qml+141−213 tests/qmltests/tst_DeviceConfiguration.qml+49 tests/qmltests/tst_DisabledScreenNotice.qml+84−2 tests/qmltests/tst_OrientedShell.qml+326−96 tests/qmltests/tst_Shell.qml+656−190 tests/qmltests/tst_ShellWithPin.qml+28−40 tests/utils/modules/Unity/Test/CMakeLists.txt+8−1 tests/utils/modules/Unity/Test/UnityTestCase.qml+165−14 tests/utils/modules/Unity/Test/plugin.cpp+13−3
CMakeLists.txt+15−1
@@ -57,7 +57,11 @@ find_package(Qt5DBus 5.4 REQUIRED)
5757find_package(Qt5Concurrent 5.4 REQUIRED)
5858find_package(Qt5Sql 5.4 REQUIRED)
5959
60−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=12)
60+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=15)
61+pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
62+pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
63+pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
64+pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
6165
6266# Standard install paths
6367include(GNUInstallDirs)
@@ -128,6 +132,16 @@ if(NOT QUIET_LOGGER)
128132 set(STDOUT_LOGGER "-o" "-,txt")
129133endif()
130134
135+execute_process(COMMAND dpkg-architecture -qDEB_HOST_ARCH OUTPUT_VARIABLE ARCH)
136+if (NOT ARCH MATCHES "arm*")
137+ set(ENABLE_TOUCH_EMULATION true)
138+ add_definitions(-DUNITY8_ENABLE_TOUCH_EMULATION)
139+ pkg_check_modules(MOUSETOUCHADAPTOR_LIBS REQUIRED x11 xcb xi)
140+else()
141+ set(ENABLE_TOUCH_EMULATION false)
142+ message(STATUS "Touch emulation support disabled.")
143+endif()
144+
131145# add subdirectories to build
132146add_subdirectory(include)
133147add_subdirectory(libs)
CODING+2
@@ -54,6 +54,8 @@ $ ./run.sh -p OR -k
5454Notes
5555-----
5656- to navigate, utilize the mouse left button as you would your finger
57+- a three point drag (for side stage operations) can be performed by using
58+ the Shift+Control+Alt (all together) keyboard modifiers while using the mouse.
5759- to get the translations work, currently you have to do make install to
5860 put the *.mo files into correct structure. We'll look for a better solution
5961 later.
cmake/modules/QmlTest.cmake+1−1
@@ -183,7 +183,7 @@ function(add_manual_test COMPONENT_NAME TARGET)
183183 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
184184 mangle_arguments()
185185
186− bake_arguments("${QMLTEST_ARG_PREFIX}" args -qmljsdebugger=port:3768)
186+ bake_arguments("${QMLTEST_ARG_PREFIX}" args -qmljsdebugger=port:3768,3800)
187187
188188 set(qmltry_command
189189 $<TARGET_FILE:${TARGET}>
data/com.canonical.Unity8.gschema.xml+16
@@ -27,6 +27,22 @@
2727 <summary>Maximum push needed to overcome edge barrier</summary>
2828 <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
2929 </key>
30+ <key type="u" name="edge-drag-width">
31+ <default>2</default>
32+ <summary>The width of the edge drag areas</summary>
33+ <description>How big (in grid units) the edge-drag sensitive area should be.</description>
34+ </key>
35+ <key type="b" name="autohide-launcher">
36+ <default>true</default>
37+ <summary>Autohide the launcher</summary>
38+ <description>This will only be applied in windowed mode. In staged mode, the launcher will always hide.</description>
39+ </key>
40+ <key type="u" name="launcher-width">
41+ <default>8</default>
42+ <range min="6" max="12"/>
43+ <summary>Width of the launcher in grid units.</summary>
44+ <description>Changes the width of the launcher in all usage modes.</description>
45+ </key>
3046 </schema>
3147
3248 <schema path="/com/canonical/unity8/greeter/" id="com.canonical.Unity8.Greeter" gettext-domain="unity8">
data/devices.confnew file+30
@@ -0,0 +1,30 @@
1+# This file can hold multiple device configs. Devices are separated by sections.
2+#
3+# SupportedOrientations holds a list of all enabled orientations. A standard
4+# phone will usually have Portrait,Landcape,InvertedLandscape in order to
5+# disable upside down usage.
6+#
7+# PrimaryOrientation gives the orientation the device will start up with
8+# when there is no orientations sensor input available (yet) or lock to
9+# when an application specifies to be locked to PrimaryOrientation.
10+#
11+# The other Orientation settings can be used to re-map the orientations.
12+# A device might be used with different orientations than how the screen
13+# is physically mounted on the hardware.
14+#
15+# Category can be phone, tablet, or desktop. This option determines
16+# whether the side stage is shown (tablet) or not (phone). Using
17+# desktop will load the shell in windowed mode. Note that the user
18+# can override/change this by connecting input hardware or change
19+# user settings.
20+#
21+# Any options not listed will default to the values of the example below.
22+
23+# [devicename]
24+# SupportedOrientations=Portrait,InvertedPortrait,Landscape,InvertedLandscape
25+# PrimaryOrientation=PrimaryOrienation
26+# PortraitOrientation=Portrait
27+# InvertedPortraitOrientation=InvertedPortrait
28+# LandscapeOrientation=Landscape
29+# InvertedLandscapeOrientation=InvertedLandscape
30+# Category=phone
data/unity8-dash.conf+1
@@ -14,6 +14,7 @@ kill timeout 120
1414oom score 50
1515
1616respawn
17+respawn limit unlimited
1718
1819env APP_ID=unity8-dash
1920
data/unity8-dash.desktop.in−1
@@ -7,4 +7,3 @@ Terminal=false
77Icon=@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/Dash/unity8-dash.png
88NoDisplay=true
99X-Ubuntu-Touch=true
10−X-Ubuntu-Supported-Orientations=primary
data/unity8.conf+6−8
@@ -45,21 +45,19 @@ pre-start script
4545
4646 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
4747
48− initctl emit --no-wait indicator-services-start
49−
5048 # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
51− # issues (LP: #1486341). As a bonus, this eliminates most of the
52− # lag seen in the indicator panel pull-down (LP: #1488327) and also
49+ # issues (LP: #1486341, LP: #1556763). As a bonus, this eliminates most of
50+ # the lag seen in the indicator panel pull-down (LP: #1488327) and also
5351 # reduces lag seen in apps:
5452 initctl set-env --global QML_NO_TOUCH_COMPRESSION=1
55−
56− # For twice the fun and half the latency, try this (Warning: not all
57− # devices are fast enough to keep up smoothly yet)...
58− # initctl set-env MIR_SERVER_NBUFFERS=2
5953end script
6054
6155exec ${BINARY:-unity8} $ARGS
6256
57+post-start script
58+ initctl emit --no-wait indicator-services-start
59+end script
60+
6361post-stop script
6462 initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
6563 initctl unset-env --global UNITY_MIR_SOCKET
debian/bileto_pre_release_hooknew file+5
@@ -0,0 +1,5 @@
1+#!/bin/sh
2+
3+set -eux
4+
5+sh ./po/update-unity-pot
debian/changelog+551
@@ -1,3 +1,554 @@
1+unity8 (8.12+16.04.20160427.3-0ubuntu1) xenial; urgency=medium
2+
3+ [ Albert Astals Cid ]
4+ * Add env var to enable js debugging/profiling even if not built on
5+ debug mode
6+ * Better error message if the item does not exist
7+ * CardCreator: Remove ShaderEffectSource (LP: #1544875)
8+ * Compile with Qt 5.6 (LP: #1565632)
9+ * LVWPH: Account for contentHeight not really being "all" of the
10+ content height (LP: #1569976)
11+ * NotificationAudio: We don't need weird "ifdef" for multimedia 5.6 vs
12+ 5.0 roles anymore
13+ * See all/less -> Show all/less (LP: #1349471)
14+ * Stabilize test_superTabToCycleLauncher
15+ * Take into account that sectionItem height can change
16+ * Turn verify intro tryCompareFunction
17+ * forceLayout before calling positionViewAtIndex (LP: #1553475)
18+ * rootObject can be null for a small moment after setSource is called
19+ (LP: #1560501)
20+
21+ [ CI Train Bot ]
22+ * Resync trunk.
23+
24+ [ Daniel van Vugt ]
25+ * Reinstate the touch performance/smoothness fix (LP: #1486341, LP:
26+ #1556763). (LP: #1556763, #1486341)
27+
28+ [ Josh Arenson ]
29+ * Change the color of the activity pulse to blue (LP: #1568082)
30+ * Make scope filter settings button the same color as other foreground
31+ elements (LP: #1563357)
32+
33+ [ Lukáš Tinkl ]
34+ * Drop OOBE wizard autopilot tests
35+ * Fix labels in desktop spread
36+ * Fix upcoming event ETAs falling out of sync (LP: #1557571)
37+ * Hide the close button for dash (LP: #1550056, #1564347)
38+ * Notifications visual update, close button on mouse hover (LP:
39+ #1564343)
40+ * Shell visual update
41+ * Stabilize wizard tests
42+ * Unity8 windows now cascade instead of opening all in the top left
43+ corner (LP: #1513813)
44+
45+ [ Michael Terry ]
46+ * Fix some unreliable test code.
47+ * Ignore Home Key presses when the greeter is up. (LP: #1565818)
48+
49+ [ Michael Zanetti ]
50+ * Drop the rotation lock for the dash (LP: #1465331, #1574165)
51+ * improve the pin lockscreen
52+ * install devices.conf by default
53+
54+ [ Ted Gould ]
55+ * Switch to using uid/pwdent for getting username
56+
57+ -- Michael Terry <michael.terry@canonical.com> Wed, 27 Apr 2016 15:01:28 +0000
58+
59+unity8 (8.12+16.04.20160421.1-0ubuntu1) xenial; urgency=medium
60+
61+ [ Daniel d'Andrada ]
62+ * Refactor keymap switching code
63+ * Surface-based window management
64+ * Use Item.grabToImage() instead of qtmir's ApplicationScreenshot
65+ provider
66+
67+ [ Michael Zanetti ]
68+ * Fixes for programmatically closing Applications
69+
70+ [ Robert Bruce Park ]
71+ * Use new bileto_pre_release_hook
72+
73+ -- Gerry Boland <ci-train-bot@canonical.com> Thu, 21 Apr 2016 13:48:02 +0000
74+
75+unity8 (8.12+16.04.20160414.1-0ubuntu1) xenial; urgency=medium
76+
77+ [ Michael Terry ]
78+ * Make sure that usageMode is set on startup, fixing a problem with
79+ the tutorial not noticing that it is running on a desktop. (LP:
80+ #1564351)
81+
82+ [ Michael Zanetti ]
83+ * make the edge drag area width configurable (LP: #1559512)
84+
85+ -- Michael Zanetti <michael.zanetti@canonical.com> Thu, 14 Apr 2016 21:20:28 +0000
86+
87+unity8 (8.12+16.04.20160401-0ubuntu1) xenial; urgency=medium
88+
89+ * Add missing Testsuite header
90+ * Skip the failing test until we have a working solution for bug
91+ #1564571 (LP: #1564571)
92+
93+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 01 Apr 2016 08:32:16 +0000
94+
95+unity8 (8.12+16.04.20160330-0ubuntu1) xenial; urgency=medium
96+
97+ [ Albert Astals Cid ]
98+ * Use tutorialLeftLoader instead of tutorialLeft
99+
100+ [ CI Train Bot ]
101+ * Update translation template
102+
103+ [ Lukáš Tinkl ]
104+ * Fix the last chance popup colors/theme
105+
106+ [ Michael Terry ]
107+ * Adjust text for desktop right edge tutorial to be accurate. (LP:
108+ #1563103)
109+ * Fix OOBE wizard not setting your name. (LP: #1562872)
110+ * Fix showing "Retry" in password prompt when turning on screen in
111+ tablet mode.
112+
113+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 30 Mar 2016 07:46:51 +0000
114+
115+unity8 (8.12+16.04.20160323.2-0ubuntu1) xenial; urgency=medium
116+
117+ [ Michael Terry ]
118+ *
119+ * Fix setting OSK layout in OOBE wizard
120+ * Stop the left edge tutorial from being shown when the bottom edge
121+ tutorial wants to be shown after receiving a call.
122+
123+ [ Albert Astals Cid ]
124+ * Filter implementation with Option Selector filter as the only filter
125+ * Get the engine from the parent context
126+ * Implement the API changes due to filters
127+ * Match design visuals for the new dash navigation/page header popup
128+ * New Dash Navigation UX
129+ * Range Input filter
130+ * Value slider filter
131+ * Workaround SDK ListItem bug
132+
133+ [ Albert Astals Cid, Lukáš Tinkl ]
134+ * Fix various tests
135+
136+ [ CI Train Bot ]
137+ * Resync trunk.
138+ * Update translation template
139+
140+ [ Lukáš Tinkl, Michael Terry ]
141+ * New first-run wizard for the phone (part of the OOBE effort) (LP:
142+ #1536688, #1536617, #1543790, #1555222)
143+
144+ [ Lukáš Tinkl, Michał Sawicz ]
145+ * Keymap switching support (LP: #1524400, #1412492, #1491340)
146+
147+ [ Michael Terry, Michael Zanetti ]
148+ * Redesign the first-boot edge tutorial
149+
150+ [ Michael Zanetti ]
151+ * disabling some tests that are flaky in adt but can't be made fail on
152+ our machines
153+
154+ [ Michael Zanetti, Michał Sawicz ]
155+ * Change the behavior alond with the switch in indicator-display (LP:
156+ #1538591)
157+
158+ [ Michael Zanetti, Michał Sawicz, Nick Dedekind ]
159+ * Add support for low shell chrome. (LP: #1535397)
160+ * Sidestage load/unload redesign (LP: #1544479)
161+
162+ -- Michael Zanetti <michael.zanetti@canonical.com> Wed, 23 Mar 2016 09:53:17 +0000
163+
164+unity8 (8.11+16.04.20160318.1-0ubuntu1) xenial; urgency=medium
165+
166+ [ CI Train Bot ]
167+ * Update translation template
168+
169+ [ Lukáš Tinkl ]
170+ * Fix notifications with the new UITK color schemes (LP: #1554616,
171+ #1556523)
172+
173+ [ Lukáš Tinkl, Michael Zanetti, Nick Dedekind ]
174+ * more fixes for the new theme palette (LP: #1554616, #1557534)
175+
176+ -- Michael Zanetti <michael.zanetti@canonical.com> Fri, 18 Mar 2016 17:12:53 +0000
177+
178+unity8 (8.11+16.04.20160310.4-0ubuntu1) xenial; urgency=medium
179+
180+ [ Albert Astals Cid ]
181+ * Add context for Re-dock as asked by translators (LP: #1534608)
182+ * Add emblem to the preview header widget (LP: #1424720)
183+ * Add haptics to ScopesListCategoryItem buttons
184+ * Audio Cards: Make some of the image loading async (LP: #1533432)
185+ * Do not create fallback code for the card tool fake card (LP:
186+ #1545865)
187+ * Fix resizing the dash bringing temp scopes size out of sync (LP:
188+ #1543130)
189+ * Minor fixes for unity-scope-tool
190+ * Resolve title alignment on card creator time instead of on runtime
191+ * Use fixedHeaderHeight only in the non cardtool cards
192+ * Use the new undeprecated connectivityqt::Connectivity
193+ * asynchronous is only false on the fake card in cardtool
194+ * clazy fixes
195+
196+ [ Albert Astals Cid, CI Train Bot ]
197+ * click scope: Add the else branch so we reset the card size in all
198+ situations
199+
200+ [ Andrea Cimitan ]
201+ * PreviewSharing widget now accepts both string and array of
202+ widgetData["share-data"]["uri"] (LP: #1549056)
203+ * Update AP tests for new single preview
204+ * Use Text.Wrap for body notification text (LP: #1544909)
205+
206+ [ Andrea Cimitan, Lukáš Tinkl, Michael Zanetti, Nick Dedekind ]
207+ * some fixes for the new palette (LP: #1554616)
208+
209+ [ CI Train Bot ]
210+ * Resync trunk.
211+ * Update translation template
212+
213+ [ CI Train Bot, Daniel d'Andrada ]
214+ * Ensure the QML engine doesn't delete our mock MirSurfaces on its
215+ own.
216+
217+ [ Daniel d'Andrada ]
218+ * tst_Shell: Remove unused qml items
219+
220+ [ Josh Arenson ]
221+ * Allow the shell to blacklist input devices and force the OSK shown.
222+ (LP: #1542224)
223+
224+ [ Lukáš Tinkl ]
225+ * Disallow resizing windows up, past the Panel (LP: #1544766)
226+ * Elide the window title not to let it overflow into the indicators
227+ area (LP: #1535767)
228+ * Enable the PIN lockscreen to be used with a HW keyboard (LP:
229+ #1550359)
230+ * Fix tiny windows when switching stages
231+ * Provide a range of ports to QML JS Debugger
232+ * Watch for launcher item icon changes (LP: #1543290)
233+
234+ [ Michael Terry ]
235+ * Proxy more mouse and touchpad properties to USC (LP: #1540398) (LP:
236+ #1543344, #1540398)
237+ * Refactor the AccountsService plugin and make it slightly faster.
238+ * To let the user log in if a mouse is connected, hide the greeter
239+ cover page on a mouse click (but NOT a touch click). (LP: #1540497)
240+ * Watch AccountsService for changes to the user's real name. This was
241+ preventing us from noticing when the user set their name in the
242+ welcome wizard.
243+
244+ [ Michael Zanetti ]
245+ * Allow alt+tabbing in staged mode too (LP: #1540502)
246+ * Allow invoking the staged mode spreads by mouse right edge pushes
247+ too (LP: #1540392)
248+ * Allow loading the device configuration from an external file
249+ * Implement Launcher's keyboard navigation and updated pip design
250+ * Make launcher scalable, allow it locking (LP: #1511015)
251+ * Properly parent launcher items in all cases (LP: #1495732)
252+ * Read inputMethod surface from the new property int QtMir (LP:
253+ #1545286)
254+ * Some visual updates and rotation lock for the virtual touchpad (LP:
255+ #1549087)
256+ * Visual updates for the windowed spread (LP: #1488148)
257+ * stabilize swipeAwayGreeter()
258+
259+ [ Michał Sawicz ]
260+ * Add udev rules to make sure we have access to uinput
261+ * Make dash respawn indefinitely (LP: #1550056)
262+ * Use dpkg-architecture, not arch, to disable touch emulation
263+
264+ [ Vesa Rautiainen ]
265+ * Fixing the vertical position of desktop spread item icon.
266+
267+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 10 Mar 2016 22:44:16 +0000
268+
269+unity8 (8.11+16.04.20160308-0ubuntu1) xenial; urgency=medium
270+
271+ [ Albert Astals Cid ]
272+ * Make these tests pass with the new SDK
273+
274+ [ Andrea Cimitan, Nick Dedekind ]
275+ * replace selected.backgroundText with normal.backgroundText in
276+ Splash, Notifications, Wizard
277+
278+ [ CI Train Bot ]
279+ * Update translation template
280+
281+ [ Michał Sawicz, Nick Dedekind ]
282+ * Fixed colours palette value set. Moved ModemItem to USC.
283+
284+ [ Michał Sawicz, Tim Peeters ]
285+ * Update headers for Dash and Splash to work properly with the new UI
286+ toolkit release.
287+
288+ [ Zoltán Balogh, Zsombor Egri ]
289+ * Use SuruDark theme instead of the deprecated SuruGradient.
290+
291+ -- Zoltan Balogh <zoltan.balogh@canonical.com> Tue, 08 Mar 2016 20:59:34 +0000
292+
293+unity8 (8.11+16.04.20160307-0ubuntu1) xenial; urgency=medium
294+
295+ [ CI Train Bot ]
296+ * Resync trunk.
297+ * Update translation template
298+
299+ [ Rodney Dawes ]
300+ * Re-enable the purchaseCancelled signal.
301+
302+ -- Rodney Dawes <ci-train-bot@canonical.com> Mon, 07 Mar 2016 14:12:08 +0000
303+
304+unity8 (8.11+16.04.20160301-0ubuntu1) xenial; urgency=medium
305+
306+ [ Albert Astals Cid ]
307+ * Hook the new scope.activationInProgress property (LP: #1537132)
308+
309+ [ Andrea Cimitan ]
310+ * Updated the Preview view to use a single PreviewModel instead old
311+ PreviewStack, using a Loader instead ListView (LP: #1541967)
312+
313+ [ CI Train Bot ]
314+ * Resync trunk.
315+ * Update translation template
316+
317+ [ Michał Sawicz ]
318+ * Add autopilot as DEP-8 tests added: debian/tests/autopilot.sh
319+
320+ -- Pawel Stolowski <ci-train-bot@canonical.com> Tue, 01 Mar 2016 10:28:52 +0000
321+
322+unity8 (8.11+16.04.20160216.1-0ubuntu1) xenial; urgency=medium
323+
324+ [ Albert Astals Cid ]
325+ * Make the audio previews create a playlist (LP: #1540477)
326+
327+ [ CI Train Bot ]
328+ * Resync trunk. added: po/aa.po
329+ * Update translation template
330+
331+ -- Pawel Stolowski <ci-train-bot@canonical.com> Tue, 16 Feb 2016 03:24:46 +0000
332+
333+unity8 (8.11+16.04.20160212-0ubuntu1) xenial; urgency=medium
334+
335+ [ Albert Astals Cid ]
336+ * Do not use components in card creator generated code
337+ * Forward the makesurevisible signal from the inner preview widget
338+ * Make fallback also be fallback when the image is empty and not only
339+ on error (LP: #1531913)
340+ * Make the artShapeSize assignment be updated when using dynamic grid
341+ units
342+ * Visual improvements to the dash audio play cards
343+ * We don't use the unity-scope-scopes anymore (LP: #1439172)
344+
345+ [ Andrea Cimitan ]
346+ * only request a bigger image if zoomable widget data property is
347+ true, otherwise just leave the screen size (LP: #1536814)
348+
349+ [ CI Train Bot ]
350+ * Update translation template
351+
352+ [ Daniel d'Andrada ]
353+ * Set initial surface size (LP: #1532974)
354+
355+ [ Daniel d'Andrada, Michał Sawicz ]
356+ * Window Size Hints
357+
358+ [ Florian Boucault ]
359+ * Splash screen: delay showing the ActivityIndicator by 2 seconds.
360+
361+ [ Lukáš Tinkl ]
362+ * Replace the word "phone" with a more generic term "device" in the
363+ welcome wizard (LP: #1294732, #1543527)
364+
365+ [ Michael Terry ]
366+ * Have the tablet greeter set appropriate OSK hints if the user has a
367+ passcode instead of a passphrase. (LP: #1544173)
368+
369+ [ Michael Zanetti ]
370+ * Don't eat mouse events in the edgebarrer
371+
372+ [ Michał Sawicz ]
373+ * Bump unity-api dependencies
374+
375+ [ Nick Dedekind ]
376+ * Added support for secondary indicator actions (LP: #1398888)
377+ * Remove zombie if they're not animated. (LP: #1534541)
378+ * Removed unused panel resources
379+
380+ [ Ted Gould ]
381+ * Start the indicators after Unity8 starts instead of before
382+
383+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 12 Feb 2016 00:12:41 +0000
384+
385+unity8 (8.11+16.04.20160208-0ubuntu1) xenial; urgency=medium
386+
387+ [ Albert Astals Cid ]
388+ * LVWPH: Reset to initial values when list is empty (LP: #1540490)
389+ * Make LazyImage qmltest less flaky on CI
390+
391+ [ Andrea Cimitan ]
392+ * Make LazyImage qmltest less flaky on CI
393+
394+ [ CI Train Bot ]
395+ * Resync trunk.
396+ * Update translation template
397+
398+ [ Michael Terry ]
399+ * Display the current user's real name on the tablet lockscreen. (LP:
400+ #1536714)
401+
402+ -- Michał Sawicz <michal.sawicz@canonical.com> Mon, 08 Feb 2016 09:38:00 +0000
403+
404+unity8 (8.11+16.04.20160129-0ubuntu1) xenial; urgency=medium
405+
406+ [ Albert Astals Cid ]
407+ * Audio Preview Button: Don't gain focus on press (LP: #1517830)
408+ * Better attempt at sanitization
409+ * Better looking application scopes for wide screens
410+ * Call printSettings correctly
411+ * Card test: Limit the precision we ask for doubles to be equal
412+ * Convert while into tryCompareFunction
413+ * Do not use the same filepath parameter for all the card creator
414+ createQmlObject calls (LP: #1536379)
415+ * Fix some test shells being unstable in the armhf builders
416+ * Make revealByEdgePush more stable
417+ * More reliable compares
418+ * Move the mouse over the bfb before waiting for rendering
419+ * Remove the DDAs constrains for every test
420+ * Set the background source size to the max we'll need + new
421+ background (LP: #1539011)
422+
423+ [ Andrea Cimitan ]
424+ * Dynamically change click scope card size according to size (LP:
425+ #1536745)
426+ * Should fix lazyimage test failures on fast machines
427+
428+ [ CI Train Bot ]
429+ * Fix card tests on the phone
430+ * Update translation template
431+
432+ [ Daniel d'Andrada ]
433+ * Desktop stage rotates only to follow screen orientation (LP:
434+ #1515977)
435+
436+ [ Lukáš Tinkl ]
437+ * Hide/reveal the mouse pointer on touch/mouse events renamed:
438+ plugins/Utils/HomeKeyWatcher.cpp =>
439+ plugins/Utils/WindowInputMonitor.cpp plugins/Utils/HomeKeyWatcher.h
440+ => plugins/Utils/WindowInputMonitor.h
441+ tests/mocks/Utils/HomeKeyWatcher.qml =>
442+ tests/mocks/Utils/WindowInputMonitor.qml
443+ tests/plugins/Utils/HomeKeyWatcherTest.cpp =>
444+ tests/plugins/Utils/WindowInputMonitorTest.cpp
445+
446+ [ Michael Terry ]
447+ * Synchronize the mouse-cursor-speed and touchpad-cursor-speed
448+ properties with USC. (LP: #1536383)
449+
450+ [ Michael Zanetti ]
451+ * Add InputMethod to secondary screen
452+ * Add a virtual Touchpad while external screen is connected
453+ * Make big tablets switch to windowed mode by plugging a kbd only (LP:
454+ #1535399)
455+ * Prevent alt key presses from being dispatched to the app on alt+tab
456+ (LP: #1532862)
457+
458+ [ Michał Sawicz ]
459+ * Make qmluitests.sh more robust and allow parallel test execution
460+ * Skip SessionBackendTest::testLogin1Capabilities until we talk to a
461+ mock instead (LP: #1532112, #1532113)
462+
463+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 29 Jan 2016 11:53:27 +0000
464+
465+unity8 (8.11+16.04.20160122-0ubuntu1) xenial; urgency=medium
466+
467+ [ Albert Astals Cid ]
468+ * Fix bug #1536296 added: tests/plugins/Dash/cardcreator/10.tst (LP:
469+ #1536296)
470+ * Fix card tests on the phone
471+
472+ [ CI Train Bot ]
473+ * Update translation template
474+
475+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 22 Jan 2016 16:56:04 +0000
476+
477+unity8 (8.11+16.04.20160111.1-0ubuntu1) xenial; urgency=medium
478+
479+ [ Albert Astals Cid ]
480+ * Clear fake item icon name as soon as it goes invisible (LP:
481+ #1531172)
482+ * Fix LVWPH test failing on Xenial (Qt 5.5)
483+ * Fix dragging so that test passes on Xenial
484+ * Fix focus on the dash page header text field with new SDK (LP:
485+ #1528178)
486+ * Make the card creator test pass again
487+ * Quit the dash communicator thread before destroying it (LP:
488+ #1508485)
489+ * Remove duplicated override_dh_auto_clean
490+ * SDK changed the name they give to the buttons, follow
491+
492+ [ Andrea Cimitan ]
493+ * Fix a broken binding
494+
495+ [ CI Train Bot ]
496+ * Resync trunk.
497+ * Update translation template
498+
499+ [ Daniel d'Andrada ]
500+ * Have "make tryFoo" work with Qt 5.5
501+ * Make DragHandle tests run again.
502+
503+ [ Lukáš Tinkl ]
504+ * Fix dismissing the launcher when clicking/tapping outside (LP:
505+ #1531339, #1530940)
506+ * Fix panel drop shadow and click-to-focus of maximized apps (LP:
507+ #1531854)
508+ * Fix wifi access point indicator items signal strength icon on
509+ desktop
510+
511+ [ Michael Terry ]
512+ * Guard against a couple odd timing scenarios for the too-many-failed-
513+ login-attempts lockout screen.
514+ * Skip the wizard's password screens if there is already a password
515+ set by other means. (LP: #1531268)
516+ * Stop the emergency dialer from accidentally exposing the mtp
517+ service. (LP: #1525981)
518+
519+ [ Michael Zanetti ]
520+ * Make sure the triangle of the quicklist is in bounds (LP: #1531340)
521+
522+ [ Pawel Stolowski ]
523+ * Changes 'shareData' and 'contentType' attributes to 'share-data' and
524+ 'content-type', to match existing naming schema.
525+
526+ -- Michał Sawicz <michal.sawicz@canonical.com> Mon, 11 Jan 2016 17:38:49 +0000
527+
528+unity8 (8.11+16.04.20160107-0ubuntu1) xenial; urgency=medium
529+
530+ [ Albert Astals Cid ]
531+ * Introduce audio cards
532+
533+ [ CI Train Bot ]
534+ * Update translation template
535+
536+ [ Michael Zanetti ]
537+ * Introduce audio cards
538+
539+ -- CI Train Bot <ci-train-bot@canonical.com> Thu, 07 Jan 2016 08:04:47 +0000
540+
541+unity8 (8.11+16.04.20160105.1-0ubuntu1) xenial; urgency=medium
542+
543+ [ CI Train Bot ]
544+ * Resync trunk.
545+ * Update translation template
546+
547+ [ Nick Dedekind ]
548+ * Use volume-sync action to resync the volume control. (LP: #1520548)
549+
550+ -- Xavi Garcia <xavi.garcia.mena@canonical.com> Tue, 05 Jan 2016 13:55:38 +0000
551+
1552unity8 (8.11+16.04.20151208.1-0ubuntu1) xenial; urgency=medium
2553
3554 [ Albert Astals Cid ]
debian/control+26−19
@@ -8,13 +8,14 @@ Build-Depends: cmake,
88 doxyqml,
99# To allow cross-compiling to work, we also must append :native
1010# to g++ so we don't try to run armhf g++
11−# on an x86 CPU for eaxmple, when cross-compiling.
11+# on an x86 CPU for example, when cross-compiling.
1212 g++:native,
1313 libandroid-properties-dev,
1414 graphviz,
1515 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
16− libconnectivity-qt1-dev,
16+ libconnectivity-qt1-dev (>= 0.7.1),
1717 libevdev-dev,
18+ libgeonames-dev (>= 0.2),
1819 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
1920 libgl1-mesa-dri,
2021 libgles2-mesa-dev[armhf],
@@ -29,9 +30,13 @@ Build-Depends: cmake,
2930 libqt5xmlpatterns5-dev,
3031 libsystemsettings-dev,
3132 libudev-dev,
32− libunity-api-dev (>= 7.104),
33+ libunity-api-dev (>= 7.110),
3334 libusermetricsoutput1-dev,
34− libxcb1-dev,
35+# Need those X11 libs touch emulation from mouse events in manual QML tests on a X11 desktop
36+ libx11-dev[!armhf],
37+ libxcb1-dev[!armhf],
38+ libxi-dev[!armhf],
39+# End of X11 libs
3540 pkg-config,
3641 python3-all:any,
3742 python3-setuptools,
@@ -48,10 +53,10 @@ Build-Depends: cmake,
4853 qtdeclarative5-dev (>= 5.4),
4954 qtdeclarative5-dev-tools,
5055 qtdeclarative5-private-dev (>= 5.4),
51− qtdeclarative5-qtmultimedia-plugin,
56+ qtdeclarative5-qtmultimedia-plugin (>= 5.4.1-1ubuntu19~overlay2),
5257 qtdeclarative5-ubuntu-content1,
53− qtdeclarative5-ubuntu-settings-components (>= 0.6),
54− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1676) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1676),
58+ qtdeclarative5-ubuntu-settings-components (>= 0.7),
59+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
5560 qtdeclarative5-ubuntu-web-plugin,
5661 ttf-ubuntu-font-family,
5762Standards-Version: 3.9.4
@@ -61,12 +66,13 @@ Homepage: http://launchpad.net/unity
6166# and sync up the code again.
6267Vcs-Bzr: https://code.launchpad.net/unity8
6368Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
69+XS-Testsuite: autopkgtest
6470X-Ubuntu-Use-Langpack: yes
6571
6672Package: indicators-client
6773Architecture: amd64 armhf i386
6874Depends: qmenumodel-qml (>= 0.2.9),
69− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1627) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1627),
75+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
7076 unity8 (= ${binary:Version}),
7177 ${misc:Depends},
7278 ${shlibs:Depends},
@@ -97,8 +103,7 @@ Depends: dmz-cursor-theme,
97103 qml-module-qt-labs-folderlistmodel,
98104 qml-module-qtquick-xmllistmodel,
99105 qml-module-qtsysteminfo,
100− qtdeclarative5-gsettings1.0,
101− qtdeclarative5-qtmir-plugin (>= 0.4.5),
106+ qtdeclarative5-qtmir-plugin (>= 0.4.8),
102107 qtdeclarative5-ubuntu-telephony0.1,
103108 qtdeclarative5-ubuntu-web-plugin,
104109 ubuntu-system-settings,
@@ -108,9 +113,9 @@ Depends: dmz-cursor-theme,
108113 unity8-private | unity-launcher-impl,
109114 ${misc:Depends},
110115 ${shlibs:Depends},
111−Recommends: unity-scope-click,
116+Recommends: indicator-session,
117+ unity-scope-click,
112118 unity-scope-mediascanner2,
113− unity-scope-scopes,
114119Breaks: indicator-network (<< 0.5.1+14.10.20141014),
115120 ubuntu-touch-session (<< 0.107),
116121 unity8-greeter (<< 7.89),
@@ -123,15 +128,15 @@ Description: Unity 8 shell
123128Package: unity8-common
124129Architecture: all
125130Depends: qml-module-qtquick-layouts,
126− qtdeclarative5-ubuntu-settings-components (>= 0.6),
131+ qtdeclarative5-ubuntu-settings-components (>= 0.7),
127132 qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
128− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1627) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1627),
133+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
129134 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
130135 ubuntu-thumbnailer-impl-0,
131− unity-application-impl-12,
136+ unity-application-impl-15,
132137 unity-notifications-impl-3,
133138 unity-plugin-scopes | unity-scopes-impl,
134− unity-scopes-impl-7,
139+ unity-scopes-impl-11,
135140 unity8-fake-env | unity-application-impl,
136141 ${misc:Depends},
137142Breaks: unity8 (<< 7.86),
@@ -155,7 +160,7 @@ Depends: autopilot-qt5 (>= 1.4),
155160 python3-fixtures,
156161 python3-gi,
157162 qttestability-autopilot (>= 1.4),
158− ubuntu-ui-toolkit-autopilot (>= 1.2.1485+15.04.20150417.1-0ubuntu1),
163+ ubuntu-ui-toolkit-autopilot (>= 1.3.1845),
159164 unity-scope-click,
160165 unity8 (= ${source:Version}),
161166 unity8-fake-env (= ${source:Version}),
@@ -174,7 +179,7 @@ Pre-Depends: ${misc:Pre-Depends},
174179Depends: ${misc:Depends},
175180 ${shlibs:Depends},
176181Provides: unity-application-impl,
177− unity-application-impl-12,
182+ unity-application-impl-15,
178183Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1)
179184Description: Fake environment for running Unity 8 shell
180185 Provides fake implementations of some QML modules used by Unity 8 shell
@@ -184,11 +189,13 @@ Package: unity8-private
184189Architecture: any
185190Multi-Arch: same
186191Pre-Depends: ${misc:Pre-Depends},
187−Depends: accountsservice-ubuntu-schemas (>= 0.0.3),
192+Depends: accountsservice-ubuntu-schemas (>= 0.0.5),
188193 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
189194 libhardware2,
190195 pay-service,
191196 unity-schemas (>= 7.3.1+14.10.20140915),
197+ qtdeclarative5-gsettings1.0,
198+ qml-module-qtmultimedia,
192199 ${misc:Depends},
193200 ${shlibs:Depends},
194201Provides: unity-launcher-impl,
debian/rules−12
@@ -11,10 +11,6 @@ export NO_PNG_PKG_MANGLE=1
1111%:
1212 dh $@ --parallel --fail-missing --with python3
1313
14−override_dh_auto_clean:
15− dh_auto_clean
16− rm -rf builddir
17−
1814override_dh_auto_configure:
1915 # Debian defines CMAKE_INSTALL_LOCALSTATEDIR as /usr/var, which is wrong.
2016 # So until Debian bug 719148 is fixed, do it ourselves.
@@ -40,11 +36,3 @@ override_dh_makeshlibs:
4036# libMockLightDM-qml.so links against liblightdm-qt5-2.so which doesn't exist
4137override_dh_shlibdeps:
4238 dh_shlibdeps -XlibMockLightDM-qml.so
43−
44−override_dh_auto_clean:
45− dh_auto_clean
46− # only run under "CI Train"
47− if [ -n "$(SILONAME)" -a -x /usr/bin/bzr ]; then \
48− ./po/update-unity-pot; \
49− bzr commit --message "Update translation template" po/unity8.pot; \
50− fi
debian/tests/autopilot.shnew file+13
@@ -0,0 +1,13 @@
1+#!/bin/sh
2+
3+# log all commands and abort on error
4+set -xe
5+
6+if [ ! -f /system/build.prop ]; then
7+ echo "WARNING: Skipping autopilot test, will only run on devices at the moment."
8+ exit 0
9+fi
10+
11+initctl --session stop unity8
12+autopilot3 run --verbose --format xml --output "${ADT_ARTIFACTS}/unity8.xml" unity8
13+initctl --session start unity8
debian/tests/control+5
@@ -3,3 +3,8 @@ Restrictions: allow-stderr
33Depends: @,
44 @builddeps@,
55 xvfb,
6+
7+Tests: autopilot.sh
8+Restrictions: allow-stderr,
9+ isolation-machine,
10+Depends: unity8-autopilot,
debian/tests/qmluitests.sh+4−2
@@ -1,5 +1,8 @@
11#!/bin/sh
22
3+# log all commands and abort on error
4+set -xe
5+
36SHELL_QML_PATH=$(pkg-config --variable=plugindir unity-shell-api)
47UNITY_SOURCE_DIR=$(readlink -f $(dirname $(readlink -f $0))/../..)
58
@@ -15,5 +18,4 @@ dh_auto_build --parallel -- -C tests/utils
1518
1619export UNITY_SOURCE_DIR
1720
18−# FIXME: --parallel here causes some failures
19−dh_auto_build -- -k xvfballtests
21+dh_auto_build --parallel -- -k xvfballtests
debian/unity8-common.udevnew file+2
@@ -0,0 +1,2 @@
1+# Make local foreground session able to inject input
2+KERNEL=="uinput", SUBSYSTEM=="misc", TAG+="uaccess"
debian/unity8-doc.install+1
@@ -1 +1,2 @@
1+doc/devices.conf usr/share/doc/unity8/
12usr/share/doc/unity8/*
debian/unity8-private.install+2
@@ -12,7 +12,9 @@ usr/lib/*/unity8/qml/ScreenGrabber
1212usr/lib/*/unity8/qml/SessionBroadcast
1313usr/lib/*/unity8/qml/Ubuntu
1414usr/lib/*/unity8/qml/Unity
15+usr/lib/*/unity8/qml/UInput
1516usr/lib/*/unity8/qml/Utils
17+usr/lib/*/unity8/qml/WindowManager
1618usr/lib/*/unity8/qml/Wizard
1719usr/share/accountsservice/interfaces
1820usr/share/dbus-1/interfaces
debian/unity8.install+1
@@ -2,6 +2,7 @@ var/lib/unity8/version
22data/unity8-dash.conf usr/share/upstart/sessions/
33data/unity8-filewatcher.conf usr/share/upstart/sessions/
44data/unity8.conf usr/share/upstart/sessions/
5+data/devices.conf etc/ubuntu/
56usr/bin/unity8
67usr/bin/unity8-dash
78usr/share/applications/unity8-dash.desktop
doc/devices.confnew file+45
@@ -0,0 +1,45 @@
1+# This file can hold multiple device configs. Devices are separated by sections.
2+#
3+# SupportedOrientations holds a list of all enabled orientations. A standard
4+# phone will usually have Portrait,Landcape,InvertedLandscape in order to
5+# disable upside down usage.
6+#
7+# PrimaryOrientation gives the orientation the device will start up with
8+# when there is no orientations sensor input available (yet) or lock to
9+# when an application specifies to be locked to PrimaryOrientation.
10+#
11+# The other Orientation settings can be used to re-map the orientations.
12+# A device might be used with different orientations than how the screen
13+# is physically mounted on the hardware.
14+#
15+# Category can be phone, tablet, or desktop. This option determines
16+# whether the side stage is shown (tablet) or not (phone). Using
17+# desktop will load the shell in windowed mode. Note that the user
18+# can override/change this by connecting input hardware or change
19+# user settings.
20+#
21+# Any options not listed will default to the values of the example below.
22+
23+[devicename]
24+SupportedOrientations=Portrait,InvertedPortrait,Landscape,InvertedLandscape
25+PrimaryOrientation=PrimaryOrienation
26+PortraitOrientation=Portrait
27+InvertedPortraitOrientation=InvertedPortrait
28+LandscapeOrientation=Landscape
29+InvertedLandscapeOrientation=InvertedLandscape
30+Category=phone
31+
32+# Example for the Nexus 7
33+# This device has the screen mounted in portrait, but we run it as a landscape
34+# device and we want the side stage on it.
35+[flo]
36+PrimaryOrientation=LandscapeOrienation
37+Category=tablet
38+
39+# Example for the Nexus 4
40+# The screen is already mounted the way we want it, so no special config
41+# required. However, we don't want the phone to rotate upside down, so lets
42+# restrict that.
43+[mako]
44+SupportedOrientations=Portrait,Landscape,InvertedLandscape
45+Category=phone
libs/UbuntuGestures/Timer.h+5
@@ -35,6 +35,11 @@ public:
3535 virtual int interval() const = 0;
3636 virtual void setInterval(int msecs) = 0;
3737 virtual void start() { m_isRunning = true; }
38+ virtual void start(int msecs)
39+ {
40+ setInterval(msecs);
41+ start();
42+ }
3843 virtual void stop() { m_isRunning = false; }
3944 bool isRunning() const { return m_isRunning; }
4045 virtual bool isSingleShot() const = 0;
libs/UbuntuGestures/TouchRegistry.cpp+15−10
@@ -359,10 +359,6 @@ void TouchRegistry::removeCandidateOwnerForTouchByIndex(Pool<TouchRegistry::Touc
359359
360360void TouchRegistry::requestTouchOwnership(int id, QQuickItem *candidate)
361361{
362− #if TOUCHREGISTRY_DEBUG
363− UG_DEBUG << "requestTouchOwnership id " << id << "candidate" << candidate;
364− #endif
365−
366362 Pool<TouchInfo>::Iterator touchInfo = findTouchInfo(id);
367363 if (!touchInfo) { qFatal("TouchRegistry: Failed to find TouchInfo"); }
368364
@@ -379,6 +375,9 @@ void TouchRegistry::requestTouchOwnership(int id, QQuickItem *candidate)
379375 break;
380376 }
381377 }
378+ #if TOUCHREGISTRY_DEBUG
379+ UG_DEBUG << "requestTouchOwnership id " << id << "candidate" << candidate << "index: " << candidateIndex;
380+ #endif
382381
383382 // add it as a candidate if not present yet
384383 if (candidateIndex < 0) {
@@ -533,16 +532,22 @@ void TouchRegistry::TouchInfo::notifyCandidatesOfOwnershipResolution()
533532 << " gained) to candidate" << candidates[0].item;
534533 #endif
535534
536− TouchOwnershipEvent gainedOwnershipEvent(id, true /*gained*/);
537− QCoreApplication::sendEvent(candidates[0].item, &gainedOwnershipEvent);
535+ // need to take a copy of the item list in case
536+ // we call back in to remove candidate during the lost ownership event.
537+ QList<QPointer<QQuickItem>> items;
538+ Q_FOREACH(const CandidateInfo& info, candidates) {
539+ items << info.item;
540+ }
538541
542+ TouchOwnershipEvent gainedOwnershipEvent(id, true /*gained*/);
543+ QCoreApplication::sendEvent(items[0], &gainedOwnershipEvent);
539544
540545 TouchOwnershipEvent lostOwnershipEvent(id, false /*gained*/);
541− for (int i = 1; i < candidates.count(); ++i) {
546+ for (int i = 1; i < items.count(); ++i) {
542547 #if TOUCHREGISTRY_DEBUG
543− UG_DEBUG << "sending TouchWonershipEvent(id =" << id << " lost) to candidate"
544− << candidates[i].item;
548+ UG_DEBUG << "sending TouchOwnershipEvent(id =" << id << " lost) to candidate"
549+ << items[i];
545550 #endif
546− QCoreApplication::sendEvent(candidates[i].item, &lostOwnershipEvent);
551+ QCoreApplication::sendEvent(items[i], &lostOwnershipEvent);
547552 }
548553}
plugins/AccountsService/AccountsService.cpp+256−280
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,33 +12,123 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#include "AccountsService.h"
2018#include "AccountsServiceDBusAdaptor.h"
2119
20+#include <QDBusInterface>
2221#include <QFile>
2322#include <QStringList>
2423#include <QDebug>
2524
25+#include <glib.h>
26+
27+#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
28+#define IFACE_LOCATION_HERE QStringLiteral("com.ubuntu.location.providers.here.AccountsService")
29+#define IFACE_UBUNTU_INPUT QStringLiteral("com.ubuntu.AccountsService.Input")
30+#define IFACE_UBUNTU_SECURITY QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy")
31+#define IFACE_UBUNTU_SECURITY_OLD QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy")
32+#define IFACE_UNITY QStringLiteral("com.canonical.unity.AccountsService")
33+#define IFACE_UNITY_PRIVATE QStringLiteral("com.canonical.unity.AccountsService.Private")
34+
35+#define PROP_BACKGROUND_FILE QStringLiteral("BackgroundFile")
36+#define PROP_DEMO_EDGES QStringLiteral("demo-edges")
37+#define PROP_DEMO_EDGES_COMPLETED QStringLiteral("DemoEdgesCompleted")
38+#define PROP_EMAIL QStringLiteral("Email")
39+#define PROP_ENABLE_INDICATORS_WHILE_LOCKED QStringLiteral("EnableIndicatorsWhileLocked")
40+#define PROP_ENABLE_LAUNCHER_WHILE_LOCKED QStringLiteral("EnableLauncherWhileLocked")
41+#define PROP_FAILED_LOGINS QStringLiteral("FailedLogins")
42+#define PROP_INPUT_SOURCES QStringLiteral("InputSources")
43+#define PROP_LICENSE_ACCEPTED QStringLiteral("LicenseAccepted")
44+#define PROP_LICENSE_BASE_PATH QStringLiteral("LicenseBasePath")
45+#define PROP_MOUSE_CURSOR_SPEED QStringLiteral("MouseCursorSpeed")
46+#define PROP_MOUSE_DOUBLE_CLICK_SPEED QStringLiteral("MouseDoubleClickSpeed")
47+#define PROP_MOUSE_PRIMARY_BUTTON QStringLiteral("MousePrimaryButton")
48+#define PROP_MOUSE_SCROLL_SPEED QStringLiteral("MouseScrollSpeed")
49+#define PROP_PASSWORD_DISPLAY_HINT QStringLiteral("PasswordDisplayHint")
50+#define PROP_REAL_NAME QStringLiteral("RealName")
51+#define PROP_STATS_WELCOME_SCREEN QStringLiteral("StatsWelcomeScreen")
52+#define PROP_TOUCHPAD_CURSOR_SPEED QStringLiteral("TouchpadCursorSpeed")
53+#define PROP_TOUCHPAD_DISABLE_WHILE_TYPING QStringLiteral("TouchpadDisableWhileTyping")
54+#define PROP_TOUCHPAD_DISABLE_WITH_MOUSE QStringLiteral("TouchpadDisableWithMouse")
55+#define PROP_TOUCHPAD_DOUBLE_CLICK_SPEED QStringLiteral("TouchpadDoubleClickSpeed")
56+#define PROP_TOUCHPAD_PRIMARY_BUTTON QStringLiteral("TouchpadPrimaryButton")
57+#define PROP_TOUCHPAD_SCROLL_SPEED QStringLiteral("TouchpadScrollSpeed")
58+#define PROP_TOUCHPAD_TAP_TO_CLICK QStringLiteral("TouchpadTapToClick")
59+#define PROP_TOUCHPAD_TWO_FINGER_SCROLL QStringLiteral("TouchpadTwoFingerScroll")
60+
61+using StringMap = QMap<QString,QString>;
62+using StringMapList = QList<StringMap>;
63+Q_DECLARE_METATYPE(StringMapList)
64+
65+
66+QVariant primaryButtonConverter(const QVariant &value)
67+{
68+ QString stringValue = value.toString();
69+ if (stringValue == "left") {
70+ return QVariant::fromValue(0);
71+ } else if (stringValue == "right") {
72+ return QVariant::fromValue(1); // Mir is less clear on this -- any non-zero value is the same
73+ } else {
74+ return QVariant::fromValue(0); // default to left
75+ }
76+}
77+
2678AccountsService::AccountsService(QObject* parent, const QString &user)
27− : QObject(parent),
28− m_service(new AccountsServiceDBusAdaptor(this)),
29− m_demoEdges(false),
30− m_enableLauncherWhileLocked(false),
31− m_enableIndicatorsWhileLocked(false),
32− m_statsWelcomeScreen(false),
33− m_passwordDisplayHint(Keyboard),
34− m_failedLogins(0),
35− m_hereEnabled(false),
36− m_hereLicensePath() // null means not set yet
79+ : QObject(parent)
80+ , m_service(new AccountsServiceDBusAdaptor(this))
3781{
82+ m_unityInput = new QDBusInterface(QStringLiteral("com.canonical.Unity.Input"),
83+ QStringLiteral("/com/canonical/Unity/Input"),
84+ QStringLiteral("com.canonical.Unity.Input"),
85+ QDBusConnection::SM_BUSNAME(), this);
86+
3887 connect(m_service, &AccountsServiceDBusAdaptor::propertiesChanged, this, &AccountsService::onPropertiesChanged);
3988 connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged, this, &AccountsService::onMaybeChanged);
4089
41− setUser(!user.isEmpty() ? user : QString::fromUtf8(qgetenv("USER")));
90+ registerProperty(IFACE_ACCOUNTS_USER, PROP_BACKGROUND_FILE, QStringLiteral("backgroundFileChanged"));
91+ registerProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL, QStringLiteral("emailChanged"));
92+ registerProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME, QStringLiteral("realNameChanged"));
93+ registerProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES, QStringLiteral("keymapsChanged"));
94+ registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, QStringLiteral("hereEnabledChanged"));
95+ registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH, QStringLiteral("hereLicensePathChanged"));
96+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED, QStringLiteral("enableLauncherWhileLockedChanged"));
97+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED, QStringLiteral("enableIndicatorsWhileLockedChanged"));
98+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_PASSWORD_DISPLAY_HINT, QStringLiteral("passwordDisplayHintChanged"));
99+ registerProperty(IFACE_UBUNTU_SECURITY_OLD, PROP_STATS_WELCOME_SCREEN, QStringLiteral("statsWelcomeScreenChanged"));
100+ registerProperty(IFACE_UNITY, PROP_DEMO_EDGES, QStringLiteral("demoEdgesChanged"));
101+ registerProperty(IFACE_UNITY, PROP_DEMO_EDGES_COMPLETED, QStringLiteral("demoEdgesCompletedChanged"));
102+ registerProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS, QStringLiteral("failedLoginsChanged"));
103+
104+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_CURSOR_SPEED,
105+ m_unityInput, QStringLiteral("setMouseCursorSpeed"));
106+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_DOUBLE_CLICK_SPEED,
107+ m_unityInput, QStringLiteral("setMouseDoubleClickSpeed"));
108+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_PRIMARY_BUTTON,
109+ m_unityInput, QStringLiteral("setMousePrimaryButton"),
110+ primaryButtonConverter);
111+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_SCROLL_SPEED,
112+ m_unityInput, QStringLiteral("setMouseScrollSpeed"));
113+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_CURSOR_SPEED,
114+ m_unityInput, QStringLiteral("setTouchpadCursorSpeed"));
115+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_SCROLL_SPEED,
116+ m_unityInput, QStringLiteral("setTouchpadScrollSpeed"));
117+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_DISABLE_WHILE_TYPING,
118+ m_unityInput, QStringLiteral("setTouchpadDisableWhileTyping"));
119+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_DISABLE_WITH_MOUSE,
120+ m_unityInput, QStringLiteral("setTouchpadDisableWithMouse"));
121+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_DOUBLE_CLICK_SPEED,
122+ m_unityInput, QStringLiteral("setTouchpadDoubleClickSpeed"));
123+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_PRIMARY_BUTTON,
124+ m_unityInput, QStringLiteral("setTouchpadPrimaryButton"),
125+ primaryButtonConverter);
126+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_TAP_TO_CLICK,
127+ m_unityInput, QStringLiteral("setTouchpadTapToClick"));
128+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_TWO_FINGER_SCROLL,
129+ m_unityInput, QStringLiteral("setTouchpadTwoFingerScroll"));
130+
131+ setUser(!user.isEmpty() ? user : QString::fromUtf8(g_get_user_name()));
42132}
43133
44134QString AccountsService::user() const
@@ -51,362 +141,256 @@ void AccountsService::setUser(const QString &user)
51141 if (user.isEmpty() || m_user == user)
52142 return;
53143
144+ bool wasEmpty = m_user.isEmpty();
145+
54146 m_user = user;
55147 Q_EMIT userChanged();
56148
57− updateDemoEdges(false);
58− updateEnableLauncherWhileLocked(false);
59− updateEnableIndicatorsWhileLocked(false);
60− updateBackgroundFile(false);
61− updateStatsWelcomeScreen(false);
62− updatePasswordDisplayHint(false);
63− updateFailedLogins(false);
64− updateHereEnabled(false);
65− updateHereLicensePath(false);
149+ // Do the first update synchronously, as a cheap way to block rendering
150+ // until we have the right values on bootup.
151+ refresh(!wasEmpty);
66152}
67153
68154bool AccountsService::demoEdges() const
69155{
70− return m_demoEdges;
156+ auto value = getProperty(IFACE_UNITY, PROP_DEMO_EDGES);
157+ return value.toBool();
71158}
72159
73160void AccountsService::setDemoEdges(bool demoEdges)
74161{
75− if (m_demoEdges != demoEdges) {
76− m_demoEdges = demoEdges;
77− m_service->setUserPropertyAsync(m_user, QStringLiteral("com.canonical.unity.AccountsService"), QStringLiteral("demo-edges"), demoEdges);
162+ setProperty(IFACE_UNITY, PROP_DEMO_EDGES, demoEdges);
163+}
78164
79− Q_EMIT demoEdgesChanged();
165+QStringList AccountsService::demoEdgesCompleted() const
166+{
167+ auto value = getProperty(IFACE_UNITY, PROP_DEMO_EDGES_COMPLETED);
168+ return value.toStringList();
169+}
170+
171+void AccountsService::markDemoEdgeCompleted(const QString &edge)
172+{
173+ auto currentList = demoEdgesCompleted();
174+ if (!currentList.contains(edge)) {
175+ setProperty(IFACE_UNITY, PROP_DEMO_EDGES_COMPLETED, currentList << edge);
80176 }
81177}
82178
83179bool AccountsService::enableLauncherWhileLocked() const
84180{
85− return m_enableLauncherWhileLocked;
181+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED);
182+ return value.toBool();
86183}
87184
88185bool AccountsService::enableIndicatorsWhileLocked() const
89186{
90− return m_enableIndicatorsWhileLocked;
187+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED);
188+ return value.toBool();
91189}
92190
93191QString AccountsService::backgroundFile() const
94192{
95− return m_backgroundFile;
193+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_BACKGROUND_FILE);
194+ return value.toString();
96195}
97196
98197bool AccountsService::statsWelcomeScreen() const
99198{
100− return m_statsWelcomeScreen;
199+ auto value = getProperty(IFACE_UBUNTU_SECURITY_OLD, PROP_STATS_WELCOME_SCREEN);
200+ return value.toBool();
101201}
102202
103203AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() const
104204{
105− return m_passwordDisplayHint;
205+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_PASSWORD_DISPLAY_HINT);
206+ return (PasswordDisplayHint)value.toInt();
106207}
107208
108209bool AccountsService::hereEnabled() const
109210{
110− return m_hereEnabled;
211+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED);
212+ return value.toBool();
111213}
112214
113215void AccountsService::setHereEnabled(bool enabled)
114216{
115− if (m_hereEnabled != enabled) {
116− m_hereEnabled = enabled;
117− m_service->setUserPropertyAsync(m_user, QStringLiteral("com.ubuntu.location.providers.here.AccountsService"), QStringLiteral("LicenseAccepted"), enabled);
118−
119− Q_EMIT hereEnabledChanged();
120− }
217+ setProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, enabled);
121218}
122219
123220QString AccountsService::hereLicensePath() const
124221{
125− return m_hereLicensePath;
222+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH);
223+ QString hereLicensePath = value.toString();
224+ if (hereLicensePath.isEmpty() || !QFile::exists(hereLicensePath))
225+ hereLicensePath = QStringLiteral("");
226+ return hereLicensePath;
126227}
127228
128229bool AccountsService::hereLicensePathValid() const
129230{
130− return !m_hereLicensePath.isNull();
231+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH);
232+ return !value.toString().isNull();
131233}
132234
133−void AccountsService::updateDemoEdges(bool async)
235+QString AccountsService::realName() const
134236{
135− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
136− QStringLiteral("com.canonical.unity.AccountsService"),
137− QStringLiteral("demo-edges"));
138− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
139−
140− connect(watcher, &QDBusPendingCallWatcher::finished,
141− this, [this](QDBusPendingCallWatcher* watcher) {
142−
143− QDBusPendingReply<QDBusVariant> reply = *watcher;
144− watcher->deleteLater();
145− if (reply.isError()) {
146− qWarning() << "Failed to get 'demo-edges' property - " << reply.error().message();
147− return;
148− }
149−
150− auto demoEdges = reply.value().variant().toBool();
151− if (m_demoEdges != demoEdges) {
152− m_demoEdges = demoEdges;
153− Q_EMIT demoEdgesChanged();
154− }
155− });
156− if (!async) {
157− watcher->waitForFinished();
158− delete watcher;
159− }
237+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME);
238+ return value.toString();
160239}
161240
162−void AccountsService::updateEnableLauncherWhileLocked(bool async)
241+void AccountsService::setRealName(const QString &realName)
163242{
164− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
165− QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy"),
166− QStringLiteral("EnableLauncherWhileLocked"));
167− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
168−
169− connect(watcher, &QDBusPendingCallWatcher::finished,
170− this, [this](QDBusPendingCallWatcher* watcher) {
171−
172− QDBusPendingReply<QVariant> reply = *watcher;
173− watcher->deleteLater();
174− if (reply.isError()) {
175− qWarning() << "Failed to get 'EnableLauncherWhileLocked' property - " << reply.error().message();
176− return;
177− }
178−
179− const bool enableLauncherWhileLocked = reply.value().toBool();
180− if (m_enableLauncherWhileLocked != enableLauncherWhileLocked) {
181− m_enableLauncherWhileLocked = enableLauncherWhileLocked;
182− Q_EMIT enableLauncherWhileLockedChanged();
183− }
184− });
185− if (!async) {
186− watcher->waitForFinished();
187− delete watcher;
188− }
243+ setProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME, realName);
189244}
190245
191−void AccountsService::updateEnableIndicatorsWhileLocked(bool async)
246+QString AccountsService::email() const
192247{
193− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
194− QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy"),
195− QStringLiteral("EnableIndicatorsWhileLocked"));
196− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
197−
198− connect(watcher, &QDBusPendingCallWatcher::finished,
199− this, [this](QDBusPendingCallWatcher* watcher) {
200−
201− QDBusPendingReply<QVariant> reply = *watcher;
202− watcher->deleteLater();
203− if (reply.isError()) {
204− qWarning() << "Failed to get 'EnableIndicatorsWhileLocked' property - " << reply.error().message();
205− return;
206− }
207−
208− const bool enableIndicatorsWhileLocked = reply.value().toBool();
209− if (m_enableIndicatorsWhileLocked != enableIndicatorsWhileLocked) {
210− m_enableIndicatorsWhileLocked = enableIndicatorsWhileLocked;
211− Q_EMIT enableIndicatorsWhileLockedChanged();
212− }
213− });
214− if (!async) {
215− watcher->waitForFinished();
216− delete watcher;
217− }
248+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL);
249+ return value.toString();
218250}
219251
220−void AccountsService::updateBackgroundFile(bool async)
252+void AccountsService::setEmail(const QString &email)
221253{
222− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
223− QStringLiteral("org.freedesktop.Accounts.User"),
224− QStringLiteral("BackgroundFile"));
225− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
226−
227− connect(watcher, &QDBusPendingCallWatcher::finished,
228− this, [this](QDBusPendingCallWatcher* watcher) {
254+ setProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL, email);
255+}
229256
230− QDBusPendingReply<QVariant> reply = *watcher;
231− watcher->deleteLater();
232− if (reply.isError()) {
233− qWarning() << "Failed to get 'BackgroundFile' property - " << reply.error().message();
234− return;
257+QStringList AccountsService::keymaps() const
258+{
259+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES);
260+ QDBusArgument arg = value.value<QDBusArgument>();
261+ StringMapList maps = qdbus_cast<StringMapList>(arg);
262+ QStringList simplifiedMaps;
263+
264+ Q_FOREACH(const StringMap &map, maps) {
265+ Q_FOREACH(const QString &entry, map) {
266+ simplifiedMaps.append(entry);
235267 }
268+ }
236269
237− const QString backgroundFile = reply.value().toString();
238− if (m_backgroundFile != backgroundFile) {
239− m_backgroundFile = backgroundFile;
240− Q_EMIT backgroundFileChanged();
241− }
242− });
243− if (!async) {
244− watcher->waitForFinished();
245− delete watcher;
270+ if (!simplifiedMaps.isEmpty()) {
271+ return simplifiedMaps;
246272 }
273+
274+ return {QStringLiteral("us")};
247275}
248276
249−void AccountsService::updateStatsWelcomeScreen(bool async)
277+uint AccountsService::failedLogins() const
250278{
251− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
252− QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy"),
253− QStringLiteral("StatsWelcomeScreen"));
254− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
279+ return getProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS).toUInt();
280+}
255281
256− connect(watcher, &QDBusPendingCallWatcher::finished,
257− this, [this](QDBusPendingCallWatcher* watcher) {
282+void AccountsService::setFailedLogins(uint failedLogins)
283+{
284+ setProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS, failedLogins);
285+}
258286
259− QDBusPendingReply<QVariant> reply = *watcher;
260− watcher->deleteLater();
261− if (reply.isError()) {
262− qWarning() << "Failed to get 'StatsWelcomeScreen' property - " << reply.error().message();
263− return;
264− }
287+// ====================================================
288+// Everything below this line is generic helper methods
289+// ====================================================
265290
266− const bool statsWelcomeScreen = reply.value().toBool();
267− if (m_statsWelcomeScreen != statsWelcomeScreen) {
268− m_statsWelcomeScreen = statsWelcomeScreen;
269− Q_EMIT statsWelcomeScreenChanged();
270− }
271− });
272− if (!async) {
273− watcher->waitForFinished();
274− delete watcher;
275− }
291+void AccountsService::emitChangedForProperty(const QString &interface, const QString &property)
292+{
293+ QString signalName = m_properties[interface][property].signal;
294+ QMetaObject::invokeMethod(this, signalName.toUtf8().data());
276295}
277296
278−void AccountsService::updatePasswordDisplayHint(bool async)
297+QVariant AccountsService::getProperty(const QString &interface, const QString &property) const
279298{
280− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
281− QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy"),
282− QStringLiteral("PasswordDisplayHint"));
283− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
284−
285− connect(watcher, &QDBusPendingCallWatcher::finished,
286− this, [this](QDBusPendingCallWatcher* watcher) {
287−
288− QDBusPendingReply<QVariant> reply = *watcher;
289− watcher->deleteLater();
290− if (reply.isError()) {
291− qWarning() << "Failed to get 'PasswordDisplayHint' property - " << reply.error().message();
292− return;
293− }
299+ return m_properties[interface][property].value;
300+}
294301
295− const PasswordDisplayHint passwordDisplayHint = (PasswordDisplayHint)reply.value().toInt();
296− if (m_passwordDisplayHint != passwordDisplayHint) {
297− m_passwordDisplayHint = passwordDisplayHint;
298− Q_EMIT passwordDisplayHintChanged();
299− }
300− });
301− if (!async) {
302− watcher->waitForFinished();
303− delete watcher;
302+void AccountsService::setProperty(const QString &interface, const QString &property, const QVariant &value)
303+{
304+ if (m_properties[interface][property].value != value) {
305+ m_properties[interface][property].value = value;
306+ m_service->setUserPropertyAsync(m_user, interface, property, value);
307+ emitChangedForProperty(interface, property);
304308 }
305309}
306310
307−void AccountsService::updateFailedLogins(bool async)
311+void AccountsService::updateCache(const QString &interface, const QString &property, const QVariant &value)
308312{
309− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
310− QStringLiteral("com.canonical.unity.AccountsService.Private"),
311− QStringLiteral("FailedLogins"));
312− QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
313−
314− connect(watcher, &QDBusPendingCallWatcher::finished,
315− this, [this](QDBusPendingCallWatcher* watcher) {
316−
317− QDBusPendingReply<QVariant> reply = *watcher;
318− watcher->deleteLater();
319− if (reply.isError()) {
320− qWarning() << "Failed to get 'FailedLogins' property - " << reply.error().message();
321− return;
313+ PropertyInfo &info = m_properties[interface][property];
314+
315+ if (info.proxyInterface) {
316+ QVariant finalValue;
317+ if (info.proxyConverter) {
318+ finalValue = info.proxyConverter(value);
319+ } else {
320+ finalValue = value;
322321 }
322+ info.proxyInterface->asyncCall(info.proxyMethod, finalValue);
323+ return; // don't bother saving a copy
324+ }
323325
324− const uint failedLogins = reply.value().toUInt();
325− if (m_failedLogins != failedLogins) {
326− m_failedLogins = failedLogins;
327− Q_EMIT failedLoginsChanged();
328− }
329− });
330− if (!async) {
331− watcher->waitForFinished();
332− delete watcher;
326+ if (info.value != value) {
327+ info.value = value;
328+ emitChangedForProperty(interface, property);
333329 }
334330}
335331
336−void AccountsService::updateHereEnabled(bool async)
332+void AccountsService::updateProperty(const QString &interface, const QString &property)
337333{
338334 QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
339− QStringLiteral("com.ubuntu.location.providers.here.AccountsService"),
340− QStringLiteral("LicenseAccepted"));
335+ interface,
336+ property);
341337 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
342338
343339 connect(watcher, &QDBusPendingCallWatcher::finished,
344− this, [this](QDBusPendingCallWatcher* watcher) {
340+ this, [this, interface, property](QDBusPendingCallWatcher* watcher) {
345341
346342 QDBusPendingReply<QVariant> reply = *watcher;
347343 watcher->deleteLater();
348344 if (reply.isError()) {
349− qWarning() << "Failed to get 'LicenseAccepted' property - " << reply.error().message();
345+ qWarning() << "Failed to get '" << property << "' property:" << reply.error().message();
350346 return;
351347 }
352348
353− const bool hereEnabled = reply.value().toBool();
354− if (m_hereEnabled != hereEnabled) {
355− m_hereEnabled = hereEnabled;
356− Q_EMIT hereEnabledChanged();
357− }
349+ updateCache(interface, property, reply.value());
358350 });
359− if (!async) {
360− watcher->waitForFinished();
361− delete watcher;
362− }
363351}
364352
365−void AccountsService::updateHereLicensePath(bool async)
353+void AccountsService::updateAllProperties(const QString &interface, bool async)
366354{
367− QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
368− QStringLiteral("com.ubuntu.location.providers.here.AccountsService"),
369− QStringLiteral("LicenseBasePath"));
355+ QDBusPendingCall pendingReply = m_service->getAllPropertiesAsync(m_user,
356+ interface);
370357 QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
371358
372359 connect(watcher, &QDBusPendingCallWatcher::finished,
373− this, [this](QDBusPendingCallWatcher* watcher) {
360+ this, [this, interface](QDBusPendingCallWatcher* watcher) {
374361
375− QDBusPendingReply<QVariant> reply = *watcher;
362+ QDBusPendingReply< QHash<QString, QVariant> > reply = *watcher;
376363 watcher->deleteLater();
377364 if (reply.isError()) {
378− qWarning() << "Failed to get 'LicenseBasePath' property - " << reply.error().message();
365+ qWarning() << "Failed to get all properties for" << interface << ":" << reply.error().message();
379366 return;
380367 }
381368
382− QString hereLicensePath = reply.value().toString();
383− if (hereLicensePath.isEmpty() || !QFile::exists(hereLicensePath))
384− hereLicensePath = QLatin1String("");
385−
386− if (m_hereLicensePath.isNull() || m_hereLicensePath != hereLicensePath) {
387− m_hereLicensePath = hereLicensePath;
388− Q_EMIT hereLicensePathChanged();
369+ auto valueHash = reply.value();
370+ auto i = valueHash.constBegin();
371+ while (i != valueHash.constEnd()) {
372+ updateCache(interface, i.key(), i.value());
373+ ++i;
389374 }
390375 });
391376 if (!async) {
392377 watcher->waitForFinished();
393− delete watcher;
394378 }
395379}
396380
397−uint AccountsService::failedLogins() const
381+void AccountsService::registerProxy(const QString &interface, const QString &property, QDBusInterface *iface, const QString &method, ProxyConverter converter)
398382{
399− return m_failedLogins;
383+ registerProperty(interface, property, nullptr);
384+
385+ m_properties[interface][property].proxyInterface = iface;
386+ m_properties[interface][property].proxyMethod = method;
387+ m_properties[interface][property].proxyConverter = converter;
400388}
401389
402−void AccountsService::setFailedLogins(uint failedLogins)
390+void AccountsService::registerProperty(const QString &interface, const QString &property, const QString &signal)
403391{
404− if (m_failedLogins != failedLogins) {
405− m_failedLogins = failedLogins;
406− m_service->setUserPropertyAsync(m_user, QStringLiteral("com.canonical.unity.AccountsService.Private"), QStringLiteral("FailedLogins"), failedLogins);
407−
408− Q_EMIT failedLoginsChanged();
409− }
392+ m_properties[interface][property] = PropertyInfo();
393+ m_properties[interface][property].signal = signal;
410394}
411395
412396void AccountsService::onPropertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
@@ -415,35 +399,13 @@ void AccountsService::onPropertiesChanged(const QString &user, const QString &in
415399 return;
416400 }
417401
418− if (interface == QLatin1String("com.canonical.unity.AccountsService")) {
419− if (changed.contains(QStringLiteral("demo-edges"))) {
420− updateDemoEdges();
421− }
422− } else if (interface == QLatin1String("com.canonical.unity.AccountsService.Private")) {
423− if (changed.contains(QStringLiteral("FailedLogins"))) {
424− updateFailedLogins();
425− }
426− } else if (interface == QLatin1String("com.ubuntu.touch.AccountsService.SecurityPrivacy")) {
427− if (changed.contains(QStringLiteral("StatsWelcomeScreen"))) {
428− updateStatsWelcomeScreen();
429− }
430− } else if (interface == QLatin1String("com.ubuntu.AccountsService.SecurityPrivacy")) {
431− if (changed.contains(QStringLiteral("PasswordDisplayHint"))) {
432− updatePasswordDisplayHint();
433− }
434− if (changed.contains(QStringLiteral("EnableLauncherWhileLocked"))) {
435− updateEnableLauncherWhileLocked();
436− }
437− if (changed.contains(QStringLiteral("EnableIndicatorsWhileLocked"))) {
438− updateEnableIndicatorsWhileLocked();
439− }
440− } else if (interface == QLatin1String("com.ubuntu.location.providers.here.AccountsService")) {
441− if (changed.contains(QStringLiteral("LicenseAccepted"))) {
442− updateHereEnabled();
443− }
444− if (changed.contains(QStringLiteral("LicenseBasePath"))) {
445− updateHereLicensePath();
402+ auto propHash = m_properties.value(interface);
403+ auto i = propHash.constBegin();
404+ while (i != propHash.constEnd()) {
405+ if (changed.contains(i.key())) {
406+ updateProperty(interface, i.key());
446407 }
408+ ++i;
447409 }
448410}
449411
@@ -453,6 +415,20 @@ void AccountsService::onMaybeChanged(const QString &user)
453415 return;
454416 }
455417
456− // Standard properties might have changed
457− updateBackgroundFile();
418+ // Any of the standard properties might have changed!
419+ auto propHash = m_properties.value(IFACE_ACCOUNTS_USER);
420+ auto i = propHash.constBegin();
421+ while (i != propHash.constEnd()) {
422+ updateProperty(IFACE_ACCOUNTS_USER, i.key());
423+ ++i;
424+ }
425+}
426+
427+void AccountsService::refresh(bool async)
428+{
429+ auto i = m_properties.constBegin();
430+ while (i != m_properties.constEnd()) {
431+ updateAllProperties(i.key(), async);
432+ ++i;
433+ }
458434}
plugins/AccountsService/AccountsService.h+48−21
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,17 +12,19 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#ifndef UNITY_ACCOUNTSSERVICE_H
2018#define UNITY_ACCOUNTSSERVICE_H
2119
20+#include <QHash>
2221#include <QObject>
2322#include <QString>
23+#include <QStringList>
24+#include <QVariant>
2425
2526class AccountsServiceDBusAdaptor;
27+class QDBusInterface;
2628
2729class AccountsService: public QObject
2830{
@@ -36,6 +38,9 @@ class AccountsService: public QObject
3638 READ demoEdges
3739 WRITE setDemoEdges
3840 NOTIFY demoEdgesChanged)
41+ Q_PROPERTY (QStringList demoEdgesCompleted
42+ READ demoEdgesCompleted
43+ NOTIFY demoEdgesCompletedChanged)
3944 Q_PROPERTY (bool enableLauncherWhileLocked
4045 READ enableLauncherWhileLocked
4146 NOTIFY enableLauncherWhileLockedChanged)
@@ -65,6 +70,11 @@ class AccountsService: public QObject
6570 Q_PROPERTY(bool hereLicensePathValid // qml sees a null string as "", so we use proxy setting for that
6671 READ hereLicensePathValid
6772 NOTIFY hereLicensePathChanged)
73+ Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
74+ Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
75+ Q_PROPERTY(QStringList keymaps
76+ READ keymaps
77+ NOTIFY keymapsChanged)
6878
6979public:
7080 enum PasswordDisplayHint {
@@ -79,6 +89,8 @@ public:
7989 void setUser(const QString &user);
8090 bool demoEdges() const;
8191 void setDemoEdges(bool demoEdges);
92+ QStringList demoEdgesCompleted() const;
93+ Q_INVOKABLE void markDemoEdgeCompleted(const QString &edge);
8294 bool enableLauncherWhileLocked() const;
8395 bool enableIndicatorsWhileLocked() const;
8496 QString backgroundFile() const;
@@ -90,10 +102,16 @@ public:
90102 void setHereEnabled(bool enabled);
91103 QString hereLicensePath() const;
92104 bool hereLicensePathValid() const;
105+ QString realName() const;
106+ void setRealName(const QString &realName);
107+ QString email() const;
108+ void setEmail(const QString &email);
109+ QStringList keymaps() const;
93110
94111Q_SIGNALS:
95112 void userChanged();
96113 void demoEdgesChanged();
114+ void demoEdgesCompletedChanged();
97115 void enableLauncherWhileLockedChanged();
98116 void enableIndicatorsWhileLockedChanged();
99117 void backgroundFileChanged();
@@ -102,33 +120,42 @@ Q_SIGNALS:
102120 void failedLoginsChanged();
103121 void hereEnabledChanged();
104122 void hereLicensePathChanged();
123+ void realNameChanged();
124+ void emailChanged();
125+ void keymapsChanged();
105126
106127private Q_SLOTS:
107128 void onPropertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
108129 void onMaybeChanged(const QString &user);
109130
110131private:
111− void updateDemoEdges(bool async = true);
112− void updateEnableLauncherWhileLocked(bool async = true);
113− void updateEnableIndicatorsWhileLocked(bool async = true);
114− void updateBackgroundFile(bool async = true);
115− void updateStatsWelcomeScreen(bool async = true);
116− void updatePasswordDisplayHint(bool async = true);
117− void updateFailedLogins(bool async = true);
118− void updateHereEnabled(bool async = true);
119− void updateHereLicensePath(bool async = true);
132+ typedef QVariant (*ProxyConverter)(const QVariant &);
133+
134+ void refresh(bool async);
135+ void registerProperty(const QString &interface, const QString &property, const QString &signal);
136+ void registerProxy(const QString &interface, const QString &property, QDBusInterface *iface, const QString &method, ProxyConverter converter = nullptr);
137+
138+ void updateAllProperties(const QString &interface, bool async);
139+ void updateProperty(const QString &interface, const QString &property);
140+ void updateCache(const QString &interface, const QString &property, const QVariant &value);
120141
142+ void setProperty(const QString &interface, const QString &property, const QVariant &value);
143+ QVariant getProperty(const QString &interface, const QString &property) const;
144+
145+ void emitChangedForProperty(const QString &interface, const QString &property);
146+
147+ struct PropertyInfo {
148+ QVariant value{};
149+ QString signal{};
150+ QDBusInterface *proxyInterface{};
151+ QString proxyMethod{};
152+ ProxyConverter proxyConverter{};
153+ };
154+ typedef QHash< QString, QHash<QString, PropertyInfo> > PropertyHash;
155+ PropertyHash m_properties;
121156 AccountsServiceDBusAdaptor *m_service;
157+ QDBusInterface *m_unityInput;
122158 QString m_user;
123− bool m_demoEdges;
124− bool m_enableLauncherWhileLocked;
125− bool m_enableIndicatorsWhileLocked;
126− QString m_backgroundFile;
127− bool m_statsWelcomeScreen;
128− PasswordDisplayHint m_passwordDisplayHint;
129− uint m_failedLogins;
130− bool m_hereEnabled;
131− QString m_hereLicensePath;
132159};
133160
134161#endif
plugins/AccountsService/AccountsService.qmltypes+5
@@ -23,6 +23,7 @@ Module {
2323 }
2424 Property { name: "user"; type: "string" }
2525 Property { name: "demoEdges"; type: "bool" }
26+ Property { name: "demoEdgesCompleted"; type: "QStringList"; isReadonly: true }
2627 Property { name: "enableLauncherWhileLocked"; type: "bool"; isReadonly: true }
2728 Property { name: "enableIndicatorsWhileLocked"; type: "bool"; isReadonly: true }
2829 Property { name: "backgroundFile"; type: "string"; isReadonly: true }
@@ -32,5 +33,9 @@ Module {
3233 Property { name: "hereEnabled"; type: "bool" }
3334 Property { name: "hereLicensePath"; type: "string"; isReadonly: true }
3435 Property { name: "hereLicensePathValid"; type: "bool"; isReadonly: true }
36+ Method {
37+ name: "markDemoEdgeCompleted"
38+ Parameter { name: "edge"; type: "string" }
39+ }
3540 }
3641}
plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+23−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,8 +12,6 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#include "AccountsServiceDBusAdaptor.h"
@@ -37,6 +35,15 @@ AccountsServiceDBusAdaptor::AccountsServiceDBusAdaptor(QObject* parent)
3735 connection, this);
3836}
3937
38+QDBusPendingReply<QVariantMap> AccountsServiceDBusAdaptor::getAllPropertiesAsync(const QString &user, const QString &interface)
39+{
40+ QDBusInterface *iface = getUserInterface(user);
41+ if (iface != nullptr && iface->isValid()) {
42+ return iface->asyncCall(QStringLiteral("GetAll"), interface);
43+ }
44+ return QDBusPendingReply<QVariantMap>(QDBusMessage::createError(QDBusError::Other, QStringLiteral("Invalid Interface")));
45+}
46+
4047QDBusPendingReply<QVariant> AccountsServiceDBusAdaptor::getUserPropertyAsync(const QString &user, const QString &interface, const QString &property)
4148{
4249 QDBusInterface *iface = getUserInterface(user);
@@ -50,8 +57,18 @@ QDBusPendingCall AccountsServiceDBusAdaptor::setUserPropertyAsync(const QString
5057{
5158 QDBusInterface *iface = getUserInterface(user);
5259 if (iface != nullptr && iface->isValid()) {
53− // The value needs to be carefully wrapped
54− return iface->asyncCall(QStringLiteral("Set"), interface, property, QVariant::fromValue(QDBusVariant(value)));
60+ if (interface == QStringLiteral("org.freedesktop.Accounts.User")) {
61+ // Standard AccountsService properties use special set methods.
62+ // It will not let you use the usual DBus property setters.
63+ QDBusInterface accountsIface(iface->service(),
64+ iface->path(),
65+ interface,
66+ iface->connection());
67+ return accountsIface.asyncCall(QStringLiteral("Set") + property, value);
68+ } else {
69+ // The value needs to be carefully wrapped
70+ return iface->asyncCall(QStringLiteral("Set"), interface, property, QVariant::fromValue(QDBusVariant(value)));
71+ }
5572 }
5673 return QDBusPendingCall::fromCompletedCall(QDBusMessage::createError(QDBusError::Other, QStringLiteral("Invalid Interface")));
5774}
@@ -80,7 +97,7 @@ void AccountsServiceDBusAdaptor::maybeChangedSlot()
8097 m_ignoreNextChanged = false;
8198}
8299
83−QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path)
100+QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path) const
84101{
85102 QMap<QString, QDBusInterface *>::const_iterator i;
86103 for (i = m_users.constBegin(); i != m_users.constEnd(); ++i) {
plugins/AccountsService/AccountsServiceDBusAdaptor.h+5−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,8 +12,6 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#ifndef UNITY_ACCOUNTSSERVICEDBUSADAPTOR_H
@@ -35,8 +33,9 @@ public:
3533 explicit AccountsServiceDBusAdaptor(QObject *parent = 0);
3634 ~AccountsServiceDBusAdaptor() = default;
3735
38− Q_INVOKABLE QDBusPendingReply<QVariant> getUserPropertyAsync(const QString &user, const QString &interface, const QString &property);
39− Q_INVOKABLE QDBusPendingCall setUserPropertyAsync(const QString &user, const QString &interface, const QString &property, const QVariant &value);
36+ QDBusPendingReply<QVariantMap> getAllPropertiesAsync(const QString &user, const QString &interface);
37+ QDBusPendingReply<QVariant> getUserPropertyAsync(const QString &user, const QString &interface, const QString &property);
38+ QDBusPendingCall setUserPropertyAsync(const QString &user, const QString &interface, const QString &property, const QVariant &value);
4039
4140Q_SIGNALS:
4241 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
@@ -48,7 +47,7 @@ private Q_SLOTS:
4847
4948private:
5049 QDBusInterface *getUserInterface(const QString &user);
51− QString getUserForPath(const QString &path);
50+ QString getUserForPath(const QString &path) const;
5251
5352 QDBusInterface *m_accountsManager;
5453 QMap<QString, QDBusInterface *> m_users;
plugins/AccountsService/CMakeLists.txt+5
@@ -1,4 +1,5 @@
11add_definitions(-DSM_BUSNAME=systemBus)
2+include_directories(${GLIB_INCLUDE_DIRS})
23
34add_library(AccountsService-qml MODULE
45 AccountsService.cpp
@@ -8,6 +9,10 @@ add_library(AccountsService-qml MODULE
89
910qt5_use_modules(AccountsService-qml DBus Qml)
1011
12+target_link_libraries(AccountsService-qml
13+ ${GLIB_LIBRARIES}
14+ )
15+
1116add_unity8_plugin(AccountsService 0.1 AccountsService TARGETS AccountsService-qml)
1217
1318set(DBUS_IFACE_DIR "${CMAKE_INSTALL_PREFIX}/share/dbus-1/interfaces")
plugins/AccountsService/com.canonical.unity.AccountsService.xml+5
@@ -14,6 +14,11 @@
1414 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
1515 </property>
1616
17+ <!-- List of tutorial pages that have been completed by the user -->
18+ <property name="DemoEdgesCompleted" type="as" access="readwrite">
19+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
20+ </property>
21+
1722 <property name="LauncherItems" type="aa{sv}" access="readwrite">
1823 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[{'defaults': <true>}]"/>
1924 </property>
plugins/CMakeLists.txt+2
@@ -22,6 +22,8 @@ add_subdirectory(Powerd)
2222add_subdirectory(SessionBroadcast)
2323add_subdirectory(ScreenGrabber)
2424add_subdirectory(Ubuntu)
25+add_subdirectory(UInput)
2526add_subdirectory(Unity)
2627add_subdirectory(Utils)
28+add_subdirectory(WindowManager)
2729add_subdirectory(Wizard)
plugins/Cursor/Cursor.qmltypesnew file+78
@@ -0,0 +1,78 @@
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 Cursor 1.0 plugins'
8+
9+Module {
10+ Component {
11+ name: "MirMousePointerInterface"
12+ defaultProperty: "data"
13+ prototype: "QQuickItem"
14+ Property { name: "cursorName"; type: "string"; isReadonly: true }
15+ Property { name: "themeName"; type: "string"; isReadonly: true }
16+ Property { name: "hotspotX"; type: "double"; isReadonly: true }
17+ Property { name: "hotspotY"; type: "double"; isReadonly: true }
18+ Signal {
19+ name: "cursorNameChanged"
20+ Parameter { name: "name"; type: "string" }
21+ }
22+ Signal {
23+ name: "themeNameChanged"
24+ Parameter { name: "name"; type: "string" }
25+ }
26+ Signal {
27+ name: "hotspotXChanged"
28+ Parameter { name: "value"; type: "double" }
29+ }
30+ Signal {
31+ name: "hotspotYChanged"
32+ Parameter { name: "value"; type: "double" }
33+ }
34+ Method {
35+ name: "handleMouseEvent"
36+ Parameter { name: "timestamp"; type: "ulong" }
37+ Parameter { name: "movement"; type: "QPointF" }
38+ Parameter { name: "buttons"; type: "Qt::MouseButtons" }
39+ Parameter { name: "modifiers"; type: "Qt::KeyboardModifiers" }
40+ }
41+ Method {
42+ name: "handleWheelEvent"
43+ Parameter { name: "timestamp"; type: "ulong" }
44+ Parameter { name: "angleDelta"; type: "QPoint" }
45+ Parameter { name: "modifiers"; type: "Qt::KeyboardModifiers" }
46+ }
47+ }
48+ Component {
49+ name: "MousePointer"
50+ defaultProperty: "data"
51+ prototype: "MirMousePointerInterface"
52+ exports: ["Cursor/MousePointer 1.0"]
53+ exportMetaObjectRevisions: [0]
54+ Signal {
55+ name: "pushedLeftBoundary"
56+ Parameter { name: "amount"; type: "double" }
57+ Parameter { name: "buttons"; type: "Qt::MouseButtons" }
58+ }
59+ Signal {
60+ name: "pushedRightBoundary"
61+ Parameter { name: "amount"; type: "double" }
62+ Parameter { name: "buttons"; type: "Qt::MouseButtons" }
63+ }
64+ Method {
65+ name: "handleMouseEvent"
66+ Parameter { name: "timestamp"; type: "ulong" }
67+ Parameter { name: "movement"; type: "QPointF" }
68+ Parameter { name: "buttons"; type: "Qt::MouseButtons" }
69+ Parameter { name: "modifiers"; type: "Qt::KeyboardModifiers" }
70+ }
71+ Method {
72+ name: "handleWheelEvent"
73+ Parameter { name: "timestamp"; type: "ulong" }
74+ Parameter { name: "angleDelta"; type: "QPoint" }
75+ Parameter { name: "modifiers"; type: "Qt::KeyboardModifiers" }
76+ }
77+ }
78+}
plugins/Cursor/MousePointer.cpp+4
@@ -42,6 +42,10 @@ void MousePointer::handleMouseEvent(ulong timestamp, QPointF movement, Qt::Mouse
4242 return;
4343 }
4444
45+ if (!movement.isNull()) {
46+ Q_EMIT mouseMoved();
47+ }
48+
4549 qreal newX = x() + movement.x();
4650 if (newX < 0) {
4751 Q_EMIT pushedLeftBoundary(qAbs(newX), buttons);
plugins/Cursor/MousePointer.h+1
@@ -48,6 +48,7 @@ public Q_SLOTS:
4848Q_SIGNALS:
4949 void pushedLeftBoundary(qreal amount, Qt::MouseButtons buttons);
5050 void pushedRightBoundary(qreal amount, Qt::MouseButtons buttons);
51+ void mouseMoved();
5152
5253protected:
5354 void itemChange(ItemChange change, const ItemChangeData &value) override;
plugins/Dash/AudioProgressBar.qmlnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * Copyright 2015 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.4
18+import Ubuntu.Components 1.3
19+import Dash 0.1
20+
21+Item {
22+ id: root
23+
24+ implicitHeight: progressBarImage.height
25+
26+ property url source
27+ readonly property double progress: AudioUrlComparer.compare(source, DashAudioPlayer.currentSource) ? DashAudioPlayer.progress : 0
28+
29+ Image {
30+ id: progressBarImage
31+ anchors { left: parent.left; right: parent.right }
32+ height: units.dp(6)
33+ source: "graphics/music_progress_bg.png"
34+ asynchronous: true
35+ sourceSize.width: width
36+ sourceSize.height: height
37+ }
38+
39+ UbuntuShape {
40+ id: progressBarFill
41+ objectName: "progressBarFill"
42+
43+ readonly property int maxWidth: progressBarImage.width
44+
45+ anchors {
46+ left: progressBarImage.left
47+ right: progressBarImage.right
48+ verticalCenter: progressBarImage.verticalCenter
49+ rightMargin: maxWidth - (maxWidth * root.progress)
50+ }
51+ height: units.dp(2)
52+ backgroundColor: UbuntuColors.orange
53+ }
54+}
plugins/Dash/CMakeLists.txt+3
@@ -38,3 +38,6 @@ target_link_libraries(Dash-qml
3838qt5_use_modules(Dash-qml Qml Quick Concurrent)
3939
4040add_unity8_plugin(Dash 0.1 Dash TARGETS Dash-qml)
41+
42+install(FILES graphics/music_progress_bg.png DESTINATION ${SHELL_INSTALL_QML}/Dash/graphics/)
43+file(COPY graphics/music_progress_bg.png DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/graphics/)
plugins/Dash/CardAudioProgress.qmlnew file+59
@@ -0,0 +1,59 @@
1+/*
2+ * Copyright 2015 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.4
18+import Ubuntu.Components 1.3
19+import Dash 0.1
20+
21+Item {
22+ id: root
23+
24+ implicitHeight: positionLabel.y + positionLabel.height
25+ visible: AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)
26+
27+ property int duration: 0
28+ property alias source: progress.source
29+ property color color: theme.palette.normal.baseText
30+ readonly property int position: root.visible ? DashAudioPlayer.position / 1000 : 0
31+
32+ AudioProgressBar {
33+ id: progress
34+ anchors { left: parent.left; right: parent.right }
35+ }
36+
37+ Label {
38+ id: positionLabel
39+ anchors {
40+ left: parent.left
41+ top: progress.bottom
42+ }
43+ verticalAlignment: Text.AlignBottom
44+ fontSize: "x-small"
45+ text: DashAudioPlayer.lengthToString(root.position)
46+ color: root.color
47+ }
48+
49+ Label {
50+ anchors {
51+ right: parent.right
52+ top: progress.bottom
53+ }
54+ verticalAlignment: Text.AlignBottom
55+ fontSize: "x-small"
56+ text: DashAudioPlayer.lengthToString(duration)
57+ color: root.color
58+ }
59+}
plugins/Dash/CardCreator.js+244−58
@@ -16,14 +16,15 @@
1616
1717.pragma library
1818
19−// %1 is the template["card-background"] string
20−// %2 is the template["card-background"]["elements"][0]
21−// %3 is the template["card-background"]["elements"][1]
19+// %1 is the template["card-background"]["elements"][0]
20+// %2 is the template["card-background"]["elements"][1]
21+// %3 is whether the loader should be asynchronous or not
22+// %4 is the template["card-background"] string
2223var kBackgroundLoaderCode = 'Loader {\n\
2324 id: backgroundLoader; \n\
2425 objectName: "backgroundLoader"; \n\
2526 anchors.fill: parent; \n\
26− asynchronous: root.asynchronous; \n\
27+ asynchronous: %3; \n\
2728 visible: status == Loader.Ready; \n\
2829 sourceComponent: UbuntuShape { \n\
2930 objectName: "background"; \n\
@@ -46,14 +47,14 @@ var kBackgroundLoaderCode = 'Loader {\n\
4647 objectName: "backgroundImage"; \n\
4748 source: { \n\
4849 if (cardData && typeof cardData["background"] === "string") return cardData["background"]; \n\
49− else return "%1"; \n\
50+ else return %4; \n\
5051 } \n\
5152 } \n\
5253 function getColor(index) { \n\
5354 if (cardData && typeof cardData["background"] === "object" \n\
5455 && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) { \n\
5556 return cardData["background"]["elements"][index]; \n\
56− } else return index === 0 ? %2 : %3; \n\
57+ } else return index === 0 ? %1 : %2; \n\
5758 } \n\
5859 } \n\
5960 }\n';
@@ -61,6 +62,11 @@ var kBackgroundLoaderCode = 'Loader {\n\
6162// %1 is used as anchors of artShapeHolder
6263// %2 is used as image width
6364// %3 is used as image height
65+// %4 is whether the image or the Loader with the UbuntuShape/ProportionalShape should be visible
66+// %5 is used as aspect ratio fallback
67+// %6 is whether the loader should be asynchronous or not
68+// %7 is injected as code to artImage
69+// %8 is used as image fallback
6470var kArtShapeHolderCode = 'Item { \n\
6571 id: artShapeHolder; \n\
6672 height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height; \n\
@@ -69,31 +75,23 @@ var kArtShapeHolderCode = 'Item { \n\
6975 Loader { \n\
7076 id: artShapeLoader; \n\
7177 objectName: "artShapeLoader"; \n\
72− active: cardData && cardData["art"] || false; \n\
73− asynchronous: root.asynchronous; \n\
78+ readonly property string cardArt: cardData && cardData["art"] || %8; \n\
79+ active: cardArt != ""; \n\
80+ asynchronous: %6; \n\
7481 visible: status == Loader.Ready; \n\
7582 sourceComponent: Item { \n\
7683 id: artShape; \n\
7784 objectName: "artShape"; \n\
78− readonly property bool doShapeItem: components["art"]["conciergeMode"] !== true; \n\
7985 visible: image.status == Image.Ready; \n\
8086 readonly property alias image: artImage; \n\
81− ShaderEffectSource { \n\
82− id: artShapeSource; \n\
83− sourceItem: artImage; \n\
84− anchors.centerIn: parent; \n\
85− width: 1; \n\
86− height: 1; \n\
87− hideSource: doShapeItem; \n\
88− } \n\
8987 Loader { \n\
9088 anchors.fill: parent; \n\
91− visible: artShape.doShapeItem; \n\
89+ visible: %4; \n\
9290 sourceComponent: root.artShapeStyle === "icon" ? artShapeIconComponent : artShapeShapeComponent; \n\
9391 Component { \n\
9492 id: artShapeShapeComponent; \n\
9593 UbuntuShape { \n\
96− source: artShapeSource; \n\
94+ source: artImage; \n\
9795 sourceFillMode: UbuntuShape.PreserveAspectCrop; \n\
9896 radius: "medium"; \n\
9997 aspect: { \n\
@@ -108,11 +106,11 @@ var kArtShapeHolderCode = 'Item { \n\
108106 } \n\
109107 Component { \n\
110108 id: artShapeIconComponent; \n\
111− ProportionalShape { source: artShapeSource; aspect: UbuntuShape.DropShadow; } \n\
109+ ProportionalShape { source: artImage; aspect: UbuntuShape.DropShadow; } \n\
112110 } \n\
113111 } \n\
114112 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1; \n\
115− readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : components !== undefined ? components["art"]["aspect-ratio"] : 1; \n\
113+ readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : %5; \n\
116114 Component.onCompleted: { updateWidthHeightBindings(); } \n\
117115 Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); } \n\
118116 function updateWidthHeightBindings() { \n\
@@ -127,21 +125,73 @@ var kArtShapeHolderCode = 'Item { \n\
127125 CroppedImageMinimumSourceSize { \n\
128126 id: artImage; \n\
129127 objectName: "artImage"; \n\
130− source: cardData && cardData["art"] || ""; \n\
131− asynchronous: root.asynchronous; \n\
128+ source: artShapeLoader.cardArt; \n\
129+ asynchronous: %6; \n\
130+ visible: !%4; \n\
132131 width: %2; \n\
133132 height: %3; \n\
133+ %7 \n\
134134 } \n\
135135 } \n\
136136 } \n\
137137 }\n';
138138
139+// %1 is anchors.fill
140+// %2 is width
141+// %3 is height
142+// %4 is whether the icon should be asynchronous or not
143+var kAudioButtonCode = 'AbstractButton { \n\
144+ id: audioButton; \n\
145+ anchors.fill: %1; \n\
146+ width: %2; \n\
147+ height: %3; \n\
148+ readonly property url source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || ""; \n\
149+ UbuntuShape { \n\
150+ anchors.fill: parent; \n\
151+ visible: parent.pressed; \n\
152+ radius: "medium"; \n\
153+ } \n\
154+ Rectangle { \n\
155+ color: Qt.rgba(0, 0, 0, 0.5); \n\
156+ anchors.centerIn: parent; \n\
157+ width: parent.width * 0.5; \n\
158+ height: width; \n\
159+ radius: width / 2; \n\
160+ } \n\
161+ Icon { \n\
162+ anchors.centerIn: parent; \n\
163+ width: parent.width * 0.3; \n\
164+ height: width; \n\
165+ opacity: 0.9; \n\
166+ name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start"; \n\
167+ color: "white"; \n\
168+ asynchronous: %4; \n\
169+ } \n\
170+ onClicked: { \n\
171+ if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) { \n\
172+ if (DashAudioPlayer.playing) { \n\
173+ DashAudioPlayer.pause(); \n\
174+ } else { \n\
175+ DashAudioPlayer.play(); \n\
176+ } \n\
177+ } else { \n\
178+ var playlist = (cardData["quickPreviewData"] && cardData["quickPreviewData"]["playlist"]) || null; \n\
179+ DashAudioPlayer.playSource(source, playlist); \n\
180+ } \n\
181+ } \n\
182+ onPressAndHold: { \n\
183+ root.pressAndHold(); \n\
184+ } \n\
185+ }';
186+
187+// %1 is whether the loader should be asynchronous or not
188+// %2 is the header height code
139189var kOverlayLoaderCode = 'Loader { \n\
140190 id: overlayLoader; \n\
141− readonly property real overlayHeight: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2); \n\
191+ readonly property real overlayHeight: %2 + units.gu(2); \n\
142192 anchors.fill: artShapeHolder; \n\
143193 active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false; \n\
144− asynchronous: root.asynchronous; \n\
194+ asynchronous: %1; \n\
145195 visible: showHeader && status == Loader.Ready; \n\
146196 sourceComponent: UbuntuShapeOverlay { \n\
147197 id: overlay; \n\
@@ -160,17 +210,19 @@ function kHeaderRowCodeGenerator() {
160210 objectName: "outerRow"; \n\
161211 property real margins: units.gu(1); \n\
162212 spacing: margins; \n\
163− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight; \n\
213+ %2\
164214 anchors { %1 } \n\
165215 anchors.right: parent.right; \n\
166216 anchors.margins: margins; \n\
167217 anchors.rightMargin: 0; \n\
168218 data: [ \n\
169− %2 \n\
219+ %3 \n\
170220 ] \n\
171221 }\n';
172222 var args = Array.prototype.slice.call(arguments);
173− var code = kHeaderRowCodeTemplate.arg(args.shift()).arg(args.join(',\n'));
223+ var isCardTool = args.shift();
224+ var heightCode = isCardTool ? "" : "height: root.fixedHeaderHeight; \n";
225+ var code = kHeaderRowCodeTemplate.arg(args.shift()).arg(heightCode).arg(args.join(',\n'));
174226 return code;
175227}
176228
@@ -191,10 +243,11 @@ function kHeaderContainerCodeGenerator() {
191243}
192244
193245// %1 is used as anchors of mascotShapeLoader
246+// %2 is whether the loader should be asynchronous or not
194247var kMascotShapeLoaderCode = 'Loader { \n\
195248 id: mascotShapeLoader; \n\
196249 objectName: "mascotShapeLoader"; \n\
197− asynchronous: root.asynchronous; \n\
250+ asynchronous: %2; \n\
198251 active: mascotImage.status === Image.Ready; \n\
199252 visible: showHeader && active && status == Loader.Ready; \n\
200253 width: units.gu(6); \n\
@@ -205,22 +258,26 @@ var kMascotShapeLoaderCode = 'Loader { \n\
205258
206259// %1 is used as anchors of mascotImage
207260// %2 is used as visible of mascotImage
261+// %3 is injected as code to mascotImage
262+// %4 is used as fallback image
208263var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
209264 id: mascotImage; \n\
210265 objectName: "mascotImage"; \n\
211266 anchors { %1 } \n\
212− source: cardData && cardData["mascot"] || ""; \n\
267+ source: cardData && cardData["mascot"] || %4; \n\
213268 width: units.gu(6); \n\
214269 height: units.gu(5.625); \n\
215270 horizontalAlignment: Image.AlignHCenter; \n\
216271 verticalAlignment: Image.AlignVCenter; \n\
217272 visible: %2; \n\
273+ %3 \n\
218274 }\n';
219275
220276// %1 is used as anchors of titleLabel
221277// %2 is used as color of titleLabel
222278// %3 is used as extra condition for visible of titleLabel
223279// %4 is used as title width
280+// %5 is used as horizontal alignment
224281var kTitleLabelCode = 'Label { \n\
225282 id: titleLabel; \n\
226283 objectName: "titleLabel"; \n\
@@ -235,7 +292,7 @@ var kTitleLabelCode = 'Label { \n\
235292 width: %4; \n\
236293 text: root.title; \n\
237294 font.weight: cardData && cardData["subtitle"] ? Font.DemiBold : Font.Normal; \n\
238− horizontalAlignment: root.titleAlignment; \n\
295+ horizontalAlignment: %5; \n\
239296 }\n';
240297
241298// %1 is used as extra anchors of emblemIcon
@@ -316,32 +373,60 @@ var kSummaryLabelCode = 'Label { \n\
316373 color: %3; \n\
317374 }\n';
318375
319−function cardString(template, components) {
376+// %1 is used as bottom anchor of audio progress bar
377+// %2 is used as left anchor of audio progress bar
378+// %3 is used as text color
379+var kAudioProgressBarCode = 'CardAudioProgress { \n\
380+ id: audioProgressBar; \n\
381+ duration: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["duration"]) || 0; \n\
382+ source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || ""; \n\
383+ anchors { \n\
384+ bottom: %1; \n\
385+ left: %2; \n\
386+ right: parent.right; \n\
387+ margins: units.gu(1); \n\
388+ } \n\
389+ color: %3; \n\
390+ }';
391+
392+function sanitizeColor(colorString) {
393+ if (colorString !== undefined) {
394+ if (colorString.match(/^[#a-z0-9]*$/i) === null) {
395+ // This is not the perfect regexp for color
396+ // but what we're trying to do here is just protect
397+ // against injection so it's ok
398+ return "";
399+ }
400+ }
401+ return colorString;
402+}
403+
404+function cardString(template, components, isCardTool) {
320405 var code;
321406
322407 var templateInteractive = (template == null ? true : (template["non-interactive"] !== undefined ? !template["non-interactive"] : true)) ? "true" : "false";
323408
324409 code = 'AbstractButton { \n\
325410 id: root; \n\
326− property var components; \n\
327411 property var cardData; \n\
328412 property string artShapeStyle: "inset"; \n\
329413 property string backgroundShapeStyle: "inset"; \n\
330414 property real fontScale: 1.0; \n\
331415 property var scopeStyle: null; \n\
332− property int titleAlignment: Text.AlignLeft; \n\
333− property int fixedHeaderHeight: -1; \n\
416+ %2\
334417 property size fixedArtShapeSize: Qt.size(-1, -1); \n\
335418 readonly property string title: cardData && cardData["title"] || ""; \n\
336− property bool asynchronous: true; \n\
337419 property bool showHeader: true; \n\
338420 implicitWidth: childrenRect.width; \n\
339421 enabled: %1; \n\
340422 \n'.arg(templateInteractive);
341423
424+ code = code.arg(isCardTool ? "" : "property int fixedHeaderHeight: -1; \n");
425+
342426 var hasArt = components["art"] && components["art"]["field"] || false;
343427 var hasSummary = components["summary"] || false;
344− var artAndSummary = hasArt && hasSummary && components["art"]["conciergeMode"] !== true;
428+ var isConciergeMode = components["art"] && components["art"]["conciergeMode"] || false;
429+ var artAndSummary = hasArt && hasSummary && !isConciergeMode;
345430 var isHorizontal = template["card-layout"] === "horizontal";
346431 var hasBackground = (!isHorizontal && (template["card-background"] || components["background"] || artAndSummary)) ||
347432 (hasSummary && (template["card-background"] || components["background"]));
@@ -351,21 +436,43 @@ function cardString(template, components) {
351436 var headerAsOverlay = hasArt && template && template["overlay"] === true && (hasTitle || hasMascot);
352437 var hasSubtitle = hasTitle && components["subtitle"] || false;
353438 var hasHeaderRow = hasMascot && hasTitle;
354− var hasAttributes = hasTitle && components["attributes"]["field"] || false;
439+ var hasAttributes = hasTitle && components["attributes"] && components["attributes"]["field"] || false;
440+ var isAudio = template["quick-preview-type"] === "audio";
441+ var asynchronous = isCardTool ? "false" : "true";
442+
443+ if (isAudio) {
444+ // For now we only support audio cards with [optional] art, title, subtitle
445+ // in horizontal mode
446+ // Anything else makes it behave not like an audio card
447+ if (hasSummary) isAudio = false;
448+ if (!isHorizontal) isAudio = false;
449+ if (hasMascot) isAudio = false;
450+ if (hasEmblem) isAudio = false;
451+ if (headerAsOverlay) isAudio = false;
452+ if (hasAttributes) isAudio = false;
453+ }
355454
356455 if (hasBackground) {
357− var templateCardBackground = (template && typeof template["card-background"] === "string") ? template["card-background"] : "";
456+ var templateCardBackground;
457+ if (template && typeof template["card-background"] === "string") {
458+ templateCardBackground = 'decodeURI("' + encodeURI(template["card-background"]) + '")';
459+ } else {
460+ templateCardBackground = '""';
461+ }
462+
358463 var backgroundElements0;
359464 var backgroundElements1;
360465 if (template && typeof template["card-background"] === "object" && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
361− if (template["card-background"]["elements"][0] !== undefined) {
362− backgroundElements0 = '"%1"'.arg(template["card-background"]["elements"][0]);
466+ var element0 = sanitizeColor(template["card-background"]["elements"][0]);
467+ var element1 = sanitizeColor(template["card-background"]["elements"][1]);
468+ if (element0 !== undefined) {
469+ backgroundElements0 = '"%1"'.arg(element0);
363470 }
364− if (template["card-background"]["elements"][1] !== undefined) {
365− backgroundElements1 = '"%1"'.arg(template["card-background"]["elements"][1]);
471+ if (element1 !== undefined) {
472+ backgroundElements1 = '"%1"'.arg(element1);
366473 }
367474 }
368− code += kBackgroundLoaderCode.arg(templateCardBackground).arg(backgroundElements0).arg(backgroundElements1);
475+ code += kBackgroundLoaderCode.arg(backgroundElements0).arg(backgroundElements1).arg(asynchronous).arg(templateCardBackground);
369476 }
370477
371478 if (hasArt) {
@@ -390,17 +497,35 @@ function cardString(template, components) {
390497 heightCode = 'width / artShape.aspect';
391498 }
392499
393− code += kArtShapeHolderCode.arg(artAnchors).arg(widthCode).arg(heightCode);
394− var fallback = components["art"] && components["art"]["fallback"] || "";
500+ var aspectRatio = components["art"] && components["art"]["aspect-ratio"] || 1;
501+ if (isNaN(aspectRatio)) {
502+ aspectRatio = 1;
503+ }
504+ var fallback = !isCardTool && components["art"] && components["art"]["fallback"] || "";
505+ fallback = encodeURI(fallback);
506+ var fallbackStatusCode = "";
507+ var fallbackURICode = '""';
395508 if (fallback !== "") {
396− code += 'Connections { target: artShapeLoader.item ? artShapeLoader.item.image : null; onStatusChanged: if (artShapeLoader.item.image.status === Image.Error) artShapeLoader.item.image.source = "%1"; } \n'.arg(fallback);
509+ // fallbackStatusCode has %6 in it because we want to substitute it for fallbackURICode
510+ // which in kArtShapeHolderCode is %8
511+ fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %8;';
512+ fallbackURICode = 'decodeURI("%1")'.arg(fallback);
397513 }
514+ code += kArtShapeHolderCode.arg(artAnchors)
515+ .arg(widthCode)
516+ .arg(heightCode)
517+ .arg(isConciergeMode ? "false" : "true")
518+ .arg(aspectRatio)
519+ .arg(asynchronous)
520+ .arg(fallbackStatusCode)
521+ .arg(fallbackURICode);
398522 } else {
399523 code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
400524 }
401525
402526 if (headerAsOverlay) {
403− code += kOverlayLoaderCode;
527+ var headerHeightCode = isCardTool ? "headerHeight" : "root.fixedHeaderHeight";
528+ code += kOverlayLoaderCode.arg(asynchronous).arg(headerHeightCode);
404529 }
405530
406531 var headerVerticalAnchors;
@@ -421,17 +546,22 @@ function cardString(template, components) {
421546 topMargin: units.gu(1);\n';
422547 }
423548 }
549+
424550 var headerLeftAnchor;
425551 var headerLeftAnchorHasMargin = false;
426552 if (isHorizontal && hasArt) {
427553 headerLeftAnchor = 'left: artShapeHolder.right; \n\
428554 leftMargin: units.gu(1);\n';
429555 headerLeftAnchorHasMargin = true;
556+ } else if (isHorizontal && isAudio) {
557+ headerLeftAnchor = 'left: audioButton.right; \n\
558+ leftMargin: units.gu(1);\n';
559+ headerLeftAnchorHasMargin = true;
430560 } else {
431561 headerLeftAnchor = 'left: parent.left;\n';
432562 }
433563
434− var touchdownOnArtShape = !hasBackground && hasArt && !hasMascot && !hasSummary;
564+ var touchdownOnArtShape = !hasBackground && hasArt && !hasMascot && !hasSummary && !isAudio;
435565
436566 if (hasHeaderRow) {
437567 code += 'readonly property int headerHeight: row.height;\n'
@@ -445,6 +575,14 @@ function cardString(template, components) {
445575 } else {
446576 code += 'readonly property int headerHeight: attributesRow.height;\n'
447577 }
578+ } else if (isAudio) {
579+ if (hasSubtitle) {
580+ code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin + audioProgressBar.height + audioProgressBar.anchors.topMargin;\n'
581+ } else if (hasTitle) {
582+ code += 'readonly property int headerHeight: titleLabel.height + audioProgressBar.height + audioProgressBar.anchors.topMargin;\n'
583+ } else {
584+ code += 'readonly property int headerHeight: audioProgressBar.height;\n'
585+ }
448586 } else if (hasSubtitle) {
449587 code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;\n'
450588 } else if (hasTitle) {
@@ -469,15 +607,21 @@ function cardString(template, components) {
469607 }
470608
471609 if (useMascotShape) {
472− mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors);
610+ mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors).arg(asynchronous);
473611 }
474612
475613 var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
476− mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible);
477− var fallback = components["mascot"] && components["mascot"]["fallback"] || "";
614+ var fallback = !isCardTool && components["mascot"] && components["mascot"]["fallback"] || "";
615+ fallback = encodeURI(fallback);
616+ var fallbackStatusCode = "";
617+ var fallbackURICode = '""';
478618 if (fallback !== "") {
479− code += 'Connections { target: mascotImage; onStatusChanged: if (mascotImage.status === Image.Error) mascotImage.source = "%1"; } \n'.arg(fallback);
619+ // fallbackStatusCode has %4 in it because we want to substitute it for fallbackURICode
620+ // which in kMascotImageCode is %4
621+ fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %4;';
622+ fallbackURICode = 'decodeURI("%1")'.arg(fallback);
480623 }
624+ mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible).arg(fallbackStatusCode).arg(fallbackURICode);
481625 }
482626
483627 var summaryColorWithBackground = 'backgroundLoader.active && backgroundLoader.item && root.scopeStyle ? root.scopeStyle.getTextColor(backgroundLoader.item.luminance) : (backgroundLoader.item && backgroundLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white")';
@@ -583,9 +727,24 @@ function cardString(template, components) {
583727 }
584728 }
585729
730+ var titleAlignment = "Text.AlignHCenter";
731+ if (template["card-layout"] === "horizontal"
732+ || typeof components["title"] !== "object"
733+ || components["title"]["align"] === "left") titleAlignment = "Text.AlignLeft";
734+ var keys = ["mascot", "emblem", "subtitle", "attributes", "summary"];
735+ for (var key in keys) {
736+ key = keys[key];
737+ try {
738+ if (typeof components[key] === "string"
739+ || typeof components[key]["field"] === "string") titleAlignment = "Text.AlignLeft";
740+ } catch (e) {
741+ continue;
742+ }
743+ }
744+
586745 // code for different elements
587746 var titleLabelVisibleExtra = (headerAsOverlay ? '&& overlayLoader.active': '');
588− var titleCode = kTitleLabelCode.arg(titleAnchors).arg(titleColor).arg(titleLabelVisibleExtra).arg(titleWidth);
747+ var titleCode = kTitleLabelCode.arg(titleAnchors).arg(titleColor).arg(titleLabelVisibleExtra).arg(titleWidth).arg(titleAlignment);
589748 var subtitleCode;
590749 var attributesCode;
591750
@@ -627,11 +786,36 @@ function cardString(template, components) {
627786 if (mascotShapeCode != '') {
628787 rowCode.unshift(mascotShapeCode);
629788 }
630− code += kHeaderRowCodeGenerator(headerVerticalAnchors + headerLeftAnchor, rowCode)
789+ code += kHeaderRowCodeGenerator(isCardTool, headerVerticalAnchors + headerLeftAnchor, rowCode)
631790 } else {
632791 code += mascotShapeCode + mascotCode + titleSubtitleCode;
633792 }
634793
794+ if (isAudio) {
795+ var audioProgressBarLeftAnchor = 'audioButton.right';
796+ var audioProgressBarBottomAnchor = 'audioButton.bottom';
797+ var audioProgressBarTextColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
798+
799+ code += kAudioProgressBarCode.arg(audioProgressBarBottomAnchor)
800+ .arg(audioProgressBarLeftAnchor)
801+ .arg(audioProgressBarTextColor);
802+
803+ var audioButtonAnchorsFill;
804+ var audioButtonWidth;
805+ var audioButtonHeight;
806+ if (hasArt) {
807+ audioButtonAnchorsFill = 'artShapeHolder';
808+ audioButtonWidth = 'undefined';
809+ audioButtonHeight = 'undefined';
810+ } else {
811+ audioButtonAnchorsFill = 'undefined';
812+ audioButtonWidth = 'height';
813+ audioButtonHeight = isCardTool ? 'headerHeight + 2 * units.gu(1)'
814+ : 'root.fixedHeaderHeight + 2 * units.gu(1)';
815+ }
816+ code += kAudioButtonCode.arg(audioButtonAnchorsFill).arg(audioButtonWidth).arg(audioButtonHeight).arg(asynchronous);
817+ }
818+
635819 if (hasSummary) {
636820 var summaryTopAnchor;
637821 if (isHorizontal && hasArt) summaryTopAnchor = 'artShapeHolder.bottom';
@@ -670,6 +854,8 @@ function cardString(template, components) {
670854 var implicitHeight = 'implicitHeight: ';
671855 if (hasSummary) {
672856 implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
857+ } else if (isAudio) {
858+ implicitHeight += 'audioButton.height;\n';
673859 } else if (headerAsOverlay) {
674860 implicitHeight += 'artShapeHolder.height;\n';
675861 } else if (hasHeaderRow) {
@@ -696,17 +882,17 @@ function cardString(template, components) {
696882 return code;
697883}
698884
699−function createCardComponent(parent, template, components) {
885+function createCardComponent(parent, template, components, isCardTool, identifier) {
700886 var imports = 'import QtQuick 2.4; \n\
701887 import Ubuntu.Components 1.3; \n\
702888 import Ubuntu.Settings.Components 0.1; \n\
703889 import Dash 0.1;\n\
704890 import Utils 0.1;\n';
705− var card = cardString(template, components);
891+ var card = cardString(template, components, isCardTool);
706892 var code = imports + 'Component {\n' + card + '}\n';
707893
708894 try {
709− return Qt.createQmlObject(code, parent, "createCardComponent");
895+ return Qt.createQmlObject(code, parent, identifier);
710896 } catch (e) {
711897 console.error("ERROR: Invalid component created.");
712898 console.error("Template:");
plugins/Dash/CardCreatorCache.qml+3−3
@@ -23,16 +23,16 @@ QtObject {
2323
2424 property var cache: new Object();
2525
26− function getCardComponent(template, components) {
26+ function getCardComponent(template, components, isCardTool) {
2727 if (template === undefined || components === undefined)
2828 return undefined;
2929
3030 var tString = JSON.stringify(template);
3131 var cString = JSON.stringify(components);
32− var allString = tString + cString;
32+ var allString = tString + cString + isCardTool;
3333 var component = cache[allString];
3434 if (component === undefined) {
35− component = CardCreator.createCardComponent(root, template, components);
35+ component = CardCreator.createCardComponent(root, template, components, isCardTool, allString);
3636 cache[allString] = component;
3737 }
3838 return component;
plugins/Dash/DashAudioPlayer.qmlnew file+96
@@ -0,0 +1,96 @@
1+/*
2+ * Copyright (C) 2015 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+pragma Singleton
18+import QtQuick 2.4
19+import QtMultimedia 5.6
20+import Dash 0.1
21+
22+QtObject {
23+ readonly property real progress: audio.position / audio.duration
24+ readonly property bool playing: audio.playbackState === Audio.PlayingState
25+ readonly property bool paused: audio.playbackState === Audio.PausedState
26+ readonly property bool stopped: audio.playbackState === Audio.StoppedState
27+ readonly property alias position: audio.position
28+ readonly property url currentSource: audio.playlist.currentItemSource
29+
30+ function playSource(newSource, newPlaylist) {
31+ stop();
32+ audio.playlist.clear();
33+ if (newPlaylist) {
34+ // Look for newSource in newPlaylist
35+ var sourceIndex = -1;
36+ for (var i in newPlaylist) {
37+ if (AudioUrlComparer.compare(newSource, newPlaylist[i])) {
38+ sourceIndex = i;
39+ break;
40+ }
41+ }
42+ var urls = [];
43+ if (sourceIndex === -1 && newSource != "") {
44+ // If the playing song is not in the playlist, add it
45+ urls.push(newSource);
46+ sourceIndex = 0;
47+ }
48+ for (var i in newPlaylist) {
49+ urls.push(newPlaylist[i]);
50+ }
51+ audio.playlist.addItems(urls);
52+ audio.playlist.currentIndex = sourceIndex;
53+ } else {
54+ audio.playlist.addItem(newSource);
55+ audio.playlist.currentIndex = 0;
56+ }
57+ play();
58+ }
59+
60+ function stop() {
61+ audio.stop();
62+ }
63+
64+ function play() {
65+ audio.play();
66+ }
67+
68+ function pause() {
69+ audio.pause();
70+ }
71+
72+ property QtObject audio: Audio {
73+ id: audio
74+ objectName: "audio"
75+ playlist: Playlist {
76+ objectName: "playlist"
77+ }
78+
79+ onErrorStringChanged: console.warn("Dash Audio player error:", errorString)
80+ }
81+
82+ function lengthToString(s) {
83+ if (typeof(s) !== "number" || s < 0) return "";
84+
85+ var sec = "" + s % 60;
86+ if (sec.length == 1) sec = "0" + sec;
87+ var hour = Math.floor(s / 3600);
88+ if (hour < 1) {
89+ return Math.floor(s / 60) + ":" + sec;
90+ } else {
91+ var min = "" + Math.floor(s / 60) % 60;
92+ if (min.length == 1) min = "0" + min;
93+ return hour + ":" + min + ":" + sec;
94+ }
95+ }
96+}
plugins/Dash/ScopeStyle.qml+1−1
@@ -58,7 +58,7 @@ QtObject {
5858 readonly property url headerLogo: "logo" in d.headerStyle ? d.headerStyle["logo"] : ""
5959
6060 /// Background style for the header
61− readonly property url headerBackground: "background" in d.headerStyle ? d.headerStyle["background"] : "color:///#f5f5f5"
61+ readonly property url headerBackground: "background" in d.headerStyle ? d.headerStyle["background"] : "color:///#ffffff"
6262
6363 /// Foreground color for the header
6464 readonly property color headerForeground: "foreground-color" in d.headerStyle ? d.headerStyle["foreground-color"] : foreground
plugins/Dash/graphics/music_progress_bg.pngnew file

Binary file not shown.

plugins/Dash/listviewwithpageheader.cpp+50−20
@@ -219,13 +219,7 @@ void ListViewWithPageHeader::setDelegate(QQmlComponent *delegate)
219219 Q_FOREACH(ListItem *item, m_visibleItems)
220220 releaseItem(item);
221221 m_visibleItems.clear();
222− m_firstVisibleIndex = -1;
223− adjustMinYExtent();
224− setContentY(0);
225− m_clipItem->setY(0);
226− if (m_topSectionItem) {
227− QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
228− }
222+ initializeValuesForEmptyList();
229223
230224 m_delegateModel->setDelegate(delegate);
231225
@@ -236,6 +230,17 @@ void ListViewWithPageHeader::setDelegate(QQmlComponent *delegate)
236230 }
237231}
238232
233+void ListViewWithPageHeader::initializeValuesForEmptyList()
234+{
235+ m_firstVisibleIndex = -1;
236+ adjustMinYExtent();
237+ setContentY(0);
238+ m_clipItem->setY(0);
239+ if (m_topSectionItem) {
240+ QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
241+ }
242+}
243+
239244QQuickItem *ListViewWithPageHeader::header() const
240245{
241246 return m_headerItem;
@@ -280,7 +285,7 @@ void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
280285
281286 m_sectionDelegate = delegate;
282287
283− m_topSectionItem = getSectionItem(QString());
288+ m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
284289 m_topSectionItem->setZ(3);
285290 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
286291 connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
@@ -509,6 +514,11 @@ qreal ListViewWithPageHeader::minYExtent() const
509514 return m_minYExtent;
510515}
511516
517+qreal ListViewWithPageHeader::maxYExtent() const
518+{
519+ return height() - contentHeight();
520+}
521+
512522void ListViewWithPageHeader::componentComplete()
513523{
514524 if (m_delegateModel)
@@ -695,8 +705,10 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
695705
696706void ListViewWithPageHeader::releaseItem(ListItem *listItem)
697707{
698− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
699− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
708+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
709+ if (listItem->sectionItem()) {
710+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
711+ }
700712 m_itemsToRelease << listItem;
701713}
702714
@@ -739,7 +751,7 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
739751 return getSectionItem(section);
740752}
741753
742−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
754+QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText, bool watchGeometry)
743755{
744756 QQuickItem *sectionItem = nullptr;
745757
@@ -763,7 +775,9 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
763775 }
764776 m_sectionDelegate->completeCreate();
765777
766− // TODO attach to sectionItem so we can accomodate to it changing its height
778+ if (watchGeometry) {
779+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
780+ }
767781
768782 return sectionItem;
769783}
@@ -835,7 +849,7 @@ bool ListViewWithPageHeader::removeNonVisibleItems(qreal bufferFrom, qreal buffe
835849 }
836850 }
837851 if (!foundVisible) {
838− m_firstVisibleIndex = -1;
852+ initializeValuesForEmptyList();
839853 }
840854 if (m_firstVisibleIndex != oldFirstVisibleIndex) {
841855 adjustMinYExtent();
@@ -1092,7 +1106,11 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
10921106 }
10931107
10941108 if (m_firstVisibleIndex != oldFirstVisibleIndex) {
1095− adjustMinYExtent();
1109+ if (m_visibleItems.isEmpty()) {
1110+ initializeValuesForEmptyList();
1111+ } else {
1112+ adjustMinYExtent();
1113+ }
10961114 }
10971115
10981116 for (int i = 0; i < m_visibleItems.count(); ++i) {
@@ -1117,15 +1135,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
11171135 }
11181136}
11191137
1120−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1138+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
11211139{
11221140 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
11231141 if (heightDiff != 0) {
1124− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1142+ if (!m_visibleItems.isEmpty()) {
11251143 ListItem *firstItem = m_visibleItems.first();
1126− firstItem->setY(firstItem->y() - heightDiff);
1127− adjustMinYExtent();
1128− layout();
1144+ const auto prevFirstItemY = firstItem->y();
1145+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1146+ firstItem->setY(firstItem->y() - heightDiff);
1147+ } else if (item == firstItem->sectionItem()) {
1148+ firstItem->setY(firstItem->y() + heightDiff);
1149+ }
1150+
1151+ if (firstItem->y() != prevFirstItemY) {
1152+ adjustMinYExtent();
1153+ layout();
1154+ }
11291155 }
11301156 refill();
11311157 adjustMinYExtent();
@@ -1177,7 +1203,7 @@ void ListViewWithPageHeader::headerHeightChanged(qreal newHeaderHeight, qreal ol
11771203
11781204void ListViewWithPageHeader::adjustMinYExtent()
11791205{
1180− if (m_visibleItems.isEmpty()) {
1206+ if (m_visibleItems.isEmpty() || (contentHeight() + m_minYExtent < height())) {
11811207 m_minYExtent = 0;
11821208 } else {
11831209 qreal nonCreatedHeight = 0;
@@ -1359,6 +1385,10 @@ void ListViewWithPageHeader::updatePolish()
13591385
13601386 m_contentHeightDirty = false;
13611387 adjustMinYExtent();
1388+ if (contentHeight + m_minYExtent < height()) {
1389+ // need this since in the previous call to adjustMinYExtent contentHeight is not set yet
1390+ m_minYExtent = 0;
1391+ }
13621392 m_inContentHeightKeepHeaderShown = m_headerItem && m_headerItem->y() == contentY();
13631393 setContentHeight(contentHeight);
13641394 m_inContentHeightKeepHeaderShown = false;
plugins/Dash/listviewwithpageheader.h+3−1
@@ -115,6 +115,7 @@ protected:
115115 void componentComplete() override;
116116 void viewportMoved(Qt::Orientations orient) override;
117117 qreal minYExtent() const override;
118+ qreal maxYExtent() const override;
118119 void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
119120 void itemImplicitHeightChanged(QQuickItem *item) override;
120121 void updatePolish() override;
@@ -166,8 +167,9 @@ private:
166167 void reallyReleaseItem(ListItem *item);
167168 void updateWatchedRoles();
168169 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169− QQuickItem *getSectionItem(const QString &sectionText);
170+ QQuickItem *getSectionItem(const QString &sectionText, bool watchGeometry = true);
170171 void updateSectionItem(int modelIndex);
172+ void initializeValuesForEmptyList();
171173
172174 QQmlDelegateModel *m_delegateModel;
173175
plugins/Dash/plugin.cpp+35
@@ -23,6 +23,38 @@
2323#include "verticaljournal.h"
2424
2525#include <QAbstractItemModel>
26+#include <QUrlQuery>
27+
28+static QUrl oauthCleanedUrl(QUrl u)
29+{
30+ QUrlQuery q(u);
31+ q.removeQueryItem(QStringLiteral("oauth_nonce"));
32+ q.removeQueryItem(QStringLiteral("oauth_timestamp"));
33+ q.removeQueryItem(QStringLiteral("oauth_consumer_key"));
34+ q.removeQueryItem(QStringLiteral("oauth_signature_method"));
35+ q.removeQueryItem(QStringLiteral("oauth_version"));
36+ q.removeQueryItem(QStringLiteral("oauth_signature"));
37+ u.setQuery(q);
38+ return u;
39+}
40+
41+class AudioComparer : public QObject
42+{
43+ Q_OBJECT
44+public:
45+ Q_INVOKABLE bool compare(const QUrl &url1, const QUrl &url2)
46+ {
47+ return oauthCleanedUrl(url1) == oauthCleanedUrl(url2);
48+ }
49+};
50+
51+static QObject *audio_comparer_singleton_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
52+{
53+ Q_UNUSED(engine)
54+ Q_UNUSED(scriptEngine)
55+
56+ return new AudioComparer();
57+}
2658
2759void DashPlugin::registerTypes(const char *uri)
2860{
@@ -32,4 +64,7 @@ void DashPlugin::registerTypes(const char *uri)
3264 qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
3365 qmlRegisterType<OrganicGrid>(uri, 0, 1, "OrganicGrid");
3466 qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
67+ qmlRegisterSingletonType<AudioComparer>(uri, 0, 1, "AudioUrlComparer", audio_comparer_singleton_provider);
3568}
69+
70+#include "plugin.moc"
plugins/Dash/qmldir+3
@@ -2,6 +2,9 @@ module Dash
22plugin Dash-qml
33typeinfo Dash.qmltypes
44singleton CardCreatorCache 0.1 CardCreatorCache.qml
5+singleton DashAudioPlayer 0.1 DashAudioPlayer.qml
56ScopeStyle 0.1 ScopeStyle.qml
67CardAttributes 0.1 CardAttributes.qml
78CroppedImageMinimumSourceSize 0.1 CroppedImageMinimumSourceSize.qml
9+AudioProgressBar 0.1 AudioProgressBar.qml
10+CardAudioProgress 0.1 CardAudioProgress.qml
plugins/GlobalShortcut/GlobalShortcut.qmltypesnew file+31
@@ -0,0 +1,31 @@
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 GlobalShortcut 1.0 plugins'
8+
9+Module {
10+ Component {
11+ name: "GlobalShortcut"
12+ defaultProperty: "data"
13+ prototype: "QQuickItem"
14+ exports: ["GlobalShortcut/GlobalShortcut 1.0"]
15+ exportMetaObjectRevisions: [0]
16+ Property { name: "shortcut"; type: "QVariant" }
17+ Property { name: "active"; type: "bool" }
18+ Signal {
19+ name: "shortcutChanged"
20+ Parameter { name: "shortcut"; type: "QVariant" }
21+ }
22+ Signal {
23+ name: "triggered"
24+ Parameter { name: "shortcut"; type: "string" }
25+ }
26+ Signal {
27+ name: "activeChanged"
28+ Parameter { name: "active"; type: "bool" }
29+ }
30+ }
31+}
plugins/GlobalShortcut/globalshortcutregistry.cpp+4−4
@@ -35,13 +35,13 @@ GlobalShortcutList GlobalShortcutRegistry::shortcuts() const
3535
3636bool GlobalShortcutRegistry::hasShortcut(const QVariant &seq) const
3737{
38− return m_shortcuts.keys().contains(seq);
38+ return m_shortcuts.contains(seq);
3939}
4040
4141void GlobalShortcutRegistry::addShortcut(const QVariant &seq, GlobalShortcut *sc)
4242{
4343 if (sc) {
44− if (!m_shortcuts.keys().contains(seq)) { // create a new entry
44+ if (!m_shortcuts.contains(seq)) { // create a new entry
4545 m_shortcuts.insert(seq, {sc});
4646 } else { // append to an existing one
4747 auto shortcuts = m_shortcuts[seq];
@@ -75,8 +75,8 @@ bool GlobalShortcutRegistry::eventFilter(QObject *obj, QEvent *event)
7575
7676 if (event->type() == QEvent::KeyPress) {
7777 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
78− QKeySequence seq = QKeySequence(keyEvent->key() + keyEvent->modifiers());
79− if (m_shortcuts.keys().contains(seq)) {
78+ int seq = keyEvent->key() + keyEvent->modifiers();
79+ if (m_shortcuts.contains(seq)) {
8080 const auto shortcuts = m_shortcuts.value(seq);
8181 Q_FOREACH(const auto &shortcut, shortcuts) {
8282 if (shortcut) {
plugins/IntegratedLightDM/liblightdm/CMakeLists.txt+19−3
@@ -5,31 +5,47 @@ set(LibLightDM_SOURCES
55 UsersModel.cpp
66 GreeterPrivate.cpp
77 UsersModelPrivate.cpp
8+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
89 ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
910 )
1011
1112add_library(integratedLightDM STATIC ${LibLightDM_SOURCES})
13+add_library(integratedLightDMSession STATIC ${LibLightDM_SOURCES})
1214add_library(MockLightDM-demo-shared SHARED ${LibLightDM_SOURCES})
1315
1416include_directories(
17+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService
1518 ${CMAKE_CURRENT_BINARY_DIR}
19+ ${GLIB_INCLUDE_DIRS}
1620 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
1721)
1822
1923target_link_libraries(integratedLightDM
24+ ${GLIB_LIBRARIES}
25+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
26+ -lpam
27+)
28+target_link_libraries(integratedLightDMSession
29+ ${GLIB_LIBRARIES}
2030 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
2131 -lpam
2232)
2333target_link_libraries(MockLightDM-demo-shared
34+ ${GLIB_LIBRARIES}
2435 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
2536 -lpam
2637)
2738
28−qt5_use_modules(integratedLightDM Concurrent Gui)
29−qt5_use_modules(MockLightDM-demo-shared Concurrent Gui)
39+qt5_use_modules(integratedLightDM Concurrent DBus Gui)
40+qt5_use_modules(integratedLightDMSession Concurrent DBus Gui)
41+qt5_use_modules(MockLightDM-demo-shared Concurrent DBus Gui)
3042
31−set_target_properties(integratedLightDM PROPERTIES COMPILE_FLAGS -fPIC)
43+set_target_properties(integratedLightDM PROPERTIES
44+ COMPILE_FLAGS "-DSM_BUSNAME=systemBus -fPIC")
45+set_target_properties(integratedLightDMSession PROPERTIES
46+ COMPILE_FLAGS "-DSM_BUSNAME=sessionBus -fPIC")
3247set_target_properties(MockLightDM-demo-shared PROPERTIES
48+ COMPILE_FLAGS "-DSM_BUSNAME=systemBus"
3349 OUTPUT_NAME lightdm-qt5-2)
3450
3551install(TARGETS MockLightDM-demo-shared
plugins/IntegratedLightDM/liblightdm/UsersModel.cpp+4−18
@@ -54,24 +54,10 @@ UsersModel::UsersModel(QObject *parent) :
5454 roles[ImagePathRole] = "imagePath";
5555 setRoleNames(roles);
5656
57− // Now modify our mock user backgrounds
58− QDir bgdir = QDir(QStringLiteral("/usr/share/demo-assets/shell/backgrounds/"));
59− QStringList backgrounds = bgdir.entryList(QDir::Files | QDir::NoDotAndDotDot);
60−
61− for (int i = 0, j = 0; i < d->entries.size(); i++) {
62− Entry &entry = d->entries[i];
63− if (entry.background.isNull() && !backgrounds.isEmpty()) {
64− entry.background = bgdir.filePath(backgrounds[j++]);
65− if (j >= backgrounds.length()) {
66− j = 0;
67− }
68− }
69− }
70−}
71−
72−UsersModel::~UsersModel()
73−{
74− delete d_ptr;
57+ connect(d_ptr, &UsersModelPrivate::dataChanged, this, [this](int i) {
58+ QModelIndex index = createIndex(i, 0);
59+ Q_EMIT dataChanged(index, index);
60+ });
7561}
7662
7763int UsersModel::rowCount(const QModelIndex &parent) const
plugins/IntegratedLightDM/liblightdm/UsersModel.h+1−1
@@ -41,7 +41,7 @@ class Q_DECL_EXPORT UsersModel : public QAbstractListModel
4141
4242public:
4343 explicit UsersModel(QObject *parent = 0);
44− virtual ~UsersModel();
44+ virtual ~UsersModel() = default;
4545
4646 enum UserModelRoles {NameRole = Qt::UserRole,
4747 RealNameRole,
plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+59−9
@@ -18,6 +18,11 @@
1818
1919#include "UsersModelPrivate.h"
2020
21+#include "AccountsServiceDBusAdaptor.h"
22+#include "UsersModel.h"
23+
24+#include <glib.h>
25+#include <QDebug>
2126#include <QDir>
2227#include <QSettings>
2328#include <QStringList>
@@ -26,16 +31,61 @@ namespace QLightDM
2631{
2732
2833UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
29− : q_ptr(parent)
34+ : QObject(parent),
35+ q_ptr(parent),
36+ m_service(new AccountsServiceDBusAdaptor(this))
3037{
31− QSettings settings(QDir::homePath() + "/.unity8-greeter-demo", QSettings::NativeFormat);
32− QStringList users = settings.value(QStringLiteral("users"), QStringList() << qgetenv("USER")).toStringList();
33−
34− entries.reserve(users.count());
35− Q_FOREACH(const QString &user, users)
36− {
37− QString name = settings.value(user + "/name", user).toString();
38− entries.append({user, name, 0, 0, false, false, 0, 0});
38+ QFileInfo demoFile(QDir::homePath() + "/.unity8-greeter-demo");
39+ QString currentUser = g_get_user_name();
40+
41+ if (demoFile.exists()) {
42+ QSettings settings(demoFile.filePath(), QSettings::NativeFormat);
43+ QStringList users = settings.value(QStringLiteral("users"), QStringList() << currentUser).toStringList();
44+
45+ entries.reserve(users.count());
46+ Q_FOREACH(const QString &user, users)
47+ {
48+ QString name = settings.value(user + "/name", user).toString();
49+ entries.append({user, name, 0, 0, false, false, 0, 0});
50+ }
51+ } else {
52+ entries.append({currentUser, 0, 0, 0, false, false, 0, 0});
53+
54+ connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged,
55+ this, [this](const QString &user) {
56+ if (user == entries[0].username) {
57+ updateName(true);
58+ }
59+ });
60+ updateName(false);
61+ }
62+}
63+
64+void UsersModelPrivate::updateName(bool async)
65+{
66+ auto pendingReply = m_service->getUserPropertyAsync(entries[0].username,
67+ QStringLiteral("org.freedesktop.Accounts.User"),
68+ QStringLiteral("RealName"));
69+ auto *watcher = new QDBusPendingCallWatcher(pendingReply, this);
70+
71+ connect(watcher, &QDBusPendingCallWatcher::finished,
72+ this, [this](QDBusPendingCallWatcher* watcher) {
73+
74+ QDBusPendingReply<QVariant> reply = *watcher;
75+ watcher->deleteLater();
76+ if (reply.isError()) {
77+ qWarning() << "Failed to get 'RealName' property - " << reply.error().message();
78+ return;
79+ }
80+
81+ const QString realName = reply.value().toString();
82+ if (entries[0].real_name != realName) {
83+ entries[0].real_name = realName;
84+ Q_EMIT dataChanged(0);
85+ }
86+ });
87+ if (!async) {
88+ watcher->waitForFinished();
3989 }
4090}
4191
plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.h+15−3
@@ -19,8 +19,11 @@
1919#ifndef UNITY_MOCK_USERSMODEL_PRIVATE_H
2020#define UNITY_MOCK_USERSMODEL_PRIVATE_H
2121
22−#include <QtCore/QList>
23−#include <QtCore/QString>
22+#include <QList>
23+#include <QObject>
24+#include <QString>
25+
26+class AccountsServiceDBusAdaptor;
2427
2528namespace QLightDM
2629{
@@ -39,19 +42,28 @@ public:
3942 QString infographic;
4043};
4144
42−class UsersModelPrivate
45+class UsersModelPrivate : public QObject
4346{
47+ Q_OBJECT
48+
4449public:
4550 explicit UsersModelPrivate(UsersModel *parent = 0);
4651 virtual ~UsersModelPrivate() = default;
4752
4853 QList<Entry> entries;
4954
55+Q_SIGNALS:
56+ void dataChanged(int);
57+
5058protected:
5159 UsersModel * const q_ptr;
5260
5361private:
5462 Q_DECLARE_PUBLIC(UsersModel)
63+
64+ void updateName(bool async);
65+
66+ AccountsServiceDBusAdaptor *m_service;
5567};
5668
5769}
plugins/Powerd/CMakeLists.txt−2
@@ -1,5 +1,3 @@
1−pkg_search_module(GIO REQUIRED gio-2.0)
2−
31include_directories(
42 ${GIO_INCLUDE_DIRS}
53)
plugins/ScreenGrabber/screengrabber.cpp−2
@@ -46,12 +46,10 @@ ScreenGrabber::ScreenGrabber(QObject *parent)
4646
4747 QDir screenshotsDir;
4848 if (qEnvironmentVariableIsSet("UNITY_TESTING")) {
49− qDebug() << "Using test environment";
5049 QTemporaryDir tDir;
5150 tDir.setAutoRemove(false);
5251 screenshotsDir = tDir.path();
5352 } else {
54− qDebug() << "Using real environment";
5553 screenshotsDir = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
5654 }
5755 screenshotsDir.mkpath(QStringLiteral("Screenshots"));
plugins/SessionBroadcast/CMakeLists.txt+5
@@ -1,3 +1,4 @@
1+include_directories(${GLIB_INCLUDE_DIRS})
12add_definitions(-DSM_BUSNAME=systemBus)
23
34add_library(SessionBroadcast-qml MODULE
@@ -7,4 +8,8 @@ add_library(SessionBroadcast-qml MODULE
78
89qt5_use_modules(SessionBroadcast-qml DBus Qml)
910
11+target_link_libraries(SessionBroadcast-qml
12+ ${GLIB_LIBRARIES}
13+ )
14+
1015add_unity8_plugin(SessionBroadcast 0.1 SessionBroadcast TARGETS SessionBroadcast-qml)
plugins/SessionBroadcast/SessionBroadcast.cpp+5−1
@@ -19,9 +19,13 @@
1919#include "SessionBroadcast.h"
2020#include <QDBusConnection>
2121
22+#include <glib.h>
23+
2224SessionBroadcast::SessionBroadcast(QObject* parent)
2325 : QObject(parent)
2426{
27+ m_username = QString::fromUtf8(g_get_user_name());
28+
2529 auto connection = QDBusConnection::SM_BUSNAME();
2630
2731 connection.connect(QStringLiteral("com.canonical.Unity.Greeter.Broadcast"),
@@ -35,7 +39,7 @@ SessionBroadcast::SessionBroadcast(QObject* parent)
3539void SessionBroadcast::onShowHome(const QString &username)
3640{
3741 // Only listen to requests meant for us
38− if (username == qgetenv("USER")) {
42+ if (username == m_username) {
3943 Q_EMIT showHome();
4044 }
4145}
plugins/SessionBroadcast/SessionBroadcast.h+3
@@ -36,6 +36,9 @@ Q_SIGNALS:
3636
3737private Q_SLOTS:
3838 void onShowHome(const QString &username);
39+
40+private:
41+ QString m_username;
3942};
4043
4144#endif
plugins/UInput/CMakeLists.txtnew file+7
@@ -0,0 +1,7 @@
1+add_library(UInput-qml MODULE
2+ plugin.cpp
3+ uinput.cpp
4+)
5+
6+qt5_use_modules(UInput-qml Qml)
7+add_unity8_plugin(UInput 0.1 UInput TARGETS UInput-qml)
plugins/UInput/UInput.qmltypesnew file+44
@@ -0,0 +1,44 @@
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 UInput 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "UInput"
12+ prototype: "QObject"
13+ exports: ["UInput/UInput 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Enum {
16+ name: "Button"
17+ values: {
18+ "ButtonLeft": 0,
19+ "ButtonRight": 1,
20+ "ButtonMiddle": 2
21+ }
22+ }
23+ Method { name: "createMouse" }
24+ Method { name: "removeMouse" }
25+ Method {
26+ name: "moveMouse"
27+ Parameter { name: "dx"; type: "int" }
28+ Parameter { name: "dy"; type: "int" }
29+ }
30+ Method {
31+ name: "pressMouse"
32+ Parameter { name: "button"; type: "Button" }
33+ }
34+ Method {
35+ name: "releaseMouse"
36+ Parameter { name: "button"; type: "Button" }
37+ }
38+ Method {
39+ name: "scrollMouse"
40+ Parameter { name: "dh"; type: "int" }
41+ Parameter { name: "dv"; type: "int" }
42+ }
43+ }
44+}
plugins/UInput/plugin.cppnew file+26
@@ -0,0 +1,26 @@
1+/*
2+ * Copyright (C) 2015 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "plugin.h"
18+#include "uinput.h"
19+
20+#include <QtQml/qqml.h>
21+
22+void UInputPlugin::registerTypes(const char *uri)
23+{
24+ Q_ASSERT(uri == QLatin1String("UInput"));
25+ qmlRegisterType<UInput>(uri, 0, 1, "UInput");
26+}
plugins/UInput/plugin.hnew file+32
@@ -0,0 +1,32 @@
1+/*
2+ * Copyright (C) 2015 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 UINPUT_PLUGIN_H
18+#define UINPUT_PLUGIN_H
19+
20+#include <QtQml/QQmlEngine>
21+#include <QtQml/QQmlExtensionPlugin>
22+
23+class UInputPlugin : public QQmlExtensionPlugin
24+{
25+ Q_OBJECT
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27+
28+public:
29+ void registerTypes(const char *uri) override;
30+};
31+
32+#endif
plugins/UInput/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module UInput
2+plugin UInput-qml
3+typeinfo UInput.qmltypes
plugins/UInput/uinput.cppnew file+182
@@ -0,0 +1,182 @@
1+/*
2+ * Copyright (C) 2015 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "uinput.h"
18+
19+#include <QFile>
20+#include <QDebug>
21+#include <QDateTime>
22+
23+#include <unistd.h>
24+#include <time.h>
25+
26+UInput::UInput(QObject *parent) :
27+ QObject(parent)
28+{
29+ m_devName = QByteArrayLiteral("unity8-simulated-mouse");
30+ m_uinput.setFileName(QStringLiteral("/dev/uinput"));
31+
32+ memset(&m_uinput_mouse_dev, 0, sizeof(m_uinput_mouse_dev));
33+ m_uinput_mouse_dev.id.bustype = BUS_USB;
34+ m_uinput_mouse_dev.id.version = 1;
35+ strncpy(m_uinput_mouse_dev.name, m_devName.constData(), m_devName.length());
36+}
37+
38+UInput::~UInput()
39+{
40+ if (m_mouseCreated) {
41+ removeMouse();
42+ }
43+}
44+
45+void UInput::createMouse()
46+{
47+ if (m_mouseCreated) {
48+ qDebug() << "Already have a virtual device. Not creating another one.";
49+ return;
50+ }
51+
52+ if (!m_uinput.isOpen() && !m_uinput.open(QFile::WriteOnly)) {
53+ return;
54+ }
55+
56+ ioctl(m_uinput.handle(), UI_SET_EVBIT, EV_REL);
57+ ioctl(m_uinput.handle(), UI_SET_RELBIT, REL_X);
58+ ioctl(m_uinput.handle(), UI_SET_RELBIT, REL_Y);
59+ ioctl(m_uinput.handle(), UI_SET_RELBIT, REL_HWHEEL);
60+ ioctl(m_uinput.handle(), UI_SET_RELBIT, REL_WHEEL);
61+
62+ ioctl(m_uinput.handle(), UI_SET_EVBIT, EV_KEY);
63+ ioctl(m_uinput.handle(), UI_SET_KEYBIT, BTN_MOUSE);
64+ ioctl(m_uinput.handle(), UI_SET_KEYBIT, BTN_LEFT);
65+ ioctl(m_uinput.handle(), UI_SET_KEYBIT, BTN_MIDDLE);
66+ ioctl(m_uinput.handle(), UI_SET_KEYBIT, BTN_RIGHT);
67+ ioctl(m_uinput.handle(), UI_SET_KEYBIT, BTN_FORWARD);
68+ ioctl(m_uinput.handle(), UI_SET_KEYBIT, BTN_BACK);
69+
70+ ioctl(m_uinput.handle(), UI_SET_EVBIT, EV_SYN);
71+
72+ int len = write(m_uinput.handle(), &m_uinput_mouse_dev, sizeof(m_uinput_mouse_dev));
73+ if (len <= 0) {
74+ qWarning() << "Failed to write to uinput. Cannot create virtual uinput mouse.";
75+ return;
76+ }
77+
78+ int err = ioctl(m_uinput.handle(), UI_DEV_CREATE);
79+ if (err != 0) {
80+ qWarning() << "Cannot create virtual uinput device. Create ioctl failed:" << err;
81+ return;
82+ }
83+ m_mouseCreated = true;
84+ qDebug() << "Virtual uinput mouse device created.";
85+}
86+
87+void UInput::removeMouse()
88+{
89+ if (!m_mouseCreated) {
90+ return;
91+ }
92+
93+ if (!m_uinput.isOpen() && !m_uinput.open(QFile::WriteOnly)) {
94+ qWarning() << "cannot open uinput... ";
95+ return;
96+ }
97+
98+ int err = ioctl(m_uinput.handle(), UI_DEV_DESTROY);
99+ if (err != 0) {
100+ qWarning() << "Failed to destroy virtual uinput device. Destroy ioctl failed:" << err;
101+ } else {
102+ qDebug() << "Virtual uinput mouse device removed.";
103+ }
104+ m_uinput.close();
105+ m_mouseCreated = false;
106+}
107+
108+void UInput::moveMouse(int dx, int dy)
109+{
110+ struct input_event event;
111+ memset(&event, 0, sizeof(event));
112+ clock_gettime(CLOCK_MONOTONIC, (timespec*)&event.time);
113+ event.type = EV_REL;
114+ event.code = REL_X;
115+ event.value = dx;
116+ write(m_uinput.handle(), &event, sizeof(event));
117+
118+ event.code = REL_Y;
119+ event.value = dy;
120+ write(m_uinput.handle(), &event, sizeof(event));
121+
122+ event.type = EV_SYN;
123+ event.code = SYN_REPORT;
124+ event.value = 0;
125+ write(m_uinput.handle(), &event, sizeof(event));
126+}
127+
128+void UInput::pressMouse(Button button)
129+{
130+ injectMouse(button, 1);
131+}
132+
133+void UInput::releaseMouse(Button button)
134+{
135+ injectMouse(button, 0);
136+}
137+
138+void UInput::scrollMouse(int dh, int dv)
139+{
140+ struct input_event event;
141+ memset(&event, 0, sizeof(event));
142+ clock_gettime(CLOCK_MONOTONIC, (timespec*)&event.time);
143+ event.type = EV_REL;
144+ event.code = REL_HWHEEL;
145+ event.value = dh;
146+ write(m_uinput.handle(), &event, sizeof(event));
147+
148+ event.code = REL_WHEEL;
149+ event.value = dv;
150+ write(m_uinput.handle(), &event, sizeof(event));
151+
152+ event.type = EV_SYN;
153+ event.code = SYN_REPORT;
154+ event.value = 0;
155+ write(m_uinput.handle(), &event, sizeof(event));
156+}
157+
158+void UInput::injectMouse(Button button, int down)
159+{
160+ struct input_event event;
161+ memset(&event, 0, sizeof(event));
162+ clock_gettime(CLOCK_MONOTONIC, (timespec*)&event.time);
163+ event.type = EV_KEY;
164+ switch (button) {
165+ case ButtonLeft:
166+ event.code = BTN_LEFT;
167+ break;
168+ case ButtonRight:
169+ event.code = BTN_RIGHT;
170+ break;
171+ case ButtonMiddle:
172+ event.code = BTN_MIDDLE;
173+ break;
174+ }
175+ event.value = down;
176+ write(m_uinput.handle(), &event, sizeof(event));
177+
178+ event.type = EV_SYN;
179+ event.code = SYN_REPORT;
180+ event.value = 0;
181+ write(m_uinput.handle(), &event, sizeof(event));
182+}
plugins/UInput/uinput.hnew file+61
@@ -0,0 +1,61 @@
1+/*
2+ * Copyright (C) 2015 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+
18+#ifndef UINPUT_H
19+#define UINPUT_H
20+
21+#include <QObject>
22+#include <QFile>
23+
24+#include <linux/uinput.h>
25+
26+
27+class UInput : public QObject
28+{
29+ Q_OBJECT
30+ Q_ENUMS(Button)
31+
32+public:
33+ enum Button {
34+ ButtonLeft,
35+ ButtonRight,
36+ ButtonMiddle
37+ };
38+
39+ explicit UInput(QObject *parent = nullptr);
40+ ~UInput();
41+
42+ Q_INVOKABLE void createMouse();
43+ Q_INVOKABLE void removeMouse();
44+
45+ Q_INVOKABLE void moveMouse(int dx, int dy);
46+ Q_INVOKABLE void pressMouse(Button button);
47+ Q_INVOKABLE void releaseMouse(Button button);
48+ Q_INVOKABLE void scrollMouse(int dh, int dv);
49+
50+private:
51+ void injectMouse(Button button, int down);
52+
53+private:
54+ QFile m_uinput;
55+ uinput_user_dev m_uinput_mouse_dev;
56+ QByteArray m_devName;
57+
58+ bool m_mouseCreated = false;
59+};
60+
61+#endif // UINPUT_H
plugins/Ubuntu/Gestures/CMakeLists.txt+1
@@ -11,6 +11,7 @@ set(UbuntuGesturesQml_SOURCES
1111 PressedOutsideNotifier.cpp
1212 TouchDispatcher.cpp
1313 TouchGate.cpp
14+ TouchGestureArea.cpp
1415)
1516
1617add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+51−7
@@ -194,6 +194,26 @@ void DirectionalDragArea::setImmediateRecognition(bool enabled)
194194 }
195195}
196196
197+bool DirectionalDragArea::monitorOnly() const
198+{
199+ return d->monitorOnly;
200+}
201+
202+void DirectionalDragArea::setMonitorOnly(bool monitorOnly)
203+{
204+ if (d->monitorOnly != monitorOnly) {
205+ d->monitorOnly = monitorOnly;
206+
207+ if (monitorOnly && d->status == DirectionalDragAreaPrivate::Undecided) {
208+ TouchRegistry::instance()->removeCandidateOwnerForTouch(d->touchId, this);
209+ // We still wanna know when it ends for keeping the composition time window up-to-date
210+ TouchRegistry::instance()->addTouchWatcher(d->touchId, this);
211+ }
212+
213+ Q_EMIT monitorOnlyChanged(monitorOnly);
214+ }
215+}
216+
197217void DirectionalDragArea::removeTimeConstraints()
198218{
199219 d->setMaxTime(60 * 60 * 1000);
@@ -260,7 +280,10 @@ void DirectionalDragAreaPrivate::unownedTouchEvent(UnownedTouchEvent *unownedTou
260280 unownedTouchEvent_undecided(unownedTouchEvent);
261281 break;
262282 default: // Recognized:
263− // do nothing
283+ if (monitorOnly) {
284+ // Treat unowned event as if we owned it, but we are really just watching it
285+ touchEvent_recognized(event);
286+ }
264287 break;
265288 }
266289
@@ -311,7 +334,9 @@ void DirectionalDragAreaPrivate::unownedTouchEvent_undecided(UnownedTouchEvent *
311334 }
312335
313336 if (movedFarEnoughAlongGestureAxis()) {
314− TouchRegistry::instance()->requestTouchOwnership(touchId, q);
337+ if (!monitorOnly) {
338+ TouchRegistry::instance()->requestTouchOwnership(touchId, q);
339+ }
315340 setStatus(Recognized);
316341 setPublicPos(touchPoint->pos());
317342 setPublicScenePos(touchScenePos);
@@ -411,12 +436,21 @@ void DirectionalDragAreaPrivate::touchEvent_absent(QTouchEvent *event)
411436 if (recognitionIsDisabled()) {
412437 // Behave like a dumb TouchArea
413438 ddaDebug("Gesture recognition is disabled. Requesting touch ownership immediately.");
414− TouchRegistry::instance()->requestTouchOwnership(touchId, q);
415439 setStatus(Recognized);
416− event->accept();
440+ if (monitorOnly) {
441+ watchPressedTouchPoints(touchPoints);
442+ event->ignore();
443+ } else {
444+ TouchRegistry::instance()->requestTouchOwnership(touchId, q);
445+ event->accept();
446+ }
417447 } else {
418448 // just monitor the touch points for now.
419− TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, q);
449+ if (monitorOnly) {
450+ watchPressedTouchPoints(touchPoints);
451+ } else {
452+ TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, q);
453+ }
420454
421455 setStatus(Undecided);
422456 // Let the item below have it. We will monitor it and grab it later if a gesture
@@ -606,6 +640,9 @@ void DirectionalDragAreaPrivate::setStatus(Status newStatus)
606640 Q_EMIT q->pressedChanged(true);
607641 break;
608642 case Recognized:
643+ if (oldStatus == WaitingForTouch) { // for immediate recognition
644+ Q_EMIT q->pressedChanged(true);
645+ }
609646 Q_EMIT q->draggingChanged(true);
610647 break;
611648 default:
@@ -715,8 +752,14 @@ void DirectionalDragArea::itemChange(ItemChange change, const ItemChangeData &va
715752 value.window->installEventFilter(TouchRegistry::instance());
716753
717754 // TODO: Handle window->screen() changes (ie window changing screens)
718− qreal pixelsPerMm = value.window->screen()->physicalDotsPerInch() / 25.4;
719− d->setPixelsPerMm(pixelsPerMm);
755+
756+ qreal pixelsPerInch = value.window->screen()->physicalDotsPerInch();
757+ if (pixelsPerInch < 0) {
758+ // It can return garbage when run in a XVFB server (Virtual Framebuffer 'fake' X server)
759+ pixelsPerInch = 72;
760+ }
761+
762+ d->setPixelsPerMm(pixelsPerInch / 25.4);
720763 }
721764 }
722765}
@@ -884,5 +927,6 @@ DirectionalDragAreaPrivate::DirectionalDragAreaPrivate(DirectionalDragArea *q)
884927 , recognitionTimer(nullptr)
885928 , timeSource(new RealTimeSource)
886929 , activeTouches(timeSource)
930+ , monitorOnly(false)
887931{
888932}
plugins/Ubuntu/Gestures/DirectionalDragArea.h+8
@@ -77,6 +77,10 @@ class UBUNTUGESTURESQML_EXPORT DirectionalDragArea : public QQuickItem {
7777 WRITE setImmediateRecognition
7878 NOTIFY immediateRecognitionChanged)
7979
80+ // Whether we are merely monitoring touch events (in which case, we don't
81+ // claim ownership of the touch).
82+ Q_PROPERTY(bool monitorOnly READ monitorOnly WRITE setMonitorOnly NOTIFY monitorOnlyChanged)
83+
8084 Q_ENUMS(Direction)
8185public:
8286 DirectionalDragArea(QQuickItem *parent = 0);
@@ -100,6 +104,9 @@ public:
100104 bool immediateRecognition() const;
101105 void setImmediateRecognition(bool enabled);
102106
107+ bool monitorOnly() const;
108+ void setMonitorOnly(bool monitorOnly);
109+
103110 bool event(QEvent *e) override;
104111
105112 /*
@@ -123,6 +130,7 @@ Q_SIGNALS:
123130 void touchSceneXChanged(qreal value);
124131 void touchSceneYChanged(qreal value);
125132 void immediateRecognitionChanged(bool value);
133+ void monitorOnlyChanged(bool value);
126134
127135protected:
128136 void touchEvent(QTouchEvent *event) override;
plugins/Ubuntu/Gestures/DirectionalDragArea_p.h+2
@@ -160,6 +160,8 @@ public:
160160
161161 ActiveTouchesInfo activeTouches;
162162
163+ bool monitorOnly;
164+
163165Q_SIGNALS:
164166 void statusChanged(Status value);
165167};
plugins/Ubuntu/Gestures/Gestures.qmltypes+86−45
@@ -34,7 +34,8 @@ Module {
3434 "Leftwards": 1,
3535 "Downwards": 2,
3636 "Upwards": 3,
37− "Horizontal": 4
37+ "Horizontal": 4,
38+ "Vertical": 5
3839 }
3940 }
4041 Method {
@@ -59,14 +60,6 @@ Module {
5960 prototype: "QQuickItem"
6061 exports: ["Ubuntu.Gestures/DirectionalDragArea 0.1"]
6162 exportMetaObjectRevisions: [0]
62− Enum {
63− name: "Status"
64− values: {
65− "WaitingForTouch": 0,
66− "Undecided": 1,
67− "Recognized": 2
68− }
69− }
7063 Property { name: "direction"; type: "Direction::Type" }
7164 Property { name: "distance"; type: "double"; isReadonly: true }
7265 Property { name: "sceneDistance"; type: "double"; isReadonly: true }
@@ -74,24 +67,19 @@ Module {
7467 Property { name: "touchY"; type: "double"; isReadonly: true }
7568 Property { name: "touchSceneX"; type: "double"; isReadonly: true }
7669 Property { name: "touchSceneY"; type: "double"; isReadonly: true }
77− Property { name: "status"; type: "Status"; isReadonly: true }
7870 Property { name: "dragging"; type: "bool"; isReadonly: true }
79− Property { name: "maxDeviation"; type: "double" }
80− Property { name: "wideningAngle"; type: "double" }
81− Property { name: "distanceThreshold"; type: "double" }
82− Property { name: "minSpeed"; type: "double" }
83− Property { name: "maxSilenceTime"; type: "int" }
84− Property { name: "compositionTime"; type: "int" }
71+ Property { name: "pressed"; type: "bool"; isReadonly: true }
72+ Property { name: "immediateRecognition"; type: "bool" }
8573 Signal {
8674 name: "directionChanged"
8775 Parameter { name: "direction"; type: "Direction::Type" }
8876 }
8977 Signal {
90− name: "statusChanged"
91− Parameter { name: "value"; type: "Status" }
78+ name: "draggingChanged"
79+ Parameter { name: "value"; type: "bool" }
9280 }
9381 Signal {
94− name: "draggingChanged"
82+ name: "pressedChanged"
9583 Parameter { name: "value"; type: "bool" }
9684 }
9785 Signal {
@@ -102,30 +90,6 @@ Module {
10290 name: "sceneDistanceChanged"
10391 Parameter { name: "value"; type: "double" }
10492 }
105− Signal {
106− name: "maxDeviationChanged"
107− Parameter { name: "value"; type: "double" }
108− }
109− Signal {
110− name: "wideningAngleChanged"
111− Parameter { name: "value"; type: "double" }
112− }
113− Signal {
114− name: "distanceThresholdChanged"
115− Parameter { name: "value"; type: "double" }
116− }
117− Signal {
118− name: "minSpeedChanged"
119− Parameter { name: "value"; type: "double" }
120− }
121− Signal {
122− name: "maxSilenceTimeChanged"
123− Parameter { name: "value"; type: "int" }
124− }
125− Signal {
126− name: "compositionTimeChanged"
127− Parameter { name: "value"; type: "int" }
128− }
12993 Signal {
13094 name: "touchXChanged"
13195 Parameter { name: "value"; type: "double" }
@@ -142,7 +106,35 @@ Module {
142106 name: "touchSceneYChanged"
143107 Parameter { name: "value"; type: "double" }
144108 }
145− Signal { name: "tapped" }
109+ Signal {
110+ name: "immediateRecognitionChanged"
111+ Parameter { name: "value"; type: "bool" }
112+ }
113+ Method { name: "removeTimeConstraints" }
114+ }
115+ Component {
116+ name: "FloatingFlickable"
117+ defaultProperty: "data"
118+ prototype: "QQuickItem"
119+ exports: ["Ubuntu.Gestures/FloatingFlickable 0.1"]
120+ exportMetaObjectRevisions: [0]
121+ Property { name: "contentWidth"; type: "double" }
122+ Property { name: "contentHeight"; type: "double" }
123+ Property { name: "contentX"; type: "double" }
124+ Property { name: "contentY"; type: "double" }
125+ Property { name: "direction"; type: "Direction::Type" }
126+ }
127+ Component {
128+ name: "GestureTouchPoint"
129+ prototype: "QObject"
130+ exports: ["Ubuntu.Gestures/GestureTouchPoint 0.1"]
131+ isCreatable: false
132+ exportMetaObjectRevisions: [0]
133+ Property { name: "pointId"; type: "int"; isReadonly: true }
134+ Property { name: "pressed"; type: "bool"; isReadonly: true }
135+ Property { name: "x"; type: "double"; isReadonly: true }
136+ Property { name: "y"; type: "double"; isReadonly: true }
137+ Property { name: "dragging"; type: "bool"; isReadonly: true }
146138 }
147139 Component {
148140 name: "PressedOutsideNotifier"
@@ -163,6 +155,55 @@ Module {
163155 name: "targetItemChanged"
164156 Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
165157 }
166− Signal { name: "pressed" }
158+ }
159+ Component {
160+ name: "TouchGestureArea"
161+ defaultProperty: "data"
162+ prototype: "QQuickItem"
163+ exports: ["Ubuntu.Gestures/TouchGestureArea 0.1"]
164+ exportMetaObjectRevisions: [0]
165+ Enum {
166+ name: "Status"
167+ values: {
168+ "WaitingForTouch": 0,
169+ "Undecided": 1,
170+ "Recognized": 2,
171+ "Rejected": 3
172+ }
173+ }
174+ Property { name: "touchPoints"; type: "GestureTouchPoint"; isList: true; isReadonly: true }
175+ Property { name: "dragging"; type: "bool"; isReadonly: true }
176+ Property { name: "minimumTouchPoints"; type: "int" }
177+ Property { name: "maximumTouchPoints"; type: "int" }
178+ Signal {
179+ name: "statusChanged"
180+ Parameter { name: "status"; type: "Status" }
181+ }
182+ Signal { name: "touchPointsUpdated" }
183+ Signal {
184+ name: "draggingChanged"
185+ Parameter { name: "dragging"; type: "bool" }
186+ }
187+ Signal {
188+ name: "minimumTouchPointsChanged"
189+ Parameter { name: "value"; type: "bool" }
190+ }
191+ Signal {
192+ name: "maximumTouchPointsChanged"
193+ Parameter { name: "value"; type: "bool" }
194+ }
195+ Signal {
196+ name: "pressed"
197+ Parameter { name: "points"; type: "QList<QObject*>" }
198+ }
199+ Signal {
200+ name: "released"
201+ Parameter { name: "points"; type: "QList<QObject*>" }
202+ }
203+ Signal {
204+ name: "updated"
205+ Parameter { name: "points"; type: "QList<QObject*>" }
206+ }
207+ Signal { name: "clicked" }
167208 }
168209}
plugins/Ubuntu/Gestures/TouchGestureArea.cppnew file+875
@@ -0,0 +1,875 @@
1+/*
2+ * Copyright (C) 2016 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 "TouchGestureArea.h"
18+
19+// local
20+#include "TouchOwnershipEvent.h"
21+#include "TouchRegistry.h"
22+#include "UnownedTouchEvent.h"
23+
24+#include <QGuiApplication>
25+#include <QStyleHints>
26+#include <private/qquickwindow_p.h>
27+
28+#define TOUCHGESTUREAREA_DEBUG 0
29+
30+// TODO - understand more about why we lose touch event releases.
31+// Workaround for now is to monitor all the touch points from first touch till
32+// all have been released; no matter if we've rejected the gesture.
33+
34+namespace {
35+
36+struct InternalStatus {
37+ enum Status {
38+ WaitingForTouch,
39+ WaitingForMoreTouches,
40+ WaitingForOwnership, //Recognizing,
41+ Recognized,
42+ WaitingForRejection,
43+ Rejected
44+ };
45+};
46+
47+TouchGestureArea::Status internalStatusToGestureStatus(int internalStatus) {
48+ switch (internalStatus) {
49+ case InternalStatus::WaitingForTouch: return TouchGestureArea::WaitingForTouch;
50+ case InternalStatus::WaitingForMoreTouches: return TouchGestureArea::Undecided;
51+ case InternalStatus::WaitingForOwnership: return TouchGestureArea::Undecided;
52+ case InternalStatus::Recognized: return TouchGestureArea::Recognized;
53+ case InternalStatus::WaitingForRejection: return TouchGestureArea::Recognized;
54+ case InternalStatus::Rejected: return TouchGestureArea::Rejected;
55+ }
56+ return TouchGestureArea::WaitingForTouch;
57+}
58+
59+}
60+
61+#if TOUCHGESTUREAREA_DEBUG
62+#define tgaDebug(params) qDebug().nospace() << "[TGA(" << qPrintable(objectName()) << ")] " << params
63+#include "DebugHelpers.h"
64+
65+namespace {
66+
67+const char *statusToString(int status)
68+{
69+ if (status == InternalStatus::WaitingForTouch) {
70+ return "WaitingForTouch";
71+ } else if (status == InternalStatus::WaitingForMoreTouches) {
72+ return "WaitingForMoreTouches";
73+ } else if (status == InternalStatus::WaitingForOwnership) {
74+ return "WaitingForOwnership";
75+ } else if (status == InternalStatus::Rejected) {
76+ return "Rejected";
77+ } else if (status == InternalStatus::WaitingForRejection) {
78+ return "WaitingForRejection";
79+ } else {
80+ return "Recognized";
81+ }
82+ return "Unknown";
83+}
84+
85+QString touchState(Qt::TouchPointState state) {
86+ switch (state) {
87+ case Qt::TouchPointPressed: return "pressed";
88+ case Qt::TouchPointMoved: return "moved";
89+ case Qt::TouchPointStationary: return "stationary";
90+ case Qt::TouchPointReleased: return "released";
91+ break;
92+ }
93+ return "unknown";
94+}
95+
96+QString touchesString(const QList<QObject*> touches) {
97+ QString str;
98+ Q_FOREACH(QObject* object, touches) {
99+ GestureTouchPoint* touchPoint = qobject_cast<GestureTouchPoint*>(object);
100+ if (touchPoint) {
101+ str += QStringLiteral("[%1 @ (%2, %3)], ").arg(touchPoint->id())
102+ .arg(touchPoint->x())
103+ .arg(touchPoint->y());
104+ }
105+ }
106+ return str;
107+}
108+
109+QString touchEventString(QTouchEvent* event) {
110+ if (!event) return QString();
111+ QString str;
112+ Q_FOREACH(const auto& touchPoint, event->touchPoints()) {
113+ str += QStringLiteral("[%1:%2 @ (%3, %4)], ").arg(touchPoint.id())
114+ .arg(touchState(touchPoint.state()))
115+ .arg(touchPoint.pos().x())
116+ .arg(touchPoint.pos().y());
117+ }
118+ return str;
119+}
120+
121+
122+} // namespace {
123+#else // TOUCHGESTUREAREA_DEBUG
124+#define tgaDebug(params) ((void)0)
125+#endif // TOUCHGESTUREAREA_DEBUG
126+
127+TouchGestureArea::TouchGestureArea(QQuickItem* parent)
128+ : QQuickItem(parent)
129+ , m_status(WaitingForTouch)
130+ , m_recognitionTimer(nullptr)
131+ , m_dragging(false)
132+ , m_minimumTouchPoints(1)
133+ , m_maximumTouchPoints(INT_MAX)
134+ , m_recognitionPeriod(50)
135+ , m_releaseRejectPeriod(100)
136+{
137+ setRecognitionTimer(new UbuntuGestures::Timer(this));
138+ m_recognitionTimer->setInterval(m_recognitionPeriod);
139+ m_recognitionTimer->setSingleShot(true);
140+}
141+
142+TouchGestureArea::~TouchGestureArea()
143+{
144+ clearTouchLists();
145+ qDeleteAll(m_liveTouchPoints);
146+ m_liveTouchPoints.clear();
147+ qDeleteAll(m_cachedTouchPoints);
148+ m_cachedTouchPoints.clear();
149+}
150+
151+bool TouchGestureArea::event(QEvent *event)
152+{
153+ // Process unowned touch events (handles update/release for incomplete gestures)
154+ if (event->type() == TouchOwnershipEvent::touchOwnershipEventType()) {
155+ touchOwnershipEvent(static_cast<TouchOwnershipEvent *>(event));
156+ return true;
157+ } else if (event->type() == UnownedTouchEvent::unownedTouchEventType()) {
158+ unownedTouchEvent(static_cast<UnownedTouchEvent *>(event)->touchEvent());
159+ return true;
160+ }
161+
162+ return QQuickItem::event(event);
163+}
164+
165+void TouchGestureArea::touchOwnershipEvent(TouchOwnershipEvent *event)
166+{
167+ int touchId = event->touchId();
168+ tgaDebug("touchOwnershipEvent - id:" << touchId << ", gained:" << event->gained());
169+
170+ if (event->gained()) {
171+ grabTouchPoints(QVector<int>() << touchId);
172+ m_candidateTouches.remove(touchId);
173+ TouchRegistry::instance()->addTouchWatcher(touchId, this);
174+ m_watchedTouches.insert(touchId);
175+
176+ if (m_watchedTouches.count() >= m_minimumTouchPoints) {
177+ setInternalStatus(InternalStatus::Recognized);
178+ }
179+ } else {
180+ rejectGesture();
181+ }
182+}
183+
184+void TouchGestureArea::touchEvent(QTouchEvent *event)
185+{
186+ if (!isEnabled() || !isVisible()) {
187+ tgaDebug(QString("NOT ENABLED touchEvent(%1) %2").arg(statusToString(m_status)).arg(touchEventString(event)));
188+ QQuickItem::touchEvent(event);
189+ return;
190+ }
191+
192+ tgaDebug(QString("touchEvent(%1) %2").arg(statusToString(m_status)).arg(touchEventString(event)));
193+
194+ switch (m_status) {
195+ case InternalStatus::WaitingForTouch:
196+ touchEvent_waitingForTouch(event);
197+ break;
198+ case InternalStatus::WaitingForMoreTouches:
199+ touchEvent_waitingForMoreTouches(event);
200+ break;
201+ case InternalStatus::WaitingForOwnership:
202+ touchEvent_waitingForOwnership(event);
203+ break;
204+ case InternalStatus::Recognized:
205+ case InternalStatus::WaitingForRejection:
206+ touchEvent_recognized(event);
207+ break;
208+ case InternalStatus::Rejected:
209+ touchEvent_rejected(event);
210+ break;
211+ default: // Recognized:
212+ break;
213+ }
214+
215+ updateTouchPoints(event);
216+}
217+
218+void TouchGestureArea::touchEvent_waitingForTouch(QTouchEvent *event)
219+{
220+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, event->touchPoints()) {
221+ Qt::TouchPointState touchPointState = touchPoint.state();
222+ int touchId = touchPoint.id();
223+
224+ if (touchPointState == Qt::TouchPointPressed) {
225+ if (!m_candidateTouches.contains(touchId)) {
226+ TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, this);
227+ m_candidateTouches.insert(touchId);
228+ }
229+ }
230+ }
231+ event->ignore();
232+
233+ if (m_candidateTouches.count() > m_maximumTouchPoints) {
234+ rejectGesture();
235+ } else if (m_candidateTouches.count() >= m_minimumTouchPoints) {
236+ setInternalStatus(InternalStatus::WaitingForOwnership);
237+
238+ QSet<int> tmpCandidates(m_candidateTouches);
239+ Q_FOREACH(int candidateTouchId, tmpCandidates) {
240+ TouchRegistry::instance()->requestTouchOwnership(candidateTouchId, this);
241+ }
242+ // We accept the gesture; so don't pass to lower items
243+ event->accept();
244+ } else if (m_candidateTouches.count() > 0) {
245+ setInternalStatus(InternalStatus::WaitingForMoreTouches);
246+ }
247+}
248+
249+void TouchGestureArea::touchEvent_waitingForMoreTouches(QTouchEvent *event)
250+{
251+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, event->touchPoints()) {
252+ Qt::TouchPointState touchPointState = touchPoint.state();
253+ int touchId = touchPoint.id();
254+
255+ if (touchPointState == Qt::TouchPointPressed) {
256+ if (!m_candidateTouches.contains(touchId)) {
257+ TouchRegistry::instance()->addCandidateOwnerForTouch(touchId, this);
258+ m_candidateTouches.insert(touchId);
259+ }
260+ }
261+ }
262+ event->ignore();
263+
264+ if (m_candidateTouches.count() > m_maximumTouchPoints) {
265+ rejectGesture();
266+ } else if (m_candidateTouches.count() >= m_minimumTouchPoints) {
267+ setInternalStatus(InternalStatus::WaitingForOwnership);
268+
269+ QSet<int> tmpCandidates(m_candidateTouches);
270+ Q_FOREACH(int candidateTouchId, tmpCandidates) {
271+ TouchRegistry::instance()->requestTouchOwnership(candidateTouchId, this);
272+ }
273+ // We accept the gesture; so don't pass to lower items
274+ event->accept();
275+ }
276+}
277+
278+void TouchGestureArea::touchEvent_waitingForOwnership(QTouchEvent *event)
279+{
280+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, event->touchPoints()) {
281+ Qt::TouchPointState touchPointState = touchPoint.state();
282+ int touchId = touchPoint.id();
283+
284+ if (touchPointState == Qt::TouchPointPressed) {
285+ if (!m_watchedTouches.contains(touchId)) {
286+ TouchRegistry::instance()->addTouchWatcher(touchId, this);
287+ m_watchedTouches.insert(touchId);
288+ }
289+ }
290+ }
291+}
292+
293+void TouchGestureArea::touchEvent_recognized(QTouchEvent *event)
294+{
295+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, event->touchPoints()) {
296+ Qt::TouchPointState touchPointState = touchPoint.state();
297+ int touchId = touchPoint.id();
298+
299+ if (touchPointState == Qt::TouchPointPressed) {
300+ if (!m_watchedTouches.contains(touchId)) {
301+ TouchRegistry::instance()->addTouchWatcher(touchId, this);
302+ m_watchedTouches.insert(touchId);
303+ }
304+ }
305+ }
306+
307+ if (m_watchedTouches.count() > m_maximumTouchPoints) {
308+ rejectGesture();
309+ } else if (m_watchedTouches.count() >= m_minimumTouchPoints &&
310+ m_status==InternalStatus::WaitingForRejection) {
311+ setInternalStatus(InternalStatus::Recognized);
312+ }
313+}
314+
315+void TouchGestureArea::touchEvent_rejected(QTouchEvent *event)
316+{
317+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, event->touchPoints()) {
318+ Qt::TouchPointState touchPointState = touchPoint.state();
319+ int touchId = touchPoint.id();
320+
321+ if (touchPointState == Qt::TouchPointPressed) {
322+ if (!m_watchedTouches.contains(touchId)) {
323+ TouchRegistry::instance()->addTouchWatcher(touchId, this);
324+ m_watchedTouches.insert(touchId);
325+ }
326+ }
327+ }
328+}
329+
330+void TouchGestureArea::unownedTouchEvent(QTouchEvent *unownedTouchEvent)
331+{
332+ tgaDebug(QString("unownedTouchEvent(%1) %2").arg(statusToString(m_status)).arg(touchEventString(unownedTouchEvent)));
333+
334+ // Only monitor unowned touch events for presses/releases
335+ if ((unownedTouchEvent->touchPointStates() & (Qt::TouchPointPressed|Qt::TouchPointReleased)) == 0) {
336+ return;
337+ }
338+
339+ switch (m_status) {
340+ case InternalStatus::WaitingForTouch:
341+ break;
342+ case InternalStatus::WaitingForMoreTouches:
343+ unownedTouchEvent_waitingForMoreTouches(unownedTouchEvent);
344+ // do nothing
345+ break;
346+ case InternalStatus::WaitingForOwnership:
347+ unownedTouchEvent_waitingForOwnership(unownedTouchEvent);
348+ break;
349+ case InternalStatus::Recognized:
350+ case InternalStatus::WaitingForRejection:
351+ unownedTouchEvent_recognised(unownedTouchEvent);
352+ break;
353+ case InternalStatus::Rejected:
354+ unownedTouchEvent_rejected(unownedTouchEvent);
355+ break;
356+ default:
357+ break;
358+ }
359+
360+ updateTouchPoints(unownedTouchEvent);
361+}
362+
363+void TouchGestureArea::unownedTouchEvent_waitingForMoreTouches(QTouchEvent *event)
364+{
365+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, event->touchPoints()) {
366+ Qt::TouchPointState touchPointState = touchPoint.state();
367+ int touchId = touchPoint.id();
368+
369+ if (touchPointState == Qt::TouchPointReleased) {
370+ if (m_candidateTouches.contains(touchId)) {
371+ TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, this);
372+ m_candidateTouches.remove(touchId);
373+ }
374+ }
375+ }
376+
377+ if (m_candidateTouches.count() == 0) {
378+ setInternalStatus(InternalStatus::WaitingForTouch);
379+ }
380+}
381+
382+void TouchGestureArea::unownedTouchEvent_waitingForOwnership(QTouchEvent *event)
383+{
384+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, event->touchPoints()) {
385+ Qt::TouchPointState touchPointState = touchPoint.state();
386+ int touchId = touchPoint.id();
387+
388+ if (touchPointState == Qt::TouchPointReleased) {
389+ if (m_candidateTouches.contains(touchId)) {
390+ TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, this);
391+ m_candidateTouches.remove(touchId);
392+ }
393+ if (m_watchedTouches.contains(touchId)) {
394+ m_watchedTouches.remove(touchId);
395+ }
396+ }
397+ }
398+
399+ if (m_candidateTouches.count() + m_watchedTouches.count() == 0) {
400+ setInternalStatus(InternalStatus::WaitingForTouch);
401+ }
402+}
403+
404+void TouchGestureArea::unownedTouchEvent_recognised(QTouchEvent *event)
405+{
406+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, event->touchPoints()) {
407+ Qt::TouchPointState touchPointState = touchPoint.state();
408+ int touchId = touchPoint.id();
409+
410+ if (touchPointState == Qt::TouchPointReleased) {
411+ if (m_watchedTouches.contains(touchId)) {
412+ m_watchedTouches.remove(touchId);
413+ }
414+ }
415+ }
416+
417+ if (m_watchedTouches.count() < m_minimumTouchPoints && m_status==InternalStatus::Recognized) {
418+ setInternalStatus(InternalStatus::WaitingForRejection);
419+ }
420+}
421+
422+void TouchGestureArea::unownedTouchEvent_rejected(QTouchEvent *event)
423+{
424+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, event->touchPoints()) {
425+ Qt::TouchPointState touchPointState = touchPoint.state();
426+ int touchId = touchPoint.id();
427+
428+ if (touchPointState == Qt::TouchPointPressed) {
429+ if (!m_watchedTouches.contains(touchId)) {
430+ TouchRegistry::instance()->addTouchWatcher(touchId, this);
431+ m_watchedTouches.insert(touchId);
432+ }
433+ }
434+ if (touchPointState == Qt::TouchPointReleased) {
435+ if (m_watchedTouches.contains(touchId)) {
436+ m_watchedTouches.remove(touchId);
437+ }
438+ }
439+ }
440+
441+ if (m_watchedTouches.count() == 0) {
442+ setInternalStatus(InternalStatus::WaitingForTouch);
443+ }
444+}
445+
446+void TouchGestureArea::updateTouchPoints(QTouchEvent *touchEvent)
447+{
448+ bool added = false;
449+ bool ended = false;
450+ bool moved = false;
451+
452+ const int dragThreshold = qApp->styleHints()->startDragDistance();
453+ const int dragVelocity = qApp->styleHints()->startDragVelocity();
454+
455+ clearTouchLists();
456+ bool updateable = m_status != InternalStatus::WaitingForRejection;
457+
458+ Q_FOREACH(const QTouchEvent::TouchPoint& touchPoint, touchEvent->touchPoints()) {
459+ Qt::TouchPointState touchPointState = touchPoint.state();
460+ int touchId = touchPoint.id();
461+
462+ if (touchPointState & Qt::TouchPointReleased) {
463+ GestureTouchPoint* gtp = m_liveTouchPoints.value(touchId);
464+ if (!gtp) continue;
465+
466+ gtp->setPos(touchPoint.pos());
467+ gtp->setPressed(false);
468+ m_releasedTouchPoints.append(gtp);
469+ m_liveTouchPoints.remove(touchId);
470+
471+ if (updateable) {
472+ if (m_cachedTouchPoints.contains(touchId)) {
473+ GestureTouchPoint* cachedPoint = m_cachedTouchPoints.take(touchId);
474+ cachedPoint->deleteLater();
475+ }
476+ }
477+ ended = true;
478+ } else {
479+ GestureTouchPoint* gtp = m_liveTouchPoints.value(touchPoint.id(), nullptr);
480+ if (!gtp) {
481+ gtp = addTouchPoint(&touchPoint);
482+ m_pressedTouchPoints.append(gtp);
483+
484+ if (updateable) {
485+ if (m_cachedTouchPoints.contains(touchId)) {
486+ m_cachedTouchPoints[touchId]->setPos(touchPoint.pos());
487+ } else {
488+ m_cachedTouchPoints[touchId] = new GestureTouchPoint(*gtp);
489+ }
490+ }
491+ added = true;
492+ } else if (touchPointState & Qt::TouchPointMoved) {
493+ gtp->setPos(touchPoint.pos());
494+ m_movedTouchPoints.append(gtp);
495+ moved = true;
496+
497+ const QPointF &currentPos = touchPoint.scenePos();
498+ const QPointF &startPos = touchPoint.startScenePos();
499+
500+ bool overDragThreshold = false;
501+ bool supportsVelocity = (touchEvent->device()->capabilities() & QTouchDevice::Velocity) && dragVelocity;
502+ overDragThreshold |= qAbs(currentPos.x() - startPos.x()) > dragThreshold ||
503+ qAbs(currentPos.y() - startPos.y()) > dragThreshold;
504+ if (supportsVelocity) {
505+ QVector2D velocityVec = touchPoint.velocity();
506+ overDragThreshold |= qAbs(velocityVec.x()) > dragVelocity;
507+ overDragThreshold |= qAbs(velocityVec.y()) > dragVelocity;
508+ }
509+
510+ if (overDragThreshold) {
511+ gtp->setDragging(true);
512+ }
513+
514+ if (updateable) {
515+ if (m_cachedTouchPoints.contains(touchId)) {
516+ m_cachedTouchPoints[touchId]->setPos(touchPoint.pos());
517+ if (overDragThreshold) {
518+ m_cachedTouchPoints[touchId]->setDragging(true);
519+ }
520+ }
521+ }
522+ }
523+ }
524+ }
525+
526+ if (updateable) {
527+ if (!dragging() && m_status == InternalStatus::Recognized) {
528+ bool allWantDrag = !m_liveTouchPoints.isEmpty();
529+ Q_FOREACH(auto point, m_liveTouchPoints) {
530+ allWantDrag &= point->dragging();
531+ }
532+ // only dragging if all points are dragging.
533+ if (allWantDrag) {
534+ setDragging(true);
535+ }
536+ }
537+
538+ if (ended) {
539+ if (m_liveTouchPoints.isEmpty()) {
540+ if (!dragging()) Q_EMIT clicked();
541+ setDragging(false);
542+ }
543+ tgaDebug("Released " << touchesString(m_releasedTouchPoints));
544+ Q_EMIT released(m_releasedTouchPoints);
545+ }
546+ if (added) {
547+ tgaDebug("Pressed " << touchesString(m_pressedTouchPoints));
548+ Q_EMIT pressed(m_pressedTouchPoints);
549+ }
550+ if (moved) {
551+ tgaDebug("Updated " << touchesString(m_movedTouchPoints));
552+ Q_EMIT updated(m_movedTouchPoints);
553+ }
554+ if (added || ended || moved) {
555+ Q_EMIT touchPointsUpdated();
556+ }
557+ }
558+}
559+
560+void TouchGestureArea::clearTouchLists()
561+{
562+ Q_FOREACH (QObject *gtp, m_releasedTouchPoints) {
563+ delete gtp;
564+ }
565+ m_releasedTouchPoints.clear();
566+ m_pressedTouchPoints.clear();
567+ m_movedTouchPoints.clear();
568+}
569+
570+void TouchGestureArea::setInternalStatus(uint newStatus)
571+{
572+ if (newStatus == m_status)
573+ return;
574+
575+ uint oldStatus = m_status;
576+
577+ m_status = newStatus;
578+ Q_EMIT statusChanged(status());
579+
580+ if (oldStatus == InternalStatus::WaitingForMoreTouches || oldStatus == InternalStatus::WaitingForRejection) {
581+ m_recognitionTimer->stop();
582+ }
583+
584+ tgaDebug(statusToString(oldStatus) << " -> " << statusToString(newStatus));
585+
586+ switch (newStatus) {
587+ case InternalStatus::WaitingForTouch:
588+ resyncCachedTouchPoints();
589+ break;
590+ case InternalStatus::WaitingForMoreTouches:
591+ m_recognitionTimer->start(m_recognitionPeriod);
592+ break;
593+ case InternalStatus::Recognized:
594+ resyncCachedTouchPoints();
595+ break;
596+ case InternalStatus::WaitingForRejection:
597+ m_recognitionTimer->start(m_releaseRejectPeriod);
598+ break;
599+ case InternalStatus::Rejected:
600+ resyncCachedTouchPoints();
601+ break;
602+ default:
603+ // no-op
604+ break;
605+ }
606+}
607+
608+void TouchGestureArea::setRecognitionTimer(UbuntuGestures::AbstractTimer *timer)
609+{
610+ int interval = 0;
611+ bool timerWasRunning = false;
612+ bool wasSingleShot = false;
613+
614+ // can be null when called from the constructor
615+ if (m_recognitionTimer) {
616+ interval = m_recognitionTimer->interval();
617+ timerWasRunning = m_recognitionTimer->isRunning();
618+ if (m_recognitionTimer->parent() == this) {
619+ delete m_recognitionTimer;
620+ }
621+ }
622+
623+ m_recognitionTimer = timer;
624+ timer->setInterval(interval);
625+ timer->setSingleShot(wasSingleShot);
626+ connect(timer, SIGNAL(timeout()),
627+ this, SLOT(rejectGesture()));
628+ if (timerWasRunning) {
629+ m_recognitionTimer->start();
630+ }
631+}
632+
633+int TouchGestureArea::status() const
634+{
635+ return internalStatusToGestureStatus(m_status);
636+}
637+
638+bool TouchGestureArea::dragging() const
639+{
640+ return m_dragging;
641+}
642+
643+QQmlListProperty<GestureTouchPoint> TouchGestureArea::touchPoints()
644+{
645+ return QQmlListProperty<GestureTouchPoint>(this,
646+ 0,
647+ nullptr,
648+ TouchGestureArea::touchPoint_count,
649+ TouchGestureArea::touchPoint_at,
650+ 0);
651+}
652+
653+int TouchGestureArea::minimumTouchPoints() const
654+{
655+ return m_minimumTouchPoints;
656+}
657+
658+void TouchGestureArea::setMinimumTouchPoints(int value)
659+{
660+ if (m_minimumTouchPoints != value) {
661+ m_minimumTouchPoints = value;
662+ Q_EMIT minimumTouchPointsChanged(value);
663+ }
664+}
665+
666+int TouchGestureArea::maximumTouchPoints() const
667+{
668+ return m_maximumTouchPoints;
669+}
670+
671+void TouchGestureArea::setMaximumTouchPoints(int value)
672+{
673+ if (m_maximumTouchPoints != value) {
674+ m_maximumTouchPoints = value;
675+ Q_EMIT maximumTouchPointsChanged(value);
676+ }
677+}
678+
679+int TouchGestureArea::recognitionPeriod() const
680+{
681+ return m_recognitionPeriod;
682+}
683+
684+void TouchGestureArea::setRecognitionPeriod(int value)
685+{
686+ if (value != m_recognitionPeriod) {
687+ m_recognitionPeriod = value;
688+ Q_EMIT recognitionPeriodChanged(value);
689+ }
690+}
691+
692+int TouchGestureArea::releaseRejectPeriod() const
693+{
694+ return m_releaseRejectPeriod;
695+}
696+
697+void TouchGestureArea::setReleaseRejectPeriod(int value)
698+{
699+ if (value != m_releaseRejectPeriod) {
700+ m_releaseRejectPeriod = value;
701+ Q_EMIT releaseRejectPeriodChanged(value);
702+ }
703+}
704+
705+void TouchGestureArea::rejectGesture()
706+{
707+ tgaDebug("rejectGesture");
708+ ungrabTouchPoints();
709+
710+ Q_FOREACH(int touchId, m_candidateTouches) {
711+ TouchRegistry::instance()->removeCandidateOwnerForTouch(touchId, this);
712+ }
713+
714+ // Monitor the candidates
715+ Q_FOREACH(int touchId, m_candidateTouches) {
716+ TouchRegistry::instance()->addTouchWatcher(touchId, this);
717+ m_watchedTouches.insert(touchId);
718+ }
719+ m_candidateTouches.clear();
720+
721+ if (m_watchedTouches.count() == 0) {
722+ setInternalStatus(InternalStatus::WaitingForTouch);
723+ } else {
724+ setInternalStatus(InternalStatus::Rejected);
725+ }
726+}
727+
728+void TouchGestureArea::resyncCachedTouchPoints()
729+{
730+ clearTouchLists();
731+
732+ bool added = false;
733+ bool ended = false;
734+ bool moved = false;
735+ bool wantsDrag = false;
736+
737+ // list of deletes
738+ QMutableHashIterator<int, GestureTouchPoint*> removeIter(m_cachedTouchPoints);
739+ while(removeIter.hasNext()) {
740+ removeIter.next();
741+ if (!m_liveTouchPoints.contains(removeIter.key())) {
742+ m_releasedTouchPoints.append(removeIter.value());
743+ removeIter.remove();
744+ ended = true;
745+ }
746+ }
747+
748+ // list of adds/moves
749+ Q_FOREACH(GestureTouchPoint* touchPoint, m_liveTouchPoints) {
750+ if (m_cachedTouchPoints.contains(touchPoint->id())) {
751+ GestureTouchPoint* cachedPoint = m_cachedTouchPoints[touchPoint->id()];
752+
753+ if (*cachedPoint != *touchPoint) {
754+ *cachedPoint = *touchPoint;
755+ m_movedTouchPoints.append(touchPoint);
756+ moved = true;
757+ }
758+ } else {
759+ m_cachedTouchPoints.insert(touchPoint->id(), new GestureTouchPoint(*touchPoint));
760+ m_pressedTouchPoints.append(touchPoint);
761+ added = true;
762+ }
763+ }
764+
765+ if (wantsDrag && !dragging()) {
766+ setDragging(true);
767+ }
768+
769+ if (ended) {
770+ if (m_cachedTouchPoints.isEmpty()) {
771+ if (!dragging()) Q_EMIT clicked();
772+ setDragging(false);
773+ }
774+ tgaDebug("Cached Release " << touchesString(m_releasedTouchPoints));
775+ Q_EMIT released(m_releasedTouchPoints);
776+ }
777+ if (added) {
778+ tgaDebug("Cached Press " << touchesString(m_pressedTouchPoints));
779+ Q_EMIT pressed(m_pressedTouchPoints);
780+ }
781+ if (moved) {
782+ tgaDebug("Cached Update " << touchesString(m_movedTouchPoints));
783+ Q_EMIT updated(m_movedTouchPoints);
784+ }
785+ if (added || ended || moved) Q_EMIT touchPointsUpdated();
786+}
787+
788+int TouchGestureArea::touchPoint_count(QQmlListProperty<GestureTouchPoint> *list)
789+{
790+ TouchGestureArea *q = static_cast<TouchGestureArea*>(list->object);
791+ return q->m_cachedTouchPoints.count();
792+}
793+
794+GestureTouchPoint *TouchGestureArea::touchPoint_at(QQmlListProperty<GestureTouchPoint> *list, int index)
795+{
796+ TouchGestureArea *q = static_cast<TouchGestureArea*>(list->object);
797+ return (q->m_cachedTouchPoints.begin()+index).value();
798+}
799+
800+GestureTouchPoint* TouchGestureArea::addTouchPoint(QTouchEvent::TouchPoint const* tp)
801+{
802+ GestureTouchPoint* gtp = new GestureTouchPoint();
803+ gtp->setId(tp->id());
804+ gtp->setPressed(true);
805+ gtp->setPos(tp->pos());
806+ m_liveTouchPoints.insert(tp->id(), gtp);
807+ return gtp;
808+}
809+
810+void TouchGestureArea::itemChange(ItemChange change, const ItemChangeData &value)
811+{
812+ if (change == QQuickItem::ItemSceneChange) {
813+ if (value.window != nullptr) {
814+ value.window->installEventFilter(TouchRegistry::instance());
815+ }
816+ }
817+}
818+
819+void TouchGestureArea::setDragging(bool dragging)
820+{
821+ if (m_dragging == dragging)
822+ return;
823+
824+ tgaDebug("setDragging " << dragging);
825+
826+ m_dragging = dragging;
827+ Q_EMIT draggingChanged(m_dragging);
828+}
829+
830+void GestureTouchPoint::setId(int id)
831+{
832+ if (m_id == id)
833+ return;
834+ m_id = id;
835+ Q_EMIT idChanged();
836+}
837+
838+void GestureTouchPoint::setPressed(bool pressed)
839+{
840+ if (m_pressed == pressed)
841+ return;
842+ m_pressed = pressed;
843+ Q_EMIT pressedChanged();
844+}
845+
846+void GestureTouchPoint::setX(qreal x)
847+{
848+ if (m_x == x)
849+ return;
850+ m_x = x;
851+ Q_EMIT xChanged();
852+}
853+
854+void GestureTouchPoint::setY(qreal y)
855+{
856+ if (m_y == y)
857+ return;
858+ m_y = y;
859+ Q_EMIT yChanged();
860+}
861+
862+void GestureTouchPoint::setDragging(bool dragging)
863+{
864+ if (m_dragging == dragging)
865+ return;
866+
867+ m_dragging = dragging;
868+ Q_EMIT draggingChanged();
869+}
870+
871+void GestureTouchPoint::setPos(const QPointF &pos)
872+{
873+ setX(pos.x());
874+ setY(pos.y());
875+}
plugins/Ubuntu/Gestures/TouchGestureArea.hnew file+229
@@ -0,0 +1,229 @@
1+/*
2+ * Copyright (C) 2016 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 TOUCHGESTUREAREA_H
18+#define TOUCHGESTUREAREA_H
19+
20+#include "UbuntuGesturesQmlGlobal.h"
21+
22+#include <QQuickItem>
23+
24+// lib UbuntuGestures
25+#include <Timer.h>
26+
27+class TouchOwnershipEvent;
28+class UnownedTouchEvent;
29+
30+class GestureTouchPoint : public QObject
31+{
32+ Q_OBJECT
33+ Q_PROPERTY(int id READ id NOTIFY idChanged)
34+ Q_PROPERTY(bool pressed READ pressed NOTIFY pressedChanged)
35+ Q_PROPERTY(qreal x READ x NOTIFY xChanged)
36+ Q_PROPERTY(qreal y READ y NOTIFY yChanged)
37+ Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged)
38+public:
39+ GestureTouchPoint()
40+ : m_id(-1)
41+ , m_pressed(false)
42+ , m_x(0)
43+ , m_y(0)
44+ , m_dragging(false)
45+ {
46+ }
47+
48+ GestureTouchPoint(const GestureTouchPoint& other)
49+ : QObject(nullptr)
50+ {
51+ operator=(other);
52+ }
53+
54+ int id() const { return m_id; }
55+ void setId(int id);
56+
57+ bool pressed() const { return m_pressed; }
58+ void setPressed(bool pressed);
59+
60+ qreal x() const { return m_x; }
61+ void setX(qreal x);
62+
63+ qreal y() const { return m_y; }
64+ void setY(qreal y);
65+
66+ bool dragging() const { return m_dragging; }
67+ void setDragging(bool dragging);
68+
69+ GestureTouchPoint& operator=(const GestureTouchPoint& rhs) {
70+ if (&rhs == this) return *this;
71+ m_id = rhs.m_id;
72+ m_pressed = rhs.m_pressed;
73+ m_x = rhs.m_x;
74+ m_y = rhs.m_y;
75+ m_dragging = rhs.m_dragging;
76+ return *this;
77+ }
78+
79+ bool operator=(const GestureTouchPoint& rhs) const {
80+ if (&rhs == this) return true;
81+ return m_id == rhs.m_id &&
82+ m_pressed == rhs.m_pressed &&
83+ m_x == rhs.m_x &&
84+ m_y == rhs.m_y &&
85+ m_dragging == rhs.m_dragging;
86+ }
87+ bool operator!=(const GestureTouchPoint& rhs) const { return !operator=(rhs); }
88+
89+ void setPos(const QPointF &pos);
90+
91+Q_SIGNALS:
92+ void idChanged();
93+ void pressedChanged();
94+ void xChanged();
95+ void yChanged();
96+ void draggingChanged();
97+
98+private:
99+ int m_id;
100+ bool m_pressed;
101+ qreal m_x;
102+ qreal m_y;
103+ bool m_dragging;
104+};
105+
106+/*
107+ An area that detects multi-finger gestures.
108+
109+ We can use this to detect gestures contstrained by a minimim and/or maximum number of touch points.
110+ This components uses the touch registry to apply for ownership of touch points.
111+ This way we can use the component in conjuntion with the directional drag area to compete for ownwership
112+ or gestures; unlike the MultiPointTouchArea.
113+ */
114+class UBUNTUGESTURESQML_EXPORT TouchGestureArea : public QQuickItem
115+{
116+ Q_OBJECT
117+ Q_ENUMS(Status)
118+
119+ Q_PROPERTY(int status READ status NOTIFY statusChanged)
120+ Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged)
121+ Q_PROPERTY(QQmlListProperty<GestureTouchPoint> touchPoints READ touchPoints NOTIFY touchPointsUpdated)
122+
123+ Q_PROPERTY(int minimumTouchPoints READ minimumTouchPoints WRITE setMinimumTouchPoints NOTIFY minimumTouchPointsChanged)
124+ Q_PROPERTY(int maximumTouchPoints READ maximumTouchPoints WRITE setMaximumTouchPoints NOTIFY maximumTouchPointsChanged)
125+
126+ // Time(ms) the component will wait for after receiving an initial touch to recognise a gesutre before rejecting it.
127+ Q_PROPERTY(int recognitionPeriod READ recognitionPeriod WRITE setRecognitionPeriod NOTIFY recognitionPeriodChanged)
128+ // Time(ms) the component will allow a recognised gesture to intermitently release a touch point before rejecting the gesture.
129+ // This is so we will not immediately reject a gesture if there are fleeting touch point releases while dragging.
130+ Q_PROPERTY(int releaseRejectPeriod READ releaseRejectPeriod WRITE setReleaseRejectPeriod NOTIFY releaseRejectPeriodChanged)
131+
132+public:
133+ // Describes the state of the touch gesture area.
134+ enum Status {
135+ WaitingForTouch,
136+ Undecided,
137+ Recognized,
138+ Rejected
139+ };
140+ TouchGestureArea(QQuickItem* parent = NULL);
141+ ~TouchGestureArea();
142+
143+ bool event(QEvent *e) override;
144+
145+ void setRecognitionTimer(UbuntuGestures::AbstractTimer *timer);
146+
147+ int status() const;
148+ bool dragging() const;
149+ QQmlListProperty<GestureTouchPoint> touchPoints();
150+
151+ int minimumTouchPoints() const;
152+ void setMinimumTouchPoints(int value);
153+
154+ int maximumTouchPoints() const;
155+ void setMaximumTouchPoints(int value);
156+
157+ int recognitionPeriod() const;
158+ void setRecognitionPeriod(int value);
159+
160+ int releaseRejectPeriod() const;
161+ void setReleaseRejectPeriod(int value);
162+
163+Q_SIGNALS:
164+ void statusChanged(int status);
165+
166+ void touchPointsUpdated();
167+ void draggingChanged(bool dragging);
168+ void minimumTouchPointsChanged(bool value);
169+ void maximumTouchPointsChanged(bool value);
170+ void recognitionPeriodChanged(bool value);
171+ void releaseRejectPeriodChanged(bool value);
172+
173+ void pressed(const QList<QObject*>& points);
174+ void released(const QList<QObject*>& points);
175+ void updated(const QList<QObject*>& points);
176+ void clicked();
177+
178+protected:
179+ void itemChange(ItemChange change, const ItemChangeData &value);
180+
181+private Q_SLOTS:
182+ void rejectGesture();
183+
184+private:
185+ void touchEvent(QTouchEvent *event) override;
186+ void touchEvent_waitingForTouch(QTouchEvent *event);
187+ void touchEvent_waitingForMoreTouches(QTouchEvent *event);
188+ void touchEvent_waitingForOwnership(QTouchEvent *event);
189+ void touchEvent_recognized(QTouchEvent *event);
190+ void touchEvent_rejected(QTouchEvent *event);
191+
192+ void unownedTouchEvent(QTouchEvent *unownedTouchEvent);
193+ void unownedTouchEvent_waitingForMoreTouches(QTouchEvent *unownedTouchEvent);
194+ void unownedTouchEvent_waitingForOwnership(QTouchEvent *unownedTouchEvent);
195+ void unownedTouchEvent_recognised(QTouchEvent *unownedTouchEvent);
196+ void unownedTouchEvent_rejected(QTouchEvent *unownedTouchEvent);
197+
198+ void touchOwnershipEvent(TouchOwnershipEvent *event);
199+ void updateTouchPoints(QTouchEvent *event);
200+
201+ GestureTouchPoint* addTouchPoint(const QTouchEvent::TouchPoint *tp);
202+ void clearTouchLists();
203+ void setDragging(bool dragging);
204+ void setInternalStatus(uint status);
205+ void resyncCachedTouchPoints();
206+
207+ static int touchPoint_count(QQmlListProperty<GestureTouchPoint> *list);
208+ static GestureTouchPoint* touchPoint_at(QQmlListProperty<GestureTouchPoint> *list, int index);
209+
210+ uint m_status;
211+ QSet<int> m_candidateTouches;
212+ QSet<int> m_watchedTouches;
213+ UbuntuGestures::AbstractTimer *m_recognitionTimer;
214+
215+ bool m_dragging;
216+ QHash<int, GestureTouchPoint*> m_liveTouchPoints;
217+ QHash<int, GestureTouchPoint*> m_cachedTouchPoints;
218+ QList<QObject*> m_releasedTouchPoints;
219+ QList<QObject*> m_pressedTouchPoints;
220+ QList<QObject*> m_movedTouchPoints;
221+ int m_minimumTouchPoints;
222+ int m_maximumTouchPoints;
223+ int m_recognitionPeriod;
224+ int m_releaseRejectPeriod;
225+};
226+
227+QML_DECLARE_TYPE(GestureTouchPoint)
228+
229+#endif // TOUCHGESTUREAREA_H
plugins/Ubuntu/Gestures/plugin.cpp+3
@@ -21,6 +21,7 @@
2121#include "FloatingFlickable.h"
2222#include "PressedOutsideNotifier.h"
2323#include "TouchGate.h"
24+#include "TouchGestureArea.h"
2425
2526#include <qqml.h>
2627
@@ -38,4 +39,6 @@ void UbuntuGesturesQmlPlugin::registerTypes(const char *uri)
3839 qmlRegisterType<FloatingFlickable>(uri, 0, 1, "FloatingFlickable");
3940 qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
4041 qmlRegisterType<TouchGate>(uri, 0, 1, "TouchGate");
42+ qmlRegisterType<TouchGestureArea>(uri, 0, 1, "TouchGestureArea");
43+ qmlRegisterUncreatableType<GestureTouchPoint>(uri, 0, 1, "GestureTouchPoint", "Cannot create GestureTouchPoints");
4144}
plugins/Unity/DashCommunicator/dashcommunicator.cpp+6
@@ -27,6 +27,12 @@ DashCommunicator::DashCommunicator(QObject *parent):
2727 start();
2828}
2929
30+DashCommunicator::~DashCommunicator()
31+{
32+ quit();
33+ wait();
34+}
35+
3036void DashCommunicator::setCurrentScope(int index, bool animate, bool isSwipe)
3137{
3238 m_mutex.lock();
plugins/Unity/DashCommunicator/dashcommunicator.h+1−1
@@ -28,7 +28,7 @@ class DashCommunicator: public QThread
2828 Q_OBJECT
2929public:
3030 explicit DashCommunicator(QObject *parent = 0);
31− ~DashCommunicator() = default;
31+ ~DashCommunicator();
3232
3333public Q_SLOTS:
3434 void setCurrentScope(int index, bool animate, bool isSwipe);
plugins/Unity/Indicators/CMakeLists.txt−4
@@ -1,9 +1,5 @@
11project(IndicatorsQml)
22
3−pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
4−pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
5−pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
6−
73find_package(Qt5Core REQUIRED)
84find_package(Qt5Quick REQUIRED)
95
plugins/Unity/Indicators/indicatorsmanager.cpp+5−7
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,8 +12,6 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Nick Dedekind <nick.dedekind@canonical.com>
1715 */
1816
1917#include "indicatorsmanager.h"
@@ -116,7 +114,7 @@ void IndicatorsManager::loadFile(const QFileInfo& file_info)
116114 QSettings indicator_settings(file_info.absoluteFilePath(), QSettings::IniFormat, this);
117115 const QString name = indicator_settings.value(QStringLiteral("Indicator Service/Name")).toString();
118116
119− if (m_platform.isPC() && name == "indicator-keyboard") {
117+ if (m_platform.isPC() && name == QLatin1String("indicator-keyboard")) {
120118 return; // convergence: skip this indicator until it works in Mir
121119 }
122120
@@ -286,14 +284,14 @@ Indicator::Ptr IndicatorsManager::indicator(const QString& indicator_name)
286284 new_indicator->init(data->m_fileInfo.fileName(), settings);
287285
288286 // convergence:
289− // 1) enable session indicator conditionally, typically when running in a multisession/multiuser environment
287+ // 1) enable session indicator
290288 // 2) on a PC, switch the battery/power indicator to desktop mode,
291289 // can't control brightness for now and phone-on-desktop broken (FIXME)
292290 //
293291 // The rest of the indicators respect their default profile (which is "phone", even on desktop PCs)
294− if ((new_indicator->identifier() == QStringLiteral("indicator-session") && m_platform.isMultiSession())
292+ if ((new_indicator->identifier() == QStringLiteral("indicator-session"))
295293 || (new_indicator->identifier() == QStringLiteral("indicator-power") && m_platform.isPC())) {
296− new_indicator->setProfile("desktop");
294+ new_indicator->setProfile(QStringLiteral("desktop"));
297295 } else {
298296 new_indicator->setProfile(m_profile);
299297 }
plugins/Unity/Indicators/modelactionrootstate.cpp+76−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013 Canonical Ltd.
2+ * Copyright 2013-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -32,6 +32,7 @@ extern "C" {
3232ModelActionRootState::ModelActionRootState(QObject *parent)
3333 : RootStateObject(parent),
3434 m_menu(nullptr)
35+ , m_reentryGuard(false)
3536{
3637}
3738
@@ -62,6 +63,7 @@ void ModelActionRootState::setMenu(UnityMenuModel* menu)
6263 connect(m_menu, &UnityMenuModel::destroyed, this, &ModelActionRootState::reset);
6364 }
6465 updateActionState();
66+ updateOtherActions();
6567 Q_EMIT menuChanged();
6668
6769 if (wasValid != valid())
@@ -69,6 +71,21 @@ void ModelActionRootState::setMenu(UnityMenuModel* menu)
6971 }
7072}
7173
74+QString ModelActionRootState::secondaryAction() const
75+{
76+ return m_secondaryAction;
77+}
78+
79+QString ModelActionRootState::scrollAction() const
80+{
81+ return m_scrollAction;
82+}
83+
84+QString ModelActionRootState::submenuAction() const
85+{
86+ return m_submenuAction;
87+}
88+
7289bool ModelActionRootState::valid() const
7390{
7491 return !currentState().empty();
@@ -79,6 +96,7 @@ void ModelActionRootState::onModelRowsAdded(const QModelIndex& parent, int start
7996 Q_UNUSED(parent);
8097 if (start == 0 && end >= 0) {
8198 updateActionState();
99+ updateOtherActions();
82100 }
83101}
84102
@@ -87,6 +105,7 @@ void ModelActionRootState::onModelRowsRemoved(const QModelIndex& parent, int sta
87105 Q_UNUSED(parent);
88106 if (start == 0 && end >= 0) {
89107 updateActionState();
108+ updateOtherActions();
90109 }
91110}
92111
@@ -99,6 +118,7 @@ void ModelActionRootState::onModelDataChanged(const QModelIndex& topLeft, const
99118
100119 if (topLeft.row() <= 0 && bottomRight.row() >= 0) {
101120 updateActionState();
121+ updateOtherActions();
102122 }
103123}
104124
@@ -108,10 +128,15 @@ void ModelActionRootState::reset()
108128
109129 Q_EMIT menuChanged();
110130 setCurrentState(QVariantMap());
131+
132+ updateOtherActions();
111133}
112134
113135void ModelActionRootState::updateActionState()
114136{
137+ if (m_reentryGuard) return;
138+ m_reentryGuard = true;
139+
115140 if (m_menu && m_menu->rowCount() > 0) {
116141 ActionStateParser* oldParser = m_menu->actionStateParser();
117142 m_menu->setActionStateParser(&m_parser);
@@ -126,4 +151,54 @@ void ModelActionRootState::updateActionState()
126151 }
127152 // else if m_menu->rowCount() == 0, let's leave existing cache in place
128153 // until the new menu comes in, to avoid flashing the UI empty for a moment
154+
155+ m_reentryGuard = false;
156+}
157+
158+void ModelActionRootState::updateOtherActions()
159+{
160+ if (m_reentryGuard) return;
161+ m_reentryGuard = true;
162+
163+ if (m_menu && m_menu->rowCount() > 0) {
164+ QVariantMap map;
165+ map[QStringLiteral("submenu-action")] = QStringLiteral("string");
166+ map[QStringLiteral("x-canonical-scroll-action")] = QStringLiteral("string");
167+ map[QStringLiteral("x-canonical-secondary-action")] = QStringLiteral("string");
168+ m_menu->loadExtendedAttributes(0, map);
169+ QVariantMap extMap = m_menu->get(0, "ext").toMap();
170+
171+ QString secondaryAction = extMap.value(QStringLiteral("xCanonicalSecondaryAction")).toString();
172+ if (m_secondaryAction != secondaryAction) {
173+ m_secondaryAction = secondaryAction;
174+ Q_EMIT secondaryActionChanged();
175+ }
176+
177+ QString scrollAction = extMap.value(QStringLiteral("xCanonicalScrollAction")).toString();
178+ if (m_scrollAction != scrollAction) {
179+ m_scrollAction = scrollAction;
180+ Q_EMIT scrollActionChanged();
181+ }
182+
183+ QString submenuAction = extMap.value(QStringLiteral("submenuAction")).toString();
184+ if (m_submenuAction != submenuAction) {
185+ m_submenuAction = submenuAction;
186+ Q_EMIT submenuActionChanged();
187+ }
188+ } else {
189+ if (!m_secondaryAction.isEmpty()) {
190+ m_secondaryAction.clear();
191+ Q_EMIT secondaryActionChanged();
192+ }
193+ if (!m_scrollAction.isEmpty()) {
194+ m_scrollAction.clear();
195+ Q_EMIT scrollActionChanged();
196+ }
197+ if (!m_submenuAction.isEmpty()) {
198+ m_submenuAction.clear();
199+ Q_EMIT submenuActionChanged();
200+ }
201+ }
202+
203+ m_reentryGuard = false;
129204}
plugins/Unity/Indicators/modelactionrootstate.h+15−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013 Canonical Ltd.
2+ * Copyright 2013-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -30,6 +30,9 @@ class UNITYINDICATORS_EXPORT ModelActionRootState : public RootStateObject
3030{
3131 Q_OBJECT
3232 Q_PROPERTY(UnityMenuModel* menu READ menu WRITE setMenu NOTIFY menuChanged)
33+ Q_PROPERTY(QString secondaryAction READ secondaryAction NOTIFY secondaryActionChanged)
34+ Q_PROPERTY(QString scrollAction READ scrollAction NOTIFY scrollActionChanged)
35+ Q_PROPERTY(QString submenuAction READ submenuAction NOTIFY submenuActionChanged)
3336public:
3437 ModelActionRootState(QObject *parent = 0);
3538 virtual ~ModelActionRootState();
@@ -37,14 +40,17 @@ public:
3740 UnityMenuModel* menu() const;
3841 void setMenu(UnityMenuModel* menu);
3942
40− int index() const;
41− void setIndex(int index);
43+ QString secondaryAction() const;
44+ QString scrollAction() const;
45+ QString submenuAction() const;
4246
4347 bool valid() const override;
4448
4549Q_SIGNALS:
4650 void menuChanged();
47− void indexChanged();
51+ void secondaryActionChanged();
52+ void scrollActionChanged();
53+ void submenuActionChanged();
4854
4955private Q_SLOTS:
5056 void onModelRowsAdded(const QModelIndex& parent, int start, int end);
@@ -54,8 +60,13 @@ private Q_SLOTS:
5460
5561private:
5662 void updateActionState();
63+ void updateOtherActions();
5764
5865 UnityMenuModel* m_menu;
66+ QString m_secondaryAction;
67+ QString m_scrollAction;
68+ QString m_submenuAction;
69+ bool m_reentryGuard;
5970};
6071
6172#endif // MODELACTIONROOTSTATE_H
plugins/Unity/Indicators/rootstateparser.h+1
@@ -23,6 +23,7 @@
2323
2424class UNITYINDICATORS_EXPORT RootStateParser : public ActionStateParser
2525{
26+Q_OBJECT
2627public:
2728 RootStateParser(QObject* parent = nullptr);
2829 virtual QVariant toQVariant(GVariant* state) const override;
plugins/Unity/InputInfo/InputInfo.qmltypesnew file+71
@@ -0,0 +1,71 @@
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 Unity.InputInfo 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "QDeclarativeInputDeviceModel"
12+ prototype: "QAbstractListModel"
13+ exports: ["Unity.InputInfo/InputDeviceModel 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Property { name: "deviceFilter"; type: "QInputDevice::InputType" }
16+ Property { name: "count"; type: "int"; isReadonly: true }
17+ Signal {
18+ name: "deviceAdded"
19+ Parameter { name: "devicePath"; type: "string" }
20+ }
21+ Signal {
22+ name: "deviceRemoved"
23+ Parameter { name: "devicePath"; type: "string" }
24+ }
25+ Signal {
26+ name: "deviceFilterChanged"
27+ Parameter { name: "filter"; type: "QInputDevice::InputType" }
28+ }
29+ Method { name: "updateDeviceList" }
30+ Method {
31+ name: "indexOf"
32+ type: "int"
33+ Parameter { name: "devicePath"; type: "string" }
34+ }
35+ Method {
36+ name: "get"
37+ type: "QInputDevice*"
38+ Parameter { name: "index"; type: "int" }
39+ }
40+ }
41+ Component {
42+ name: "QInputDevice"
43+ prototype: "QObject"
44+ exports: ["Unity.InputInfo/InputInfo 0.1"]
45+ exportMetaObjectRevisions: [0]
46+ Enum {
47+ name: "InputType"
48+ values: {
49+ "Unknown": 0,
50+ "Button": 1,
51+ "Mouse": 2,
52+ "TouchPad": 4,
53+ "TouchScreen": 8,
54+ "Keyboard": 16,
55+ "Switch": 32
56+ }
57+ }
58+ Enum {
59+ name: "InputTypeFlags"
60+ values: {
61+ "Unknown": 0,
62+ "Button": 1,
63+ "Mouse": 2,
64+ "TouchPad": 4,
65+ "TouchScreen": 8,
66+ "Keyboard": 16,
67+ "Switch": 32
68+ }
69+ }
70+ }
71+}
plugins/Unity/Launcher/CMakeLists.txt+2
@@ -7,6 +7,7 @@ include_directories(
77 ${CMAKE_CURRENT_SOURCE_DIR}
88 ${CMAKE_SOURCE_DIR}/plugins/AccountsService
99 ${GSETTINGS_QT_INCLUDE_DIRS}
10+ ${GLIB_INCLUDE_DIRS}
1011 ${libunity8-private_SOURCE_DIR}
1112)
1213
@@ -34,6 +35,7 @@ add_library(UnityLauncher-qml MODULE
3435target_link_libraries(UnityLauncher-qml
3536 unity8-private
3637 ${GSETTINGS_QT_LDFLAGS}
38+ ${GLIB_LIBRARIES}
3739 )
3840
3941qt5_use_modules(UnityLauncher-qml DBus Qml Gui)
plugins/Unity/Launcher/asadapter.cpp+6−2
@@ -18,14 +18,18 @@
1818#include "launcheritem.h"
1919#include "AccountsServiceDBusAdaptor.h"
2020
21+#include <glib.h>
22+
2123#include <QDebug>
2224
2325ASAdapter::ASAdapter()
2426{
2527 m_accounts = new AccountsServiceDBusAdaptor();
26− m_user = qgetenv("USER");
28+
29+ m_user = QString::fromUtf8(g_get_user_name());
30+
2731 if (m_user.isEmpty()) {
28− qWarning() << "$USER not valid. Account Service integration will not work.";
32+ qWarning() << "username not valid. Account Service integration will not work.";
2933 }
3034}
3135
plugins/Unity/Launcher/desktopfilehandler.cpp+2−2
@@ -146,9 +146,9 @@ QString DesktopFileHandler::icon() const
146146 QString iconString = settings.value(QStringLiteral("Icon")).toString();
147147 QString pathString = settings.value(QStringLiteral("Path")).toString();
148148
149− if (QFileInfo(iconString).exists()) {
149+ if (QFileInfo::exists(iconString)) {
150150 return QFileInfo(iconString).absoluteFilePath();
151− } else if (QFileInfo(pathString + '/' + iconString).exists()) {
151+ } else if (QFileInfo::exists(pathString + '/' + iconString)) {
152152 return pathString + '/' + iconString;
153153 }
154154 return "image://theme/" + iconString;
plugins/Unity/Launcher/launcheritem.cpp+1
@@ -37,6 +37,7 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
3737 m_alerting(false),
3838 m_quickList(new QuickListModel(this))
3939{
40+ Q_ASSERT(parent != nullptr);
4041 QuickListEntry nameAction;
4142 nameAction.setActionId(QStringLiteral("launch_item"));
4243 nameAction.setText(m_name);
plugins/Unity/Launcher/launcheritem.h+1−1
@@ -32,7 +32,7 @@ class LauncherItem: public LauncherItemInterface
3232{
3333 Q_OBJECT
3434public:
35− LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent = 0);
35+ LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent);
3636
3737 QString appId() const override;
3838 QString name() const override;
plugins/Unity/Launcher/launchermodel.cpp+15−5
@@ -103,7 +103,7 @@ void LauncherModel::setAlerting(const QString &appId, bool alerting) {
103103 LauncherItem *item = m_list.at(index);
104104 if (!item->focused()) {
105105 item->setAlerting(alerting);
106− Q_EMIT dataChanged(modelIndex, modelIndex, QVector<int>() << RoleAlerting);
106+ Q_EMIT dataChanged(modelIndex, modelIndex, {RoleAlerting});
107107 }
108108 }
109109}
@@ -389,7 +389,8 @@ void LauncherModel::countVisibleChanged(const QString &appId, bool countVisible)
389389 if (countVisible && desktopFile.isValid()) {
390390 LauncherItem *item = new LauncherItem(appId,
391391 desktopFile.displayName(),
392− desktopFile.icon());
392+ desktopFile.icon(),
393+ this);
393394 item->setCountVisible(true);
394395 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
395396 m_list.append(item);
@@ -414,10 +415,19 @@ void LauncherModel::refresh()
414415 } else {
415416 int idx = m_list.indexOf(item);
416417 item->setName(desktopFile.displayName());
417− item->setIcon(desktopFile.icon());
418418 item->setPinned(item->pinned()); // update pinned text if needed
419419 item->setRunning(item->running());
420− Q_EMIT dataChanged(index(idx), index(idx), {RoleName, RoleIcon, RoleRunning});
420+ Q_EMIT dataChanged(index(idx), index(idx), {RoleName, RoleRunning});
421+
422+ const QString oldIcon = item->icon();
423+ if (oldIcon == desktopFile.icon()) { // same icon file, perhaps different contents, simulate changing the icon name to force reload
424+ item->setIcon(QString());
425+ Q_EMIT dataChanged(index(idx), index(idx), {RoleIcon});
426+ }
427+
428+ // now set the icon for real
429+ item->setIcon(desktopFile.icon());
430+ Q_EMIT dataChanged(index(idx), index(idx), {RoleIcon});
421431 }
422432 }
423433
@@ -489,7 +499,7 @@ void LauncherModel::alert(const QString &appId)
489499 if (idx >= 0) {
490500 LauncherItem *item = m_list.at(idx);
491501 setAlerting(item->appId(), true);
492− Q_EMIT dataChanged(index(idx), index(idx), QVector<int>() << RoleAlerting);
502+ Q_EMIT dataChanged(index(idx), index(idx), {RoleAlerting});
493503 }
494504}
495505
plugins/Unity/Launcher/launchermodel.h+1−1
@@ -38,7 +38,7 @@ class LauncherModel: public LauncherModelInterface
3838 Q_OBJECT
3939
4040public:
41− LauncherModel(QObject *parent = 0);
41+ LauncherModel(QObject *parent = nullptr);
4242 ~LauncherModel();
4343
4444 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
plugins/Unity/Platform/Platform.qmltypesnew file+20
@@ -0,0 +1,20 @@
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 Unity.Platform 1.0 plugins'
8+
9+Module {
10+ Component {
11+ name: "Platform"
12+ prototype: "QObject"
13+ exports: ["Unity.Platform/Platform 1.0"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Property { name: "chassis"; type: "string"; isReadonly: true }
18+ Property { name: "isPC"; type: "bool"; isReadonly: true }
19+ }
20+}
plugins/Unity/Session/CMakeLists.txt+2−2
@@ -1,9 +1,8 @@
1−pkg_search_module(GIO REQUIRED gio-2.0)
2−
31include_directories(
42 ${CMAKE_CURRENT_SOURCE_DIR}
53 ${CMAKE_CURRENT_BINARY_DIR}
64 ${GIO_INCLUDE_DIRS}
5+ ${GLIB_INCLUDE_DIRS}
76 ${libunity8-private_SOURCE_DIR}
87)
98
@@ -21,6 +20,7 @@ qt5_use_modules(UnitySession-qml DBus Qml)
2120target_link_libraries(UnitySession-qml
2221 unity8-private
2322 ${GIO_LDFLAGS}
23+ ${GLIB_LIBRARIES}
2424 )
2525
2626# export the qmldir and qmltypes files
plugins/Unity/Session/dbusunitysessionservice.cpp+8−7
@@ -30,6 +30,9 @@
3030#include <QDateTime>
3131#include <QDBusUnixFileDescriptor>
3232
33+// Glib
34+#include <glib.h>
35+
3336#define LOGIN1_SERVICE QStringLiteral("org.freedesktop.login1")
3437#define LOGIN1_PATH QStringLiteral("/org/freedesktop/login1")
3538#define LOGIN1_IFACE QStringLiteral("org.freedesktop.login1.Manager")
@@ -295,12 +298,7 @@ bool DBusUnitySessionService::CanLock() const
295298
296299QString DBusUnitySessionService::UserName() const
297300{
298− struct passwd *p = getpwuid(geteuid());
299− if (p) {
300− return QString::fromUtf8(p->pw_name);
301− }
302−
303− return QString();
301+ return QString::fromUtf8(g_get_user_name());
304302}
305303
306304QString DBusUnitySessionService::RealName() const
@@ -336,6 +334,9 @@ void DBusUnitySessionService::PromptLock()
336334
337335void DBusUnitySessionService::Lock()
338336{
337+ // signal u8 to show the lockscreen/greeter
338+ PromptLock();
339+
339340 // lock the session using the org.freedesktop.DisplayManager system DBUS service
340341 const QString sessionPath = QString::fromLocal8Bit(qgetenv("XDG_SESSION_PATH"));
341342 QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.DisplayManager"),
@@ -348,7 +349,7 @@ void DBusUnitySessionService::Lock()
348349 connect(watcher, &QDBusPendingCallWatcher::finished,
349350 this, [this](QDBusPendingCallWatcher* watcher) {
350351
351− QDBusPendingReply<QVariant> reply = *watcher;
352+ QDBusPendingReply<void> reply = *watcher;
352353 watcher->deleteLater();
353354 if (reply.isError()) {
354355 qWarning() << "Lock call failed" << reply.error().message();
plugins/Utils/CMakeLists.txt+5−4
@@ -1,5 +1,3 @@
1−pkg_search_module(GIO REQUIRED gio-2.0)
2−
31include_directories(
42 ${CMAKE_CURRENT_SOURCE_DIR}
53 ${CMAKE_CURRENT_BINARY_DIR}
@@ -13,17 +11,20 @@ set(QMLPLUGIN_SRC
1311 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
1412 applicationsfiltermodel.cpp
1513 constants.cpp
16− HomeKeyWatcher.cpp
14+ WindowInputMonitor.cpp
1715 inputwatcher.cpp
1816 qlimitproxymodelqml.cpp
1917 unitysortfilterproxymodelqml.cpp
2018 Timer.cpp
2119 unitymenumodelpaths.cpp
22− windowkeysfilter.cpp
20+ windowinputfilter.cpp
2321 windowscreenshotprovider.cpp
2422 easingcurve.cpp
2523 windowstatestorage.cpp
2624 timezoneFormatter.cpp
25+ inputeventgenerator.cpp
26+ deviceconfigparser.cpp
27+ globalfunctions.cpp
2728 plugin.cpp
2829 )
2930
plugins/Utils/EdgeBarrierSettings.qml+1−1
@@ -35,7 +35,7 @@ QtObject {
3535
3636 property Timer printSettingsTimer: Timer {
3737 interval: 1
38− onTriggered: printSettings();
38+ onTriggered: d.printSettings();
3939 }
4040 function printSettings() {
4141 console.log("EdgeBarrierSettings: min="+(minPushThreshold/units.gu(1))+"gu("+minPushThreshold+"px)"
plugins/Utils/HomeKeyWatcher.hdeleted−74
@@ -1,74 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef UNITY_HOMEKEYWATCHER_H
18−#define UNITY_HOMEKEYWATCHER_H
19−
20−#include <QQuickItem>
21−#include <QPointer>
22−
23−#include "Timer.h"
24−#include "ElapsedTimer.h"
25−
26−/*
27− Signals when the home key seems to be have been intentionally tapped.
28−
29− It only says the home key has been activated if it has been tapped in isolation,
30− that is, without being accompanied by touches on the screen. Home key taps that
31− happen along with (or immediately after, or immediately before) touches on the
32− screen are considered to have happened unintentionally and are thus ignored.
33−
34− Rationale being that it's easy to accidentally hit the home key while performing
35− a swipe from a screen edge, for instance. That's particularly the case when the
36− home key is a capacitive key.
37− */
38−class HomeKeyWatcher : public QQuickItem
39−{
40− Q_OBJECT
41−public:
42−
43− HomeKeyWatcher(QQuickItem *parent = 0);
44−
45− // for testing
46− HomeKeyWatcher(UnityUtil::AbstractTimer *timer,
47− UnityUtil::AbstractElapsedTimer *elapsedTimer,
48− QQuickItem *parent = 0);
49−
50− virtual ~HomeKeyWatcher();
51−
52− bool eventFilter(QObject *watched, QEvent *event) override;
53−
54− void update(QEvent *event);
55−
56− const qint64 msecsWithoutTouches = 150;
57−
58−Q_SIGNALS:
59− // Emitted when the home key has been intentionally tapped
60− void activated();
61−
62−private Q_SLOTS:
63− void setupFilterOnWindow(QQuickWindow *window);
64− void emitActivatedIfNoTouchesAround();
65−
66−private:
67− QPointer<QQuickWindow> m_filteredWindow;
68− bool m_windowBeingTouched;
69− bool m_homeKeyPressed;
70− UnityUtil::AbstractElapsedTimer *m_windowLastTouchedTimer;
71− UnityUtil::AbstractTimer *m_activationTimer;
72−};
73−
74−#endif // UNITY_HOMEKEYWATCHER_H
plugins/Utils/Utils.qmltypes+2−2
@@ -147,10 +147,10 @@ Module {
147147 }
148148 }
149149 Component {
150− name: "WindowKeysFilter"
150+ name: "WindowInputFilter"
151151 defaultProperty: "data"
152152 prototype: "QQuickItem"
153− exports: ["Utils/WindowKeysFilter 0.1"]
153+ exports: ["Utils/WindowInputFilter 0.1"]
154154 exportMetaObjectRevisions: [0]
155155 }
156156 Component {
plugins/Utils/HomeKeyWatcher.cpp → plugins/Utils/WindowInputMonitor.cpprenamed+19−12
@@ -14,18 +14,18 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−#include "HomeKeyWatcher.h"
17+#include "WindowInputMonitor.h"
1818
1919#include <QQuickWindow>
2020
2121using namespace UnityUtil;
2222
23−HomeKeyWatcher::HomeKeyWatcher(QQuickItem *parent)
24− : HomeKeyWatcher(new Timer, new ElapsedTimer, parent)
23+WindowInputMonitor::WindowInputMonitor(QQuickItem *parent)
24+ : WindowInputMonitor(new Timer, new ElapsedTimer, parent)
2525{
2626}
2727
28−HomeKeyWatcher::HomeKeyWatcher(UnityUtil::AbstractTimer *timer,
28+WindowInputMonitor::WindowInputMonitor(UnityUtil::AbstractTimer *timer,
2929 UnityUtil::AbstractElapsedTimer *elapsedTimer,
3030 QQuickItem *parent)
3131 : QQuickItem(parent)
@@ -37,20 +37,20 @@ HomeKeyWatcher::HomeKeyWatcher(UnityUtil::AbstractTimer *timer,
3737 m_windowLastTouchedTimer->start();
3838
3939 connect(this, &QQuickItem::windowChanged,
40− this, &HomeKeyWatcher::setupFilterOnWindow);
40+ this, &WindowInputMonitor::setupFilterOnWindow);
4141
4242 connect(m_activationTimer, &UnityUtil::AbstractTimer::timeout,
43− this, &HomeKeyWatcher::emitActivatedIfNoTouchesAround);
43+ this, &WindowInputMonitor::emitActivatedIfNoTouchesAround);
4444 m_activationTimer->setInterval(msecsWithoutTouches);
4545}
4646
47−HomeKeyWatcher::~HomeKeyWatcher()
47+WindowInputMonitor::~WindowInputMonitor()
4848{
4949 delete m_windowLastTouchedTimer;
5050 delete m_activationTimer;
5151}
5252
53−bool HomeKeyWatcher::eventFilter(QObject *watched, QEvent *event)
53+bool WindowInputMonitor::eventFilter(QObject *watched, QEvent *event)
5454{
5555 Q_ASSERT(!m_filteredWindow.isNull());
5656 Q_ASSERT(watched == static_cast<QObject*>(m_filteredWindow.data()));
@@ -62,7 +62,7 @@ bool HomeKeyWatcher::eventFilter(QObject *watched, QEvent *event)
6262 return false;
6363}
6464
65−void HomeKeyWatcher::update(QEvent *event)
65+void WindowInputMonitor::update(QEvent *event)
6666{
6767 if (event->type() == QEvent::KeyPress) {
6868 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
@@ -86,15 +86,22 @@ void HomeKeyWatcher::update(QEvent *event)
8686
8787 m_activationTimer->stop();
8888 m_windowBeingTouched = true;
89+ Q_EMIT touchBegun();
8990
9091 } else if (event->type() == QEvent::TouchEnd) {
9192
9293 m_windowBeingTouched = false;
9394 m_windowLastTouchedTimer->start();
95+
96+ QTouchEvent * touchEv = static_cast<QTouchEvent *>(event);
97+ if (touchEv && !touchEv->touchPoints().isEmpty()) {
98+ const QPointF pos = touchEv->touchPoints().last().screenPos();
99+ Q_EMIT touchEnded(pos);
100+ }
94101 }
95102}
96103
97−void HomeKeyWatcher::setupFilterOnWindow(QQuickWindow *window)
104+void WindowInputMonitor::setupFilterOnWindow(QQuickWindow *window)
98105{
99106 if (!m_filteredWindow.isNull()) {
100107 m_filteredWindow->removeEventFilter(this);
@@ -107,10 +114,10 @@ void HomeKeyWatcher::setupFilterOnWindow(QQuickWindow *window)
107114 }
108115}
109116
110−void HomeKeyWatcher::emitActivatedIfNoTouchesAround()
117+void WindowInputMonitor::emitActivatedIfNoTouchesAround()
111118{
112119 if (!m_homeKeyPressed && !m_windowBeingTouched &&
113120 (m_windowLastTouchedTimer->elapsed() > msecsWithoutTouches)) {
114− Q_EMIT activated();
121+ Q_EMIT homeKeyActivated();
115122 }
116123}
plugins/Utils/WindowInputMonitor.hnew file+91
@@ -0,0 +1,91 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UNITY_WINDOWINPUTMONITOR_H
18+#define UNITY_WINDOWINPUTMONITOR_H
19+
20+#include <QQuickItem>
21+#include <QPointer>
22+
23+#include "Timer.h"
24+#include "ElapsedTimer.h"
25+
26+/**
27+ * Monitors input events received by the window holding this item and the Home (Win aka Super_L)
28+ * key presses.
29+ *
30+ * Additionally, this class monitors for generic touch events on the screen, to
31+ * help with hiding/revealing the mouse pointer.
32+ */
33+class WindowInputMonitor : public QQuickItem
34+{
35+ Q_OBJECT
36+public:
37+
38+ WindowInputMonitor(QQuickItem *parent = 0);
39+
40+ // for testing
41+ WindowInputMonitor(UnityUtil::AbstractTimer *timer,
42+ UnityUtil::AbstractElapsedTimer *elapsedTimer,
43+ QQuickItem *parent = 0);
44+
45+ virtual ~WindowInputMonitor();
46+
47+ bool eventFilter(QObject *watched, QEvent *event) override;
48+
49+ void update(QEvent *event);
50+
51+ const qint64 msecsWithoutTouches = 150;
52+
53+Q_SIGNALS:
54+ /**
55+ * Emitted when the home key has been intentionally tapped
56+ *
57+ * It only says the home key has been activated if it has been tapped in isolation,
58+ * that is, without being accompanied by touches on the screen. Home key taps that
59+ * happen along with (or immediately after, or immediately before) touches on the
60+ * screen are considered to have happened unintentionally and are thus ignored.
61+ *
62+ * Rationale being that it's easy to accidentally hit the home key while performing
63+ * a swipe from a screen edge, for instance. That's particularly the case when the
64+ * home key is a capacitive key.
65+ */
66+ void homeKeyActivated();
67+
68+ /**
69+ * Emitted when a touch begin event is detected
70+ */
71+ void touchBegun();
72+
73+ /**
74+ * Emitted when a touch end event is detected
75+ * @param pos the position in screen coordinates
76+ */
77+ void touchEnded(const QPointF &pos);
78+
79+private Q_SLOTS:
80+ void setupFilterOnWindow(QQuickWindow *window);
81+ void emitActivatedIfNoTouchesAround();
82+
83+private:
84+ QPointer<QQuickWindow> m_filteredWindow;
85+ bool m_windowBeingTouched;
86+ bool m_homeKeyPressed;
87+ UnityUtil::AbstractElapsedTimer *m_windowLastTouchedTimer;
88+ UnityUtil::AbstractTimer *m_activationTimer;
89+};
90+
91+#endif // UNITY_WINDOWINPUTMONITOR_H
plugins/Utils/deviceconfigparser.cppnew file+158
@@ -0,0 +1,158 @@
1+/*
2+ * Copyright 2016 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+
17+#include "deviceconfigparser.h"
18+
19+#include <QSettings>
20+#include <QFileInfo>
21+#include <QDebug>
22+#include <QStandardPaths>
23+
24+DeviceConfigParser::DeviceConfigParser(QObject *parent): QObject(parent)
25+{
26+ // Local files have highest priority
27+ QString path;
28+ Q_FOREACH (const QString &standardPath, QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)) {
29+ if (QFileInfo(standardPath + "/devices.conf").exists()) {
30+ path = standardPath + "/devices.conf";
31+ break;
32+ }
33+ }
34+
35+ // Check if there is an override in the device tarball (/system/etc/)
36+ if (path.isEmpty() && QFileInfo::exists("/system/etc/ubuntu/devices.conf")) {
37+ path = "/system/etc/ubuntu/devices.conf";
38+ }
39+
40+ // No higher priority files found. Use standard of /etc/
41+ if (path.isEmpty()) {
42+ path = "/etc/ubuntu/devices.conf";
43+ }
44+
45+ qDebug() << "Using" << path << "as device configuration file";
46+ m_config = new QSettings(path, QSettings::IniFormat, this);
47+}
48+
49+QString DeviceConfigParser::name() const
50+{
51+ return m_name;
52+}
53+
54+void DeviceConfigParser::setName(const QString &name)
55+{
56+ if (m_name == name) {
57+ return;
58+ }
59+ m_name = name;
60+ Q_EMIT changed();
61+}
62+
63+Qt::ScreenOrientation DeviceConfigParser::primaryOrientation() const
64+{
65+ return stringToOrientation(readOrientationFromConfig("PrimaryOrientation"), Qt::PrimaryOrientation);
66+}
67+
68+Qt::ScreenOrientations DeviceConfigParser::supportedOrientations() const
69+{
70+ QStringList values = readOrientationsFromConfig("SupportedOrientations");
71+ if (values.isEmpty()) {
72+ return Qt::PortraitOrientation
73+ | Qt::InvertedPortraitOrientation
74+ | Qt::LandscapeOrientation
75+ | Qt::InvertedLandscapeOrientation;
76+ }
77+
78+ Qt::ScreenOrientations ret = Qt::PrimaryOrientation;
79+ Q_FOREACH(const QString &orientationString, values) {
80+ ret |= stringToOrientation(orientationString, Qt::PrimaryOrientation);
81+ }
82+ return ret;
83+}
84+
85+Qt::ScreenOrientation DeviceConfigParser::landscapeOrientation() const
86+{
87+ return stringToOrientation(readOrientationFromConfig("LandscapeOrientation"), Qt::LandscapeOrientation);
88+}
89+
90+Qt::ScreenOrientation DeviceConfigParser::invertedLandscapeOrientation() const
91+{
92+ return stringToOrientation(readOrientationFromConfig("InvertedLandscapeOrientation"), Qt::InvertedLandscapeOrientation);
93+}
94+
95+Qt::ScreenOrientation DeviceConfigParser::portraitOrientation() const
96+{
97+ return stringToOrientation(readOrientationFromConfig("PortraitOrientation"), Qt::PortraitOrientation);
98+}
99+
100+Qt::ScreenOrientation DeviceConfigParser::invertedPortraitOrientation() const
101+{
102+ return stringToOrientation(readOrientationFromConfig("InvertedPortraitOrientation"), Qt::InvertedPortraitOrientation);
103+}
104+
105+QString DeviceConfigParser::category() const
106+{
107+ QStringList supportedValues = {"phone", "tablet", "desktop"};
108+ m_config->beginGroup(m_name);
109+ QString value = m_config->value("Category", "phone").toString();
110+ if (!supportedValues.contains(value)) {
111+ qWarning().nospace().noquote() << "Unknown option \"" << value << "\" in " << m_config->fileName()
112+ << ". Supported options are: " << supportedValues.join(", ") << ".";
113+ return "phone";
114+ }
115+ m_config->endGroup();
116+ return value;
117+}
118+
119+QStringList DeviceConfigParser::readOrientationsFromConfig(const QString &key) const
120+{
121+ m_config->beginGroup(m_name);
122+
123+ QStringList ret;
124+ if (m_config->contains(key)) {
125+ ret = m_config->value(key).toStringList();
126+ }
127+
128+ m_config->endGroup();
129+ return ret;
130+}
131+
132+QString DeviceConfigParser::readOrientationFromConfig(const QString &key) const
133+{
134+ QStringList ret = readOrientationsFromConfig(key);
135+ return ret.count() > 0 ? ret.first() : QString();
136+}
137+
138+Qt::ScreenOrientation DeviceConfigParser::stringToOrientation(const QString &orientationString, Qt::ScreenOrientation defaultValue) const
139+{
140+ if (orientationString == "Landscape") {
141+ return Qt::LandscapeOrientation;
142+ }
143+ if (orientationString == "InvertedLandscape") {
144+ return Qt::InvertedLandscapeOrientation;
145+ }
146+ if (orientationString == "Portrait") {
147+ return Qt::PortraitOrientation;
148+ }
149+ if (orientationString == "InvertedPortrait") {
150+ return Qt::InvertedPortraitOrientation;
151+ }
152+ if (!orientationString.isEmpty()) {
153+ // Some option we don't know. Give some hint on what went wrong.
154+ qWarning().nospace().noquote() << "Unknown option \"" << orientationString << "\" in " << m_config->fileName()
155+ << ". Supported options are: Landscape, InvertedLandscape, Portrait and InvertedPortrait.";
156+ }
157+ return defaultValue;
158+}
plugins/Utils/deviceconfigparser.hnew file+63
@@ -0,0 +1,63 @@
1+/*
2+ * Copyright 2016 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+
17+#ifndef DEVICECONFIGPARSER_H
18+#define DEVICECONFIGPARSER_H
19+
20+#include <QObject>
21+#include <QSettings>
22+
23+class DeviceConfigParser: public QObject
24+{
25+ Q_OBJECT
26+ Q_PROPERTY(QString name READ name WRITE setName NOTIFY changed)
27+
28+ // NOTE: When changing this properties, also update the examples in docs and data
29+ Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY changed)
30+ Q_PROPERTY(Qt::ScreenOrientations supportedOrientations READ supportedOrientations NOTIFY changed)
31+ Q_PROPERTY(Qt::ScreenOrientation landscapeOrientation READ landscapeOrientation NOTIFY changed)
32+ Q_PROPERTY(Qt::ScreenOrientation invertedLandscapeOrientation READ invertedLandscapeOrientation NOTIFY changed)
33+ Q_PROPERTY(Qt::ScreenOrientation portraitOrientation READ portraitOrientation NOTIFY changed)
34+ Q_PROPERTY(Qt::ScreenOrientation invertedPortraitOrientation READ invertedPortraitOrientation NOTIFY changed)
35+ Q_PROPERTY(QString category READ category NOTIFY changed)
36+
37+public:
38+ DeviceConfigParser(QObject *parent = nullptr);
39+
40+ QString name() const;
41+ void setName(const QString &name);
42+
43+ Qt::ScreenOrientation primaryOrientation() const;
44+ Qt::ScreenOrientations supportedOrientations() const;
45+ Qt::ScreenOrientation landscapeOrientation() const;
46+ Qt::ScreenOrientation invertedLandscapeOrientation() const;
47+ Qt::ScreenOrientation portraitOrientation() const;
48+ Qt::ScreenOrientation invertedPortraitOrientation() const;
49+ QString category() const;
50+
51+Q_SIGNALS:
52+ void changed();
53+
54+private:
55+ QString m_name;
56+ QSettings *m_config;
57+
58+ QStringList readOrientationsFromConfig(const QString &key) const;
59+ QString readOrientationFromConfig(const QString &key) const;
60+ Qt::ScreenOrientation stringToOrientation(const QString &orientationString, Qt::ScreenOrientation defaultValue) const;
61+};
62+
63+#endif
plugins/Utils/globalfunctions.cppnew file+56
@@ -0,0 +1,56 @@
1+/*
2+ * Copyright 2015 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+
17+#include "globalfunctions.h"
18+
19+#pragma GCC diagnostic push
20+#pragma GCC diagnostic ignored "-pedantic"
21+#include <private/qquickitem_p.h>
22+#pragma GCC diagnostic pop
23+#include <QQmlEngine>
24+
25+GlobalFunctions::GlobalFunctions(QObject *parent)
26+ : QObject(parent)
27+{
28+}
29+
30+QQuickItem *GlobalFunctions::itemAt(QQuickItem* parent, int x, int y, QJSValue matcher)
31+{
32+ if (!parent) return nullptr;
33+ QList<QQuickItem *> children = QQuickItemPrivate::get(parent)->paintOrderChildItems();
34+
35+ for (int i = children.count() - 1; i >= 0; --i) {
36+ QQuickItem *child = children.at(i);
37+
38+ // Map coordinates to the child element's coordinate space
39+ QPointF point = parent->mapToItem(child, QPointF(x, y));
40+ if (child->isVisible() && point.x() >= 0
41+ && child->width() >= point.x()
42+ && point.y() >= 0
43+ && child->height() >= point.y()) {
44+ if (!matcher.isCallable()) return child;
45+
46+ QQmlEngine* engine = qmlEngine(child);
47+ if (!engine) return child;
48+
49+ QJSValue newObj = engine->newQObject(child);
50+ if (matcher.call(QJSValueList() << newObj).toBool()) {
51+ return child;
52+ }
53+ }
54+ }
55+ return nullptr;
56+}
plugins/Utils/globalfunctions.hnew file+42
@@ -0,0 +1,42 @@
1+/*
2+ * Copyright 2015 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+
17+#ifndef GLOBALFUNCTIONS_H
18+#define GLOBALFUNCTIONS_H
19+
20+#include <QObject>
21+#include <QJSValue>
22+class QQuickItem;
23+
24+/**
25+ * @brief The GlobalFunctions class
26+ *
27+ * This singleton class exposes utility functions to QML
28+ *
29+ */
30+class GlobalFunctions : public QObject
31+{
32+ Q_OBJECT
33+public:
34+ explicit GlobalFunctions(QObject *parent = 0);
35+
36+ static Q_INVOKABLE QQuickItem* itemAt(QQuickItem* parent,
37+ int x,
38+ int y,
39+ QJSValue matcher);
40+};
41+
42+#endif // GLOBALFUNCTIONS_H
plugins/Utils/inputeventgenerator.cppnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 2016 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 "inputeventgenerator.h"
18+
19+#include <QQuickWindow>
20+#include <QDebug>
21+#include <QDateTime>
22+
23+InputEventGenerator::InputEventGenerator(QQuickItem *parent)
24+ : QQuickItem(parent)
25+{
26+}
27+
28+void InputEventGenerator::generateKeyEvent(Qt::Key key, bool pressed, Qt::KeyboardModifiers modifiers, quint64 timestamp, quint32 nativeScanCode, const QString &text)
29+{
30+ QEvent::Type type = pressed ? QEvent::KeyPress : QEvent::KeyRelease;
31+ QKeyEvent ev(type, key, modifiers, nativeScanCode, 0, 0, text);
32+ ev.setTimestamp(timestamp);
33+ QCoreApplication::sendEvent(window(), &ev);
34+}
plugins/Utils/inputeventgenerator.hnew file+40
@@ -0,0 +1,40 @@
1+/*
2+ * Copyright (C) 2016 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 INPUTEVENTGENERATOR_H
18+#define INPUTEVENTGENERATOR_H
19+
20+#include <QQuickItem>
21+#include <QPointer>
22+#include <QDateTime>
23+
24+/**
25+ * \brief This class allows injecting Key events into the scene it lives in.
26+ */
27+class InputEventGenerator : public QQuickItem
28+{
29+ Q_OBJECT
30+public:
31+ InputEventGenerator(QQuickItem *parent = 0);
32+
33+ /**
34+ * Generate and post and event to the scene. The key event will be sent to the scene the Generator
35+ * lives in and it will be dispatched through the regular event/focus queue.
36+ */
37+ Q_INVOKABLE void generateKeyEvent(Qt::Key key, bool pressed, Qt::KeyboardModifiers modifiers = Qt::NoModifier, quint64 timestamp = QDateTime::currentMSecsSinceEpoch(), quint32 nativeScanCode = 0, const QString &text = QString());
38+};
39+
40+#endif // INPUTEVENTGENERATOR_H
plugins/Utils/plugin.cpp+17−4
@@ -25,17 +25,20 @@
2525// local
2626#include "activefocuslogger.h"
2727#include "easingcurve.h"
28−#include "HomeKeyWatcher.h"
28+#include "WindowInputMonitor.h"
2929#include "inputwatcher.h"
3030#include "qlimitproxymodelqml.h"
3131#include "unitysortfilterproxymodelqml.h"
3232#include "unitymenumodelpaths.h"
33−#include "windowkeysfilter.h"
33+#include "windowinputfilter.h"
3434#include "windowscreenshotprovider.h"
3535#include "windowstatestorage.h"
3636#include "constants.h"
3737#include "timezoneFormatter.h"
3838#include "applicationsfiltermodel.h"
39+#include "inputeventgenerator.h"
40+#include "deviceconfigparser.h"
41+#include "globalfunctions.h"
3942
4043static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
4144{
@@ -51,15 +54,22 @@ static QObject *createConstants(QQmlEngine *engine, QJSEngine *scriptEngine)
5154 return new Constants();
5255}
5356
57+static QObject *createGlobalFunctions(QQmlEngine *engine, QJSEngine *scriptEngine)
58+{
59+ Q_UNUSED(engine)
60+ Q_UNUSED(scriptEngine)
61+ return new GlobalFunctions();
62+}
63+
5464void UtilsPlugin::registerTypes(const char *uri)
5565{
5666 Q_ASSERT(uri == QLatin1String("Utils"));
57− qmlRegisterType<HomeKeyWatcher>(uri, 0, 1, "HomeKeyWatcher");
67+ qmlRegisterType<WindowInputMonitor>(uri, 0, 1, "WindowInputMonitor");
5868 qmlRegisterType<QAbstractItemModel>();
5969 qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
6070 qmlRegisterType<UnitySortFilterProxyModelQML>(uri, 0, 1, "UnitySortFilterProxyModel");
6171 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
62− qmlRegisterType<WindowKeysFilter>(uri, 0, 1, "WindowKeysFilter");
72+ qmlRegisterType<WindowInputFilter>(uri, 0, 1, "WindowInputFilter");
6373 qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
6474 qmlRegisterSingletonType<WindowStateStorage>(uri, 0, 1, "WindowStateStorage", createWindowStateStorage);
6575 qmlRegisterType<InputWatcher>(uri, 0, 1, "InputWatcher");
@@ -68,6 +78,9 @@ void UtilsPlugin::registerTypes(const char *uri)
6878 [](QQmlEngine*, QJSEngine*) -> QObject* { return new TimezoneFormatter; });
6979 qmlRegisterType<ActiveFocusLogger>(uri, 0, 1, "ActiveFocusLogger");
7080 qmlRegisterType<ApplicationsFilterModel>(uri, 0, 1, "ApplicationsFilterModel");
81+ qmlRegisterType<InputEventGenerator>(uri, 0, 1, "InputEventGenerator");
82+ qmlRegisterType<DeviceConfigParser>(uri, 0, 1, "DeviceConfigParser");
83+ qmlRegisterSingletonType<GlobalFunctions>(uri, 0, 1, "Functions", createGlobalFunctions);
7184}
7285
7386void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
plugins/Utils/timezoneFormatter.cpp+10
@@ -33,3 +33,13 @@ QString TimezoneFormatter::currentTimeInTimezone(const QVariant &tzId) const
3333 }
3434 return QString();
3535}
36+
37+QString TimezoneFormatter::currentTimeInTimezoneWithAbbrev(const QVariant &tzId) const
38+{
39+ QTimeZone tz(tzId.toByteArray());
40+ if (tz.isValid()) {
41+ const QDateTime now = QDateTime::currentDateTime().toTimeZone(tz);
42+ return QStringLiteral("%1 %2").arg(now.time().toString(QStringLiteral("h:mm"))).arg(tz.abbreviation(now));
43+ }
44+ return QString();
45+}
plugins/Utils/timezoneFormatter.h+1
@@ -27,6 +27,7 @@ public:
2727 ~TimezoneFormatter() = default;
2828
2929 Q_INVOKABLE QString currentTimeInTimezone(const QVariant &tzId) const;
30+ Q_INVOKABLE QString currentTimeInTimezoneWithAbbrev(const QVariant &tzId) const;
3031};
3132
3233#endif
plugins/Utils/windowkeysfilter.cpp → plugins/Utils/windowinputfilter.cpprenamed+14−16
@@ -16,36 +16,34 @@
1616 * Author: Daniel d'Andrada <daniel.dandrada@canonical.com>
1717 */
1818
19−#include "windowkeysfilter.h"
19+#include "windowinputfilter.h"
2020
2121#include <QQuickWindow>
2222
23−WindowKeysFilter::WindowKeysFilter(QQuickItem *parent)
23+WindowInputFilter::WindowInputFilter(QQuickItem *parent)
2424 : QQuickItem(parent),
25− m_currentEventTimestamp(0)
25+ m_lastInputTimestamp(0)
2626{
2727 connect(this, &QQuickItem::windowChanged,
28− this, &WindowKeysFilter::setupFilterOnWindow);
28+ this, &WindowInputFilter::setupFilterOnWindow);
2929}
3030
31−bool WindowKeysFilter::eventFilter(QObject *watched, QEvent *event)
31+bool WindowInputFilter::eventFilter(QObject *watched, QEvent *event)
3232{
3333 Q_ASSERT(!m_filteredWindow.isNull());
3434 Q_ASSERT(watched == static_cast<QObject*>(m_filteredWindow.data()));
3535 Q_UNUSED(watched);
3636
37+ QInputEvent *inputEvent = dynamic_cast<QInputEvent*>(event);
38+ if (inputEvent) {
39+ m_lastInputTimestamp = inputEvent->timestamp();
40+ Q_EMIT lastInputTimestampChanged();
41+ }
42+
3743 if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) {
3844 // Let QML see this event and decide if it does not want it
3945 event->accept();
40−
41− m_currentEventTimestamp = static_cast<QInputEvent*>(event)->timestamp();
42− Q_EMIT currentEventTimestampChanged();
43−
4446 QCoreApplication::sendEvent(this, event);
45−
46− m_currentEventTimestamp = 0;
47− Q_EMIT currentEventTimestampChanged();
48−
4947 return event->isAccepted();
5048 } else {
5149 // Not interested
@@ -53,7 +51,7 @@ bool WindowKeysFilter::eventFilter(QObject *watched, QEvent *event)
5351 }
5452}
5553
56−void WindowKeysFilter::setupFilterOnWindow(QQuickWindow *window)
54+void WindowInputFilter::setupFilterOnWindow(QQuickWindow *window)
5755{
5856 if (!m_filteredWindow.isNull()) {
5957 m_filteredWindow->removeEventFilter(this);
@@ -66,7 +64,7 @@ void WindowKeysFilter::setupFilterOnWindow(QQuickWindow *window)
6664 }
6765}
6866
69−ulong WindowKeysFilter::currentEventTimestamp() const
67+ulong WindowInputFilter::lastInputTimestamp() const
7068{
71− return m_currentEventTimestamp;
69+ return m_lastInputTimestamp;
7270}
plugins/Utils/windowkeysfilter.h → plugins/Utils/windowinputfilter.hrenamed+11−11
@@ -16,8 +16,8 @@
1616 * Author: Daniel d'Andrada <daniel.dandrada@canonical.com>
1717 */
1818
19−#ifndef UNITY_WINDOWKEYSFILTER_H
20−#define UNITY_WINDOWKEYSFILTER_H
19+#ifndef UNITY_WINDOWINPUTFILTER_H
20+#define UNITY_WINDOWINPUTFILTER_H
2121
2222#include <QQuickItem>
2323#include <QPointer>
@@ -29,30 +29,30 @@
2929 accepted ones will be filtered out. Events are accepted by default, so make sure you reject
3030 the keys you're not interested in.
3131
32− If more than one WindowKeysFilter exist in the same QML scene (and thus in the same QQuickWindow)
32+ If more than one WindowInputFilter exist in the same QML scene (and thus in the same QQuickWindow)
3333 they will be called in the order of creation, which can be tricky to assess. So the best practice
34− is to have at most one WindowKeysFilter per QML scene.
34+ is to have at most one WindowInputFilter per QML scene.
3535 */
36−class WindowKeysFilter : public QQuickItem
36+class WindowInputFilter : public QQuickItem
3737{
3838 Q_OBJECT
39− Q_PROPERTY(ulong currentEventTimestamp READ currentEventTimestamp NOTIFY currentEventTimestampChanged)
39+ Q_PROPERTY(ulong lastInputTimestamp READ lastInputTimestamp NOTIFY lastInputTimestampChanged)
4040public:
41− WindowKeysFilter(QQuickItem *parent = 0);
41+ WindowInputFilter(QQuickItem *parent = 0);
4242
4343 bool eventFilter(QObject *watched, QEvent *event) override;
4444
45− ulong currentEventTimestamp() const;
45+ ulong lastInputTimestamp() const;
4646
4747Q_SIGNALS:
48− void currentEventTimestampChanged();
48+ void lastInputTimestampChanged();
4949
5050private Q_SLOTS:
5151 void setupFilterOnWindow(QQuickWindow *window);
5252
5353private:
5454 QPointer<QQuickWindow> m_filteredWindow;
55− ulong m_currentEventTimestamp;
55+ ulong m_lastInputTimestamp;
5656};
5757
58−#endif // UNITY_WINDOWKEYSFILTER_H
58+#endif // UNITY_WINDOWINPUTFILTER_H
plugins/Utils/windowstatestorage.cpp+36−4
@@ -23,9 +23,14 @@
2323#include <QSqlError>
2424#include <QSqlResult>
2525#include <QRect>
26+#include <unity/shell/application/ApplicationInfoInterface.h>
2627
2728QMutex WindowStateStorage::s_mutex;
2829
30+inline QString sanitiseString(QString string) {
31+ return string.remove("\"").remove("'").remove("\\");
32+}
33+
2934WindowStateStorage::WindowStateStorage(QObject *parent):
3035 QObject(parent)
3136{
@@ -50,7 +55,7 @@ WindowStateStorage::~WindowStateStorage()
5055void WindowStateStorage::saveState(const QString &windowId, WindowStateStorage::WindowState state)
5156{
5257 const QString queryString = QStringLiteral("INSERT OR REPLACE INTO state (windowId, state) values ('%1', '%2');")
53− .arg(windowId)
58+ .arg(sanitiseString(windowId))
5459 .arg((int)state);
5560
5661 saveValue(queryString);
@@ -59,7 +64,7 @@ void WindowStateStorage::saveState(const QString &windowId, WindowStateStorage::
5964WindowStateStorage::WindowState WindowStateStorage::getState(const QString &windowId, WindowStateStorage::WindowState defaultValue) const
6065{
6166 const QString queryString = QStringLiteral("SELECT * FROM state WHERE windowId = '%1';")
62− .arg(windowId);
67+ .arg(sanitiseString(windowId));
6368
6469 QSqlQuery query = getValue(queryString);
6570
@@ -72,7 +77,7 @@ WindowStateStorage::WindowState WindowStateStorage::getState(const QString &wind
7277void WindowStateStorage::saveGeometry(const QString &windowId, const QRect rect)
7378{
7479 const QString queryString = QStringLiteral("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
75− .arg(windowId)
80+ .arg(sanitiseString(windowId))
7681 .arg(rect.x())
7782 .arg(rect.y())
7883 .arg(rect.width())
@@ -81,6 +86,28 @@ void WindowStateStorage::saveGeometry(const QString &windowId, const QRect rect)
8186 saveValue(queryString);
8287}
8388
89+void WindowStateStorage::saveStage(const QString &appId, int stage)
90+{
91+ const QString queryString = QStringLiteral("INSERT OR REPLACE INTO stage (appId, stage) values ('%1', '%2');")
92+ .arg(sanitiseString(appId))
93+ .arg((int)stage);
94+
95+ saveValue(queryString);
96+}
97+
98+int WindowStateStorage::getStage(const QString &appId) const
99+{
100+ const QString queryString = QStringLiteral("SELECT * FROM stage WHERE appId = '%1';")
101+ .arg(sanitiseString(appId));
102+
103+ QSqlQuery query = getValue(queryString);
104+
105+ if (!query.first()) {
106+ return unity::shell::application::ApplicationInfoInterface::MainStage;
107+ }
108+ return query.value("stage").toInt();
109+}
110+
84111void WindowStateStorage::executeAsyncQuery(const QString &queryString)
85112{
86113 QMutexLocker l(&s_mutex);
@@ -97,7 +124,7 @@ void WindowStateStorage::executeAsyncQuery(const QString &queryString)
97124QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect defaultValue) const
98125{
99126 QString queryString = QStringLiteral("SELECT * FROM geometry WHERE windowId = '%1';")
100− .arg(windowId);
127+ .arg(sanitiseString(windowId));
101128
102129 QSqlQuery query = getValue(queryString);
103130
@@ -124,6 +151,11 @@ void WindowStateStorage::initdb()
124151 QSqlQuery query;
125152 query.exec(QStringLiteral("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);"));
126153 }
154+
155+ if (!m_db.tables().contains(QStringLiteral("stage"))) {
156+ QSqlQuery query;
157+ query.exec(QStringLiteral("CREATE TABLE stage(appId TEXT UNIQUE, stage INTEGER);"));
158+ }
127159}
128160
129161void WindowStateStorage::saveValue(const QString &queryString)
plugins/Utils/windowstatestorage.h+3
@@ -38,6 +38,9 @@ public:
3838 Q_INVOKABLE void saveGeometry(const QString &windowId, const QRect rect);
3939 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect defaultValue) const;
4040
41+ Q_INVOKABLE void saveStage(const QString &appId, int stage);
42+ Q_INVOKABLE int getStage(const QString &appId) const;
43+
4144private:
4245 void initdb();
4346
plugins/WindowManager/CMakeLists.txtnew file+13
@@ -0,0 +1,13 @@
1+set(WINDOWMANAGER_SRC
2+ TopLevelSurfaceList.cpp
3+ WindowManagerPlugin.cpp
4+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
5+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
6+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
7+ )
8+
9+add_library(windowmanager-qml SHARED ${WINDOWMANAGER_SRC})
10+
11+qt5_use_modules(windowmanager-qml Qml Quick Gui)
12+
13+add_unity8_plugin(WindowManager 0.1 WindowManager TARGETS windowmanager-qml)
plugins/WindowManager/TopLevelSurfaceList.cppnew file+486
@@ -0,0 +1,486 @@
1+/*
2+ * Copyright (C) 2016 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 "TopLevelSurfaceList.h"
18+
19+// unity-api
20+#include <unity/shell/application/ApplicationInfoInterface.h>
21+#include <unity/shell/application/MirSurfaceInterface.h>
22+#include <unity/shell/application/MirSurfaceListInterface.h>
23+
24+#include <QMetaObject>
25+
26+Q_LOGGING_CATEGORY(UNITY_TOPSURFACELIST, "unity.topsurfacelist", QtDebugMsg)
27+
28+#define DEBUG_MSG qCDebug(UNITY_TOPSURFACELIST).nospace().noquote() << __func__
29+
30+using namespace unity::shell::application;
31+
32+TopLevelSurfaceList::TopLevelSurfaceList(QObject *parent) :
33+ QAbstractListModel(parent)
34+{
35+ DEBUG_MSG << "()";
36+}
37+
38+TopLevelSurfaceList::~TopLevelSurfaceList()
39+{
40+ DEBUG_MSG << "()";
41+}
42+
43+int TopLevelSurfaceList::rowCount(const QModelIndex &parent) const
44+{
45+ return !parent.isValid() ? m_surfaceList.size() : 0;
46+}
47+
48+QVariant TopLevelSurfaceList::data(const QModelIndex& index, int role) const
49+{
50+ if (index.row() < 0 || index.row() >= m_surfaceList.size())
51+ return QVariant();
52+
53+ if (role == SurfaceRole) {
54+ MirSurfaceInterface *surface = m_surfaceList.at(index.row()).surface;
55+ return QVariant::fromValue(surface);
56+ } else if (role == ApplicationRole) {
57+ return QVariant::fromValue(m_surfaceList.at(index.row()).application);
58+ } else if (role == IdRole) {
59+ return QVariant::fromValue(m_surfaceList.at(index.row()).id);
60+ } else {
61+ return QVariant();
62+ }
63+}
64+
65+void TopLevelSurfaceList::raise(MirSurfaceInterface *surface)
66+{
67+ if (!surface)
68+ return;
69+
70+ DEBUG_MSG << "(MirSurface[" << (void*)surface << "])";
71+
72+ int i = indexOf(surface);
73+ if (i != -1) {
74+ raiseId(m_surfaceList.at(i).id);
75+ }
76+}
77+
78+void TopLevelSurfaceList::appendPlaceholder(ApplicationInfoInterface *application)
79+{
80+ DEBUG_MSG << "(" << application->appId() << ")";
81+
82+ appendSurfaceHelper(nullptr, application);
83+}
84+
85+void TopLevelSurfaceList::appendSurface(MirSurfaceInterface *surface, ApplicationInfoInterface *application)
86+{
87+ Q_ASSERT(surface != nullptr);
88+
89+ bool filledPlaceholder = false;
90+ for (int i = 0; i < m_surfaceList.count() && !filledPlaceholder; ++i) {
91+ ModelEntry &entry = m_surfaceList[i];
92+ if (entry.application == application && entry.surface == nullptr) {
93+ entry.surface = surface;
94+ connectSurface(surface);
95+ DEBUG_MSG << " appId=" << application->appId() << " surface=" << surface
96+ << ", filling out placeholder. after: " << toString();
97+ Q_EMIT dataChanged(index(i) /* topLeft */, index(i) /* bottomRight */, QVector<int>() << SurfaceRole);
98+ filledPlaceholder = true;
99+ }
100+ }
101+
102+ if (!filledPlaceholder) {
103+ DEBUG_MSG << " appId=" << application->appId() << " surface=" << surface << ", adding new row";
104+ appendSurfaceHelper(surface, application);
105+ }
106+}
107+
108+void TopLevelSurfaceList::appendSurfaceHelper(MirSurfaceInterface *surface, ApplicationInfoInterface *application)
109+{
110+ if (m_modelState == IdleState) {
111+ m_modelState = InsertingState;
112+ beginInsertRows(QModelIndex(), m_surfaceList.size() /*first*/, m_surfaceList.size() /*last*/);
113+ } else {
114+ Q_ASSERT(m_modelState == ResettingState);
115+ // No point in signaling anything if we're resetting the whole model
116+ }
117+
118+ int id = generateId();
119+ m_surfaceList.append(ModelEntry(surface, application, id));
120+ if (surface) {
121+ connectSurface(surface);
122+ }
123+
124+ if (m_modelState == InsertingState) {
125+ endInsertRows();
126+ Q_EMIT countChanged();
127+ Q_EMIT listChanged();
128+ m_modelState = IdleState;
129+ }
130+
131+ DEBUG_MSG << " after " << toString();
132+}
133+
134+void TopLevelSurfaceList::connectSurface(MirSurfaceInterface *surface)
135+{
136+ connect(surface, &MirSurfaceInterface::focusedChanged, this, [this, surface](bool focused){
137+ if (focused) {
138+ this->raise(surface);
139+ }
140+ });
141+ connect(surface, &MirSurfaceInterface::liveChanged, this, [this, surface](bool live){
142+ if (!live) {
143+ onSurfaceDied(surface);
144+ }
145+ });
146+ connect(surface, &QObject::destroyed, this, [this, surface](){ this->onSurfaceDestroyed(surface); });
147+}
148+
149+void TopLevelSurfaceList::onSurfaceDied(MirSurfaceInterface *surface)
150+{
151+ int i = indexOf(surface);
152+ if (i == -1) {
153+ return;
154+ }
155+
156+ auto application = m_surfaceList[i].application;
157+
158+ // can't be starting if it already has a surface
159+ Q_ASSERT(application->state() != ApplicationInfoInterface::Starting);
160+
161+ if (application->state() == ApplicationInfoInterface::Running) {
162+ m_surfaceList[i].removeOnceSurfaceDestroyed = true;
163+ } else {
164+ // assume it got killed by the out-of-memory daemon.
165+ //
166+ // So leave entry in the model and only remove its surface, so shell can display a screenshot
167+ // in its place.
168+ m_surfaceList[i].removeOnceSurfaceDestroyed = false;
169+ }
170+}
171+
172+void TopLevelSurfaceList::onSurfaceDestroyed(MirSurfaceInterface *surface)
173+{
174+ int i = indexOf(surface);
175+ if (i == -1) {
176+ return;
177+ }
178+
179+ if (m_surfaceList[i].removeOnceSurfaceDestroyed) {
180+ removeAt(i);
181+ } else {
182+ m_surfaceList[i].surface = nullptr;
183+ Q_EMIT dataChanged(index(i) /* topLeft */, index(i) /* bottomRight */, QVector<int>() << SurfaceRole);
184+ DEBUG_MSG << " Removed surface from entry. After: " << toString();
185+ }
186+}
187+
188+void TopLevelSurfaceList::removeAt(int index)
189+{
190+ if (m_modelState == IdleState) {
191+ beginRemoveRows(QModelIndex(), index, index);
192+ m_modelState = RemovingState;
193+ } else {
194+ Q_ASSERT(m_modelState == ResettingState);
195+ // No point in signaling anything if we're resetting the whole model
196+ }
197+
198+ m_surfaceList.removeAt(index);
199+
200+ if (m_modelState == RemovingState) {
201+ endRemoveRows();
202+ Q_EMIT countChanged();
203+ Q_EMIT listChanged();
204+ m_modelState = IdleState;
205+ }
206+
207+ DEBUG_MSG << " after " << toString();
208+}
209+
210+int TopLevelSurfaceList::indexOf(MirSurfaceInterface *surface)
211+{
212+ for (int i = 0; i < m_surfaceList.count(); ++i) {
213+ if (m_surfaceList.at(i).surface == surface) {
214+ return i;
215+ }
216+ }
217+ return -1;
218+}
219+
220+void TopLevelSurfaceList::move(int from, int to)
221+{
222+ if (from == to) return;
223+ DEBUG_MSG << " from=" << from << " to=" << to;
224+
225+ if (from >= 0 && from < m_surfaceList.size() && to >= 0 && to < m_surfaceList.size()) {
226+ QModelIndex parent;
227+ /* When moving an item down, the destination index needs to be incremented
228+ by one, as explained in the documentation:
229+ http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#beginMoveRows */
230+
231+ Q_ASSERT(m_modelState == IdleState);
232+ m_modelState = MovingState;
233+
234+ beginMoveRows(parent, from, from, parent, to + (to > from ? 1 : 0));
235+ m_surfaceList.move(from, to);
236+ endMoveRows();
237+ Q_EMIT listChanged();
238+
239+ m_modelState = IdleState;
240+
241+ DEBUG_MSG << " after " << toString();
242+ }
243+}
244+
245+MirSurfaceInterface *TopLevelSurfaceList::surfaceAt(int index) const
246+{
247+ if (index >=0 && index < m_surfaceList.count()) {
248+ return m_surfaceList[index].surface;
249+ } else {
250+ return nullptr;
251+ }
252+}
253+
254+ApplicationInfoInterface *TopLevelSurfaceList::applicationAt(int index) const
255+{
256+ if (index >=0 && index < m_surfaceList.count()) {
257+ return m_surfaceList[index].application;
258+ } else {
259+ return nullptr;
260+ }
261+}
262+
263+int TopLevelSurfaceList::idAt(int index) const
264+{
265+ if (index >=0 && index < m_surfaceList.count()) {
266+ return m_surfaceList[index].id;
267+ } else {
268+ return 0;
269+ }
270+}
271+
272+int TopLevelSurfaceList::indexForId(int id) const
273+{
274+ for (int i = 0; i < m_surfaceList.count(); ++i) {
275+ if (m_surfaceList[i].id == id) {
276+ return i;
277+ }
278+ }
279+ return -1;
280+}
281+
282+void TopLevelSurfaceList::doRaiseId(int id)
283+{
284+ int fromIndex = indexForId(id);
285+ if (fromIndex != -1) {
286+ move(fromIndex, 0 /* toIndex */);
287+ }
288+}
289+
290+void TopLevelSurfaceList::raiseId(int id)
291+{
292+ if (m_modelState == IdleState) {
293+ DEBUG_MSG << "(id=" << id << ") - do it now.";
294+ doRaiseId(id);
295+ } else {
296+ DEBUG_MSG << "(id=" << id << ") - Model busy (modelState=" << m_modelState << "). Try again in the next event loop.";
297+ // The model has just signalled some change. If we have a Repeater responding to this update, it will get nuts
298+ // if we perform yet another model change straight away.
299+ //
300+ // A bad sympton of this problem is a Repeater.itemAt(index) call returning null event though Repeater.count says
301+ // the index is definitely within bounds.
302+ QMetaObject::invokeMethod(this, "raiseId", Qt::QueuedConnection, Q_ARG(int, id));
303+ }
304+}
305+
306+int TopLevelSurfaceList::generateId()
307+{
308+ int id = m_nextId;
309+ m_nextId = nextFreeId(m_nextId + 1);
310+ Q_EMIT nextIdChanged();
311+ return id;
312+}
313+
314+int TopLevelSurfaceList::nextFreeId(int candidateId)
315+{
316+ if (candidateId > m_maxId) {
317+ return nextFreeId(1);
318+ } else {
319+ if (indexForId(candidateId) == -1) {
320+ // it's indeed free
321+ return candidateId;
322+ } else {
323+ return nextFreeId(candidateId + 1);
324+ }
325+ }
326+}
327+
328+QString TopLevelSurfaceList::toString()
329+{
330+ QString str;
331+ for (int i = 0; i < m_surfaceList.count(); ++i) {
332+ auto item = m_surfaceList.at(i);
333+
334+ QString itemStr = QString("(index=%1,appId=%2,surface=0x%3,id=%4)")
335+ .arg(i)
336+ .arg(item.application->appId())
337+ .arg((qintptr)item.surface, 0, 16)
338+ .arg(item.id);
339+
340+ if (i > 0) {
341+ str.append(",");
342+ }
343+ str.append(itemStr);
344+ }
345+ return str;
346+}
347+
348+void TopLevelSurfaceList::addApplication(ApplicationInfoInterface *application)
349+{
350+ DEBUG_MSG << "(" << application->appId() << ")";
351+ Q_ASSERT(!m_applications.contains(application));
352+ m_applications.append(application);
353+
354+ MirSurfaceListInterface *surfaceList = application->surfaceList();
355+
356+ if (application->state() != ApplicationInfoInterface::Stopped) {
357+ if (surfaceList->count() == 0) {
358+ appendPlaceholder(application);
359+ } else {
360+ for (int i = 0; i < surfaceList->count(); ++i) {
361+ appendSurface(surfaceList->get(i), application);
362+ }
363+ }
364+ }
365+
366+ connect(surfaceList, &QAbstractItemModel::rowsInserted, this,
367+ [this, application, surfaceList](const QModelIndex & /*parent*/, int first, int last)
368+ {
369+ for (int i = last; i >= first; --i) {
370+ this->appendSurface(surfaceList->get(i), application);
371+ }
372+ });
373+}
374+
375+void TopLevelSurfaceList::removeApplication(ApplicationInfoInterface *application)
376+{
377+ DEBUG_MSG << "(" << application->appId() << ")";
378+ Q_ASSERT(m_applications.contains(application));
379+
380+ MirSurfaceListInterface *surfaceList = application->surfaceList();
381+
382+ disconnect(surfaceList, 0, this, 0);
383+
384+ Q_ASSERT(m_modelState == IdleState);
385+ m_modelState = RemovingState;
386+
387+ int i = 0;
388+ while (i < m_surfaceList.count()) {
389+ if (m_surfaceList.at(i).application == application) {
390+ beginRemoveRows(QModelIndex(), i, i);
391+ m_surfaceList.removeAt(i);
392+ endRemoveRows();
393+ Q_EMIT countChanged();
394+ Q_EMIT listChanged();
395+ } else {
396+ ++i;
397+ }
398+ }
399+
400+ m_modelState = IdleState;
401+
402+ DEBUG_MSG << " after " << toString();
403+
404+ m_applications.removeAll(application);
405+}
406+
407+QAbstractListModel *TopLevelSurfaceList::applicationsModel() const
408+{
409+ return m_applicationsModel;
410+}
411+
412+void TopLevelSurfaceList::setApplicationsModel(QAbstractListModel* value)
413+{
414+ if (m_applicationsModel == value) {
415+ return;
416+ }
417+
418+ DEBUG_MSG << "(" << value << ")";
419+
420+ Q_ASSERT(m_modelState == IdleState);
421+ m_modelState = ResettingState;
422+
423+ beginResetModel();
424+
425+ if (m_applicationsModel) {
426+ m_surfaceList.clear();
427+ m_applications.clear();
428+ disconnect(m_applicationsModel, 0, this, 0);
429+ }
430+
431+ m_applicationsModel = value;
432+
433+ if (m_applicationsModel) {
434+ findApplicationRole();
435+
436+ connect(m_applicationsModel, &QAbstractItemModel::rowsInserted,
437+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
438+ for (int i = first; i <= last; ++i) {
439+ auto application = getApplicationFromModelAt(i);
440+ addApplication(application);
441+ }
442+ });
443+
444+ connect(m_applicationsModel, &QAbstractItemModel::rowsAboutToBeRemoved,
445+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
446+ for (int i = first; i <= last; ++i) {
447+ auto application = getApplicationFromModelAt(i);
448+ removeApplication(application);
449+ }
450+ });
451+
452+ for (int i = 0; i < m_applicationsModel->rowCount(); ++i) {
453+ auto application = getApplicationFromModelAt(i);
454+ addApplication(application);
455+ }
456+ }
457+
458+ endResetModel();
459+ m_modelState = IdleState;
460+}
461+
462+ApplicationInfoInterface *TopLevelSurfaceList::getApplicationFromModelAt(int index)
463+{
464+ QModelIndex modelIndex = m_applicationsModel->index(index);
465+
466+ QVariant variant = m_applicationsModel->data(modelIndex, m_applicationRole);
467+
468+ // variant.value<ApplicationInfoInterface*>() returns null for some reason.
469+ return static_cast<ApplicationInfoInterface*>(variant.value<QObject*>());
470+}
471+
472+void TopLevelSurfaceList::findApplicationRole()
473+{
474+ QHash<int, QByteArray> namesHash = m_applicationsModel->roleNames();
475+
476+ m_applicationRole = -1;
477+ for (auto i = namesHash.begin(); i != namesHash.end() && m_applicationRole == -1; ++i) {
478+ if (i.value() == "application") {
479+ m_applicationRole = i.key();
480+ }
481+ }
482+
483+ if (m_applicationRole == -1) {
484+ qFatal("TopLevelSurfaceList: applicationsModel must have a \"application\" role.");
485+ }
486+}
plugins/WindowManager/TopLevelSurfaceList.hnew file+223
@@ -0,0 +1,223 @@
1+/*
2+ * Copyright (C) 2016 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 TOPLEVELSURFACELIST_H
18+#define TOPLEVELSURFACELIST_H
19+
20+#include <QAbstractListModel>
21+#include <QList>
22+#include <QLoggingCategory>
23+
24+Q_DECLARE_LOGGING_CATEGORY(UNITY_TOPSURFACELIST)
25+
26+namespace unity {
27+ namespace shell {
28+ namespace application {
29+ class ApplicationInfoInterface;
30+ class MirSurfaceInterface;
31+ }
32+ }
33+}
34+
35+/**
36+ * @brief A model of top-level surfaces
37+ *
38+ * It's an abstraction of top-level application windows.
39+ *
40+ * When an entry first appears, it normaly doesn't have a surface yet, meaning that the application is
41+ * still starting up. A shell should then display a splash screen or saved screenshot of the application
42+ * until its surface comes up.
43+ *
44+ * As applications can have multiple surfaces and you can also have entries without surfaces at all,
45+ * the only way to unambiguously refer to an entry in this model is through its id.
46+ */
47+class TopLevelSurfaceList : public QAbstractListModel
48+{
49+
50+ Q_OBJECT
51+
52+ /**
53+ * @brief A list model of applications.
54+ *
55+ * It's expected to have a role called "application" which returns a ApplicationInfoInterface
56+ */
57+ Q_PROPERTY(QAbstractListModel* applicationsModel READ applicationsModel
58+ WRITE setApplicationsModel
59+ NOTIFY applicationsModelChanged)
60+
61+ /**
62+ * @brief Number of top-level surfaces in this model
63+ *
64+ * This is the same as rowCount, added in order to keep compatibility with QML ListModels.
65+ */
66+ Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
67+
68+ /**
69+ The id to be used on the next entry created
70+ Useful for tests
71+ */
72+ Q_PROPERTY(int nextId READ nextId NOTIFY nextIdChanged)
73+public:
74+
75+ /**
76+ * @brief The Roles supported by the model
77+ *
78+ * SurfaceRole - A MirSurfaceInterface. It will be null if the application is still starting up
79+ * ApplicationRole - An ApplicationInfoInterface
80+ * IdRole - A unique identifier for this entry. Useful to unambiguosly track elements as they move around in the list
81+ */
82+ enum Roles {
83+ SurfaceRole = Qt::UserRole,
84+ ApplicationRole = Qt::UserRole + 1,
85+ IdRole = Qt::UserRole + 2,
86+ };
87+
88+ explicit TopLevelSurfaceList(QObject *parent = nullptr);
89+ virtual ~TopLevelSurfaceList();
90+
91+ // QAbstractItemModel methods
92+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
93+ QVariant data(const QModelIndex& index, int role) const override;
94+ QHash<int, QByteArray> roleNames() const override {
95+ QHash<int, QByteArray> roleNames { {SurfaceRole, "surface"},
96+ {ApplicationRole, "application"},
97+ {IdRole, "id"} };
98+ return roleNames;
99+ }
100+
101+ int nextId() const { return m_nextId; }
102+
103+ QAbstractListModel *applicationsModel() const;
104+ void setApplicationsModel(QAbstractListModel*);
105+
106+public Q_SLOTS:
107+ /**
108+ * @brief Returns the surface at the given index
109+ *
110+ * It will be a nullptr if the application is still starting up and thus hasn't yet created
111+ * and drawn into a surface.
112+ */
113+ unity::shell::application::MirSurfaceInterface *surfaceAt(int index) const;
114+
115+ /**
116+ * @brief Returns the application at the given index
117+ */
118+ unity::shell::application::ApplicationInfoInterface *applicationAt(int index) const;
119+
120+ /**
121+ * @brief Returns the unique id of the element at the given index
122+ */
123+ int idAt(int index) const;
124+
125+ /**
126+ * @brief Returns the index where the row with the given id is located
127+ *
128+ * Returns -1 if there's no row with the given id.
129+ */
130+ int indexForId(int id) const;
131+
132+ /**
133+ * @brief Raises the row with the given id to index 0
134+ */
135+ void raiseId(int id);
136+
137+ void doRaiseId(int id);
138+
139+Q_SIGNALS:
140+ void countChanged();
141+
142+ /**
143+ * @brief Emitted when the list changes
144+ *
145+ * Emitted when model gains an element, loses an element or when elements exchange positions.
146+ */
147+ void listChanged();
148+
149+ void nextIdChanged();
150+
151+ void applicationsModelChanged();
152+
153+private:
154+ void addApplication(unity::shell::application::ApplicationInfoInterface *application);
155+ void removeApplication(unity::shell::application::ApplicationInfoInterface *application);
156+
157+ int indexOf(unity::shell::application::MirSurfaceInterface *surface);
158+ void raise(unity::shell::application::MirSurfaceInterface *surface);
159+ void move(int from, int to);
160+ void appendSurfaceHelper(unity::shell::application::MirSurfaceInterface *surface,
161+ unity::shell::application::ApplicationInfoInterface *application);
162+ void connectSurface(unity::shell::application::MirSurfaceInterface *surface);
163+ int generateId();
164+ int nextFreeId(int candidateId);
165+ QString toString();
166+ void onSurfaceDestroyed(unity::shell::application::MirSurfaceInterface *surface);
167+ void onSurfaceDied(unity::shell::application::MirSurfaceInterface *surface);
168+ void removeAt(int index);
169+ void findApplicationRole();
170+
171+ unity::shell::application::ApplicationInfoInterface *getApplicationFromModelAt(int index);
172+
173+ /*
174+ Placeholder for a future surface from a starting or running application.
175+ Enables shell to give immediate feedback to the user by showing, eg,
176+ a splash screen.
177+
178+ It's a model row containing a null surface and the given application.
179+ */
180+ void appendPlaceholder(unity::shell::application::ApplicationInfoInterface *application);
181+
182+ /*
183+ Adds a model row with the given surface and application
184+
185+ Alternatively, if a placeholder exists for the given application it's
186+ filled with the given surface instead.
187+ */
188+ void appendSurface(unity::shell::application::MirSurfaceInterface *surface,
189+ unity::shell::application::ApplicationInfoInterface *application);
190+
191+ struct ModelEntry {
192+ ModelEntry(unity::shell::application::MirSurfaceInterface *surface, unity::shell::application::ApplicationInfoInterface *application, int id)
193+ : surface(surface), application(application), id(id) {}
194+ unity::shell::application::MirSurfaceInterface *surface;
195+ unity::shell::application::ApplicationInfoInterface *application;
196+ int id;
197+ bool removeOnceSurfaceDestroyed{false};
198+ };
199+
200+ QList<ModelEntry> m_surfaceList;
201+ int m_nextId{1};
202+ static const int m_maxId{1000000};
203+
204+ // applications that are being monitored
205+ QList<unity::shell::application::ApplicationInfoInterface *> m_applications;
206+
207+ QAbstractListModel* m_applicationsModel{nullptr};
208+ int m_applicationRole{-1};
209+
210+ enum ModelState {
211+ IdleState,
212+ InsertingState,
213+ RemovingState,
214+ MovingState,
215+ ResettingState
216+ };
217+ ModelState m_modelState{IdleState};
218+};
219+
220+Q_DECLARE_METATYPE(TopLevelSurfaceList*)
221+Q_DECLARE_METATYPE(QAbstractListModel*)
222+
223+#endif // TOPLEVELSURFACELIST_H
plugins/WindowManager/WindowManagerPlugin.cppnew file+28
@@ -0,0 +1,28 @@
1+/*
2+ * Copyright (C) 2016 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 "WindowManagerPlugin.h"
18+
19+#include "TopLevelSurfaceList.h"
20+
21+#include <QtQml>
22+
23+void WindowManagerPlugin::registerTypes(const char *uri)
24+{
25+ qmlRegisterType<TopLevelSurfaceList>(uri, 0, 1, "TopLevelSurfaceList");
26+
27+ qRegisterMetaType<QAbstractListModel*>("QAbstractListModel*");
28+}
plugins/WindowManager/WindowManagerPlugin.hnew file+32
@@ -0,0 +1,32 @@
1+/*
2+ * Copyright (C) 2016 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 WINDOWMANAGER_PLUGIN_H
18+#define WINDOWMANAGER_PLUGIN_H
19+
20+#include <QtQml/QQmlEngine>
21+#include <QtQml/QQmlExtensionPlugin>
22+
23+class WindowManagerPlugin : public QQmlExtensionPlugin
24+{
25+ Q_OBJECT
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27+
28+public:
29+ void registerTypes(const char *uri) override;
30+};
31+
32+#endif // WINDOWMANAGER_PLUGIN_H
plugins/WindowManager/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module WindowManager
2+plugin windowmanager-qml
plugins/Wizard/CMakeLists.txt+7−1
@@ -1,10 +1,16 @@
1+include_directories(${GLIB_INCLUDE_DIRS} ${GEONAMES_INCLUDE_DIRS})
2+
13add_library(Wizard-qml MODULE
24 plugin.cpp
35 PageList.cpp
46 System.cpp
7+ LocalePlugin.cpp
8+ timezonemodel.cpp
9+ Status.cpp
510)
611
7−qt5_use_modules(Wizard-qml DBus Qml)
12+qt5_use_modules(Wizard-qml DBus Qml Concurrent)
13+target_link_libraries(Wizard-qml ${GLIB_LDFLAGS} ${GEONAMES_LDFLAGS})
814add_unity8_plugin(Wizard 0.1 Wizard TARGETS Wizard-qml)
915
1016set(POLKIT_LIB_DIR "${CMAKE_INSTALL_LOCALSTATEDIR}/lib/polkit-1")
plugins/Wizard/LocalePlugin.cppnew file+291
@@ -0,0 +1,291 @@
1+/*
2+ * Copyright (C) 2015 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include <QLocale>
18+#include <QStringList>
19+
20+#include <libintl.h>
21+
22+#include "LocalePlugin.h"
23+
24+class LocalePrivate {
25+public:
26+ LocalePrivate() {
27+ m_mccCodes = QHash<int, QString>
28+ ({{202,"gr"},
29+ {204,"nl"},
30+ {206,"be"},
31+ {208,"fr"},
32+ {212,"mc"},
33+ {213,"ad"},
34+ {214,"es"},
35+ {216,"hu"},
36+ {218,"ba"},
37+ {219,"hr"},
38+ {220,"rs"},
39+ {222,"it"},
40+ {226,"ro"},
41+ {228,"ch"},
42+ {230,"cz"},
43+ {231,"sk"},
44+ {232,"at"},
45+ {234,"gb"},
46+ {235,"gb"},
47+ {238,"dk"},
48+ {240,"se"},
49+ {242,"no"},
50+ {244,"fi"},
51+ {246,"lt"},
52+ {247,"lv"},
53+ {248,"ee"},
54+ {250,"ru"},
55+ {255,"ua"},
56+ {257,"by"},
57+ {259,"md"},
58+ {260,"pl"},
59+ {262,"de"},
60+ {266,"gi"},
61+ {268,"pt"},
62+ {270,"lu"},
63+ {272,"ie"},
64+ {274,"is"},
65+ {276,"al"},
66+ {278,"mt"},
67+ {280,"cy"},
68+ {282,"ge"},
69+ {283,"am"},
70+ {284,"bg"},
71+ {286,"tr"},
72+ {288,"fo"},
73+ {289,"ge"},
74+ {290,"gl"},
75+ {292,"sm"},
76+ {293,"si"},
77+ {294,"mk"},
78+ {295,"li"},
79+ {297,"me"},
80+ {302,"ca"},
81+ {308,"pm"},
82+ {310,"gu"},
83+ {310,"us"},
84+ {311,"gu"},
85+ {311,"us"},
86+ {312,"us"},
87+ {316,"us"},
88+ {330,"pr"},
89+ {334,"mx"},
90+ {338,"jm"},
91+ {340,"fg"},
92+ {340,"gp"},
93+ {340,"mq"},
94+ {342,"bb"},
95+ {344,"ag"},
96+ {346,"ky"},
97+ {348,"vg"},
98+ {350,"bm"},
99+ {352,"gd"},
100+ {354,"ms"},
101+ {356,"kn"},
102+ {358,"lc"},
103+ {360,"vc"},
104+ {362,"an"},
105+ {362,"cw"},
106+ {363,"aw"},
107+ {364,"bs"},
108+ {365,"ai"},
109+ {366,"dm"},
110+ {368,"cu"},
111+ {370,"do"},
112+ {372,"ht"},
113+ {374,"tt"},
114+ {376,"tc"},
115+ {376,"vi"},
116+ {400,"az"},
117+ {401,"kz"},
118+ {402,"bt"},
119+ {404,"in"},
120+ {405,"in"},
121+ {410,"pk"},
122+ {412,"af"},
123+ {413,"lk"},
124+ {414,"mm"},
125+ {415,"lb"},
126+ {416,"jo"},
127+ {417,"sy"},
128+ {418,"iq"},
129+ {419,"kw"},
130+ {420,"sa"},
131+ {421,"ye"},
132+ {422,"om"},
133+ {424,"ae"},
134+ {425,"il"},
135+ {425,"ps"},
136+ {426,"bh"},
137+ {427,"qa"},
138+ {428,"mn"},
139+ {429,"np"},
140+ {430,"ae"},
141+ {431,"ae"},
142+ {432,"ir"},
143+ {434,"uz"},
144+ {436,"tk"},
145+ {437,"kg"},
146+ {438,"tm"},
147+ {440,"jp"},
148+ {441,"jp"},
149+ {450,"kr"},
150+ {452,"vn"},
151+ {454,"hk"},
152+ {455,"mo"},
153+ {456,"kh"},
154+ {457,"la"},
155+ {460,"cn"},
156+ {466,"tw"},
157+ {467,"kp"},
158+ {470,"bd"},
159+ {472,"mv"},
160+ {502,"my"},
161+ {505,"au"},
162+ {510,"id"},
163+ {514,"tp"},
164+ {515,"ph"},
165+ {520,"th"},
166+ {525,"sg"},
167+ {528,"bn"},
168+ {530,"nz"},
169+ {537,"pg"},
170+ {539,"to"},
171+ {540,"sb"},
172+ {541,"vu"},
173+ {542,"fj"},
174+ {544,"as"},
175+ {545,"ki"},
176+ {546,"nc"},
177+ {547,"pf"},
178+ {548,"ck"},
179+ {549,"ws"},
180+ {550,"fm"},
181+ {552,"pw"},
182+ {553,"tv"},
183+ {555,"nu"},
184+ {602,"eg"},
185+ {603,"dz"},
186+ {604,"ma"},
187+ {605,"tn"},
188+ {606,"ly"},
189+ {607,"gm"},
190+ {608,"sn"},
191+ {609,"mr"},
192+ {610,"ml"},
193+ {611,"gn"},
194+ {612,"ci"},
195+ {613,"bf"},
196+ {614,"ne"},
197+ {615,"tg"},
198+ {616,"bj"},
199+ {617,"mu"},
200+ {618,"lr"},
201+ {619,"sl"},
202+ {620,"gh"},
203+ {621,"ng"},
204+ {622,"td"},
205+ {623,"cf"},
206+ {624,"cm"},
207+ {625,"cv"},
208+ {626,"st"},
209+ {627,"gq"},
210+ {628,"ga"},
211+ {629,"cg"},
212+ {630,"cd"},
213+ {631,"ao"},
214+ {632,"gw"},
215+ {633,"sc"},
216+ {634,"sd"},
217+ {635,"rw"},
218+ {636,"et"},
219+ {637,"so"},
220+ {638,"dj"},
221+ {639,"ke"},
222+ {640,"tz"},
223+ {641,"ug"},
224+ {642,"bi"},
225+ {643,"mz"},
226+ {645,"zm"},
227+ {646,"mg"},
228+ {647,"re"},
229+ {648,"zw"},
230+ {649,"na"},
231+ {650,"mw"},
232+ {651,"ls"},
233+ {652,"bw"},
234+ {653,"sz"},
235+ {654,"km"},
236+ {655,"za"},
237+ {657,"er"},
238+ {659,"ss"},
239+ {702,"bz"},
240+ {704,"gt"},
241+ {706,"sv"},
242+ {708,"hn"},
243+ {710,"ni"},
244+ {712,"cr"},
245+ {714,"pa"},
246+ {716,"pe"},
247+ {722,"ar"},
248+ {724,"br"},
249+ {730,"cl"},
250+ {732,"co"},
251+ {734,"ve"},
252+ {736,"bo"},
253+ {738,"gy"},
254+ {740,"ec"},
255+ {744,"py"},
256+ {746,"sr"},
257+ {748,"uy"},
258+ {750,"fk"}}
259+ );
260+ }
261+
262+ QString mccToCountryCode(int mcc) const {
263+ return m_mccCodes.value(mcc, "us").toUpper();
264+ }
265+
266+private:
267+ // MCC = Mobile Country Code, see https://en.wikipedia.org/wiki/Mobile_country_code
268+ QHash<int,QString> m_mccCodes;
269+};
270+
271+Q_GLOBAL_STATIC(LocalePrivate, d)
272+
273+LocaleAttached::LocaleAttached(QObject* parent)
274+ : QObject(parent)
275+{
276+}
277+
278+QString LocaleAttached::mccToCountryCode(int mcc) const
279+{
280+ return d->mccToCountryCode(mcc);
281+}
282+
283+LocalePlugin::LocalePlugin(QObject* parent)
284+ : QObject(parent)
285+{
286+}
287+
288+LocaleAttached* LocalePlugin::qmlAttachedProperties(QObject* parent)
289+{
290+ return new LocaleAttached(parent);
291+}
plugins/Wizard/LocalePlugin.hnew file+58
@@ -0,0 +1,58 @@
1+/*
2+ * Copyright (C) 2015 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef LOCALE_PLUGIN_H
18+#define LOCALE_PLUGIN_H
19+
20+#include <QObject>
21+#include <QString>
22+#include <QJsonObject>
23+#include <QtQml>
24+
25+class LocaleAttached: public QObject
26+{
27+ Q_OBJECT
28+protected:
29+ explicit LocaleAttached(QObject *parent = 0);
30+
31+public:
32+ Q_INVOKABLE QString mccToCountryCode(int mcc) const;
33+
34+ friend class LocalePlugin;
35+};
36+
37+/**
38+ * A simplified wrapper around QLocale.
39+ *
40+ * The wrapper is implemented as an attached property, which makes it possible
41+ * to use it as if its methods were static:
42+ *
43+ * @code
44+ * var langs = LocalePlugin.languages();
45+ * @endcode
46+ */
47+class LocalePlugin: public QObject
48+{
49+ Q_OBJECT
50+public:
51+ explicit LocalePlugin(QObject *parent = 0);
52+
53+ static LocaleAttached* qmlAttachedProperties(QObject *parent);
54+};
55+
56+QML_DECLARE_TYPEINFO(LocalePlugin, QML_HAS_ATTACHED_PROPERTIES)
57+
58+#endif // LOCALE_PLUGIN_H
plugins/Wizard/PageList.cpp+4−4
@@ -40,20 +40,20 @@ PageList::PageList(QObject *parent)
4040 m_index(-1),
4141 m_pages()
4242{
43− QString qmlSuffix = QStringLiteral(".qml");
44− QString disabledSuffix = QStringLiteral(".disabled");
43+ const QString qmlSuffix = QStringLiteral(".qml");
44+ const QString disabledSuffix = QStringLiteral(".disabled");
4545 QSet<QString> disabledPages;
4646 QStringList dataDirs;
4747
4848 if (!isRunningInstalled() && getenv("WIZARD_TESTING") == nullptr) {
49− dataDirs = QStringList() << qmlDirectory();
49+ dataDirs << qmlDirectory();
5050 } else {
5151 dataDirs = shellDataDirs();
5252 }
5353
5454 Q_FOREACH(const QString &dataDir, dataDirs) {
5555 QDir dir(dataDir + "/Wizard/Pages");
56− QStringList entries = dir.entryList(QStringList(QStringLiteral("[0-9]*")), QDir::Files | QDir::Readable);
56+ const QStringList entries = dir.entryList(QStringList(QStringLiteral("[0-9]*")), QDir::Files | QDir::Readable);
5757 Q_FOREACH(const QString &entry, entries) {
5858 if (!m_pages.contains(entry) && entry.endsWith(qmlSuffix))
5959 m_pages.insert(entry, dir.absoluteFilePath(entry));
plugins/Wizard/Status.cppnew file+143
@@ -0,0 +1,143 @@
1+/*
2+ * Copyright (C) 2015 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include <QDebug>
18+#include <QDBusConnection>
19+
20+#include "Status.h"
21+
22+Status::Status()
23+{
24+ initNM();
25+ initUPower();
26+}
27+
28+void Status::initNM()
29+{
30+ m_nmIface = new QDBusInterface("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager", "org.freedesktop.NetworkManager",
31+ QDBusConnection::systemBus(), this);
32+
33+ QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager", "org.freedesktop.NetworkManager", "PropertiesChanged",
34+ this, SLOT(onNMPropertiesChanged(QVariantMap)));
35+}
36+
37+void Status::onNMPropertiesChanged(const QVariantMap &changedProps)
38+{
39+ if (changedProps.contains("State") || changedProps.contains("Connectivity")) {
40+ Q_EMIT onlineChanged();
41+ Q_EMIT networkIconChanged();
42+ }
43+
44+ if (changedProps.contains("PrimaryConnection") || changedProps.contains("SpecificObject") || changedProps.contains("Strength")) {
45+ Q_EMIT networkIconChanged();
46+ }
47+}
48+
49+bool Status::online() const
50+{
51+ if (!m_nmIface->isValid())
52+ return false;
53+
54+ return m_nmIface->property("State").toUInt() == 70;
55+}
56+
57+QString Status::networkIcon()
58+{
59+ QString iconName = QStringLiteral("nm-no-connection");
60+
61+ if (!online()) {
62+ return iconName;
63+ }
64+
65+ const QString primaryConn = m_nmIface->property("PrimaryConnection").value<QDBusObjectPath>().path();
66+ const QString primaryConnType = m_nmIface->property("PrimaryConnectionType").toString();
67+
68+ if (primaryConn.isEmpty()) {
69+ qWarning() << "Empty primary connection";
70+ return iconName;
71+ }
72+
73+ if (primaryConnType == "802-11-wireless") {
74+ QDBusInterface activeConn("org.freedesktop.NetworkManager", primaryConn, "org.freedesktop.NetworkManager.Connection.Active", QDBusConnection::systemBus());
75+
76+ if (activeConn.isValid()) {
77+ const QString apPath = activeConn.property("SpecificObject").value<QDBusObjectPath>().path();
78+
79+ if (apPath.isEmpty()) {
80+ qWarning() << "No AP path";
81+ return iconName;
82+ }
83+
84+ QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager", primaryConn, "org.freedesktop.NetworkManager.Connection.Active", "PropertiesChanged",
85+ this, SLOT(onNMPropertiesChanged(QVariantMap)));
86+
87+ QDBusInterface ap("org.freedesktop.NetworkManager", apPath, "org.freedesktop.NetworkManager.AccessPoint", QDBusConnection::systemBus());
88+
89+ if (!ap.isValid()) {
90+ qWarning() << "Invalid AP";
91+ return iconName;
92+ }
93+
94+ QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager", apPath, "org.freedesktop.NetworkManager.AccessPoint", "PropertiesChanged",
95+ this, SLOT(onNMPropertiesChanged(QVariantMap)));
96+
97+ const uint strength = ap.property("Strength").toUInt();
98+ const uint flags = ap.property("Flags").toUInt();
99+
100+ if (strength == 0) {
101+ iconName = "nm-signal-00";
102+ } else if (strength <= 25) {
103+ iconName = "nm-signal-25";
104+ } else if (strength <= 50) {
105+ iconName = "nm-signal-50";
106+ } else if (strength <= 75) {
107+ iconName = "nm-signal-75";
108+ } else if (strength <= 100) {
109+ iconName = "nm-signal-100";
110+ }
111+
112+ if (flags >= 1) {
113+ iconName += "-secure";
114+ }
115+ }
116+ }
117+
118+ return iconName;
119+}
120+
121+void Status::initUPower()
122+{
123+ m_upowerIface = new QDBusInterface("org.freedesktop.UPower", "/org/freedesktop/UPower/devices/DisplayDevice", "org.freedesktop.UPower.Device",
124+ QDBusConnection::systemBus(), this);
125+ QDBusConnection::systemBus().connect("org.freedesktop.UPower", "/org/freedesktop/UPower/devices/DisplayDevice", "org.freedesktop.DBus.Properties",
126+ "PropertiesChanged", this, SLOT(onUPowerPropertiesChanged(QString,QVariantMap,QStringList)));
127+}
128+
129+void Status::onUPowerPropertiesChanged(const QString &iface, const QVariantMap &changedProps, const QStringList &invalidatedProps)
130+{
131+ Q_UNUSED(iface)
132+ Q_UNUSED(invalidatedProps)
133+
134+ if (changedProps.contains("IconName")) {
135+ Q_EMIT batteryIconChanged();
136+ }
137+}
138+
139+QString Status::batteryIcon() const
140+{
141+ const QString iconName = m_upowerIface->property("IconName").toString();
142+ return iconName;
143+}
plugins/Wizard/Status.hnew file+60
@@ -0,0 +1,60 @@
1+/*
2+ * Copyright (C) 2015 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef WIZARD_STATUS_H
18+#define WIZARD_STATUS_H
19+
20+#include <QObject>
21+#include <QString>
22+#include <QDBusInterface>
23+
24+class Status: public QObject
25+{
26+ Q_OBJECT
27+ Q_PROPERTY(bool online READ online NOTIFY onlineChanged)
28+ Q_PROPERTY(QString networkIcon READ networkIcon NOTIFY networkIconChanged)
29+ Q_PROPERTY(QString batteryIcon READ batteryIcon NOTIFY batteryIconChanged)
30+public:
31+ Status();
32+ ~Status() = default;
33+
34+ bool online() const;
35+ QString networkIcon();
36+
37+ QString batteryIcon() const;
38+
39+Q_SIGNALS:
40+ void networkIconChanged();
41+ void onlineChanged();
42+ void batteryIconChanged();
43+
44+private Q_SLOTS:
45+ void onNMPropertiesChanged(const QVariantMap &changedProps);
46+ void onUPowerPropertiesChanged(const QString &iface, const QVariantMap &changedProps, const QStringList &invalidatedProps);
47+
48+private:
49+ Q_DISABLE_COPY(Status)
50+
51+ // network status
52+ void initNM();
53+ QDBusInterface * m_nmIface = nullptr;
54+
55+ // battery status
56+ void initUPower();
57+ QDBusInterface * m_upowerIface = nullptr;
58+};
59+
60+#endif
plugins/Wizard/System.cpp+5−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical Ltd.
2+ * Copyright (C) 2014-2015 Canonical Ltd.
33 *
44 * This program is free software: you can redistribute it and/or modify it
55 * under the terms of the GNU General Public License version 3, as published
@@ -25,10 +25,10 @@
2525#include <QLocale>
2626#include <QMap>
2727#include <QProcess>
28+#include <QDebug>
2829
2930System::System()
30− : QObject(),
31− m_fsWatcher()
31+ : QObject()
3232{
3333 // Register the argument needed for UpdateActivationEnvironment below
3434 qDBusRegisterMetaType<QMap<QString,QString>>();
@@ -88,7 +88,7 @@ void System::setSessionVariable(const QString &variable, const QString &value)
8888 QDBusConnection::sessionBus().asyncCall(msg);
8989}
9090
91−void System::updateSessionLanguage(const QString &locale)
91+void System::updateSessionLocale(const QString &locale)
9292{
9393 const QString language = locale.split(QStringLiteral("."))[0];
9494
@@ -106,5 +106,6 @@ void System::updateSessionLanguage(const QString &locale)
106106 initctl stop smart-scopes-proxy; \
107107 initctl emit --no-wait indicator-services-start; \
108108 initctl restart --no-wait maliit-server; \
109+ initctl restart --no-wait indicator-messages; \
109110 initctl restart --no-wait unity8-dash\""));
110111}
plugins/Wizard/System.h+3−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014 Canonical Ltd.
2+ * Copyright (C) 2014-2015 Canonical Ltd.
33 *
44 * This program is free software: you can redistribute it and/or modify it
55 * under the terms of the GNU General Public License version 3, as published
@@ -28,12 +28,13 @@ class System : public QObject
2828
2929public:
3030 System();
31+ ~System() = default;
3132
3233 bool wizardEnabled() const;
3334 void setWizardEnabled(bool enabled);
3435
3536public Q_SLOTS:
36− void updateSessionLanguage(const QString &locale);
37+ void updateSessionLocale(const QString &locale);
3738
3839Q_SIGNALS:
3940 void wizardEnabledChanged();
plugins/Wizard/plugin.cpp+7−8
@@ -17,19 +17,18 @@
1717#include "plugin.h"
1818#include "PageList.h"
1919#include "System.h"
20+#include "timezonemodel.h"
21+#include "LocalePlugin.h"
22+#include "Status.h"
2023
2124#include <QtQml/qqml.h>
2225
23−static QObject *system_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
24−{
25− Q_UNUSED(engine)
26− Q_UNUSED(scriptEngine)
27− return new System();
28−}
29−
3026void WizardPlugin::registerTypes(const char *uri)
3127{
3228 Q_ASSERT(uri == QLatin1String("Wizard"));
3329 qmlRegisterType<PageList>(uri, 0, 1, "PageList");
34− qmlRegisterSingletonType<System>(uri, 0, 1, "System", system_provider);
30+ qmlRegisterSingletonType<System>(uri, 0, 1, "System", [](QQmlEngine*, QJSEngine*) -> QObject* { return new System; });
31+ qmlRegisterSingletonType<Status>(uri, 0, 1, "Status", [](QQmlEngine*, QJSEngine*) -> QObject* { return new Status; });
32+ qmlRegisterType<TimeZoneLocationModel>(uri, 0, 1, "TimeZoneModel");
33+ qmlRegisterType<LocalePlugin>(uri, 0, 1, "LocalePlugin");
3534}
plugins/Wizard/plugin.h+1−2
@@ -17,13 +17,12 @@
1717#ifndef WIZARD_PLUGIN_H
1818#define WIZARD_PLUGIN_H
1919
20−#include <QtQml/QQmlEngine>
2120#include <QtQml/QQmlExtensionPlugin>
2221
2322class WizardPlugin : public QQmlExtensionPlugin
2423{
2524 Q_OBJECT
26− Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25+ Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
2726
2827public:
2928 void registerTypes(const char *uri) override;
plugins/Wizard/timezonemodel.cppnew file+244
@@ -0,0 +1,244 @@
1+/*
2+ * Copyright (C) 2016 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include <QDebug>
18+
19+#include <glib.h>
20+#include <glib-object.h>
21+
22+#include "LocalePlugin.h"
23+#include "timezonemodel.h"
24+
25+TimeZoneLocationModel::TimeZoneLocationModel(QObject *parent):
26+ QAbstractListModel(parent),
27+ m_listUpdating(false),
28+ m_cancellable(nullptr)
29+{
30+ m_roleNames[Qt::DisplayRole] = "displayName";
31+ m_roleNames[TimeZoneRole] = "timeZone";
32+ m_roleNames[CityRole] = "city";
33+ m_roleNames[CountryRole] = "country";
34+ m_roleNames[OffsetRole] = "offset";
35+ m_roleNames[LatitudeRole] = "latitude";
36+ m_roleNames[LongitudeRole] = "longitude";
37+}
38+
39+int TimeZoneLocationModel::rowCount(const QModelIndex &parent) const
40+{
41+ if (parent.isValid()) {
42+ return 0;
43+ } else if (m_filter.isEmpty()) {
44+ return m_countryLocations.count();
45+ } else {
46+ return m_locations.count();
47+ }
48+}
49+
50+QVariant TimeZoneLocationModel::data(const QModelIndex &index, int role) const
51+{
52+ GeonamesCity *city;
53+ if (m_filter.isEmpty()) {
54+ city = m_countryLocations.value(index.row());
55+ } else {
56+ city = m_locations.value(index.row());
57+ }
58+ if (!city)
59+ return QVariant();
60+
61+ switch (role) {
62+ case Qt::DisplayRole:
63+ return QStringLiteral("%1, %2, %3").arg(geonames_city_get_name(city))
64+ .arg(geonames_city_get_state(city))
65+ .arg(geonames_city_get_country(city));
66+ case SimpleRole:
67+ return QStringLiteral("%1, %2").arg(geonames_city_get_name(city))
68+ .arg(geonames_city_get_country(city));
69+ case TimeZoneRole:
70+ return geonames_city_get_timezone(city);
71+ case CountryRole:
72+ return geonames_city_get_country(city);
73+ case CityRole:
74+ return geonames_city_get_name(city);
75+ case OffsetRole: {
76+ QTimeZone tmp(geonames_city_get_timezone(city));
77+ return static_cast<double>(tmp.standardTimeOffset(QDateTime::currentDateTime())) / 3600;
78+ }
79+ case LatitudeRole:
80+ return geonames_city_get_latitude(city);
81+ case LongitudeRole:
82+ return geonames_city_get_longitude(city);
83+ default:
84+ qWarning() << Q_FUNC_INFO << "Unknown role";
85+ return QVariant();
86+ }
87+}
88+
89+QHash<int, QByteArray> TimeZoneLocationModel::roleNames() const
90+{
91+ return m_roleNames;
92+}
93+
94+void TimeZoneLocationModel::setModel(const QList<GeonamesCity *> &locations)
95+{
96+ beginResetModel();
97+
98+ Q_FOREACH(GeonamesCity *city, m_locations) {
99+ geonames_city_free(city);
100+ }
101+
102+ m_locations = locations;
103+ endResetModel();
104+}
105+
106+void TimeZoneLocationModel::filterFinished(GObject *source_object,
107+ GAsyncResult *res,
108+ gpointer user_data)
109+{
110+ Q_UNUSED(source_object);
111+
112+ g_autofree gint *cities = nullptr;
113+ guint cities_len = 0;
114+ g_autoptr(GError) error = nullptr;
115+
116+ cities = geonames_query_cities_finish(res, &cities_len, &error);
117+ if (error) {
118+ if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
119+ TimeZoneLocationModel *model = static_cast<TimeZoneLocationModel *>(user_data);
120+ g_clear_object(&model->m_cancellable);
121+ model->setListUpdating(false);
122+ qWarning() << "Could not filter timezones:" << error->message;
123+ }
124+ return;
125+ }
126+
127+ QList<GeonamesCity *> locations;
128+
129+ for (guint i = 0; i < cities_len; ++i) {
130+ GeonamesCity *city = geonames_get_city(cities[i]);
131+ if (city) {
132+ locations.append(city);
133+ }
134+ }
135+
136+ TimeZoneLocationModel *model = static_cast<TimeZoneLocationModel *>(user_data);
137+
138+ g_clear_object(&model->m_cancellable);
139+
140+ model->setModel(locations);
141+ model->setListUpdating(false);
142+}
143+
144+bool TimeZoneLocationModel::listUpdating() const
145+{
146+ return m_listUpdating;
147+}
148+
149+void TimeZoneLocationModel::setListUpdating(bool listUpdating)
150+{
151+ if (m_listUpdating != listUpdating) {
152+ m_listUpdating = listUpdating;
153+ Q_EMIT listUpdatingChanged();
154+ }
155+}
156+
157+QString TimeZoneLocationModel::filter() const
158+{
159+ return m_filter;
160+}
161+
162+void TimeZoneLocationModel::setFilter(const QString &filter)
163+{
164+ if (filter != m_filter) {
165+ m_filter = filter;
166+ Q_EMIT filterChanged();
167+ }
168+
169+ setListUpdating(true);
170+
171+ if (m_cancellable) {
172+ g_cancellable_cancel(m_cancellable);
173+ g_clear_object(&m_cancellable);
174+ }
175+
176+ setModel(QList<GeonamesCity *>());
177+
178+ if (filter.isEmpty()) {
179+ setListUpdating(false);
180+ return;
181+ }
182+
183+ m_cancellable = g_cancellable_new();
184+ geonames_query_cities(filter.toUtf8().data(),
185+ GEONAMES_QUERY_DEFAULT,
186+ m_cancellable,
187+ filterFinished,
188+ this);
189+}
190+
191+QString TimeZoneLocationModel::country() const
192+{
193+ return m_country;
194+}
195+
196+static bool citycmp(GeonamesCity *a, GeonamesCity *b)
197+{
198+ return geonames_city_get_population(b) < geonames_city_get_population(a);
199+}
200+
201+void TimeZoneLocationModel::setCountry(const QString &country)
202+{
203+ if (m_country == country)
204+ return;
205+
206+ beginResetModel();
207+
208+ m_country = country;
209+
210+ Q_FOREACH(GeonamesCity *city, m_countryLocations) {
211+ geonames_city_free(city);
212+ }
213+ m_countryLocations.clear();
214+
215+ gint num_cities = geonames_get_n_cities();
216+ for (gint i = 0; i < num_cities; i++) {
217+ GeonamesCity *city = geonames_get_city(i);
218+ if (city && m_country == geonames_city_get_country_code(city)) {
219+ m_countryLocations.append(city);
220+ }
221+ }
222+
223+ std::sort(m_countryLocations.begin(), m_countryLocations.end(), citycmp);
224+
225+ endResetModel();
226+
227+ Q_EMIT countryChanged(country);
228+}
229+
230+TimeZoneLocationModel::~TimeZoneLocationModel()
231+{
232+ if (m_cancellable) {
233+ g_cancellable_cancel(m_cancellable);
234+ g_clear_object(&m_cancellable);
235+ }
236+
237+ Q_FOREACH(GeonamesCity *city, m_countryLocations) {
238+ geonames_city_free(city);
239+ }
240+
241+ Q_FOREACH(GeonamesCity *city, m_locations) {
242+ geonames_city_free(city);
243+ }
244+}
plugins/Wizard/timezonemodel.hnew file+80
@@ -0,0 +1,80 @@
1+/*
2+ * Copyright (C) 2016 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef TIMEZONEMODEL_H
18+#define TIMEZONEMODEL_H
19+
20+#include <geonames.h>
21+#include <glib.h>
22+#include <QAbstractListModel>
23+
24+class TimeZoneLocationModel: public QAbstractListModel
25+{
26+ Q_OBJECT
27+ Q_PROPERTY(bool listUpdating READ listUpdating NOTIFY listUpdatingChanged)
28+ Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged)
29+ Q_PROPERTY(QString country READ country WRITE setCountry NOTIFY countryChanged)
30+ Q_ENUMS(Roles)
31+
32+public:
33+ explicit TimeZoneLocationModel(QObject *parent = nullptr);
34+ ~TimeZoneLocationModel();
35+
36+ enum Roles {
37+ TimeZoneRole = Qt::UserRole + 1,
38+ CityRole,
39+ CountryRole,
40+ SimpleRole,
41+ OffsetRole,
42+ LatitudeRole,
43+ LongitudeRole
44+ };
45+
46+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
47+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
48+ QHash<int, QByteArray> roleNames() const override;
49+
50+ bool listUpdating() const;
51+
52+ QString filter() const;
53+ void setFilter(const QString &filter);
54+
55+ QString country() const;
56+ void setCountry(const QString &country);
57+
58+Q_SIGNALS:
59+ void listUpdatingChanged();
60+ void filterChanged();
61+ void countryChanged(const QString &country);
62+
63+private:
64+ void setModel(const QList<GeonamesCity *> &locations);
65+ void setListUpdating(bool listUpdating);
66+ static void filterFinished(GObject *source_object,
67+ GAsyncResult *res,
68+ gpointer user_data);
69+
70+
71+ bool m_listUpdating;
72+ QString m_filter;
73+ QString m_country;
74+ GCancellable *m_cancellable;
75+ QHash<int, QByteArray> m_roleNames;
76+ QList<GeonamesCity *> m_locations;
77+ QList<GeonamesCity *> m_countryLocations;
78+};
79+
80+#endif
po/aa.ponew file+767
@@ -0,0 +1,767 @@
1+# Afar translation for unity8
2+# Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
11+"PO-Revision-Date: 2016-02-12 10:18+0000\n"
12+"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
13+"Language-Team: Afar <aa@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"Plural-Forms: nplurals=2; plural=n != 1;\n"
18+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
20+
21+#: plugins/IntegratedLightDM/Greeter.cpp:112
22+msgid "Password: "
23+msgstr "Cuumita "
24+
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
27+msgid "Pin shortcut"
28+msgstr ""
29+
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
31+msgid "Quit"
32+msgstr "Kat"
33+
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
35+msgid "Unpin shortcut"
36+msgstr ""
37+
38+#: qml/Components/DelayedLockscreen.qml:49
39+msgid "Device Locked"
40+msgstr ""
41+
42+#: qml/Components/DelayedLockscreen.qml:64
43+msgid "You have been locked out due to too many failed passphrase attempts."
44+msgstr ""
45+
46+#: qml/Components/DelayedLockscreen.qml:65
47+msgid "You have been locked out due to too many failed passcode attempts."
48+msgstr ""
49+
50+#: qml/Components/DelayedLockscreen.qml:74
51+#, qt-format
52+msgid "Please wait %1 minute and then try again…"
53+msgid_plural "Please wait %1 minutes and then try again…"
54+msgstr[0] "Maganak %1 minit qambaalaay, kaadu gabbat"
55+msgstr[1] "Maganak %1 minit qambaalaay, kaadu gabbat"
56+
57+#: qml/Components/Dialogs.qml:144
58+msgctxt "Title: Lock/Log out dialog"
59+msgid "Log out"
60+msgstr "Eweq"
61+
62+#: qml/Components/Dialogs.qml:145
63+msgid "Are you sure you want to log out?"
64+msgstr ""
65+
66+#: qml/Components/Dialogs.qml:147
67+msgctxt "Button: Lock the system"
68+msgid "Lock"
69+msgstr "Koflis"
70+
71+#: qml/Components/Dialogs.qml:154
72+msgctxt "Button: Log out from the system"
73+msgid "Log Out"
74+msgstr "Eweq"
75+
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
78+#: qml/Wizard/Pages/passcode-set.qml:32
79+msgid "Cancel"
80+msgstr "Bayis"
81+
82+#: qml/Components/Dialogs.qml:173
83+msgctxt "Title: Reboot dialog"
84+msgid "Reboot"
85+msgstr "Wadir-ugus"
86+
87+#: qml/Components/Dialogs.qml:174
88+msgid "Are you sure you want to reboot?"
89+msgstr "Wadir-ugussuh digga maay litoo?"
90+
91+#: qml/Components/Dialogs.qml:176
92+msgid "No"
93+msgstr "Maleey"
94+
95+#: qml/Components/Dialogs.qml:182
96+msgid "Yes"
97+msgstr "Yeey"
98+
99+#: qml/Components/Dialogs.qml:197
100+msgctxt "Title: Power off/Restart dialog"
101+msgid "Power"
102+msgstr "Cayla"
103+
104+#: qml/Components/Dialogs.qml:198
105+msgid ""
106+"Are you sure you would like\n"
107+"to power off?"
108+msgstr "Timmi haytuh digga maay litoo?"
109+
110+#: qml/Components/Dialogs.qml:200
111+msgctxt "Button: Power off the system"
112+msgid "Power off"
113+msgstr "Timmi hayis"
114+
115+#: qml/Components/Dialogs.qml:209
116+msgctxt "Button: Restart the system"
117+msgid "Restart"
118+msgstr "Wadir-qimbis"
119+
120+#: qml/Components/Lockscreen.qml:231
121+msgid "Return to Call"
122+msgstr "Seecol gacis"
123+
124+#: qml/Components/Lockscreen.qml:231
125+msgid "Emergency Call"
126+msgstr ""
127+
128+#: qml/Components/Lockscreen.qml:263
129+msgid "OK"
130+msgstr "Hayya"
131+
132+#: qml/Components/ModeSwitchWarningDialog.qml:32
133+msgid "Apps may have unsaved data:"
134+msgstr ""
135+
136+#: qml/Components/ModeSwitchWarningDialog.qml:57
137+msgctxt ""
138+"Re-dock means connect the device again to an external screen/mouse/keyboard"
139+msgid "Re-dock, save your work and close these apps to continue."
140+msgstr ""
141+
142+#: qml/Components/ModeSwitchWarningDialog.qml:63
143+msgid "Or force close now (unsaved data will be lost)."
144+msgstr ""
145+
146+#: qml/Components/ModeSwitchWarningDialog.qml:75
147+msgid "OK, I will reconnect"
148+msgstr ""
149+
150+#: qml/Components/ModeSwitchWarningDialog.qml:76
151+msgid "Reconnect now!"
152+msgstr ""
153+
154+#: qml/Components/ModeSwitchWarningDialog.qml:88
155+msgid "Close all"
156+msgstr "Inkih alif"
157+
158+#: qml/Dash/DashPageHeader.qml:337
159+msgctxt "Button: Open the Ubuntu Store"
160+msgid "Store"
161+msgstr ""
162+
163+#: qml/Dash/DashPageHeader.qml:344
164+msgctxt "Button: Start a search in the current dash scope"
165+msgid "Search"
166+msgstr "Goranto"
167+
168+#: qml/Dash/DashPageHeader.qml:354
169+msgctxt "Button: Show the current dash scope settings"
170+msgid "Settings"
171+msgstr "Massosu"
172+
173+#: qml/Dash/DashPageHeader.qml:361
174+msgid "Remove from Favorites"
175+msgstr ""
176+
177+#: qml/Dash/DashPageHeader.qml:361
178+msgid "Add to Favorites"
179+msgstr ""
180+
181+#: qml/Dash/FiltersPopover.qml:60
182+msgid "Refine your results"
183+msgstr ""
184+
185+#: qml/Dash/FiltersPopover.qml:69
186+msgid "Reset"
187+msgstr ""
188+
189+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190+msgid "Show less"
191+msgstr ""
192+
193+#: qml/Dash/GenericScopeView.qml:570
194+msgid "Show all"
195+msgstr ""
196+
197+#: qml/Dash/GenericScopeView.qml:627
198+msgctxt "Label: Hint for dash search line edit"
199+msgid "Search"
200+msgstr "Goranto"
201+
202+#: qml/Dash/PageHeaderExtraPanel.qml:55
203+msgid "Recent Searches"
204+msgstr ""
205+
206+#: qml/Dash/PageHeaderExtraPanel.qml:66
207+msgid "Clear All"
208+msgstr ""
209+
210+#: qml/Dash/Previews/PreviewActionCombo.qml:35
211+msgid "More..."
212+msgstr ""
213+
214+#: qml/Dash/Previews/PreviewActionCombo.qml:35
215+msgid "Less..."
216+msgstr ""
217+
218+#: qml/Dash/Previews/PreviewCommentInput.qml:68
219+#: qml/Dash/Previews/PreviewRatingInput.qml:174
220+msgid "Send"
221+msgstr "Rub"
222+
223+#: qml/Dash/Previews/PreviewRatingInput.qml:84
224+msgid "Rate this"
225+msgstr ""
226+
227+#: qml/Dash/Previews/PreviewRatingInput.qml:129
228+msgid "Add a review"
229+msgstr ""
230+
231+#: qml/Dash/Previews/PreviewSharing.qml:66
232+msgid "Preview Share Item"
233+msgstr ""
234+
235+#: qml/Dash/PullToRefreshScopeStyle.qml:55
236+msgid "Pull to refresh…"
237+msgstr ""
238+
239+#: qml/Dash/PullToRefreshScopeStyle.qml:60
240+msgid "Release to refresh…"
241+msgstr ""
242+
243+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
244+msgid "Enable location data"
245+msgstr ""
246+
247+#: qml/Dash/ScopesList.qml:67
248+msgid "Manage"
249+msgstr ""
250+
251+#: qml/Dash/ScopesList.qml:113
252+msgid "Home"
253+msgstr "Dabqi"
254+
255+#: qml/Dash/ScopesList.qml:114
256+msgid "Also installed"
257+msgstr ""
258+
259+#: qml/DisabledScreenNotice.qml:104
260+msgid ""
261+"Your device is now connected to an external display. Use this screen as a "
262+"touch pad to interact with the pointer."
263+msgstr ""
264+
265+#: qml/Greeter/CoverPage.qml:118
266+msgid "Unlock"
267+msgstr ""
268+
269+#: qml/Greeter/LoginList.qml:239
270+msgid "Retry"
271+msgstr "Qagis"
272+
273+#: qml/Greeter/LoginList.qml:240
274+msgid "Tap to unlock"
275+msgstr ""
276+
277+#: qml/Greeter/NarrowView.qml:54
278+msgid "Sorry, incorrect passphrase."
279+msgstr ""
280+
281+#: qml/Greeter/NarrowView.qml:55
282+msgid "Sorry, incorrect passcode."
283+msgstr ""
284+
285+#: qml/Greeter/NarrowView.qml:56
286+msgid "This will be your last attempt."
287+msgstr ""
288+
289+#: qml/Greeter/NarrowView.qml:58
290+msgid ""
291+"If passphrase is entered incorrectly, your phone will conduct a factory "
292+"reset and all personal data will be deleted."
293+msgstr ""
294+
295+#: qml/Greeter/NarrowView.qml:59
296+msgid ""
297+"If passcode is entered incorrectly, your phone will conduct a factory reset "
298+"and all personal data will be deleted."
299+msgstr ""
300+
301+#: qml/Greeter/NarrowView.qml:116
302+#, qt-format
303+msgid "Enter %1"
304+msgstr "%1 culus"
305+
306+#: qml/Greeter/NarrowView.qml:117
307+msgid "Enter passphrase"
308+msgstr "Tatur-maxco culus"
309+
310+#: qml/Greeter/NarrowView.qml:118
311+msgid "Enter passcode"
312+msgstr "Tatur-mudenta culus"
313+
314+#: qml/Greeter/NarrowView.qml:119
315+#, qt-format
316+msgid "Sorry, incorrect %1"
317+msgstr ""
318+
319+#: qml/Greeter/NarrowView.qml:120
320+msgid "Sorry, incorrect passphrase"
321+msgstr ""
322+
323+#: qml/Greeter/NarrowView.qml:121
324+msgctxt "passphrase"
325+msgid "Please re-enter"
326+msgstr ""
327+
328+#: qml/Greeter/NarrowView.qml:122
329+msgid "Sorry, incorrect passcode"
330+msgstr ""
331+
332+#: qml/Notifications/NotificationMenuItemFactory.qml:124
333+msgid "Show password"
334+msgstr "Cuumita uybulluy"
335+
336+#: qml/Panel/ActiveCallHint.qml:79
337+msgid "Tap to return to call..."
338+msgstr ""
339+
340+#: qml/Panel/ActiveCallHint.qml:92
341+msgid "Conference"
342+msgstr "Koboxu"
343+
344+#: qml/Panel/Indicators/MenuItemFactory.qml:762
345+msgid "Nothing is playing"
346+msgstr ""
347+
348+#: qml/Panel/Indicators/MenuItemFactory.qml:891
349+#, qt-format
350+msgid "%1 hour"
351+msgid_plural "%1 hours"
352+msgstr[0] "%1 saaqata"
353+msgstr[1] "%1 saaqata"
354+
355+#: qml/Panel/Indicators/MenuItemFactory.qml:895
356+#, qt-format
357+msgid "%1 minute"
358+msgid_plural "%1 minutes"
359+msgstr[0] "%1 miniti"
360+msgstr[1] "%1 miniti"
361+
362+#: qml/Panel/Indicators/MenuItemFactory.qml:900
363+#, qt-format
364+msgid "%1 second"
365+msgid_plural "%1 seconds"
366+msgstr[0] "%1 nammayye"
367+msgstr[1] "%1 nammayye"
368+
369+#: qml/Panel/Indicators/MenuItemFactory.qml:903
370+msgid "0 seconds"
371+msgstr "0 nammayye"
372+
373+#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
374+#: qml/Panel/Indicators/MenuItemFactory.qml:905
375+#, qt-format
376+msgid "%1 remaining"
377+msgstr "%1 raaqe"
378+
379+#: qml/Panel/Indicators/MenuItemFactory.qml:911
380+msgid "In queue…"
381+msgstr ""
382+
383+#: qml/Panel/Indicators/MenuItemFactory.qml:915
384+msgid "Downloading"
385+msgstr "Qulluumah"
386+
387+#: qml/Panel/Indicators/MenuItemFactory.qml:917
388+msgid "Paused, tap to resume"
389+msgstr ""
390+
391+#: qml/Panel/Indicators/MenuItemFactory.qml:919
392+msgid "Canceled"
393+msgstr "Bayteh"
394+
395+#: qml/Panel/Indicators/MenuItemFactory.qml:921
396+msgid "Finished"
397+msgstr "Duudumteh"
398+
399+#: qml/Panel/Indicators/MenuItemFactory.qml:923
400+msgid "Failed, tap to retry"
401+msgstr ""
402+
403+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
404+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
405+msgctxt "Button: Send a reply message"
406+msgid "Send"
407+msgstr "Rub"
408+
409+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
410+msgctxt "Label: Hint in message indicator line edit"
411+msgid "Reply"
412+msgstr ""
413+
414+#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
415+msgctxt "Button: Call back on phone"
416+msgid "Call back"
417+msgstr ""
418+
419+#: qml/Stages/SideStage.qml:76
420+msgid "Drag using 3 fingers any application from one window to the other"
421+msgstr ""
422+
423+#: qml/Tutorial/TutorialBottom.qml:78
424+msgid "Swipe up to add a contact"
425+msgstr ""
426+
427+#: qml/Tutorial/TutorialBottom.qml:80
428+msgid "Swipe up for favorite calculations"
429+msgstr ""
430+
431+#: qml/Tutorial/TutorialBottom.qml:82
432+msgid "Swipe up for recent calls"
433+msgstr ""
434+
435+#: qml/Tutorial/TutorialBottom.qml:84
436+msgid "Swipe up to create a message"
437+msgstr ""
438+
439+#: qml/Tutorial/TutorialBottom.qml:85
440+msgid "Swipe up to manage the app"
441+msgstr ""
442+
443+#: qml/Tutorial/TutorialLeftLong.qml:47
444+msgid "Long swipe from the left edge to open the Today scope"
445+msgstr ""
446+
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
449+msgstr ""
450+
451+#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456+msgid "Short or long swipe from the right edge to view your open apps"
457+msgstr ""
458+
459+#: qml/Tutorial/TutorialTop.qml:53
460+msgid "Swipe from the top right edge to open the notification bar"
461+msgstr ""
462+
463+#: qml/Tutorial/TutorialTop.qml:54
464+msgid "Swipe from the top edge to open the notification bar"
465+msgstr ""
466+
467+#: qml/Wizard/Page.qml:54
468+msgctxt "Button: Go back one page in the Wizard"
469+msgid "Back"
470+msgstr "Derre"
471+
472+#: qml/Wizard/Pages/10-welcome.qml:27
473+msgid "Language"
474+msgstr ""
475+
476+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
477+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
478+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
479+#: qml/Wizard/Pages/75-report-check.qml:84
480+#: qml/Wizard/Pages/passcode-desktop.qml:124
481+#: qml/Wizard/Pages/password-set.qml:141
482+msgid "Next"
483+msgstr ""
484+
485+#: qml/Wizard/Pages/30-wifi.qml:29
486+msgid "Connect to Wi‑Fi"
487+msgstr ""
488+
489+#: qml/Wizard/Pages/30-wifi.qml:130
490+msgid "Connected"
491+msgstr ""
492+
493+#: qml/Wizard/Pages/30-wifi.qml:163
494+msgid "Available Wi-Fi networks"
495+msgstr ""
496+
497+#: qml/Wizard/Pages/30-wifi.qml:164
498+msgid "No available Wi-Fi networks"
499+msgstr ""
500+
501+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
502+#: qml/Wizard/Pages/sim.qml:101
503+msgid "Skip"
504+msgstr "Kaqit"
505+
506+#: qml/Wizard/Pages/40-location.qml:27
507+msgid "Location Services"
508+msgstr ""
509+
510+#: qml/Wizard/Pages/40-location.qml:83
511+msgid ""
512+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
513+"(recommended)"
514+msgstr ""
515+
516+#: qml/Wizard/Pages/40-location.qml:105
517+#, qt-format
518+msgid "By selecting this option you agree to the Nokia HERE %1."
519+msgstr ""
520+
521+#: qml/Wizard/Pages/40-location.qml:106
522+msgctxt "part of: Nokia HERE terms and conditions"
523+msgid "terms and conditions"
524+msgstr ""
525+
526+#: qml/Wizard/Pages/40-location.qml:160
527+msgid "GPS only"
528+msgstr ""
529+
530+#: qml/Wizard/Pages/40-location.qml:214
531+msgid "Don't use my location"
532+msgstr ""
533+
534+#: qml/Wizard/Pages/40-location.qml:260
535+msgid "You can change it later in System Settings."
536+msgstr ""
537+
538+#: qml/Wizard/Pages/50-timezone.qml:29
539+msgid "Time Zone"
540+msgstr ""
541+
542+#: qml/Wizard/Pages/50-timezone.qml:178
543+msgid "Enter your city"
544+msgstr ""
545+
546+#: qml/Wizard/Pages/60-account.qml:24
547+msgid "Personalize Your Device"
548+msgstr ""
549+
550+#: qml/Wizard/Pages/60-account.qml:48
551+msgid "Preferred Name"
552+msgstr ""
553+
554+#: qml/Wizard/Pages/70-passwd-type.qml:39
555+msgid "Lock Screen"
556+msgstr ""
557+
558+#: qml/Wizard/Pages/70-passwd-type.qml:101
559+msgctxt "Label: Type of security method"
560+msgid "Create new password"
561+msgstr ""
562+
563+#: qml/Wizard/Pages/70-passwd-type.qml:103
564+msgctxt "Label: Type of security method"
565+msgid "Create passcode (numbers only)"
566+msgstr ""
567+
568+#: qml/Wizard/Pages/70-passwd-type.qml:105
569+msgctxt "Label: Type of security method"
570+msgid "No lock code"
571+msgstr ""
572+
573+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
574+msgid "Privacy Policy"
575+msgstr ""
576+
577+#: qml/Wizard/Pages/75-report-check.qml:26
578+msgid "Help Us Improve"
579+msgstr ""
580+
581+#: qml/Wizard/Pages/75-report-check.qml:59
582+msgid "Improve system performance by sending us crashes and error reports."
583+msgstr ""
584+
585+#: qml/Wizard/Pages/75-report-check.qml:60
586+msgid "Privacy policy"
587+msgstr ""
588+
589+#: qml/Wizard/Pages/80-finished.qml:89
590+msgid "Welcome to Ubuntu"
591+msgstr ""
592+
593+#: qml/Wizard/Pages/80-finished.qml:104
594+msgid "You are ready to use your device now"
595+msgstr ""
596+
597+#: qml/Wizard/Pages/80-finished.qml:124
598+msgid "Get Started"
599+msgstr ""
600+
601+#: qml/Wizard/Pages/here-terms.qml:25
602+msgid "Terms & Conditions"
603+msgstr ""
604+
605+#: qml/Wizard/Pages/here-terms.qml:69
606+msgid "Your device uses positioning technologies provided by HERE."
607+msgstr ""
608+
609+#: qml/Wizard/Pages/here-terms.qml:81
610+msgid ""
611+"To provide you with positioning services and to improve their quality, HERE "
612+"collects information about nearby cell towers and Wi-Fi hotspots around your "
613+"current location whenever your position is being found."
614+msgstr ""
615+
616+#: qml/Wizard/Pages/here-terms.qml:93
617+msgid ""
618+"The information collected is used to analyze the service and to improve the "
619+"use of service, but not to identify you personally."
620+msgstr ""
621+
622+#: qml/Wizard/Pages/here-terms.qml:106
623+#, qt-format
624+msgid "By continuing, you agree to the HERE platform %1 and %2."
625+msgstr ""
626+
627+#: qml/Wizard/Pages/here-terms.qml:107
628+msgid "Service Terms"
629+msgstr ""
630+
631+#: qml/Wizard/Pages/passcode-confirm.qml:43
632+#: qml/Wizard/Pages/passcode-desktop.qml:80
633+msgid "Confirm passcode"
634+msgstr ""
635+
636+#: qml/Wizard/Pages/passcode-confirm.qml:45
637+msgid "Incorrect passcode."
638+msgstr ""
639+
640+#: qml/Wizard/Pages/passcode-confirm.qml:45
641+msgctxt "Enter the passcode again"
642+msgid "Please re-enter."
643+msgstr ""
644+
645+#: qml/Wizard/Pages/passcode-desktop.qml:30
646+msgid "Lock Screen Passcode"
647+msgstr ""
648+
649+#: qml/Wizard/Pages/passcode-desktop.qml:56
650+msgid "Enter 4 numbers to setup your passcode"
651+msgstr ""
652+
653+#: qml/Wizard/Pages/passcode-desktop.qml:65
654+#: qml/Wizard/Pages/passcode-set.qml:54
655+msgid "Choose passcode"
656+msgstr ""
657+
658+#: qml/Wizard/Pages/passcode-desktop.qml:105
659+msgid "Passcode too short"
660+msgstr ""
661+
662+#: qml/Wizard/Pages/passcode-desktop.qml:107
663+msgid "Passcodes match"
664+msgstr ""
665+
666+#: qml/Wizard/Pages/passcode-desktop.qml:109
667+msgid "Passcodes do not match"
668+msgstr ""
669+
670+#: qml/Wizard/Pages/passcode-set.qml:62
671+msgid "Passcode must be 4 characters long"
672+msgstr ""
673+
674+#: qml/Wizard/Pages/password-set.qml:30
675+msgid "Lock Screen Password"
676+msgstr ""
677+
678+#: qml/Wizard/Pages/password-set.qml:61
679+msgid "Enter at least 8 characters"
680+msgstr ""
681+
682+#: qml/Wizard/Pages/password-set.qml:73
683+msgid "Choose password"
684+msgstr ""
685+
686+#: qml/Wizard/Pages/password-set.qml:103
687+msgid "Confirm password"
688+msgstr ""
689+
690+#: qml/Wizard/Pages/sim.qml:27
691+msgid "No SIM card installed"
692+msgstr ""
693+
694+#: qml/Wizard/Pages/sim.qml:54
695+msgid "SIM card added"
696+msgstr ""
697+
698+#: qml/Wizard/Pages/sim.qml:55
699+msgid "You must restart the device to access the mobile network."
700+msgstr ""
701+
702+#: qml/Wizard/Pages/sim.qml:59
703+msgid "Restart"
704+msgstr ""
705+
706+#: qml/Wizard/Pages/sim.qml:78
707+msgid "You won’t be able to make calls or use text messaging without a SIM."
708+msgstr ""
709+
710+#: qml/Wizard/Pages/sim.qml:90
711+msgid "To proceed with no SIM tap Skip."
712+msgstr ""
713+
714+#: qml/Wizard/PasswordMeter.qml:87
715+msgid "Passwords match"
716+msgstr ""
717+
718+#: qml/Wizard/PasswordMeter.qml:89
719+msgid "Passwords do not match"
720+msgstr ""
721+
722+#: qml/Wizard/PasswordMeter.qml:93
723+msgid "Strong password"
724+msgstr ""
725+
726+#: qml/Wizard/PasswordMeter.qml:95
727+msgid "Fair password"
728+msgstr ""
729+
730+#: qml/Wizard/PasswordMeter.qml:97
731+msgid "Weak password"
732+msgstr ""
733+
734+#: qml/Wizard/PasswordMeter.qml:99
735+msgid "Very weak password"
736+msgstr ""
737+
738+#~ msgctxt "Title: Reboot/Shut down dialog"
739+#~ msgid "Shut down"
740+#~ msgstr "Bargus"
741+
742+#~ msgid "Are you sure you want to shut down?"
743+#~ msgstr "Bargussuh digga maay litoo?"
744+
745+#~ msgctxt "Button: Shut down the system"
746+#~ msgid "Shut down"
747+#~ msgstr "Bargus"
748+
749+#~ msgctxt "Button: Reboot the system"
750+#~ msgid "Reboot"
751+#~ msgstr "Wadir-ugus"
752+
753+#~ msgctxt "Label: Type of security method"
754+#~ msgid "Swipe"
755+#~ msgstr "Uysuttuc"
756+
757+#~ msgid "Hi!"
758+#~ msgstr "Nagaale!"
759+
760+#~ msgid "Welcome to your Ubuntu phone."
761+#~ msgstr "Ubuntu Telefoonul arcib"
762+
763+#~ msgid "Let’s get started."
764+#~ msgstr "Hayya qimbisnay."
765+
766+#~ msgid "Continue"
767+#~ msgstr "Tatur"
po/am.po+530−266
@@ -7,31 +7,31 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
11−"PO-Revision-Date: 2015-11-19 19:27+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
11+"PO-Revision-Date: 2016-03-24 19:07+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2015-12-12 05:44+0000\n"
19−"X-Generator: Launchpad (build 17865)\n"
18+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
2323msgstr "የ መግቢያ ቃል: "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:47
26−#: plugins/Unity/Launcher/launcheritem.cpp:106
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
2727msgid "Pin shortcut"
2828msgstr "አቋራጭ ማጣበቂያ"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:52
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
3232msgstr "ማጥፊያ"
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:106
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
3636msgstr "አቋራጭ መለያያ"
3737
@@ -73,53 +73,35 @@ msgctxt "Button: Log out from the system"
7373msgid "Log Out"
7474msgstr "መውጫ"
7575
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
77−#: qml/Components/Dialogs.qml:253
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
78+#: qml/Wizard/Pages/passcode-set.qml:32
7879msgid "Cancel"
7980msgstr "መሰረዣ"
8081
8182#: qml/Components/Dialogs.qml:173
82−msgctxt "Title: Reboot/Shut down dialog"
83−msgid "Shut down"
84−msgstr "ማጥፊያ"
85−
86−#: qml/Components/Dialogs.qml:174
87−msgid "Are you sure you want to shut down?"
88−msgstr "በእርግጥ ማጥፋት ይፈልጋሉ?"
89−
90−#: qml/Components/Dialogs.qml:176
91−msgctxt "Button: Reboot the system"
92−msgid "Reboot"
93−msgstr "እንደገና ማስነሻ"
94−
95−#: qml/Components/Dialogs.qml:185
96−msgctxt "Button: Shut down the system"
97−msgid "Shut down"
98−msgstr "ማጥፊያ"
99−
100−#: qml/Components/Dialogs.qml:207
10183msgctxt "Title: Reboot dialog"
10284msgid "Reboot"
10385msgstr "እንደገና ማስነሻ"
10486
105−#: qml/Components/Dialogs.qml:208
87+#: qml/Components/Dialogs.qml:174
10688msgid "Are you sure you want to reboot?"
10789msgstr "በእርግጥ እንደገና ማስነሳት ይፈልጋሉ?"
10890
109−#: qml/Components/Dialogs.qml:210
91+#: qml/Components/Dialogs.qml:176
11092msgid "No"
11193msgstr "አይ"
11294
113−#: qml/Components/Dialogs.qml:217
95+#: qml/Components/Dialogs.qml:182
11496msgid "Yes"
11597msgstr "አዎ"
11698
117−#: qml/Components/Dialogs.qml:232
99+#: qml/Components/Dialogs.qml:197
118100msgctxt "Title: Power off/Restart dialog"
119101msgid "Power"
120102msgstr "ሐይል"
121103
122−#: qml/Components/Dialogs.qml:233
104+#: qml/Components/Dialogs.qml:198
123105msgid ""
124106"Are you sure you would like\n"
125107"to power off?"
@@ -127,25 +109,25 @@ msgstr ""
127109"በእርግጥ ሐይሉን ማጥፋት\n"
128110"ይፈልጋሉ?"
129111
130−#: qml/Components/Dialogs.qml:235
112+#: qml/Components/Dialogs.qml:200
131113msgctxt "Button: Power off the system"
132114msgid "Power off"
133115msgstr "ሐይል ማጥፊያ"
134116
135−#: qml/Components/Dialogs.qml:244
117+#: qml/Components/Dialogs.qml:209
136118msgctxt "Button: Restart the system"
137119msgid "Restart"
138120msgstr "እንደገና ማስጀመሪያ"
139121
140−#: qml/Components/Lockscreen.qml:245
122+#: qml/Components/Lockscreen.qml:231
141123msgid "Return to Call"
142124msgstr "ወደ ጥሪ መመለሻ"
143125
144−#: qml/Components/Lockscreen.qml:245
126+#: qml/Components/Lockscreen.qml:231
145127msgid "Emergency Call"
146128msgstr "የ ድንገተኛ ጥሪ"
147129
148−#: qml/Components/Lockscreen.qml:277
130+#: qml/Components/Lockscreen.qml:263
149131msgid "OK"
150132msgstr "እሺ"
151133
@@ -154,6 +136,8 @@ msgid "Apps may have unsaved data:"
154136msgstr "መተግበሪያው ያልተቀመጠ ዳታ ይዟል:"
155137
156138#: qml/Components/ModeSwitchWarningDialog.qml:57
139+msgctxt ""
140+"Re-dock means connect the device again to an external screen/mouse/keyboard"
157141msgid "Re-dock, save your work and close these apps to continue."
158142msgstr "እንደገና-ማሳረፊያ: ስራዎትን ያስቀምጡ እና ይዝጉ መተግበሪያው እንዲቀጥል"
159143
@@ -173,42 +157,58 @@ msgstr "አሁን እንደገና መገናኛ!"
173157msgid "Close all"
174158msgstr "ሁሉንም መዝጊያ"
175159
176−#: qml/Dash/DashPageHeader.qml:265
160+#: qml/Dash/DashPageHeader.qml:337
177161msgctxt "Button: Open the Ubuntu Store"
178162msgid "Store"
179163msgstr "ማስቀመጫ"
180164
181−#: qml/Dash/DashPageHeader.qml:272
165+#: qml/Dash/DashPageHeader.qml:344
182166msgctxt "Button: Start a search in the current dash scope"
183167msgid "Search"
184168msgstr "መፈለጊያ"
185169
186−#: qml/Dash/DashPageHeader.qml:282
170+#: qml/Dash/DashPageHeader.qml:354
187171msgctxt "Button: Show the current dash scope settings"
188172msgid "Settings"
189173msgstr "ማሰናጃዎች"
190174
191−#: qml/Dash/DashPageHeader.qml:289
175+#: qml/Dash/DashPageHeader.qml:361
192176msgid "Remove from Favorites"
193177msgstr "ከምወዳቸው ማስወገጃ"
194178
195−#: qml/Dash/DashPageHeader.qml:289
179+#: qml/Dash/DashPageHeader.qml:361
196180msgid "Add to Favorites"
197181msgstr "ወደምወዳቸው መጨመሪያ"
198182
199−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
200−msgid "See less"
201−msgstr "አነስተኛ መመልከቻ"
183+#: qml/Dash/FiltersPopover.qml:60
184+msgid "Refine your results"
185+msgstr "የ እርስዎን ውጤቶች እንደገና ማጣሪያ"
202186
203−#: qml/Dash/GenericScopeView.qml:576
204−msgid "See all"
205−msgstr "ሁሉንም መመልከቻ"
187+#: qml/Dash/FiltersPopover.qml:69
188+msgid "Reset"
189+msgstr "እንደ ነበረ መመለሻ"
206190
207−#: qml/Dash/GenericScopeView.qml:638
191+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192+msgid "Show less"
193+msgstr ""
194+
195+#: qml/Dash/GenericScopeView.qml:570
196+msgid "Show all"
197+msgstr ""
198+
199+#: qml/Dash/GenericScopeView.qml:627
208200msgctxt "Label: Hint for dash search line edit"
209201msgid "Search"
210202msgstr "መፈለጊያ"
211203
204+#: qml/Dash/PageHeaderExtraPanel.qml:55
205+msgid "Recent Searches"
206+msgstr "የ ቅርብ ጊዜ ፍለጋዎች"
207+
208+#: qml/Dash/PageHeaderExtraPanel.qml:66
209+msgid "Clear All"
210+msgstr "ሁሉንም ማጽጃ"
211+
212212#: qml/Dash/Previews/PreviewActionCombo.qml:35
213213msgid "More..."
214214msgstr "ተጨማሪ..."
@@ -230,7 +230,7 @@ msgstr "ለዚህ ደረጃ ይስጡ"
230230msgid "Add a review"
231231msgstr "ግምገማ መጨመሪያ"
232232
233−#: qml/Dash/Previews/PreviewSharing.qml:51
233+#: qml/Dash/Previews/PreviewSharing.qml:66
234234msgid "Preview Share Item"
235235msgstr "የሚካፈሉትን እቃ ቅድመ እይታ"
236236
@@ -258,27 +258,29 @@ msgstr "ቤት"
258258msgid "Also installed"
259259msgstr "እንዲሁም የተገጠሙ"
260260
261−#: qml/DisabledScreenNotice.qml:42
262−msgid "Your device is now connected to an external display."
263−msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገናኝቷል"
261+#: qml/DisabledScreenNotice.qml:104
262+msgid ""
263+"Your device is now connected to an external display. Use this screen as a "
264+"touch pad to interact with the pointer."
265+msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገናኝቷል: ይህን መመልከቻ እንደ ተችፓድ መጠቀሚያ"
264266
265−#: qml/Greeter/CoverPage.qml:107
267+#: qml/Greeter/CoverPage.qml:118
266268msgid "Unlock"
267269msgstr "መክፈቻ"
268270
269−#: qml/Greeter/LoginList.qml:236
271+#: qml/Greeter/LoginList.qml:239
270272msgid "Retry"
271273msgstr "እንደገና ይሞክሩ"
272274
273−#: qml/Greeter/LoginList.qml:237
275+#: qml/Greeter/LoginList.qml:240
274276msgid "Tap to unlock"
275277msgstr "ለመክፈት መታ ያድርጉ"
276278
277−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
279+#: qml/Greeter/NarrowView.qml:54
278280msgid "Sorry, incorrect passphrase."
279281msgstr "አዝናለሁ የተሳሳተ የማለፊያ ሐረግ"
280282
281−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
283+#: qml/Greeter/NarrowView.qml:55
282284msgid "Sorry, incorrect passcode."
283285msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
284286
@@ -307,7 +309,7 @@ msgstr ""
307309msgid "Enter %1"
308310msgstr "ማስገቢያ %1"
309311
310−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
312+#: qml/Greeter/NarrowView.qml:117
311313msgid "Enter passphrase"
312314msgstr "የ ማለፊያ ሀረግ ያስገቡ"
313315
@@ -333,7 +335,7 @@ msgstr "እባክዎን እንደገና-ያስገቡ"
333335msgid "Sorry, incorrect passcode"
334336msgstr "አዝናለሁ የተሳሳተ የማለፊያ ኮድ"
335337
336−#: qml/Notifications/NotificationMenuItemFactory.qml:129
338+#: qml/Notifications/NotificationMenuItemFactory.qml:124
337339msgid "Show password"
338340msgstr "የመግቢያ ቃል ማሳያ"
339341
@@ -345,62 +347,62 @@ msgstr "ወደ ጥሪው ለመመለስ መታ ያድርጉ..."
345347msgid "Conference"
346348msgstr "ስብሰባ"
347349
348−#: qml/Panel/Indicators/MenuItemFactory.qml:731
350+#: qml/Panel/Indicators/MenuItemFactory.qml:762
349351msgid "Nothing is playing"
350352msgstr "ምንም አይጫወትም"
351353
352−#: qml/Panel/Indicators/MenuItemFactory.qml:860
354+#: qml/Panel/Indicators/MenuItemFactory.qml:891
353355#, qt-format
354356msgid "%1 hour"
355357msgid_plural "%1 hours"
356358msgstr[0] "%1 ሰአት"
357359msgstr[1] "%1 ሰአቶች"
358360
359−#: qml/Panel/Indicators/MenuItemFactory.qml:864
361+#: qml/Panel/Indicators/MenuItemFactory.qml:895
360362#, qt-format
361363msgid "%1 minute"
362364msgid_plural "%1 minutes"
363365msgstr[0] "%1 ደቂቃ"
364366msgstr[1] "%1 ደቂቃዎች"
365367
366−#: qml/Panel/Indicators/MenuItemFactory.qml:869
368+#: qml/Panel/Indicators/MenuItemFactory.qml:900
367369#, qt-format
368370msgid "%1 second"
369371msgid_plural "%1 seconds"
370372msgstr[0] "%1 ሰከንድ"
371373msgstr[1] "%1 ሰከንዶች"
372374
373−#: qml/Panel/Indicators/MenuItemFactory.qml:872
375+#: qml/Panel/Indicators/MenuItemFactory.qml:903
374376msgid "0 seconds"
375377msgstr "0 ሰከንዶች"
376378
377379#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
378−#: qml/Panel/Indicators/MenuItemFactory.qml:874
380+#: qml/Panel/Indicators/MenuItemFactory.qml:905
379381#, qt-format
380382msgid "%1 remaining"
381383msgstr "%1 የቀረው"
382384
383−#: qml/Panel/Indicators/MenuItemFactory.qml:880
385+#: qml/Panel/Indicators/MenuItemFactory.qml:911
384386msgid "In queue…"
385387msgstr "ወረፋ በመጠበቅ ላይ…"
386388
387−#: qml/Panel/Indicators/MenuItemFactory.qml:884
389+#: qml/Panel/Indicators/MenuItemFactory.qml:915
388390msgid "Downloading"
389391msgstr "በማውረድ ላይ"
390392
391−#: qml/Panel/Indicators/MenuItemFactory.qml:886
393+#: qml/Panel/Indicators/MenuItemFactory.qml:917
392394msgid "Paused, tap to resume"
393395msgstr "ማስቆሚያ: ለመቀጠል መታ ያድርጉ"
394396
395−#: qml/Panel/Indicators/MenuItemFactory.qml:888
397+#: qml/Panel/Indicators/MenuItemFactory.qml:919
396398msgid "Canceled"
397399msgstr "ተሰርዟል"
398400
399−#: qml/Panel/Indicators/MenuItemFactory.qml:890
401+#: qml/Panel/Indicators/MenuItemFactory.qml:921
400402msgid "Finished"
401403msgstr "ጨርሷል"
402404
403−#: qml/Panel/Indicators/MenuItemFactory.qml:892
405+#: qml/Panel/Indicators/MenuItemFactory.qml:923
404406msgid "Failed, tap to retry"
405407msgstr "አልተቻለም: እንደገና ለመሞከር መታ ያድርጉ"
406408
@@ -420,255 +422,326 @@ msgctxt "Button: Call back on phone"
420422msgid "Call back"
421423msgstr "መልሶ መደወያ"
422424
423−#: qml/Panel/Indicators/ModemInfoItem.qml:105
424−msgid "Unlock SIM"
425−msgstr "ሲም መክፈቻ"
425+#: qml/Stages/SideStage.qml:76
426+msgid "Drag using 3 fingers any application from one window to the other"
427+msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
426428
427−#: qml/Panel/Indicators/RoamingIndication.qml:27
428−msgid "Roaming"
429−msgstr "ማዘዋወሪያ"
429+#: qml/Tutorial/TutorialBottom.qml:78
430+msgid "Swipe up to add a contact"
431+msgstr "ወደ ላይ ይጥረጉ ግንኙነት ለ መጨመር"
430432
431−#: qml/Tutorial/TutorialBottom.qml:28
432−msgid "Open special menus"
433−msgstr "የተለዩ ዝርዝሮች መክፈቻ"
433+#: qml/Tutorial/TutorialBottom.qml:80
434+msgid "Swipe up for favorite calculations"
435+msgstr "ወደ ላይ ይጥረጉ የሚወዱትን ለማስላት"
434436
435−#: qml/Tutorial/TutorialBottom.qml:29
436−msgid "Swipe up from the bottom edge."
437−msgstr "ከ ታች ጠርዝ በኩል ወደ ላይ ይጥረጉ"
437+#: qml/Tutorial/TutorialBottom.qml:82
438+msgid "Swipe up for recent calls"
439+msgstr "ወደ ላይ ይጥረጉ ለ ቅርብ ጊዜ ጥሪዎች"
438440
439−#: qml/Tutorial/TutorialBottomFinish.qml:24
440−msgid "This action does different things for different apps"
441−msgstr "ይህ ተግባር ለተለያዩ መተግበሪያዎች የተለያየ ነገር ይሰራል"
441+#: qml/Tutorial/TutorialBottom.qml:84
442+msgid "Swipe up to create a message"
443+msgstr "ወደ ላይ ይጥረጉ መልእክት ለ መፍጠር"
442444
443−#: qml/Tutorial/TutorialBottomFinish.qml:25
444−msgid "Tap here to finish."
445−msgstr "እዚህ መታ ይድርጉ ለመጨረስ"
445+#: qml/Tutorial/TutorialBottom.qml:85
446+msgid "Swipe up to manage the app"
447+msgstr "ወደ ላይ ይጥረጉ መተግበሪያ ለማስተዳደር"
446448
447−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
448−#: qml/Tutorial/TutorialRight.qml:144
449−msgid "Tap here to continue."
450−msgstr "እዚህ መታ ይድርጉ ለመቀጠል"
449+#: qml/Tutorial/TutorialLeftLong.qml:47
450+msgid "Long swipe from the left edge to open the Today scope"
451+msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
451452
452−#: qml/Tutorial/TutorialLeft.qml:26
453−msgid "Open the launcher"
454−msgstr "ማስጀመሪያውን መክፈቻ"
453+#: qml/Tutorial/TutorialLeft.qml:47
454+msgid "Swipe from the left edge to open the launcher"
455+msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
455456
456−#: qml/Tutorial/TutorialLeft.qml:27
457−msgid "Short swipe from the left edge."
458−msgstr "ከ ግራ ጠርዝ በኩል በትንሹ ይጥረጉ"
459−
460−#: qml/Tutorial/TutorialLeftFinish.qml:24
461−msgid "These are the shortcuts to favorite apps"
462−msgstr "እነዚህ አቋራጮች ናቸው እርስዎ ለሚወዷቸው መተግበሪያዎች"
463−
464−#: qml/Tutorial/TutorialPage.qml:178
465−msgid "You almost got it!"
466−msgstr "እርስዎ አሁን እያገኙት ነው!"
467−
468−#: qml/Tutorial/TutorialPage.qml:195
469−msgid "Try again."
470−msgstr "እንደገና ይሞክሩ"
457+#: qml/Tutorial/TutorialRight.qml:55
458+msgid "Push your mouse against the right edge to view your open apps"
459+msgstr ""
471460
472−#: qml/Tutorial/TutorialRight.qml:31
473−msgid "To view open apps"
474−msgstr "ለመመልከት መተግበሪያዎች ይክፈቱ"
461+#: qml/Tutorial/TutorialRight.qml:56
462+msgid "Short or long swipe from the right edge to view your open apps"
463+msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
475464
476−#: qml/Tutorial/TutorialRight.qml:32
477−msgid "Long swipe from the right edge."
478−msgstr "ከ ቀኝ ጠርዝ በኩል በረጅሙ ይጥረጉ"
465+#: qml/Tutorial/TutorialTop.qml:53
466+msgid "Swipe from the top right edge to open the notification bar"
467+msgstr "ከ ላይ ቀኝ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
479468
480−#: qml/Tutorial/TutorialRight.qml:122
481−msgid "View all your running tasks."
482−msgstr "እርስዎ የሚያስኬዱትን ተግባሮች በሙሉ መመልከቻ"
469+#: qml/Tutorial/TutorialTop.qml:54
470+msgid "Swipe from the top edge to open the notification bar"
471+msgstr "ከ ላይ ጠርዝ በኩል ይጥረጉ የ ማስታወቂያ መደርደሪያ ለ መክፈት"
483472
484−#: qml/Wizard/Page.qml:89
473+#: qml/Wizard/Page.qml:54
485474msgctxt "Button: Go back one page in the Wizard"
486475msgid "Back"
487476msgstr "ወደ ኋላ"
488477
489478#: qml/Wizard/Pages/10-welcome.qml:27
490−msgid "Hi!"
491−msgstr "ሰላም"
492−
493−#: qml/Wizard/Pages/10-welcome.qml:44
494−msgid "Welcome to your Ubuntu phone."
495−msgstr "እንኳን ደህና መጡ ወደ እርስዎ ኡቡንቱ ስልክ"
496−
497−#: qml/Wizard/Pages/10-welcome.qml:52
498−msgid "Let’s get started."
499−msgstr "ስራ እንጀምር"
500−
501−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
502−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
503−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
504−#: qml/Wizard/Pages/passwd-set.qml:90
505−msgid "Continue"
479+msgid "Language"
480+msgstr "ቋንቋ"
481+
482+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
483+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
484+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
485+#: qml/Wizard/Pages/75-report-check.qml:84
486+#: qml/Wizard/Pages/passcode-desktop.qml:124
487+#: qml/Wizard/Pages/password-set.qml:141
488+msgid "Next"
506489msgstr "ይቀጥሉ"
507490
508−#: qml/Wizard/Pages/20-sim.qml:25
509−msgid "Add a SIM card and restart your device"
510−msgstr "የ ሲም ካርድ ይጨምሩ እና አካሉን እንደገና ያስነሱ"
491+#: qml/Wizard/Pages/30-wifi.qml:29
492+msgid "Connect to Wi‑Fi"
493+msgstr "ወደ ዋይ‑ፋይ መገናኛ"
494+
495+#: qml/Wizard/Pages/30-wifi.qml:130
496+msgid "Connected"
497+msgstr "ተገናኝቷል"
498+
499+#: qml/Wizard/Pages/30-wifi.qml:163
500+msgid "Available Wi-Fi networks"
501+msgstr "ዝግጁ የ ዋይ-ፋይ ኔትዎርኮች"
511502
512−#: qml/Wizard/Pages/20-sim.qml:59
513−msgid "Without it, you won’t be able to make calls or use text messaging."
514−msgstr "ያለ እሱ ጥሪ መፈጸም ወይንም የ ጽሁፍ መልእክት መላክ አይችሉም"
503+#: qml/Wizard/Pages/30-wifi.qml:164
504+msgid "No available Wi-Fi networks"
505+msgstr "ምንም ዝግጁ ዋይ-ፋይ ኔትዎርኮች አልተገኙም"
515506
516−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
507+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
508+#: qml/Wizard/Pages/sim.qml:101
517509msgid "Skip"
518510msgstr "መዝለያ"
519511
520−#: qml/Wizard/Pages/30-passwd-type.qml:39
521−msgid "Lock security"
522−msgstr "ደህንነት መቆለፊያ"
512+#: qml/Wizard/Pages/40-location.qml:27
513+msgid "Location Services"
514+msgstr "የ አካባቢ ግልጋሎት"
523515
524−#: qml/Wizard/Pages/30-passwd-type.qml:74
525−msgid "Please select how you’d like to unlock your phone."
526−msgstr "እባክዎን የ እርስዎን ስልክ እንዴት እንደሚከፍቱ ይምረጡ"
516+#: qml/Wizard/Pages/40-location.qml:83
517+msgid ""
518+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
519+"(recommended)"
520+msgstr "ይጠቀሙ ጂፒኤስ: ዋይ-ፋይ: hotspots እና ተንቀሳቃሽ ኔትዎርክ ሳይታወቁ አካባቢ ለማግኘት (ይመከራሉ)"
527521
528−#: qml/Wizard/Pages/30-passwd-type.qml:97
529−msgctxt "Label: Type of security method"
530−msgid "Swipe"
531−msgstr "መጥረጊያ"
522+#: qml/Wizard/Pages/40-location.qml:105
523+#, qt-format
524+msgid "By selecting this option you agree to the Nokia HERE %1."
525+msgstr "ይህን ምርጫ በ መምረጥ እርስዎ ተስማምተዋል ከ Nokia HERE %1."
532526
533−#: qml/Wizard/Pages/30-passwd-type.qml:98
534−msgctxt "Label: Description of security method"
535−msgid "No security"
536−msgstr "ደህንነት አልተገኘም"
527+#: qml/Wizard/Pages/40-location.qml:106
528+msgctxt "part of: Nokia HERE terms and conditions"
529+msgid "terms and conditions"
530+msgstr "ስምምነት እና ሁኔታዎች"
537531
538−#: qml/Wizard/Pages/30-passwd-type.qml:100
539−msgctxt "Label: Type of security method"
540−msgid "Passcode"
541−msgstr "ማለፊያ ኮድ"
532+#: qml/Wizard/Pages/40-location.qml:160
533+msgid "GPS only"
534+msgstr "ጂፒኤስ ብቻ"
542535
543−#: qml/Wizard/Pages/30-passwd-type.qml:101
544−msgctxt "Label: Description of security method"
545−msgid "4 digits only"
546−msgstr "4 ዲጂት ብቻ"
536+#: qml/Wizard/Pages/40-location.qml:214
537+msgid "Don't use my location"
538+msgstr "የ እኔን አካባቢ አትጠቀም"
547539
548−#: qml/Wizard/Pages/30-passwd-type.qml:103
549−msgctxt "Label: Type of security method"
550−msgid "Passphrase"
551−msgstr "የማለፊያ ሐረግ"
540+#: qml/Wizard/Pages/40-location.qml:260
541+msgid "You can change it later in System Settings."
542+msgstr "እርስዎ በኋላ በ ስርአት ማሰናጃ ውስጥ መቀየር ይችላሉ"
552543
553−#: qml/Wizard/Pages/30-passwd-type.qml:104
554−msgctxt "Label: Description of security method"
555−msgid "Numbers and letters"
556−msgstr "ቁጥሮች እና ፊደሎች"
544+#: qml/Wizard/Pages/50-timezone.qml:29
545+msgid "Time Zone"
546+msgstr "የ ሰአት ክልል"
557547
558−#: qml/Wizard/Pages/40-wifi.qml:29
559−msgid "Connect to Wi‑Fi"
560−msgstr "ወደ ዋይ‑ፋይ መገናኛ"
548+#: qml/Wizard/Pages/50-timezone.qml:178
549+msgid "Enter your city"
550+msgstr "የ እርስዎን ከተማ ያስገቡ"
561551
562−#: qml/Wizard/Pages/40-wifi.qml:168
563−msgid "Available networks…"
564−msgstr "ዝግጁ ኔትዎርኮች…"
552+#: qml/Wizard/Pages/60-account.qml:24
553+msgid "Personalize Your Device"
554+msgstr "የ እርስዎን አካል የ ግልዎ ያድርጉ"
565555
566−#: qml/Wizard/Pages/40-wifi.qml:169
567−msgid "No available networks."
568−msgstr "ዝግጁ ኔትዎርኮች አልተገኙም"
556+#: qml/Wizard/Pages/60-account.qml:48
557+msgid "Preferred Name"
558+msgstr "የመረጡት ስም"
569559
570−#: qml/Wizard/Pages/50-location.qml:27
571−msgid "Location"
572−msgstr "አካባቢ"
560+#: qml/Wizard/Pages/70-passwd-type.qml:39
561+msgid "Lock Screen"
562+msgstr "መመልከቻውን መቆለፊያ"
573563
574−#: qml/Wizard/Pages/50-location.qml:62
575−msgid "Let the phone detect your location:"
576−msgstr "እባክዎን እርስዎ ያሉበትን አካባቢ ስልኩ እራሱ ይፈልግ:"
564+#: qml/Wizard/Pages/70-passwd-type.qml:101
565+msgctxt "Label: Type of security method"
566+msgid "Create new password"
567+msgstr "አዲስ የ መግቢያ ቃል መፍጠሪያ"
577568
578−#: qml/Wizard/Pages/50-location.qml:69
579−msgid "Using GPS only (less accurate)"
580−msgstr "ጂፒኤስን ብቻ መጠቀሚያ(በጣም ቅርብ)"
569+#: qml/Wizard/Pages/70-passwd-type.qml:103
570+msgctxt "Label: Type of security method"
571+msgid "Create passcode (numbers only)"
572+msgstr "አዲስ የ ማለፊያ ኮድ መፍጠሪያ (ቁጥር ብቻ)"
581573
582−#: qml/Wizard/Pages/50-location.qml:86
583−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
584−msgstr "ይጠቀሙ ጂፒኤስ ግልጽ ያልሆነ ዋይ-ፋይ እና ተንቀሳቃሽ ኔትዎርክ መረጃ (ይመከራሉ)"
574+#: qml/Wizard/Pages/70-passwd-type.qml:105
575+msgctxt "Label: Type of security method"
576+msgid "No lock code"
577+msgstr "ምንም መቆለፊያ ኮድ አልተገኘም"
585578
586−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
587−#: qml/Wizard/Pages/50-location.qml:103
588−msgid ""
589−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
590−"conditions</a>."
591−msgstr "ይህን ምርጫ በመምረጥ ተስማምቻለሁ ከ Nokia HERE <a href='#'>ውሎች እና ሁኔታዎች ጋር</a>."
579+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
580+msgid "Privacy Policy"
581+msgstr "የ ግላዊነት መመሪያ"
582+
583+#: qml/Wizard/Pages/75-report-check.qml:26
584+msgid "Help Us Improve"
585+msgstr "እንድንሻሻል ይርዱን"
586+
587+#: qml/Wizard/Pages/75-report-check.qml:59
588+msgid "Improve system performance by sending us crashes and error reports."
589+msgstr "የ ስርአቱን አፈጻጸም ለማሻሻል የ ግጭት እና የ ስህተት መልእክቶች ይላኩልን"
590+
591+#: qml/Wizard/Pages/75-report-check.qml:60
592+msgid "Privacy policy"
593+msgstr "የ ግላዊነት መመሪያ"
592594
593−#: qml/Wizard/Pages/50-location.qml:112
594−msgid "Not at all"
595−msgstr "አይደለም"
595+#: qml/Wizard/Pages/80-finished.qml:89
596+msgid "Welcome to Ubuntu"
597+msgstr "እንኳን ደህና መጡ ወደ ኡቡንቱ"
596598
597−#: qml/Wizard/Pages/50-location.qml:124
598−msgid "You can change your mind later in <b>System Settings</b>."
599−msgstr "እርስዎ በኋላ መቀየር ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b>."
599+#: qml/Wizard/Pages/80-finished.qml:104
600+msgid "You are ready to use your device now"
601+msgstr "የ እርስዎን አካል ለ መጠቀም አሁን ዝግጁ ነው"
602+
603+#: qml/Wizard/Pages/80-finished.qml:124
604+msgid "Get Started"
605+msgstr "እንጀምር"
606+
607+#: qml/Wizard/Pages/here-terms.qml:25
608+msgid "Terms & Conditions"
609+msgstr "ውሎች & ሁኔታዎች"
600610
601−#: qml/Wizard/Pages/60-reporting.qml:26
602−msgid "Improving your experience"
603−msgstr "የ እርስዎን ልምምድ ማሻሻያ"
611+#: qml/Wizard/Pages/here-terms.qml:69
612+msgid "Your device uses positioning technologies provided by HERE."
613+msgstr "የ እርስዎ አካል ይጠቀማል ያሉበትን አካባቢ ቴክኖሎጂ የቀረበውን በ HERE."
604614
605−#: qml/Wizard/Pages/60-reporting.qml:46
615+#: qml/Wizard/Pages/here-terms.qml:81
606616msgid ""
607−"Your phone is set up to automatically report errors to Canonical and its "
608−"partners, the makers of the operating system."
617+"To provide you with positioning services and to improve their quality, HERE "
618+"collects information about nearby cell towers and Wi-Fi hotspots around your "
619+"current location whenever your position is being found."
609620msgstr ""
610−"የ እርስዎ ስልክ ራሱ በራሱ የ ስህተት መግለጫዎች ወደ Canonical and its partners, የ መስሪያ ስርአት "
611−"አምራቾች"
621+"እርስዎ ያሉበትን አካባቢ ግልጋሎት ለ መስጠት እና ለማሻሻል: HERE መረጃ ይሰበስባል በቅርብ ያሉ የ ሴል ምሶሶዎች እና "
622+"ዋይ-ፋይ hotspots እርስዎ አሁን ያሉበትን አካባቢ ሲታወቅ"
612623
613−#: qml/Wizard/Pages/60-reporting.qml:53
624+#: qml/Wizard/Pages/here-terms.qml:93
614625msgid ""
615−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
616−"Privacy</b>"
617−msgstr ""
618−"ይህን ግልጋሎት ማሰናከል ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b> under <b>Security &amp; Privacy</b>"
626+"The information collected is used to analyze the service and to improve the "
627+"use of service, but not to identify you personally."
628+msgstr "የ ተሰበሰበው መረጃ የሚጠቅመው ግልጋሎት ለማሻሻል ነው: ነገር ግን እርስዎን በ ግል ለ መለየት አይደለም"
619629
620−#: qml/Wizard/Pages/80-finished.qml:24
621−msgid "All done"
622−msgstr "ሁሉም ተፈጽሟል"
630+#: qml/Wizard/Pages/here-terms.qml:106
631+#, qt-format
632+msgid "By continuing, you agree to the HERE platform %1 and %2."
633+msgstr "በ መቀጠል እርስዎ ተስማምተዋል ከ HERE platform %1 እና %2."
623634
624−#: qml/Wizard/Pages/80-finished.qml:39
625−msgid "Nice work!"
626−msgstr "ጥሩ ሰርተዋል!"
635+#: qml/Wizard/Pages/here-terms.qml:107
636+msgid "Service Terms"
637+msgstr "የ ግልጋሎት ስምምነቶች"
627638
628−#: qml/Wizard/Pages/80-finished.qml:46
629−msgid "Your phone is now ready to use."
630−msgstr "ስልኩ አሁን ለመጠቀም ዝግጁ ነው"
639+#: qml/Wizard/Pages/passcode-confirm.qml:43
640+#: qml/Wizard/Pages/passcode-desktop.qml:80
641+msgid "Confirm passcode"
642+msgstr "የማለፊያ ኮድ ማረጋገጫ"
631643
632−#: qml/Wizard/Pages/80-finished.qml:53
633−msgid "Finish"
634−msgstr "መጨረሻ"
644+#: qml/Wizard/Pages/passcode-confirm.qml:45
645+msgid "Incorrect passcode."
646+msgstr "የ ተሳሳተ የማለፊያ ኮድ"
635647
636−#: qml/Wizard/Pages/here-terms.qml:27
637−msgid "Terms & Conditions"
638−msgstr "ውሎች & ሁኔታዎች"
648+#: qml/Wizard/Pages/passcode-confirm.qml:45
649+msgctxt "Enter the passcode again"
650+msgid "Please re-enter."
651+msgstr "እባክዎን እንደገና-ያስገቡ"
639652
640−#: qml/Wizard/Pages/passwd-confirm.qml:49
641−msgid "Confirm passphrase"
642−msgstr "የ ማለፊያ ሐረግ ማረጋገጫ"
653+#: qml/Wizard/Pages/passcode-desktop.qml:30
654+msgid "Lock Screen Passcode"
655+msgstr "የ መመልከቻው መቆለፊያ የ ማለፊያ ኮድ"
643656
644−#: qml/Wizard/Pages/passwd-confirm.qml:50
645−msgid "Confirm passcode"
646−msgstr "የማለፊያ ኮድ ማረጋገጫ"
657+#: qml/Wizard/Pages/passcode-desktop.qml:56
658+msgid "Enter 4 numbers to setup your passcode"
659+msgstr "ያስገቡ 4 ቁጥሮች የ እርስዎን የ ማለፊያ ኮድ ለማሰናዳት"
647660
648−#: qml/Wizard/Pages/passwd-confirm.qml:53
649−#: qml/Wizard/Pages/passwd-confirm.qml:54
650−msgid "Please try again."
651−msgstr "እባክዎን እንደገና ይሞክሩ"
661+#: qml/Wizard/Pages/passcode-desktop.qml:65
662+#: qml/Wizard/Pages/passcode-set.qml:54
663+msgid "Choose passcode"
664+msgstr "የ ማለፊያ ኮድ ይምረጡ"
652665
653−#: qml/Wizard/Pages/passwd-set.qml:61
654−msgid "Choose your passcode"
655−msgstr "የ እርስዎን የማለፊያ ኮድ ይምረጡ"
666+#: qml/Wizard/Pages/passcode-desktop.qml:105
667+msgid "Passcode too short"
668+msgstr "የ ማለፊያ ኮዱ በጣም አጭር ነው"
656669
657−#: qml/Wizard/Pages/passwd-set.qml:68
658−msgid "Passphrase must be 4 characters long"
659−msgstr "የ ማለፊያ ሀረግ ቢያንስ 4 ባህሪዎች መሆን አለበት"
670+#: qml/Wizard/Pages/passcode-desktop.qml:107
671+msgid "Passcodes match"
672+msgstr "የ ማለፊያ ኮዶቹ ተመሳሳይ ናቸው"
660673
661−#. Translators: This is the arrow for "Back" buttons
662−#: qml/Wizard/StackButton.qml:39
663−#, qt-format
664−msgid "〈 %1"
665−msgstr "〈 %1"
674+#: qml/Wizard/Pages/passcode-desktop.qml:109
675+msgid "Passcodes do not match"
676+msgstr "የ ማለፊያ ኮዶቹ አይመሳሰሉም"
666677
667−#. Translators: This is the arrow for "Forward" buttons
668−#: qml/Wizard/StackButton.qml:42
669−#, qt-format
670−msgid "%1 〉"
671−msgstr "%1 〉"
678+#: qml/Wizard/Pages/passcode-set.qml:62
679+msgid "Passcode must be 4 characters long"
680+msgstr "የ ማለፊያ ኮድ 4 ባህሪዎች መሆን አለበት"
681+
682+#: qml/Wizard/Pages/password-set.qml:30
683+msgid "Lock Screen Password"
684+msgstr "የ መመልከቻ መቆለፊያ የ መግቢያ ቃል"
685+
686+#: qml/Wizard/Pages/password-set.qml:61
687+msgid "Enter at least 8 characters"
688+msgstr "ያስገቡ ቢያንስ 8 ባህሪዎች"
689+
690+#: qml/Wizard/Pages/password-set.qml:73
691+msgid "Choose password"
692+msgstr "የ መግቢያ ቃል ይምረጡ"
693+
694+#: qml/Wizard/Pages/password-set.qml:103
695+msgid "Confirm password"
696+msgstr "የ መግቢያ ቃሉን ያረጋግጡ"
697+
698+#: qml/Wizard/Pages/sim.qml:27
699+msgid "No SIM card installed"
700+msgstr "ምንም ሲም ካርድ አልተገጠመም"
701+
702+#: qml/Wizard/Pages/sim.qml:54
703+msgid "SIM card added"
704+msgstr "ሲም ካርድ ተጨምሯል"
705+
706+#: qml/Wizard/Pages/sim.qml:55
707+msgid "You must restart the device to access the mobile network."
708+msgstr "እርስዎ አካሉን እንደገና ማስጀመር አለብዎት ተንቀሳቃሽ ኔትዎርክ ጋር ለ መድረስ"
709+
710+#: qml/Wizard/Pages/sim.qml:59
711+msgid "Restart"
712+msgstr "እንደገና ማስጀመሪያ"
713+
714+#: qml/Wizard/Pages/sim.qml:78
715+msgid "You won’t be able to make calls or use text messaging without a SIM."
716+msgstr "ያለ ሲም ካርድ እርስዎ ጥሪ መፈጸም ወይንም በ ጽሁፍ መልእክት መላክ አይችሉም"
717+
718+#: qml/Wizard/Pages/sim.qml:90
719+msgid "To proceed with no SIM tap Skip."
720+msgstr "ያለ ሲም ለ መቀጠል መዝለያውን መታ ያድርጉ"
721+
722+#: qml/Wizard/PasswordMeter.qml:87
723+msgid "Passwords match"
724+msgstr "የ መግቢያ ቃሎቹ ተመሳሳይ ናቸው"
725+
726+#: qml/Wizard/PasswordMeter.qml:89
727+msgid "Passwords do not match"
728+msgstr "የ መግቢያ ቃሎቹ ተመሳሳይ አይደሉም"
729+
730+#: qml/Wizard/PasswordMeter.qml:93
731+msgid "Strong password"
732+msgstr "ጠንካራ የ መግቢያ ቃል"
733+
734+#: qml/Wizard/PasswordMeter.qml:95
735+msgid "Fair password"
736+msgstr "ደህና የ መግቢያ ቃል"
737+
738+#: qml/Wizard/PasswordMeter.qml:97
739+msgid "Weak password"
740+msgstr "ደካማ የ መግቢያ ቃል"
741+
742+#: qml/Wizard/PasswordMeter.qml:99
743+msgid "Very weak password"
744+msgstr "በጣም ደካማ የ መግቢያ ቃል"
672745
673746#~ msgid "Top edge"
674747#~ msgstr "የላይ ጠርዝ"
@@ -700,6 +773,12 @@ msgstr "%1 〉"
700773#~ msgid "Search"
701774#~ msgstr "መፈለጊያ"
702775
776+#~ msgid "See less"
777+#~ msgstr "አነስተኛ መመልከቻ"
778+
779+#~ msgid "See all"
780+#~ msgstr "ሁሉንም መመልከቻ"
781+
703782#~ msgid "Skip intro"
704783#~ msgstr "መግቢያውን መዝለያ"
705784
@@ -739,6 +818,9 @@ msgstr "%1 〉"
739818#~ msgid "Log out"
740819#~ msgstr "መውጫ"
741820
821+#~ msgid "Are you sure you want to shut down?"
822+#~ msgstr "በእርግጥ ማጥፋት ይፈልጋሉ?"
823+
742824#~ msgid "Shut down"
743825#~ msgstr "ማጥፊያ"
744826
@@ -748,14 +830,17 @@ msgstr "%1 〉"
748830#~ msgid "Settings"
749831#~ msgstr "ማሰናጃ"
750832
833+#~ msgid "Unlock SIM"
834+#~ msgstr "ሲም መክፈቻ"
835+
751836#~ msgid ""
752837#~ "You have now mastered the edge gestures and can start using the "
753838#~ "phone<br><br>Tap on the screen to start"
754839#~ msgstr ""
755840#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
756841
757−#~ msgid "Restart"
758−#~ msgstr "እንደገና ማስጀመሪያ"
842+#~ msgid "Roaming"
843+#~ msgstr "ማዘዋወሪያ"
759844
760845#~ msgid "Manage Scopes"
761846#~ msgstr "የ ክልል አስተዳዳሪ"
@@ -763,6 +848,182 @@ msgstr "%1 〉"
763848#~ msgid "Please re-enter"
764849#~ msgstr "እባክዎን እንደገና-ያስገቡ"
765850
851+#~ msgid "Lock security"
852+#~ msgstr "ደህንነት መቆለፊያ"
853+
854+#~ msgid "Please select how you’d like to unlock your phone."
855+#~ msgstr "እባክዎን የ እርስዎን ስልክ እንዴት እንደሚከፍቱ ይምረጡ"
856+
857+#~ msgid "Improving your experience"
858+#~ msgstr "የ እርስዎን ልምምድ ማሻሻያ"
859+
860+#~ msgid "Available networks…"
861+#~ msgstr "ዝግጁ ኔትዎርኮች…"
862+
863+#~ msgid "No available networks."
864+#~ msgstr "ዝግጁ ኔትዎርኮች አልተገኙም"
865+
866+#~ msgid "Location"
867+#~ msgstr "አካባቢ"
868+
869+#~ msgid ""
870+#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
871+#~ "Privacy</b>"
872+#~ msgstr ""
873+#~ "ይህን ግልጋሎት ማሰናከል ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b> under <b>Security &amp; Privacy</b>"
874+
875+#~ msgid "Nice work!"
876+#~ msgstr "ጥሩ ሰርተዋል!"
877+
878+#~ msgid "All done"
879+#~ msgstr "ሁሉም ተፈጽሟል"
880+
881+#~ msgid "Finish"
882+#~ msgstr "መጨረሻ"
883+
884+#~ msgid "Your phone is now ready to use."
885+#~ msgstr "ስልኩ አሁን ለመጠቀም ዝግጁ ነው"
886+
887+#~ msgid "Confirm passphrase"
888+#~ msgstr "የ ማለፊያ ሐረግ ማረጋገጫ"
889+
890+#~ msgid "Please try again."
891+#~ msgstr "እባክዎን እንደገና ይሞክሩ"
892+
893+#~ msgid "Add a SIM card and restart your device"
894+#~ msgstr "የ ሲም ካርድ ይጨምሩ እና አካሉን እንደገና ያስነሱ"
895+
896+#~ msgid "Without it, you won’t be able to make calls or use text messaging."
897+#~ msgstr "ያለ እሱ ጥሪ መፈጸም ወይንም የ ጽሁፍ መልእክት መላክ አይችሉም"
898+
899+#~ msgid "Hi!"
900+#~ msgstr "ሰላም"
901+
902+#~ msgid "Welcome to your Ubuntu phone."
903+#~ msgstr "እንኳን ደህና መጡ ወደ እርስዎ ኡቡንቱ ስልክ"
904+
905+#~ msgid "Let’s get started."
906+#~ msgstr "ስራ እንጀምር"
907+
908+#~ msgid "Continue"
909+#~ msgstr "ይቀጥሉ"
910+
911+#~ msgid "Passphrase must be 4 characters long"
912+#~ msgstr "የ ማለፊያ ሀረግ ቢያንስ 4 ባህሪዎች መሆን አለበት"
913+
914+#~ msgid "Choose your passcode"
915+#~ msgstr "የ እርስዎን የማለፊያ ኮድ ይምረጡ"
916+
917+#~ msgid "Let the phone detect your location:"
918+#~ msgstr "እባክዎን እርስዎ ያሉበትን አካባቢ ስልኩ እራሱ ይፈልግ:"
919+
920+#, qt-format
921+#~ msgid "〈 %1"
922+#~ msgstr "〈 %1"
923+
924+#, qt-format
925+#~ msgid "%1 〉"
926+#~ msgstr "%1 〉"
927+
928+#~ msgid "You can change your mind later in <b>System Settings</b>."
929+#~ msgstr "እርስዎ በኋላ መቀየር ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b>."
930+
931+#~ msgid "Not at all"
932+#~ msgstr "አይደለም"
933+
934+#~ msgid "Using GPS only (less accurate)"
935+#~ msgstr "ጂፒኤስን ብቻ መጠቀሚያ(በጣም ቅርብ)"
936+
937+#~ msgid ""
938+#~ "Your phone is set up to automatically report errors to Canonical and its "
939+#~ "partners, the makers of the operating system."
940+#~ msgstr ""
941+#~ "የ እርስዎ ስልክ ራሱ በራሱ የ ስህተት መግለጫዎች ወደ Canonical and its partners, የ መስሪያ ስርአት "
942+#~ "አምራቾች"
943+
944+#~ msgid ""
945+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
946+#~ "conditions</a>."
947+#~ msgstr "ይህን ምርጫ በመምረጥ ተስማምቻለሁ ከ Nokia HERE <a href='#'>ውሎች እና ሁኔታዎች ጋር</a>."
948+
949+#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
950+#~ msgstr "ይጠቀሙ ጂፒኤስ ግልጽ ያልሆነ ዋይ-ፋይ እና ተንቀሳቃሽ ኔትዎርክ መረጃ (ይመከራሉ)"
951+
952+#~ msgid "This action does different things for different apps"
953+#~ msgstr "ይህ ተግባር ለተለያዩ መተግበሪያዎች የተለያየ ነገር ይሰራል"
954+
955+#~ msgid "Tap here to finish."
956+#~ msgstr "እዚህ መታ ይድርጉ ለመጨረስ"
957+
958+#~ msgid "Short swipe from the left edge."
959+#~ msgstr "ከ ግራ ጠርዝ በኩል በትንሹ ይጥረጉ"
960+
961+#~ msgid "Open the launcher"
962+#~ msgstr "ማስጀመሪያውን መክፈቻ"
963+
964+#~ msgid "Tap here to continue."
965+#~ msgstr "እዚህ መታ ይድርጉ ለመቀጠል"
966+
967+#~ msgid "These are the shortcuts to favorite apps"
968+#~ msgstr "እነዚህ አቋራጮች ናቸው እርስዎ ለሚወዷቸው መተግበሪያዎች"
969+
970+#~ msgid "Swipe up from the bottom edge."
971+#~ msgstr "ከ ታች ጠርዝ በኩል ወደ ላይ ይጥረጉ"
972+
973+#~ msgid "Open special menus"
974+#~ msgstr "የተለዩ ዝርዝሮች መክፈቻ"
975+
976+#~ msgid "To view open apps"
977+#~ msgstr "ለመመልከት መተግበሪያዎች ይክፈቱ"
978+
979+#~ msgid "Try again."
980+#~ msgstr "እንደገና ይሞክሩ"
981+
982+#~ msgid "You almost got it!"
983+#~ msgstr "እርስዎ አሁን እያገኙት ነው!"
984+
985+#~ msgid "Long swipe from the right edge."
986+#~ msgstr "ከ ቀኝ ጠርዝ በኩል በረጅሙ ይጥረጉ"
987+
988+#~ msgid "View all your running tasks."
989+#~ msgstr "እርስዎ የሚያስኬዱትን ተግባሮች በሙሉ መመልከቻ"
990+
991+#~ msgctxt "Button: Shut down the system"
992+#~ msgid "Shut down"
993+#~ msgstr "ማጥፊያ"
994+
995+#~ msgctxt "Title: Reboot/Shut down dialog"
996+#~ msgid "Shut down"
997+#~ msgstr "ማጥፊያ"
998+
999+#~ msgctxt "Button: Reboot the system"
1000+#~ msgid "Reboot"
1001+#~ msgstr "እንደገና ማስነሻ"
1002+
1003+#~ msgctxt "Label: Type of security method"
1004+#~ msgid "Passcode"
1005+#~ msgstr "ማለፊያ ኮድ"
1006+
1007+#~ msgctxt "Label: Description of security method"
1008+#~ msgid "No security"
1009+#~ msgstr "ደህንነት አልተገኘም"
1010+
1011+#~ msgctxt "Label: Description of security method"
1012+#~ msgid "4 digits only"
1013+#~ msgstr "4 ዲጂት ብቻ"
1014+
1015+#~ msgctxt "Label: Type of security method"
1016+#~ msgid "Swipe"
1017+#~ msgstr "መጥረጊያ"
1018+
1019+#~ msgctxt "Label: Type of security method"
1020+#~ msgid "Passphrase"
1021+#~ msgstr "የማለፊያ ሐረግ"
1022+
1023+#~ msgctxt "Label: Description of security method"
1024+#~ msgid "Numbers and letters"
1025+#~ msgstr "ቁጥሮች እና ፊደሎች"
1026+
7661027#~ msgid "%a %d %b %H:%M"
7671028#~ msgstr "%a %d %b %ሰ:%ደ"
7681029
@@ -795,3 +1056,6 @@ msgstr "%1 〉"
7951056
7961057#~ msgid "Call back"
7971058#~ msgstr "መልሶ መደወያ"
1059+
1060+#~ msgid "Hover your mouse on the right edge to view your open apps"
1061+#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
po/ar.po+501−256
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
1111"PO-Revision-Date: 2015-07-29 09:41+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
@@ -16,23 +16,23 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2015-12-12 05:44+0000\n"
20−"X-Generator: Launchpad (build 17865)\n"
19+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
2424msgstr "كلمة السر: "
2525
26−#: plugins/Unity/Launcher/launcheritem.cpp:47
27−#: plugins/Unity/Launcher/launcheritem.cpp:106
26+#: plugins/Unity/Launcher/launcheritem.cpp:48
27+#: plugins/Unity/Launcher/launcheritem.cpp:107
2828msgid "Pin shortcut"
2929msgstr "تثبيت الاختصار"
3030
31−#: plugins/Unity/Launcher/launcheritem.cpp:52
31+#: plugins/Unity/Launcher/launcheritem.cpp:53
3232msgid "Quit"
3333msgstr "خروج"
3434
35−#: plugins/Unity/Launcher/launcheritem.cpp:106
35+#: plugins/Unity/Launcher/launcheritem.cpp:107
3636msgid "Unpin shortcut"
3737msgstr "إزالة تثبيت الاختصار"
3838
@@ -80,53 +80,35 @@ msgctxt "Button: Log out from the system"
8080msgid "Log Out"
8181msgstr "خروج"
8282
83−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
84−#: qml/Components/Dialogs.qml:253
83+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
84+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
85+#: qml/Wizard/Pages/passcode-set.qml:32
8586msgid "Cancel"
8687msgstr "إلغاء"
8788
8889#: qml/Components/Dialogs.qml:173
89−msgctxt "Title: Reboot/Shut down dialog"
90−msgid "Shut down"
91−msgstr "إطفاء الجهاز"
92−
93−#: qml/Components/Dialogs.qml:174
94−msgid "Are you sure you want to shut down?"
95−msgstr "هل أنت متأكد من رغبتك في إطفاء الجهاز؟"
96−
97−#: qml/Components/Dialogs.qml:176
98−msgctxt "Button: Reboot the system"
99−msgid "Reboot"
100−msgstr "إعادة التشغيل"
101−
102−#: qml/Components/Dialogs.qml:185
103−msgctxt "Button: Shut down the system"
104−msgid "Shut down"
105−msgstr "إطفاء الجهاز"
106−
107−#: qml/Components/Dialogs.qml:207
10890msgctxt "Title: Reboot dialog"
10991msgid "Reboot"
11092msgstr "إعادة التشغيل"
11193
112−#: qml/Components/Dialogs.qml:208
94+#: qml/Components/Dialogs.qml:174
11395msgid "Are you sure you want to reboot?"
11496msgstr "هل أنت متأكد من رغبتك في إعادة تشغيل الجهاز؟"
11597
116−#: qml/Components/Dialogs.qml:210
98+#: qml/Components/Dialogs.qml:176
11799msgid "No"
118100msgstr "لا"
119101
120−#: qml/Components/Dialogs.qml:217
102+#: qml/Components/Dialogs.qml:182
121103msgid "Yes"
122104msgstr "نعم"
123105
124−#: qml/Components/Dialogs.qml:232
106+#: qml/Components/Dialogs.qml:197
125107msgctxt "Title: Power off/Restart dialog"
126108msgid "Power"
127109msgstr "الطاقة"
128110
129−#: qml/Components/Dialogs.qml:233
111+#: qml/Components/Dialogs.qml:198
130112msgid ""
131113"Are you sure you would like\n"
132114"to power off?"
@@ -134,25 +116,25 @@ msgstr ""
134116"هل أنت متأكد من رغبتك\n"
135117"في إيقاف التشغيل؟"
136118
137−#: qml/Components/Dialogs.qml:235
119+#: qml/Components/Dialogs.qml:200
138120msgctxt "Button: Power off the system"
139121msgid "Power off"
140122msgstr "إيقاف التشغيل"
141123
142−#: qml/Components/Dialogs.qml:244
124+#: qml/Components/Dialogs.qml:209
143125msgctxt "Button: Restart the system"
144126msgid "Restart"
145127msgstr "إعادة التشغيل"
146128
147−#: qml/Components/Lockscreen.qml:245
129+#: qml/Components/Lockscreen.qml:231
148130msgid "Return to Call"
149131msgstr "العودة إلى المكالمة"
150132
151−#: qml/Components/Lockscreen.qml:245
133+#: qml/Components/Lockscreen.qml:231
152134msgid "Emergency Call"
153135msgstr "مكالمة طوارئ"
154136
155−#: qml/Components/Lockscreen.qml:277
137+#: qml/Components/Lockscreen.qml:263
156138msgid "OK"
157139msgstr "موافق"
158140
@@ -161,6 +143,8 @@ msgid "Apps may have unsaved data:"
161143msgstr ""
162144
163145#: qml/Components/ModeSwitchWarningDialog.qml:57
146+msgctxt ""
147+"Re-dock means connect the device again to an external screen/mouse/keyboard"
164148msgid "Re-dock, save your work and close these apps to continue."
165149msgstr ""
166150
@@ -180,42 +164,58 @@ msgstr ""
180164msgid "Close all"
181165msgstr ""
182166
183−#: qml/Dash/DashPageHeader.qml:265
167+#: qml/Dash/DashPageHeader.qml:337
184168msgctxt "Button: Open the Ubuntu Store"
185169msgid "Store"
186170msgstr "المتجر"
187171
188−#: qml/Dash/DashPageHeader.qml:272
172+#: qml/Dash/DashPageHeader.qml:344
189173msgctxt "Button: Start a search in the current dash scope"
190174msgid "Search"
191175msgstr "بحث"
192176
193−#: qml/Dash/DashPageHeader.qml:282
177+#: qml/Dash/DashPageHeader.qml:354
194178msgctxt "Button: Show the current dash scope settings"
195179msgid "Settings"
196180msgstr "الإعدادات"
197181
198−#: qml/Dash/DashPageHeader.qml:289
182+#: qml/Dash/DashPageHeader.qml:361
199183msgid "Remove from Favorites"
200184msgstr "حذف من المفضلات"
201185
202−#: qml/Dash/DashPageHeader.qml:289
186+#: qml/Dash/DashPageHeader.qml:361
203187msgid "Add to Favorites"
204188msgstr "إضافة إلى المفضلات"
205189
206−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
207−msgid "See less"
208−msgstr "شاهد أقل"
190+#: qml/Dash/FiltersPopover.qml:60
191+msgid "Refine your results"
192+msgstr ""
193+
194+#: qml/Dash/FiltersPopover.qml:69
195+msgid "Reset"
196+msgstr ""
197+
198+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
199+msgid "Show less"
200+msgstr ""
209201
210−#: qml/Dash/GenericScopeView.qml:576
211−msgid "See all"
212−msgstr "عرض الكل"
202+#: qml/Dash/GenericScopeView.qml:570
203+msgid "Show all"
204+msgstr ""
213205
214−#: qml/Dash/GenericScopeView.qml:638
206+#: qml/Dash/GenericScopeView.qml:627
215207msgctxt "Label: Hint for dash search line edit"
216208msgid "Search"
217209msgstr "بحث"
218210
211+#: qml/Dash/PageHeaderExtraPanel.qml:55
212+msgid "Recent Searches"
213+msgstr ""
214+
215+#: qml/Dash/PageHeaderExtraPanel.qml:66
216+msgid "Clear All"
217+msgstr ""
218+
219219#: qml/Dash/Previews/PreviewActionCombo.qml:35
220220msgid "More..."
221221msgstr "المزيد..."
@@ -237,7 +237,7 @@ msgstr "قيّم ذلك"
237237msgid "Add a review"
238238msgstr "أضف تعليق"
239239
240−#: qml/Dash/Previews/PreviewSharing.qml:51
240+#: qml/Dash/Previews/PreviewSharing.qml:66
241241msgid "Preview Share Item"
242242msgstr ""
243243
@@ -265,27 +265,29 @@ msgstr "الرئيسية"
265265msgid "Also installed"
266266msgstr "أيضا تم تثبيت"
267267
268−#: qml/DisabledScreenNotice.qml:42
269−msgid "Your device is now connected to an external display."
268+#: qml/DisabledScreenNotice.qml:104
269+msgid ""
270+"Your device is now connected to an external display. Use this screen as a "
271+"touch pad to interact with the pointer."
270272msgstr ""
271273
272−#: qml/Greeter/CoverPage.qml:107
274+#: qml/Greeter/CoverPage.qml:118
273275msgid "Unlock"
274276msgstr "فك القفل"
275277
276−#: qml/Greeter/LoginList.qml:236
278+#: qml/Greeter/LoginList.qml:239
277279msgid "Retry"
278280msgstr "إعادة المحاولة"
279281
280−#: qml/Greeter/LoginList.qml:237
282+#: qml/Greeter/LoginList.qml:240
281283msgid "Tap to unlock"
282284msgstr "انقر لفك القفل"
283285
284−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
286+#: qml/Greeter/NarrowView.qml:54
285287msgid "Sorry, incorrect passphrase."
286288msgstr "عذرًا، عبارة سرّية خاطئة."
287289
288−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
290+#: qml/Greeter/NarrowView.qml:55
289291msgid "Sorry, incorrect passcode."
290292msgstr "عذرًا، رمز سرّي خاطيء."
291293
@@ -314,7 +316,7 @@ msgstr ""
314316msgid "Enter %1"
315317msgstr "أدخِل %1"
316318
317−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
319+#: qml/Greeter/NarrowView.qml:117
318320msgid "Enter passphrase"
319321msgstr "أدخِل العبارة السرية"
320322
@@ -340,7 +342,7 @@ msgstr "برجاء إعادة إدخالها"
340342msgid "Sorry, incorrect passcode"
341343msgstr "نأسف، الرمز السري غير صحيح"
342344
343−#: qml/Notifications/NotificationMenuItemFactory.qml:129
345+#: qml/Notifications/NotificationMenuItemFactory.qml:124
344346msgid "Show password"
345347msgstr "عرض كلمة السر"
346348
@@ -352,11 +354,11 @@ msgstr "انقر للعودة إلى المكالمة..."
352354msgid "Conference"
353355msgstr "مؤتمر"
354356
355−#: qml/Panel/Indicators/MenuItemFactory.qml:731
357+#: qml/Panel/Indicators/MenuItemFactory.qml:762
356358msgid "Nothing is playing"
357359msgstr "لا شيء مُشغّل"
358360
359−#: qml/Panel/Indicators/MenuItemFactory.qml:860
361+#: qml/Panel/Indicators/MenuItemFactory.qml:891
360362#, qt-format
361363msgid "%1 hour"
362364msgid_plural "%1 hours"
@@ -367,7 +369,7 @@ msgstr[3] "%1 ساعات"
367369msgstr[4] "%1 ساعة"
368370msgstr[5] "%1 ساعة"
369371
370−#: qml/Panel/Indicators/MenuItemFactory.qml:864
372+#: qml/Panel/Indicators/MenuItemFactory.qml:895
371373#, qt-format
372374msgid "%1 minute"
373375msgid_plural "%1 minutes"
@@ -378,7 +380,7 @@ msgstr[3] "%1 دقائق"
378380msgstr[4] "%1 دقيقة"
379381msgstr[5] "%1 دقيقة"
380382
381−#: qml/Panel/Indicators/MenuItemFactory.qml:869
383+#: qml/Panel/Indicators/MenuItemFactory.qml:900
382384#, qt-format
383385msgid "%1 second"
384386msgid_plural "%1 seconds"
@@ -389,37 +391,37 @@ msgstr[3] "%1 ثوان"
389391msgstr[4] "%1 ثانية"
390392msgstr[5] "%1 ثانية"
391393
392−#: qml/Panel/Indicators/MenuItemFactory.qml:872
394+#: qml/Panel/Indicators/MenuItemFactory.qml:903
393395msgid "0 seconds"
394396msgstr "أقل من ثانية"
395397
396398#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
397−#: qml/Panel/Indicators/MenuItemFactory.qml:874
399+#: qml/Panel/Indicators/MenuItemFactory.qml:905
398400#, qt-format
399401msgid "%1 remaining"
400402msgstr "باق %1"
401403
402−#: qml/Panel/Indicators/MenuItemFactory.qml:880
404+#: qml/Panel/Indicators/MenuItemFactory.qml:911
403405msgid "In queue…"
404406msgstr "في الانتظار..."
405407
406−#: qml/Panel/Indicators/MenuItemFactory.qml:884
408+#: qml/Panel/Indicators/MenuItemFactory.qml:915
407409msgid "Downloading"
408410msgstr "التنزيل"
409411
410−#: qml/Panel/Indicators/MenuItemFactory.qml:886
412+#: qml/Panel/Indicators/MenuItemFactory.qml:917
411413msgid "Paused, tap to resume"
412414msgstr "مُلبث، انقر للاستئناف"
413415
414−#: qml/Panel/Indicators/MenuItemFactory.qml:888
416+#: qml/Panel/Indicators/MenuItemFactory.qml:919
415417msgid "Canceled"
416418msgstr "تم إلغائه"
417419
418−#: qml/Panel/Indicators/MenuItemFactory.qml:890
420+#: qml/Panel/Indicators/MenuItemFactory.qml:921
419421msgid "Finished"
420422msgstr "انتهى"
421423
422−#: qml/Panel/Indicators/MenuItemFactory.qml:892
424+#: qml/Panel/Indicators/MenuItemFactory.qml:923
423425msgid "Failed, tap to retry"
424426msgstr "فشل، انقل لإعادة المحاولة"
425427
@@ -439,260 +441,323 @@ msgctxt "Button: Call back on phone"
439441msgid "Call back"
440442msgstr ""
441443
442−#: qml/Panel/Indicators/ModemInfoItem.qml:105
443−msgid "Unlock SIM"
444−msgstr "فتح قفل بطاقة SIM"
445−
446−#: qml/Panel/Indicators/RoamingIndication.qml:27
447−msgid "Roaming"
448−msgstr "التجوال"
449−
450−#: qml/Tutorial/TutorialBottom.qml:28
451−msgid "Open special menus"
452−msgstr "فتح قوائم خاصة"
453−
454−#: qml/Tutorial/TutorialBottom.qml:29
455−msgid "Swipe up from the bottom edge."
456−msgstr "اسحب لأعلى من الحافة السفلى."
444+#: qml/Stages/SideStage.qml:76
445+msgid "Drag using 3 fingers any application from one window to the other"
446+msgstr ""
457447
458−#: qml/Tutorial/TutorialBottomFinish.qml:24
459−msgid "This action does different things for different apps"
460−msgstr "هذا الإجراء يقوم بأشياء مختلفة على التطبيقات المختلفة"
448+#: qml/Tutorial/TutorialBottom.qml:78
449+msgid "Swipe up to add a contact"
450+msgstr ""
461451
462−#: qml/Tutorial/TutorialBottomFinish.qml:25
463−msgid "Tap here to finish."
464−msgstr "انقر هنا للإنهاء."
452+#: qml/Tutorial/TutorialBottom.qml:80
453+msgid "Swipe up for favorite calculations"
454+msgstr ""
465455
466−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
467−#: qml/Tutorial/TutorialRight.qml:144
468−msgid "Tap here to continue."
469−msgstr "انقر هنا للمتابعة."
456+#: qml/Tutorial/TutorialBottom.qml:82
457+msgid "Swipe up for recent calls"
458+msgstr ""
470459
471−#: qml/Tutorial/TutorialLeft.qml:26
472−msgid "Open the launcher"
460+#: qml/Tutorial/TutorialBottom.qml:84
461+msgid "Swipe up to create a message"
473462msgstr ""
474463
475−#: qml/Tutorial/TutorialLeft.qml:27
476−msgid "Short swipe from the left edge."
477−msgstr "اسحب سحبة قصيرة من الحافة اليسرى."
464+#: qml/Tutorial/TutorialBottom.qml:85
465+msgid "Swipe up to manage the app"
466+msgstr ""
478467
479−#: qml/Tutorial/TutorialLeftFinish.qml:24
480−msgid "These are the shortcuts to favorite apps"
481−msgstr "هذه اختصارات للتطبيقات المُفضلة"
468+#: qml/Tutorial/TutorialLeftLong.qml:47
469+msgid "Long swipe from the left edge to open the Today scope"
470+msgstr ""
482471
483−#: qml/Tutorial/TutorialPage.qml:178
484−msgid "You almost got it!"
485−msgstr "انت حصلت على ذلك تقريبا!"
472+#: qml/Tutorial/TutorialLeft.qml:47
473+msgid "Swipe from the left edge to open the launcher"
474+msgstr ""
486475
487−#: qml/Tutorial/TutorialPage.qml:195
488−msgid "Try again."
489−msgstr "حاول مجددًا."
476+#: qml/Tutorial/TutorialRight.qml:55
477+msgid "Push your mouse against the right edge to view your open apps"
478+msgstr ""
490479
491−#: qml/Tutorial/TutorialRight.qml:31
492−msgid "To view open apps"
480+#: qml/Tutorial/TutorialRight.qml:56
481+msgid "Short or long swipe from the right edge to view your open apps"
493482msgstr ""
494483
495−#: qml/Tutorial/TutorialRight.qml:32
496−msgid "Long swipe from the right edge."
497−msgstr "سحبة طويلة من الحافة اليمنى."
484+#: qml/Tutorial/TutorialTop.qml:53
485+msgid "Swipe from the top right edge to open the notification bar"
486+msgstr ""
498487
499−#: qml/Tutorial/TutorialRight.qml:122
500−msgid "View all your running tasks."
501−msgstr "عرض جميع المهام النشطة."
488+#: qml/Tutorial/TutorialTop.qml:54
489+msgid "Swipe from the top edge to open the notification bar"
490+msgstr ""
502491
503−#: qml/Wizard/Page.qml:89
492+#: qml/Wizard/Page.qml:54
504493msgctxt "Button: Go back one page in the Wizard"
505494msgid "Back"
506495msgstr "عودة"
507496
508497#: qml/Wizard/Pages/10-welcome.qml:27
509−msgid "Hi!"
510−msgstr "أهلا!"
498+msgid "Language"
499+msgstr ""
511500
512−#: qml/Wizard/Pages/10-welcome.qml:44
513−msgid "Welcome to your Ubuntu phone."
514−msgstr "مرحبا بك في أوبونتو للهواتف."
501+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
502+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
503+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
504+#: qml/Wizard/Pages/75-report-check.qml:84
505+#: qml/Wizard/Pages/passcode-desktop.qml:124
506+#: qml/Wizard/Pages/password-set.qml:141
507+msgid "Next"
508+msgstr ""
515509
516−#: qml/Wizard/Pages/10-welcome.qml:52
517−msgid "Let’s get started."
518−msgstr "هيا بنا نبدأ."
510+#: qml/Wizard/Pages/30-wifi.qml:29
511+msgid "Connect to Wi‑Fi"
512+msgstr "اتصل بالواي فاي"
519513
520−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
521−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
522−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
523−#: qml/Wizard/Pages/passwd-set.qml:90
524−msgid "Continue"
525−msgstr "متابعة"
514+#: qml/Wizard/Pages/30-wifi.qml:130
515+msgid "Connected"
516+msgstr ""
526517
527−#: qml/Wizard/Pages/20-sim.qml:25
528−msgid "Add a SIM card and restart your device"
529−msgstr "أدخِل شريحة SIM ثم أعِد تشغيل الجهاز"
518+#: qml/Wizard/Pages/30-wifi.qml:163
519+msgid "Available Wi-Fi networks"
520+msgstr ""
530521
531−#: qml/Wizard/Pages/20-sim.qml:59
532−msgid "Without it, you won’t be able to make calls or use text messaging."
522+#: qml/Wizard/Pages/30-wifi.qml:164
523+msgid "No available Wi-Fi networks"
533524msgstr ""
534−"بدونها لن تتمكن من إجراء أي مكالمات هاتفية أو استخدام الرسائل النصية."
535525
536−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
526+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
527+#: qml/Wizard/Pages/sim.qml:101
537528msgid "Skip"
538529msgstr "تخطي"
539530
540−#: qml/Wizard/Pages/30-passwd-type.qml:39
541−msgid "Lock security"
542−msgstr "قِفل الأمان"
531+#: qml/Wizard/Pages/40-location.qml:27
532+msgid "Location Services"
533+msgstr ""
543534
544−#: qml/Wizard/Pages/30-passwd-type.qml:74
545−msgid "Please select how you’d like to unlock your phone."
546−msgstr "رجاءً اختر الطريقة التي ترغب بأن توصد هاتفك بها."
535+#: qml/Wizard/Pages/40-location.qml:83
536+msgid ""
537+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
538+"(recommended)"
539+msgstr ""
547540
548−#: qml/Wizard/Pages/30-passwd-type.qml:97
549−msgctxt "Label: Type of security method"
550−msgid "Swipe"
551−msgstr "سحبة"
541+#: qml/Wizard/Pages/40-location.qml:105
542+#, qt-format
543+msgid "By selecting this option you agree to the Nokia HERE %1."
544+msgstr ""
545+
546+#: qml/Wizard/Pages/40-location.qml:106
547+msgctxt "part of: Nokia HERE terms and conditions"
548+msgid "terms and conditions"
549+msgstr ""
550+
551+#: qml/Wizard/Pages/40-location.qml:160
552+msgid "GPS only"
553+msgstr ""
554+
555+#: qml/Wizard/Pages/40-location.qml:214
556+msgid "Don't use my location"
557+msgstr ""
558+
559+#: qml/Wizard/Pages/40-location.qml:260
560+msgid "You can change it later in System Settings."
561+msgstr ""
562+
563+#: qml/Wizard/Pages/50-timezone.qml:29
564+msgid "Time Zone"
565+msgstr ""
566+
567+#: qml/Wizard/Pages/50-timezone.qml:178
568+msgid "Enter your city"
569+msgstr ""
570+
571+#: qml/Wizard/Pages/60-account.qml:24
572+msgid "Personalize Your Device"
573+msgstr ""
574+
575+#: qml/Wizard/Pages/60-account.qml:48
576+msgid "Preferred Name"
577+msgstr ""
552578
553−#: qml/Wizard/Pages/30-passwd-type.qml:98
554−msgctxt "Label: Description of security method"
555−msgid "No security"
556−msgstr "بدون أمان"
579+#: qml/Wizard/Pages/70-passwd-type.qml:39
580+msgid "Lock Screen"
581+msgstr ""
557582
558−#: qml/Wizard/Pages/30-passwd-type.qml:100
583+#: qml/Wizard/Pages/70-passwd-type.qml:101
559584msgctxt "Label: Type of security method"
560−msgid "Passcode"
561−msgstr "رمز سري"
585+msgid "Create new password"
586+msgstr ""
562587
563−#: qml/Wizard/Pages/30-passwd-type.qml:101
564−msgctxt "Label: Description of security method"
565−msgid "4 digits only"
566−msgstr "4 أرقام فقط"
588+#: qml/Wizard/Pages/70-passwd-type.qml:103
589+msgctxt "Label: Type of security method"
590+msgid "Create passcode (numbers only)"
591+msgstr ""
567592
568−#: qml/Wizard/Pages/30-passwd-type.qml:103
593+#: qml/Wizard/Pages/70-passwd-type.qml:105
569594msgctxt "Label: Type of security method"
570−msgid "Passphrase"
571−msgstr "عبارة سرية"
595+msgid "No lock code"
596+msgstr ""
572597
573−#: qml/Wizard/Pages/30-passwd-type.qml:104
574−msgctxt "Label: Description of security method"
575−msgid "Numbers and letters"
576−msgstr "أرقام وحروف"
598+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
599+msgid "Privacy Policy"
600+msgstr ""
577601
578−#: qml/Wizard/Pages/40-wifi.qml:29
579−msgid "Connect to Wi‑Fi"
580−msgstr "اتصل بالواي فاي"
602+#: qml/Wizard/Pages/75-report-check.qml:26
603+msgid "Help Us Improve"
604+msgstr ""
581605
582−#: qml/Wizard/Pages/40-wifi.qml:168
583−msgid "Available networks…"
584−msgstr "الشبكات المتاحة..."
606+#: qml/Wizard/Pages/75-report-check.qml:59
607+msgid "Improve system performance by sending us crashes and error reports."
608+msgstr ""
609+
610+#: qml/Wizard/Pages/75-report-check.qml:60
611+msgid "Privacy policy"
612+msgstr ""
585613
586−#: qml/Wizard/Pages/40-wifi.qml:169
587−msgid "No available networks."
588−msgstr "لا توجد شبكات متاحة."
614+#: qml/Wizard/Pages/80-finished.qml:89
615+msgid "Welcome to Ubuntu"
616+msgstr ""
589617
590−#: qml/Wizard/Pages/50-location.qml:27
591−msgid "Location"
592−msgstr "الموقع"
618+#: qml/Wizard/Pages/80-finished.qml:104
619+msgid "You are ready to use your device now"
620+msgstr ""
593621
594−#: qml/Wizard/Pages/50-location.qml:62
595−msgid "Let the phone detect your location:"
596−msgstr "دع هاتفك يحدد موقعك:"
622+#: qml/Wizard/Pages/80-finished.qml:124
623+msgid "Get Started"
624+msgstr ""
597625
598−#: qml/Wizard/Pages/50-location.qml:69
599−msgid "Using GPS only (less accurate)"
600−msgstr "باستخدام نظام تحديد المواقع (GPS) فقط (أقل دقّة)"
626+#: qml/Wizard/Pages/here-terms.qml:25
627+msgid "Terms & Conditions"
628+msgstr "الشروط والأحكام"
601629
602−#: qml/Wizard/Pages/50-location.qml:86
603−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
630+#: qml/Wizard/Pages/here-terms.qml:69
631+msgid "Your device uses positioning technologies provided by HERE."
604632msgstr ""
605−"باستخدام نظام تحديد المواقع (GPS)، والواي فاي، وبيانات الشبكة الخلوية "
606−"(مستحسن)"
607633
608−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
609−#: qml/Wizard/Pages/50-location.qml:103
634+#: qml/Wizard/Pages/here-terms.qml:81
610635msgid ""
611−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
612−"conditions</a>."
636+"To provide you with positioning services and to improve their quality, HERE "
637+"collects information about nearby cell towers and Wi-Fi hotspots around your "
638+"current location whenever your position is being found."
613639msgstr ""
614−"باختيارك لهذا الخيار فإنك توافق على <a href='#'>الشروط والأحكام</a> الخاصة "
615−"بـ Nokia HERE."
616640
617−#: qml/Wizard/Pages/50-location.qml:112
618−msgid "Not at all"
641+#: qml/Wizard/Pages/here-terms.qml:93
642+msgid ""
643+"The information collected is used to analyze the service and to improve the "
644+"use of service, but not to identify you personally."
619645msgstr ""
620646
621−#: qml/Wizard/Pages/50-location.qml:124
622−msgid "You can change your mind later in <b>System Settings</b>."
623−msgstr "يمكنك تغيير رأيك في وقت لاحق عن طريق <b>إعدادات النظام</b>."
647+#: qml/Wizard/Pages/here-terms.qml:106
648+#, qt-format
649+msgid "By continuing, you agree to the HERE platform %1 and %2."
650+msgstr ""
624651
625−#: qml/Wizard/Pages/60-reporting.qml:26
626−msgid "Improving your experience"
627−msgstr "تحسين تجربتك"
652+#: qml/Wizard/Pages/here-terms.qml:107
653+msgid "Service Terms"
654+msgstr ""
628655
629−#: qml/Wizard/Pages/60-reporting.qml:46
630−msgid ""
631−"Your phone is set up to automatically report errors to Canonical and its "
632−"partners, the makers of the operating system."
656+#: qml/Wizard/Pages/passcode-confirm.qml:43
657+#: qml/Wizard/Pages/passcode-desktop.qml:80
658+msgid "Confirm passcode"
659+msgstr "تأكيد الرمز السري"
660+
661+#: qml/Wizard/Pages/passcode-confirm.qml:45
662+msgid "Incorrect passcode."
633663msgstr ""
634−"هاتفك مُعدّ لإرسال تقارير آلية بالأخطاء إلى كانونيكال وشركائها (صانعي نظام "
635−"التشغيل)."
636664
637−#: qml/Wizard/Pages/60-reporting.qml:53
638−msgid ""
639−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
640−"Privacy</b>"
665+#: qml/Wizard/Pages/passcode-confirm.qml:45
666+msgctxt "Enter the passcode again"
667+msgid "Please re-enter."
641668msgstr ""
642−"يمكن تعطيل ذلك بالذهاب إلى <b>إعدادات النظام</b> من خلال <b>الأمان "
643−"والخصوصية</b>"
644669
645−#: qml/Wizard/Pages/80-finished.qml:24
646−msgid "All done"
647−msgstr "تم ذلك"
670+#: qml/Wizard/Pages/passcode-desktop.qml:30
671+msgid "Lock Screen Passcode"
672+msgstr ""
648673
649−#: qml/Wizard/Pages/80-finished.qml:39
650−msgid "Nice work!"
651−msgstr "عمل جيد!"
674+#: qml/Wizard/Pages/passcode-desktop.qml:56
675+msgid "Enter 4 numbers to setup your passcode"
676+msgstr ""
652677
653−#: qml/Wizard/Pages/80-finished.qml:46
654−msgid "Your phone is now ready to use."
655−msgstr "هاتفك جاهز الآن للاستخدام."
678+#: qml/Wizard/Pages/passcode-desktop.qml:65
679+#: qml/Wizard/Pages/passcode-set.qml:54
680+msgid "Choose passcode"
681+msgstr ""
656682
657−#: qml/Wizard/Pages/80-finished.qml:53
658−msgid "Finish"
659−msgstr "إنهاء"
683+#: qml/Wizard/Pages/passcode-desktop.qml:105
684+msgid "Passcode too short"
685+msgstr ""
660686
661−#: qml/Wizard/Pages/here-terms.qml:27
662−msgid "Terms & Conditions"
663−msgstr "الشروط والأحكام"
687+#: qml/Wizard/Pages/passcode-desktop.qml:107
688+msgid "Passcodes match"
689+msgstr ""
664690
665−#: qml/Wizard/Pages/passwd-confirm.qml:49
666−msgid "Confirm passphrase"
667−msgstr "تأكيد العبارة السرية"
691+#: qml/Wizard/Pages/passcode-desktop.qml:109
692+msgid "Passcodes do not match"
693+msgstr ""
668694
669−#: qml/Wizard/Pages/passwd-confirm.qml:50
670−msgid "Confirm passcode"
671−msgstr "تأكيد الرمز السري"
695+#: qml/Wizard/Pages/passcode-set.qml:62
696+msgid "Passcode must be 4 characters long"
697+msgstr ""
698+
699+#: qml/Wizard/Pages/password-set.qml:30
700+msgid "Lock Screen Password"
701+msgstr ""
672702
673−#: qml/Wizard/Pages/passwd-confirm.qml:53
674−#: qml/Wizard/Pages/passwd-confirm.qml:54
675−msgid "Please try again."
676−msgstr "حاول مجددا."
703+#: qml/Wizard/Pages/password-set.qml:61
704+msgid "Enter at least 8 characters"
705+msgstr ""
677706
678−#: qml/Wizard/Pages/passwd-set.qml:61
679−msgid "Choose your passcode"
680−msgstr "اختر الرمز السري خاصتك"
707+#: qml/Wizard/Pages/password-set.qml:73
708+msgid "Choose password"
709+msgstr ""
681710
682−#: qml/Wizard/Pages/passwd-set.qml:68
683−msgid "Passphrase must be 4 characters long"
684−msgstr "يجب أن تحتوي العبارة السرية على 4 أحرف على الأقل"
711+#: qml/Wizard/Pages/password-set.qml:103
712+msgid "Confirm password"
713+msgstr ""
685714
686−#. Translators: This is the arrow for "Back" buttons
687−#: qml/Wizard/StackButton.qml:39
688−#, qt-format
689−msgid "〈 %1"
715+#: qml/Wizard/Pages/sim.qml:27
716+msgid "No SIM card installed"
690717msgstr ""
691718
692−#. Translators: This is the arrow for "Forward" buttons
693−#: qml/Wizard/StackButton.qml:42
694−#, qt-format
695−msgid "%1 〉"
719+#: qml/Wizard/Pages/sim.qml:54
720+msgid "SIM card added"
721+msgstr ""
722+
723+#: qml/Wizard/Pages/sim.qml:55
724+msgid "You must restart the device to access the mobile network."
725+msgstr ""
726+
727+#: qml/Wizard/Pages/sim.qml:59
728+msgid "Restart"
729+msgstr ""
730+
731+#: qml/Wizard/Pages/sim.qml:78
732+msgid "You won’t be able to make calls or use text messaging without a SIM."
733+msgstr ""
734+
735+#: qml/Wizard/Pages/sim.qml:90
736+msgid "To proceed with no SIM tap Skip."
737+msgstr ""
738+
739+#: qml/Wizard/PasswordMeter.qml:87
740+msgid "Passwords match"
741+msgstr ""
742+
743+#: qml/Wizard/PasswordMeter.qml:89
744+msgid "Passwords do not match"
745+msgstr ""
746+
747+#: qml/Wizard/PasswordMeter.qml:93
748+msgid "Strong password"
749+msgstr ""
750+
751+#: qml/Wizard/PasswordMeter.qml:95
752+msgid "Fair password"
753+msgstr ""
754+
755+#: qml/Wizard/PasswordMeter.qml:97
756+msgid "Weak password"
757+msgstr ""
758+
759+#: qml/Wizard/PasswordMeter.qml:99
760+msgid "Very weak password"
696761msgstr ""
697762
698763#~ msgid "Confirm"
@@ -744,6 +809,9 @@ msgstr ""
744809#~ msgid "Well done"
745810#~ msgstr "أحسنت!"
746811
812+#~ msgid "See less"
813+#~ msgstr "شاهد أقل"
814+
747815#~ msgid ""
748816#~ "You have now mastered the edge gestures and can start using the "
749817#~ "phone<br><br>Tap on the screen to start"
@@ -781,5 +849,182 @@ msgstr ""
781849#~ msgid "Tomorrow %H:%M"
782850#~ msgstr "غدًا %H:%M"
783851
852+#~ msgid "Are you sure you want to shut down?"
853+#~ msgstr "هل أنت متأكد من رغبتك في إطفاء الجهاز؟"
854+
855+#~ msgctxt "Button: Shut down the system"
856+#~ msgid "Shut down"
857+#~ msgstr "إطفاء الجهاز"
858+
859+#~ msgctxt "Title: Reboot/Shut down dialog"
860+#~ msgid "Shut down"
861+#~ msgstr "إطفاء الجهاز"
862+
863+#~ msgctxt "Button: Reboot the system"
864+#~ msgid "Reboot"
865+#~ msgstr "إعادة التشغيل"
866+
867+#~ msgid "See all"
868+#~ msgstr "عرض الكل"
869+
784870#~ msgid "Please re-enter"
785871#~ msgstr "برجاء إعادة إدخالها"
872+
873+#~ msgid "This action does different things for different apps"
874+#~ msgstr "هذا الإجراء يقوم بأشياء مختلفة على التطبيقات المختلفة"
875+
876+#~ msgid "These are the shortcuts to favorite apps"
877+#~ msgstr "هذه اختصارات للتطبيقات المُفضلة"
878+
879+#~ msgid "Roaming"
880+#~ msgstr "التجوال"
881+
882+#~ msgid "Short swipe from the left edge."
883+#~ msgstr "اسحب سحبة قصيرة من الحافة اليسرى."
884+
885+#~ msgid "Tap here to continue."
886+#~ msgstr "انقر هنا للمتابعة."
887+
888+#~ msgid "Swipe up from the bottom edge."
889+#~ msgstr "اسحب لأعلى من الحافة السفلى."
890+
891+#~ msgid "Open special menus"
892+#~ msgstr "فتح قوائم خاصة"
893+
894+#~ msgid "Tap here to finish."
895+#~ msgstr "انقر هنا للإنهاء."
896+
897+#~ msgid "Long swipe from the right edge."
898+#~ msgstr "سحبة طويلة من الحافة اليمنى."
899+
900+#~ msgid "View all your running tasks."
901+#~ msgstr "عرض جميع المهام النشطة."
902+
903+#~ msgid "Confirm passphrase"
904+#~ msgstr "تأكيد العبارة السرية"
905+
906+#~ msgid "Try again."
907+#~ msgstr "حاول مجددًا."
908+
909+#~ msgid "Please try again."
910+#~ msgstr "حاول مجددا."
911+
912+#~ msgid "Lock security"
913+#~ msgstr "قِفل الأمان"
914+
915+#~ msgid "Without it, you won’t be able to make calls or use text messaging."
916+#~ msgstr ""
917+#~ "بدونها لن تتمكن من إجراء أي مكالمات هاتفية أو استخدام الرسائل النصية."
918+
919+#~ msgid "Add a SIM card and restart your device"
920+#~ msgstr "أدخِل شريحة SIM ثم أعِد تشغيل الجهاز"
921+
922+#~ msgid "Hi!"
923+#~ msgstr "أهلا!"
924+
925+#~ msgid "Welcome to your Ubuntu phone."
926+#~ msgstr "مرحبا بك في أوبونتو للهواتف."
927+
928+#~ msgid "Let’s get started."
929+#~ msgstr "هيا بنا نبدأ."
930+
931+#~ msgid "Continue"
932+#~ msgstr "متابعة"
933+
934+#~ msgid "Choose your passcode"
935+#~ msgstr "اختر الرمز السري خاصتك"
936+
937+#~ msgid "Passphrase must be 4 characters long"
938+#~ msgstr "يجب أن تحتوي العبارة السرية على 4 أحرف على الأقل"
939+
940+#~ msgid "Available networks…"
941+#~ msgstr "الشبكات المتاحة..."
942+
943+#~ msgid "Please select how you’d like to unlock your phone."
944+#~ msgstr "رجاءً اختر الطريقة التي ترغب بأن توصد هاتفك بها."
945+
946+#~ msgctxt "Label: Description of security method"
947+#~ msgid "No security"
948+#~ msgstr "بدون أمان"
949+
950+#~ msgctxt "Label: Type of security method"
951+#~ msgid "Swipe"
952+#~ msgstr "سحبة"
953+
954+#~ msgctxt "Label: Description of security method"
955+#~ msgid "4 digits only"
956+#~ msgstr "4 أرقام فقط"
957+
958+#~ msgctxt "Label: Type of security method"
959+#~ msgid "Passcode"
960+#~ msgstr "رمز سري"
961+
962+#~ msgid "No available networks."
963+#~ msgstr "لا توجد شبكات متاحة."
964+
965+#~ msgctxt "Label: Type of security method"
966+#~ msgid "Passphrase"
967+#~ msgstr "عبارة سرية"
968+
969+#~ msgctxt "Label: Description of security method"
970+#~ msgid "Numbers and letters"
971+#~ msgstr "أرقام وحروف"
972+
973+#~ msgid "Improving your experience"
974+#~ msgstr "تحسين تجربتك"
975+
976+#~ msgid "You can change your mind later in <b>System Settings</b>."
977+#~ msgstr "يمكنك تغيير رأيك في وقت لاحق عن طريق <b>إعدادات النظام</b>."
978+
979+#~ msgid "Location"
980+#~ msgstr "الموقع"
981+
982+#~ msgid "Let the phone detect your location:"
983+#~ msgstr "دع هاتفك يحدد موقعك:"
984+
985+#~ msgid "Using GPS only (less accurate)"
986+#~ msgstr "باستخدام نظام تحديد المواقع (GPS) فقط (أقل دقّة)"
987+
988+#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
989+#~ msgstr ""
990+#~ "باستخدام نظام تحديد المواقع (GPS)، والواي فاي، وبيانات الشبكة الخلوية "
991+#~ "(مستحسن)"
992+
993+#~ msgid ""
994+#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
995+#~ "Privacy</b>"
996+#~ msgstr ""
997+#~ "يمكن تعطيل ذلك بالذهاب إلى <b>إعدادات النظام</b> من خلال <b>الأمان "
998+#~ "والخصوصية</b>"
999+
1000+#~ msgid "Nice work!"
1001+#~ msgstr "عمل جيد!"
1002+
1003+#~ msgid "All done"
1004+#~ msgstr "تم ذلك"
1005+
1006+#~ msgid "Finish"
1007+#~ msgstr "إنهاء"
1008+
1009+#~ msgid "Your phone is now ready to use."
1010+#~ msgstr "هاتفك جاهز الآن للاستخدام."
1011+
1012+#~ msgid "You almost got it!"
1013+#~ msgstr "انت حصلت على ذلك تقريبا!"
1014+
1015+#~ msgid ""
1016+#~ "Your phone is set up to automatically report errors to Canonical and its "
1017+#~ "partners, the makers of the operating system."
1018+#~ msgstr ""
1019+#~ "هاتفك مُعدّ لإرسال تقارير آلية بالأخطاء إلى كانونيكال وشركائها (صانعي نظام "
1020+#~ "التشغيل)."
1021+
1022+#~ msgid "Unlock SIM"
1023+#~ msgstr "فتح قفل بطاقة SIM"
1024+
1025+#~ msgid ""
1026+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1027+#~ "conditions</a>."
1028+#~ msgstr ""
1029+#~ "باختيارك لهذا الخيار فإنك توافق على <a href='#'>الشروط والأحكام</a> الخاصة "
1030+#~ "بـ Nokia HERE."
po/ast.po+532−273
@@ -7,31 +7,31 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
11−"PO-Revision-Date: 2015-10-06 12:07+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
11+"PO-Revision-Date: 2016-04-17 16:57+0000\n"
1212"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-12-12 05:44+0000\n"
19−"X-Generator: Launchpad (build 17865)\n"
18+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
2323msgstr "Contraseña: "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:47
26−#: plugins/Unity/Launcher/launcheritem.cpp:106
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
2727msgid "Pin shortcut"
2828msgstr "Anclar atayu"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:52
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
3232msgstr "Colar"
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:106
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
3636msgstr "Desanclar atayu"
3737
@@ -74,53 +74,35 @@ msgctxt "Button: Log out from the system"
7474msgid "Log Out"
7575msgstr "Zarrar sesión"
7676
77−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
78−#: qml/Components/Dialogs.qml:253
77+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
78+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
79+#: qml/Wizard/Pages/passcode-set.qml:32
7980msgid "Cancel"
8081msgstr "Encaboxar"
8182
8283#: qml/Components/Dialogs.qml:173
83−msgctxt "Title: Reboot/Shut down dialog"
84−msgid "Shut down"
85−msgstr "Apagáu"
86−
87−#: qml/Components/Dialogs.qml:174
88−msgid "Are you sure you want to shut down?"
89−msgstr "¿De xuru que quies apagar?"
90−
91−#: qml/Components/Dialogs.qml:176
92−msgctxt "Button: Reboot the system"
93−msgid "Reboot"
94−msgstr "Reaniciar"
95−
96−#: qml/Components/Dialogs.qml:185
97−msgctxt "Button: Shut down the system"
98−msgid "Shut down"
99−msgstr "Apagar"
100−
101−#: qml/Components/Dialogs.qml:207
10284msgctxt "Title: Reboot dialog"
10385msgid "Reboot"
10486msgstr "Reaniciu"
10587
106−#: qml/Components/Dialogs.qml:208
88+#: qml/Components/Dialogs.qml:174
10789msgid "Are you sure you want to reboot?"
10890msgstr "¿De xuru que quies reaniciar?"
10991
110−#: qml/Components/Dialogs.qml:210
92+#: qml/Components/Dialogs.qml:176
11193msgid "No"
11294msgstr "Non"
11395
114−#: qml/Components/Dialogs.qml:217
96+#: qml/Components/Dialogs.qml:182
11597msgid "Yes"
11698msgstr "Sí"
11799
118−#: qml/Components/Dialogs.qml:232
100+#: qml/Components/Dialogs.qml:197
119101msgctxt "Title: Power off/Restart dialog"
120102msgid "Power"
121103msgstr "Apagáu"
122104
123−#: qml/Components/Dialogs.qml:233
105+#: qml/Components/Dialogs.qml:198
124106msgid ""
125107"Are you sure you would like\n"
126108"to power off?"
@@ -128,88 +110,106 @@ msgstr ""
128110"¿De xuru que te prestaría\n"
129111"apagar?"
130112
131−#: qml/Components/Dialogs.qml:235
113+#: qml/Components/Dialogs.qml:200
132114msgctxt "Button: Power off the system"
133115msgid "Power off"
134116msgstr "Apagar"
135117
136−#: qml/Components/Dialogs.qml:244
118+#: qml/Components/Dialogs.qml:209
137119msgctxt "Button: Restart the system"
138120msgid "Restart"
139121msgstr "Reaniciar"
140122
141−#: qml/Components/Lockscreen.qml:245
123+#: qml/Components/Lockscreen.qml:231
142124msgid "Return to Call"
143125msgstr "Tornar a la llamada"
144126
145−#: qml/Components/Lockscreen.qml:245
127+#: qml/Components/Lockscreen.qml:231
146128msgid "Emergency Call"
147129msgstr "Llamada d'emerxencia"
148130
149−#: qml/Components/Lockscreen.qml:277
131+#: qml/Components/Lockscreen.qml:263
150132msgid "OK"
151133msgstr "Aceutar"
152134
153135#: qml/Components/ModeSwitchWarningDialog.qml:32
154136msgid "Apps may have unsaved data:"
155−msgstr ""
137+msgstr "Apps que pueden tener datos sin guardar:"
156138
157139#: qml/Components/ModeSwitchWarningDialog.qml:57
140+msgctxt ""
141+"Re-dock means connect the device again to an external screen/mouse/keyboard"
158142msgid "Re-dock, save your work and close these apps to continue."
159143msgstr ""
160144
161145#: qml/Components/ModeSwitchWarningDialog.qml:63
162146msgid "Or force close now (unsaved data will be lost)."
163−msgstr ""
147+msgstr "O fuerza salir agora (perderás tolos datos sin guardar)."
164148
165149#: qml/Components/ModeSwitchWarningDialog.qml:75
166150msgid "OK, I will reconnect"
167−msgstr ""
151+msgstr "D'alcuerdu, reconeutaré"
168152
169153#: qml/Components/ModeSwitchWarningDialog.qml:76
170154msgid "Reconnect now!"
171−msgstr ""
155+msgstr "Reconeutar agora."
172156
173157#: qml/Components/ModeSwitchWarningDialog.qml:88
174158msgid "Close all"
175−msgstr ""
159+msgstr "Zarrar too"
176160
177−#: qml/Dash/DashPageHeader.qml:265
161+#: qml/Dash/DashPageHeader.qml:337
178162msgctxt "Button: Open the Ubuntu Store"
179163msgid "Store"
180164msgstr "Tienda"
181165
182−#: qml/Dash/DashPageHeader.qml:272
166+#: qml/Dash/DashPageHeader.qml:344
183167msgctxt "Button: Start a search in the current dash scope"
184168msgid "Search"
185169msgstr "Guetar"
186170
187−#: qml/Dash/DashPageHeader.qml:282
171+#: qml/Dash/DashPageHeader.qml:354
188172msgctxt "Button: Show the current dash scope settings"
189173msgid "Settings"
190174msgstr "Axustes"
191175
192−#: qml/Dash/DashPageHeader.qml:289
176+#: qml/Dash/DashPageHeader.qml:361
193177msgid "Remove from Favorites"
194178msgstr "Desaniciar de favoritos"
195179
196−#: qml/Dash/DashPageHeader.qml:289
180+#: qml/Dash/DashPageHeader.qml:361
197181msgid "Add to Favorites"
198182msgstr "Amestar a favoritos"
199183
200−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
201−msgid "See less"
202−msgstr "Ver menos"
184+#: qml/Dash/FiltersPopover.qml:60
185+msgid "Refine your results"
186+msgstr ""
187+
188+#: qml/Dash/FiltersPopover.qml:69
189+msgid "Reset"
190+msgstr "Reafitar"
203191
204−#: qml/Dash/GenericScopeView.qml:576
205−msgid "See all"
206−msgstr "Ver too"
192+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
193+msgid "Show less"
194+msgstr ""
195+
196+#: qml/Dash/GenericScopeView.qml:570
197+msgid "Show all"
198+msgstr ""
207199
208−#: qml/Dash/GenericScopeView.qml:638
200+#: qml/Dash/GenericScopeView.qml:627
209201msgctxt "Label: Hint for dash search line edit"
210202msgid "Search"
211203msgstr "Guetar"
212204
205+#: qml/Dash/PageHeaderExtraPanel.qml:55
206+msgid "Recent Searches"
207+msgstr ""
208+
209+#: qml/Dash/PageHeaderExtraPanel.qml:66
210+msgid "Clear All"
211+msgstr "Llimpiar too"
212+
213213#: qml/Dash/Previews/PreviewActionCombo.qml:35
214214msgid "More..."
215215msgstr "Más…"
@@ -231,9 +231,9 @@ msgstr "Valorar esto"
231231msgid "Add a review"
232232msgstr "Amestar una reseña"
233233
234−#: qml/Dash/Previews/PreviewSharing.qml:51
234+#: qml/Dash/Previews/PreviewSharing.qml:66
235235msgid "Preview Share Item"
236−msgstr ""
236+msgstr "Entever l'elementu compartíu"
237237
238238#: qml/Dash/PullToRefreshScopeStyle.qml:55
239239msgid "Pull to refresh…"
@@ -259,27 +259,29 @@ msgstr "Aniciu"
259259msgid "Also installed"
260260msgstr "Tamién instalaos"
261261
262−#: qml/DisabledScreenNotice.qml:42
263−msgid "Your device is now connected to an external display."
262+#: qml/DisabledScreenNotice.qml:104
263+msgid ""
264+"Your device is now connected to an external display. Use this screen as a "
265+"touch pad to interact with the pointer."
264266msgstr ""
265267
266−#: qml/Greeter/CoverPage.qml:107
268+#: qml/Greeter/CoverPage.qml:118
267269msgid "Unlock"
268270msgstr "Desbloquiar"
269271
270−#: qml/Greeter/LoginList.qml:236
272+#: qml/Greeter/LoginList.qml:239
271273msgid "Retry"
272274msgstr "Reintentar"
273275
274−#: qml/Greeter/LoginList.qml:237
276+#: qml/Greeter/LoginList.qml:240
275277msgid "Tap to unlock"
276278msgstr "Calca pa desbloquiar"
277279
278−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
280+#: qml/Greeter/NarrowView.qml:54
279281msgid "Sorry, incorrect passphrase."
280282msgstr "Perdón, fras de pasu incorreuta"
281283
282−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
284+#: qml/Greeter/NarrowView.qml:55
283285msgid "Sorry, incorrect passcode."
284286msgstr "Perdón, códigu de pasu incorreutu."
285287
@@ -308,7 +310,7 @@ msgstr ""
308310msgid "Enter %1"
309311msgstr "Introduz %1"
310312
311−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
313+#: qml/Greeter/NarrowView.qml:117
312314msgid "Enter passphrase"
313315msgstr "Introduz la fras de pasu"
314316
@@ -334,7 +336,7 @@ msgstr "Vuelve a escribila"
334336msgid "Sorry, incorrect passcode"
335337msgstr "Sentímoslo, códigu de pasu incorreutu"
336338
337−#: qml/Notifications/NotificationMenuItemFactory.qml:129
339+#: qml/Notifications/NotificationMenuItemFactory.qml:124
338340msgid "Show password"
339341msgstr "Amosar contraseña"
340342
@@ -346,62 +348,62 @@ msgstr "Toca pa tornar a la llamada..."
346348msgid "Conference"
347349msgstr "Conferencia"
348350
349−#: qml/Panel/Indicators/MenuItemFactory.qml:731
351+#: qml/Panel/Indicators/MenuItemFactory.qml:762
350352msgid "Nothing is playing"
351353msgstr "Nun ta reproduciéndose nada"
352354
353−#: qml/Panel/Indicators/MenuItemFactory.qml:860
355+#: qml/Panel/Indicators/MenuItemFactory.qml:891
354356#, qt-format
355357msgid "%1 hour"
356358msgid_plural "%1 hours"
357359msgstr[0] "%1 hora"
358360msgstr[1] "%1 hores"
359361
360−#: qml/Panel/Indicators/MenuItemFactory.qml:864
362+#: qml/Panel/Indicators/MenuItemFactory.qml:895
361363#, qt-format
362364msgid "%1 minute"
363365msgid_plural "%1 minutes"
364366msgstr[0] "%1 minutu"
365367msgstr[1] "%1 minutos"
366368
367−#: qml/Panel/Indicators/MenuItemFactory.qml:869
369+#: qml/Panel/Indicators/MenuItemFactory.qml:900
368370#, qt-format
369371msgid "%1 second"
370372msgid_plural "%1 seconds"
371373msgstr[0] "%1 segundu"
372374msgstr[1] "%1 segundos"
373375
374−#: qml/Panel/Indicators/MenuItemFactory.qml:872
376+#: qml/Panel/Indicators/MenuItemFactory.qml:903
375377msgid "0 seconds"
376378msgstr "0 segundos"
377379
378380#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
379−#: qml/Panel/Indicators/MenuItemFactory.qml:874
381+#: qml/Panel/Indicators/MenuItemFactory.qml:905
380382#, qt-format
381383msgid "%1 remaining"
382384msgstr "Queden %1"
383385
384−#: qml/Panel/Indicators/MenuItemFactory.qml:880
386+#: qml/Panel/Indicators/MenuItemFactory.qml:911
385387msgid "In queue…"
386388msgstr "Na cola..."
387389
388−#: qml/Panel/Indicators/MenuItemFactory.qml:884
390+#: qml/Panel/Indicators/MenuItemFactory.qml:915
389391msgid "Downloading"
390392msgstr "Baxando"
391393
392−#: qml/Panel/Indicators/MenuItemFactory.qml:886
394+#: qml/Panel/Indicators/MenuItemFactory.qml:917
393395msgid "Paused, tap to resume"
394396msgstr "Posáu, toca pa reanudar"
395397
396−#: qml/Panel/Indicators/MenuItemFactory.qml:888
398+#: qml/Panel/Indicators/MenuItemFactory.qml:919
397399msgid "Canceled"
398400msgstr "Encaboxáu"
399401
400−#: qml/Panel/Indicators/MenuItemFactory.qml:890
402+#: qml/Panel/Indicators/MenuItemFactory.qml:921
401403msgid "Finished"
402404msgstr "Finó"
403405
404−#: qml/Panel/Indicators/MenuItemFactory.qml:892
406+#: qml/Panel/Indicators/MenuItemFactory.qml:923
405407msgid "Failed, tap to retry"
406408msgstr "Falló, toca pa reintentar"
407409
@@ -409,7 +411,7 @@ msgstr "Falló, toca pa reintentar"
409411#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
410412msgctxt "Button: Send a reply message"
411413msgid "Send"
412−msgstr ""
414+msgstr "Unviar"
413415
414416#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
415417msgctxt "Label: Hint in message indicator line edit"
@@ -419,261 +421,326 @@ msgstr "Responder"
419421#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
420422msgctxt "Button: Call back on phone"
421423msgid "Call back"
422−msgstr ""
423−
424−#: qml/Panel/Indicators/ModemInfoItem.qml:105
425−msgid "Unlock SIM"
426−msgstr "Desbloquiar SIM"
427−
428−#: qml/Panel/Indicators/RoamingIndication.qml:27
429−msgid "Roaming"
430−msgstr "Roaming"
424+msgstr "Devolver llamada"
431425
432−#: qml/Tutorial/TutorialBottom.qml:28
433−msgid "Open special menus"
434−msgstr "Abrir menús especiales"
435−
436−#: qml/Tutorial/TutorialBottom.qml:29
437−msgid "Swipe up from the bottom edge."
438−msgstr "Esliza dende'l berbesu d'embaxo."
426+#: qml/Stages/SideStage.qml:76
427+msgid "Drag using 3 fingers any application from one window to the other"
428+msgstr ""
439429
440−#: qml/Tutorial/TutorialBottomFinish.qml:24
441−msgid "This action does different things for different apps"
442−msgstr "Esta aición fai coses distintes p'aplicaciones estremaes"
430+#: qml/Tutorial/TutorialBottom.qml:78
431+msgid "Swipe up to add a contact"
432+msgstr ""
443433
444−#: qml/Tutorial/TutorialBottomFinish.qml:25
445−msgid "Tap here to finish."
446−msgstr "Toca equí pa finar."
434+#: qml/Tutorial/TutorialBottom.qml:80
435+msgid "Swipe up for favorite calculations"
436+msgstr ""
447437
448−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
449−#: qml/Tutorial/TutorialRight.qml:144
450−msgid "Tap here to continue."
451−msgstr "Toca equí pa siguir."
438+#: qml/Tutorial/TutorialBottom.qml:82
439+msgid "Swipe up for recent calls"
440+msgstr ""
452441
453−#: qml/Tutorial/TutorialLeft.qml:26
454−msgid "Open the launcher"
455−msgstr "Abrir el llanzador"
442+#: qml/Tutorial/TutorialBottom.qml:84
443+msgid "Swipe up to create a message"
444+msgstr ""
456445
457−#: qml/Tutorial/TutorialLeft.qml:27
458−msgid "Short swipe from the left edge."
459−msgstr "Esliza un poco dende'l berbesu esquierdu."
446+#: qml/Tutorial/TutorialBottom.qml:85
447+msgid "Swipe up to manage the app"
448+msgstr ""
460449
461−#: qml/Tutorial/TutorialLeftFinish.qml:24
462−msgid "These are the shortcuts to favorite apps"
463−msgstr "Estos son los atayos a les aplicaciones favorites"
450+#: qml/Tutorial/TutorialLeftLong.qml:47
451+msgid "Long swipe from the left edge to open the Today scope"
452+msgstr ""
464453
465−#: qml/Tutorial/TutorialPage.qml:178
466−msgid "You almost got it!"
467−msgstr "¡Yá cuasi finamos!"
454+#: qml/Tutorial/TutorialLeft.qml:47
455+msgid "Swipe from the left edge to open the launcher"
456+msgstr ""
468457
469−#: qml/Tutorial/TutorialPage.qml:195
470−msgid "Try again."
471−msgstr "Intentar de nueves"
458+#: qml/Tutorial/TutorialRight.qml:55
459+msgid "Push your mouse against the right edge to view your open apps"
460+msgstr ""
472461
473−#: qml/Tutorial/TutorialRight.qml:31
474−msgid "To view open apps"
475−msgstr "Pa ver aplicaciones abiertes"
462+#: qml/Tutorial/TutorialRight.qml:56
463+msgid "Short or long swipe from the right edge to view your open apps"
464+msgstr ""
476465
477−#: qml/Tutorial/TutorialRight.qml:32
478−msgid "Long swipe from the right edge."
479−msgstr "Eslizamientu llargu dende'l berbesu drechu."
466+#: qml/Tutorial/TutorialTop.qml:53
467+msgid "Swipe from the top right edge to open the notification bar"
468+msgstr ""
480469
481−#: qml/Tutorial/TutorialRight.qml:122
482−msgid "View all your running tasks."
483−msgstr "Mira toles tos aplicaciones n'execución."
470+#: qml/Tutorial/TutorialTop.qml:54
471+msgid "Swipe from the top edge to open the notification bar"
472+msgstr ""
484473
485−#: qml/Wizard/Page.qml:89
474+#: qml/Wizard/Page.qml:54
486475msgctxt "Button: Go back one page in the Wizard"
487476msgid "Back"
488477msgstr "Atrás"
489478
490479#: qml/Wizard/Pages/10-welcome.qml:27
491−msgid "Hi!"
492−msgstr "¡Hola!"
493−
494−#: qml/Wizard/Pages/10-welcome.qml:44
495−msgid "Welcome to your Ubuntu phone."
496−msgstr "Bienllegáu/ada al to teléfonu d'Ubuntu"
497−
498−#: qml/Wizard/Pages/10-welcome.qml:52
499−msgid "Let’s get started."
500−msgstr "Entamemos."
480+msgid "Language"
481+msgstr "Llingua"
482+
483+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
484+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
485+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
486+#: qml/Wizard/Pages/75-report-check.qml:84
487+#: qml/Wizard/Pages/passcode-desktop.qml:124
488+#: qml/Wizard/Pages/password-set.qml:141
489+msgid "Next"
490+msgstr "Siguiente"
491+
492+#: qml/Wizard/Pages/30-wifi.qml:29
493+msgid "Connect to Wi‑Fi"
494+msgstr "Coneutase al WiFi"
501495
502−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
503−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
504−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
505−#: qml/Wizard/Pages/passwd-set.qml:90
506−msgid "Continue"
507−msgstr "Siguir"
496+#: qml/Wizard/Pages/30-wifi.qml:130
497+msgid "Connected"
498+msgstr "Coneutáu"
508499
509−#: qml/Wizard/Pages/20-sim.qml:25
510−msgid "Add a SIM card and restart your device"
511−msgstr "Amiesta una tarxeta SIM y reanicia'l to preséu"
500+#: qml/Wizard/Pages/30-wifi.qml:163
501+msgid "Available Wi-Fi networks"
502+msgstr "Redes Wi-Fi disponibles"
512503
513−#: qml/Wizard/Pages/20-sim.qml:59
514−msgid "Without it, you won’t be able to make calls or use text messaging."
515−msgstr "Ensin ella, nun vas poder facer llamaes nin unviar mensaxes."
504+#: qml/Wizard/Pages/30-wifi.qml:164
505+msgid "No available Wi-Fi networks"
506+msgstr "Nun hai redes Wi-Fi disponibles"
516507
517−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
508+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
509+#: qml/Wizard/Pages/sim.qml:101
518510msgid "Skip"
519511msgstr "Saltar"
520512
521−#: qml/Wizard/Pages/30-passwd-type.qml:39
522−msgid "Lock security"
523−msgstr "Seguranza del bloquéu"
513+#: qml/Wizard/Pages/40-location.qml:27
514+msgid "Location Services"
515+msgstr ""
524516
525−#: qml/Wizard/Pages/30-passwd-type.qml:74
526−msgid "Please select how you’d like to unlock your phone."
527−msgstr "Por favor, esbilla como te prestaría desbloquiar el teléfonu."
517+#: qml/Wizard/Pages/40-location.qml:83
518+msgid ""
519+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
520+"(recommended)"
521+msgstr ""
528522
529−#: qml/Wizard/Pages/30-passwd-type.qml:97
530−msgctxt "Label: Type of security method"
531−msgid "Swipe"
532−msgstr "Eslizar"
523+#: qml/Wizard/Pages/40-location.qml:105
524+#, qt-format
525+msgid "By selecting this option you agree to the Nokia HERE %1."
526+msgstr ""
527+
528+#: qml/Wizard/Pages/40-location.qml:106
529+msgctxt "part of: Nokia HERE terms and conditions"
530+msgid "terms and conditions"
531+msgstr ""
532+
533+#: qml/Wizard/Pages/40-location.qml:160
534+msgid "GPS only"
535+msgstr ""
536+
537+#: qml/Wizard/Pages/40-location.qml:214
538+msgid "Don't use my location"
539+msgstr ""
540+
541+#: qml/Wizard/Pages/40-location.qml:260
542+msgid "You can change it later in System Settings."
543+msgstr ""
533544
534−#: qml/Wizard/Pages/30-passwd-type.qml:98
535−msgctxt "Label: Description of security method"
536−msgid "No security"
537−msgstr "Ensin seguranza"
545+#: qml/Wizard/Pages/50-timezone.qml:29
546+msgid "Time Zone"
547+msgstr "Estaya horaria"
538548
539−#: qml/Wizard/Pages/30-passwd-type.qml:100
549+#: qml/Wizard/Pages/50-timezone.qml:178
550+msgid "Enter your city"
551+msgstr "Escribe la ciudá"
552+
553+#: qml/Wizard/Pages/60-account.qml:24
554+msgid "Personalize Your Device"
555+msgstr "Personaliza'l preséu"
556+
557+#: qml/Wizard/Pages/60-account.qml:48
558+msgid "Preferred Name"
559+msgstr "Nome preferíu"
560+
561+#: qml/Wizard/Pages/70-passwd-type.qml:39
562+msgid "Lock Screen"
563+msgstr "Bloquiar pantalla"
564+
565+#: qml/Wizard/Pages/70-passwd-type.qml:101
540566msgctxt "Label: Type of security method"
541−msgid "Passcode"
542−msgstr "Códigu de pasu"
567+msgid "Create new password"
568+msgstr ""
543569
544−#: qml/Wizard/Pages/30-passwd-type.qml:101
545−msgctxt "Label: Description of security method"
546−msgid "4 digits only"
547−msgstr "Namái 4 díxitos"
570+#: qml/Wizard/Pages/70-passwd-type.qml:103
571+msgctxt "Label: Type of security method"
572+msgid "Create passcode (numbers only)"
573+msgstr ""
548574
549−#: qml/Wizard/Pages/30-passwd-type.qml:103
575+#: qml/Wizard/Pages/70-passwd-type.qml:105
550576msgctxt "Label: Type of security method"
551−msgid "Passphrase"
552−msgstr "Fras de pasu"
577+msgid "No lock code"
578+msgstr ""
553579
554−#: qml/Wizard/Pages/30-passwd-type.qml:104
555−msgctxt "Label: Description of security method"
556−msgid "Numbers and letters"
557−msgstr "Númberos y lletres"
580+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
581+msgid "Privacy Policy"
582+msgstr ""
558583
559−#: qml/Wizard/Pages/40-wifi.qml:29
560−msgid "Connect to Wi‑Fi"
561−msgstr "Coneutase al WiFi"
584+#: qml/Wizard/Pages/75-report-check.qml:26
585+msgid "Help Us Improve"
586+msgstr ""
562587
563−#: qml/Wizard/Pages/40-wifi.qml:168
564−msgid "Available networks…"
565−msgstr "Redes disponibles..."
588+#: qml/Wizard/Pages/75-report-check.qml:59
589+msgid "Improve system performance by sending us crashes and error reports."
590+msgstr ""
591+
592+#: qml/Wizard/Pages/75-report-check.qml:60
593+msgid "Privacy policy"
594+msgstr ""
566595
567−#: qml/Wizard/Pages/40-wifi.qml:169
568−msgid "No available networks."
569−msgstr "Nun hai redes disponibles"
596+#: qml/Wizard/Pages/80-finished.qml:89
597+msgid "Welcome to Ubuntu"
598+msgstr "Bienveníu/a a Ubuntu"
570599
571−#: qml/Wizard/Pages/50-location.qml:27
572−msgid "Location"
573−msgstr "Allugamientu"
600+#: qml/Wizard/Pages/80-finished.qml:104
601+msgid "You are ready to use your device now"
602+msgstr ""
574603
575−#: qml/Wizard/Pages/50-location.qml:62
576−msgid "Let the phone detect your location:"
577−msgstr "Dexar al teléfonu deteutar l'allugamientu:"
604+#: qml/Wizard/Pages/80-finished.qml:124
605+msgid "Get Started"
606+msgstr "Primeros pasos"
578607
579−#: qml/Wizard/Pages/50-location.qml:69
580−msgid "Using GPS only (less accurate)"
581−msgstr "Namái usando GPS (menos precisión)"
608+#: qml/Wizard/Pages/here-terms.qml:25
609+msgid "Terms & Conditions"
610+msgstr "Términos y condiciones"
582611
583−#: qml/Wizard/Pages/50-location.qml:86
584−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
612+#: qml/Wizard/Pages/here-terms.qml:69
613+msgid "Your device uses positioning technologies provided by HERE."
585614msgstr ""
586−"Usando GPS, Wi-fi anónimes ya información de redes móviles (aconseyao)"
587615
588−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
589−#: qml/Wizard/Pages/50-location.qml:103
616+#: qml/Wizard/Pages/here-terms.qml:81
590617msgid ""
591−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
592−"conditions</a>."
618+"To provide you with positioning services and to improve their quality, HERE "
619+"collects information about nearby cell towers and Wi-Fi hotspots around your "
620+"current location whenever your position is being found."
593621msgstr ""
594−"Esbillando esta opción aceutes los <a href='#'>términos y condiciones</a> de "
595−"Nokia HERE."
596622
597−#: qml/Wizard/Pages/50-location.qml:112
598−msgid "Not at all"
599−msgstr "De nengún mou"
623+#: qml/Wizard/Pages/here-terms.qml:93
624+msgid ""
625+"The information collected is used to analyze the service and to improve the "
626+"use of service, but not to identify you personally."
627+msgstr ""
600628
601−#: qml/Wizard/Pages/50-location.qml:124
602−msgid "You can change your mind later in <b>System Settings</b>."
603−msgstr "Pues cambialo dempués n'<b>Axustes del sistema</b>."
629+#: qml/Wizard/Pages/here-terms.qml:106
630+#, qt-format
631+msgid "By continuing, you agree to the HERE platform %1 and %2."
632+msgstr ""
604633
605−#: qml/Wizard/Pages/60-reporting.qml:26
606−msgid "Improving your experience"
607−msgstr "Ameyorando la to esperiencia"
634+#: qml/Wizard/Pages/here-terms.qml:107
635+msgid "Service Terms"
636+msgstr ""
608637
609−#: qml/Wizard/Pages/60-reporting.qml:46
610−msgid ""
611−"Your phone is set up to automatically report errors to Canonical and its "
612−"partners, the makers of the operating system."
638+#: qml/Wizard/Pages/passcode-confirm.qml:43
639+#: qml/Wizard/Pages/passcode-desktop.qml:80
640+msgid "Confirm passcode"
641+msgstr "Confirmar códigu de pasu"
642+
643+#: qml/Wizard/Pages/passcode-confirm.qml:45
644+msgid "Incorrect passcode."
613645msgstr ""
614−"El teléfonu ta configuráu pa informar automáticamente de los fallos a "
615−"Canonical y asociaos, los fabricantes del sistema operativu."
616646
617−#: qml/Wizard/Pages/60-reporting.qml:53
618−msgid ""
619−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
620−"Privacy</b>"
647+#: qml/Wizard/Pages/passcode-confirm.qml:45
648+msgctxt "Enter the passcode again"
649+msgid "Please re-enter."
650+msgstr ""
651+
652+#: qml/Wizard/Pages/passcode-desktop.qml:30
653+msgid "Lock Screen Passcode"
621654msgstr ""
622−"Esto pue deshabilitase nos <b>Axustes del sistema</b> en <b>Seguranza y "
623−"privacidá</b>"
624655
625−#: qml/Wizard/Pages/80-finished.qml:24
626−msgid "All done"
627−msgstr "Too fecho"
656+#: qml/Wizard/Pages/passcode-desktop.qml:56
657+msgid "Enter 4 numbers to setup your passcode"
658+msgstr ""
628659
629−#: qml/Wizard/Pages/80-finished.qml:39
630−msgid "Nice work!"
631−msgstr "¡Bon trabayu!"
660+#: qml/Wizard/Pages/passcode-desktop.qml:65
661+#: qml/Wizard/Pages/passcode-set.qml:54
662+msgid "Choose passcode"
663+msgstr ""
632664
633−#: qml/Wizard/Pages/80-finished.qml:46
634−msgid "Your phone is now ready to use."
635−msgstr "El teléfonu yá ta tresnáu pa usase."
665+#: qml/Wizard/Pages/passcode-desktop.qml:105
666+msgid "Passcode too short"
667+msgstr ""
636668
637−#: qml/Wizard/Pages/80-finished.qml:53
638−msgid "Finish"
639−msgstr "Finar"
669+#: qml/Wizard/Pages/passcode-desktop.qml:107
670+msgid "Passcodes match"
671+msgstr ""
640672
641−#: qml/Wizard/Pages/here-terms.qml:27
642−msgid "Terms & Conditions"
643−msgstr "Términos y condiciones"
673+#: qml/Wizard/Pages/passcode-desktop.qml:109
674+msgid "Passcodes do not match"
675+msgstr ""
644676
645−#: qml/Wizard/Pages/passwd-confirm.qml:49
646−msgid "Confirm passphrase"
647−msgstr "Confirmar frase de pasu"
677+#: qml/Wizard/Pages/passcode-set.qml:62
678+msgid "Passcode must be 4 characters long"
679+msgstr ""
648680
649−#: qml/Wizard/Pages/passwd-confirm.qml:50
650−msgid "Confirm passcode"
651−msgstr "Confirmar códigu de pasu"
681+#: qml/Wizard/Pages/password-set.qml:30
682+msgid "Lock Screen Password"
683+msgstr ""
652684
653−#: qml/Wizard/Pages/passwd-confirm.qml:53
654−#: qml/Wizard/Pages/passwd-confirm.qml:54
655−msgid "Please try again."
656−msgstr "Por favor, vuelvi a intentalo."
685+#: qml/Wizard/Pages/password-set.qml:61
686+msgid "Enter at least 8 characters"
687+msgstr ""
657688
658−#: qml/Wizard/Pages/passwd-set.qml:61
659−msgid "Choose your passcode"
660−msgstr "Escueyi'l to códigu de pasu"
689+#: qml/Wizard/Pages/password-set.qml:73
690+msgid "Choose password"
691+msgstr ""
661692
662−#: qml/Wizard/Pages/passwd-set.qml:68
663−msgid "Passphrase must be 4 characters long"
664−msgstr "La fras de pasu tien de ser 4 caráuteres de llargor"
693+#: qml/Wizard/Pages/password-set.qml:103
694+msgid "Confirm password"
695+msgstr "Confirmar contraseña"
665696
666−#. Translators: This is the arrow for "Back" buttons
667−#: qml/Wizard/StackButton.qml:39
668−#, qt-format
669−msgid "〈 %1"
670−msgstr "〈 %1"
697+#: qml/Wizard/Pages/sim.qml:27
698+msgid "No SIM card installed"
699+msgstr ""
671700
672−#. Translators: This is the arrow for "Forward" buttons
673−#: qml/Wizard/StackButton.qml:42
674−#, qt-format
675−msgid "%1 〉"
676−msgstr "%1 〉"
701+#: qml/Wizard/Pages/sim.qml:54
702+msgid "SIM card added"
703+msgstr ""
704+
705+#: qml/Wizard/Pages/sim.qml:55
706+msgid "You must restart the device to access the mobile network."
707+msgstr ""
708+
709+#: qml/Wizard/Pages/sim.qml:59
710+msgid "Restart"
711+msgstr "Reaniciar"
712+
713+#: qml/Wizard/Pages/sim.qml:78
714+msgid "You won’t be able to make calls or use text messaging without a SIM."
715+msgstr ""
716+
717+#: qml/Wizard/Pages/sim.qml:90
718+msgid "To proceed with no SIM tap Skip."
719+msgstr ""
720+
721+#: qml/Wizard/PasswordMeter.qml:87
722+msgid "Passwords match"
723+msgstr ""
724+
725+#: qml/Wizard/PasswordMeter.qml:89
726+msgid "Passwords do not match"
727+msgstr ""
728+
729+#: qml/Wizard/PasswordMeter.qml:93
730+msgid "Strong password"
731+msgstr "Contraseña fuerte"
732+
733+#: qml/Wizard/PasswordMeter.qml:95
734+msgid "Fair password"
735+msgstr "Contraseña aceutable"
736+
737+#: qml/Wizard/PasswordMeter.qml:97
738+msgid "Weak password"
739+msgstr "Contraseña feble"
740+
741+#: qml/Wizard/PasswordMeter.qml:99
742+msgid "Very weak password"
743+msgstr "Contraseña feble enforma"
677744
678745#~ msgid "Skip intro"
679746#~ msgstr "Omitir la intro"
@@ -725,6 +792,9 @@ msgstr "%1 〉"
725792#~ msgid "Search"
726793#~ msgstr "Guetar"
727794
795+#~ msgid "See less"
796+#~ msgstr "Ver menos"
797+
728798#~ msgid ""
729799#~ "You have now mastered the edge gestures and can start using the "
730800#~ "phone<br><br>Tap on the screen to start"
@@ -732,6 +802,9 @@ msgstr "%1 〉"
732802#~ "Agora yá domines los xestos de los berbesos y pues entamar a usar el "
733803#~ "teléfonu<br><br>Toca la pantalla pa comenzar"
734804
805+#~ msgid "See all"
806+#~ msgstr "Ver too"
807+
735808#~ msgid "Power"
736809#~ msgstr "Enerxía"
737810
@@ -759,18 +832,204 @@ msgstr "%1 〉"
759832#~ msgid "All"
760833#~ msgstr "Too"
761834
835+#~ msgid "Unlock SIM"
836+#~ msgstr "Desbloquiar SIM"
837+
762838#~ msgid "Store"
763839#~ msgstr "Tienda"
764840
765−#~ msgid "Restart"
766−#~ msgstr "Reaniciar"
841+#~ msgid "Roaming"
842+#~ msgstr "Roaming"
767843
768844#~ msgid "Manage Scopes"
769845#~ msgstr "Xestionar ámbitos"
770846
847+#~ msgid "Continue"
848+#~ msgstr "Siguir"
849+
850+#~ msgid "Without it, you won’t be able to make calls or use text messaging."
851+#~ msgstr "Ensin ella, nun vas poder facer llamaes nin unviar mensaxes."
852+
853+#~ msgid "You can change your mind later in <b>System Settings</b>."
854+#~ msgstr "Pues cambialo dempués n'<b>Axustes del sistema</b>."
855+
856+#~ msgid "Available networks…"
857+#~ msgstr "Redes disponibles..."
858+
859+#~ msgid "No available networks."
860+#~ msgstr "Nun hai redes disponibles"
861+
862+#~ msgid "Using GPS only (less accurate)"
863+#~ msgstr "Namái usando GPS (menos precisión)"
864+
865+#~ msgid ""
866+#~ "Your phone is set up to automatically report errors to Canonical and its "
867+#~ "partners, the makers of the operating system."
868+#~ msgstr ""
869+#~ "El teléfonu ta configuráu pa informar automáticamente de los fallos a "
870+#~ "Canonical y asociaos, los fabricantes del sistema operativu."
871+
872+#~ msgid "All done"
873+#~ msgstr "Too fecho"
874+
875+#~ msgid "Finish"
876+#~ msgstr "Finar"
877+
878+#~ msgid "Not at all"
879+#~ msgstr "De nengún mou"
880+
881+#, qt-format
882+#~ msgid "〈 %1"
883+#~ msgstr "〈 %1"
884+
885+#, qt-format
886+#~ msgid "%1 〉"
887+#~ msgstr "%1 〉"
888+
889+#~ msgid "Open the launcher"
890+#~ msgstr "Abrir el llanzador"
891+
892+#~ msgid "Tap here to continue."
893+#~ msgstr "Toca equí pa siguir."
894+
895+#~ msgid "Open special menus"
896+#~ msgstr "Abrir menús especiales"
897+
898+#~ msgid "Tap here to finish."
899+#~ msgstr "Toca equí pa finar."
900+
901+#~ msgctxt "Button: Shut down the system"
902+#~ msgid "Shut down"
903+#~ msgstr "Apagar"
904+
905+#~ msgctxt "Button: Reboot the system"
906+#~ msgid "Reboot"
907+#~ msgstr "Reaniciar"
908+
909+#~ msgid "These are the shortcuts to favorite apps"
910+#~ msgstr "Estos son los atayos a les aplicaciones favorites"
911+
912+#~ msgctxt "Label: Type of security method"
913+#~ msgid "Passcode"
914+#~ msgstr "Códigu de pasu"
915+
916+#~ msgid "To view open apps"
917+#~ msgstr "Pa ver aplicaciones abiertes"
918+
919+#~ msgid "Are you sure you want to shut down?"
920+#~ msgstr "¿De xuru que quies apagar?"
921+
922+#~ msgctxt "Title: Reboot/Shut down dialog"
923+#~ msgid "Shut down"
924+#~ msgstr "Apagáu"
925+
771926#~ msgid "Please re-enter"
772927#~ msgstr "Por favor, reintroduzla"
773928
929+#~ msgid "This action does different things for different apps"
930+#~ msgstr "Esta aición fai coses distintes p'aplicaciones estremaes"
931+
932+#~ msgid "Swipe up from the bottom edge."
933+#~ msgstr "Esliza dende'l berbesu d'embaxo."
934+
935+#~ msgid "Long swipe from the right edge."
936+#~ msgstr "Eslizamientu llargu dende'l berbesu drechu."
937+
938+#~ msgid "View all your running tasks."
939+#~ msgstr "Mira toles tos aplicaciones n'execución."
940+
941+#~ msgid "Try again."
942+#~ msgstr "Intentar de nueves"
943+
944+#~ msgid "You almost got it!"
945+#~ msgstr "¡Yá cuasi finamos!"
946+
947+#~ msgid "Short swipe from the left edge."
948+#~ msgstr "Esliza un poco dende'l berbesu esquierdu."
949+
950+#~ msgid "Hi!"
951+#~ msgstr "¡Hola!"
952+
953+#~ msgid "Lock security"
954+#~ msgstr "Seguranza del bloquéu"
955+
956+#~ msgid "Add a SIM card and restart your device"
957+#~ msgstr "Amiesta una tarxeta SIM y reanicia'l to preséu"
958+
959+#~ msgid "Please select how you’d like to unlock your phone."
960+#~ msgstr "Por favor, esbilla como te prestaría desbloquiar el teléfonu."
961+
962+#~ msgctxt "Label: Description of security method"
963+#~ msgid "No security"
964+#~ msgstr "Ensin seguranza"
965+
966+#~ msgctxt "Label: Type of security method"
967+#~ msgid "Swipe"
968+#~ msgstr "Eslizar"
969+
970+#~ msgid "Welcome to your Ubuntu phone."
971+#~ msgstr "Bienllegáu/ada al to teléfonu d'Ubuntu"
972+
973+#~ msgid "Let’s get started."
974+#~ msgstr "Entamemos."
975+
976+#~ msgctxt "Label: Description of security method"
977+#~ msgid "4 digits only"
978+#~ msgstr "Namái 4 díxitos"
979+
980+#~ msgid "Let the phone detect your location:"
981+#~ msgstr "Dexar al teléfonu deteutar l'allugamientu:"
982+
983+#~ msgid "Location"
984+#~ msgstr "Allugamientu"
985+
986+#~ msgctxt "Label: Type of security method"
987+#~ msgid "Passphrase"
988+#~ msgstr "Fras de pasu"
989+
990+#~ msgctxt "Label: Description of security method"
991+#~ msgid "Numbers and letters"
992+#~ msgstr "Númberos y lletres"
993+
994+#~ msgid "Improving your experience"
995+#~ msgstr "Ameyorando la to esperiencia"
996+
997+#~ msgid ""
998+#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
999+#~ "Privacy</b>"
1000+#~ msgstr ""
1001+#~ "Esto pue deshabilitase nos <b>Axustes del sistema</b> en <b>Seguranza y "
1002+#~ "privacidá</b>"
1003+
1004+#~ msgid "Nice work!"
1005+#~ msgstr "¡Bon trabayu!"
1006+
1007+#~ msgid ""
1008+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1009+#~ "conditions</a>."
1010+#~ msgstr ""
1011+#~ "Esbillando esta opción aceutes los <a href='#'>términos y condiciones</a> de "
1012+#~ "Nokia HERE."
1013+
1014+#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1015+#~ msgstr ""
1016+#~ "Usando GPS, Wi-fi anónimes ya información de redes móviles (aconseyao)"
1017+
1018+#~ msgid "Your phone is now ready to use."
1019+#~ msgstr "El teléfonu yá ta tresnáu pa usase."
1020+
1021+#~ msgid "Confirm passphrase"
1022+#~ msgstr "Confirmar frase de pasu"
1023+
1024+#~ msgid "Passphrase must be 4 characters long"
1025+#~ msgstr "La fras de pasu tien de ser 4 caráuteres de llargor"
1026+
1027+#~ msgid "Choose your passcode"
1028+#~ msgstr "Escueyi'l to códigu de pasu"
1029+
1030+#~ msgid "Please try again."
1031+#~ msgstr "Por favor, vuelvi a intentalo."
1032+
7741033#~ msgid "%a %H:%M"
7751034#~ msgstr "%a %H:%M"
7761035
po/az.po+295−206
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
1111"PO-Revision-Date: 2014-09-03 16:39+0000\n"
1212"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,23 +15,23 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-12-12 05:44+0000\n"
19−"X-Generator: Launchpad (build 17865)\n"
18+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
2323msgstr "Şifrә: "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:47
26−#: plugins/Unity/Launcher/launcheritem.cpp:106
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
2727msgid "Pin shortcut"
2828msgstr "Pin qısayolu"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:52
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
3232msgstr ""
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:106
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
3636msgstr "Açma qısayolu"
3737
@@ -73,77 +73,59 @@ msgctxt "Button: Log out from the system"
7373msgid "Log Out"
7474msgstr ""
7575
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
77−#: qml/Components/Dialogs.qml:253
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
78+#: qml/Wizard/Pages/passcode-set.qml:32
7879msgid "Cancel"
7980msgstr "İmtina"
8081
8182#: qml/Components/Dialogs.qml:173
82−msgctxt "Title: Reboot/Shut down dialog"
83−msgid "Shut down"
84−msgstr ""
85−
86−#: qml/Components/Dialogs.qml:174
87−msgid "Are you sure you want to shut down?"
88−msgstr "Sistemi söndürmәk istәdiyinizә әminsiniz?"
89−
90−#: qml/Components/Dialogs.qml:176
91−msgctxt "Button: Reboot the system"
92−msgid "Reboot"
93−msgstr ""
94−
95−#: qml/Components/Dialogs.qml:185
96−msgctxt "Button: Shut down the system"
97−msgid "Shut down"
98−msgstr ""
99−
100−#: qml/Components/Dialogs.qml:207
10183msgctxt "Title: Reboot dialog"
10284msgid "Reboot"
10385msgstr ""
10486
105−#: qml/Components/Dialogs.qml:208
87+#: qml/Components/Dialogs.qml:174
10688msgid "Are you sure you want to reboot?"
10789msgstr "Yenidәn başlatmaq istәdiyinizә әminsiniz?"
10890
109−#: qml/Components/Dialogs.qml:210
91+#: qml/Components/Dialogs.qml:176
11092msgid "No"
11193msgstr "Yox"
11294
113−#: qml/Components/Dialogs.qml:217
95+#: qml/Components/Dialogs.qml:182
11496msgid "Yes"
11597msgstr "Hə"
11698
117−#: qml/Components/Dialogs.qml:232
99+#: qml/Components/Dialogs.qml:197
118100msgctxt "Title: Power off/Restart dialog"
119101msgid "Power"
120102msgstr ""
121103
122−#: qml/Components/Dialogs.qml:233
104+#: qml/Components/Dialogs.qml:198
123105msgid ""
124106"Are you sure you would like\n"
125107"to power off?"
126108msgstr ""
127109
128−#: qml/Components/Dialogs.qml:235
110+#: qml/Components/Dialogs.qml:200
129111msgctxt "Button: Power off the system"
130112msgid "Power off"
131113msgstr ""
132114
133−#: qml/Components/Dialogs.qml:244
115+#: qml/Components/Dialogs.qml:209
134116msgctxt "Button: Restart the system"
135117msgid "Restart"
136118msgstr ""
137119
138−#: qml/Components/Lockscreen.qml:245
120+#: qml/Components/Lockscreen.qml:231
139121msgid "Return to Call"
140122msgstr ""
141123
142−#: qml/Components/Lockscreen.qml:245
124+#: qml/Components/Lockscreen.qml:231
143125msgid "Emergency Call"
144126msgstr "Zərurət zəngi"
145127
146−#: qml/Components/Lockscreen.qml:277
128+#: qml/Components/Lockscreen.qml:263
147129msgid "OK"
148130msgstr "Oldu"
149131
@@ -152,6 +134,8 @@ msgid "Apps may have unsaved data:"
152134msgstr ""
153135
154136#: qml/Components/ModeSwitchWarningDialog.qml:57
137+msgctxt ""
138+"Re-dock means connect the device again to an external screen/mouse/keyboard"
155139msgid "Re-dock, save your work and close these apps to continue."
156140msgstr ""
157141
@@ -171,42 +155,58 @@ msgstr ""
171155msgid "Close all"
172156msgstr ""
173157
174−#: qml/Dash/DashPageHeader.qml:265
158+#: qml/Dash/DashPageHeader.qml:337
175159msgctxt "Button: Open the Ubuntu Store"
176160msgid "Store"
177161msgstr ""
178162
179−#: qml/Dash/DashPageHeader.qml:272
163+#: qml/Dash/DashPageHeader.qml:344
180164msgctxt "Button: Start a search in the current dash scope"
181165msgid "Search"
182166msgstr ""
183167
184−#: qml/Dash/DashPageHeader.qml:282
168+#: qml/Dash/DashPageHeader.qml:354
185169msgctxt "Button: Show the current dash scope settings"
186170msgid "Settings"
187171msgstr ""
188172
189−#: qml/Dash/DashPageHeader.qml:289
173+#: qml/Dash/DashPageHeader.qml:361
190174msgid "Remove from Favorites"
191175msgstr "Seçilmişlәrdәn çıxart"
192176
193−#: qml/Dash/DashPageHeader.qml:289
177+#: qml/Dash/DashPageHeader.qml:361
194178msgid "Add to Favorites"
195179msgstr "Seçilmişlәrә әlavә et"
196180
197−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
198−msgid "See less"
199−msgstr "Daha azını gör"
181+#: qml/Dash/FiltersPopover.qml:60
182+msgid "Refine your results"
183+msgstr ""
184+
185+#: qml/Dash/FiltersPopover.qml:69
186+msgid "Reset"
187+msgstr ""
200188
201−#: qml/Dash/GenericScopeView.qml:576
202−msgid "See all"
203−msgstr "Hamısını gör"
189+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190+msgid "Show less"
191+msgstr ""
192+
193+#: qml/Dash/GenericScopeView.qml:570
194+msgid "Show all"
195+msgstr ""
204196
205−#: qml/Dash/GenericScopeView.qml:638
197+#: qml/Dash/GenericScopeView.qml:627
206198msgctxt "Label: Hint for dash search line edit"
207199msgid "Search"
208200msgstr ""
209201
202+#: qml/Dash/PageHeaderExtraPanel.qml:55
203+msgid "Recent Searches"
204+msgstr ""
205+
206+#: qml/Dash/PageHeaderExtraPanel.qml:66
207+msgid "Clear All"
208+msgstr ""
209+
210210#: qml/Dash/Previews/PreviewActionCombo.qml:35
211211msgid "More..."
212212msgstr "Daha çox..."
@@ -228,7 +228,7 @@ msgstr "Qiymәtlәndir"
228228msgid "Add a review"
229229msgstr "Rəy yaz"
230230
231−#: qml/Dash/Previews/PreviewSharing.qml:51
231+#: qml/Dash/Previews/PreviewSharing.qml:66
232232msgid "Preview Share Item"
233233msgstr ""
234234
@@ -256,27 +256,29 @@ msgstr ""
256256msgid "Also installed"
257257msgstr ""
258258
259−#: qml/DisabledScreenNotice.qml:42
260−msgid "Your device is now connected to an external display."
259+#: qml/DisabledScreenNotice.qml:104
260+msgid ""
261+"Your device is now connected to an external display. Use this screen as a "
262+"touch pad to interact with the pointer."
261263msgstr ""
262264
263−#: qml/Greeter/CoverPage.qml:107
265+#: qml/Greeter/CoverPage.qml:118
264266msgid "Unlock"
265267msgstr ""
266268
267−#: qml/Greeter/LoginList.qml:236
269+#: qml/Greeter/LoginList.qml:239
268270msgid "Retry"
269271msgstr ""
270272
271−#: qml/Greeter/LoginList.qml:237
273+#: qml/Greeter/LoginList.qml:240
272274msgid "Tap to unlock"
273275msgstr ""
274276
275−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
277+#: qml/Greeter/NarrowView.qml:54
276278msgid "Sorry, incorrect passphrase."
277279msgstr "Bağışlayın, açar söz yanlışdır."
278280
279−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
281+#: qml/Greeter/NarrowView.qml:55
280282msgid "Sorry, incorrect passcode."
281283msgstr "Təəssüf ki, açar kod yanlışdır."
282284
@@ -305,7 +307,7 @@ msgstr ""
305307msgid "Enter %1"
306308msgstr ""
307309
308−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
310+#: qml/Greeter/NarrowView.qml:117
309311msgid "Enter passphrase"
310312msgstr ""
311313
@@ -331,7 +333,7 @@ msgstr ""
331333msgid "Sorry, incorrect passcode"
332334msgstr ""
333335
334−#: qml/Notifications/NotificationMenuItemFactory.qml:129
336+#: qml/Notifications/NotificationMenuItemFactory.qml:124
335337msgid "Show password"
336338msgstr "Şifrәni göstәr"
337339
@@ -343,62 +345,62 @@ msgstr "Zəngə qayıtmaq üçün toxunun..."
343345msgid "Conference"
344346msgstr "Konfrans"
345347
346−#: qml/Panel/Indicators/MenuItemFactory.qml:731
348+#: qml/Panel/Indicators/MenuItemFactory.qml:762
347349msgid "Nothing is playing"
348350msgstr ""
349351
350−#: qml/Panel/Indicators/MenuItemFactory.qml:860
352+#: qml/Panel/Indicators/MenuItemFactory.qml:891
351353#, qt-format
352354msgid "%1 hour"
353355msgid_plural "%1 hours"
354356msgstr[0] ""
355357msgstr[1] ""
356358
357−#: qml/Panel/Indicators/MenuItemFactory.qml:864
359+#: qml/Panel/Indicators/MenuItemFactory.qml:895
358360#, qt-format
359361msgid "%1 minute"
360362msgid_plural "%1 minutes"
361363msgstr[0] ""
362364msgstr[1] ""
363365
364−#: qml/Panel/Indicators/MenuItemFactory.qml:869
366+#: qml/Panel/Indicators/MenuItemFactory.qml:900
365367#, qt-format
366368msgid "%1 second"
367369msgid_plural "%1 seconds"
368370msgstr[0] ""
369371msgstr[1] ""
370372
371−#: qml/Panel/Indicators/MenuItemFactory.qml:872
373+#: qml/Panel/Indicators/MenuItemFactory.qml:903
372374msgid "0 seconds"
373375msgstr ""
374376
375377#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
376−#: qml/Panel/Indicators/MenuItemFactory.qml:874
378+#: qml/Panel/Indicators/MenuItemFactory.qml:905
377379#, qt-format
378380msgid "%1 remaining"
379381msgstr ""
380382
381−#: qml/Panel/Indicators/MenuItemFactory.qml:880
383+#: qml/Panel/Indicators/MenuItemFactory.qml:911
382384msgid "In queue…"
383385msgstr "Növbədədir..."
384386
385−#: qml/Panel/Indicators/MenuItemFactory.qml:884
387+#: qml/Panel/Indicators/MenuItemFactory.qml:915
386388msgid "Downloading"
387389msgstr "Endirilir"
388390
389−#: qml/Panel/Indicators/MenuItemFactory.qml:886
391+#: qml/Panel/Indicators/MenuItemFactory.qml:917
390392msgid "Paused, tap to resume"
391393msgstr "Dayandırıldı. Davam etmək üçün toxunun"
392394
393−#: qml/Panel/Indicators/MenuItemFactory.qml:888
395+#: qml/Panel/Indicators/MenuItemFactory.qml:919
394396msgid "Canceled"
395397msgstr "İmtina edildi"
396398
397−#: qml/Panel/Indicators/MenuItemFactory.qml:890
399+#: qml/Panel/Indicators/MenuItemFactory.qml:921
398400msgid "Finished"
399401msgstr "Bitdi"
400402
401−#: qml/Panel/Indicators/MenuItemFactory.qml:892
403+#: qml/Panel/Indicators/MenuItemFactory.qml:923
402404msgid "Failed, tap to retry"
403405msgstr "Alınmadı. Yenidәn cәhd etmək üçün toxunun"
404406
@@ -418,251 +420,323 @@ msgctxt "Button: Call back on phone"
418420msgid "Call back"
419421msgstr ""
420422
421−#: qml/Panel/Indicators/ModemInfoItem.qml:105
422−msgid "Unlock SIM"
423−msgstr "SIM kilidini aç"
424−
425−#: qml/Panel/Indicators/RoamingIndication.qml:27
426−msgid "Roaming"
427−msgstr "Rominq"
428−
429−#: qml/Tutorial/TutorialBottom.qml:28
430−msgid "Open special menus"
431−msgstr ""
432−
433−#: qml/Tutorial/TutorialBottom.qml:29
434−msgid "Swipe up from the bottom edge."
423+#: qml/Stages/SideStage.qml:76
424+msgid "Drag using 3 fingers any application from one window to the other"
435425msgstr ""
436426
437−#: qml/Tutorial/TutorialBottomFinish.qml:24
438−msgid "This action does different things for different apps"
427+#: qml/Tutorial/TutorialBottom.qml:78
428+msgid "Swipe up to add a contact"
439429msgstr ""
440430
441−#: qml/Tutorial/TutorialBottomFinish.qml:25
442−msgid "Tap here to finish."
431+#: qml/Tutorial/TutorialBottom.qml:80
432+msgid "Swipe up for favorite calculations"
443433msgstr ""
444434
445−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
446−#: qml/Tutorial/TutorialRight.qml:144
447−msgid "Tap here to continue."
435+#: qml/Tutorial/TutorialBottom.qml:82
436+msgid "Swipe up for recent calls"
448437msgstr ""
449438
450−#: qml/Tutorial/TutorialLeft.qml:26
451−msgid "Open the launcher"
439+#: qml/Tutorial/TutorialBottom.qml:84
440+msgid "Swipe up to create a message"
452441msgstr ""
453442
454−#: qml/Tutorial/TutorialLeft.qml:27
455−msgid "Short swipe from the left edge."
443+#: qml/Tutorial/TutorialBottom.qml:85
444+msgid "Swipe up to manage the app"
456445msgstr ""
457446
458−#: qml/Tutorial/TutorialLeftFinish.qml:24
459−msgid "These are the shortcuts to favorite apps"
447+#: qml/Tutorial/TutorialLeftLong.qml:47
448+msgid "Long swipe from the left edge to open the Today scope"
460449msgstr ""
461450
462−#: qml/Tutorial/TutorialPage.qml:178
463−msgid "You almost got it!"
451+#: qml/Tutorial/TutorialLeft.qml:47
452+msgid "Swipe from the left edge to open the launcher"
464453msgstr ""
465454
466−#: qml/Tutorial/TutorialPage.qml:195
467−msgid "Try again."
455+#: qml/Tutorial/TutorialRight.qml:55
456+msgid "Push your mouse against the right edge to view your open apps"
468457msgstr ""
469458
470−#: qml/Tutorial/TutorialRight.qml:31
471−msgid "To view open apps"
459+#: qml/Tutorial/TutorialRight.qml:56
460+msgid "Short or long swipe from the right edge to view your open apps"
472461msgstr ""
473462
474−#: qml/Tutorial/TutorialRight.qml:32
475−msgid "Long swipe from the right edge."
463+#: qml/Tutorial/TutorialTop.qml:53
464+msgid "Swipe from the top right edge to open the notification bar"
476465msgstr ""
477466
478−#: qml/Tutorial/TutorialRight.qml:122
479−msgid "View all your running tasks."
467+#: qml/Tutorial/TutorialTop.qml:54
468+msgid "Swipe from the top edge to open the notification bar"
480469msgstr ""
481470
482−#: qml/Wizard/Page.qml:89
471+#: qml/Wizard/Page.qml:54
483472msgctxt "Button: Go back one page in the Wizard"
484473msgid "Back"
485474msgstr ""
486475
487476#: qml/Wizard/Pages/10-welcome.qml:27
488−msgid "Hi!"
477+msgid "Language"
489478msgstr ""
490479
491−#: qml/Wizard/Pages/10-welcome.qml:44
492−msgid "Welcome to your Ubuntu phone."
480+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
481+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
482+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
483+#: qml/Wizard/Pages/75-report-check.qml:84
484+#: qml/Wizard/Pages/passcode-desktop.qml:124
485+#: qml/Wizard/Pages/password-set.qml:141
486+msgid "Next"
493487msgstr ""
494488
495−#: qml/Wizard/Pages/10-welcome.qml:52
496−msgid "Let’s get started."
489+#: qml/Wizard/Pages/30-wifi.qml:29
490+msgid "Connect to Wi‑Fi"
497491msgstr ""
498492
499−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
500−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
501−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
502−#: qml/Wizard/Pages/passwd-set.qml:90
503−msgid "Continue"
493+#: qml/Wizard/Pages/30-wifi.qml:130
494+msgid "Connected"
504495msgstr ""
505496
506−#: qml/Wizard/Pages/20-sim.qml:25
507−msgid "Add a SIM card and restart your device"
497+#: qml/Wizard/Pages/30-wifi.qml:163
498+msgid "Available Wi-Fi networks"
508499msgstr ""
509500
510−#: qml/Wizard/Pages/20-sim.qml:59
511−msgid "Without it, you won’t be able to make calls or use text messaging."
501+#: qml/Wizard/Pages/30-wifi.qml:164
502+msgid "No available Wi-Fi networks"
512503msgstr ""
513504
514−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
505+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
506+#: qml/Wizard/Pages/sim.qml:101
515507msgid "Skip"
516508msgstr ""
517509
518−#: qml/Wizard/Pages/30-passwd-type.qml:39
519−msgid "Lock security"
510+#: qml/Wizard/Pages/40-location.qml:27
511+msgid "Location Services"
512+msgstr ""
513+
514+#: qml/Wizard/Pages/40-location.qml:83
515+msgid ""
516+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
517+"(recommended)"
518+msgstr ""
519+
520+#: qml/Wizard/Pages/40-location.qml:105
521+#, qt-format
522+msgid "By selecting this option you agree to the Nokia HERE %1."
520523msgstr ""
521524
522−#: qml/Wizard/Pages/30-passwd-type.qml:74
523−msgid "Please select how you’d like to unlock your phone."
525+#: qml/Wizard/Pages/40-location.qml:106
526+msgctxt "part of: Nokia HERE terms and conditions"
527+msgid "terms and conditions"
524528msgstr ""
525529
526−#: qml/Wizard/Pages/30-passwd-type.qml:97
527−msgctxt "Label: Type of security method"
528−msgid "Swipe"
530+#: qml/Wizard/Pages/40-location.qml:160
531+msgid "GPS only"
529532msgstr ""
530533
531−#: qml/Wizard/Pages/30-passwd-type.qml:98
532−msgctxt "Label: Description of security method"
533−msgid "No security"
534+#: qml/Wizard/Pages/40-location.qml:214
535+msgid "Don't use my location"
534536msgstr ""
535537
536−#: qml/Wizard/Pages/30-passwd-type.qml:100
538+#: qml/Wizard/Pages/40-location.qml:260
539+msgid "You can change it later in System Settings."
540+msgstr ""
541+
542+#: qml/Wizard/Pages/50-timezone.qml:29
543+msgid "Time Zone"
544+msgstr ""
545+
546+#: qml/Wizard/Pages/50-timezone.qml:178
547+msgid "Enter your city"
548+msgstr ""
549+
550+#: qml/Wizard/Pages/60-account.qml:24
551+msgid "Personalize Your Device"
552+msgstr ""
553+
554+#: qml/Wizard/Pages/60-account.qml:48
555+msgid "Preferred Name"
556+msgstr ""
557+
558+#: qml/Wizard/Pages/70-passwd-type.qml:39
559+msgid "Lock Screen"
560+msgstr ""
561+
562+#: qml/Wizard/Pages/70-passwd-type.qml:101
537563msgctxt "Label: Type of security method"
538−msgid "Passcode"
564+msgid "Create new password"
539565msgstr ""
540566
541−#: qml/Wizard/Pages/30-passwd-type.qml:101
542−msgctxt "Label: Description of security method"
543−msgid "4 digits only"
567+#: qml/Wizard/Pages/70-passwd-type.qml:103
568+msgctxt "Label: Type of security method"
569+msgid "Create passcode (numbers only)"
544570msgstr ""
545571
546−#: qml/Wizard/Pages/30-passwd-type.qml:103
572+#: qml/Wizard/Pages/70-passwd-type.qml:105
547573msgctxt "Label: Type of security method"
548−msgid "Passphrase"
574+msgid "No lock code"
549575msgstr ""
550576
551−#: qml/Wizard/Pages/30-passwd-type.qml:104
552−msgctxt "Label: Description of security method"
553−msgid "Numbers and letters"
577+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
578+msgid "Privacy Policy"
554579msgstr ""
555580
556−#: qml/Wizard/Pages/40-wifi.qml:29
557−msgid "Connect to Wi‑Fi"
581+#: qml/Wizard/Pages/75-report-check.qml:26
582+msgid "Help Us Improve"
558583msgstr ""
559584
560−#: qml/Wizard/Pages/40-wifi.qml:168
561−msgid "Available networks…"
585+#: qml/Wizard/Pages/75-report-check.qml:59
586+msgid "Improve system performance by sending us crashes and error reports."
562587msgstr ""
563588
564−#: qml/Wizard/Pages/40-wifi.qml:169
565−msgid "No available networks."
589+#: qml/Wizard/Pages/75-report-check.qml:60
590+msgid "Privacy policy"
566591msgstr ""
567592
568−#: qml/Wizard/Pages/50-location.qml:27
569−msgid "Location"
593+#: qml/Wizard/Pages/80-finished.qml:89
594+msgid "Welcome to Ubuntu"
570595msgstr ""
571596
572−#: qml/Wizard/Pages/50-location.qml:62
573−msgid "Let the phone detect your location:"
597+#: qml/Wizard/Pages/80-finished.qml:104
598+msgid "You are ready to use your device now"
574599msgstr ""
575600
576−#: qml/Wizard/Pages/50-location.qml:69
577−msgid "Using GPS only (less accurate)"
601+#: qml/Wizard/Pages/80-finished.qml:124
602+msgid "Get Started"
603+msgstr ""
604+
605+#: qml/Wizard/Pages/here-terms.qml:25
606+msgid "Terms & Conditions"
578607msgstr ""
579608
580−#: qml/Wizard/Pages/50-location.qml:86
581−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
609+#: qml/Wizard/Pages/here-terms.qml:69
610+msgid "Your device uses positioning technologies provided by HERE."
582611msgstr ""
583612
584−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
585−#: qml/Wizard/Pages/50-location.qml:103
613+#: qml/Wizard/Pages/here-terms.qml:81
586614msgid ""
587−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
588−"conditions</a>."
615+"To provide you with positioning services and to improve their quality, HERE "
616+"collects information about nearby cell towers and Wi-Fi hotspots around your "
617+"current location whenever your position is being found."
589618msgstr ""
590619
591−#: qml/Wizard/Pages/50-location.qml:112
592−msgid "Not at all"
620+#: qml/Wizard/Pages/here-terms.qml:93
621+msgid ""
622+"The information collected is used to analyze the service and to improve the "
623+"use of service, but not to identify you personally."
593624msgstr ""
594625
595−#: qml/Wizard/Pages/50-location.qml:124
596−msgid "You can change your mind later in <b>System Settings</b>."
626+#: qml/Wizard/Pages/here-terms.qml:106
627+#, qt-format
628+msgid "By continuing, you agree to the HERE platform %1 and %2."
597629msgstr ""
598630
599−#: qml/Wizard/Pages/60-reporting.qml:26
600−msgid "Improving your experience"
631+#: qml/Wizard/Pages/here-terms.qml:107
632+msgid "Service Terms"
601633msgstr ""
602634
603−#: qml/Wizard/Pages/60-reporting.qml:46
604−msgid ""
605−"Your phone is set up to automatically report errors to Canonical and its "
606−"partners, the makers of the operating system."
635+#: qml/Wizard/Pages/passcode-confirm.qml:43
636+#: qml/Wizard/Pages/passcode-desktop.qml:80
637+msgid "Confirm passcode"
607638msgstr ""
608639
609−#: qml/Wizard/Pages/60-reporting.qml:53
610−msgid ""
611−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
612−"Privacy</b>"
640+#: qml/Wizard/Pages/passcode-confirm.qml:45
641+msgid "Incorrect passcode."
613642msgstr ""
614643
615−#: qml/Wizard/Pages/80-finished.qml:24
616−msgid "All done"
644+#: qml/Wizard/Pages/passcode-confirm.qml:45
645+msgctxt "Enter the passcode again"
646+msgid "Please re-enter."
617647msgstr ""
618648
619−#: qml/Wizard/Pages/80-finished.qml:39
620−msgid "Nice work!"
649+#: qml/Wizard/Pages/passcode-desktop.qml:30
650+msgid "Lock Screen Passcode"
621651msgstr ""
622652
623−#: qml/Wizard/Pages/80-finished.qml:46
624−msgid "Your phone is now ready to use."
653+#: qml/Wizard/Pages/passcode-desktop.qml:56
654+msgid "Enter 4 numbers to setup your passcode"
625655msgstr ""
626656
627−#: qml/Wizard/Pages/80-finished.qml:53
628−msgid "Finish"
657+#: qml/Wizard/Pages/passcode-desktop.qml:65
658+#: qml/Wizard/Pages/passcode-set.qml:54
659+msgid "Choose passcode"
629660msgstr ""
630661
631−#: qml/Wizard/Pages/here-terms.qml:27
632−msgid "Terms & Conditions"
662+#: qml/Wizard/Pages/passcode-desktop.qml:105
663+msgid "Passcode too short"
633664msgstr ""
634665
635−#: qml/Wizard/Pages/passwd-confirm.qml:49
636−msgid "Confirm passphrase"
666+#: qml/Wizard/Pages/passcode-desktop.qml:107
667+msgid "Passcodes match"
637668msgstr ""
638669
639−#: qml/Wizard/Pages/passwd-confirm.qml:50
640−msgid "Confirm passcode"
670+#: qml/Wizard/Pages/passcode-desktop.qml:109
671+msgid "Passcodes do not match"
641672msgstr ""
642673
643−#: qml/Wizard/Pages/passwd-confirm.qml:53
644−#: qml/Wizard/Pages/passwd-confirm.qml:54
645−msgid "Please try again."
674+#: qml/Wizard/Pages/passcode-set.qml:62
675+msgid "Passcode must be 4 characters long"
646676msgstr ""
647677
648−#: qml/Wizard/Pages/passwd-set.qml:61
649−msgid "Choose your passcode"
678+#: qml/Wizard/Pages/password-set.qml:30
679+msgid "Lock Screen Password"
650680msgstr ""
651681
652−#: qml/Wizard/Pages/passwd-set.qml:68
653−msgid "Passphrase must be 4 characters long"
682+#: qml/Wizard/Pages/password-set.qml:61
683+msgid "Enter at least 8 characters"
654684msgstr ""
655685
656−#. Translators: This is the arrow for "Back" buttons
657−#: qml/Wizard/StackButton.qml:39
658−#, qt-format
659−msgid "〈 %1"
686+#: qml/Wizard/Pages/password-set.qml:73
687+msgid "Choose password"
660688msgstr ""
661689
662−#. Translators: This is the arrow for "Forward" buttons
663−#: qml/Wizard/StackButton.qml:42
664−#, qt-format
665−msgid "%1 〉"
690+#: qml/Wizard/Pages/password-set.qml:103
691+msgid "Confirm password"
692+msgstr ""
693+
694+#: qml/Wizard/Pages/sim.qml:27
695+msgid "No SIM card installed"
696+msgstr ""
697+
698+#: qml/Wizard/Pages/sim.qml:54
699+msgid "SIM card added"
700+msgstr ""
701+
702+#: qml/Wizard/Pages/sim.qml:55
703+msgid "You must restart the device to access the mobile network."
704+msgstr ""
705+
706+#: qml/Wizard/Pages/sim.qml:59
707+msgid "Restart"
708+msgstr ""
709+
710+#: qml/Wizard/Pages/sim.qml:78
711+msgid "You won’t be able to make calls or use text messaging without a SIM."
712+msgstr ""
713+
714+#: qml/Wizard/Pages/sim.qml:90
715+msgid "To proceed with no SIM tap Skip."
716+msgstr ""
717+
718+#: qml/Wizard/PasswordMeter.qml:87
719+msgid "Passwords match"
720+msgstr ""
721+
722+#: qml/Wizard/PasswordMeter.qml:89
723+msgid "Passwords do not match"
724+msgstr ""
725+
726+#: qml/Wizard/PasswordMeter.qml:93
727+msgid "Strong password"
728+msgstr ""
729+
730+#: qml/Wizard/PasswordMeter.qml:95
731+msgid "Fair password"
732+msgstr ""
733+
734+#: qml/Wizard/PasswordMeter.qml:97
735+msgid "Weak password"
736+msgstr ""
737+
738+#: qml/Wizard/PasswordMeter.qml:99
739+msgid "Very weak password"
666740msgstr ""
667741
668742#~ msgid "Confirm"
@@ -702,6 +776,9 @@ msgstr ""
702776#~ msgid "Power off"
703777#~ msgstr "Söndür"
704778
779+#~ msgid "See all"
780+#~ msgstr "Hamısını gör"
781+
705782#~ msgid "All"
706783#~ msgstr "Hamısı"
707784
@@ -711,9 +788,18 @@ msgstr ""
711788#~ msgid "Done"
712789#~ msgstr "Başa çatdı"
713790
791+#~ msgid "Unlock SIM"
792+#~ msgstr "SIM kilidini aç"
793+
794+#~ msgid "Roaming"
795+#~ msgstr "Rominq"
796+
714797#~ msgid "Log out"
715798#~ msgstr "Çıxış"
716799
800+#~ msgid "Are you sure you want to shut down?"
801+#~ msgstr "Sistemi söndürmәk istәdiyinizә әminsiniz?"
802+
717803#~ msgid "Shut down"
718804#~ msgstr "Sistemi Söndür"
719805
@@ -742,5 +828,8 @@ msgstr ""
742828#~ msgid "Settings"
743829#~ msgstr "Tənzimləmələr"
744830
831+#~ msgid "See less"
832+#~ msgstr "Daha azını gör"
833+
745834#~ msgid "Type or say a command"
746835#~ msgstr "Bir әmr söyləyin və ya yazın"
po/be.po+524−265
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
1111"PO-Revision-Date: 2015-12-13 13:12+0000\n"
1212"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
1313"Language-Team: Belarusian <be@li.org>\n"
@@ -16,23 +16,23 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2015-12-14 05:32+0000\n"
20−"X-Generator: Launchpad (build 17865)\n"
19+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
2424msgstr "Пароль: "
2525
26−#: plugins/Unity/Launcher/launcheritem.cpp:47
27−#: plugins/Unity/Launcher/launcheritem.cpp:106
26+#: plugins/Unity/Launcher/launcheritem.cpp:48
27+#: plugins/Unity/Launcher/launcheritem.cpp:107
2828msgid "Pin shortcut"
2929msgstr "Замацаваць кнопку"
3030
31−#: plugins/Unity/Launcher/launcheritem.cpp:52
31+#: plugins/Unity/Launcher/launcheritem.cpp:53
3232msgid "Quit"
3333msgstr "Выйсці"
3434
35−#: plugins/Unity/Launcher/launcheritem.cpp:106
35+#: plugins/Unity/Launcher/launcheritem.cpp:107
3636msgid "Unpin shortcut"
3737msgstr "Адмацаваць кнопку"
3838
@@ -78,53 +78,35 @@ msgctxt "Button: Log out from the system"
7878msgid "Log Out"
7979msgstr "Выйсці"
8080
81−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
82−#: qml/Components/Dialogs.qml:253
81+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
82+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
83+#: qml/Wizard/Pages/passcode-set.qml:32
8384msgid "Cancel"
8485msgstr "Скасаваць"
8586
8687#: qml/Components/Dialogs.qml:173
87−msgctxt "Title: Reboot/Shut down dialog"
88−msgid "Shut down"
89−msgstr "Выключыць"
90−
91−#: qml/Components/Dialogs.qml:174
92−msgid "Are you sure you want to shut down?"
93−msgstr "Вы ўпэўненыя, што жадаеце выключыць прыладу?"
94−
95−#: qml/Components/Dialogs.qml:176
96−msgctxt "Button: Reboot the system"
97−msgid "Reboot"
98−msgstr "Перазагрузіць"
99−
100−#: qml/Components/Dialogs.qml:185
101−msgctxt "Button: Shut down the system"
102−msgid "Shut down"
103−msgstr "Выключыць"
104−
105−#: qml/Components/Dialogs.qml:207
10688msgctxt "Title: Reboot dialog"
10789msgid "Reboot"
10890msgstr "Перазагрузіць"
10991
110−#: qml/Components/Dialogs.qml:208
92+#: qml/Components/Dialogs.qml:174
11193msgid "Are you sure you want to reboot?"
11294msgstr "Вы ўпэўнены, што жадаеце перазагрузіць?"
11395
114−#: qml/Components/Dialogs.qml:210
96+#: qml/Components/Dialogs.qml:176
11597msgid "No"
11698msgstr "Не"
11799
118−#: qml/Components/Dialogs.qml:217
100+#: qml/Components/Dialogs.qml:182
119101msgid "Yes"
120102msgstr "Так"
121103
122−#: qml/Components/Dialogs.qml:232
104+#: qml/Components/Dialogs.qml:197
123105msgctxt "Title: Power off/Restart dialog"
124106msgid "Power"
125107msgstr "Сілкаванне"
126108
127−#: qml/Components/Dialogs.qml:233
109+#: qml/Components/Dialogs.qml:198
128110msgid ""
129111"Are you sure you would like\n"
130112"to power off?"
@@ -132,25 +114,25 @@ msgstr ""
132114"Вы ўпэўнены, што хочаце\n"
133115"выключыць камп'ютэр?"
134116
135−#: qml/Components/Dialogs.qml:235
117+#: qml/Components/Dialogs.qml:200
136118msgctxt "Button: Power off the system"
137119msgid "Power off"
138120msgstr "Выключыць"
139121
140−#: qml/Components/Dialogs.qml:244
122+#: qml/Components/Dialogs.qml:209
141123msgctxt "Button: Restart the system"
142124msgid "Restart"
143125msgstr "Перазапуск"
144126
145−#: qml/Components/Lockscreen.qml:245
127+#: qml/Components/Lockscreen.qml:231
146128msgid "Return to Call"
147129msgstr "Вярнуцца да выкліку"
148130
149−#: qml/Components/Lockscreen.qml:245
131+#: qml/Components/Lockscreen.qml:231
150132msgid "Emergency Call"
151133msgstr "Терміновы выклік"
152134
153−#: qml/Components/Lockscreen.qml:277
135+#: qml/Components/Lockscreen.qml:263
154136msgid "OK"
155137msgstr "Добра"
156138
@@ -159,8 +141,10 @@ msgid "Apps may have unsaved data:"
159141msgstr "Прылады могуць мець незахованыя дадзеныя:"
160142
161143#: qml/Components/ModeSwitchWarningDialog.qml:57
144+msgctxt ""
145+"Re-dock means connect the device again to an external screen/mouse/keyboard"
162146msgid "Re-dock, save your work and close these apps to continue."
163−msgstr "Захавайце сваю працу і зачыніце прылады, каб працягнуць."
147+msgstr ""
164148
165149#: qml/Components/ModeSwitchWarningDialog.qml:63
166150msgid "Or force close now (unsaved data will be lost)."
@@ -178,42 +162,58 @@ msgstr "Перападлучыцца зараз!"
178162msgid "Close all"
179163msgstr "Зачыніць усё"
180164
181−#: qml/Dash/DashPageHeader.qml:265
165+#: qml/Dash/DashPageHeader.qml:337
182166msgctxt "Button: Open the Ubuntu Store"
183167msgid "Store"
184168msgstr "Крама"
185169
186−#: qml/Dash/DashPageHeader.qml:272
170+#: qml/Dash/DashPageHeader.qml:344
187171msgctxt "Button: Start a search in the current dash scope"
188172msgid "Search"
189173msgstr "Пошук"
190174
191−#: qml/Dash/DashPageHeader.qml:282
175+#: qml/Dash/DashPageHeader.qml:354
192176msgctxt "Button: Show the current dash scope settings"
193177msgid "Settings"
194178msgstr "Налады"
195179
196−#: qml/Dash/DashPageHeader.qml:289
180+#: qml/Dash/DashPageHeader.qml:361
197181msgid "Remove from Favorites"
198182msgstr "Выдаліць з абранага"
199183
200−#: qml/Dash/DashPageHeader.qml:289
184+#: qml/Dash/DashPageHeader.qml:361
201185msgid "Add to Favorites"
202186msgstr "Дадаць да абранага"
203187
204−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
205−msgid "See less"
206−msgstr "Карацей"
188+#: qml/Dash/FiltersPopover.qml:60
189+msgid "Refine your results"
190+msgstr ""
191+
192+#: qml/Dash/FiltersPopover.qml:69
193+msgid "Reset"
194+msgstr ""
207195
208−#: qml/Dash/GenericScopeView.qml:576
209−msgid "See all"
210−msgstr "Больш падрабязна"
196+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
197+msgid "Show less"
198+msgstr ""
211199
212−#: qml/Dash/GenericScopeView.qml:638
200+#: qml/Dash/GenericScopeView.qml:570
201+msgid "Show all"
202+msgstr ""
203+
204+#: qml/Dash/GenericScopeView.qml:627
213205msgctxt "Label: Hint for dash search line edit"
214206msgid "Search"
215207msgstr "Пошук"
216208
209+#: qml/Dash/PageHeaderExtraPanel.qml:55
210+msgid "Recent Searches"
211+msgstr ""
212+
213+#: qml/Dash/PageHeaderExtraPanel.qml:66
214+msgid "Clear All"
215+msgstr ""
216+
217217#: qml/Dash/Previews/PreviewActionCombo.qml:35
218218msgid "More..."
219219msgstr "Болей…"
@@ -235,9 +235,9 @@ msgstr "Ацаніць"
235235msgid "Add a review"
236236msgstr "Дадаць рэцэнзію"
237237
238−#: qml/Dash/Previews/PreviewSharing.qml:51
238+#: qml/Dash/Previews/PreviewSharing.qml:66
239239msgid "Preview Share Item"
240−msgstr "Падзяліцца праглядаймым"
240+msgstr "Праглядзець элемент"
241241
242242#: qml/Dash/PullToRefreshScopeStyle.qml:55
243243msgid "Pull to refresh…"
@@ -263,27 +263,29 @@ msgstr "Хатняя папка"
263263msgid "Also installed"
264264msgstr "Таксама ўсталявана"
265265
266−#: qml/DisabledScreenNotice.qml:42
267−msgid "Your device is now connected to an external display."
268−msgstr "Прылада падлучана да вонкавага дысплэю."
266+#: qml/DisabledScreenNotice.qml:104
267+msgid ""
268+"Your device is now connected to an external display. Use this screen as a "
269+"touch pad to interact with the pointer."
270+msgstr ""
269271
270−#: qml/Greeter/CoverPage.qml:107
272+#: qml/Greeter/CoverPage.qml:118
271273msgid "Unlock"
272274msgstr "Разблакаваць"
273275
274−#: qml/Greeter/LoginList.qml:236
276+#: qml/Greeter/LoginList.qml:239
275277msgid "Retry"
276278msgstr "Паспрабаваць зноў"
277279
278−#: qml/Greeter/LoginList.qml:237
280+#: qml/Greeter/LoginList.qml:240
279281msgid "Tap to unlock"
280282msgstr "Націсніце, каб разблакаваць"
281283
282−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
284+#: qml/Greeter/NarrowView.qml:54
283285msgid "Sorry, incorrect passphrase."
284286msgstr "Даруйце, няслушны пароль."
285287
286−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
288+#: qml/Greeter/NarrowView.qml:55
287289msgid "Sorry, incorrect passcode."
288290msgstr "Даруйце, няслушны код."
289291
@@ -312,7 +314,7 @@ msgstr ""
312314msgid "Enter %1"
313315msgstr "Увядзіце %1"
314316
315−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
317+#: qml/Greeter/NarrowView.qml:117
316318msgid "Enter passphrase"
317319msgstr "Увядзіце пароль"
318320
@@ -338,7 +340,7 @@ msgstr "Калі ласка, паўтарыце ўвод"
338340msgid "Sorry, incorrect passcode"
339341msgstr "Даруйце, некарэктны код"
340342
341−#: qml/Notifications/NotificationMenuItemFactory.qml:129
343+#: qml/Notifications/NotificationMenuItemFactory.qml:124
342344msgid "Show password"
343345msgstr "Паказаць пароль"
344346
@@ -350,11 +352,11 @@ msgstr "Націсніце, каб вярнуцца да выкліку..."
350352msgid "Conference"
351353msgstr "Канферэнцыя"
352354
353−#: qml/Panel/Indicators/MenuItemFactory.qml:731
355+#: qml/Panel/Indicators/MenuItemFactory.qml:762
354356msgid "Nothing is playing"
355357msgstr "Нічога не грае"
356358
357−#: qml/Panel/Indicators/MenuItemFactory.qml:860
359+#: qml/Panel/Indicators/MenuItemFactory.qml:891
358360#, qt-format
359361msgid "%1 hour"
360362msgid_plural "%1 hours"
@@ -362,7 +364,7 @@ msgstr[0] "%1 гадзіна"
362364msgstr[1] "%1 гадзіны"
363365msgstr[2] "%1 гадзінаў"
364366
365−#: qml/Panel/Indicators/MenuItemFactory.qml:864
367+#: qml/Panel/Indicators/MenuItemFactory.qml:895
366368#, qt-format
367369msgid "%1 minute"
368370msgid_plural "%1 minutes"
@@ -370,7 +372,7 @@ msgstr[0] "%1 хвіліна"
370372msgstr[1] "%1 хвіліны"
371373msgstr[2] "%1 хвілінаў"
372374
373−#: qml/Panel/Indicators/MenuItemFactory.qml:869
375+#: qml/Panel/Indicators/MenuItemFactory.qml:900
374376#, qt-format
375377msgid "%1 second"
376378msgid_plural "%1 seconds"
@@ -378,37 +380,37 @@ msgstr[0] "%1 секунда"
378380msgstr[1] "%1 секунды"
379381msgstr[2] "%1 секундаў"
380382
381−#: qml/Panel/Indicators/MenuItemFactory.qml:872
383+#: qml/Panel/Indicators/MenuItemFactory.qml:903
382384msgid "0 seconds"
383385msgstr "0 секунд"
384386
385387#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
386−#: qml/Panel/Indicators/MenuItemFactory.qml:874
388+#: qml/Panel/Indicators/MenuItemFactory.qml:905
387389#, qt-format
388390msgid "%1 remaining"
389391msgstr "%1 засталося"
390392
391−#: qml/Panel/Indicators/MenuItemFactory.qml:880
393+#: qml/Panel/Indicators/MenuItemFactory.qml:911
392394msgid "In queue…"
393395msgstr "У чарзе..."
394396
395−#: qml/Panel/Indicators/MenuItemFactory.qml:884
397+#: qml/Panel/Indicators/MenuItemFactory.qml:915
396398msgid "Downloading"
397399msgstr "Запампоўка"
398400
399−#: qml/Panel/Indicators/MenuItemFactory.qml:886
401+#: qml/Panel/Indicators/MenuItemFactory.qml:917
400402msgid "Paused, tap to resume"
401403msgstr "Прыпынена, націсніце для працягу"
402404
403−#: qml/Panel/Indicators/MenuItemFactory.qml:888
405+#: qml/Panel/Indicators/MenuItemFactory.qml:919
404406msgid "Canceled"
405407msgstr "Скасавана"
406408
407−#: qml/Panel/Indicators/MenuItemFactory.qml:890
409+#: qml/Panel/Indicators/MenuItemFactory.qml:921
408410msgid "Finished"
409411msgstr "Скончана"
410412
411−#: qml/Panel/Indicators/MenuItemFactory.qml:892
413+#: qml/Panel/Indicators/MenuItemFactory.qml:923
412414msgid "Failed, tap to retry"
413415msgstr "Не атрымалася, націсніце, каб паўтарыць спробу"
414416
@@ -428,259 +430,324 @@ msgctxt "Button: Call back on phone"
428430msgid "Call back"
429431msgstr "Патэлефанаваць"
430432
431−#: qml/Panel/Indicators/ModemInfoItem.qml:105
432−msgid "Unlock SIM"
433−msgstr "Разблакаваць SIM"
434−
435−#: qml/Panel/Indicators/RoamingIndication.qml:27
436−msgid "Roaming"
437−msgstr "Роўмінг"
438−
439−#: qml/Tutorial/TutorialBottom.qml:28
440−msgid "Open special menus"
441−msgstr "Адкрыць спецыяльныя меню"
442−
443−#: qml/Tutorial/TutorialBottom.qml:29
444−msgid "Swipe up from the bottom edge."
445−msgstr "Правесці уверх ад ніжняга краю."
433+#: qml/Stages/SideStage.qml:76
434+msgid "Drag using 3 fingers any application from one window to the other"
435+msgstr ""
446436
447−#: qml/Tutorial/TutorialBottomFinish.qml:24
448−msgid "This action does different things for different apps"
449−msgstr "Гэта дзеянне мае розныя наступствы для розных праграм"
437+#: qml/Tutorial/TutorialBottom.qml:78
438+msgid "Swipe up to add a contact"
439+msgstr ""
450440
451−#: qml/Tutorial/TutorialBottomFinish.qml:25
452−msgid "Tap here to finish."
453−msgstr "Націсніце тут, каб завяршыць."
441+#: qml/Tutorial/TutorialBottom.qml:80
442+msgid "Swipe up for favorite calculations"
443+msgstr ""
454444
455−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
456−#: qml/Tutorial/TutorialRight.qml:144
457−msgid "Tap here to continue."
458−msgstr "Націсніце тут, каб працягнуць."
445+#: qml/Tutorial/TutorialBottom.qml:82
446+msgid "Swipe up for recent calls"
447+msgstr ""
459448
460−#: qml/Tutorial/TutorialLeft.qml:26
461−msgid "Open the launcher"
462−msgstr "Адкрыць панэль запуску"
449+#: qml/Tutorial/TutorialBottom.qml:84
450+msgid "Swipe up to create a message"
451+msgstr ""
463452
464−#: qml/Tutorial/TutorialLeft.qml:27
465−msgid "Short swipe from the left edge."
466−msgstr "Кароткі рух з левага краю."
453+#: qml/Tutorial/TutorialBottom.qml:85
454+msgid "Swipe up to manage the app"
455+msgstr ""
467456
468−#: qml/Tutorial/TutorialLeftFinish.qml:24
469−msgid "These are the shortcuts to favorite apps"
470−msgstr "Гэта скарачэнні для абраных праграм"
457+#: qml/Tutorial/TutorialLeftLong.qml:47
458+msgid "Long swipe from the left edge to open the Today scope"
459+msgstr ""
471460
472−#: qml/Tutorial/TutorialPage.qml:178
473−msgid "You almost got it!"
474−msgstr "Амаль усё!"
461+#: qml/Tutorial/TutorialLeft.qml:47
462+msgid "Swipe from the left edge to open the launcher"
463+msgstr ""
475464
476−#: qml/Tutorial/TutorialPage.qml:195
477−msgid "Try again."
478−msgstr "Паспрабуйце яшчэ."
465+#: qml/Tutorial/TutorialRight.qml:55
466+msgid "Push your mouse against the right edge to view your open apps"
467+msgstr ""
479468
480−#: qml/Tutorial/TutorialRight.qml:31
481−msgid "To view open apps"
482−msgstr "Паглядзець адкрытыя праграмы"
469+#: qml/Tutorial/TutorialRight.qml:56
470+msgid "Short or long swipe from the right edge to view your open apps"
471+msgstr ""
483472
484−#: qml/Tutorial/TutorialRight.qml:32
485−msgid "Long swipe from the right edge."
486−msgstr "Доўгі рух ад правага краю."
473+#: qml/Tutorial/TutorialTop.qml:53
474+msgid "Swipe from the top right edge to open the notification bar"
475+msgstr ""
487476
488−#: qml/Tutorial/TutorialRight.qml:122
489−msgid "View all your running tasks."
490−msgstr "Паказаць усе запушчаныя задачы."
477+#: qml/Tutorial/TutorialTop.qml:54
478+msgid "Swipe from the top edge to open the notification bar"
479+msgstr ""
491480
492−#: qml/Wizard/Page.qml:89
481+#: qml/Wizard/Page.qml:54
493482msgctxt "Button: Go back one page in the Wizard"
494483msgid "Back"
495484msgstr "Вярнуцца"
496485
497486#: qml/Wizard/Pages/10-welcome.qml:27
498−msgid "Hi!"
499−msgstr "Вітай!"
487+msgid "Language"
488+msgstr ""
500489
501−#: qml/Wizard/Pages/10-welcome.qml:44
502−msgid "Welcome to your Ubuntu phone."
503−msgstr "Вітаем Вас у сістэме тэлефона Ubuntu."
490+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
491+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
492+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
493+#: qml/Wizard/Pages/75-report-check.qml:84
494+#: qml/Wizard/Pages/passcode-desktop.qml:124
495+#: qml/Wizard/Pages/password-set.qml:141
496+msgid "Next"
497+msgstr ""
504498
505−#: qml/Wizard/Pages/10-welcome.qml:52
506−msgid "Let’s get started."
507−msgstr "Пачнем."
499+#: qml/Wizard/Pages/30-wifi.qml:29
500+msgid "Connect to Wi‑Fi"
501+msgstr "Злучыцца з Wi-Fi"
508502
509−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
510−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
511−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
512−#: qml/Wizard/Pages/passwd-set.qml:90
513−msgid "Continue"
514−msgstr "Працягнуць"
503+#: qml/Wizard/Pages/30-wifi.qml:130
504+msgid "Connected"
505+msgstr ""
515506
516−#: qml/Wizard/Pages/20-sim.qml:25
517−msgid "Add a SIM card and restart your device"
518−msgstr "Дадайце SIM-карту і перазагрузіце Вашую прыладу"
507+#: qml/Wizard/Pages/30-wifi.qml:163
508+msgid "Available Wi-Fi networks"
509+msgstr ""
519510
520−#: qml/Wizard/Pages/20-sim.qml:59
521−msgid "Without it, you won’t be able to make calls or use text messaging."
522−msgstr "Без яе Вы не зможаце тэлефанаваць ці адпраўляць паведамленні."
511+#: qml/Wizard/Pages/30-wifi.qml:164
512+msgid "No available Wi-Fi networks"
513+msgstr ""
523514
524−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
515+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
516+#: qml/Wizard/Pages/sim.qml:101
525517msgid "Skip"
526518msgstr "Прапусціць"
527519
528−#: qml/Wizard/Pages/30-passwd-type.qml:39
529−msgid "Lock security"
530−msgstr "Блакіроўка"
520+#: qml/Wizard/Pages/40-location.qml:27
521+msgid "Location Services"
522+msgstr ""
531523
532−#: qml/Wizard/Pages/30-passwd-type.qml:74
533−msgid "Please select how you’d like to unlock your phone."
534−msgstr "Калі ласка, абярыце спосаб разблакавання тэлефона."
524+#: qml/Wizard/Pages/40-location.qml:83
525+msgid ""
526+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
527+"(recommended)"
528+msgstr ""
535529
536−#: qml/Wizard/Pages/30-passwd-type.qml:97
537−msgctxt "Label: Type of security method"
538−msgid "Swipe"
539−msgstr "Рух"
530+#: qml/Wizard/Pages/40-location.qml:105
531+#, qt-format
532+msgid "By selecting this option you agree to the Nokia HERE %1."
533+msgstr ""
534+
535+#: qml/Wizard/Pages/40-location.qml:106
536+msgctxt "part of: Nokia HERE terms and conditions"
537+msgid "terms and conditions"
538+msgstr ""
539+
540+#: qml/Wizard/Pages/40-location.qml:160
541+msgid "GPS only"
542+msgstr ""
543+
544+#: qml/Wizard/Pages/40-location.qml:214
545+msgid "Don't use my location"
546+msgstr ""
547+
548+#: qml/Wizard/Pages/40-location.qml:260
549+msgid "You can change it later in System Settings."
550+msgstr ""
551+
552+#: qml/Wizard/Pages/50-timezone.qml:29
553+msgid "Time Zone"
554+msgstr ""
555+
556+#: qml/Wizard/Pages/50-timezone.qml:178
557+msgid "Enter your city"
558+msgstr ""
540559
541−#: qml/Wizard/Pages/30-passwd-type.qml:98
542−msgctxt "Label: Description of security method"
543−msgid "No security"
544−msgstr "Без бяспекі"
560+#: qml/Wizard/Pages/60-account.qml:24
561+msgid "Personalize Your Device"
562+msgstr ""
563+
564+#: qml/Wizard/Pages/60-account.qml:48
565+msgid "Preferred Name"
566+msgstr ""
545567
546−#: qml/Wizard/Pages/30-passwd-type.qml:100
568+#: qml/Wizard/Pages/70-passwd-type.qml:39
569+msgid "Lock Screen"
570+msgstr ""
571+
572+#: qml/Wizard/Pages/70-passwd-type.qml:101
547573msgctxt "Label: Type of security method"
548−msgid "Passcode"
549−msgstr "Код-пароль"
574+msgid "Create new password"
575+msgstr ""
550576
551−#: qml/Wizard/Pages/30-passwd-type.qml:101
552−msgctxt "Label: Description of security method"
553−msgid "4 digits only"
554−msgstr "Толькі 4 лічбы"
577+#: qml/Wizard/Pages/70-passwd-type.qml:103
578+msgctxt "Label: Type of security method"
579+msgid "Create passcode (numbers only)"
580+msgstr ""
555581
556−#: qml/Wizard/Pages/30-passwd-type.qml:103
582+#: qml/Wizard/Pages/70-passwd-type.qml:105
557583msgctxt "Label: Type of security method"
558−msgid "Passphrase"
559−msgstr "Пароль"
584+msgid "No lock code"
585+msgstr ""
560586
561−#: qml/Wizard/Pages/30-passwd-type.qml:104
562−msgctxt "Label: Description of security method"
563−msgid "Numbers and letters"
564−msgstr "Літары і лічбы"
587+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
588+msgid "Privacy Policy"
589+msgstr ""
565590
566−#: qml/Wizard/Pages/40-wifi.qml:29
567−msgid "Connect to Wi‑Fi"
568−msgstr "Злучыцца з Wi-Fi"
591+#: qml/Wizard/Pages/75-report-check.qml:26
592+msgid "Help Us Improve"
593+msgstr ""
569594
570−#: qml/Wizard/Pages/40-wifi.qml:168
571−msgid "Available networks…"
572−msgstr "Даступныя сеткі..."
595+#: qml/Wizard/Pages/75-report-check.qml:59
596+msgid "Improve system performance by sending us crashes and error reports."
597+msgstr ""
573598
574−#: qml/Wizard/Pages/40-wifi.qml:169
575−msgid "No available networks."
576−msgstr "Няма даступных сетак."
599+#: qml/Wizard/Pages/75-report-check.qml:60
600+msgid "Privacy policy"
601+msgstr ""
577602
578−#: qml/Wizard/Pages/50-location.qml:27
579−msgid "Location"
580−msgstr "Месца"
603+#: qml/Wizard/Pages/80-finished.qml:89
604+msgid "Welcome to Ubuntu"
605+msgstr ""
581606
582−#: qml/Wizard/Pages/50-location.qml:62
583−msgid "Let the phone detect your location:"
584−msgstr "Дазволіць тэлефону вызначаць месцазнаходжанне:"
607+#: qml/Wizard/Pages/80-finished.qml:104
608+msgid "You are ready to use your device now"
609+msgstr ""
585610
586−#: qml/Wizard/Pages/50-location.qml:69
587−msgid "Using GPS only (less accurate)"
588−msgstr "З дапамогай толькі GPS (найменш дакладна)"
611+#: qml/Wizard/Pages/80-finished.qml:124
612+msgid "Get Started"
613+msgstr ""
589614
590−#: qml/Wizard/Pages/50-location.qml:86
591−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
615+#: qml/Wizard/Pages/here-terms.qml:25
616+msgid "Terms & Conditions"
617+msgstr "Умовы карыстання"
618+
619+#: qml/Wizard/Pages/here-terms.qml:69
620+msgid "Your device uses positioning technologies provided by HERE."
621+msgstr ""
622+
623+#: qml/Wizard/Pages/here-terms.qml:81
624+msgid ""
625+"To provide you with positioning services and to improve their quality, HERE "
626+"collects information about nearby cell towers and Wi-Fi hotspots around your "
627+"current location whenever your position is being found."
592628msgstr ""
593−"На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі (рэкамендуецца)"
594629
595−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
596−#: qml/Wizard/Pages/50-location.qml:103
630+#: qml/Wizard/Pages/here-terms.qml:93
597631msgid ""
598−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
599−"conditions</a>."
632+"The information collected is used to analyze the service and to improve the "
633+"use of service, but not to identify you personally."
600634msgstr ""
601−"Выбарам гэтага варыянту дзеянняў вы згаджаецеся з <a href='#'> умовамі "
602−"прадстаўлення паслуг Nokia HERE</a>."
603635
604−#: qml/Wizard/Pages/50-location.qml:112
605−msgid "Not at all"
606−msgstr "Не дазваляць"
636+#: qml/Wizard/Pages/here-terms.qml:106
637+#, qt-format
638+msgid "By continuing, you agree to the HERE platform %1 and %2."
639+msgstr ""
607640
608−#: qml/Wizard/Pages/50-location.qml:124
609−msgid "You can change your mind later in <b>System Settings</b>."
610−msgstr "Пасля змяніць налады можна з дапамогай <b>Сістэмных наладкаў</b>."
641+#: qml/Wizard/Pages/here-terms.qml:107
642+msgid "Service Terms"
643+msgstr ""
611644
612−#: qml/Wizard/Pages/60-reporting.qml:26
613−msgid "Improving your experience"
614−msgstr "Спрашчэнне вашай працы"
645+#: qml/Wizard/Pages/passcode-confirm.qml:43
646+#: qml/Wizard/Pages/passcode-desktop.qml:80
647+msgid "Confirm passcode"
648+msgstr "Пацвердзіце код-пароль"
615649
616−#: qml/Wizard/Pages/60-reporting.qml:46
617−msgid ""
618−"Your phone is set up to automatically report errors to Canonical and its "
619−"partners, the makers of the operating system."
650+#: qml/Wizard/Pages/passcode-confirm.qml:45
651+msgid "Incorrect passcode."
620652msgstr ""
621−"Ваш тэлефон настроены на аўтаматычную адпраўку справаздач пра памылкі ў "
622−"Canonical і партнёрскія установы, вытворцам аперацыйнай сістэмы."
623653
624−#: qml/Wizard/Pages/60-reporting.qml:53
625−msgid ""
626−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
627−"Privacy</b>"
654+#: qml/Wizard/Pages/passcode-confirm.qml:45
655+msgctxt "Enter the passcode again"
656+msgid "Please re-enter."
628657msgstr ""
629−"Гэтае можна адключыць у <b>Сістэмных наладках</b>, дзе <b>Бяспека &amp; "
630−"канфедэнцыйнасці</b>"
631658
632−#: qml/Wizard/Pages/80-finished.qml:24
633−msgid "All done"
634−msgstr "Зроблена"
659+#: qml/Wizard/Pages/passcode-desktop.qml:30
660+msgid "Lock Screen Passcode"
661+msgstr ""
635662
636−#: qml/Wizard/Pages/80-finished.qml:39
637−msgid "Nice work!"
638−msgstr "Выдатная праца!"
663+#: qml/Wizard/Pages/passcode-desktop.qml:56
664+msgid "Enter 4 numbers to setup your passcode"
665+msgstr ""
639666
640−#: qml/Wizard/Pages/80-finished.qml:46
641−msgid "Your phone is now ready to use."
642−msgstr "Цяпер Вашым тэлефонам можна карыстацца."
667+#: qml/Wizard/Pages/passcode-desktop.qml:65
668+#: qml/Wizard/Pages/passcode-set.qml:54
669+msgid "Choose passcode"
670+msgstr ""
643671
644−#: qml/Wizard/Pages/80-finished.qml:53
645−msgid "Finish"
646−msgstr "Скончыць"
672+#: qml/Wizard/Pages/passcode-desktop.qml:105
673+msgid "Passcode too short"
674+msgstr ""
647675
648−#: qml/Wizard/Pages/here-terms.qml:27
649−msgid "Terms & Conditions"
650−msgstr "Умовы карыстання"
676+#: qml/Wizard/Pages/passcode-desktop.qml:107
677+msgid "Passcodes match"
678+msgstr ""
651679
652−#: qml/Wizard/Pages/passwd-confirm.qml:49
653−msgid "Confirm passphrase"
654−msgstr "Пацвердзіце пароль"
680+#: qml/Wizard/Pages/passcode-desktop.qml:109
681+msgid "Passcodes do not match"
682+msgstr ""
655683
656−#: qml/Wizard/Pages/passwd-confirm.qml:50
657−msgid "Confirm passcode"
658−msgstr "Пацвердзіце код-пароль"
684+#: qml/Wizard/Pages/passcode-set.qml:62
685+msgid "Passcode must be 4 characters long"
686+msgstr ""
659687
660−#: qml/Wizard/Pages/passwd-confirm.qml:53
661−#: qml/Wizard/Pages/passwd-confirm.qml:54
662−msgid "Please try again."
663−msgstr "Калі ласка, паспрабуйце яшчэ раз."
688+#: qml/Wizard/Pages/password-set.qml:30
689+msgid "Lock Screen Password"
690+msgstr ""
664691
665−#: qml/Wizard/Pages/passwd-set.qml:61
666−msgid "Choose your passcode"
667−msgstr "Выберыце код"
692+#: qml/Wizard/Pages/password-set.qml:61
693+msgid "Enter at least 8 characters"
694+msgstr ""
668695
669−#: qml/Wizard/Pages/passwd-set.qml:68
670−msgid "Passphrase must be 4 characters long"
671−msgstr "Код мусіць складацца з 4 сімвалаў"
696+#: qml/Wizard/Pages/password-set.qml:73
697+msgid "Choose password"
698+msgstr ""
672699
673−#. Translators: This is the arrow for "Back" buttons
674−#: qml/Wizard/StackButton.qml:39
675−#, qt-format
676−msgid "〈 %1"
677−msgstr "〈 %1"
700+#: qml/Wizard/Pages/password-set.qml:103
701+msgid "Confirm password"
702+msgstr ""
678703
679−#. Translators: This is the arrow for "Forward" buttons
680−#: qml/Wizard/StackButton.qml:42
681−#, qt-format
682−msgid "%1 〉"
683−msgstr "%1 〉"
704+#: qml/Wizard/Pages/sim.qml:27
705+msgid "No SIM card installed"
706+msgstr ""
707+
708+#: qml/Wizard/Pages/sim.qml:54
709+msgid "SIM card added"
710+msgstr ""
711+
712+#: qml/Wizard/Pages/sim.qml:55
713+msgid "You must restart the device to access the mobile network."
714+msgstr ""
715+
716+#: qml/Wizard/Pages/sim.qml:59
717+msgid "Restart"
718+msgstr "Перазапусціць"
719+
720+#: qml/Wizard/Pages/sim.qml:78
721+msgid "You won’t be able to make calls or use text messaging without a SIM."
722+msgstr ""
723+
724+#: qml/Wizard/Pages/sim.qml:90
725+msgid "To proceed with no SIM tap Skip."
726+msgstr ""
727+
728+#: qml/Wizard/PasswordMeter.qml:87
729+msgid "Passwords match"
730+msgstr ""
731+
732+#: qml/Wizard/PasswordMeter.qml:89
733+msgid "Passwords do not match"
734+msgstr ""
735+
736+#: qml/Wizard/PasswordMeter.qml:93
737+msgid "Strong password"
738+msgstr ""
739+
740+#: qml/Wizard/PasswordMeter.qml:95
741+msgid "Fair password"
742+msgstr ""
743+
744+#: qml/Wizard/PasswordMeter.qml:97
745+msgid "Weak password"
746+msgstr ""
747+
748+#: qml/Wizard/PasswordMeter.qml:99
749+msgid "Very weak password"
750+msgstr ""
684751
685752#~ msgid "Reboot"
686753#~ msgstr "Перазагрузіць"
@@ -703,6 +770,12 @@ msgstr "%1 〉"
703770#~ msgid "Confirm"
704771#~ msgstr "Пацвердзіць"
705772
773+#~ msgid "Unlock SIM"
774+#~ msgstr "Разблакаваць SIM"
775+
776+#~ msgid "Roaming"
777+#~ msgstr "Роўмінг"
778+
706779#~ msgid "Try swiping from the right edge to unlock the phone"
707780#~ msgstr "Правядзіце пальцам з правага краю, каб разблакаваць тэлефон"
708781
@@ -721,6 +794,9 @@ msgstr "%1 〉"
721794#~ msgid "Log out"
722795#~ msgstr "Выйсці"
723796
797+#~ msgid "Are you sure you want to shut down?"
798+#~ msgstr "Вы ўпэўненыя, што жадаеце выключыць прыладу?"
799+
724800#~ msgid "Power"
725801#~ msgstr "Сілкаванне"
726802
@@ -741,11 +817,97 @@ msgstr "%1 〉"
741817#~ msgid "Skip intro"
742818#~ msgstr "Прапусціць уводзіны"
743819
820+#~ msgid "See all"
821+#~ msgstr "Больш падрабязна"
822+
823+#~ msgid "See less"
824+#~ msgstr "Карацей"
825+
744826#~ msgid "Store"
745827#~ msgstr "Крама"
746828
747−#~ msgid "Restart"
748−#~ msgstr "Перазапусціць"
829+#~ msgid "Add a SIM card and restart your device"
830+#~ msgstr "Дадайце SIM-карту і перазагрузіце Вашую прыладу"
831+
832+#~ msgid "Hi!"
833+#~ msgstr "Вітай!"
834+
835+#~ msgid "Welcome to your Ubuntu phone."
836+#~ msgstr "Вітаем Вас у сістэме тэлефона Ubuntu."
837+
838+#~ msgid "Let’s get started."
839+#~ msgstr "Пачнем."
840+
841+#~ msgid "Continue"
842+#~ msgstr "Працягнуць"
843+
844+#~ msgid "Please select how you’d like to unlock your phone."
845+#~ msgstr "Калі ласка, абярыце спосаб разблакавання тэлефона."
846+
847+#~ msgid "Using GPS only (less accurate)"
848+#~ msgstr "З дапамогай толькі GPS (найменш дакладна)"
849+
850+#~ msgid "Available networks…"
851+#~ msgstr "Даступныя сеткі..."
852+
853+#~ msgid "No available networks."
854+#~ msgstr "Няма даступных сетак."
855+
856+#~ msgid "Location"
857+#~ msgstr "Месца"
858+
859+#~ msgid "Let the phone detect your location:"
860+#~ msgstr "Дазволіць тэлефону вызначаць месцазнаходжанне:"
861+
862+#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
863+#~ msgstr ""
864+#~ "На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі (рэкамендуецца)"
865+
866+#~ msgid "Improving your experience"
867+#~ msgstr "Спрашчэнне вашай працы"
868+
869+#~ msgid ""
870+#~ "Your phone is set up to automatically report errors to Canonical and its "
871+#~ "partners, the makers of the operating system."
872+#~ msgstr ""
873+#~ "Ваш тэлефон настроены на аўтаматычную адпраўку справаздач пра памылкі ў "
874+#~ "Canonical і партнёрскія установы, вытворцам аперацыйнай сістэмы."
875+
876+#~ msgid "Nice work!"
877+#~ msgstr "Выдатная праца!"
878+
879+#~ msgid "All done"
880+#~ msgstr "Зроблена"
881+
882+#~ msgid "Finish"
883+#~ msgstr "Скончыць"
884+
885+#~ msgid "Your phone is now ready to use."
886+#~ msgstr "Цяпер Вашым тэлефонам можна карыстацца."
887+
888+#~ msgid ""
889+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
890+#~ "conditions</a>."
891+#~ msgstr ""
892+#~ "Выбарам гэтага варыянту дзеянняў вы згаджаецеся з <a href='#'> умовамі "
893+#~ "прадстаўлення паслуг Nokia HERE</a>."
894+
895+#~ msgid "Not at all"
896+#~ msgstr "Не дазваляць"
897+
898+#, qt-format
899+#~ msgid "〈 %1"
900+#~ msgstr "〈 %1"
901+
902+#~ msgid "Confirm passphrase"
903+#~ msgstr "Пацвердзіце пароль"
904+
905+#, qt-format
906+#~ msgid "%1 〉"
907+#~ msgstr "%1 〉"
908+
909+#~ msgid "Please try again."
910+#~ msgstr "Калі ласка, паспрабуйце яшчэ раз."
749911
750912#~ msgid "Close"
751913#~ msgstr "Закрыць"
@@ -767,6 +929,103 @@ msgstr "%1 〉"
767929#~ msgid "Please re-enter"
768930#~ msgstr "Калі ласка, паўтарыце ўвод"
769931
932+#~ msgid "Lock security"
933+#~ msgstr "Блакіроўка"
934+
935+#~ msgid "You can change your mind later in <b>System Settings</b>."
936+#~ msgstr "Пасля змяніць налады можна з дапамогай <b>Сістэмных наладкаў</b>."
937+
938+#~ msgid ""
939+#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
940+#~ "Privacy</b>"
941+#~ msgstr ""
942+#~ "Гэтае можна адключыць у <b>Сістэмных наладках</b>, дзе <b>Бяспека &amp; "
943+#~ "канфедэнцыйнасці</b>"
944+
945+#~ msgid "Choose your passcode"
946+#~ msgstr "Выберыце код"
947+
948+#~ msgctxt "Button: Shut down the system"
949+#~ msgid "Shut down"
950+#~ msgstr "Выключыць"
951+
952+#~ msgctxt "Title: Reboot/Shut down dialog"
953+#~ msgid "Shut down"
954+#~ msgstr "Выключыць"
955+
956+#~ msgctxt "Button: Reboot the system"
957+#~ msgid "Reboot"
958+#~ msgstr "Перазагрузіць"
959+
960+#~ msgid "Swipe up from the bottom edge."
961+#~ msgstr "Правесці уверх ад ніжняга краю."
962+
963+#~ msgid "Open special menus"
964+#~ msgstr "Адкрыць спецыяльныя меню"
965+
966+#~ msgid "Tap here to finish."
967+#~ msgstr "Націсніце тут, каб завяршыць."
968+
969+#~ msgid "This action does different things for different apps"
970+#~ msgstr "Гэта дзеянне мае розныя наступствы для розных праграм"
971+
972+#~ msgid "To view open apps"
973+#~ msgstr "Паглядзець адкрытыя праграмы"
974+
975+#~ msgid "You almost got it!"
976+#~ msgstr "Амаль усё!"
977+
978+#~ msgid "Short swipe from the left edge."
979+#~ msgstr "Кароткі рух з левага краю."
980+
981+#~ msgid "Long swipe from the right edge."
982+#~ msgstr "Доўгі рух ад правага краю."
983+
984+#~ msgid "View all your running tasks."
985+#~ msgstr "Паказаць усе запушчаныя задачы."
986+
987+#~ msgid "Try again."
988+#~ msgstr "Паспрабуйце яшчэ."
989+
990+#~ msgid "Open the launcher"
991+#~ msgstr "Адкрыць панэль запуску"
992+
993+#~ msgid "Tap here to continue."
994+#~ msgstr "Націсніце тут, каб працягнуць."
995+
996+#~ msgid "These are the shortcuts to favorite apps"
997+#~ msgstr "Гэта скарачэнні для абраных праграм"
998+
999+#~ msgctxt "Label: Description of security method"
1000+#~ msgid "No security"
1001+#~ msgstr "Без бяспекі"
1002+
1003+#~ msgctxt "Label: Type of security method"
1004+#~ msgid "Swipe"
1005+#~ msgstr "Рух"
1006+
1007+#~ msgctxt "Label: Description of security method"
1008+#~ msgid "4 digits only"
1009+#~ msgstr "Толькі 4 лічбы"
1010+
1011+#~ msgctxt "Label: Type of security method"
1012+#~ msgid "Passphrase"
1013+#~ msgstr "Пароль"
1014+
1015+#~ msgctxt "Label: Description of security method"
1016+#~ msgid "Numbers and letters"
1017+#~ msgstr "Літары і лічбы"
1018+
1019+#~ msgid "Without it, you won’t be able to make calls or use text messaging."
1020+#~ msgstr "Без яе Вы не зможаце тэлефанаваць ці адпраўляць паведамленні."
1021+
1022+#~ msgid "Passphrase must be 4 characters long"
1023+#~ msgstr "Код мусіць складацца з 4 сімвалаў"
1024+
1025+#~ msgctxt "Label: Type of security method"
1026+#~ msgid "Passcode"
1027+#~ msgstr "Код-пароль"
1028+
7701029#~ msgid "%a %l:%M %p"
7711030#~ msgstr "%a a %H:%M"
7721031
po/bg.po+276−202
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
1111"PO-Revision-Date: 2015-04-12 14:43+0000\n"
1212"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,23 +15,23 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-12-12 05:44+0000\n"
19−"X-Generator: Launchpad (build 17865)\n"
18+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
2323msgstr ""
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:47
26−#: plugins/Unity/Launcher/launcheritem.cpp:106
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
2727msgid "Pin shortcut"
2828msgstr ""
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:52
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
3232msgstr ""
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:106
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
3636msgstr ""
3737
@@ -73,53 +73,35 @@ msgctxt "Button: Log out from the system"
7373msgid "Log Out"
7474msgstr ""
7575
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
77−#: qml/Components/Dialogs.qml:253
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
78+#: qml/Wizard/Pages/passcode-set.qml:32
7879msgid "Cancel"
7980msgstr ""
8081
8182#: qml/Components/Dialogs.qml:173
82−msgctxt "Title: Reboot/Shut down dialog"
83−msgid "Shut down"
84−msgstr ""
85−
86−#: qml/Components/Dialogs.qml:174
87−msgid "Are you sure you want to shut down?"
88−msgstr ""
89−
90−#: qml/Components/Dialogs.qml:176
91−msgctxt "Button: Reboot the system"
92−msgid "Reboot"
93−msgstr ""
94−
95−#: qml/Components/Dialogs.qml:185
96−msgctxt "Button: Shut down the system"
97−msgid "Shut down"
98−msgstr ""
99−
100−#: qml/Components/Dialogs.qml:207
10183msgctxt "Title: Reboot dialog"
10284msgid "Reboot"
10385msgstr ""
10486
105−#: qml/Components/Dialogs.qml:208
87+#: qml/Components/Dialogs.qml:174
10688msgid "Are you sure you want to reboot?"
10789msgstr ""
10890
109−#: qml/Components/Dialogs.qml:210
91+#: qml/Components/Dialogs.qml:176
11092msgid "No"
11193msgstr ""
11294
113−#: qml/Components/Dialogs.qml:217
95+#: qml/Components/Dialogs.qml:182
11496msgid "Yes"
11597msgstr ""
11698
117−#: qml/Components/Dialogs.qml:232
99+#: qml/Components/Dialogs.qml:197
118100msgctxt "Title: Power off/Restart dialog"
119101msgid "Power"
120102msgstr ""
121103
122−#: qml/Components/Dialogs.qml:233
104+#: qml/Components/Dialogs.qml:198
123105msgid ""
124106"Are you sure you would like\n"
125107"to power off?"
@@ -127,25 +109,25 @@ msgstr ""
127109"Искате ли да \n"
128110"изключите захранването на устройството?"
129111
130−#: qml/Components/Dialogs.qml:235
112+#: qml/Components/Dialogs.qml:200
131113msgctxt "Button: Power off the system"
132114msgid "Power off"
133115msgstr ""
134116
135−#: qml/Components/Dialogs.qml:244
117+#: qml/Components/Dialogs.qml:209
136118msgctxt "Button: Restart the system"
137119msgid "Restart"
138120msgstr ""
139121
140−#: qml/Components/Lockscreen.qml:245
122+#: qml/Components/Lockscreen.qml:231
141123msgid "Return to Call"
142124msgstr ""
143125
144−#: qml/Components/Lockscreen.qml:245
126+#: qml/Components/Lockscreen.qml:231
145127msgid "Emergency Call"
146128msgstr "Спешно повикване"
147129
148−#: qml/Components/Lockscreen.qml:277
130+#: qml/Components/Lockscreen.qml:263
149131msgid "OK"
150132msgstr ""
151133
@@ -154,6 +136,8 @@ msgid "Apps may have unsaved data:"
154136msgstr ""
155137
156138#: qml/Components/ModeSwitchWarningDialog.qml:57
139+msgctxt ""
140+"Re-dock means connect the device again to an external screen/mouse/keyboard"
157141msgid "Re-dock, save your work and close these apps to continue."
158142msgstr ""
159143
@@ -173,42 +157,58 @@ msgstr ""
173157msgid "Close all"
174158msgstr ""
175159
176−#: qml/Dash/DashPageHeader.qml:265
160+#: qml/Dash/DashPageHeader.qml:337
177161msgctxt "Button: Open the Ubuntu Store"
178162msgid "Store"
179163msgstr ""
180164
181−#: qml/Dash/DashPageHeader.qml:272
165+#: qml/Dash/DashPageHeader.qml:344
182166msgctxt "Button: Start a search in the current dash scope"
183167msgid "Search"
184168msgstr ""
185169
186−#: qml/Dash/DashPageHeader.qml:282
170+#: qml/Dash/DashPageHeader.qml:354
187171msgctxt "Button: Show the current dash scope settings"
188172msgid "Settings"
189173msgstr ""
190174
191−#: qml/Dash/DashPageHeader.qml:289
175+#: qml/Dash/DashPageHeader.qml:361
192176msgid "Remove from Favorites"
193177msgstr ""
194178
195−#: qml/Dash/DashPageHeader.qml:289
179+#: qml/Dash/DashPageHeader.qml:361
196180msgid "Add to Favorites"
197181msgstr ""
198182
199−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
200−msgid "See less"
183+#: qml/Dash/FiltersPopover.qml:60
184+msgid "Refine your results"
185+msgstr ""
186+
187+#: qml/Dash/FiltersPopover.qml:69
188+msgid "Reset"
189+msgstr ""
190+
191+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192+msgid "Show less"
201193msgstr ""
202194
203−#: qml/Dash/GenericScopeView.qml:576
204−msgid "See all"
195+#: qml/Dash/GenericScopeView.qml:570
196+msgid "Show all"
205197msgstr ""
206198
207−#: qml/Dash/GenericScopeView.qml:638
199+#: qml/Dash/GenericScopeView.qml:627
208200msgctxt "Label: Hint for dash search line edit"
209201msgid "Search"
210202msgstr ""
211203
204+#: qml/Dash/PageHeaderExtraPanel.qml:55
205+msgid "Recent Searches"
206+msgstr ""
207+
208+#: qml/Dash/PageHeaderExtraPanel.qml:66
209+msgid "Clear All"
210+msgstr ""
211+
212212#: qml/Dash/Previews/PreviewActionCombo.qml:35
213213msgid "More..."
214214msgstr ""
@@ -230,7 +230,7 @@ msgstr "Оценете това"
230230msgid "Add a review"
231231msgstr "Добави отзив"
232232
233−#: qml/Dash/Previews/PreviewSharing.qml:51
233+#: qml/Dash/Previews/PreviewSharing.qml:66
234234msgid "Preview Share Item"
235235msgstr ""
236236
@@ -258,27 +258,29 @@ msgstr ""
258258msgid "Also installed"
259259msgstr ""
260260
261−#: qml/DisabledScreenNotice.qml:42
262−msgid "Your device is now connected to an external display."
261+#: qml/DisabledScreenNotice.qml:104
262+msgid ""
263+"Your device is now connected to an external display. Use this screen as a "
264+"touch pad to interact with the pointer."
263265msgstr ""
264266
265−#: qml/Greeter/CoverPage.qml:107
267+#: qml/Greeter/CoverPage.qml:118
266268msgid "Unlock"
267269msgstr ""
268270
269−#: qml/Greeter/LoginList.qml:236
271+#: qml/Greeter/LoginList.qml:239
270272msgid "Retry"
271273msgstr ""
272274
273−#: qml/Greeter/LoginList.qml:237
275+#: qml/Greeter/LoginList.qml:240
274276msgid "Tap to unlock"
275277msgstr ""
276278
277−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
279+#: qml/Greeter/NarrowView.qml:54
278280msgid "Sorry, incorrect passphrase."
279281msgstr ""
280282
281−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
283+#: qml/Greeter/NarrowView.qml:55
282284msgid "Sorry, incorrect passcode."
283285msgstr ""
284286
@@ -303,7 +305,7 @@ msgstr ""
303305msgid "Enter %1"
304306msgstr ""
305307
306−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
308+#: qml/Greeter/NarrowView.qml:117
307309msgid "Enter passphrase"
308310msgstr ""
309311
@@ -329,7 +331,7 @@ msgstr ""
329331msgid "Sorry, incorrect passcode"
330332msgstr ""
331333
332−#: qml/Notifications/NotificationMenuItemFactory.qml:129
334+#: qml/Notifications/NotificationMenuItemFactory.qml:124
333335msgid "Show password"
334336msgstr "Покажи паролата"
335337
@@ -341,62 +343,62 @@ msgstr ""
341343msgid "Conference"
342344msgstr ""
343345
344−#: qml/Panel/Indicators/MenuItemFactory.qml:731
346+#: qml/Panel/Indicators/MenuItemFactory.qml:762
345347msgid "Nothing is playing"
346348msgstr ""
347349
348−#: qml/Panel/Indicators/MenuItemFactory.qml:860
350+#: qml/Panel/Indicators/MenuItemFactory.qml:891
349351#, qt-format
350352msgid "%1 hour"
351353msgid_plural "%1 hours"
352354msgstr[0] ""
353355msgstr[1] ""
354356
355−#: qml/Panel/Indicators/MenuItemFactory.qml:864
357+#: qml/Panel/Indicators/MenuItemFactory.qml:895
356358#, qt-format
357359msgid "%1 minute"
358360msgid_plural "%1 minutes"
359361msgstr[0] ""
360362msgstr[1] ""
361363
362−#: qml/Panel/Indicators/MenuItemFactory.qml:869
364+#: qml/Panel/Indicators/MenuItemFactory.qml:900
363365#, qt-format
364366msgid "%1 second"
365367msgid_plural "%1 seconds"
366368msgstr[0] ""
367369msgstr[1] ""
368370
369−#: qml/Panel/Indicators/MenuItemFactory.qml:872
371+#: qml/Panel/Indicators/MenuItemFactory.qml:903
370372msgid "0 seconds"
371373msgstr ""
372374
373375#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
374−#: qml/Panel/Indicators/MenuItemFactory.qml:874
376+#: qml/Panel/Indicators/MenuItemFactory.qml:905
375377#, qt-format
376378msgid "%1 remaining"
377379msgstr ""
378380
379−#: qml/Panel/Indicators/MenuItemFactory.qml:880
381+#: qml/Panel/Indicators/MenuItemFactory.qml:911
380382msgid "In queue…"
381383msgstr ""
382384
383−#: qml/Panel/Indicators/MenuItemFactory.qml:884
385+#: qml/Panel/Indicators/MenuItemFactory.qml:915
384386msgid "Downloading"
385387msgstr ""
386388
387−#: qml/Panel/Indicators/MenuItemFactory.qml:886
389+#: qml/Panel/Indicators/MenuItemFactory.qml:917
388390msgid "Paused, tap to resume"
389391msgstr ""
390392
391−#: qml/Panel/Indicators/MenuItemFactory.qml:888
393+#: qml/Panel/Indicators/MenuItemFactory.qml:919
392394msgid "Canceled"
393395msgstr ""
394396
395−#: qml/Panel/Indicators/MenuItemFactory.qml:890
397+#: qml/Panel/Indicators/MenuItemFactory.qml:921
396398msgid "Finished"
397399msgstr ""
398400
399−#: qml/Panel/Indicators/MenuItemFactory.qml:892
401+#: qml/Panel/Indicators/MenuItemFactory.qml:923
400402msgid "Failed, tap to retry"
401403msgstr ""
402404
@@ -416,251 +418,323 @@ msgctxt "Button: Call back on phone"
416418msgid "Call back"
417419msgstr ""
418420
419−#: qml/Panel/Indicators/ModemInfoItem.qml:105
420−msgid "Unlock SIM"
421+#: qml/Stages/SideStage.qml:76
422+msgid "Drag using 3 fingers any application from one window to the other"
421423msgstr ""
422424
423−#: qml/Panel/Indicators/RoamingIndication.qml:27
424−msgid "Roaming"
425+#: qml/Tutorial/TutorialBottom.qml:78
426+msgid "Swipe up to add a contact"
425427msgstr ""
426428
427−#: qml/Tutorial/TutorialBottom.qml:28
428−msgid "Open special menus"
429+#: qml/Tutorial/TutorialBottom.qml:80
430+msgid "Swipe up for favorite calculations"
429431msgstr ""
430432
431−#: qml/Tutorial/TutorialBottom.qml:29
432−msgid "Swipe up from the bottom edge."
433+#: qml/Tutorial/TutorialBottom.qml:82
434+msgid "Swipe up for recent calls"
433435msgstr ""
434436
435−#: qml/Tutorial/TutorialBottomFinish.qml:24
436−msgid "This action does different things for different apps"
437+#: qml/Tutorial/TutorialBottom.qml:84
438+msgid "Swipe up to create a message"
437439msgstr ""
438440
439−#: qml/Tutorial/TutorialBottomFinish.qml:25
440−msgid "Tap here to finish."
441+#: qml/Tutorial/TutorialBottom.qml:85
442+msgid "Swipe up to manage the app"
441443msgstr ""
442444
443−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
444−#: qml/Tutorial/TutorialRight.qml:144
445−msgid "Tap here to continue."
445+#: qml/Tutorial/TutorialLeftLong.qml:47
446+msgid "Long swipe from the left edge to open the Today scope"
446447msgstr ""
447448
448−#: qml/Tutorial/TutorialLeft.qml:26
449−msgid "Open the launcher"
449+#: qml/Tutorial/TutorialLeft.qml:47
450+msgid "Swipe from the left edge to open the launcher"
450451msgstr ""
451452
452−#: qml/Tutorial/TutorialLeft.qml:27
453−msgid "Short swipe from the left edge."
453+#: qml/Tutorial/TutorialRight.qml:55
454+msgid "Push your mouse against the right edge to view your open apps"
454455msgstr ""
455456
456−#: qml/Tutorial/TutorialLeftFinish.qml:24
457−msgid "These are the shortcuts to favorite apps"
457+#: qml/Tutorial/TutorialRight.qml:56
458+msgid "Short or long swipe from the right edge to view your open apps"
458459msgstr ""
459460
460−#: qml/Tutorial/TutorialPage.qml:178
461−msgid "You almost got it!"
461+#: qml/Tutorial/TutorialTop.qml:53
462+msgid "Swipe from the top right edge to open the notification bar"
462463msgstr ""
463464
464−#: qml/Tutorial/TutorialPage.qml:195
465−msgid "Try again."
465+#: qml/Tutorial/TutorialTop.qml:54
466+msgid "Swipe from the top edge to open the notification bar"
466467msgstr ""
467468
468−#: qml/Tutorial/TutorialRight.qml:31
469−msgid "To view open apps"
469+#: qml/Wizard/Page.qml:54
470+msgctxt "Button: Go back one page in the Wizard"
471+msgid "Back"
470472msgstr ""
471473
472−#: qml/Tutorial/TutorialRight.qml:32
473−msgid "Long swipe from the right edge."
474+#: qml/Wizard/Pages/10-welcome.qml:27
475+msgid "Language"
474476msgstr ""
475477
476−#: qml/Tutorial/TutorialRight.qml:122
477−msgid "View all your running tasks."
478+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
479+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
480+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
481+#: qml/Wizard/Pages/75-report-check.qml:84
482+#: qml/Wizard/Pages/passcode-desktop.qml:124
483+#: qml/Wizard/Pages/password-set.qml:141
484+msgid "Next"
478485msgstr ""
479486
480−#: qml/Wizard/Page.qml:89
481−msgctxt "Button: Go back one page in the Wizard"
482−msgid "Back"
487+#: qml/Wizard/Pages/30-wifi.qml:29
488+msgid "Connect to Wi‑Fi"
483489msgstr ""
484490
485−#: qml/Wizard/Pages/10-welcome.qml:27
486−msgid "Hi!"
491+#: qml/Wizard/Pages/30-wifi.qml:130
492+msgid "Connected"
487493msgstr ""
488494
489−#: qml/Wizard/Pages/10-welcome.qml:44
490−msgid "Welcome to your Ubuntu phone."
495+#: qml/Wizard/Pages/30-wifi.qml:163
496+msgid "Available Wi-Fi networks"
491497msgstr ""
492498
493−#: qml/Wizard/Pages/10-welcome.qml:52
494−msgid "Let’s get started."
499+#: qml/Wizard/Pages/30-wifi.qml:164
500+msgid "No available Wi-Fi networks"
495501msgstr ""
496502
497−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
498−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
499−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
500−#: qml/Wizard/Pages/passwd-set.qml:90
501−msgid "Continue"
503+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
504+#: qml/Wizard/Pages/sim.qml:101
505+msgid "Skip"
502506msgstr ""
503507
504−#: qml/Wizard/Pages/20-sim.qml:25
505−msgid "Add a SIM card and restart your device"
508+#: qml/Wizard/Pages/40-location.qml:27
509+msgid "Location Services"
506510msgstr ""
507511
508−#: qml/Wizard/Pages/20-sim.qml:59
509−msgid "Without it, you won’t be able to make calls or use text messaging."
512+#: qml/Wizard/Pages/40-location.qml:83
513+msgid ""
514+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
515+"(recommended)"
510516msgstr ""
511517
512−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
513−msgid "Skip"
518+#: qml/Wizard/Pages/40-location.qml:105
519+#, qt-format
520+msgid "By selecting this option you agree to the Nokia HERE %1."
514521msgstr ""
515522
516−#: qml/Wizard/Pages/30-passwd-type.qml:39
517−msgid "Lock security"
523+#: qml/Wizard/Pages/40-location.qml:106
524+msgctxt "part of: Nokia HERE terms and conditions"
525+msgid "terms and conditions"
518526msgstr ""
519527
520−#: qml/Wizard/Pages/30-passwd-type.qml:74
521−msgid "Please select how you’d like to unlock your phone."
528+#: qml/Wizard/Pages/40-location.qml:160
529+msgid "GPS only"
522530msgstr ""
523531
524−#: qml/Wizard/Pages/30-passwd-type.qml:97
525−msgctxt "Label: Type of security method"
526−msgid "Swipe"
532+#: qml/Wizard/Pages/40-location.qml:214
533+msgid "Don't use my location"
534+msgstr ""
535+
536+#: qml/Wizard/Pages/40-location.qml:260
537+msgid "You can change it later in System Settings."
538+msgstr ""
539+
540+#: qml/Wizard/Pages/50-timezone.qml:29
541+msgid "Time Zone"
542+msgstr ""
543+
544+#: qml/Wizard/Pages/50-timezone.qml:178
545+msgid "Enter your city"
546+msgstr ""
547+
548+#: qml/Wizard/Pages/60-account.qml:24
549+msgid "Personalize Your Device"
527550msgstr ""
528551
529−#: qml/Wizard/Pages/30-passwd-type.qml:98
530−msgctxt "Label: Description of security method"
531−msgid "No security"
552+#: qml/Wizard/Pages/60-account.qml:48
553+msgid "Preferred Name"
532554msgstr ""
533555
534−#: qml/Wizard/Pages/30-passwd-type.qml:100
556+#: qml/Wizard/Pages/70-passwd-type.qml:39
557+msgid "Lock Screen"
558+msgstr ""
559+
560+#: qml/Wizard/Pages/70-passwd-type.qml:101
535561msgctxt "Label: Type of security method"
536−msgid "Passcode"
562+msgid "Create new password"
537563msgstr ""
538564
539−#: qml/Wizard/Pages/30-passwd-type.qml:101
540−msgctxt "Label: Description of security method"
541−msgid "4 digits only"
565+#: qml/Wizard/Pages/70-passwd-type.qml:103
566+msgctxt "Label: Type of security method"
567+msgid "Create passcode (numbers only)"
542568msgstr ""
543569
544−#: qml/Wizard/Pages/30-passwd-type.qml:103
570+#: qml/Wizard/Pages/70-passwd-type.qml:105
545571msgctxt "Label: Type of security method"
546−msgid "Passphrase"
572+msgid "No lock code"
547573msgstr ""
548574
549−#: qml/Wizard/Pages/30-passwd-type.qml:104
550−msgctxt "Label: Description of security method"
551−msgid "Numbers and letters"
575+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
576+msgid "Privacy Policy"
552577msgstr ""
553578
554−#: qml/Wizard/Pages/40-wifi.qml:29
555−msgid "Connect to Wi‑Fi"
579+#: qml/Wizard/Pages/75-report-check.qml:26
580+msgid "Help Us Improve"
556581msgstr ""
557582
558−#: qml/Wizard/Pages/40-wifi.qml:168
559−msgid "Available networks…"
583+#: qml/Wizard/Pages/75-report-check.qml:59
584+msgid "Improve system performance by sending us crashes and error reports."
560585msgstr ""
561586
562−#: qml/Wizard/Pages/40-wifi.qml:169
563−msgid "No available networks."
587+#: qml/Wizard/Pages/75-report-check.qml:60
588+msgid "Privacy policy"
564589msgstr ""
565590
566−#: qml/Wizard/Pages/50-location.qml:27
567−msgid "Location"
591+#: qml/Wizard/Pages/80-finished.qml:89
592+msgid "Welcome to Ubuntu"
568593msgstr ""
569594
570−#: qml/Wizard/Pages/50-location.qml:62
571−msgid "Let the phone detect your location:"
595+#: qml/Wizard/Pages/80-finished.qml:104
596+msgid "You are ready to use your device now"
572597msgstr ""
573598
574−#: qml/Wizard/Pages/50-location.qml:69
575−msgid "Using GPS only (less accurate)"
599+#: qml/Wizard/Pages/80-finished.qml:124
600+msgid "Get Started"
576601msgstr ""
577602
578−#: qml/Wizard/Pages/50-location.qml:86
579−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
603+#: qml/Wizard/Pages/here-terms.qml:25
604+msgid "Terms & Conditions"
580605msgstr ""
581606
582−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
583−#: qml/Wizard/Pages/50-location.qml:103
607+#: qml/Wizard/Pages/here-terms.qml:69
608+msgid "Your device uses positioning technologies provided by HERE."
609+msgstr ""
610+
611+#: qml/Wizard/Pages/here-terms.qml:81
584612msgid ""
585−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
586−"conditions</a>."
613+"To provide you with positioning services and to improve their quality, HERE "
614+"collects information about nearby cell towers and Wi-Fi hotspots around your "
615+"current location whenever your position is being found."
587616msgstr ""
588617
589−#: qml/Wizard/Pages/50-location.qml:112
590−msgid "Not at all"
618+#: qml/Wizard/Pages/here-terms.qml:93
619+msgid ""
620+"The information collected is used to analyze the service and to improve the "
621+"use of service, but not to identify you personally."
591622msgstr ""
592623
593−#: qml/Wizard/Pages/50-location.qml:124
594−msgid "You can change your mind later in <b>System Settings</b>."
624+#: qml/Wizard/Pages/here-terms.qml:106
625+#, qt-format
626+msgid "By continuing, you agree to the HERE platform %1 and %2."
595627msgstr ""
596628
597−#: qml/Wizard/Pages/60-reporting.qml:26
598−msgid "Improving your experience"
629+#: qml/Wizard/Pages/here-terms.qml:107
630+msgid "Service Terms"
599631msgstr ""
600632
601−#: qml/Wizard/Pages/60-reporting.qml:46
602−msgid ""
603−"Your phone is set up to automatically report errors to Canonical and its "
604−"partners, the makers of the operating system."
633+#: qml/Wizard/Pages/passcode-confirm.qml:43
634+#: qml/Wizard/Pages/passcode-desktop.qml:80
635+msgid "Confirm passcode"
605636msgstr ""
606637
607−#: qml/Wizard/Pages/60-reporting.qml:53
608−msgid ""
609−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
610−"Privacy</b>"
638+#: qml/Wizard/Pages/passcode-confirm.qml:45
639+msgid "Incorrect passcode."
611640msgstr ""
612641
613−#: qml/Wizard/Pages/80-finished.qml:24
614−msgid "All done"
642+#: qml/Wizard/Pages/passcode-confirm.qml:45
643+msgctxt "Enter the passcode again"
644+msgid "Please re-enter."
615645msgstr ""
616646
617−#: qml/Wizard/Pages/80-finished.qml:39
618−msgid "Nice work!"
647+#: qml/Wizard/Pages/passcode-desktop.qml:30
648+msgid "Lock Screen Passcode"
619649msgstr ""
620650
621−#: qml/Wizard/Pages/80-finished.qml:46
622−msgid "Your phone is now ready to use."
651+#: qml/Wizard/Pages/passcode-desktop.qml:56
652+msgid "Enter 4 numbers to setup your passcode"
623653msgstr ""
624654
625−#: qml/Wizard/Pages/80-finished.qml:53
626−msgid "Finish"
655+#: qml/Wizard/Pages/passcode-desktop.qml:65
656+#: qml/Wizard/Pages/passcode-set.qml:54
657+msgid "Choose passcode"
627658msgstr ""
628659
629−#: qml/Wizard/Pages/here-terms.qml:27
630−msgid "Terms & Conditions"
660+#: qml/Wizard/Pages/passcode-desktop.qml:105
661+msgid "Passcode too short"
631662msgstr ""
632663
633−#: qml/Wizard/Pages/passwd-confirm.qml:49
634−msgid "Confirm passphrase"
664+#: qml/Wizard/Pages/passcode-desktop.qml:107
665+msgid "Passcodes match"
635666msgstr ""
636667
637−#: qml/Wizard/Pages/passwd-confirm.qml:50
638−msgid "Confirm passcode"
668+#: qml/Wizard/Pages/passcode-desktop.qml:109
669+msgid "Passcodes do not match"
639670msgstr ""
640671
641−#: qml/Wizard/Pages/passwd-confirm.qml:53
642−#: qml/Wizard/Pages/passwd-confirm.qml:54
643−msgid "Please try again."
672+#: qml/Wizard/Pages/passcode-set.qml:62
673+msgid "Passcode must be 4 characters long"
644674msgstr ""
645675
646−#: qml/Wizard/Pages/passwd-set.qml:61
647−msgid "Choose your passcode"
676+#: qml/Wizard/Pages/password-set.qml:30
677+msgid "Lock Screen Password"
648678msgstr ""
649679
650−#: qml/Wizard/Pages/passwd-set.qml:68
651−msgid "Passphrase must be 4 characters long"
680+#: qml/Wizard/Pages/password-set.qml:61
681+msgid "Enter at least 8 characters"
652682msgstr ""
653683
654−#. Translators: This is the arrow for "Back" buttons
655−#: qml/Wizard/StackButton.qml:39
656−#, qt-format
657−msgid "〈 %1"
684+#: qml/Wizard/Pages/password-set.qml:73
685+msgid "Choose password"
658686msgstr ""
659687
660−#. Translators: This is the arrow for "Forward" buttons
661−#: qml/Wizard/StackButton.qml:42
662−#, qt-format
663−msgid "%1 〉"
688+#: qml/Wizard/Pages/password-set.qml:103
689+msgid "Confirm password"
690+msgstr ""
691+
692+#: qml/Wizard/Pages/sim.qml:27
693+msgid "No SIM card installed"
694+msgstr ""
695+
696+#: qml/Wizard/Pages/sim.qml:54
697+msgid "SIM card added"
698+msgstr ""
699+
700+#: qml/Wizard/Pages/sim.qml:55
701+msgid "You must restart the device to access the mobile network."
702+msgstr ""
703+
704+#: qml/Wizard/Pages/sim.qml:59
705+msgid "Restart"
706+msgstr ""
707+
708+#: qml/Wizard/Pages/sim.qml:78
709+msgid "You won’t be able to make calls or use text messaging without a SIM."
710+msgstr ""
711+
712+#: qml/Wizard/Pages/sim.qml:90
713+msgid "To proceed with no SIM tap Skip."
714+msgstr ""
715+
716+#: qml/Wizard/PasswordMeter.qml:87
717+msgid "Passwords match"
718+msgstr ""
719+
720+#: qml/Wizard/PasswordMeter.qml:89
721+msgid "Passwords do not match"
722+msgstr ""
723+
724+#: qml/Wizard/PasswordMeter.qml:93
725+msgid "Strong password"
726+msgstr ""
727+
728+#: qml/Wizard/PasswordMeter.qml:95
729+msgid "Fair password"
730+msgstr ""
731+
732+#: qml/Wizard/PasswordMeter.qml:97
733+msgid "Weak password"
734+msgstr ""
735+
736+#: qml/Wizard/PasswordMeter.qml:99
737+msgid "Very weak password"
664738msgstr ""
665739
666740#~ msgid "Confirm"
po/bn.po+486−268
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
1111"PO-Revision-Date: 2015-11-27 19:38+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bengali <bn@li.org>\n"
@@ -15,44 +15,44 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-12-12 05:44+0000\n"
19−"X-Generator: Launchpad (build 17865)\n"
18+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
23−msgstr ""
23+msgstr "পাসওয়ার্ড: "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:47
26−#: plugins/Unity/Launcher/launcheritem.cpp:106
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
2727msgid "Pin shortcut"
28−msgstr ""
28+msgstr "পিন"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:52
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
3232msgstr ""
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:106
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
36−msgstr ""
36+msgstr "আনপিন"
3737
3838#: qml/Components/DelayedLockscreen.qml:49
3939msgid "Device Locked"
40−msgstr ""
40+msgstr "ডিভাইসটি লক করা"
4141
4242#: qml/Components/DelayedLockscreen.qml:64
4343msgid "You have been locked out due to too many failed passphrase attempts."
44−msgstr ""
44+msgstr "অধিকবার পাসফ্রেজ ভুল দেওয়ার কারনে আপনার আইডি লক করা হয়েছে"
4545
4646#: qml/Components/DelayedLockscreen.qml:65
4747msgid "You have been locked out due to too many failed passcode attempts."
48−msgstr ""
48+msgstr "অধিকবার পাসকোড ভুল করার কারনে আপনার আইডি লক করা হয়েছে"
4949
5050#: qml/Components/DelayedLockscreen.qml:74
5151#, qt-format
5252msgid "Please wait %1 minute and then try again…"
5353msgid_plural "Please wait %1 minutes and then try again…"
54−msgstr[0] ""
55−msgstr[1] ""
54+msgstr[0] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
55+msgstr[1] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
5656
5757#: qml/Components/Dialogs.qml:144
5858msgctxt "Title: Lock/Log out dialog"
@@ -61,97 +61,83 @@ msgstr ""
6161
6262#: qml/Components/Dialogs.qml:145
6363msgid "Are you sure you want to log out?"
64−msgstr ""
64+msgstr "আপনি কি লগ আউট করতে চান?"
6565
6666#: qml/Components/Dialogs.qml:147
6767msgctxt "Button: Lock the system"
6868msgid "Lock"
69−msgstr ""
69+msgstr "লক করুন"
7070
7171#: qml/Components/Dialogs.qml:154
7272msgctxt "Button: Log out from the system"
7373msgid "Log Out"
7474msgstr ""
7575
76−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
77−#: qml/Components/Dialogs.qml:253
76+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
77+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
78+#: qml/Wizard/Pages/passcode-set.qml:32
7879msgid "Cancel"
79−msgstr ""
80+msgstr "বাতিল"
8081
8182#: qml/Components/Dialogs.qml:173
82−msgctxt "Title: Reboot/Shut down dialog"
83−msgid "Shut down"
84−msgstr ""
85−
86−#: qml/Components/Dialogs.qml:174
87−msgid "Are you sure you want to shut down?"
88−msgstr ""
89−
90−#: qml/Components/Dialogs.qml:176
91−msgctxt "Button: Reboot the system"
92−msgid "Reboot"
93−msgstr ""
94−
95−#: qml/Components/Dialogs.qml:185
96−msgctxt "Button: Shut down the system"
97−msgid "Shut down"
98−msgstr ""
99−
100−#: qml/Components/Dialogs.qml:207
10183msgctxt "Title: Reboot dialog"
10284msgid "Reboot"
103−msgstr ""
85+msgstr "পুনরায় চালু"
10486
105−#: qml/Components/Dialogs.qml:208
87+#: qml/Components/Dialogs.qml:174
10688msgid "Are you sure you want to reboot?"
107−msgstr ""
89+msgstr "আপনি কি পুনরায় চালু করতে চান?"
10890
109−#: qml/Components/Dialogs.qml:210
91+#: qml/Components/Dialogs.qml:176
11092msgid "No"
111−msgstr ""
93+msgstr "না"
11294
113−#: qml/Components/Dialogs.qml:217
95+#: qml/Components/Dialogs.qml:182
11496msgid "Yes"
115−msgstr ""
97+msgstr "হ্যাঁ"
11698
117−#: qml/Components/Dialogs.qml:232
99+#: qml/Components/Dialogs.qml:197
118100msgctxt "Title: Power off/Restart dialog"
119101msgid "Power"
120102msgstr ""
121103
122−#: qml/Components/Dialogs.qml:233
104+#: qml/Components/Dialogs.qml:198
123105msgid ""
124106"Are you sure you would like\n"
125107"to power off?"
126108msgstr ""
109+"আপনি নিশ্চিত যে আপনি\n"
110+"বন্ধ করতে চান?"
127111
128−#: qml/Components/Dialogs.qml:235
112+#: qml/Components/Dialogs.qml:200
129113msgctxt "Button: Power off the system"
130114msgid "Power off"
131−msgstr ""
115+msgstr "বন্ধ করুন"
132116
133−#: qml/Components/Dialogs.qml:244
117+#: qml/Components/Dialogs.qml:209
134118msgctxt "Button: Restart the system"
135119msgid "Restart"
136−msgstr ""
120+msgstr "পুনরায় চালু"
137121
138−#: qml/Components/Lockscreen.qml:245
122+#: qml/Components/Lockscreen.qml:231
139123msgid "Return to Call"
140−msgstr ""
124+msgstr "কল এ ফিরে যান"
141125
142−#: qml/Components/Lockscreen.qml:245
126+#: qml/Components/Lockscreen.qml:231
143127msgid "Emergency Call"
144−msgstr ""
128+msgstr "জরুরী কল"
145129
146−#: qml/Components/Lockscreen.qml:277
130+#: qml/Components/Lockscreen.qml:263
147131msgid "OK"
148−msgstr ""
132+msgstr "ঠিক আছে"
149133
150134#: qml/Components/ModeSwitchWarningDialog.qml:32
151135msgid "Apps may have unsaved data:"
152136msgstr ""
153137
154138#: qml/Components/ModeSwitchWarningDialog.qml:57
139+msgctxt ""
140+"Re-dock means connect the device again to an external screen/mouse/keyboard"
155141msgid "Re-dock, save your work and close these apps to continue."
156142msgstr ""
157143
@@ -171,82 +157,98 @@ msgstr ""
171157msgid "Close all"
172158msgstr ""
173159
174−#: qml/Dash/DashPageHeader.qml:265
160+#: qml/Dash/DashPageHeader.qml:337
175161msgctxt "Button: Open the Ubuntu Store"
176162msgid "Store"
177−msgstr ""
163+msgstr "স্টোর"
178164
179−#: qml/Dash/DashPageHeader.qml:272
165+#: qml/Dash/DashPageHeader.qml:344
180166msgctxt "Button: Start a search in the current dash scope"
181167msgid "Search"
182−msgstr ""
168+msgstr "খুঁজুন"
183169
184−#: qml/Dash/DashPageHeader.qml:282
170+#: qml/Dash/DashPageHeader.qml:354
185171msgctxt "Button: Show the current dash scope settings"
186172msgid "Settings"
187−msgstr ""
173+msgstr "সেটিংস"
188174
189−#: qml/Dash/DashPageHeader.qml:289
175+#: qml/Dash/DashPageHeader.qml:361
190176msgid "Remove from Favorites"
191−msgstr ""
177+msgstr "পছন্দ থেকে মুছে ফেলুন"
192178
193−#: qml/Dash/DashPageHeader.qml:289
179+#: qml/Dash/DashPageHeader.qml:361
194180msgid "Add to Favorites"
181+msgstr "পছন্দতে যোগ করুন"
182+
183+#: qml/Dash/FiltersPopover.qml:60
184+msgid "Refine your results"
185+msgstr ""
186+
187+#: qml/Dash/FiltersPopover.qml:69
188+msgid "Reset"
195189msgstr ""
196190
197−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
198−msgid "See less"
191+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192+msgid "Show less"
199193msgstr ""
200194
201−#: qml/Dash/GenericScopeView.qml:576
202−msgid "See all"
195+#: qml/Dash/GenericScopeView.qml:570
196+msgid "Show all"
203197msgstr ""
204198
205−#: qml/Dash/GenericScopeView.qml:638
199+#: qml/Dash/GenericScopeView.qml:627
206200msgctxt "Label: Hint for dash search line edit"
207201msgid "Search"
202+msgstr "খুঁজুন"
203+
204+#: qml/Dash/PageHeaderExtraPanel.qml:55
205+msgid "Recent Searches"
206+msgstr ""
207+
208+#: qml/Dash/PageHeaderExtraPanel.qml:66
209+msgid "Clear All"
208210msgstr ""
209211
210212#: qml/Dash/Previews/PreviewActionCombo.qml:35
211213msgid "More..."
212−msgstr ""
214+msgstr "আরো..."
213215
214216#: qml/Dash/Previews/PreviewActionCombo.qml:35
215217msgid "Less..."
216−msgstr ""
218+msgstr "কম..."
217219
218220#: qml/Dash/Previews/PreviewCommentInput.qml:68
219221#: qml/Dash/Previews/PreviewRatingInput.qml:174
220222msgid "Send"
221−msgstr ""
223+msgstr "পাঠান"
222224
223225#: qml/Dash/Previews/PreviewRatingInput.qml:84
224226msgid "Rate this"
225−msgstr ""
227+msgstr "রেটিং দিন"
226228
227229#: qml/Dash/Previews/PreviewRatingInput.qml:129
228230msgid "Add a review"
229−msgstr ""
231+msgstr "আপনার মতামত দিন"
230232
231−#: qml/Dash/Previews/PreviewSharing.qml:51
233+#: qml/Dash/Previews/PreviewSharing.qml:66
232234msgid "Preview Share Item"
233235msgstr ""
234236
235237#: qml/Dash/PullToRefreshScopeStyle.qml:55
236238msgid "Pull to refresh…"
237−msgstr ""
239+msgstr "রিফ্রেশ করার জন্য টানুন"
238240
239241#: qml/Dash/PullToRefreshScopeStyle.qml:60
240242msgid "Release to refresh…"
241−msgstr ""
243+msgstr "রিফ্রেশ করার জন্য ছেড়ে দিন"
242244
243245#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
244246msgid "Enable location data"
245−msgstr ""
247+msgstr "অবস্থান নির্ণয় চালু করুন"
246248
247249#: qml/Dash/ScopesList.qml:67
248250msgid "Manage"
249−msgstr ""
251+msgstr "ব্যবস্থাপনা"
250252
251253#: qml/Dash/ScopesList.qml:113
252254msgid "Home"
@@ -254,149 +256,152 @@ msgstr ""
254256
255257#: qml/Dash/ScopesList.qml:114
256258msgid "Also installed"
257−msgstr ""
259+msgstr "আরও ইন্সটল করা রয়েছে..."
258260
259−#: qml/DisabledScreenNotice.qml:42
260−msgid "Your device is now connected to an external display."
261+#: qml/DisabledScreenNotice.qml:104
262+msgid ""
263+"Your device is now connected to an external display. Use this screen as a "
264+"touch pad to interact with the pointer."
261265msgstr ""
262266
263−#: qml/Greeter/CoverPage.qml:107
267+#: qml/Greeter/CoverPage.qml:118
264268msgid "Unlock"
265−msgstr ""
269+msgstr "লক খুলুন"
266270
267−#: qml/Greeter/LoginList.qml:236
271+#: qml/Greeter/LoginList.qml:239
268272msgid "Retry"
269273msgstr ""
270274
271−#: qml/Greeter/LoginList.qml:237
275+#: qml/Greeter/LoginList.qml:240
272276msgid "Tap to unlock"
273−msgstr ""
277+msgstr "লক খোলার জন্য চাপ দিন"
274278
275−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
279+#: qml/Greeter/NarrowView.qml:54
276280msgid "Sorry, incorrect passphrase."
277−msgstr ""
281+msgstr "দুঃখিত, পাসওয়ার্ডটি ভুল হয়েছে।"
278282
279−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
283+#: qml/Greeter/NarrowView.qml:55
280284msgid "Sorry, incorrect passcode."
281−msgstr ""
285+msgstr "দুঃখিত, পাসকোডটি ভুল হয়েছে।"
282286
283287#: qml/Greeter/NarrowView.qml:56
284288msgid "This will be your last attempt."
285−msgstr ""
289+msgstr "এটিই আপনার সর্বশেষ সুযোগ।"
286290
287291#: qml/Greeter/NarrowView.qml:58
288292msgid ""
289293"If passphrase is entered incorrectly, your phone will conduct a factory "
290294"reset and all personal data will be deleted."
291295msgstr ""
296+"ভুল পাসওয়ার্ড প্রদান করলে, আপনার ফোনটিতে থাকা সকল ব্যক্তিগত তথ্য মুছে যাবে।"
292297
293298#: qml/Greeter/NarrowView.qml:59
294299msgid ""
295300"If passcode is entered incorrectly, your phone will conduct a factory reset "
296301"and all personal data will be deleted."
297−msgstr ""
302+msgstr "ভুল পাসকোড প্রদান করলে, আপনার ফোনটির সকল ব্যক্তিগত তথ্য মুছে যাবে।"
298303
299304#: qml/Greeter/NarrowView.qml:116
300305#, qt-format
301306msgid "Enter %1"
302−msgstr ""
307+msgstr "%1 লিখুন"
303308
304−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
309+#: qml/Greeter/NarrowView.qml:117
305310msgid "Enter passphrase"
306−msgstr ""
311+msgstr "পাসওয়ার্ড লিখুন"
307312
308313#: qml/Greeter/NarrowView.qml:118
309314msgid "Enter passcode"
310−msgstr ""
315+msgstr "পাসকোড লিখুন"
311316
312317#: qml/Greeter/NarrowView.qml:119
313318#, qt-format
314319msgid "Sorry, incorrect %1"
315−msgstr ""
320+msgstr "দুঃখিত, %1 ভুল হয়েছে"
316321
317322#: qml/Greeter/NarrowView.qml:120
318323msgid "Sorry, incorrect passphrase"
319−msgstr ""
324+msgstr "দুঃখিত, পাসওয়ার্ড ভুল হয়েছে"
320325
321326#: qml/Greeter/NarrowView.qml:121
322327msgctxt "passphrase"
323328msgid "Please re-enter"
324−msgstr ""
329+msgstr "অনুগ্রহ করে আবার লিখুন"
325330
326331#: qml/Greeter/NarrowView.qml:122
327332msgid "Sorry, incorrect passcode"
328−msgstr ""
333+msgstr "দুঃখিত, পাসকোড ভুল হয়েছে"
329334
330−#: qml/Notifications/NotificationMenuItemFactory.qml:129
335+#: qml/Notifications/NotificationMenuItemFactory.qml:124
331336msgid "Show password"
332−msgstr ""
337+msgstr "পাসওয়ার্ড দেখান"
333338
334339#: qml/Panel/ActiveCallHint.qml:79
335340msgid "Tap to return to call..."
336−msgstr ""
341+msgstr "কলে ফিরে যেতে চাপ দিন..."
337342
338343#: qml/Panel/ActiveCallHint.qml:92
339344msgid "Conference"
340−msgstr ""
345+msgstr "কনফারেন্স"
341346
342−#: qml/Panel/Indicators/MenuItemFactory.qml:731
347+#: qml/Panel/Indicators/MenuItemFactory.qml:762
343348msgid "Nothing is playing"
344−msgstr ""
349+msgstr "কোন কিছু বাজছে না।"
345350
346−#: qml/Panel/Indicators/MenuItemFactory.qml:860
351+#: qml/Panel/Indicators/MenuItemFactory.qml:891
347352#, qt-format
348353msgid "%1 hour"
349354msgid_plural "%1 hours"
350−msgstr[0] ""
351−msgstr[1] ""
355+msgstr[0] "%1 ঘণ্টা"
356+msgstr[1] "%1 ঘণ্টা"
352357
353−#: qml/Panel/Indicators/MenuItemFactory.qml:864
358+#: qml/Panel/Indicators/MenuItemFactory.qml:895
354359#, qt-format
355360msgid "%1 minute"
356361msgid_plural "%1 minutes"
357−msgstr[0] ""
358−msgstr[1] ""
362+msgstr[0] "%1 মিনিট"
363+msgstr[1] "%1 মিনিট"
359364
360−#: qml/Panel/Indicators/MenuItemFactory.qml:869
365+#: qml/Panel/Indicators/MenuItemFactory.qml:900
361366#, qt-format
362367msgid "%1 second"
363368msgid_plural "%1 seconds"
364−msgstr[0] ""
365−msgstr[1] ""
369+msgstr[0] "%1 সেকেন্ড"
370+msgstr[1] "%1 সেকেন্ড"
366371
367−#: qml/Panel/Indicators/MenuItemFactory.qml:872
372+#: qml/Panel/Indicators/MenuItemFactory.qml:903
368373msgid "0 seconds"
369−msgstr ""
374+msgstr "0 সেকেন্ড"
370375
371376#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
372−#: qml/Panel/Indicators/MenuItemFactory.qml:874
377+#: qml/Panel/Indicators/MenuItemFactory.qml:905
373378#, qt-format
374379msgid "%1 remaining"
375−msgstr ""
380+msgstr "%1 বাকি"
376381
377−#: qml/Panel/Indicators/MenuItemFactory.qml:880
382+#: qml/Panel/Indicators/MenuItemFactory.qml:911
378383msgid "In queue…"
379−msgstr ""
384+msgstr "অপেক্ষায় রয়েছে..."
380385
381−#: qml/Panel/Indicators/MenuItemFactory.qml:884
386+#: qml/Panel/Indicators/MenuItemFactory.qml:915
382387msgid "Downloading"
383−msgstr ""
388+msgstr "ডাউনলোড হচ্ছে"
384389
385−#: qml/Panel/Indicators/MenuItemFactory.qml:886
390+#: qml/Panel/Indicators/MenuItemFactory.qml:917
386391msgid "Paused, tap to resume"
387−msgstr ""
392+msgstr "থামানো, শুরু করতে চাপ দিন"
388393
389−#: qml/Panel/Indicators/MenuItemFactory.qml:888
394+#: qml/Panel/Indicators/MenuItemFactory.qml:919
390395msgid "Canceled"
391−msgstr ""
396+msgstr "বাতিল হয়েছে"
392397
393−#: qml/Panel/Indicators/MenuItemFactory.qml:890
398+#: qml/Panel/Indicators/MenuItemFactory.qml:921
394399msgid "Finished"
395−msgstr ""
400+msgstr "শেষ"
396401
397−#: qml/Panel/Indicators/MenuItemFactory.qml:892
402+#: qml/Panel/Indicators/MenuItemFactory.qml:923
398403msgid "Failed, tap to retry"
399−msgstr ""
404+msgstr "ব্যার্থ হয়েছে, পুনরায় চেষ্টা করতে চাপ দিন"
400405
401406#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
402407#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
@@ -407,256 +412,469 @@ msgstr ""
407412#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
408413msgctxt "Label: Hint in message indicator line edit"
409414msgid "Reply"
410−msgstr ""
415+msgstr "উত্তর দিন"
411416
412417#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
413418msgctxt "Button: Call back on phone"
414419msgid "Call back"
420+msgstr "কল ব্যাক"
421+
422+#: qml/Stages/SideStage.qml:76
423+msgid "Drag using 3 fingers any application from one window to the other"
415424msgstr ""
416425
417−#: qml/Panel/Indicators/ModemInfoItem.qml:105
418−msgid "Unlock SIM"
426+#: qml/Tutorial/TutorialBottom.qml:78
427+msgid "Swipe up to add a contact"
419428msgstr ""
420429
421−#: qml/Panel/Indicators/RoamingIndication.qml:27
422−msgid "Roaming"
430+#: qml/Tutorial/TutorialBottom.qml:80
431+msgid "Swipe up for favorite calculations"
423432msgstr ""
424433
425−#: qml/Tutorial/TutorialBottom.qml:28
426−msgid "Open special menus"
434+#: qml/Tutorial/TutorialBottom.qml:82
435+msgid "Swipe up for recent calls"
427436msgstr ""
428437
429−#: qml/Tutorial/TutorialBottom.qml:29
430−msgid "Swipe up from the bottom edge."
438+#: qml/Tutorial/TutorialBottom.qml:84
439+msgid "Swipe up to create a message"
431440msgstr ""
432441
433−#: qml/Tutorial/TutorialBottomFinish.qml:24
434−msgid "This action does different things for different apps"
442+#: qml/Tutorial/TutorialBottom.qml:85
443+msgid "Swipe up to manage the app"
435444msgstr ""
436445
437−#: qml/Tutorial/TutorialBottomFinish.qml:25
438−msgid "Tap here to finish."
446+#: qml/Tutorial/TutorialLeftLong.qml:47
447+msgid "Long swipe from the left edge to open the Today scope"
439448msgstr ""
440449
441−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
442−#: qml/Tutorial/TutorialRight.qml:144
443−msgid "Tap here to continue."
450+#: qml/Tutorial/TutorialLeft.qml:47
451+msgid "Swipe from the left edge to open the launcher"
444452msgstr ""
445453
446−#: qml/Tutorial/TutorialLeft.qml:26
447−msgid "Open the launcher"
454+#: qml/Tutorial/TutorialRight.qml:55
455+msgid "Push your mouse against the right edge to view your open apps"
448456msgstr ""
449457
450−#: qml/Tutorial/TutorialLeft.qml:27
451−msgid "Short swipe from the left edge."
458+#: qml/Tutorial/TutorialRight.qml:56
459+msgid "Short or long swipe from the right edge to view your open apps"
452460msgstr ""
453461
454−#: qml/Tutorial/TutorialLeftFinish.qml:24
455−msgid "These are the shortcuts to favorite apps"
462+#: qml/Tutorial/TutorialTop.qml:53
463+msgid "Swipe from the top right edge to open the notification bar"
456464msgstr ""
457465
458−#: qml/Tutorial/TutorialPage.qml:178
459−msgid "You almost got it!"
466+#: qml/Tutorial/TutorialTop.qml:54
467+msgid "Swipe from the top edge to open the notification bar"
460468msgstr ""
461469
462−#: qml/Tutorial/TutorialPage.qml:195
463−msgid "Try again."
470+#: qml/Wizard/Page.qml:54
471+msgctxt "Button: Go back one page in the Wizard"
472+msgid "Back"
464473msgstr ""
465474
466−#: qml/Tutorial/TutorialRight.qml:31
467−msgid "To view open apps"
475+#: qml/Wizard/Pages/10-welcome.qml:27
476+msgid "Language"
468477msgstr ""
469478
470−#: qml/Tutorial/TutorialRight.qml:32
471−msgid "Long swipe from the right edge."
479+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
480+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
481+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
482+#: qml/Wizard/Pages/75-report-check.qml:84
483+#: qml/Wizard/Pages/passcode-desktop.qml:124
484+#: qml/Wizard/Pages/password-set.qml:141
485+msgid "Next"
472486msgstr ""
473487
474−#: qml/Tutorial/TutorialRight.qml:122
475−msgid "View all your running tasks."
488+#: qml/Wizard/Pages/30-wifi.qml:29
489+msgid "Connect to Wi‑Fi"
476490msgstr ""
477491
478−#: qml/Wizard/Page.qml:89
479−msgctxt "Button: Go back one page in the Wizard"
480−msgid "Back"
492+#: qml/Wizard/Pages/30-wifi.qml:130
493+msgid "Connected"
481494msgstr ""
482495
483−#: qml/Wizard/Pages/10-welcome.qml:27
484−msgid "Hi!"
496+#: qml/Wizard/Pages/30-wifi.qml:163
497+msgid "Available Wi-Fi networks"
485498msgstr ""
486499
487−#: qml/Wizard/Pages/10-welcome.qml:44
488−msgid "Welcome to your Ubuntu phone."
500+#: qml/Wizard/Pages/30-wifi.qml:164
501+msgid "No available Wi-Fi networks"
489502msgstr ""
490503
491−#: qml/Wizard/Pages/10-welcome.qml:52
492−msgid "Let’s get started."
504+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
505+#: qml/Wizard/Pages/sim.qml:101
506+msgid "Skip"
507+msgstr "এড়িয়ে যান"
508+
509+#: qml/Wizard/Pages/40-location.qml:27
510+msgid "Location Services"
493511msgstr ""
494512
495−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
496−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
497−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
498−#: qml/Wizard/Pages/passwd-set.qml:90
499−msgid "Continue"
513+#: qml/Wizard/Pages/40-location.qml:83
514+msgid ""
515+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
516+"(recommended)"
500517msgstr ""
501518
502−#: qml/Wizard/Pages/20-sim.qml:25
503−msgid "Add a SIM card and restart your device"
519+#: qml/Wizard/Pages/40-location.qml:105
520+#, qt-format
521+msgid "By selecting this option you agree to the Nokia HERE %1."
504522msgstr ""
505523
506−#: qml/Wizard/Pages/20-sim.qml:59
507−msgid "Without it, you won’t be able to make calls or use text messaging."
524+#: qml/Wizard/Pages/40-location.qml:106
525+msgctxt "part of: Nokia HERE terms and conditions"
526+msgid "terms and conditions"
508527msgstr ""
509528
510−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
511−msgid "Skip"
529+#: qml/Wizard/Pages/40-location.qml:160
530+msgid "GPS only"
512531msgstr ""
513532
514−#: qml/Wizard/Pages/30-passwd-type.qml:39
515−msgid "Lock security"
533+#: qml/Wizard/Pages/40-location.qml:214
534+msgid "Don't use my location"
516535msgstr ""
517536
518−#: qml/Wizard/Pages/30-passwd-type.qml:74
519−msgid "Please select how you’d like to unlock your phone."
537+#: qml/Wizard/Pages/40-location.qml:260
538+msgid "You can change it later in System Settings."
520539msgstr ""
521540
522−#: qml/Wizard/Pages/30-passwd-type.qml:97
523−msgctxt "Label: Type of security method"
524−msgid "Swipe"
541+#: qml/Wizard/Pages/50-timezone.qml:29
542+msgid "Time Zone"
543+msgstr ""
544+
545+#: qml/Wizard/Pages/50-timezone.qml:178
546+msgid "Enter your city"
547+msgstr ""
548+
549+#: qml/Wizard/Pages/60-account.qml:24
550+msgid "Personalize Your Device"
551+msgstr ""
552+
553+#: qml/Wizard/Pages/60-account.qml:48
554+msgid "Preferred Name"
525555msgstr ""
526556
527−#: qml/Wizard/Pages/30-passwd-type.qml:98
528−msgctxt "Label: Description of security method"
529−msgid "No security"
557+#: qml/Wizard/Pages/70-passwd-type.qml:39
558+msgid "Lock Screen"
530559msgstr ""
531560
532−#: qml/Wizard/Pages/30-passwd-type.qml:100
561+#: qml/Wizard/Pages/70-passwd-type.qml:101
533562msgctxt "Label: Type of security method"
534−msgid "Passcode"
563+msgid "Create new password"
535564msgstr ""
536565
537−#: qml/Wizard/Pages/30-passwd-type.qml:101
538−msgctxt "Label: Description of security method"
539−msgid "4 digits only"
566+#: qml/Wizard/Pages/70-passwd-type.qml:103
567+msgctxt "Label: Type of security method"
568+msgid "Create passcode (numbers only)"
540569msgstr ""
541570
542−#: qml/Wizard/Pages/30-passwd-type.qml:103
571+#: qml/Wizard/Pages/70-passwd-type.qml:105
543572msgctxt "Label: Type of security method"
544−msgid "Passphrase"
573+msgid "No lock code"
545574msgstr ""
546575
547−#: qml/Wizard/Pages/30-passwd-type.qml:104
548−msgctxt "Label: Description of security method"
549−msgid "Numbers and letters"
576+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
577+msgid "Privacy Policy"
550578msgstr ""
551579
552−#: qml/Wizard/Pages/40-wifi.qml:29
553−msgid "Connect to Wi‑Fi"
580+#: qml/Wizard/Pages/75-report-check.qml:26
581+msgid "Help Us Improve"
554582msgstr ""
555583
556−#: qml/Wizard/Pages/40-wifi.qml:168
557−msgid "Available networks…"
584+#: qml/Wizard/Pages/75-report-check.qml:59
585+msgid "Improve system performance by sending us crashes and error reports."
558586msgstr ""
559587
560−#: qml/Wizard/Pages/40-wifi.qml:169
561−msgid "No available networks."
588+#: qml/Wizard/Pages/75-report-check.qml:60
589+msgid "Privacy policy"
562590msgstr ""
563591
564−#: qml/Wizard/Pages/50-location.qml:27
565−msgid "Location"
592+#: qml/Wizard/Pages/80-finished.qml:89
593+msgid "Welcome to Ubuntu"
566594msgstr ""
567595
568−#: qml/Wizard/Pages/50-location.qml:62
569−msgid "Let the phone detect your location:"
596+#: qml/Wizard/Pages/80-finished.qml:104
597+msgid "You are ready to use your device now"
570598msgstr ""
571599
572−#: qml/Wizard/Pages/50-location.qml:69
573−msgid "Using GPS only (less accurate)"
600+#: qml/Wizard/Pages/80-finished.qml:124
601+msgid "Get Started"
602+msgstr ""
603+
604+#: qml/Wizard/Pages/here-terms.qml:25
605+msgid "Terms & Conditions"
574606msgstr ""
575607
576−#: qml/Wizard/Pages/50-location.qml:86
577−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
608+#: qml/Wizard/Pages/here-terms.qml:69
609+msgid "Your device uses positioning technologies provided by HERE."
578610msgstr ""
579611
580−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
581−#: qml/Wizard/Pages/50-location.qml:103
612+#: qml/Wizard/Pages/here-terms.qml:81
582613msgid ""
583−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
584−"conditions</a>."
614+"To provide you with positioning services and to improve their quality, HERE "
615+"collects information about nearby cell towers and Wi-Fi hotspots around your "
616+"current location whenever your position is being found."
585617msgstr ""
586618
587−#: qml/Wizard/Pages/50-location.qml:112
588−msgid "Not at all"
619+#: qml/Wizard/Pages/here-terms.qml:93
620+msgid ""
621+"The information collected is used to analyze the service and to improve the "
622+"use of service, but not to identify you personally."
589623msgstr ""
590624
591−#: qml/Wizard/Pages/50-location.qml:124
592−msgid "You can change your mind later in <b>System Settings</b>."
625+#: qml/Wizard/Pages/here-terms.qml:106
626+#, qt-format
627+msgid "By continuing, you agree to the HERE platform %1 and %2."
593628msgstr ""
594629
595−#: qml/Wizard/Pages/60-reporting.qml:26
596−msgid "Improving your experience"
630+#: qml/Wizard/Pages/here-terms.qml:107
631+msgid "Service Terms"
597632msgstr ""
598633
599−#: qml/Wizard/Pages/60-reporting.qml:46
600−msgid ""
601−"Your phone is set up to automatically report errors to Canonical and its "
602−"partners, the makers of the operating system."
634+#: qml/Wizard/Pages/passcode-confirm.qml:43
635+#: qml/Wizard/Pages/passcode-desktop.qml:80
636+msgid "Confirm passcode"
603637msgstr ""
604638
605−#: qml/Wizard/Pages/60-reporting.qml:53
606−msgid ""
607−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
608−"Privacy</b>"
639+#: qml/Wizard/Pages/passcode-confirm.qml:45
640+msgid "Incorrect passcode."
609641msgstr ""
610642
611−#: qml/Wizard/Pages/80-finished.qml:24
612−msgid "All done"
643+#: qml/Wizard/Pages/passcode-confirm.qml:45
644+msgctxt "Enter the passcode again"
645+msgid "Please re-enter."
613646msgstr ""
614647
615−#: qml/Wizard/Pages/80-finished.qml:39
616−msgid "Nice work!"
648+#: qml/Wizard/Pages/passcode-desktop.qml:30
649+msgid "Lock Screen Passcode"
617650msgstr ""
618651
619−#: qml/Wizard/Pages/80-finished.qml:46
620−msgid "Your phone is now ready to use."
652+#: qml/Wizard/Pages/passcode-desktop.qml:56
653+msgid "Enter 4 numbers to setup your passcode"
621654msgstr ""
622655
623−#: qml/Wizard/Pages/80-finished.qml:53
624−msgid "Finish"
656+#: qml/Wizard/Pages/passcode-desktop.qml:65
657+#: qml/Wizard/Pages/passcode-set.qml:54
658+msgid "Choose passcode"
625659msgstr ""
626660
627−#: qml/Wizard/Pages/here-terms.qml:27
628−msgid "Terms & Conditions"
661+#: qml/Wizard/Pages/passcode-desktop.qml:105
662+msgid "Passcode too short"
629663msgstr ""
630664
631−#: qml/Wizard/Pages/passwd-confirm.qml:49
632−msgid "Confirm passphrase"
665+#: qml/Wizard/Pages/passcode-desktop.qml:107
666+msgid "Passcodes match"
633667msgstr ""
634668
635−#: qml/Wizard/Pages/passwd-confirm.qml:50
636−msgid "Confirm passcode"
669+#: qml/Wizard/Pages/passcode-desktop.qml:109
670+msgid "Passcodes do not match"
637671msgstr ""
638672
639−#: qml/Wizard/Pages/passwd-confirm.qml:53
640−#: qml/Wizard/Pages/passwd-confirm.qml:54
641−msgid "Please try again."
673+#: qml/Wizard/Pages/passcode-set.qml:62
674+msgid "Passcode must be 4 characters long"
642675msgstr ""
643676
644−#: qml/Wizard/Pages/passwd-set.qml:61
645−msgid "Choose your passcode"
677+#: qml/Wizard/Pages/password-set.qml:30
678+msgid "Lock Screen Password"
646679msgstr ""
647680
648−#: qml/Wizard/Pages/passwd-set.qml:68
649−msgid "Passphrase must be 4 characters long"
681+#: qml/Wizard/Pages/password-set.qml:61
682+msgid "Enter at least 8 characters"
650683msgstr ""
651684
652−#. Translators: This is the arrow for "Back" buttons
653−#: qml/Wizard/StackButton.qml:39
654−#, qt-format
655−msgid "〈 %1"
685+#: qml/Wizard/Pages/password-set.qml:73
686+msgid "Choose password"
656687msgstr ""
657688
658−#. Translators: This is the arrow for "Forward" buttons
659−#: qml/Wizard/StackButton.qml:42
660−#, qt-format
661−msgid "%1 〉"
689+#: qml/Wizard/Pages/password-set.qml:103
690+msgid "Confirm password"
691+msgstr ""
692+
693+#: qml/Wizard/Pages/sim.qml:27
694+msgid "No SIM card installed"
695+msgstr ""
696+
697+#: qml/Wizard/Pages/sim.qml:54
698+msgid "SIM card added"
699+msgstr ""
700+
701+#: qml/Wizard/Pages/sim.qml:55
702+msgid "You must restart the device to access the mobile network."
703+msgstr ""
704+
705+#: qml/Wizard/Pages/sim.qml:59
706+msgid "Restart"
707+msgstr "পুনরায় চালু"
708+
709+#: qml/Wizard/Pages/sim.qml:78
710+msgid "You won’t be able to make calls or use text messaging without a SIM."
711+msgstr ""
712+
713+#: qml/Wizard/Pages/sim.qml:90
714+msgid "To proceed with no SIM tap Skip."
715+msgstr ""
716+
717+#: qml/Wizard/PasswordMeter.qml:87
718+msgid "Passwords match"
719+msgstr ""
720+
721+#: qml/Wizard/PasswordMeter.qml:89
722+msgid "Passwords do not match"
723+msgstr ""
724+
725+#: qml/Wizard/PasswordMeter.qml:93
726+msgid "Strong password"
727+msgstr ""
728+
729+#: qml/Wizard/PasswordMeter.qml:95
730+msgid "Fair password"
731+msgstr ""
732+
733+#: qml/Wizard/PasswordMeter.qml:97
734+msgid "Weak password"
735+msgstr ""
736+
737+#: qml/Wizard/PasswordMeter.qml:99
738+msgid "Very weak password"
662739msgstr ""
740+
741+#~ msgctxt "Button: Reboot the system"
742+#~ msgid "Reboot"
743+#~ msgstr "পুনরায় চালু করুন"
744+
745+#~ msgid "See all"
746+#~ msgstr "সব দেখুন"
747+
748+#~ msgid "See less"
749+#~ msgstr "কম দেখুন"
750+
751+#~ msgid "This action does different things for different apps"
752+#~ msgstr "এই কাজটি বিভিন্ন অ্যাপের জন্য ভিন্ন ভিন্ন ভাবে কাজ করে।"
753+
754+#~ msgid "To view open apps"
755+#~ msgstr "সচল অ্যাপগুলো দেখার জন্য"
756+
757+#~ msgid "Welcome to your Ubuntu phone."
758+#~ msgstr "আপনার উবুন্টু ফোনে স্বাগতম।"
759+
760+#~ msgid "Try again."
761+#~ msgstr "আবার চেষ্টা করুন"
762+
763+#~ msgid "You almost got it!"
764+#~ msgstr "আপনি প্রায় পেরে গেছেন!"
765+
766+#~ msgid "Open the launcher"
767+#~ msgstr "লঞ্চার খুলুন"
768+
769+#~ msgctxt "Label: Type of security method"
770+#~ msgid "Passcode"
771+#~ msgstr "পাসকোড"
772+
773+#~ msgid "Add a SIM card and restart your device"
774+#~ msgstr "সিম কার্ড যোগ করুন এবং ফোন পুনরায় চালু করুন।"
775+
776+#~ msgid "Without it, you won’t be able to make calls or use text messaging."
777+#~ msgstr "এটি ছাড়া, আপনি ফোন কল বা টেক্সট মেসেজ ব্যবহার করতে পারবেন না।"
778+
779+#~ msgid "Tap here to continue."
780+#~ msgstr "অগ্রসর হওয়ার জন্য এখানে চাপ দিন।"
781+
782+#~ msgid "Swipe up from the bottom edge."
783+#~ msgstr "নিচের প্রান্ত হতে উপরের দিকে সোয়াইপ করুন।"
784+
785+#~ msgctxt "Label: Description of security method"
786+#~ msgid "No security"
787+#~ msgstr "কোন নিরাপত্তা নেই"
788+
789+#~ msgid "Log out"
790+#~ msgstr "লগ অাউট"
791+
792+#~ msgid "Are you sure you want to shut down?"
793+#~ msgstr "আপনি কি কম্পিউটার বন্ধ করতে চান?"
794+
795+#~ msgid "Reboot"
796+#~ msgstr "পুনরায় চালু করুন"
797+
798+#~ msgid "Shut down"
799+#~ msgstr "বন্ধ করুন"
800+
801+#~ msgid "Power off"
802+#~ msgstr "বন্ধ করুন"
803+
804+#~ msgid "Top edge"
805+#~ msgstr "উপরের প্রান্ত"
806+
807+#~ msgid "Close"
808+#~ msgstr "বন্ধ"
809+
810+#~ msgid "Left edge"
811+#~ msgstr "বাম প্রান্ত"
812+
813+#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
814+#~ msgstr "অ্যাপসমূহে দ্রুত যাওয়ার লঞ্চার পেতে হলে বাম প্রান্ত থেকে সোয়াইপ করুন"
815+
816+#~ msgid "Well done"
817+#~ msgstr "অস্থির!"
818+
819+#~ msgid "Try swiping from the right edge to unlock the phone"
820+#~ msgstr "ফোনটির লক খুলতে ডান প্রান্ত থেকে সোয়াইপ করুন"
821+
822+#~ msgid "Right edge"
823+#~ msgstr "ডান প্রান্ত"
824+
825+#~ msgid "Settings"
826+#~ msgstr "সেটিংস"
827+
828+#~ msgid "Store"
829+#~ msgstr "স্টোর"
830+
831+#~ msgid "Search"
832+#~ msgstr "খুঁজুন"
833+
834+#~ msgid "Type or say a command"
835+#~ msgstr "কমান্ড লিখুন বা বলুন"
836+
837+#~ msgid "Loading. Please Wait..."
838+#~ msgstr "অপেক্ষা করুন..."
839+
840+#~ msgid "Speaking..."
841+#~ msgstr "বলা হচ্ছে..."
842+
843+#~ msgid "Speak Now..."
844+#~ msgstr "এখন বলুন..."
845+
846+#~ msgid "Unlock SIM"
847+#~ msgstr "সিম লক খুলুন করুন"
848+
849+#~ msgid "Roaming"
850+#~ msgstr "রোমিং"
851+
852+#~ msgid "Please re-enter"
853+#~ msgstr "অনুগ্রহ করে আবার লিখুন"
854+
855+#~ msgctxt "Button: Shut down the system"
856+#~ msgid "Shut down"
857+#~ msgstr "বন্ধ করুন"
858+
859+#~ msgctxt "Title: Reboot/Shut down dialog"
860+#~ msgid "Shut down"
861+#~ msgstr "বন্ধ করুন"
862+
863+#~ msgid "Let’s get started."
864+#~ msgstr "আসুন শুরু করা যাক।"
865+
866+#~ msgid "These are the shortcuts to favorite apps"
867+#~ msgstr "এগুলো আপনার প্রিয় অ্যাপেরর শর্টকাট"
868+
869+#~ msgid "Lock security"
870+#~ msgstr "নিরাপত্তা লক"
871+
872+#~ msgid "Please select how you’d like to unlock your phone."
873+#~ msgstr "আপনি কিভাবে ফোনের লক খুলতে চান তা নির্ধারণ করুন।"
874+
875+#~ msgctxt "Label: Description of security method"
876+#~ msgid "4 digits only"
877+#~ msgstr "কেবল মাত্র ৪টি সংখ্যা"
878+
879+#~ msgid "Continue"
880+#~ msgstr "পরবর্তী"
po/br.po+536−274
@@ -7,31 +7,31 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
11−"PO-Revision-Date: 2015-10-05 06:47+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
11+"PO-Revision-Date: 2016-04-27 12:20+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2015-12-12 05:44+0000\n"
19−"X-Generator: Launchpad (build 17865)\n"
18+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
2323msgstr "Ger-tremen : "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:47
26−#: plugins/Unity/Launcher/launcheritem.cpp:106
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
2727msgid "Pin shortcut"
2828msgstr "Spilhennañ ar verradenn"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:52
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
3232msgstr "Mont kuit"
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:106
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
3636msgstr "Dispilhennañ ar verradenn"
3737
@@ -77,53 +77,35 @@ msgctxt "Button: Log out from the system"
7777msgid "Log Out"
7878msgstr "Digevreañ"
7979
80−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
81−#: qml/Components/Dialogs.qml:253
80+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
81+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
82+#: qml/Wizard/Pages/passcode-set.qml:32
8283msgid "Cancel"
8384msgstr "Nullañ"
8485
8586#: qml/Components/Dialogs.qml:173
86−msgctxt "Title: Reboot/Shut down dialog"
87−msgid "Shut down"
88−msgstr "Lazhañ ar benveg"
89−
90−#: qml/Components/Dialogs.qml:174
91−msgid "Are you sure you want to shut down?"
92−msgstr "Ha sur oc'h e fell deoc'h lazhañ ar benveg ?"
93−
94−#: qml/Components/Dialogs.qml:176
95−msgctxt "Button: Reboot the system"
96−msgid "Reboot"
97−msgstr "Adloc'hañ"
98−
99−#: qml/Components/Dialogs.qml:185
100−msgctxt "Button: Shut down the system"
101−msgid "Shut down"
102−msgstr "Lazhañ ar benveg"
103−
104−#: qml/Components/Dialogs.qml:207
10587msgctxt "Title: Reboot dialog"
10688msgid "Reboot"
10789msgstr "Adloc'hañ"
10890
109−#: qml/Components/Dialogs.qml:208
91+#: qml/Components/Dialogs.qml:174
11092msgid "Are you sure you want to reboot?"
11193msgstr "Ha sur oc'h e fell deoc'h adloc'hañ ?"
11294
113−#: qml/Components/Dialogs.qml:210
95+#: qml/Components/Dialogs.qml:176
11496msgid "No"
11597msgstr "N'on ket"
11698
117−#: qml/Components/Dialogs.qml:217
99+#: qml/Components/Dialogs.qml:182
118100msgid "Yes"
119101msgstr "Ya"
120102
121−#: qml/Components/Dialogs.qml:232
103+#: qml/Components/Dialogs.qml:197
122104msgctxt "Title: Power off/Restart dialog"
123105msgid "Power"
124106msgstr "Enaouiñ"
125107
126−#: qml/Components/Dialogs.qml:233
108+#: qml/Components/Dialogs.qml:198
127109msgid ""
128110"Are you sure you would like\n"
129111"to power off?"
@@ -131,88 +113,109 @@ msgstr ""
131113"Ha sur oc'h e fell deoc'h\n"
132114"troc'hañ an tredan ?"
133115
134−#: qml/Components/Dialogs.qml:235
116+#: qml/Components/Dialogs.qml:200
135117msgctxt "Button: Power off the system"
136118msgid "Power off"
137119msgstr "Lazhañ"
138120
139−#: qml/Components/Dialogs.qml:244
121+#: qml/Components/Dialogs.qml:209
140122msgctxt "Button: Restart the system"
141123msgid "Restart"
142124msgstr "Adloc'hañ"
143125
144−#: qml/Components/Lockscreen.qml:245
126+#: qml/Components/Lockscreen.qml:231
145127msgid "Return to Call"
146128msgstr "Distreiñ d'ar bellgomzadenn"
147129
148−#: qml/Components/Lockscreen.qml:245
130+#: qml/Components/Lockscreen.qml:231
149131msgid "Emergency Call"
150132msgstr "Pellgomzadenn vallus"
151133
152−#: qml/Components/Lockscreen.qml:277
134+#: qml/Components/Lockscreen.qml:263
153135msgid "OK"
154136msgstr "Mat eo"
155137
156138#: qml/Components/ModeSwitchWarningDialog.qml:32
157139msgid "Apps may have unsaved data:"
158−msgstr ""
140+msgstr "Roadennoù ha n'int ket enrollet a c'hall bezañ gant an arloadoù :"
159141
160142#: qml/Components/ModeSwitchWarningDialog.qml:57
143+msgctxt ""
144+"Re-dock means connect the device again to an external screen/mouse/keyboard"
161145msgid "Re-dock, save your work and close these apps to continue."
162146msgstr ""
147+"Adkevreit ouzh ar savlec'h degemer, enrollot ho labour ha serrit an arloadoù-"
148+"mañ evit kenderc'hel."
163149
164150#: qml/Components/ModeSwitchWarningDialog.qml:63
165151msgid "Or force close now (unsaved data will be lost)."
166152msgstr ""
153+"Pe rediañ da serriñ bremañ (kollet e vo ar roadennoù n'int ket bet enrollet)."
167154
168155#: qml/Components/ModeSwitchWarningDialog.qml:75
169156msgid "OK, I will reconnect"
170−msgstr ""
157+msgstr "Mat eo, ez an da adkevreañ"
171158
172159#: qml/Components/ModeSwitchWarningDialog.qml:76
173160msgid "Reconnect now!"
174−msgstr ""
161+msgstr "Adkevreañ bremañ !"
175162
176163#: qml/Components/ModeSwitchWarningDialog.qml:88
177164msgid "Close all"
178−msgstr ""
165+msgstr "Serriñ pep tra"
179166
180−#: qml/Dash/DashPageHeader.qml:265
167+#: qml/Dash/DashPageHeader.qml:337
181168msgctxt "Button: Open the Ubuntu Store"
182169msgid "Store"
183170msgstr "Stal"
184171
185−#: qml/Dash/DashPageHeader.qml:272
172+#: qml/Dash/DashPageHeader.qml:344
186173msgctxt "Button: Start a search in the current dash scope"
187174msgid "Search"
188175msgstr "Klask"
189176
190−#: qml/Dash/DashPageHeader.qml:282
177+#: qml/Dash/DashPageHeader.qml:354
191178msgctxt "Button: Show the current dash scope settings"
192179msgid "Settings"
193180msgstr "Arventennoù"
194181
195−#: qml/Dash/DashPageHeader.qml:289
182+#: qml/Dash/DashPageHeader.qml:361
196183msgid "Remove from Favorites"
197184msgstr "Lemel eus ar sinedoù"
198185
199−#: qml/Dash/DashPageHeader.qml:289
186+#: qml/Dash/DashPageHeader.qml:361
200187msgid "Add to Favorites"
201188msgstr "Ouzhpennañ d'ar sinedoù"
202189
203−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
204−msgid "See less"
205−msgstr "Gwelet nebeutoc'h"
190+#: qml/Dash/FiltersPopover.qml:60
191+msgid "Refine your results"
192+msgstr "Purañ ho tisoc'hoù"
206193
207−#: qml/Dash/GenericScopeView.qml:576
208−msgid "See all"
209−msgstr "Gwelet pep tra"
194+#: qml/Dash/FiltersPopover.qml:69
195+msgid "Reset"
196+msgstr "Adderaouekaat"
210197
211−#: qml/Dash/GenericScopeView.qml:638
198+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
199+msgid "Show less"
200+msgstr ""
201+
202+#: qml/Dash/GenericScopeView.qml:570
203+msgid "Show all"
204+msgstr ""
205+
206+#: qml/Dash/GenericScopeView.qml:627
212207msgctxt "Label: Hint for dash search line edit"
213208msgid "Search"
214209msgstr "Klask"
215210
211+#: qml/Dash/PageHeaderExtraPanel.qml:55
212+msgid "Recent Searches"
213+msgstr "Enklaskoù graet nevez zo"
214+
215+#: qml/Dash/PageHeaderExtraPanel.qml:66
216+msgid "Clear All"
217+msgstr "Diverkañ pep tra"
218+
216219#: qml/Dash/Previews/PreviewActionCombo.qml:35
217220msgid "More..."
218221msgstr "Muioc'h..."
@@ -234,9 +237,9 @@ msgstr "Priziit an dra-mañ"
234237msgid "Add a review"
235238msgstr "Ouzhpennañ un ali"
236239
237−#: qml/Dash/Previews/PreviewSharing.qml:51
240+#: qml/Dash/Previews/PreviewSharing.qml:66
238241msgid "Preview Share Item"
239−msgstr ""
242+msgstr "Rakwelet an elfenn lodet"
240243
241244#: qml/Dash/PullToRefreshScopeStyle.qml:55
242245msgid "Pull to refresh…"
@@ -262,27 +265,29 @@ msgstr "Er gêr"
262265msgid "Also installed"
263266msgstr "Staliet ivez"
264267
265−#: qml/DisabledScreenNotice.qml:42
266−msgid "Your device is now connected to an external display."
268+#: qml/DisabledScreenNotice.qml:104
269+msgid ""
270+"Your device is now connected to an external display. Use this screen as a "
271+"touch pad to interact with the pointer."
267272msgstr ""
268273
269−#: qml/Greeter/CoverPage.qml:107
274+#: qml/Greeter/CoverPage.qml:118
270275msgid "Unlock"
271276msgstr "Dibrennañ"
272277
273−#: qml/Greeter/LoginList.qml:236
278+#: qml/Greeter/LoginList.qml:239
274279msgid "Retry"
275280msgstr "Esaeañ en-dro"
276281
277−#: qml/Greeter/LoginList.qml:237
282+#: qml/Greeter/LoginList.qml:240
278283msgid "Tap to unlock"
279284msgstr "Pouezañ evit dibrennañ"
280285
281−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
286+#: qml/Greeter/NarrowView.qml:54
282287msgid "Sorry, incorrect passphrase."
283288msgstr "Siwazh, frazenn-dremen direizh"
284289
285−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
290+#: qml/Greeter/NarrowView.qml:55
286291msgid "Sorry, incorrect passcode."
287292msgstr "Siwazh, kod-tremen direizh"
288293
@@ -311,7 +316,7 @@ msgstr ""
311316msgid "Enter %1"
312317msgstr "Merkañ %1"
313318
314−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
319+#: qml/Greeter/NarrowView.qml:117
315320msgid "Enter passphrase"
316321msgstr "Merkañ ar frazenn-dremen"
317322
@@ -337,7 +342,7 @@ msgstr "Adverkañ, mar plij"
337342msgid "Sorry, incorrect passcode"
338343msgstr "Digarezit, kod-tremen direizh"
339344
340−#: qml/Notifications/NotificationMenuItemFactory.qml:129
345+#: qml/Notifications/NotificationMenuItemFactory.qml:124
341346msgid "Show password"
342347msgstr "Diskouez ar ger-tremen"
343348
@@ -349,62 +354,62 @@ msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
349354msgid "Conference"
350355msgstr "Kendiviz"
351356
352−#: qml/Panel/Indicators/MenuItemFactory.qml:731
357+#: qml/Panel/Indicators/MenuItemFactory.qml:762
353358msgid "Nothing is playing"
354359msgstr "Ne lenner netra bremañ"
355360
356−#: qml/Panel/Indicators/MenuItemFactory.qml:860
361+#: qml/Panel/Indicators/MenuItemFactory.qml:891
357362#, qt-format
358363msgid "%1 hour"
359364msgid_plural "%1 hours"
360365msgstr[0] "%1 eur"
361366msgstr[1] "%1 eur"
362367
363−#: qml/Panel/Indicators/MenuItemFactory.qml:864
368+#: qml/Panel/Indicators/MenuItemFactory.qml:895
364369#, qt-format
365370msgid "%1 minute"
366371msgid_plural "%1 minutes"
367372msgstr[0] "%1 vunutenn"
368373msgstr[1] "%1 vunutenn"
369374
370−#: qml/Panel/Indicators/MenuItemFactory.qml:869
375+#: qml/Panel/Indicators/MenuItemFactory.qml:900
371376#, qt-format
372377msgid "%1 second"
373378msgid_plural "%1 seconds"
374379msgstr[0] "%1 eilenn"
375380msgstr[1] "%1 eilenn"
376381
377−#: qml/Panel/Indicators/MenuItemFactory.qml:872
382+#: qml/Panel/Indicators/MenuItemFactory.qml:903
378383msgid "0 seconds"
379384msgstr "0 eilenn"
380385
381386#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
382−#: qml/Panel/Indicators/MenuItemFactory.qml:874
387+#: qml/Panel/Indicators/MenuItemFactory.qml:905
383388#, qt-format
384389msgid "%1 remaining"
385390msgstr "%1 o chom"
386391
387−#: qml/Panel/Indicators/MenuItemFactory.qml:880
392+#: qml/Panel/Indicators/MenuItemFactory.qml:911
388393msgid "In queue…"
389394msgstr "El lostennad..."
390395
391−#: qml/Panel/Indicators/MenuItemFactory.qml:884
396+#: qml/Panel/Indicators/MenuItemFactory.qml:915
392397msgid "Downloading"
393398msgstr "O pellgargañ"
394399
395−#: qml/Panel/Indicators/MenuItemFactory.qml:886
400+#: qml/Panel/Indicators/MenuItemFactory.qml:917
396401msgid "Paused, tap to resume"
397402msgstr "Ehanet, touchit evit adkregiñ"
398403
399−#: qml/Panel/Indicators/MenuItemFactory.qml:888
404+#: qml/Panel/Indicators/MenuItemFactory.qml:919
400405msgid "Canceled"
401406msgstr "Nullet"
402407
403−#: qml/Panel/Indicators/MenuItemFactory.qml:890
408+#: qml/Panel/Indicators/MenuItemFactory.qml:921
404409msgid "Finished"
405410msgstr "Echu"
406411
407−#: qml/Panel/Indicators/MenuItemFactory.qml:892
412+#: qml/Panel/Indicators/MenuItemFactory.qml:923
408413msgid "Failed, tap to retry"
409414msgstr "C'hwitet, touchit evit adkregiñ"
410415
@@ -412,7 +417,7 @@ msgstr "C'hwitet, touchit evit adkregiñ"
412417#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
413418msgctxt "Button: Send a reply message"
414419msgid "Send"
415−msgstr ""
420+msgstr "Kas"
416421
417422#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
418423msgctxt "Label: Hint in message indicator line edit"
@@ -422,262 +427,326 @@ msgstr "Respont"
422427#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
423428msgctxt "Button: Call back on phone"
424429msgid "Call back"
425−msgstr ""
426−
427−#: qml/Panel/Indicators/ModemInfoItem.qml:105
428−msgid "Unlock SIM"
429−msgstr "Dibrennañ ar gartenn SIM"
430−
431−#: qml/Panel/Indicators/RoamingIndication.qml:27
432−msgid "Roaming"
433−msgstr "O kantren"
434−
435−#: qml/Tutorial/TutorialBottom.qml:28
436−msgid "Open special menus"
437−msgstr "Digeriñ al lañserioù ispisial"
430+msgstr "Gervel en-dro"
438431
439−#: qml/Tutorial/TutorialBottom.qml:29
440−msgid "Swipe up from the bottom edge."
441−msgstr "Riklit war-du an nec'h adalek an traoñ"
432+#: qml/Stages/SideStage.qml:76
433+msgid "Drag using 3 fingers any application from one window to the other"
434+msgstr ""
442435
443−#: qml/Tutorial/TutorialBottomFinish.qml:24
444−msgid "This action does different things for different apps"
445−msgstr "An ober-mañ a ra meur a dra evit meur a arload"
436+#: qml/Tutorial/TutorialBottom.qml:78
437+msgid "Swipe up to add a contact"
438+msgstr "Riklit d'an nec'h evit ouzhpennañ un darempred"
446439
447−#: qml/Tutorial/TutorialBottomFinish.qml:25
448−msgid "Tap here to finish."
449−msgstr "Pouezañ amañ evit echuiñ."
440+#: qml/Tutorial/TutorialBottom.qml:80
441+msgid "Swipe up for favorite calculations"
442+msgstr ""
450443
451−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
452−#: qml/Tutorial/TutorialRight.qml:144
453−msgid "Tap here to continue."
454−msgstr "Pouzañ amañ evit kenderc'hel"
444+#: qml/Tutorial/TutorialBottom.qml:82
445+msgid "Swipe up for recent calls"
446+msgstr ""
455447
456−#: qml/Tutorial/TutorialLeft.qml:26
457−msgid "Open the launcher"
458−msgstr "Digeriñ al lañser"
448+#: qml/Tutorial/TutorialBottom.qml:84
449+msgid "Swipe up to create a message"
450+msgstr "Riklit d'an nec'h evit krouiñ ur gemennadenn"
459451
460−#: qml/Tutorial/TutorialLeft.qml:27
461−msgid "Short swipe from the left edge."
462−msgstr "Riklik dousik adalek ar bord kleiz."
452+#: qml/Tutorial/TutorialBottom.qml:85
453+msgid "Swipe up to manage the app"
454+msgstr ""
463455
464−#: qml/Tutorial/TutorialLeftFinish.qml:24
465−msgid "These are the shortcuts to favorite apps"
466−msgstr "Berradennoù war-du hoc'h arloadoù gwellañ-deuet eo ar re-mañ"
456+#: qml/Tutorial/TutorialLeftLong.qml:47
457+msgid "Long swipe from the left edge to open the Today scope"
458+msgstr ""
467459
468−#: qml/Tutorial/TutorialPage.qml:178
469−msgid "You almost got it!"
470−msgstr "Deuet eo ganeoc'h pe dost ?"
460+#: qml/Tutorial/TutorialLeft.qml:47
461+msgid "Swipe from the left edge to open the launcher"
462+msgstr ""
471463
472−#: qml/Tutorial/TutorialPage.qml:195
473−msgid "Try again."
474−msgstr "Esaeit en-dro."
464+#: qml/Tutorial/TutorialRight.qml:55
465+msgid "Push your mouse against the right edge to view your open apps"
466+msgstr ""
475467
476−#: qml/Tutorial/TutorialRight.qml:31
477−msgid "To view open apps"
478−msgstr "Evit gwelet an arloadoù digor"
468+#: qml/Tutorial/TutorialRight.qml:56
469+msgid "Short or long swipe from the right edge to view your open apps"
470+msgstr ""
479471
480−#: qml/Tutorial/TutorialRight.qml:32
481−msgid "Long swipe from the right edge."
482−msgstr "Riklit pell adalek ar bord dehoù."
472+#: qml/Tutorial/TutorialTop.qml:53
473+msgid "Swipe from the top right edge to open the notification bar"
474+msgstr ""
483475
484−#: qml/Tutorial/TutorialRight.qml:122
485−msgid "View all your running tasks."
486−msgstr "Gwelet an holl drevelloù a ya en-dro."
476+#: qml/Tutorial/TutorialTop.qml:54
477+msgid "Swipe from the top edge to open the notification bar"
478+msgstr ""
487479
488−#: qml/Wizard/Page.qml:89
480+#: qml/Wizard/Page.qml:54
489481msgctxt "Button: Go back one page in the Wizard"
490482msgid "Back"
491483msgstr "Distreiñ"
492484
493485#: qml/Wizard/Pages/10-welcome.qml:27
494−msgid "Hi!"
495−msgstr "Salud deoc'h !"
496−
497−#: qml/Wizard/Pages/10-welcome.qml:44
498−msgid "Welcome to your Ubuntu phone."
499−msgstr "Deuet-mat oc'h en ho pellgomzer Ubuntu."
500−
501−#: qml/Wizard/Pages/10-welcome.qml:52
502−msgid "Let’s get started."
503−msgstr "Krogomp ganti."
486+msgid "Language"
487+msgstr "Yezh"
488+
489+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
490+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
491+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
492+#: qml/Wizard/Pages/75-report-check.qml:84
493+#: qml/Wizard/Pages/passcode-desktop.qml:124
494+#: qml/Wizard/Pages/password-set.qml:141
495+msgid "Next"
496+msgstr "War-lerc'h"
497+
498+#: qml/Wizard/Pages/30-wifi.qml:29
499+msgid "Connect to Wi‑Fi"
500+msgstr "Kevreañ ouzh ar Wi-Fi"
504501
505−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
506−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
507−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
508−#: qml/Wizard/Pages/passwd-set.qml:90
509−msgid "Continue"
510−msgstr "Kenderc'hel"
502+#: qml/Wizard/Pages/30-wifi.qml:130
503+msgid "Connected"
504+msgstr "Kevreet"
511505
512−#: qml/Wizard/Pages/20-sim.qml:25
513−msgid "Add a SIM card and restart your device"
514−msgstr "Lakait ur gartenn SIM hag adloc'hit ho penveg"
506+#: qml/Wizard/Pages/30-wifi.qml:163
507+msgid "Available Wi-Fi networks"
508+msgstr "Rouedadoù Wi-Fi da gaout"
515509
516−#: qml/Wizard/Pages/20-sim.qml:59
517−msgid "Without it, you won’t be able to make calls or use text messaging."
518−msgstr "Ne vioc'h ket evit pellgomz pe kas kemennadennoù hepti."
510+#: qml/Wizard/Pages/30-wifi.qml:164
511+msgid "No available Wi-Fi networks"
512+msgstr "N'eus ket rouedadoù Wi-Fi da gaout"
519513
520−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
514+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
515+#: qml/Wizard/Pages/sim.qml:101
521516msgid "Skip"
522517msgstr "Tremen hebiou"
523518
524−#: qml/Wizard/Pages/30-passwd-type.qml:39
525−msgid "Lock security"
526−msgstr "Surentez ar prennañ"
519+#: qml/Wizard/Pages/40-location.qml:27
520+msgid "Location Services"
521+msgstr "Servijoù lec'hiañ"
522+
523+#: qml/Wizard/Pages/40-location.qml:83
524+msgid ""
525+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
526+"(recommended)"
527+msgstr ""
527528
528−#: qml/Wizard/Pages/30-passwd-type.qml:74
529−msgid "Please select how you’d like to unlock your phone."
529+#: qml/Wizard/Pages/40-location.qml:105
530+#, qt-format
531+msgid "By selecting this option you agree to the Nokia HERE %1."
530532msgstr ""
531−"Diuzit e peseurt mod e fell deoc'h dibrennañ ho pellgomzer, mar plij."
532533
533−#: qml/Wizard/Pages/30-passwd-type.qml:97
534−msgctxt "Label: Type of security method"
535−msgid "Swipe"
536−msgstr "Riklañ"
534+#: qml/Wizard/Pages/40-location.qml:106
535+msgctxt "part of: Nokia HERE terms and conditions"
536+msgid "terms and conditions"
537+msgstr "penndivizoù implij"
538+
539+#: qml/Wizard/Pages/40-location.qml:160
540+msgid "GPS only"
541+msgstr "GPS hepken"
542+
543+#: qml/Wizard/Pages/40-location.qml:214
544+msgid "Don't use my location"
545+msgstr "Arabat implijout ma lec'h"
546+
547+#: qml/Wizard/Pages/40-location.qml:260
548+msgid "You can change it later in System Settings."
549+msgstr ""
550+
551+#: qml/Wizard/Pages/50-timezone.qml:29
552+msgid "Time Zone"
553+msgstr "Gwerzhid-eur"
554+
555+#: qml/Wizard/Pages/50-timezone.qml:178
556+msgid "Enter your city"
557+msgstr "Skrivit ho kêr"
558+
559+#: qml/Wizard/Pages/60-account.qml:24
560+msgid "Personalize Your Device"
561+msgstr "Personelaat ho penveg"
537562
538−#: qml/Wizard/Pages/30-passwd-type.qml:98
539−msgctxt "Label: Description of security method"
540−msgid "No security"
541−msgstr "Tamm surentez ebet"
563+#: qml/Wizard/Pages/60-account.qml:48
564+msgid "Preferred Name"
565+msgstr ""
566+
567+#: qml/Wizard/Pages/70-passwd-type.qml:39
568+msgid "Lock Screen"
569+msgstr "Prennañ ar skramm"
542570
543−#: qml/Wizard/Pages/30-passwd-type.qml:100
571+#: qml/Wizard/Pages/70-passwd-type.qml:101
544572msgctxt "Label: Type of security method"
545−msgid "Passcode"
546−msgstr "Kod-tremen"
573+msgid "Create new password"
574+msgstr "Krouiñ ur ger-tremen nevez"
547575
548−#: qml/Wizard/Pages/30-passwd-type.qml:101
549−msgctxt "Label: Description of security method"
550−msgid "4 digits only"
551−msgstr "4 sifr hepken"
576+#: qml/Wizard/Pages/70-passwd-type.qml:103
577+msgctxt "Label: Type of security method"
578+msgid "Create passcode (numbers only)"
579+msgstr "Krouiñ ur c'hod (difroù hepken)"
552580
553−#: qml/Wizard/Pages/30-passwd-type.qml:103
581+#: qml/Wizard/Pages/70-passwd-type.qml:105
554582msgctxt "Label: Type of security method"
555−msgid "Passphrase"
556−msgstr "Frazenn-dremen"
583+msgid "No lock code"
584+msgstr "N'eus kod prennañ ebet"
557585
558−#: qml/Wizard/Pages/30-passwd-type.qml:104
559−msgctxt "Label: Description of security method"
560−msgid "Numbers and letters"
561−msgstr "Sifroù ha lizherennoù"
586+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
587+msgid "Privacy Policy"
588+msgstr "Reolennoù prevezded"
562589
563−#: qml/Wizard/Pages/40-wifi.qml:29
564−msgid "Connect to Wi‑Fi"
565−msgstr "Kevreañ ouzh ar Wi-Fi"
590+#: qml/Wizard/Pages/75-report-check.qml:26
591+msgid "Help Us Improve"
592+msgstr "Sikourit ac'hanomp da wellaat"
566593
567−#: qml/Wizard/Pages/40-wifi.qml:168
568−msgid "Available networks…"
569−msgstr "Rouedadoù a c'haller kaout..."
594+#: qml/Wizard/Pages/75-report-check.qml:59
595+msgid "Improve system performance by sending us crashes and error reports."
596+msgstr ""
570597
571−#: qml/Wizard/Pages/40-wifi.qml:169
572−msgid "No available networks."
573−msgstr "N'eus rouedad ebet da gaout."
598+#: qml/Wizard/Pages/75-report-check.qml:60
599+msgid "Privacy policy"
600+msgstr "Reolennoù buhez prevez"
574601
575−#: qml/Wizard/Pages/50-location.qml:27
576−msgid "Location"
577−msgstr "Lec'h"
602+#: qml/Wizard/Pages/80-finished.qml:89
603+msgid "Welcome to Ubuntu"
604+msgstr "Donemat en Ubuntu"
578605
579−#: qml/Wizard/Pages/50-location.qml:62
580−msgid "Let the phone detect your location:"
581−msgstr "Lezel ar pellgomzer da gavout pelec'h emaoc'h :"
606+#: qml/Wizard/Pages/80-finished.qml:104
607+msgid "You are ready to use your device now"
608+msgstr "Bremañ oc'h prest da implijout ho penveg"
582609
583−#: qml/Wizard/Pages/50-location.qml:69
584−msgid "Using GPS only (less accurate)"
585−msgstr "Implijout ar GPS hepken (n'eo ket ken resis)"
610+#: qml/Wizard/Pages/80-finished.qml:124
611+msgid "Get Started"
612+msgstr "Kregiñ ganti"
586613
587−#: qml/Wizard/Pages/50-location.qml:86
588−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
614+#: qml/Wizard/Pages/here-terms.qml:25
615+msgid "Terms & Conditions"
616+msgstr "Penndivizoù implij"
617+
618+#: qml/Wizard/Pages/here-terms.qml:69
619+msgid "Your device uses positioning technologies provided by HERE."
589620msgstr ""
590−"Implijout ar GPS, Wi-Fi dizanv pe titouroù ar rouedad kelligel (aliet)"
591621
592−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
593−#: qml/Wizard/Pages/50-location.qml:103
622+#: qml/Wizard/Pages/here-terms.qml:81
594623msgid ""
595−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
596−"conditions</a>."
624+"To provide you with positioning services and to improve their quality, HERE "
625+"collects information about nearby cell towers and Wi-Fi hotspots around your "
626+"current location whenever your position is being found."
597627msgstr ""
598−"Pa ziuzit an dibarzh-mañ ez asantit da <a href='#'>zivizoù implij</a> Nokia."
599628
600−#: qml/Wizard/Pages/50-location.qml:112
601−msgid "Not at all"
602−msgstr "Tamm ebet"
629+#: qml/Wizard/Pages/here-terms.qml:93
630+msgid ""
631+"The information collected is used to analyze the service and to improve the "
632+"use of service, but not to identify you personally."
633+msgstr ""
603634
604−#: qml/Wizard/Pages/50-location.qml:124
605−msgid "You can change your mind later in <b>System Settings</b>."
635+#: qml/Wizard/Pages/here-terms.qml:106
636+#, qt-format
637+msgid "By continuing, you agree to the HERE platform %1 and %2."
606638msgstr ""
607−"Gallout a rit cheñch soñj diwezhatoc'h en <b>Arventennoù ar reizhad</b>."
608639
609−#: qml/Wizard/Pages/60-reporting.qml:26
610−msgid "Improving your experience"
611−msgstr "Gwellaat ho skiant-prenet"
640+#: qml/Wizard/Pages/here-terms.qml:107
641+msgid "Service Terms"
642+msgstr "Divizoù servij"
612643
613−#: qml/Wizard/Pages/60-reporting.qml:46
614−msgid ""
615−"Your phone is set up to automatically report errors to Canonical and its "
616−"partners, the makers of the operating system."
617−msgstr ""
618−"Arventennet eo ho pellgomzer evit titourañ ent emgefre ar fazioù da "
619−"gCanonical ha d'e gevelerien, ar re o deus savet ar reizhiad korvoiñ."
644+#: qml/Wizard/Pages/passcode-confirm.qml:43
645+#: qml/Wizard/Pages/passcode-desktop.qml:80
646+msgid "Confirm passcode"
647+msgstr "Kadarnaat ar c'hod-tremen"
620648
621−#: qml/Wizard/Pages/60-reporting.qml:53
622−msgid ""
623−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
624−"Privacy</b>"
625−msgstr ""
626−"Gallout a ra bezañ diweredekaet e-barzh <b>Arventennoù ar reizhiad</b> "
627−"dindan <b>Surentez &amp; Prevezded</b>"
649+#: qml/Wizard/Pages/passcode-confirm.qml:45
650+msgid "Incorrect passcode."
651+msgstr "Kod direizh"
628652
629−#: qml/Wizard/Pages/80-finished.qml:24
630−msgid "All done"
631−msgstr "Echu penn-da-benn"
653+#: qml/Wizard/Pages/passcode-confirm.qml:45
654+msgctxt "Enter the passcode again"
655+msgid "Please re-enter."
656+msgstr "Skrivit adarre, mar plij."
632657
633−#: qml/Wizard/Pages/80-finished.qml:39
634−msgid "Nice work!"
635−msgstr "Gwellat labour !"
658+#: qml/Wizard/Pages/passcode-desktop.qml:30
659+msgid "Lock Screen Passcode"
660+msgstr "Kod da brennañ ar skramm"
636661
637−#: qml/Wizard/Pages/80-finished.qml:46
638−msgid "Your phone is now ready to use."
639−msgstr "Prest eo ho pellgomzer da vezañ implijet bremañ."
662+#: qml/Wizard/Pages/passcode-desktop.qml:56
663+msgid "Enter 4 numbers to setup your passcode"
664+msgstr "Skrivit 4 sifr evit lakaat ho kod"
640665
641−#: qml/Wizard/Pages/80-finished.qml:53
642−msgid "Finish"
643−msgstr "Echuiñ"
666+#: qml/Wizard/Pages/passcode-desktop.qml:65
667+#: qml/Wizard/Pages/passcode-set.qml:54
668+msgid "Choose passcode"
669+msgstr "Choaz ur c'hod"
644670
645−#: qml/Wizard/Pages/here-terms.qml:27
646−msgid "Terms & Conditions"
647−msgstr "Penndivizoù implij"
671+#: qml/Wizard/Pages/passcode-desktop.qml:105
672+msgid "Passcode too short"
673+msgstr "Kod re verr"
648674
649−#: qml/Wizard/Pages/passwd-confirm.qml:49
650−msgid "Confirm passphrase"
651−msgstr "Kadarnaat ar frazenn-dremen"
675+#: qml/Wizard/Pages/passcode-desktop.qml:107
676+msgid "Passcodes match"
677+msgstr "klotañ a ra ar c'hodoù an eil gant egile"
652678
653−#: qml/Wizard/Pages/passwd-confirm.qml:50
654−msgid "Confirm passcode"
655−msgstr "Kadarnaat ar c'hod-tremen"
679+#: qml/Wizard/Pages/passcode-desktop.qml:109
680+msgid "Passcodes do not match"
681+msgstr "Ne glot ket ar c'hodoù an eil gant egile"
656682
657−#: qml/Wizard/Pages/passwd-confirm.qml:53
658−#: qml/Wizard/Pages/passwd-confirm.qml:54
659−msgid "Please try again."
660−msgstr "Esaeit en-dro, mar plij."
683+#: qml/Wizard/Pages/passcode-set.qml:62
684+msgid "Passcode must be 4 characters long"
685+msgstr "4 arouezenn a rank bezañ ar c'hod"
661686
662−#: qml/Wizard/Pages/passwd-set.qml:61
663−msgid "Choose your passcode"
664−msgstr "Choaz ho kod-tremen"
687+#: qml/Wizard/Pages/password-set.qml:30
688+msgid "Lock Screen Password"
689+msgstr "Ger-tremen da brennañ ar skramm"
665690
666−#: qml/Wizard/Pages/passwd-set.qml:68
667−msgid "Passphrase must be 4 characters long"
668−msgstr "4 arouezenn a rank bezañ er frazenn-dremen"
691+#: qml/Wizard/Pages/password-set.qml:61
692+msgid "Enter at least 8 characters"
693+msgstr "Skrivit 8 arouezenn da vihanañ"
669694
670−#. Translators: This is the arrow for "Back" buttons
671−#: qml/Wizard/StackButton.qml:39
672−#, qt-format
673−msgid "〈 %1"
674−msgstr "〈 %1"
695+#: qml/Wizard/Pages/password-set.qml:73
696+msgid "Choose password"
697+msgstr "Choaz ur ger-tremen"
675698
676−#. Translators: This is the arrow for "Forward" buttons
677−#: qml/Wizard/StackButton.qml:42
678−#, qt-format
679−msgid "%1 〉"
680−msgstr "%1 〉"
699+#: qml/Wizard/Pages/password-set.qml:103
700+msgid "Confirm password"
701+msgstr "Kadarnaat ar ger-tremen"
702+
703+#: qml/Wizard/Pages/sim.qml:27
704+msgid "No SIM card installed"
705+msgstr "N'eus kartenn SIM ebet"
706+
707+#: qml/Wizard/Pages/sim.qml:54
708+msgid "SIM card added"
709+msgstr "Lakaet ez eus bet ur gartenn SIM"
710+
711+#: qml/Wizard/Pages/sim.qml:55
712+msgid "You must restart the device to access the mobile network."
713+msgstr ""
714+
715+#: qml/Wizard/Pages/sim.qml:59
716+msgid "Restart"
717+msgstr "Adloc'hañ"
718+
719+#: qml/Wizard/Pages/sim.qml:78
720+msgid "You won’t be able to make calls or use text messaging without a SIM."
721+msgstr ""
722+
723+#: qml/Wizard/Pages/sim.qml:90
724+msgid "To proceed with no SIM tap Skip."
725+msgstr ""
726+
727+#: qml/Wizard/PasswordMeter.qml:87
728+msgid "Passwords match"
729+msgstr "Klotañ a ra ar gerioù-tremen an eil gant egile"
730+
731+#: qml/Wizard/PasswordMeter.qml:89
732+msgid "Passwords do not match"
733+msgstr "Ne glot ket ar gerioù-tremen"
734+
735+#: qml/Wizard/PasswordMeter.qml:93
736+msgid "Strong password"
737+msgstr "Ger-tremen sur"
738+
739+#: qml/Wizard/PasswordMeter.qml:95
740+msgid "Fair password"
741+msgstr "Ger-tremen reizh"
742+
743+#: qml/Wizard/PasswordMeter.qml:97
744+msgid "Weak password"
745+msgstr "Ger-tremen diasur"
746+
747+#: qml/Wizard/PasswordMeter.qml:99
748+msgid "Very weak password"
749+msgstr "Ger-tremen diasur-kenañ"
681750
682751#~ msgid "Close"
683752#~ msgstr "Serriñ"
@@ -694,6 +763,9 @@ msgstr "%1 〉"
694763#~ msgid "Right edge"
695764#~ msgstr "Bord dehoù"
696765
766+#~ msgid "See less"
767+#~ msgstr "Gwelet nebeutoc'h"
768+
697769#~ msgid ""
698770#~ "You have now mastered the edge gestures and can start using the "
699771#~ "phone<br><br>Tap on the screen to start"
@@ -739,6 +811,9 @@ msgstr "%1 〉"
739811#~ msgid "Type or say a command"
740812#~ msgstr "Skrivit pe lavarit un urzhiad"
741813
814+#~ msgid "See all"
815+#~ msgstr "Gwelet pep tra"
816+
742817#~ msgid "Store"
743818#~ msgstr "Enrollañ"
744819
@@ -751,6 +826,12 @@ msgstr "%1 〉"
751826#~ msgid "All"
752827#~ msgstr "An holl anezho"
753828
829+#~ msgid "Unlock SIM"
830+#~ msgstr "Dibrennañ ar gartenn SIM"
831+
832+#~ msgid "Roaming"
833+#~ msgstr "O kantren"
834+
754835#~ msgid "Favorites"
755836#~ msgstr "Gwellañ deuet"
756837
@@ -760,6 +841,9 @@ msgstr "%1 〉"
760841#~ msgid "Log out"
761842#~ msgstr "Digevreañ"
762843
844+#~ msgid "Are you sure you want to shut down?"
845+#~ msgstr "Ha sur oc'h e fell deoc'h lazhañ ar benveg ?"
846+
763847#~ msgid "Reboot"
764848#~ msgstr "Adloc'hañ"
765849
@@ -769,15 +853,193 @@ msgstr "%1 〉"
769853#~ msgid "Settings"
770854#~ msgstr "Arventennoù"
771855
772−#~ msgid "Restart"
773−#~ msgstr "Adloc'hañ"
774−
775856#~ msgid "Manage Scopes"
776857#~ msgstr "Merañ ar c'hefluskerioù enklask"
777858
778859#~ msgid "Please re-enter"
779860#~ msgstr "Adverkañ, mar plij"
780861
862+#~ msgid "Lock security"
863+#~ msgstr "Surentez ar prennañ"
864+
865+#~ msgid "Without it, you won’t be able to make calls or use text messaging."
866+#~ msgstr "Ne vioc'h ket evit pellgomz pe kas kemennadennoù hepti."
867+
868+#~ msgid "Add a SIM card and restart your device"
869+#~ msgstr "Lakait ur gartenn SIM hag adloc'hit ho penveg"
870+
871+#~ msgid "Please select how you’d like to unlock your phone."
872+#~ msgstr ""
873+#~ "Diuzit e peseurt mod e fell deoc'h dibrennañ ho pellgomzer, mar plij."
874+
875+#~ msgid "Hi!"
876+#~ msgstr "Salud deoc'h !"
877+
878+#~ msgid "Let’s get started."
879+#~ msgstr "Krogomp ganti."
880+
881+#~ msgid "Continue"
882+#~ msgstr "Kenderc'hel"
883+
884+#~ msgid "Welcome to your Ubuntu phone."
885+#~ msgstr "Deuet-mat oc'h en ho pellgomzer Ubuntu."
886+
887+#~ msgid "Available networks…"
888+#~ msgstr "Rouedadoù a c'haller kaout..."
889+
890+#~ msgid "No available networks."
891+#~ msgstr "N'eus rouedad ebet da gaout."
892+
893+#~ msgid "Location"
894+#~ msgstr "Lec'h"
895+
896+#~ msgid "You can change your mind later in <b>System Settings</b>."
897+#~ msgstr ""
898+#~ "Gallout a rit cheñch soñj diwezhatoc'h en <b>Arventennoù ar reizhad</b>."
899+
900+#~ msgid ""
901+#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
902+#~ "Privacy</b>"
903+#~ msgstr ""
904+#~ "Gallout a ra bezañ diweredekaet e-barzh <b>Arventennoù ar reizhiad</b> "
905+#~ "dindan <b>Surentez &amp; Prevezded</b>"
906+
907+#~ msgid ""
908+#~ "Your phone is set up to automatically report errors to Canonical and its "
909+#~ "partners, the makers of the operating system."
910+#~ msgstr ""
911+#~ "Arventennet eo ho pellgomzer evit titourañ ent emgefre ar fazioù da "
912+#~ "gCanonical ha d'e gevelerien, ar re o deus savet ar reizhiad korvoiñ."
913+
914+#~ msgid "All done"
915+#~ msgstr "Echu penn-da-benn"
916+
917+#~ msgid "Improving your experience"
918+#~ msgstr "Gwellaat ho skiant-prenet"
919+
920+#~ msgid ""
921+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
922+#~ "conditions</a>."
923+#~ msgstr ""
924+#~ "Pa ziuzit an dibarzh-mañ ez asantit da <a href='#'>zivizoù implij</a> Nokia."
925+
926+#~ msgid "Not at all"
927+#~ msgstr "Tamm ebet"
928+
929+#~ msgid "Let the phone detect your location:"
930+#~ msgstr "Lezel ar pellgomzer da gavout pelec'h emaoc'h :"
931+
932+#~ msgid "Using GPS only (less accurate)"
933+#~ msgstr "Implijout ar GPS hepken (n'eo ket ken resis)"
934+
935+#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
936+#~ msgstr ""
937+#~ "Implijout ar GPS, Wi-Fi dizanv pe titouroù ar rouedad kelligel (aliet)"
938+
939+#~ msgid "Nice work!"
940+#~ msgstr "Gwellat labour !"
941+
942+#~ msgid "Finish"
943+#~ msgstr "Echuiñ"
944+
945+#~ msgid "Confirm passphrase"
946+#~ msgstr "Kadarnaat ar frazenn-dremen"
947+
948+#, qt-format
949+#~ msgid "〈 %1"
950+#~ msgstr "〈 %1"
951+
952+#~ msgid "Choose your passcode"
953+#~ msgstr "Choaz ho kod-tremen"
954+
955+#~ msgid "Passphrase must be 4 characters long"
956+#~ msgstr "4 arouezenn a rank bezañ er frazenn-dremen"
957+
958+#~ msgid "Please try again."
959+#~ msgstr "Esaeit en-dro, mar plij."
960+
961+#~ msgid "Your phone is now ready to use."
962+#~ msgstr "Prest eo ho pellgomzer da vezañ implijet bremañ."
963+
964+#, qt-format
965+#~ msgid "%1 〉"
966+#~ msgstr "%1 〉"
967+
968+#~ msgid "This action does different things for different apps"
969+#~ msgstr "An ober-mañ a ra meur a dra evit meur a arload"
970+
971+#~ msgid "Open special menus"
972+#~ msgstr "Digeriñ al lañserioù ispisial"
973+
974+#~ msgid "Tap here to finish."
975+#~ msgstr "Pouezañ amañ evit echuiñ."
976+
977+#~ msgid "To view open apps"
978+#~ msgstr "Evit gwelet an arloadoù digor"
979+
980+#~ msgid "Long swipe from the right edge."
981+#~ msgstr "Riklit pell adalek ar bord dehoù."
982+
983+#~ msgid "View all your running tasks."
984+#~ msgstr "Gwelet an holl drevelloù a ya en-dro."
985+
986+#~ msgid "Try again."
987+#~ msgstr "Esaeit en-dro."
988+
989+#~ msgid "You almost got it!"
990+#~ msgstr "Deuet eo ganeoc'h pe dost ?"
991+
992+#~ msgid "Short swipe from the left edge."
993+#~ msgstr "Riklik dousik adalek ar bord kleiz."
994+
995+#~ msgid "Open the launcher"
996+#~ msgstr "Digeriñ al lañser"
997+
998+#~ msgid "Tap here to continue."
999+#~ msgstr "Pouzañ amañ evit kenderc'hel"
1000+
1001+#~ msgid "These are the shortcuts to favorite apps"
1002+#~ msgstr "Berradennoù war-du hoc'h arloadoù gwellañ-deuet eo ar re-mañ"
1003+
1004+#~ msgid "Swipe up from the bottom edge."
1005+#~ msgstr "Riklit war-du an nec'h adalek an traoñ"
1006+
1007+#~ msgctxt "Button: Shut down the system"
1008+#~ msgid "Shut down"
1009+#~ msgstr "Lazhañ ar benveg"
1010+
1011+#~ msgctxt "Title: Reboot/Shut down dialog"
1012+#~ msgid "Shut down"
1013+#~ msgstr "Lazhañ ar benveg"
1014+
1015+#~ msgctxt "Button: Reboot the system"
1016+#~ msgid "Reboot"
1017+#~ msgstr "Adloc'hañ"
1018+
1019+#~ msgctxt "Label: Type of security method"
1020+#~ msgid "Passcode"
1021+#~ msgstr "Kod-tremen"
1022+
1023+#~ msgctxt "Label: Description of security method"
1024+#~ msgid "No security"
1025+#~ msgstr "Tamm surentez ebet"
1026+
1027+#~ msgctxt "Label: Type of security method"
1028+#~ msgid "Swipe"
1029+#~ msgstr "Riklañ"
1030+
1031+#~ msgctxt "Label: Description of security method"
1032+#~ msgid "4 digits only"
1033+#~ msgstr "4 sifr hepken"
1034+
1035+#~ msgctxt "Label: Type of security method"
1036+#~ msgid "Passphrase"
1037+#~ msgstr "Frazenn-dremen"
1038+
1039+#~ msgctxt "Label: Description of security method"
1040+#~ msgid "Numbers and letters"
1041+#~ msgstr "Sifroù ha lizherennoù"
1042+
7811043#~ msgid "%a %d %b %H:%M"
7821044#~ msgstr "%a %b %d %H:%M"
7831045
po/bs.po+525−263
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
1111"PO-Revision-Date: 2015-12-01 20:06+0000\n"
1212"Last-Translator: Kenan Gutić <Unknown>\n"
1313"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,23 +16,23 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2015-12-12 05:44+0000\n"
20−"X-Generator: Launchpad (build 17865)\n"
19+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
2424msgstr "Šifra: "
2525
26−#: plugins/Unity/Launcher/launcheritem.cpp:47
27−#: plugins/Unity/Launcher/launcheritem.cpp:106
26+#: plugins/Unity/Launcher/launcheritem.cpp:48
27+#: plugins/Unity/Launcher/launcheritem.cpp:107
2828msgid "Pin shortcut"
2929msgstr "Prikačite prečicu"
3030
31−#: plugins/Unity/Launcher/launcheritem.cpp:52
31+#: plugins/Unity/Launcher/launcheritem.cpp:53
3232msgid "Quit"
3333msgstr "Napusti"
3434
35−#: plugins/Unity/Launcher/launcheritem.cpp:106
35+#: plugins/Unity/Launcher/launcheritem.cpp:107
3636msgid "Unpin shortcut"
3737msgstr "Otkačite prečicu"
3838
@@ -75,53 +75,35 @@ msgctxt "Button: Log out from the system"
7575msgid "Log Out"
7676msgstr "Odjavi se"
7777
78−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
79−#: qml/Components/Dialogs.qml:253
78+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
79+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
80+#: qml/Wizard/Pages/passcode-set.qml:32
8081msgid "Cancel"
8182msgstr "Otkaži"
8283
8384#: qml/Components/Dialogs.qml:173
84−msgctxt "Title: Reboot/Shut down dialog"
85−msgid "Shut down"
86−msgstr "Ugasi"
87−
88−#: qml/Components/Dialogs.qml:174
89−msgid "Are you sure you want to shut down?"
90−msgstr "Da li ste sigurni da želite ugasiti?"
91−
92−#: qml/Components/Dialogs.qml:176
93−msgctxt "Button: Reboot the system"
94−msgid "Reboot"
95−msgstr "Ponovo pokreni"
96−
97−#: qml/Components/Dialogs.qml:185
98−msgctxt "Button: Shut down the system"
99−msgid "Shut down"
100−msgstr "Gašenje sistema"
101−
102−#: qml/Components/Dialogs.qml:207
10385msgctxt "Title: Reboot dialog"
10486msgid "Reboot"
10587msgstr "Ponovo pokreni"
10688
107−#: qml/Components/Dialogs.qml:208
89+#: qml/Components/Dialogs.qml:174
10890msgid "Are you sure you want to reboot?"
10991msgstr "Da li ste sigurni da želite ponovo pokrenuti?"
11092
111−#: qml/Components/Dialogs.qml:210
93+#: qml/Components/Dialogs.qml:176
11294msgid "No"
11395msgstr "Ne"
11496
115−#: qml/Components/Dialogs.qml:217
97+#: qml/Components/Dialogs.qml:182
11698msgid "Yes"
11799msgstr "Da"
118100
119−#: qml/Components/Dialogs.qml:232
101+#: qml/Components/Dialogs.qml:197
120102msgctxt "Title: Power off/Restart dialog"
121103msgid "Power"
122104msgstr "Napajanje"
123105
124−#: qml/Components/Dialogs.qml:233
106+#: qml/Components/Dialogs.qml:198
125107msgid ""
126108"Are you sure you would like\n"
127109"to power off?"
@@ -129,25 +111,25 @@ msgstr ""
129111"Da li ste sigurni da želite\n"
130112"isključiti?"
131113
132−#: qml/Components/Dialogs.qml:235
114+#: qml/Components/Dialogs.qml:200
133115msgctxt "Button: Power off the system"
134116msgid "Power off"
135117msgstr "Isključi"
136118
137−#: qml/Components/Dialogs.qml:244
119+#: qml/Components/Dialogs.qml:209
138120msgctxt "Button: Restart the system"
139121msgid "Restart"
140122msgstr "Restartuj"
141123
142−#: qml/Components/Lockscreen.qml:245
124+#: qml/Components/Lockscreen.qml:231
143125msgid "Return to Call"
144126msgstr "Povratak na Poziv"
145127
146−#: qml/Components/Lockscreen.qml:245
128+#: qml/Components/Lockscreen.qml:231
147129msgid "Emergency Call"
148130msgstr "Hitan Poziv"
149131
150−#: qml/Components/Lockscreen.qml:277
132+#: qml/Components/Lockscreen.qml:263
151133msgid "OK"
152134msgstr "U redu"
153135
@@ -156,8 +138,10 @@ msgid "Apps may have unsaved data:"
156138msgstr "Aplikacije možda imaju podataka koji nisu sačuvani:"
157139
158140#: qml/Components/ModeSwitchWarningDialog.qml:57
141+msgctxt ""
142+"Re-dock means connect the device again to an external screen/mouse/keyboard"
159143msgid "Re-dock, save your work and close these apps to continue."
160−msgstr "Postavi opet, snimi svoj rad i zatvori ove aplikacije za nastavak."
144+msgstr ""
161145
162146#: qml/Components/ModeSwitchWarningDialog.qml:63
163147msgid "Or force close now (unsaved data will be lost)."
@@ -177,42 +161,58 @@ msgstr "Ponovo poveži sada"
177161msgid "Close all"
178162msgstr "Zatvori sve"
179163
180−#: qml/Dash/DashPageHeader.qml:265
164+#: qml/Dash/DashPageHeader.qml:337
181165msgctxt "Button: Open the Ubuntu Store"
182166msgid "Store"
183167msgstr "Trgovina"
184168
185−#: qml/Dash/DashPageHeader.qml:272
169+#: qml/Dash/DashPageHeader.qml:344
186170msgctxt "Button: Start a search in the current dash scope"
187171msgid "Search"
188172msgstr "Pretraživanje"
189173
190−#: qml/Dash/DashPageHeader.qml:282
174+#: qml/Dash/DashPageHeader.qml:354
191175msgctxt "Button: Show the current dash scope settings"
192176msgid "Settings"
193177msgstr "Podešavanja"
194178
195−#: qml/Dash/DashPageHeader.qml:289
179+#: qml/Dash/DashPageHeader.qml:361
196180msgid "Remove from Favorites"
197181msgstr "Ukloni iz Omiljenih"
198182
199−#: qml/Dash/DashPageHeader.qml:289
183+#: qml/Dash/DashPageHeader.qml:361
200184msgid "Add to Favorites"
201185msgstr "Dodaj u Omiljene"
202186
203−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
204−msgid "See less"
205−msgstr "Pogledati manje"
187+#: qml/Dash/FiltersPopover.qml:60
188+msgid "Refine your results"
189+msgstr ""
206190
207−#: qml/Dash/GenericScopeView.qml:576
208−msgid "See all"
209−msgstr "Pogledati sve"
191+#: qml/Dash/FiltersPopover.qml:69
192+msgid "Reset"
193+msgstr ""
210194
211−#: qml/Dash/GenericScopeView.qml:638
195+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196+msgid "Show less"
197+msgstr ""
198+
199+#: qml/Dash/GenericScopeView.qml:570
200+msgid "Show all"
201+msgstr ""
202+
203+#: qml/Dash/GenericScopeView.qml:627
212204msgctxt "Label: Hint for dash search line edit"
213205msgid "Search"
214206msgstr "Pretraži"
215207
208+#: qml/Dash/PageHeaderExtraPanel.qml:55
209+msgid "Recent Searches"
210+msgstr ""
211+
212+#: qml/Dash/PageHeaderExtraPanel.qml:66
213+msgid "Clear All"
214+msgstr ""
215+
216216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217217msgid "More..."
218218msgstr "Više..."
@@ -234,7 +234,7 @@ msgstr "Ocijeni ovo"
234234msgid "Add a review"
235235msgstr "Dodaj recenziju"
236236
237−#: qml/Dash/Previews/PreviewSharing.qml:51
237+#: qml/Dash/Previews/PreviewSharing.qml:66
238238msgid "Preview Share Item"
239239msgstr "Pogledaj stavku koja se dijeli"
240240
@@ -262,27 +262,29 @@ msgstr "Početna"
262262msgid "Also installed"
263263msgstr "Također instalirano"
264264
265−#: qml/DisabledScreenNotice.qml:42
266−msgid "Your device is now connected to an external display."
267−msgstr "Vaš uređaj je sada povezan sa vanjskim ekranom."
265+#: qml/DisabledScreenNotice.qml:104
266+msgid ""
267+"Your device is now connected to an external display. Use this screen as a "
268+"touch pad to interact with the pointer."
269+msgstr ""
268270
269−#: qml/Greeter/CoverPage.qml:107
271+#: qml/Greeter/CoverPage.qml:118
270272msgid "Unlock"
271273msgstr "Otključaj"
272274
273−#: qml/Greeter/LoginList.qml:236
275+#: qml/Greeter/LoginList.qml:239
274276msgid "Retry"
275277msgstr "Ponovi"
276278
277−#: qml/Greeter/LoginList.qml:237
279+#: qml/Greeter/LoginList.qml:240
278280msgid "Tap to unlock"
279281msgstr "Kucnite za otključavanje"
280282
281−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
283+#: qml/Greeter/NarrowView.qml:54
282284msgid "Sorry, incorrect passphrase."
283285msgstr "Izvinite, pogrešna pristupna fraza."
284286
285−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
287+#: qml/Greeter/NarrowView.qml:55
286288msgid "Sorry, incorrect passcode."
287289msgstr "Izvinite, pogrešan pristupni kod."
288290
@@ -311,7 +313,7 @@ msgstr ""
311313msgid "Enter %1"
312314msgstr "Unesite %1"
313315
314−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
316+#: qml/Greeter/NarrowView.qml:117
315317msgid "Enter passphrase"
316318msgstr "Unesite propusnu frazu"
317319
@@ -337,7 +339,7 @@ msgstr "Molim ponovo unesite"
337339msgid "Sorry, incorrect passcode"
338340msgstr "Izvinite, netačan pristupni kod"
339341
340−#: qml/Notifications/NotificationMenuItemFactory.qml:129
342+#: qml/Notifications/NotificationMenuItemFactory.qml:124
341343msgid "Show password"
342344msgstr "Prikaži šifru"
343345
@@ -349,11 +351,11 @@ msgstr "Kucnite da uzvratite poziv..."
349351msgid "Conference"
350352msgstr "Savjetovanje"
351353
352−#: qml/Panel/Indicators/MenuItemFactory.qml:731
354+#: qml/Panel/Indicators/MenuItemFactory.qml:762
353355msgid "Nothing is playing"
354356msgstr "Ništa nije pokrenuto"
355357
356−#: qml/Panel/Indicators/MenuItemFactory.qml:860
358+#: qml/Panel/Indicators/MenuItemFactory.qml:891
357359#, qt-format
358360msgid "%1 hour"
359361msgid_plural "%1 hours"
@@ -361,7 +363,7 @@ msgstr[0] "%1 sat"
361363msgstr[1] "%1 sata"
362364msgstr[2] "%1 sati"
363365
364−#: qml/Panel/Indicators/MenuItemFactory.qml:864
366+#: qml/Panel/Indicators/MenuItemFactory.qml:895
365367#, qt-format
366368msgid "%1 minute"
367369msgid_plural "%1 minutes"
@@ -369,7 +371,7 @@ msgstr[0] "%1 minut"
369371msgstr[1] "%1 minuta"
370372msgstr[2] "%1 minuta"
371373
372−#: qml/Panel/Indicators/MenuItemFactory.qml:869
374+#: qml/Panel/Indicators/MenuItemFactory.qml:900
373375#, qt-format
374376msgid "%1 second"
375377msgid_plural "%1 seconds"
@@ -377,37 +379,37 @@ msgstr[0] "%1 sekunda"
377379msgstr[1] "%1 sekunde"
378380msgstr[2] "%1 sekundi"
379381
380−#: qml/Panel/Indicators/MenuItemFactory.qml:872
382+#: qml/Panel/Indicators/MenuItemFactory.qml:903
381383msgid "0 seconds"
382384msgstr "0 sekundi"
383385
384386#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
385−#: qml/Panel/Indicators/MenuItemFactory.qml:874
387+#: qml/Panel/Indicators/MenuItemFactory.qml:905
386388#, qt-format
387389msgid "%1 remaining"
388390msgstr "%1 preostalo"
389391
390−#: qml/Panel/Indicators/MenuItemFactory.qml:880
392+#: qml/Panel/Indicators/MenuItemFactory.qml:911
391393msgid "In queue…"
392394msgstr "U red..."
393395
394−#: qml/Panel/Indicators/MenuItemFactory.qml:884
396+#: qml/Panel/Indicators/MenuItemFactory.qml:915
395397msgid "Downloading"
396398msgstr "Preuzimanje"
397399
398−#: qml/Panel/Indicators/MenuItemFactory.qml:886
400+#: qml/Panel/Indicators/MenuItemFactory.qml:917
399401msgid "Paused, tap to resume"
400402msgstr "Pauzirano, kucnuti za nastavak"
401403
402−#: qml/Panel/Indicators/MenuItemFactory.qml:888
404+#: qml/Panel/Indicators/MenuItemFactory.qml:919
403405msgid "Canceled"
404406msgstr "Otkazano"
405407
406−#: qml/Panel/Indicators/MenuItemFactory.qml:890
408+#: qml/Panel/Indicators/MenuItemFactory.qml:921
407409msgid "Finished"
408410msgstr "Završeno"
409411
410−#: qml/Panel/Indicators/MenuItemFactory.qml:892
412+#: qml/Panel/Indicators/MenuItemFactory.qml:923
411413msgid "Failed, tap to retry"
412414msgstr "Neuspjelo, kucnuti za ponavljanje"
413415
@@ -427,260 +429,324 @@ msgctxt "Button: Call back on phone"
427429msgid "Call back"
428430msgstr "Uzvrati poziv"
429431
430−#: qml/Panel/Indicators/ModemInfoItem.qml:105
431−msgid "Unlock SIM"
432−msgstr "Otključajte SIM"
433−
434−#: qml/Panel/Indicators/RoamingIndication.qml:27
435−msgid "Roaming"
436−msgstr "Roaming"
437−
438−#: qml/Tutorial/TutorialBottom.qml:28
439−msgid "Open special menus"
440−msgstr "Otvorite posebne menije"
441−
442−#: qml/Tutorial/TutorialBottom.qml:29
443−msgid "Swipe up from the bottom edge."
444−msgstr "Prevucite od donje ivice."
432+#: qml/Stages/SideStage.qml:76
433+msgid "Drag using 3 fingers any application from one window to the other"
434+msgstr ""
445435
446−#: qml/Tutorial/TutorialBottomFinish.qml:24
447−msgid "This action does different things for different apps"
448−msgstr "Ova radnja čini različite stvari za različite aplikacije"
436+#: qml/Tutorial/TutorialBottom.qml:78
437+msgid "Swipe up to add a contact"
438+msgstr ""
449439
450−#: qml/Tutorial/TutorialBottomFinish.qml:25
451−msgid "Tap here to finish."
452−msgstr "Kucnite ovdje za kraj."
440+#: qml/Tutorial/TutorialBottom.qml:80
441+msgid "Swipe up for favorite calculations"
442+msgstr ""
453443
454−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
455−#: qml/Tutorial/TutorialRight.qml:144
456−msgid "Tap here to continue."
457−msgstr "Kucnite ovdje za nastavak."
444+#: qml/Tutorial/TutorialBottom.qml:82
445+msgid "Swipe up for recent calls"
446+msgstr ""
458447
459−#: qml/Tutorial/TutorialLeft.qml:26
460−msgid "Open the launcher"
461−msgstr "Otvorite pokretač"
448+#: qml/Tutorial/TutorialBottom.qml:84
449+msgid "Swipe up to create a message"
450+msgstr ""
462451
463−#: qml/Tutorial/TutorialLeft.qml:27
464−msgid "Short swipe from the left edge."
465−msgstr "Kratko prevlačenje od lijeve ivice."
452+#: qml/Tutorial/TutorialBottom.qml:85
453+msgid "Swipe up to manage the app"
454+msgstr ""
466455
467−#: qml/Tutorial/TutorialLeftFinish.qml:24
468−msgid "These are the shortcuts to favorite apps"
469−msgstr "Ovo su kratice za omiljene aplikacije"
456+#: qml/Tutorial/TutorialLeftLong.qml:47
457+msgid "Long swipe from the left edge to open the Today scope"
458+msgstr ""
470459
471−#: qml/Tutorial/TutorialPage.qml:178
472−msgid "You almost got it!"
473−msgstr "Skoro ste uspjeli!"
460+#: qml/Tutorial/TutorialLeft.qml:47
461+msgid "Swipe from the left edge to open the launcher"
462+msgstr ""
474463
475−#: qml/Tutorial/TutorialPage.qml:195
476−msgid "Try again."
477−msgstr "Pokušajte ponovo."
464+#: qml/Tutorial/TutorialRight.qml:55
465+msgid "Push your mouse against the right edge to view your open apps"
466+msgstr ""
478467
479−#: qml/Tutorial/TutorialRight.qml:31
480−msgid "To view open apps"
481−msgstr "Za pregled pokrenutih aplikacija"
468+#: qml/Tutorial/TutorialRight.qml:56
469+msgid "Short or long swipe from the right edge to view your open apps"
470+msgstr ""
482471
483−#: qml/Tutorial/TutorialRight.qml:32
484−msgid "Long swipe from the right edge."
485−msgstr "Dugo prevlačenje od desne ivice."
472+#: qml/Tutorial/TutorialTop.qml:53
473+msgid "Swipe from the top right edge to open the notification bar"
474+msgstr ""
486475
487−#: qml/Tutorial/TutorialRight.qml:122
488−msgid "View all your running tasks."
489−msgstr "Pogledajte sve pokrenute zadatke."
476+#: qml/Tutorial/TutorialTop.qml:54
477+msgid "Swipe from the top edge to open the notification bar"
478+msgstr ""
490479
491−#: qml/Wizard/Page.qml:89
480+#: qml/Wizard/Page.qml:54
492481msgctxt "Button: Go back one page in the Wizard"
493482msgid "Back"
494483msgstr "Nazad"
495484
496485#: qml/Wizard/Pages/10-welcome.qml:27
497−msgid "Hi!"
498−msgstr "Ćao!"
486+msgid "Language"
487+msgstr ""
499488
500−#: qml/Wizard/Pages/10-welcome.qml:44
501−msgid "Welcome to your Ubuntu phone."
502−msgstr "Dobrodošli u vaš Ubuntu telefon."
489+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
490+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
491+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
492+#: qml/Wizard/Pages/75-report-check.qml:84
493+#: qml/Wizard/Pages/passcode-desktop.qml:124
494+#: qml/Wizard/Pages/password-set.qml:141
495+msgid "Next"
496+msgstr ""
503497
504−#: qml/Wizard/Pages/10-welcome.qml:52
505−msgid "Let’s get started."
506−msgstr "Započnimo"
498+#: qml/Wizard/Pages/30-wifi.qml:29
499+msgid "Connect to Wi‑Fi"
500+msgstr "Povezati na Wi-Fi"
507501
508−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
509−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
510−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
511−#: qml/Wizard/Pages/passwd-set.qml:90
512−msgid "Continue"
513−msgstr "Nastavite"
502+#: qml/Wizard/Pages/30-wifi.qml:130
503+msgid "Connected"
504+msgstr ""
514505
515−#: qml/Wizard/Pages/20-sim.qml:25
516−msgid "Add a SIM card and restart your device"
517−msgstr "Dodajte SIM karticu i restartujte vaš uređaj"
506+#: qml/Wizard/Pages/30-wifi.qml:163
507+msgid "Available Wi-Fi networks"
508+msgstr ""
518509
519−#: qml/Wizard/Pages/20-sim.qml:59
520−msgid "Without it, you won’t be able to make calls or use text messaging."
510+#: qml/Wizard/Pages/30-wifi.qml:164
511+msgid "No available Wi-Fi networks"
521512msgstr ""
522−"Bez nje, nećete biti u mogućnosti da uspostavite pozive ili koristite "
523−"tekstualne poruke."
524513
525−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
514+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
515+#: qml/Wizard/Pages/sim.qml:101
526516msgid "Skip"
527517msgstr "Preskočite"
528518
529−#: qml/Wizard/Pages/30-passwd-type.qml:39
530−msgid "Lock security"
531−msgstr "Sigurnost zaključavanja"
519+#: qml/Wizard/Pages/40-location.qml:27
520+msgid "Location Services"
521+msgstr ""
532522
533−#: qml/Wizard/Pages/30-passwd-type.qml:74
534−msgid "Please select how you’d like to unlock your phone."
535−msgstr "Molimo izaberite kako biste željeli da otključavate vaš telefon."
523+#: qml/Wizard/Pages/40-location.qml:83
524+msgid ""
525+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
526+"(recommended)"
527+msgstr ""
536528
537−#: qml/Wizard/Pages/30-passwd-type.qml:97
538−msgctxt "Label: Type of security method"
539−msgid "Swipe"
540−msgstr "Prevlačenje"
529+#: qml/Wizard/Pages/40-location.qml:105
530+#, qt-format
531+msgid "By selecting this option you agree to the Nokia HERE %1."
532+msgstr ""
533+
534+#: qml/Wizard/Pages/40-location.qml:106
535+msgctxt "part of: Nokia HERE terms and conditions"
536+msgid "terms and conditions"
537+msgstr ""
538+
539+#: qml/Wizard/Pages/40-location.qml:160
540+msgid "GPS only"
541+msgstr ""
542+
543+#: qml/Wizard/Pages/40-location.qml:214
544+msgid "Don't use my location"
545+msgstr ""
546+
547+#: qml/Wizard/Pages/40-location.qml:260
548+msgid "You can change it later in System Settings."
549+msgstr ""
550+
551+#: qml/Wizard/Pages/50-timezone.qml:29
552+msgid "Time Zone"
553+msgstr ""
554+
555+#: qml/Wizard/Pages/50-timezone.qml:178
556+msgid "Enter your city"
557+msgstr ""
558+
559+#: qml/Wizard/Pages/60-account.qml:24
560+msgid "Personalize Your Device"
561+msgstr ""
541562
542−#: qml/Wizard/Pages/30-passwd-type.qml:98
543−msgctxt "Label: Description of security method"
544−msgid "No security"
545−msgstr "Bez sigurnosti"
563+#: qml/Wizard/Pages/60-account.qml:48
564+msgid "Preferred Name"
565+msgstr ""
566+
567+#: qml/Wizard/Pages/70-passwd-type.qml:39
568+msgid "Lock Screen"
569+msgstr ""
546570
547−#: qml/Wizard/Pages/30-passwd-type.qml:100
571+#: qml/Wizard/Pages/70-passwd-type.qml:101
548572msgctxt "Label: Type of security method"
549−msgid "Passcode"
550−msgstr "Pristupni kod"
573+msgid "Create new password"
574+msgstr ""
551575
552−#: qml/Wizard/Pages/30-passwd-type.qml:101
553−msgctxt "Label: Description of security method"
554−msgid "4 digits only"
555−msgstr "samo 4 cifre"
576+#: qml/Wizard/Pages/70-passwd-type.qml:103
577+msgctxt "Label: Type of security method"
578+msgid "Create passcode (numbers only)"
579+msgstr ""
556580
557−#: qml/Wizard/Pages/30-passwd-type.qml:103
581+#: qml/Wizard/Pages/70-passwd-type.qml:105
558582msgctxt "Label: Type of security method"
559−msgid "Passphrase"
560−msgstr "Pristupna fraza"
583+msgid "No lock code"
584+msgstr ""
561585
562−#: qml/Wizard/Pages/30-passwd-type.qml:104
563−msgctxt "Label: Description of security method"
564−msgid "Numbers and letters"
565−msgstr "Brojevi i slova"
586+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
587+msgid "Privacy Policy"
588+msgstr ""
566589
567−#: qml/Wizard/Pages/40-wifi.qml:29
568−msgid "Connect to Wi‑Fi"
569−msgstr "Povezati na Wi-Fi"
590+#: qml/Wizard/Pages/75-report-check.qml:26
591+msgid "Help Us Improve"
592+msgstr ""
593+
594+#: qml/Wizard/Pages/75-report-check.qml:59
595+msgid "Improve system performance by sending us crashes and error reports."
596+msgstr ""
597+
598+#: qml/Wizard/Pages/75-report-check.qml:60
599+msgid "Privacy policy"
600+msgstr ""
570601
571−#: qml/Wizard/Pages/40-wifi.qml:168
572−msgid "Available networks…"
573−msgstr "Dostupne mreže..."
602+#: qml/Wizard/Pages/80-finished.qml:89
603+msgid "Welcome to Ubuntu"
604+msgstr ""
574605
575−#: qml/Wizard/Pages/40-wifi.qml:169
576−msgid "No available networks."
577−msgstr "Nema dostupnih mreža."
606+#: qml/Wizard/Pages/80-finished.qml:104
607+msgid "You are ready to use your device now"
608+msgstr ""
578609
579−#: qml/Wizard/Pages/50-location.qml:27
580−msgid "Location"
581−msgstr "Lokacija"
610+#: qml/Wizard/Pages/80-finished.qml:124
611+msgid "Get Started"
612+msgstr ""
582613
583−#: qml/Wizard/Pages/50-location.qml:62
584−msgid "Let the phone detect your location:"
585−msgstr "Dopustite da telefon otkrije Vašu lokaciju:"
614+#: qml/Wizard/Pages/here-terms.qml:25
615+msgid "Terms & Conditions"
616+msgstr "Uslovi i odredbe"
586617
587−#: qml/Wizard/Pages/50-location.qml:69
588−msgid "Using GPS only (less accurate)"
589−msgstr "Samo pomoću GPS (manje precizno)"
618+#: qml/Wizard/Pages/here-terms.qml:69
619+msgid "Your device uses positioning technologies provided by HERE."
620+msgstr ""
590621
591−#: qml/Wizard/Pages/50-location.qml:86
592−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
593−msgstr "Pomoću GPS, anonimnog Wi-Fi i podataka mobilne mreže (preporučeno)"
622+#: qml/Wizard/Pages/here-terms.qml:81
623+msgid ""
624+"To provide you with positioning services and to improve their quality, HERE "
625+"collects information about nearby cell towers and Wi-Fi hotspots around your "
626+"current location whenever your position is being found."
627+msgstr ""
594628
595−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
596−#: qml/Wizard/Pages/50-location.qml:103
629+#: qml/Wizard/Pages/here-terms.qml:93
597630msgid ""
598−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
599−"conditions</a>."
631+"The information collected is used to analyze the service and to improve the "
632+"use of service, but not to identify you personally."
633+msgstr ""
634+
635+#: qml/Wizard/Pages/here-terms.qml:106
636+#, qt-format
637+msgid "By continuing, you agree to the HERE platform %1 and %2."
600638msgstr ""
601−"Birajući ovu opciju prihvatate za Nokia OVDJE <a href='#'>terms and "
602−"conditions</a>."
603639
604−#: qml/Wizard/Pages/50-location.qml:112
605−msgid "Not at all"
606−msgstr "Nipošto"
640+#: qml/Wizard/Pages/here-terms.qml:107
641+msgid "Service Terms"
642+msgstr ""
607643
608−#: qml/Wizard/Pages/50-location.qml:124
609−msgid "You can change your mind later in <b>System Settings</b>."
610−msgstr "Možete se predomisliti kasnije u <b>System Settings</b>."
644+#: qml/Wizard/Pages/passcode-confirm.qml:43
645+#: qml/Wizard/Pages/passcode-desktop.qml:80
646+msgid "Confirm passcode"
647+msgstr "Potvrdi pristupni kod"
611648
612−#: qml/Wizard/Pages/60-reporting.qml:26
613−msgid "Improving your experience"
614−msgstr "Poboljšavajući vaše iskustvo"
649+#: qml/Wizard/Pages/passcode-confirm.qml:45
650+msgid "Incorrect passcode."
651+msgstr ""
615652
616−#: qml/Wizard/Pages/60-reporting.qml:46
617−msgid ""
618−"Your phone is set up to automatically report errors to Canonical and its "
619−"partners, the makers of the operating system."
653+#: qml/Wizard/Pages/passcode-confirm.qml:45
654+msgctxt "Enter the passcode again"
655+msgid "Please re-enter."
620656msgstr ""
621−"Vaš telefon je podešen da automatski prijavljuje greške Canonical i "
622−"njegovim partnerima, tvorcima operativnog sistema."
623657
624−#: qml/Wizard/Pages/60-reporting.qml:53
625−msgid ""
626−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
627−"Privacy</b>"
658+#: qml/Wizard/Pages/passcode-desktop.qml:30
659+msgid "Lock Screen Passcode"
660+msgstr ""
661+
662+#: qml/Wizard/Pages/passcode-desktop.qml:56
663+msgid "Enter 4 numbers to setup your passcode"
628664msgstr ""
629−"Ovo može biti isključeno u <b>System Settings</b> under <b>Security &amp; "
630−"Privacy</b>"
631665
632−#: qml/Wizard/Pages/80-finished.qml:24
633−msgid "All done"
634−msgstr "Sve urađeno"
666+#: qml/Wizard/Pages/passcode-desktop.qml:65
667+#: qml/Wizard/Pages/passcode-set.qml:54
668+msgid "Choose passcode"
669+msgstr ""
635670
636−#: qml/Wizard/Pages/80-finished.qml:39
637−msgid "Nice work!"
638−msgstr "Dobro urađeno!"
671+#: qml/Wizard/Pages/passcode-desktop.qml:105
672+msgid "Passcode too short"
673+msgstr ""
639674
640−#: qml/Wizard/Pages/80-finished.qml:46
641−msgid "Your phone is now ready to use."
642−msgstr "Vaš telefon je sada spreman za upotrebu."
675+#: qml/Wizard/Pages/passcode-desktop.qml:107
676+msgid "Passcodes match"
677+msgstr ""
643678
644−#: qml/Wizard/Pages/80-finished.qml:53
645−msgid "Finish"
646−msgstr "Završiti"
679+#: qml/Wizard/Pages/passcode-desktop.qml:109
680+msgid "Passcodes do not match"
681+msgstr ""
647682
648−#: qml/Wizard/Pages/here-terms.qml:27
649−msgid "Terms & Conditions"
650−msgstr "Uslovi i odredbe"
683+#: qml/Wizard/Pages/passcode-set.qml:62
684+msgid "Passcode must be 4 characters long"
685+msgstr ""
651686
652−#: qml/Wizard/Pages/passwd-confirm.qml:49
653−msgid "Confirm passphrase"
654−msgstr "Potvrditi pristupnu rečenicu"
687+#: qml/Wizard/Pages/password-set.qml:30
688+msgid "Lock Screen Password"
689+msgstr ""
655690
656−#: qml/Wizard/Pages/passwd-confirm.qml:50
657−msgid "Confirm passcode"
658−msgstr "Potvrdi pristupni kod"
691+#: qml/Wizard/Pages/password-set.qml:61
692+msgid "Enter at least 8 characters"
693+msgstr ""
659694
660−#: qml/Wizard/Pages/passwd-confirm.qml:53
661−#: qml/Wizard/Pages/passwd-confirm.qml:54
662−msgid "Please try again."
663−msgstr "Molimo pokušajte ponovo."
695+#: qml/Wizard/Pages/password-set.qml:73
696+msgid "Choose password"
697+msgstr ""
664698
665−#: qml/Wizard/Pages/passwd-set.qml:61
666−msgid "Choose your passcode"
667−msgstr "Izaberite vaš pristupni kod"
699+#: qml/Wizard/Pages/password-set.qml:103
700+msgid "Confirm password"
701+msgstr ""
668702
669−#: qml/Wizard/Pages/passwd-set.qml:68
670−msgid "Passphrase must be 4 characters long"
671−msgstr "Pristupna fraza mora sadržavati 4 slova"
703+#: qml/Wizard/Pages/sim.qml:27
704+msgid "No SIM card installed"
705+msgstr ""
672706
673−#. Translators: This is the arrow for "Back" buttons
674−#: qml/Wizard/StackButton.qml:39
675−#, qt-format
676−msgid "〈 %1"
677−msgstr "〈 %1"
707+#: qml/Wizard/Pages/sim.qml:54
708+msgid "SIM card added"
709+msgstr ""
678710
679−#. Translators: This is the arrow for "Forward" buttons
680−#: qml/Wizard/StackButton.qml:42
681−#, qt-format
682−msgid "%1 〉"
683−msgstr "%1 〉"
711+#: qml/Wizard/Pages/sim.qml:55
712+msgid "You must restart the device to access the mobile network."
713+msgstr ""
714+
715+#: qml/Wizard/Pages/sim.qml:59
716+msgid "Restart"
717+msgstr ""
718+
719+#: qml/Wizard/Pages/sim.qml:78
720+msgid "You won’t be able to make calls or use text messaging without a SIM."
721+msgstr ""
722+
723+#: qml/Wizard/Pages/sim.qml:90
724+msgid "To proceed with no SIM tap Skip."
725+msgstr ""
726+
727+#: qml/Wizard/PasswordMeter.qml:87
728+msgid "Passwords match"
729+msgstr ""
730+
731+#: qml/Wizard/PasswordMeter.qml:89
732+msgid "Passwords do not match"
733+msgstr ""
734+
735+#: qml/Wizard/PasswordMeter.qml:93
736+msgid "Strong password"
737+msgstr ""
738+
739+#: qml/Wizard/PasswordMeter.qml:95
740+msgid "Fair password"
741+msgstr ""
742+
743+#: qml/Wizard/PasswordMeter.qml:97
744+msgid "Weak password"
745+msgstr ""
746+
747+#: qml/Wizard/PasswordMeter.qml:99
748+msgid "Very weak password"
749+msgstr ""
684750
685751#~ msgid "Top edge"
686752#~ msgstr "Gornja ivica"
@@ -694,5 +760,201 @@ msgstr "%1 〉"
694760#~ msgid "Right edge"
695761#~ msgstr "Desna ivica"
696762
763+#~ msgid "Are you sure you want to shut down?"
764+#~ msgstr "Da li ste sigurni da želite ugasiti?"
765+
766+#~ msgctxt "Button: Shut down the system"
767+#~ msgid "Shut down"
768+#~ msgstr "Gašenje sistema"
769+
770+#~ msgid "See all"
771+#~ msgstr "Pogledati sve"
772+
773+#~ msgid "See less"
774+#~ msgstr "Pogledati manje"
775+
697776#~ msgid "Please re-enter"
698777#~ msgstr "Molimo ponovo unesite"
778+
779+#~ msgid "This action does different things for different apps"
780+#~ msgstr "Ova radnja čini različite stvari za različite aplikacije"
781+
782+#~ msgid "Unlock SIM"
783+#~ msgstr "Otključajte SIM"
784+
785+#~ msgid "Roaming"
786+#~ msgstr "Roaming"
787+
788+#~ msgid "Tap here to continue."
789+#~ msgstr "Kucnite ovdje za nastavak."
790+
791+#~ msgid "These are the shortcuts to favorite apps"
792+#~ msgstr "Ovo su kratice za omiljene aplikacije"
793+
794+#~ msgid "Swipe up from the bottom edge."
795+#~ msgstr "Prevucite od donje ivice."
796+
797+#~ msgid "Open special menus"
798+#~ msgstr "Otvorite posebne menije"
799+
800+#~ msgid "Tap here to finish."
801+#~ msgstr "Kucnite ovdje za kraj."
802+
803+#~ msgid "Long swipe from the right edge."
804+#~ msgstr "Dugo prevlačenje od desne ivice."
805+
806+#~ msgid "View all your running tasks."
807+#~ msgstr "Pogledajte sve pokrenute zadatke."
808+
809+#~ msgid "Hi!"
810+#~ msgstr "Ćao!"
811+
812+#~ msgid "Welcome to your Ubuntu phone."
813+#~ msgstr "Dobrodošli u vaš Ubuntu telefon."
814+
815+#~ msgid "To view open apps"
816+#~ msgstr "Za pregled pokrenutih aplikacija"
817+
818+#~ msgid "Try again."
819+#~ msgstr "Pokušajte ponovo."
820+
821+#~ msgid "You almost got it!"
822+#~ msgstr "Skoro ste uspjeli!"
823+
824+#~ msgid "Short swipe from the left edge."
825+#~ msgstr "Kratko prevlačenje od lijeve ivice."
826+
827+#~ msgid "Open the launcher"
828+#~ msgstr "Otvorite pokretač"
829+
830+#~ msgid "Lock security"
831+#~ msgstr "Sigurnost zaključavanja"
832+
833+#~ msgid "Without it, you won’t be able to make calls or use text messaging."
834+#~ msgstr ""
835+#~ "Bez nje, nećete biti u mogućnosti da uspostavite pozive ili koristite "
836+#~ "tekstualne poruke."
837+
838+#~ msgid "Add a SIM card and restart your device"
839+#~ msgstr "Dodajte SIM karticu i restartujte vaš uređaj"
840+
841+#~ msgid "Please select how you’d like to unlock your phone."
842+#~ msgstr "Molimo izaberite kako biste željeli da otključavate vaš telefon."
843+
844+#~ msgctxt "Label: Description of security method"
845+#~ msgid "No security"
846+#~ msgstr "Bez sigurnosti"
847+
848+#~ msgctxt "Label: Type of security method"
849+#~ msgid "Swipe"
850+#~ msgstr "Prevlačenje"
851+
852+#~ msgctxt "Label: Type of security method"
853+#~ msgid "Passcode"
854+#~ msgstr "Pristupni kod"
855+
856+#~ msgid "Let’s get started."
857+#~ msgstr "Započnimo"
858+
859+#~ msgid "Continue"
860+#~ msgstr "Nastavite"
861+
862+#~ msgctxt "Label: Description of security method"
863+#~ msgid "4 digits only"
864+#~ msgstr "samo 4 cifre"
865+
866+#~ msgid "Let the phone detect your location:"
867+#~ msgstr "Dopustite da telefon otkrije Vašu lokaciju:"
868+
869+#~ msgid "Available networks…"
870+#~ msgstr "Dostupne mreže..."
871+
872+#~ msgid "No available networks."
873+#~ msgstr "Nema dostupnih mreža."
874+
875+#~ msgid "Location"
876+#~ msgstr "Lokacija"
877+
878+#~ msgid "Using GPS only (less accurate)"
879+#~ msgstr "Samo pomoću GPS (manje precizno)"
880+
881+#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
882+#~ msgstr "Pomoću GPS, anonimnog Wi-Fi i podataka mobilne mreže (preporučeno)"
883+
884+#~ msgctxt "Label: Description of security method"
885+#~ msgid "Numbers and letters"
886+#~ msgstr "Brojevi i slova"
887+
888+#~ msgid "Improving your experience"
889+#~ msgstr "Poboljšavajući vaše iskustvo"
890+
891+#~ msgid "You can change your mind later in <b>System Settings</b>."
892+#~ msgstr "Možete se predomisliti kasnije u <b>System Settings</b>."
893+
894+#~ msgid ""
895+#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
896+#~ "Privacy</b>"
897+#~ msgstr ""
898+#~ "Ovo može biti isključeno u <b>System Settings</b> under <b>Security &amp; "
899+#~ "Privacy</b>"
900+
901+#~ msgid ""
902+#~ "Your phone is set up to automatically report errors to Canonical and its "
903+#~ "partners, the makers of the operating system."
904+#~ msgstr ""
905+#~ "Vaš telefon je podešen da automatski prijavljuje greške Canonical i "
906+#~ "njegovim partnerima, tvorcima operativnog sistema."
907+
908+#~ msgid "Nice work!"
909+#~ msgstr "Dobro urađeno!"
910+
911+#~ msgid "All done"
912+#~ msgstr "Sve urađeno"
913+
914+#~ msgid "Finish"
915+#~ msgstr "Završiti"
916+
917+#~ msgid ""
918+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
919+#~ "conditions</a>."
920+#~ msgstr ""
921+#~ "Birajući ovu opciju prihvatate za Nokia OVDJE <a href='#'>terms and "
922+#~ "conditions</a>."
923+
924+#~ msgid "Not at all"
925+#~ msgstr "Nipošto"
926+
927+#~ msgid "Your phone is now ready to use."
928+#~ msgstr "Vaš telefon je sada spreman za upotrebu."
929+
930+#~ msgid "Confirm passphrase"
931+#~ msgstr "Potvrditi pristupnu rečenicu"
932+
933+#, qt-format
934+#~ msgid "〈 %1"
935+#~ msgstr "〈 %1"
936+
937+#, qt-format
938+#~ msgid "%1 〉"
939+#~ msgstr "%1 〉"
940+
941+#~ msgid "Choose your passcode"
942+#~ msgstr "Izaberite vaš pristupni kod"
943+
944+#~ msgid "Please try again."
945+#~ msgstr "Molimo pokušajte ponovo."
946+
947+#~ msgid "Passphrase must be 4 characters long"
948+#~ msgstr "Pristupna fraza mora sadržavati 4 slova"
949+
950+#~ msgctxt "Label: Type of security method"
951+#~ msgid "Passphrase"
952+#~ msgstr "Pristupna fraza"
953+
954+#~ msgctxt "Title: Reboot/Shut down dialog"
955+#~ msgid "Shut down"
956+#~ msgstr "Ugasi"
957+
958+#~ msgctxt "Button: Reboot the system"
959+#~ msgid "Reboot"
960+#~ msgstr "Ponovo pokreni"
po/ca.po+533−271
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2015-12-08 15:42+0000\n"
10+"POT-Creation-Date: 2016-04-27 15:01+0000\n"
1111"PO-Revision-Date: 2015-07-04 09:48+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,23 +15,23 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-12-12 05:44+0000\n"
19−"X-Generator: Launchpad (build 17865)\n"
18+"X-Launchpad-Export-Date: 2016-04-30 05:36+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
2323msgstr "Contrasenya: "
2424
25−#: plugins/Unity/Launcher/launcheritem.cpp:47
26−#: plugins/Unity/Launcher/launcheritem.cpp:106
25+#: plugins/Unity/Launcher/launcheritem.cpp:48
26+#: plugins/Unity/Launcher/launcheritem.cpp:107
2727msgid "Pin shortcut"
2828msgstr "Enganxa la drecera"
2929
30−#: plugins/Unity/Launcher/launcheritem.cpp:52
30+#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
3232msgstr "Surt"
3333
34−#: plugins/Unity/Launcher/launcheritem.cpp:106
34+#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
3636msgstr "Desenganxa la drecera"
3737
@@ -77,53 +77,35 @@ msgctxt "Button: Log out from the system"
7777msgid "Log Out"
7878msgstr "Surt"
7979
80−#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:194
81−#: qml/Components/Dialogs.qml:253
80+#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:217
81+#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
82+#: qml/Wizard/Pages/passcode-set.qml:32
8283msgid "Cancel"
8384msgstr "Cancel·la"
8485
8586#: qml/Components/Dialogs.qml:173
86−msgctxt "Title: Reboot/Shut down dialog"
87−msgid "Shut down"
88−msgstr "Apaga"
89−
90−#: qml/Components/Dialogs.qml:174
91−msgid "Are you sure you want to shut down?"
92−msgstr "Segur que voleu apagar?"
93−
94−#: qml/Components/Dialogs.qml:176
95−msgctxt "Button: Reboot the system"
96−msgid "Reboot"
97−msgstr "Reinicia"
98−
99−#: qml/Components/Dialogs.qml:185
100−msgctxt "Button: Shut down the system"
101−msgid "Shut down"
102−msgstr "Apaga"
103−
104−#: qml/Components/Dialogs.qml:207
10587msgctxt "Title: Reboot dialog"
10688msgid "Reboot"
10789msgstr "Reinicia"
10890
109−#: qml/Components/Dialogs.qml:208
91+#: qml/Components/Dialogs.qml:174
11092msgid "Are you sure you want to reboot?"
11193msgstr "Segur que voleu reiniciar?"
11294
113−#: qml/Components/Dialogs.qml:210
95+#: qml/Components/Dialogs.qml:176
11496msgid "No"
11597msgstr "No"
11698
117−#: qml/Components/Dialogs.qml:217
99+#: qml/Components/Dialogs.qml:182
118100msgid "Yes"
119101msgstr "Sí"
120102
121−#: qml/Components/Dialogs.qml:232
103+#: qml/Components/Dialogs.qml:197
122104msgctxt "Title: Power off/Restart dialog"
123105msgid "Power"
124106msgstr "Energia"
125107
126−#: qml/Components/Dialogs.qml:233
108+#: qml/Components/Dialogs.qml:198
127109msgid ""
128110"Are you sure you would like\n"
129111"to power off?"
@@ -131,88 +113,106 @@ msgstr ""
131113"Segur que voleu\n"
132114"apagar?"
133115
134−#: qml/Components/Dialogs.qml:235
116+#: qml/Components/Dialogs.qml:200
135117msgctxt "Button: Power off the system"
136118msgid "Power off"
137119msgstr "Apaga"
138120
139−#: qml/Components/Dialogs.qml:244
121+#: qml/Components/Dialogs.qml:209
140122msgctxt "Button: Restart the system"
141123msgid "Restart"
142124msgstr "Reinicia"
143125
144−#: qml/Components/Lockscreen.qml:245
126+#: qml/Components/Lockscreen.qml:231
145127msgid "Return to Call"
146128msgstr "Torna a la trucada"
147129
148−#: qml/Components/Lockscreen.qml:245
130+#: qml/Components/Lockscreen.qml:231
149131msgid "Emergency Call"
150132msgstr "Trucada d'emergència"
151133
152−#: qml/Components/Lockscreen.qml:277
134+#: qml/Components/Lockscreen.qml:263
153135msgid "OK"
154136msgstr "D'acord"
155137
156138#: qml/Components/ModeSwitchWarningDialog.qml:32
157139msgid "Apps may have unsaved data:"
158−msgstr ""
140+msgstr "Pot ser que aquestes aplicacions no hagin desat les dades:"
159141
160142#: qml/Components/ModeSwitchWarningDialog.qml:57
143+msgctxt ""
144+"Re-dock means connect the device again to an external screen/mouse/keyboard"
161145msgid "Re-dock, save your work and close these apps to continue."
162146msgstr ""
163147
164148#: qml/Components/ModeSwitchWarningDialog.qml:63
165149msgid "Or force close now (unsaved data will be lost)."
166−msgstr ""
150+msgstr "O força el tancament (les dades no desades es perdran)."
167151
168152#: qml/Components/ModeSwitchWarningDialog.qml:75
169153msgid "OK, I will reconnect"
170−msgstr ""
154+msgstr "D'acord, tornaré a connectar"
171155
172156#: qml/Components/ModeSwitchWarningDialog.qml:76
173157msgid "Reconnect now!"
174−msgstr ""
158+msgstr "Torna a connectar"
175159
176160#: qml/Components/ModeSwitchWarningDialog.qml:88
177161msgid "Close all"
178−msgstr ""
162+msgstr "Tanca-ho tot"
179163
180−#: qml/Dash/DashPageHeader.qml:265
164+#: qml/Dash/DashPageHeader.qml:337
181165msgctxt "Button: Open the Ubuntu Store"
182166msgid "Store"
183167msgstr "Botiga"
184168
185−#: qml/Dash/DashPageHeader.qml:272
169+#: qml/Dash/DashPageHeader.qml:344
186170msgctxt "Button: Start a search in the current dash scope"
187171msgid "Search"
188172msgstr "Cerca"
189173
190−#: qml/Dash/DashPageHeader.qml:282
174+#: qml/Dash/DashPageHeader.qml:354
191175msgctxt "Button: Show the current dash scope settings"
192176msgid "Settings"
193177msgstr "Paràmetres"
194178
195−#: qml/Dash/DashPageHeader.qml:289
179+#: qml/Dash/DashPageHeader.qml:361
196180msgid "Remove from Favorites"
197181msgstr "Suprimeix dels preferits"
198182
199−#: qml/Dash/DashPageHeader.qml:289
183+#: qml/Dash/DashPageHeader.qml:361
200184msgid "Add to Favorites"
201185msgstr "Afegeix als preferits"
202186
203−#: qml/Dash/GenericScopeView.qml:576 qml/Dash/GenericScopeView.qml:734
204−msgid "See less"
205−msgstr "Mostra'n menys"
187+#: qml/Dash/FiltersPopover.qml:60
188+msgid "Refine your results"
189+msgstr ""
190+
191+#: qml/Dash/FiltersPopover.qml:69
192+msgid "Reset"
193+msgstr ""
194+
195+#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196+msgid "Show less"
197+msgstr ""
206198
207−#: qml/Dash/GenericScopeView.qml:576
208−msgid "See all"
209−msgstr "Mostra-ho tot"
199+#: qml/Dash/GenericScopeView.qml:570
200+msgid "Show all"
201+msgstr ""
210202
211−#: qml/Dash/GenericScopeView.qml:638
203+#: qml/Dash/GenericScopeView.qml:627
212204msgctxt "Label: Hint for dash search line edit"
213205msgid "Search"
214206msgstr "Cerca"
215207
208+#: qml/Dash/PageHeaderExtraPanel.qml:55
209+msgid "Recent Searches"
210+msgstr "Cerques recents"
211+
212+#: qml/Dash/PageHeaderExtraPanel.qml:66
213+msgid "Clear All"
214+msgstr "Neteja-ho tot"
215+
216216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217217msgid "More..."
218218msgstr "Més..."
@@ -234,7 +234,7 @@ msgstr "Puntueu-ho"
234234msgid "Add a review"
235235msgstr "Afegiu una ressenya"
236236
237−#: qml/Dash/Previews/PreviewSharing.qml:51
237+#: qml/Dash/Previews/PreviewSharing.qml:66
238238msgid "Preview Share Item"
239239msgstr ""
240240
@@ -262,27 +262,29 @@ msgstr "Inici"
262262msgid "Also installed"
263263msgstr "També instal·lat"
264264
265−#: qml/DisabledScreenNotice.qml:42
266−msgid "Your device is now connected to an external display."
265+#: qml/DisabledScreenNotice.qml:104
266+msgid ""
267+"Your device is now connected to an external display. Use this screen as a "
268+"touch pad to interact with the pointer."
267269msgstr ""
268270
269−#: qml/Greeter/CoverPage.qml:107
271+#: qml/Greeter/CoverPage.qml:118
270272msgid "Unlock"
271273msgstr "Desbloca"
272274
273−#: qml/Greeter/LoginList.qml:236
275+#: qml/Greeter/LoginList.qml:239
274276msgid "Retry"
275277msgstr "Torna-ho a provar"
276278
277−#: qml/Greeter/LoginList.qml:237
279+#: qml/Greeter/LoginList.qml:240
278280msgid "Tap to unlock"
279281msgstr "Feu un toc per desblocar"
280282
281−#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
283+#: qml/Greeter/NarrowView.qml:54
282284msgid "Sorry, incorrect passphrase."
283285msgstr "La contrasenya és incorrecta"
284286
285−#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
287+#: qml/Greeter/NarrowView.qml:55
286288msgid "Sorry, incorrect passcode."
287289msgstr "El codi d'accés no és correcte"
288290
@@ -313,7 +315,7 @@ msgstr ""
313315msgid "Enter %1"
314316msgstr "Introduïu: %1"
315317
316−#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
318+#: qml/Greeter/NarrowView.qml:117
317319msgid "Enter passphrase"
318320msgstr "Introduïu la contrasenya"
319321
@@ -339,7 +341,7 @@ msgstr "Torneu-ho a introduir"
339341msgid "Sorry, incorrect passcode"
340342msgstr "El codi d'accés no és correcte"
341343
342−#: qml/Notifications/NotificationMenuItemFactory.qml:129
344+#: qml/Notifications/NotificationMenuItemFactory.qml:124
343345msgid "Show password"
344346msgstr "Mostra la contrasenya"
345347
@@ -351,62 +353,62 @@ msgstr "Feu un toc per tornar a la trucada..."
351353msgid "Conference"
352354msgstr "Conferència"
353355
354−#: qml/Panel/Indicators/MenuItemFactory.qml:731
356+#: qml/Panel/Indicators/MenuItemFactory.qml:762
355357msgid "Nothing is playing"
356358msgstr "No s'està reproduint res"
357359
358−#: qml/Panel/Indicators/MenuItemFactory.qml:860
360+#: qml/Panel/Indicators/MenuItemFactory.qml:891
359361#, qt-format
360362msgid "%1 hour"
361363msgid_plural "%1 hours"
362364msgstr[0] "%1 hora"
363365msgstr[1] "%1 hores"
364366
365−#: qml/Panel/Indicators/MenuItemFactory.qml:864
367+#: qml/Panel/Indicators/MenuItemFactory.qml:895
366368#, qt-format
367369msgid "%1 minute"
368370msgid_plural "%1 minutes"
369371msgstr[0] "%1 minut"
370372msgstr[1] "%1 minuts"
371373
372−#: qml/Panel/Indicators/MenuItemFactory.qml:869
374+#: qml/Panel/Indicators/MenuItemFactory.qml:900
373375#, qt-format
374376msgid "%1 second"
375377msgid_plural "%1 seconds"
376378msgstr[0] "%1 segon"
377379msgstr[1] "%1 segons"
378380
379−#: qml/Panel/Indicators/MenuItemFactory.qml:872
381+#: qml/Panel/Indicators/MenuItemFactory.qml:903
380382msgid "0 seconds"
381383msgstr "0 segons"
382384
383385#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
384−#: qml/Panel/Indicators/MenuItemFactory.qml:874
386+#: qml/Panel/Indicators/MenuItemFactory.qml:905
385387#, qt-format
386388msgid "%1 remaining"
387389msgstr "Resta %1"
388390
389−#: qml/Panel/Indicators/MenuItemFactory.qml:880
391+#: qml/Panel/Indicators/MenuItemFactory.qml:911
390392msgid "In queue…"
391393msgstr "A la cua..."
392394
393−#: qml/Panel/Indicators/MenuItemFactory.qml:884
395+#: qml/Panel/Indicators/MenuItemFactory.qml:915
394396msgid "Downloading"
395397msgstr "S'està baixant"
396398
397−#: qml/Panel/Indicators/MenuItemFactory.qml:886
399+#: qml/Panel/Indicators/MenuItemFactory.qml:917
398400msgid "Paused, tap to resume"
399401msgstr "En pausa, feu un toc per continuar"
400402
401−#: qml/Panel/Indicators/MenuItemFactory.qml:888
403+#: qml/Panel/Indicators/MenuItemFactory.qml:919
402404msgid "Canceled"
403405msgstr "S'ha cancel·lat"
404406
405−#: qml/Panel/Indicators/MenuItemFactory.qml:890
407+#: qml/Panel/Indicators/MenuItemFactory.qml:921
406408msgid "Finished"
407409msgstr "S'ha finalitzat"
408410
409−#: qml/Panel/Indicators/MenuItemFactory.qml:892
411+#: qml/Panel/Indicators/MenuItemFactory.qml:923
410412msgid "Failed, tap to retry"
411413msgstr "Ha fallat, feu un toc per tornar-ho a intentar"
412414
@@ -414,7 +416,7 @@ msgstr "Ha fallat, feu un toc per tornar-ho a intentar"
414416#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
415417msgctxt "Button: Send a reply message"
416418msgid "Send"
417−msgstr ""
419+msgstr "Envia"
418420
419421#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
420422msgctxt "Label: Hint in message indicator line edit"
@@ -424,263 +426,326 @@ msgstr "Respon"
424426#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
425427msgctxt "Button: Call back on phone"
426428msgid "Call back"
427−msgstr ""
428−
429−#: qml/Panel/Indicators/ModemInfoItem.qml:105
430−msgid "Unlock SIM"
431−msgstr "Desbloca la SIM"
432−
433−#: qml/Panel/Indicators/RoamingIndication.qml:27
434−msgid "Roaming"
435−msgstr "Itinerància"
436−
437−#: qml/Tutorial/TutorialBottom.qml:28
438−msgid "Open special menus"
439−msgstr "Obre els menús especials"
429+msgstr "Retorna la trucada"
440430
441−#: qml/Tutorial/TutorialBottom.qml:29
442−msgid "Swipe up from the bottom edge."
443−msgstr "Llisqueu el dit des de la vora inferior."
431+#: qml/Stages/SideStage.qml:76
432+msgid "Drag using 3 fingers any application from one window to the other"
433+msgstr ""
444434
445−#: qml/Tutorial/TutorialBottomFinish.qml:24
446−msgid "This action does different things for different apps"
447−msgstr "Aquesta acció fa coses diferents depenent de l'aplicació"
435+#: qml/Tutorial/TutorialBottom.qml:78
436+msgid "Swipe up to add a contact"
437+msgstr ""
448438
449−#: qml/Tutorial/TutorialBottomFinish.qml:25
450−msgid "Tap here to finish."
451−msgstr "Feu un toc per finalitzar."
439+#: qml/Tutorial/TutorialBottom.qml:80
440+msgid "Swipe up for favorite calculations"
441+msgstr ""
452442
453−#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
454−#: qml/Tutorial/TutorialRight.qml:144
455−msgid "Tap here to continue."
456−msgstr "Feu un toc per continuar."
443+#: qml/Tutorial/TutorialBottom.qml:82
444+msgid "Swipe up for recent calls"
445+msgstr ""
457446
458−#: qml/Tutorial/TutorialLeft.qml:26
459−msgid "Open the launcher"
460−msgstr "Obre el llançador"
447+#: qml/Tutorial/TutorialBottom.qml:84
448+msgid "Swipe up to create a message"
449+msgstr ""
461450
462−#: qml/Tutorial/TutorialLeft.qml:27
463−msgid "Short swipe from the left edge."
464−msgstr "Lliscament curt des de la vora esquerra."
451+#: qml/Tutorial/TutorialBottom.qml:85
452+msgid "Swipe up to manage the app"
453+msgstr ""
465454
466−#: qml/Tutorial/TutorialLeftFinish.qml:24
467−msgid "These are the shortcuts to favorite apps"
468−msgstr "Aquestes són les dreceres a les aplicacions preferides"
455+#: qml/Tutorial/TutorialLeftLong.qml:47
456+msgid "Long swipe from the left edge to open the Today scope"
457+msgstr ""
469458
470−#: qml/Tutorial/TutorialPage.qml:178
471−msgid "You almost got it!"
472−msgstr "Ja gairebé ho teniu!"
459+#: qml/Tutorial/TutorialLeft.qml:47
460+msgid "Swipe from the left edge to open the launcher"
461+msgstr ""
473462
474−#: qml/Tutorial/TutorialPage.qml:195
475−msgid "Try again."
476−msgstr "Torneu-ho a provar."
463+#: qml/Tutorial/TutorialRight.qml:55
464+msgid "Push your mouse against the right edge to view your open apps"
465+msgstr ""
477466
478−#: qml/Tutorial/TutorialRight.qml:31
479−msgid "To view open apps"
480−msgstr "Per veure les aplicacions obertes"
467+#: qml/Tutorial/TutorialRight.qml:56
468+msgid "Short or long swipe from the right edge to view your open apps"
469+msgstr ""
481470
482−#: qml/Tutorial/TutorialRight.qml:32
483−msgid "Long swipe from the right edge."
484−msgstr "Lliscament llarg des de la vora dreta."
471+#: qml/Tutorial/TutorialTop.qml:53
472+msgid "Swipe from the top right edge to open the notification bar"
473+msgstr ""
485474
486−#: qml/Tutorial/TutorialRight.qml:122
487−msgid "View all your running tasks."
488−msgstr "Mostra totes les tasques en execució."
475+#: qml/Tutorial/TutorialTop.qml:54
476+msgid "Swipe from the top edge to open the notification bar"
477+msgstr ""
489478
490−#: qml/Wizard/Page.qml:89
479+#: qml/Wizard/Page.qml:54
491480msgctxt "Button: Go back one page in the Wizard"
492481msgid "Back"
493482msgstr "Enrere"
494483
495484#: qml/Wizard/Pages/10-welcome.qml:27
496−msgid "Hi!"
497−msgstr "Hola!"
485+msgid "Language"
486+msgstr ""
498487
499−#: qml/Wizard/Pages/10-welcome.qml:44
500−msgid "Welcome to your Ubuntu phone."
501−msgstr "Us donem la benvinguda al vostre telèfon Ubuntu."
488+#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
489+#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
490+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/70-passwd-type.qml:144
491+#: qml/Wizard/Pages/75-report-check.qml:84
492+#: qml/Wizard/Pages/passcode-desktop.qml:124
493+#: qml/Wizard/Pages/password-set.qml:141
494+msgid "Next"
495+msgstr ""
502496
503−#: qml/Wizard/Pages/10-welcome.qml:52
504−msgid "Let’s get started."
505−msgstr "Comencem."
497+#: qml/Wizard/Pages/30-wifi.qml:29
498+msgid "Connect to Wi‑Fi"
499+msgstr "Connecta't a la Wi-Fi"
506500
507−#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
508−#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
509−#: qml/Wizard/Pages/60-reporting.qml:60 qml/Wizard/Pages/passwd-confirm.qml:82
510−#: qml/Wizard/Pages/passwd-set.qml:90
511−msgid "Continue"
512−msgstr "Continua"
501+#: qml/Wizard/Pages/30-wifi.qml:130
502+msgid "Connected"
503+msgstr ""
513504
514−#: qml/Wizard/Pages/20-sim.qml:25
515−msgid "Add a SIM card and restart your device"
516−msgstr "Afegiu una targeta SIM i reinicieu el dispositiu"
505+#: qml/Wizard/Pages/30-wifi.qml:163
506+msgid "Available Wi-Fi networks"
507+msgstr ""
517508
518−#: qml/Wizard/Pages/20-sim.qml:59
519−msgid "Without it, you won’t be able to make calls or use text messaging."
520−msgstr "Sense ella, no podreu fer trucades o enviar missatges de text."
509+#: qml/Wizard/Pages/30-wifi.qml:164
510+msgid "No available Wi-Fi networks"
511+msgstr ""
521512
522−#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
513+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
514+#: qml/Wizard/Pages/sim.qml:101
523515msgid "Skip"
524516msgstr "Omet"
525517
526−#: qml/Wizard/Pages/30-passwd-type.qml:39
527−msgid "Lock security"
528−msgstr "Seguretat del bloqueig"
518+#: qml/Wizard/Pages/40-location.qml:27
519+msgid "Location Services"
520+msgstr ""
529521
530−#: qml/Wizard/Pages/30-passwd-type.qml:74
531−msgid "Please select how you’d like to unlock your phone."
532−msgstr "Seleccioneu com voleu desblocar el telèfon."
522+#: qml/Wizard/Pages/40-location.qml:83
523+msgid ""
524+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
525+"(recommended)"
526+msgstr ""
533527
534−#: qml/Wizard/Pages/30-passwd-type.qml:97
535−msgctxt "Label: Type of security method"
536−msgid "Swipe"
537−msgstr "Lliscament amb el dit"
528+#: qml/Wizard/Pages/40-location.qml:105
529+#, qt-format
530+msgid "By selecting this option you agree to the Nokia HERE %1."
531+msgstr ""
532+
533+#: qml/Wizard/Pages/40-location.qml:106
534+msgctxt "part of: Nokia HERE terms and conditions"
535+msgid "terms and conditions"
536+msgstr ""
537+
538+#: qml/Wizard/Pages/40-location.qml:160
539+msgid "GPS only"
540+msgstr ""
541+
542+#: qml/Wizard/Pages/40-location.qml:214
543+msgid "Don't use my location"
544+msgstr ""
545+
546+#: qml/Wizard/Pages/40-location.qml:260
547+msgid "You can change it later in System Settings."
548+msgstr ""
538549
539−#: qml/Wizard/Pages/30-passwd-type.qml:98
540−msgctxt "Label: Description of security method"
541−msgid "No security"
542−msgstr "Sense seguretat"
550+#: qml/Wizard/Pages/50-timezone.qml:29
551+msgid "Time Zone"
552+msgstr ""
543553
544−#: qml/Wizard/Pages/30-passwd-type.qml:100
554+#: qml/Wizard/Pages/50-timezone.qml:178
555+msgid "Enter your city"
556+msgstr ""
557+
558+#: qml/Wizard/Pages/60-account.qml:24
559+msgid "Personalize Your Device"
560+msgstr ""
561+
562+#: qml/Wizard/Pages/60-account.qml:48
563+msgid "Preferred Name"
564+msgstr ""
565+
566+#: qml/Wizard/Pages/70-passwd-type.qml:39
567+msgid "Lock Screen"
568+msgstr ""
569+
570+#: qml/Wizard/Pages/70-passwd-type.qml:101
545571msgctxt "Label: Type of security method"
546−msgid "Passcode"
547−msgstr "Codi d'accés"
572+msgid "Create new password"
573+msgstr ""
548574
549−#: qml/Wizard/Pages/30-passwd-type.qml:101
550−msgctxt "Label: Description of security method"
551−msgid "4 digits only"
552−msgstr "Només 4 dígits"
575+#: qml/Wizard/Pages/70-passwd-type.qml:103
576+msgctxt "Label: Type of security method"
577+msgid "Create passcode (numbers only)"
578+msgstr ""
553579
554−#: qml/Wizard/Pages/30-passwd-type.qml:103
580+#: qml/Wizard/Pages/70-passwd-type.qml:105
555581msgctxt "Label: Type of security method"
556−msgid "Passphrase"
557−msgstr "Contrasenya"
582+msgid "No lock code"
583+msgstr ""
558584
559−#: qml/Wizard/Pages/30-passwd-type.qml:104
560−msgctxt "Label: Description of security method"
561−msgid "Numbers and letters"
562−msgstr "Números i lletres"
585+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
586+msgid "Privacy Policy"
587+msgstr ""
563588
564−#: qml/Wizard/Pages/40-wifi.qml:29
565−msgid "Connect to Wi‑Fi"
566−msgstr "Connecta't a la Wi-Fi"
589+#: qml/Wizard/Pages/75-report-check.qml:26
590+msgid "Help Us Improve"
591+msgstr ""
567592
568−#: qml/Wizard/Pages/40-wifi.qml:168
569−msgid "Available networks…"
570−msgstr "Xarxes disponibles..."
593+#: qml/Wizard/Pages/75-report-check.qml:59
594+msgid "Improve system performance by sending us crashes and error reports."
595+msgstr ""
571596
572−#: qml/Wizard/Pages/40-wifi.qml:169
573−msgid "No available networks."
574−msgstr "No hi ha xarxes disponibles"
597+#: qml/Wizard/Pages/75-report-check.qml:60
598+msgid "Privacy policy"
599+msgstr ""
575600
576−#: qml/Wizard/Pages/50-location.qml:27
577−msgid "Location"
578−msgstr "Ubicació"
601+#: qml/Wizard/Pages/80-finished.qml:89
602+msgid "Welcome to Ubuntu"
603+msgstr ""
579604
580−#: qml/Wizard/Pages/50-location.qml:62
581−msgid "Let the phone detect your location:"
582−msgstr "Fes que el telèfon detecti la meva ubicació:"
605+#: qml/Wizard/Pages/80-finished.qml:104
606+msgid "You are ready to use your device now"
607+msgstr ""
583608
584−#: qml/Wizard/Pages/50-location.qml:69
585−msgid "Using GPS only (less accurate)"
586−msgstr "Utilitza només el GPS (menys precís)"
609+#: qml/Wizard/Pages/80-finished.qml:124
610+msgid "Get Started"
611+msgstr ""
612+
613+#: qml/Wizard/Pages/here-terms.qml:25
614+msgid "Terms & Conditions"
615+msgstr "Condicions generals"
587616
588−#: qml/Wizard/Pages/50-location.qml:86
589−msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
617+#: qml/Wizard/Pages/here-terms.qml:69
618+msgid "Your device uses positioning technologies provided by HERE."
590619msgstr ""
591−"Utilitza GPS, Wi-Fi anonimitzada i informació de la xarxa telefònica "
592−"(recomanat)"
593620
594−#. Translators: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
595−#: qml/Wizard/Pages/50-location.qml:103
621+#: qml/Wizard/Pages/here-terms.qml:81
596622msgid ""
597−"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
598−"conditions</a>."
623+"To provide you with positioning services and to improve their quality, HERE "
624+"collects information about nearby cell towers and Wi-Fi hotspots around your "
625+"current location whenever your position is being found."
599626msgstr ""
600−"Si seleccioneu aquesta opció, accepteu <a href='#'>les condicions generals "
601−"del servei Nokia HERE</a>."
602627
603−#: qml/Wizard/Pages/50-location.qml:112
604−msgid "Not at all"
605−msgstr "No"
628+#: qml/Wizard/Pages/here-terms.qml:93
629+msgid ""
630+"The information collected is used to analyze the service and to improve the "
631+"use of service, but not to identify you personally."
632+msgstr ""
606633
607−#: qml/Wizard/Pages/50-location.qml:124
608−msgid "You can change your mind later in <b>System Settings</b>."
634+#: qml/Wizard/Pages/here-terms.qml:106
635+#, qt-format
636+msgid "By continuing, you agree to the HERE platform %1 and %2."
609637msgstr ""
610−"Podeu canviar-ho més endavant a l'aplicació <b>Paràmetres del sistema</b>"
611638
612−#: qml/Wizard/Pages/60-reporting.qml:26
613−msgid "Improving your experience"
614−msgstr "Millora de l'experiència"
639+#: qml/Wizard/Pages/here-terms.qml:107
640+msgid "Service Terms"
641+msgstr ""
615642
616−#: qml/Wizard/Pages/60-reporting.qml:46
617−msgid ""
618−"Your phone is set up to automatically report errors to Canonical and its "
619−"partners, the makers of the operating system."
643+#: qml/Wizard/Pages/passcode-confirm.qml:43
644+#: qml/Wizard/Pages/passcode-desktop.qml:80
645+msgid "Confirm passcode"
646+msgstr "Confirmeu el codi d'accés"
647+
648+#: qml/Wizard/Pages/passcode-confirm.qml:45
649+msgid "Incorrect passcode."
620650msgstr ""
621−"Aquest telèfon està configurat per enviar errors de manera automàtica a "
622−"Canonical i associats, els creadors del sistema operatiu."
623651
624−#: qml/Wizard/Pages/60-reporting.qml:53
625−msgid ""
626−"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
627−"Privacy</b>"
652+#: qml/Wizard/Pages/passcode-confirm.qml:45
653+msgctxt "Enter the passcode again"
654+msgid "Please re-enter."
628655msgstr ""
629−"Podeu inhabilitar-ho a <b>Configuració del sistema</b>, a la secció "
630−"<b>Seguretat i privadesa</b>"
631656
632−#: qml/Wizard/Pages/80-finished.qml:24
633−msgid "All done"
634−msgstr "Tot fet"
657+#: qml/Wizard/Pages/passcode-desktop.qml:30
658+msgid "Lock Screen Passcode"
659+msgstr ""
635660
636−#: qml/Wizard/Pages/80-finished.qml:39
637−msgid "Nice work!"
638−msgstr "Bona feina!"
661+#: qml/Wizard/Pages/passcode-desktop.qml:56
662+msgid "Enter 4 numbers to setup your passcode"
663+msgstr ""
639664
640−#: qml/Wizard/Pages/80-finished.qml:46
641−msgid "Your phone is now ready to use."
642−msgstr "Ja podeu utilitzar el vostre telèfon."
665+#: qml/Wizard/Pages/passcode-desktop.qml:65
666+#: qml/Wizard/Pages/passcode-set.qml:54
667+msgid "Choose passcode"
668+msgstr ""
643669
644−#: qml/Wizard/Pages/80-finished.qml:53
645−msgid "Finish"
646−msgstr "Finalitza"
670+#: qml/Wizard/Pages/passcode-desktop.qml:105
671+msgid "Passcode too short"
672+msgstr ""
647673
648−#: qml/Wizard/Pages/here-terms.qml:27
649−msgid "Terms & Conditions"
650−msgstr "Condicions generals"
674+#: qml/Wizard/Pages/passcode-desktop.qml:107
675+msgid "Passcodes match"
676+msgstr ""
651677
652−#: qml/Wizard/Pages/passwd-confirm.qml:49
653−msgid "Confirm passphrase"
654−msgstr "Confirmeu la contrasenya"
678+#: qml/Wizard/Pages/passcode-desktop.qml:109
679+msgid "Passcodes do not match"
680+msgstr ""
655681
656−#: qml/Wizard/Pages/passwd-confirm.qml:50
657−msgid "Confirm passcode"
658−msgstr "Confirmeu el codi d'accés"
682+#: qml/Wizard/Pages/passcode-set.qml:62
683+msgid "Passcode must be 4 characters long"
684+msgstr ""
659685
660−#: qml/Wizard/Pages/passwd-confirm.qml:53
661−#: qml/Wizard/Pages/passwd-confirm.qml:54
662−msgid "Please try again."
663−msgstr "Torneu-ho a intentar."
686+#: qml/Wizard/Pages/password-set.qml:30
687+msgid "Lock Screen Password"
688+msgstr ""
664689
665−#: qml/Wizard/Pages/passwd-set.qml:61
666−msgid "Choose your passcode"
667−msgstr "Trieu el codi d'accés"
690+#: qml/Wizard/Pages/password-set.qml:61
691+msgid "Enter at least 8 characters"
692+msgstr ""
668693
669−#: qml/Wizard/Pages/passwd-set.qml:68
670−msgid "Passphrase must be 4 characters long"
671−msgstr "La contrasenya ha de tenir 4 caràcters com a mínim"
694+#: qml/Wizard/Pages/password-set.qml:73
695+msgid "Choose password"
696+msgstr ""
672697
673−#. Translators: This is the arrow for "Back" buttons
674−#: qml/Wizard/StackButton.qml:39
675−#, qt-format
676−msgid "〈 %1"
677−msgstr "〈 %1"
698+#: qml/Wizard/Pages/password-set.qml:103
699+msgid "Confirm password"
700+msgstr ""
678701
679−#. Translators: This is the arrow for "Forward" buttons
680−#: qml/Wizard/StackButton.qml:42
681−#, qt-format
682−msgid "%1 〉"
683−msgstr "%1 〉"
702+#: qml/Wizard/Pages/sim.qml:27
703+msgid "No SIM card installed"
704+msgstr ""
705+
706+#: qml/Wizard/Pages/sim.qml:54
707+msgid "SIM card added"
708+msgstr ""
709+
710+#: qml/Wizard/Pages/sim.qml:55
711+msgid "You must restart the device to access the mobile network."
712+msgstr ""
713+
714+#: qml/Wizard/Pages/sim.qml:59
715+msgid "Restart"
716+msgstr "Reinicia"
717+
718+#: qml/Wizard/Pages/sim.qml:78
719+msgid "You won’t be able to make calls or use text messaging without a SIM."
720+msgstr ""
721+
722+#: qml/Wizard/Pages/sim.qml:90
723+msgid "To proceed with no SIM tap Skip."
724+msgstr ""
725+
726+#: qml/Wizard/PasswordMeter.qml:87
727+msgid "Passwords match"
728+msgstr ""
729+
730+#: qml/Wizard/PasswordMeter.qml:89
731+msgid "Passwords do not match"
732+msgstr ""
733+
734+#: qml/Wizard/PasswordMeter.qml:93
735+msgid "Strong password"
736+msgstr ""
737+
738+#: qml/Wizard/PasswordMeter.qml:95
739+msgid "Fair password"
740+msgstr ""
741+
742+#: qml/Wizard/PasswordMeter.qml:97
743+msgid "Weak password"
744+msgstr ""
745+
746+#: qml/Wizard/PasswordMeter.qml:99
747+msgid "Very weak password"
748+msgstr ""
684749
685750#~ msgid "Confirm"
686751#~ msgstr "Confirma"
@@ -736,6 +801,9 @@ msgstr "%1 〉"
736801#~ msgstr ""
737802#~ "Proveu de lliscar el dit des de la vora dreta per desblocar el telèfon"
738803
804+#~ msgid "See less"
805+#~ msgstr "Mostra'n menys"
806+
739807#~ msgid ""
740808#~ "You have now mastered the edge gestures and can start using the "
741809#~ "phone<br><br>Tap on the screen to start"
@@ -743,12 +811,21 @@ msgstr "%1 〉"
743811#~ "Ja heu après com utilitzar els gestos de les vores per fer servir el "
744812#~ "telèfon<br><br>Feu un toc a la pantalla per començar"
745813
814+#~ msgid "See all"
815+#~ msgstr "Mostra-ho tot"
816+
817+#~ msgid "Unlock SIM"
818+#~ msgstr "Desbloca la SIM"
819+
746820#~ msgid "Store"
747821#~ msgstr "Botiga"
748822
749823#~ msgid "Done"
750824#~ msgstr "Fet"
751825
826+#~ msgid "Roaming"
827+#~ msgstr "Itinerància"
828+
752829#~ msgid "Favorites"
753830#~ msgstr "Preferides"
754831
@@ -770,18 +847,200 @@ msgstr "%1 〉"
770847#~ msgid "Power off"
771848#~ msgstr "Apaga"
772849
850+#~ msgid "Are you sure you want to shut down?"
851+#~ msgstr "Segur que voleu apagar?"
852+
773853#~ msgid "Shut down"
774854#~ msgstr "Apaga"
775855
776−#~ msgid "Restart"
777−#~ msgstr "Reinicia"
778−
779856#~ msgid "Please re-enter"
780857#~ msgstr "Torneu-ho a introduir"
781858
782859#~ msgid "Manage Scopes"
783860#~ msgstr "Gestioneu les lents"
784861
862+#~ msgid "Add a SIM card and restart your device"
863+#~ msgstr "Afegiu una targeta SIM i reinicieu el dispositiu"
864+
865+#~ msgid "Without it, you won’t be able to make calls or use text messaging."
866+#~ msgstr "Sense ella, no podreu fer trucades o enviar missatges de text."
867+
868+#~ msgid "Hi!"
869+#~ msgstr "Hola!"
870+
871+#~ msgid "Welcome to your Ubuntu phone."
872+#~ msgstr "Us donem la benvinguda al vostre telèfon Ubuntu."
873+
874+#~ msgid "Let’s get started."
875+#~ msgstr "Comencem."
876+
877+#~ msgid "Continue"
878+#~ msgstr "Continua"
879+
880+#~ msgid "Lock security"
881+#~ msgstr "Seguretat del bloqueig"
882+
883+#~ msgid "Please select how you’d like to unlock your phone."
884+#~ msgstr "Seleccioneu com voleu desblocar el telèfon."
885+
886+#~ msgid "Improving your experience"
887+#~ msgstr "Millora de l'experiència"
888+
889+#~ msgid "Available networks…"
890+#~ msgstr "Xarxes disponibles..."
891+
892+#~ msgid "No available networks."
893+#~ msgstr "No hi ha xarxes disponibles"
894+
895+#~ msgid "Location"
896+#~ msgstr "Ubicació"
897+
898+#~ msgid ""
899+#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
900+#~ "Privacy</b>"
901+#~ msgstr ""
902+#~ "Podeu inhabilitar-ho a <b>Configuració del sistema</b>, a la secció "
903+#~ "<b>Seguretat i privadesa</b>"
904+
905+#~ msgid ""
906+#~ "Your phone is set up to automatically report errors to Canonical and its "
907+#~ "partners, the makers of the operating system."
908+#~ msgstr ""
909+#~ "Aquest telèfon està configurat per enviar errors de manera automàtica a "
910+#~ "Canonical i associats, els creadors del sistema operatiu."
911+
912+#~ msgid "Finish"
913+#~ msgstr "Finalitza"
914+
915+#~ msgid "Your phone is now ready to use."
916+#~ msgstr "Ja podeu utilitzar el vostre telèfon."
917+
918+#~ msgid "Confirm passphrase"
919+#~ msgstr "Confirmeu la contrasenya"
920+
921+#~ msgid "Please try again."
922+#~ msgstr "Torneu-ho a intentar."
923+
924+#~ msgid "Nice work!"
925+#~ msgstr "Bona feina!"
926+
927+#~ msgid "All done"
928+#~ msgstr "Tot fet"
929+
930+#~ msgid "Choose your passcode"
931+#~ msgstr "Trieu el codi d'accés"
932+
933+#, qt-format
934+#~ msgid "%1 〉"
935+#~ msgstr "%1 〉"
936+
937+#~ msgid "Passphrase must be 4 characters long"
938+#~ msgstr "La contrasenya ha de tenir 4 caràcters com a mínim"
939+
940+#, qt-format
941+#~ msgid "〈 %1"
942+#~ msgstr "〈 %1"
943+
944+#~ msgid "Let the phone detect your location:"
945+#~ msgstr "Fes que el telèfon detecti la meva ubicació:"
946+
947+#~ msgid "Using GPS only (less accurate)"
948+#~ msgstr "Utilitza només el GPS (menys precís)"
949+
950+#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
951+#~ msgstr ""
952+#~ "Utilitza GPS, Wi-Fi anonimitzada i informació de la xarxa telefònica "
953+#~ "(recomanat)"
954+
955+#~ msgid "You can change your mind later in <b>System Settings</b>."
956+#~ msgstr ""
957+#~ "Podeu canviar-ho més endavant a l'aplicació <b>Paràmetres del sistema</b>"
958+
959+#~ msgid ""
960+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
961+#~ "conditions</a>."
962+#~ msgstr ""
963+#~ "Si seleccioneu aquesta opció, accepteu <a href='#'>les condicions generals "
964+#~ "del servei Nokia HERE</a>."
965+
966+#~ msgid "Not at all"
967+#~ msgstr "No"
968+
969+#~ msgid "You almost got it!"
970+#~ msgstr "Ja gairebé ho teniu!"
971+
972+#~ msgid "Open the launcher"
973+#~ msgstr "Obre el llançador"
974+
975+#~ msgid "Tap here to continue."
976+#~ msgstr "Feu un toc per continuar."
977+
978+#~ msgid "Open special menus"
979+#~ msgstr "Obre els menús especials"
980+
981+#~ msgid "To view open apps"
982+#~ msgstr "Per veure les aplicacions obertes"
983+
984+#~ msgid "Long swipe from the right edge."
985+#~ msgstr "Lliscament llarg des de la vora dreta."
986+
987+#~ msgid "View all your running tasks."
988+#~ msgstr "Mostra totes les tasques en execució."
989+
990+#~ msgid "This action does different things for different apps"
991+#~ msgstr "Aquesta acció fa coses diferents depenent de l'aplicació"
992+
993+#~ msgid "Try again."
994+#~ msgstr "Torneu-ho a provar."
995+
996+#~ msgid "Short swipe from the left edge."
997+#~ msgstr "Lliscament curt des de la vora esquerra."
998+
999+#~ msgid "These are the shortcuts to favorite apps"
1000+#~ msgstr "Aquestes són les dreceres a les aplicacions preferides"
1001+
1002+#~ msgid "Swipe up from the bottom edge."
1003+#~ msgstr "Llisqueu el dit des de la vora inferior."
1004+
1005+#~ msgid "Tap here to finish."
1006+#~ msgstr "Feu un toc per finalitzar."
1007+
1008+#~ msgctxt "Label: Description of security method"
1009+#~ msgid "4 digits only"
1010+#~ msgstr "Només 4 dígits"
1011+
1012+#~ msgctxt "Button: Shut down the system"
1013+#~ msgid "Shut down"
1014+#~ msgstr "Apaga"
1015+
1016+#~ msgctxt "Title: Reboot/Shut down dialog"
1017+#~ msgid "Shut down"
1018+#~ msgstr "Apaga"
1019+
1020+#~ msgctxt "Button: Reboot the system"
1021+#~ msgid "Reboot"
1022+#~ msgstr "Reinicia"
1023+
1024+#~ msgctxt "Label: Type of security method"
1025+#~ msgid "Swipe"
1026+#~ msgstr "Lliscament amb el dit"
1027+
1028+#~ msgctxt "Label: Type of security method"
1029+#~ msgid "Passcode"
1030+#~ msgstr "Codi d'accés"
1031+
1032+#~ msgctxt "Label: Description of security method"
1033+#~ msgid "No security"
1034+#~ msgstr "Sense seguretat"
1035+
1036+#~ msgctxt "Label: Type of security method"
1037+#~ msgid "Passphrase"
1038+#~ msgstr "Contrasenya"
1039+
1040+#~ msgctxt "Label: Description of security method"
1041+#~ msgid "Numbers and letters"
1042+#~ msgstr "Números i lletres"
1043+
7851044#~ msgid "Yesterday %l:%M %p"
7861045#~ msgstr "Ahir %l.%M %p"
7871046
@@ -811,3 +1070,6 @@ msgstr "%1 〉"
8111070
8121071#~ msgid "%l:%M %p"
8131072#~ msgstr "%l∶%M %p"
1073+
1074+#~ msgid "Call back"
1075+#~ msgstr "Retorna la trucada"
po/ca@valencia.po+430−246

This diff is too big to show here.

po/ce.po+276−202

This diff is too big to show here.

po/ckb.po+276−202

This diff is too big to show here.

po/cs.po+547−260

This diff is too big to show here.

po/cy.po+522−260

This diff is too big to show here.

po/da.po+523−261

This diff is too big to show here.

po/de.po+553−271

This diff is too big to show here.

po/el.po+550−278

This diff is too big to show here.

po/en_AU.po+550−279

This diff is too big to show here.

po/en_GB.po+546−275

This diff is too big to show here.

po/eo.po+379−235

This diff is too big to show here.

po/es.po+549−270

This diff is too big to show here.

po/eu.po+522−263

This diff is too big to show here.

po/fa.po+548−274

This diff is too big to show here.

po/fi.po+547−271

This diff is too big to show here.

po/fo.po+276−202

This diff is too big to show here.

po/fr.po+571−278

This diff is too big to show here.

po/ga.po+531−265

This diff is too big to show here.

po/gd.po+575−279

This diff is too big to show here.

po/gl.po+549−272

This diff is too big to show here.

po/gv.po+287−207

This diff is too big to show here.

po/he.po+443−240

This diff is too big to show here.

po/hi.po+276−202

This diff is too big to show here.

po/hr.po+550−266

This diff is too big to show here.

po/hu.po+552−273

This diff is too big to show here.

po/hy.po+291−208

This diff is too big to show here.

po/ia.po+561−283

This diff is too big to show here.

po/id.po+295−209

This diff is too big to show here.

po/is.po+295−209

This diff is too big to show here.

po/it.po+563−283

This diff is too big to show here.

po/ja.po+312−214

This diff is too big to show here.

po/km.po+387−240

This diff is too big to show here.

po/kn.po+276−202

This diff is too big to show here.

po/ko.po+529−270

This diff is too big to show here.

po/ku.po+295−206

This diff is too big to show here.

po/ky.po+276−202

This diff is too big to show here.

po/lo.po+276−202

This diff is too big to show here.

po/lt.po+276−202

This diff is too big to show here.

po/lv.po+521−262

This diff is too big to show here.

po/ml.po+276−202

This diff is too big to show here.

po/mr.po+276−202

This diff is too big to show here.

po/ms.po+524−265

This diff is too big to show here.

po/my.po+289−205

This diff is too big to show here.

po/nb.po+552−278

This diff is too big to show here.

po/ne.po+276−202

This diff is too big to show here.

po/nl.po+539−271

This diff is too big to show here.

po/nn.po+276−202

This diff is too big to show here.

po/oc.po+603−280

This diff is too big to show here.

po/or.po+276−202

This diff is too big to show here.

po/pa.po+522−263

This diff is too big to show here.

po/pl.po+554−272

This diff is too big to show here.

po/pt.po+562−288

This diff is too big to show here.

po/pt_BR.po+533−274

This diff is too big to show here.

po/ro.po+524−265

This diff is too big to show here.

po/ru.po+530−267

This diff is too big to show here.

po/shn.po+276−202

This diff is too big to show here.

po/si.po+279−205

This diff is too big to show here.

po/sk.po+621−330

This diff is too big to show here.

po/sl.po+586−280

This diff is too big to show here.

po/sq.po+448−245

This diff is too big to show here.

po/sr.po+573−301

This diff is too big to show here.

po/sv.po+555−280

This diff is too big to show here.

po/sw.po+451−242

This diff is too big to show here.

po/ta.po+276−202

This diff is too big to show here.

po/te.po+276−202

This diff is too big to show here.

po/th.po+276−202

This diff is too big to show here.

po/tr.po+522−263

This diff is too big to show here.

po/ug.po+503−258

This diff is too big to show here.

po/uk.po+552−272

This diff is too big to show here.

po/unity8.pot+274−200

This diff is too big to show here.

po/ur.po+276−202

This diff is too big to show here.

po/uz.po+276−202

This diff is too big to show here.

po/vi.po+276−202

This diff is too big to show here.

po/wo.po+522−263

This diff is too big to show here.

po/xh.po+276−202

This diff is too big to show here.

po/zh_CN.po+528−263

This diff is too big to show here.

po/zh_HK.po+284−204

This diff is too big to show here.

po/zh_TW.po+526−267

This diff is too big to show here.

qml/Components/Dialogs.qml+8−52

This diff is too big to show here.

qml/Components/EdgeBarrier.qml+1−1

This diff is too big to show here.

qml/Components/EdgeBarrierController.qml+2

This diff is too big to show here.

qml/Components/Header.qml+1

This diff is too big to show here.

qml/Components/InputMethod.qml+5−10

This diff is too big to show here.

qml/Components/KeymapSwitcher.qmlnew file+65

This diff is too big to show here.

qml/Components/Lockscreen.qml+82−96

This diff is too big to show here.

qml/Components/ModeSwitchWarningDialog.qml+1−1

This diff is too big to show here.

qml/Components/NotificationAudio.qml+4−7

This diff is too big to show here.

qml/Components/PanelState/PanelState.qml+2−1

This diff is too big to show here.

qml/Components/PassphraseLockscreen.qml+5−4

This diff is too big to show here.

qml/Components/PhysicalKeysMapper.qml+56−2

This diff is too big to show here.

qml/Components/PinLockscreen.qml+24−2

This diff is too big to show here.

qml/Components/PinPadButton.qml+17−2

This diff is too big to show here.

qml/Components/ResponsiveGridView.qml+2−4

This diff is too big to show here.

qml/Components/ShellDialog.qml+10

This diff is too big to show here.

qml/Components/Showable.qml+10

This diff is too big to show here.

qml/Components/UbuntuShapeForItem.qml+1

This diff is too big to show here.

qml/Components/Unity8Settings.qmldeleted−50

This diff is too big to show here.

qml/Components/VirtualTouchPad.qmlnew file+138

This diff is too big to show here.

qml/Components/VolumeControl.qml+1−6

This diff is too big to show here.

qml/Components/WindowControlButtons.qml+8−6

This diff is too big to show here.

qml/Components/ZoomableImage.qml+1−1

This diff is too big to show here.

qml/Dash/CardCarousel.qml−2

This diff is too big to show here.

qml/Dash/CardGrid.qml+3−3

This diff is too big to show here.

qml/Dash/CardHorizontalList.qml−2

This diff is too big to show here.

qml/Dash/CardTool.qml+2−27

This diff is too big to show here.

qml/Dash/CardVerticalJournal.qml−2

This diff is too big to show here.

qml/Dash/Dash.qml+19−19

This diff is too big to show here.

qml/Dash/DashBackground.qml+6−2

This diff is too big to show here.

qml/Dash/DashContent.qml+2−2

This diff is too big to show here.

qml/Dash/DashNavigation.qml+159−78

This diff is too big to show here.

qml/Dash/DashNavigationButton.qmldeleted−233

This diff is too big to show here.

qml/Dash/DashNavigationHeader.qmlnew file+73

This diff is too big to show here.

qml/Dash/DashNavigationList.qml+33−85

This diff is too big to show here.

qml/Dash/DashPageHeader.qml+144−130

This diff is too big to show here.

qml/Dash/Filters/FilterOptionSelector.qmlnew file+91

This diff is too big to show here.

qml/Dash/Filters/FilterRangeInput.qmlnew file+136

This diff is too big to show here.

qml/Dash/Filters/FilterValueSlider.qmlnew file+87

This diff is too big to show here.

qml/Dash/Filters/FilterWidget.qmlnew file+29

This diff is too big to show here.

qml/Dash/Filters/FilterWidgetFactory.qmlnew file+80

This diff is too big to show here.

qml/Dash/FiltersPopover.qmlnew file+105

This diff is too big to show here.

qml/Dash/GenericScopeView.qml+115−101

This diff is too big to show here.

qml/Dash/PageHeaderExtraPanel.qmlnew file+176

This diff is too big to show here.

qml/Dash/PreviewListView.qmldeleted−140

This diff is too big to show here.

qml/Dash/PreviewView.qmlnew file+76

This diff is too big to show here.

qml/Dash/Previews/Preview.qml+4−5

This diff is too big to show here.

qml/Dash/Previews/PreviewAudioPlayback.qml+21−76

This diff is too big to show here.

qml/Dash/Previews/PreviewExpandable.qml−1

This diff is too big to show here.

qml/Dash/Previews/PreviewHeader.qml+38−10

This diff is too big to show here.

qml/Dash/Previews/PreviewImageGallery.qml+2−2

This diff is too big to show here.

qml/Dash/Previews/PreviewMediaToolbar.qml+2−1

This diff is too big to show here.

qml/Dash/Previews/PreviewOverlay.qml+1−1

This diff is too big to show here.

qml/Dash/Previews/PreviewPayments.qml+1−3

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingDisplay.qml−1

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingEdit.qml+1−1

This diff is too big to show here.

qml/Dash/Previews/PreviewSharing.qml+20−11

This diff is too big to show here.

qml/Dash/Previews/PreviewVideoPlayback.qml+1−1

This diff is too big to show here.

qml/Dash/Previews/PreviewWidget.qml−3

This diff is too big to show here.

qml/Dash/Previews/PreviewWidgetFactory.qml−4

This diff is too big to show here.

qml/Dash/Previews/PreviewZoomableImage.qml+3−3

This diff is too big to show here.

qml/Dash/Previews/graphics/music_progress_bg.pngdeleted

Binary file not shown.

qml/Dash/ScopesList.qml+1−1

This diff is too big to show here.

qml/Dash/ScopesListCategoryItem.qml+8−4

This diff is too big to show here.

qml/Dash/graphics/paper.pngnew file

Binary file not shown.

qml/Dash/graphics/paper_landscape@27.pngdeleted

Binary file not shown.

qml/Dash/graphics/paper_portrait@27.pngdeleted

Binary file not shown.

qml/DeviceConfiguration.qml+54−16

This diff is too big to show here.

qml/DisabledScreenNotice.qml+98−21

This diff is too big to show here.

qml/Greeter/CoverPage.qml+13−2

This diff is too big to show here.

qml/Greeter/Greeter.qml+29−15

This diff is too big to show here.

qml/Greeter/Infographics.qml+2−1

This diff is too big to show here.

qml/Greeter/LoginList.qml+3

This diff is too big to show here.

qml/Greeter/NarrowView.qml+14−1

This diff is too big to show here.

qml/Greeter/WideView.qml+1−1

This diff is too big to show here.

qml/Launcher/Launcher.qml+162−37

This diff is too big to show here.

qml/Launcher/LauncherDelegate.qml+58−25

This diff is too big to show here.

qml/Launcher/LauncherPanel.qml+174−83

This diff is too big to show here.

qml/Launcher/graphics/launcher-app-focus-ring.svgnew file+12

This diff is too big to show here.

qml/Launcher/graphics/quicklist_tooltip@30.png

Binary file not shown.

qml/Notifications/Notification.qml+134−126

This diff is too big to show here.

qml/Notifications/NotificationButton.qmlnew file+72

This diff is too big to show here.

qml/Notifications/NotificationMenuItemFactory.qml+5−11

This diff is too big to show here.

qml/Notifications/Notifications.qml+4−3

This diff is too big to show here.

qml/Notifications/OptionToggle.qml+12−10

This diff is too big to show here.

qml/Notifications/ShapedIcon.qml+1

This diff is too big to show here.

qml/Notifications/SwipeToAct.qml+16−20

This diff is too big to show here.

qml/Notifications/grip-large.svgdeleted−150

This diff is too big to show here.

qml/OrientedShell.qml+87−23

This diff is too big to show here.

qml/Panel/Handle.qml+2−2

This diff is too big to show here.

qml/Panel/IndicatorItem.qml+60−17

This diff is too big to show here.

qml/Panel/IndicatorItemRow.qml+5−2

This diff is too big to show here.

qml/Panel/Indicators/MenuItemFactory.qml+50−10

This diff is too big to show here.

qml/Panel/Indicators/ModemInfoItem.qmldeleted−111

This diff is too big to show here.

qml/Panel/Indicators/RoamingIndication.qmldeleted−40

This diff is too big to show here.

qml/Panel/Indicators/client/IndicatorsClient.qml+2−2

This diff is too big to show here.

qml/Panel/IndicatorsMenu.qml+2−4

This diff is too big to show here.

qml/Panel/MenuContent.qml+1−1

This diff is too big to show here.

qml/Panel/Panel.qml+8−3

This diff is too big to show here.

qml/Panel/graphics/Battery@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Bluetooth@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Clock@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Location@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Messages@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Network@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Sound@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Sync@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/System@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Time@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/VerticalDivider@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/handle@12.pngdeleted

Binary file not shown.

qml/Panel/graphics/handle@12.scideleted−5

This diff is too big to show here.

qml/Panel/graphics/search@12.pngdeleted

Binary file not shown.

qml/Panel/graphics/time_and_date@18.pngdeleted

Binary file not shown.

qml/ScopeTool.qml−8

This diff is too big to show here.

qml/Shell.qml+176−119

This diff is too big to show here.

qml/Stages/AbstractStage.qml+20−4

This diff is too big to show here.

qml/Stages/Animations/BaseSessionAnimation.qmldeleted−96

This diff is too big to show here.

qml/Stages/Animations/SwipeFromBottomAnimation.qmldeleted−53

This diff is too big to show here.

qml/Stages/ApplicationWindow.qml+124−71

This diff is too big to show here.

qml/Stages/DecoratedWindow.qml+13−6

This diff is too big to show here.

qml/Stages/DesktopSpread.qml+86−35

This diff is too big to show here.

qml/Stages/DesktopSpreadDelegate.qml+19−4

This diff is too big to show here.

qml/Stages/DesktopStage.qml+273−128

This diff is too big to show here.

qml/Stages/PhoneStage.qml+247−99

This diff is too big to show here.

qml/Stages/PromptSurfaceAnimations.qmlnew file+81

This diff is too big to show here.

qml/Stages/SessionContainer.qmldeleted−178

This diff is too big to show here.

qml/Stages/SideStage.qmlnew file+118

This diff is too big to show here.

qml/Stages/Splash.qml+11−4

This diff is too big to show here.

qml/Stages/SpreadDelegate.qml+34−4

This diff is too big to show here.

qml/Stages/StagedFullscreenPolicy.qmlnew file+56

This diff is too big to show here.

qml/Stages/SurfaceContainer.qml+97−39

This diff is too big to show here.

qml/Stages/TabletSideStageTouchGesture.qmlnew file+154

This diff is too big to show here.

qml/Stages/TabletStage.qml+665−287

This diff is too big to show here.

qml/Stages/TopLevelSurfaceRepeater.qmlnew file+52

This diff is too big to show here.

qml/Stages/TransformedSpreadDelegate.qml+4−4

This diff is too big to show here.

qml/Stages/TransformedTabletSpreadDelegate.qml+94−60

This diff is too big to show here.

qml/Stages/WindowDecoration.qml+4−3

This diff is too big to show here.

qml/Stages/WindowResizeArea.qml+103−21

This diff is too big to show here.

qml/Stages/WindowedFullscreenPolicy.qmlnew file+39

This diff is too big to show here.

qml/Stages/graphics/sidestage_drag.svgnew file+207

This diff is too big to show here.

qml/Stages/graphics/sidestage_open.svgnew file+181

This diff is too big to show here.

qml/Tutorial/Arrow.qmldeleted−56

This diff is too big to show here.

qml/Tutorial/InactivityTimer.qmlnew file+62

This diff is too big to show here.

qml/Tutorial/Slider.qmldeleted−123

This diff is too big to show here.

qml/Tutorial/Tutorial.qml+39−14

This diff is too big to show here.

qml/Tutorial/TutorialBottom.qml+86−66

This diff is too big to show here.

qml/Tutorial/TutorialContent.qml+227−55

This diff is too big to show here.

qml/Tutorial/TutorialLeft.qml+21−68

This diff is too big to show here.

qml/Tutorial/TutorialLeftLong.qmlnew file+54

This diff is too big to show here.

qml/Tutorial/TutorialPage.qml+62−186

This diff is too big to show here.

qml/Tutorial/TutorialRight.qml+31−192

This diff is too big to show here.

qml/Tutorial/TutorialTop.qmlnew file+61

This diff is too big to show here.

qml/Tutorial/graphics/arrow.svgnew file+19

This diff is too big to show here.

qml/Tutorial/graphics/background1.pngnew file

Binary file not shown.

qml/Tutorial/graphics/background2.pngnew file

Binary file not shown.

qml/Tutorial/graphics/camera.pngdeleted

Binary file not shown.

qml/Tutorial/graphics/chevron.pngdeleted

Binary file not shown.

qml/Tutorial/graphics/dialer.pngdeleted

Binary file not shown.

qml/Tutorial/graphics/facebook.pngdeleted

Binary file not shown.

qml/Tutorial/graphics/gallery.pngdeleted

Binary file not shown.

qml/Tutorial/graphics/tick.pngdeleted

Binary file not shown.

qml/Wizard/CheckableSetting.qml+11−3

This diff is too big to show here.

qml/Wizard/Page.qml+261−44

This diff is too big to show here.

qml/Wizard/Pages.qml+75−31

This diff is too big to show here.

qml/Wizard/Pages/10-welcome.qml+128−48

This diff is too big to show here.

qml/Wizard/Pages/20-sim.qmldeleted−77

This diff is too big to show here.

qml/Wizard/Pages/30-passwd-type.qmldeleted−135

This diff is too big to show here.

qml/Wizard/Pages/30-wifi.qmlnew file+210

This diff is too big to show here.

qml/Wizard/Pages/40-location.qmlnew file+290

This diff is too big to show here.

qml/Wizard/Pages/40-wifi.qmldeleted−219

This diff is too big to show here.

qml/Wizard/Pages/50-location.qmldeleted−150

This diff is too big to show here.

qml/Wizard/Pages/50-timezone.qmlnew file+275

This diff is too big to show here.

qml/Wizard/Pages/60-reporting.qml → qml/Wizard/Pages/60-account.qmlrenamed+30−20

This diff is too big to show here.

qml/Wizard/Pages/70-passwd-type.qmlnew file+166

This diff is too big to show here.

qml/Wizard/Pages/75-report-check.qmlnew file+91

This diff is too big to show here.

qml/Wizard/Pages/80-finished.qml+94−16

This diff is too big to show here.

qml/Wizard/Pages/data/Desktop_header_bkg.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/Desktop_splash_screen_bkg.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/Phone_header_bkg.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/Phone_splash_screen_bkg.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/Tick@30.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/meet_ubuntu_simcard@30.pngdeleted

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/map.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/pin.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-1.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-10.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-11.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-2.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-3.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-3.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-4.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-4.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-6.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-7.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-8.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-9.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-9.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_0.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_1.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_10.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_10.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_11.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_12.75.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_12.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_13.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_2.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_3.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_3.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_4.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_4.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_5.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_5.75.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_6.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_6.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_7.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_8.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_8.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_9.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_9.pngnew file

Binary file not shown.

qml/Wizard/Pages/here-terms.qml+71−66

This diff is too big to show here.

qml/Wizard/Pages/passwd-confirm.qml → qml/Wizard/Pages/passcode-confirm.qmlrenamed+13−30

This diff is too big to show here.

qml/Wizard/Pages/passcode-desktop.qmlnew file+132

This diff is too big to show here.

qml/Wizard/Pages/passwd-set.qml → qml/Wizard/Pages/passcode-set.qmlrenamed+13−29

This diff is too big to show here.

qml/Wizard/Pages/password-set.qmlnew file+149

This diff is too big to show here.

qml/Wizard/Pages/sim.qmlnew file+108

This diff is too big to show here.

qml/Wizard/PasswordMeter.qmlnew file+106

This diff is too big to show here.

qml/Wizard/StackButton.qml+7−12

This diff is too big to show here.

qml/Wizard/Wizard.qml−9

This diff is too big to show here.

qml/Wizard/WizardTextField.qmlnew file+25

This diff is too big to show here.

src/CMakeLists.txt+14−8

This diff is too big to show here.

src/CachingNetworkManagerFactory.cpp+2−2

This diff is too big to show here.

src/CachingNetworkManagerFactory.h+3−2

This diff is too big to show here.

src/Dash/CMakeLists.txt+9−9

This diff is too big to show here.

src/Dash/main.cpp+14−5

This diff is too big to show here.

src/MouseTouchAdaptor.cpp+227−24

This diff is too big to show here.

src/MouseTouchAdaptor.h+12−3

This diff is too big to show here.

src/ShellApplication.cpp+5−5

This diff is too big to show here.

src/ShellApplication.h+12−4

This diff is too big to show here.

src/ShellView.cpp+6−2

This diff is too big to show here.

src/UnityCommandLineParser.cpp+6

This diff is too big to show here.

src/UnityCommandLineParser.h+8

This diff is too big to show here.

src/main.cpp+5

This diff is too big to show here.

src/qmldebuggerutils.hnew file+33

This diff is too big to show here.

tests/autopilot/unity8/dash.py+1−2

This diff is too big to show here.

tests/autopilot/unity8/settings_wizard/__init__.pydeleted−555

This diff is too big to show here.

tests/autopilot/unity8/settings_wizard/fixture_setup.pydeleted−58

This diff is too big to show here.

tests/autopilot/unity8/settings_wizard/ofono_helper.pydeleted−116

This diff is too big to show here.

tests/autopilot/unity8/settings_wizard/tests/__init__.pydeleted

No changes to the content.

tests/autopilot/unity8/settings_wizard/tests/test_settings_wizard.pydeleted−99

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators.py−2

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_helpers.py−2

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_tutorial.pydeleted−57

This diff is too big to show here.

tests/autopilot/unity8/tutorial.pydeleted−73

This diff is too big to show here.

tests/libs/UbuntuGestures/tst_TouchRegistry.cpp+60−1

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.cpp+60−3

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.h+30−5

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.qmltypes+5

This diff is too big to show here.

tests/mocks/CMakeLists.txt+1

This diff is too big to show here.

tests/mocks/Cursor/Cursor.qml+1

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.cpp+178−26

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.h+61−18

This diff is too big to show here.

tests/mocks/IntegratedLightDM/liblightdm/UsersModel.cpp−14

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/MockOfonoSimManager.qml+1

This diff is too big to show here.

tests/mocks/QMenuModel/QDBusActionGroup.qml+5−5

This diff is too big to show here.

tests/mocks/QtMultimedia/CMakeLists.txt+1

This diff is too big to show here.

tests/mocks/QtMultimedia/declarativeplaylist.cppnew file+73

This diff is too big to show here.

tests/mocks/QtMultimedia/declarativeplaylist.hnew file+54

This diff is too big to show here.

tests/mocks/QtMultimedia/mediaplayer.cpp+17−1

This diff is too big to show here.

tests/mocks/QtMultimedia/mediaplayer.h+9−3

This diff is too big to show here.

tests/mocks/QtMultimedia/plugin.cpp+2

This diff is too big to show here.

tests/mocks/UInput/CMakeLists.txtnew file+7

This diff is too big to show here.

tests/mocks/UInput/mockuinput.cppnew file+73

This diff is too big to show here.

tests/mocks/UInput/mockuinput.hnew file+63

This diff is too big to show here.

tests/mocks/UInput/plugin.cppnew file+26

This diff is too big to show here.

tests/mocks/UInput/plugin.hnew file+32

This diff is too big to show here.

tests/mocks/UInput/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/plugin.cpp+1

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/CMakeLists.txt+2

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Diagnostics/CMakeLists.txtnew file+1

This diff is too big to show here.

qml/Tutorial/Tick.qml → tests/mocks/Ubuntu/SystemSettings/Diagnostics/MockDiagnostics.qmlrenamed+4−9

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Diagnostics/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockKeyboardPlugin.qmlnew file+21

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockLanguagePlugin.qml+2−2

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/qmldir+1

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.cpp+9−2

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.h+8

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/TimeDate/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/TimeDate/MockTimeDate.qmlnew file+25

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/TimeDate/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.cpp+205−101

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.h+48−26

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.cpp+119−97

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.h+12−22

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationScreenshotProvider.cppdeleted−79

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationTestInterface.cppdeleted−117

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationTestInterface.hdeleted−45

This diff is too big to show here.

tests/mocks/Unity/Application/CMakeLists.txt+3−5

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurface.cpp+253−8

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurface.h+82−9

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceItem.cpp+47−12

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceItem.h+16

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceListModel.cppnew file+121

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceListModel.hnew file+56

This diff is too big to show here.

tests/mocks/Unity/Application/ObjectListModel.h+2

This diff is too big to show here.

tests/mocks/Unity/Application/Session.cppdeleted−184

This diff is too big to show here.

tests/mocks/Unity/Application/Session.hdeleted−97

This diff is too big to show here.

tests/mocks/Unity/Application/SessionManager.cppdeleted−55

This diff is too big to show here.

tests/mocks/Unity/Application/SurfaceManager.cpp+79−17

This diff is too big to show here.

tests/mocks/Unity/Application/SurfaceManager.h+47−4

This diff is too big to show here.

tests/mocks/Unity/Application/UbuntuKeyboardInfo.cpp−2

This diff is too big to show here.

tests/mocks/Unity/Application/UbuntuKeyboardInfo.h−9

This diff is too big to show here.

tests/mocks/Unity/Application/plugin.cpp+35−39

This diff is too big to show here.

tests/mocks/Unity/Application/resources/MirSurfaceItem.qml+59

This diff is too big to show here.

tests/mocks/Unity/CMakeLists.txt+15−3

This diff is too big to show here.

tests/mocks/Unity/Indicators/ModelActionRootState.qml+33−1

This diff is too big to show here.

tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock.cpp+1−1

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherModel.cpp+2

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockNotificationModel.cpp+6−11

This diff is too big to show here.

tests/mocks/Unity/Screens/CMakeLists.txtnew file+14

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationScreenshotProvider.h → tests/mocks/Unity/Screens/plugin.cpprenamed+9−14

This diff is too big to show here.

tests/mocks/Unity/Application/SessionModel.h → tests/mocks/Unity/Screens/plugin.hrenamed+6−16

This diff is too big to show here.

tests/mocks/Unity/Screens/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Unity/Screens/screens.cppnew file+71

This diff is too big to show here.

tests/mocks/Unity/Screens/screens.hnew file+82

This diff is too big to show here.

tests/mocks/Unity/Unity.qmltypes+33−50

This diff is too big to show here.

tests/mocks/Unity/fake_categories.cpp+1−1

This diff is too big to show here.

tests/mocks/Unity/fake_filters.cppnew file+125

This diff is too big to show here.

tests/mocks/Unity/fake_filters.hnew file+46

This diff is too big to show here.

tests/mocks/Unity/fake_navigation.cpp+9−10

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectorfilter.cppnew file+65

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectorfilter.hnew file+52

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectoroptions.cppnew file+77

This diff is too big to show here.

tests/mocks/Unity/fake_optionselectoroptions.hnew file+47

This diff is too big to show here.

tests/mocks/Unity/fake_previewstack.cppdeleted−68

This diff is too big to show here.

tests/mocks/Unity/fake_previewstack.hdeleted−52

This diff is too big to show here.

tests/mocks/Unity/fake_rangeinputfilter.cppnew file+167

This diff is too big to show here.

tests/mocks/Unity/fake_rangeinputfilter.hnew file+79

This diff is too big to show here.

tests/mocks/Unity/fake_scope.cpp+59−29

This diff is too big to show here.

tests/mocks/Unity/fake_scope.h+23−9

This diff is too big to show here.

tests/mocks/Unity/fake_unity_plugin.cpp+8−2

This diff is too big to show here.

tests/mocks/Unity/fake_valuesliderfilter.cppnew file+84

This diff is too big to show here.

tests/mocks/Unity/fake_valuesliderfilter.hnew file+55

This diff is too big to show here.

tests/mocks/Unity/fake_valueslidervalues.cppnew file+51

This diff is too big to show here.

tests/mocks/Unity/Application/SessionManager.h → tests/mocks/Unity/fake_valueslidervalues.hrenamed+11−19

This diff is too big to show here.

tests/mocks/Utils/CMakeLists.txt+9−4

This diff is too big to show here.

tests/mocks/Utils/Utils.qmltypes+2−2

This diff is too big to show here.

tests/mocks/Utils/HomeKeyWatcher.qml → tests/mocks/Utils/WindowInputMonitor.qmlrenamed+3−1

This diff is too big to show here.

tests/mocks/Utils/plugin.cpp+19−3

This diff is too big to show here.

tests/mocks/Utils/qmldir+1−1

This diff is too big to show here.

tests/mocks/Utils/windowstatestorage.cpp+13

This diff is too big to show here.

tests/mocks/Utils/windowstatestorage.h+4

This diff is too big to show here.

tests/mocks/Wizard/CMakeLists.txt+6−1

This diff is too big to show here.

tests/mocks/Wizard/MockSystem.cpp+4−2

This diff is too big to show here.

tests/mocks/Wizard/MockSystem.h+2−2

This diff is too big to show here.

tests/mocks/Wizard/mockplugin.cpp+7−8

This diff is too big to show here.

tests/mocks/indicator-service/CMakeLists.txt−1

This diff is too big to show here.

tests/plugins/AccountsService/CMakeLists.txt+12−1

This diff is too big to show here.

tests/plugins/AccountsService/PropertiesServer.cpp+55−4

This diff is too big to show here.

tests/plugins/AccountsService/PropertiesServer.h+9−2

This diff is too big to show here.

tests/plugins/AccountsService/UscServer.cppnew file+28

This diff is too big to show here.

tests/plugins/AccountsService/UscServer.hnew file+39

This diff is too big to show here.

tests/plugins/AccountsService/client.cpp+168−13

This diff is too big to show here.

tests/plugins/AccountsService/interfaces.xml+29

This diff is too big to show here.

tests/plugins/AccountsService/server.cpp+12

This diff is too big to show here.

tests/plugins/AccountsService/types.hnew file+25

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.res+13−23

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.res.cardcreatornew file+112

This diff is too big to show here.

tests/plugins/Dash/cardcreator/10.resnew file+139

This diff is too big to show here.

tests/plugins/Dash/cardcreator/10.res.cardcreatornew file+137

This diff is too big to show here.

tests/plugins/Dash/cardcreator/10.tstnew file+3

This diff is too big to show here.

tests/plugins/Dash/cardcreator/11.resnew file+207

This diff is too big to show here.

tests/plugins/Dash/cardcreator/11.res.cardcreatornew file+203

This diff is too big to show here.

tests/plugins/Dash/cardcreator/11.tstnew file+3

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.res+3−6

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.res.cardcreatornew file+136

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.res+12−21

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.res.cardcreatornew file+130

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.tst+1−1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.res+3−6

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.res.cardcreatornew file+109

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.res+13−23

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.res.cardcreatornew file+149

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.tst+1−1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.res+3−6

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.res.cardcreatornew file+126

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.res+3−6

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.res.cardcreatornew file+149

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.res+4−7

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.res.cardcreatornew file+107

This diff is too big to show here.

tests/plugins/Dash/cardcreator/9.resnew file+120

This diff is too big to show here.

tests/plugins/Dash/cardcreator/9.res.cardcreatornew file+119

This diff is too big to show here.

tests/plugins/Dash/cardcreator/9.tstnew file+3

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.cpp+33−22

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.qml+4−4

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+15

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertest.cpp+38

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertest.qml−1

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertestsection.qml+1−1

This diff is too big to show here.

tests/plugins/Dash/tst_ScopeStyle.qml+1−1

This diff is too big to show here.

tests/plugins/IntegratedLightDM/CMakeLists.txt+26

This diff is too big to show here.

tests/plugins/IntegratedLightDM/dbus.cpp+3−5

This diff is too big to show here.

tests/plugins/IntegratedLightDM/integrated.cppnew file+88

This diff is too big to show here.

tests/plugins/IntegratedLightDM/pam.cpp+3−1

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/CMakeLists.txt+7−1

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/GestureTest.cpp+44

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/GestureTest.h+13−1

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp−56

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.cpp+2

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.cppnew file+270

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.qmlnew file+90

This diff is too big to show here.

tests/plugins/Unity/Indicators/CMakeLists.txt−4

This diff is too big to show here.

tests/plugins/Unity/Launcher/CMakeLists.txt+2

This diff is too big to show here.

tests/plugins/Unity/Launcher/launchermodeltest.cpp+10−6

This diff is too big to show here.

tests/plugins/Unity/Session/CMakeLists.txt+2

This diff is too big to show here.

tests/plugins/Unity/Session/sessionbackendtest.cpp+1

This diff is too big to show here.

tests/plugins/Utils/CMakeLists.txt+8−2

This diff is too big to show here.

tests/plugins/Utils/DeviceConfigParserTest.cppnew file+70

This diff is too big to show here.

tests/plugins/Utils/HomeKeyWatcherTest.cpp → tests/plugins/Utils/WindowInputMonitorTest.cpprenamed+14−14

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+10−4

This diff is too big to show here.

tests/qmltests/Components/CMakeLists.txt+1−1

This diff is too big to show here.

tests/qmltests/Components/tst_Dialogs.qml+4−2

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle.qml+6−6

This diff is too big to show here.

qml/Tutorial/TutorialBottomFinish.qml → tests/qmltests/Components/tst_DragHandle/SimpleButton.qmlrenamed+15−20

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage.qml+27−8

This diff is too big to show here.

tests/qmltests/Components/tst_Lockscreen.qml+14−7

This diff is too big to show here.

tests/qmltests/Components/tst_PhysicalKeysMapper.qml+136−62

This diff is too big to show here.

tests/qmltests/Components/tst_ResponsiveGridView.qml−36

This diff is too big to show here.

tests/qmltests/Components/tst_VirtualTouchPad.qmlnew file+143

This diff is too big to show here.

tests/qmltests/Components/tst_ZoomableImage.qml+8−5

This diff is too big to show here.

tests/qmltests/Dash/CardHelpers.js+1−1

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterOptionSelector.qmlnew file+96

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterRangeInput.qmlnew file+247

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterValueSlider.qmlnew file+101

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterWidgetFactory.qmlnew file+58

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_Preview.qml+6−6

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml+16−11

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewHeader.qml+33−1

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+22−2

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewMediaToolbar.qmlnew file+69

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewSharing.qml+16−14

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+12

This diff is too big to show here.

tests/qmltests/Dash/tst_Card.qml+40−17

This diff is too big to show here.

tests/qmltests/Dash/tst_CardBenchmark.qml−2

This diff is too big to show here.

tests/qmltests/Dash/tst_CardTool.qml+4−4

This diff is too big to show here.

tests/qmltests/Dash/tst_Dash.qml+89

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qml+165−152

This diff is too big to show here.

tests/qmltests/Dash/tst_DashPageHeader.qml+24−15

This diff is too big to show here.

tests/qmltests/Dash/tst_DashShell.qml+6−2

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qml+31−38

This diff is too big to show here.

tests/qmltests/Dash/tst_PreviewListView.qml → tests/qmltests/Dash/tst_PreviewView.qmlrenamed+23−16

This diff is too big to show here.

tests/qmltests/Greeter/tst_Greeter.qml+48−5

This diff is too big to show here.

tests/qmltests/Greeter/tst_NarrowView.qml+12−1

This diff is too big to show here.

tests/qmltests/Greeter/tst_WideView.qml+11

This diff is too big to show here.

tests/qmltests/Launcher/tst_Launcher.qml+299−18

This diff is too big to show here.

tests/qmltests/Notifications/tst_Notifications.qml+53−52

This diff is too big to show here.

tests/qmltests/Notifications/tst_OptionToggle.qml+11−2

This diff is too big to show here.

tests/qmltests/Notifications/tst_SwipeToAct.qml+11−1

This diff is too big to show here.

tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+16−6

This diff is too big to show here.

tests/qmltests/Panel/IndicatorTest.qml+2−1

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+2−4

This diff is too big to show here.

tests/qmltests/Panel/tst_ActiveCallHint.qml+3−2

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorItem.qml+16−17

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorItemRow.qml+1−2

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorsMenu.qml+3−4

This diff is too big to show here.

tests/qmltests/Panel/tst_Panel.qml+4−2

This diff is too big to show here.

tests/qmltests/Stages/ApplicationCheckBox.qml+103−58

This diff is too big to show here.

tests/qmltests/Stages/RecursingChildSessionControl.qml+10−61

This diff is too big to show here.

tests/qmltests/Stages/SizeHintField.qmlnew file+33

This diff is too big to show here.

tests/qmltests/Stages/SurfaceManagerControls.qmlnew file+32

This diff is too big to show here.

qml/Tutorial/TutorialLeftFinish.qml → tests/qmltests/Stages/SurfaceManagerField.qmlrenamed+17−18

This diff is too big to show here.

tests/qmltests/Stages/tst_ApplicationWindow.qml+73−59

This diff is too big to show here.

tests/qmltests/Stages/tst_DesktopStage.qml+303−179

This diff is too big to show here.

tests/qmltests/Stages/tst_PhoneStage.qml+282−79

This diff is too big to show here.

tests/qmltests/Stages/tst_SessionContainer.qmldeleted−309

This diff is too big to show here.

tests/qmltests/Stages/tst_SpreadDelegate.qml+10−2

This diff is too big to show here.

tests/qmltests/Stages/tst_SurfaceContainer.qml+242−46

This diff is too big to show here.

tests/qmltests/Stages/tst_TabletStage.qml+409−85

This diff is too big to show here.

tests/qmltests/Stages/tst_WindowResizeArea.qml+232−30

This diff is too big to show here.

tests/qmltests/Tutorial/tst_Tutorial.qml+628−198

This diff is too big to show here.

tests/qmltests/Wizard/tst_Wizard.qml+141−213

This diff is too big to show here.

tests/qmltests/tst_DeviceConfiguration.qmlnew file+49

This diff is too big to show here.

tests/qmltests/tst_DisabledScreenNotice.qml+84−2

This diff is too big to show here.

tests/qmltests/tst_OrientedShell.qml+326−96

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+656−190

This diff is too big to show here.

tests/qmltests/tst_ShellWithPin.qml+28−40

This diff is too big to show here.

tests/utils/modules/Unity/Test/CMakeLists.txt+8−1

This diff is too big to show here.

tests/utils/modules/Unity/Test/UnityTestCase.qml+165−14

This diff is too big to show here.

tests/utils/modules/Unity/Test/plugin.cpp+13−3

This diff is too big to show here.