on 9eb391f help sign in
.bazaar/Makefilenew file+6
since splitsnapshots
unifiedsplit
@@ -0,0 +1,6 @@
1+install:
2+ mkdir -p ~/.bazaar/plugins
3+ cp plugins/* ~/.bazaar/plugins
4+
5+uninstall:
6+ rm ~/.bazaar/plugins/makecheck_unity_phablet.py*
.bazaar/plugins/makecheck_unity_phablet.pynew file+51
@@ -0,0 +1,51 @@
1+#!/usr/bin/python
2+# Copyright 2013, 2014 Canonical Ltd.
3+#
4+# This program is free software; you can redistribute it and/or modify
5+# it under the terms of the GNU 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+import os
17+import subprocess
18+from bzrlib import branch
19+from bzrlib.urlutils import local_path_from_url
20+
21+
22+def execute_makecheck(
23+ local_branch, master_branch, old_revision_number, old_revision_id,
24+ future_revision_number, future_revision_id, tree_delta, future_tree):
25+ if not master_branch.basis_tree().has_filename("qml/Shell.qml"):
26+ return
27+
28+ os.chdir(local_path_from_url(master_branch.base))
29+
30+ print "Executing 'make -C builddir test'.."
31+ os.environ['CTEST_OUTPUT_ON_FAILURE'] = "1"
32+ if (subprocess.call("make -C builddir test", shell=True) != 0):
33+
34+ print("\n\n*** Warning ***\n\n"
35+ "Basic tests failed. This commit will not pass continuous "
36+ "integration.")
37+
38+ branch = local_branch or master_branch
39+ revision = branch.repository.get_revision(future_revision_id)
40+ msg_file = open('message.txt', 'w')
41+ msg_file.write(revision.message)
42+ msg_file.close()
43+
44+ print("\n\nSaved commit message to $SRC_DIR/message.txt.")
45+ print("You can uncommit this revision, fix the tests and reuse your "
46+ "message running:\n\nbzr commit -F message.txt\n\n")
47+ elif os.path.isfile("message.txt"):
48+ os.remove("message.txt")
49+
50+branch.Branch.hooks.install_named_hook(
51+ 'pre_commit', execute_makecheck, 'make check pre-commit')
.bzr-builddeb/default.confnew file+2
@@ -0,0 +1,2 @@
1+[BUILDDEB]
2+split = True
.bzrignorenew file+7
@@ -0,0 +1,7 @@
1+# default build dir
2+/builddir
3+# QtCreator project files
4+/*.user
5+# Eclipse project files
6+.settings
7+message.txt
.gitignore−1
@@ -13,4 +13,3 @@
13/.kdev4/
13/.kdev4/
14/build/
14/build/
15/*.kdev4
15/*.kdev4
16−.clickable/
CMakeLists.txt+2−3
@@ -70,9 +70,6 @@ find_package(Qt5DBus 5.6 REQUIRED)
70find_package(Qt5Concurrent 5.6 REQUIRED)
70find_package(Qt5Concurrent 5.6 REQUIRED)
71find_package(Qt5Sql 5.6 REQUIRED)
71find_package(Qt5Sql 5.6 REQUIRED)
72find_package(Qt5Test 5.6 REQUIRED)
72find_package(Qt5Test 5.6 REQUIRED)
73−find_package(Qt5Svg 5.6 REQUIRED)
74−find_package(Qt5Network 5.6 REQUIRED)
75−find_package(Qt5Xml 5.6 REQUIRED)
76
73
77pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=27)
74pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=27)
78pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
75pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
@@ -148,6 +145,8 @@ include(autopilot)
148declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
145declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
149
146
150set(SHELL_APP unity8)
147set(SHELL_APP unity8)
148+set(DASH_APP unity8-dash)
149+set(SCOPE_TOOL unity-scope-tool)
151set(INDICATORS_CLIENT_APP indicators-client)
150set(INDICATORS_CLIENT_APP indicators-client)
152set(GREETER_APP unity8-greeter)
151set(GREETER_APP unity8-greeter)
153set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
152set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
Jenkinsfile+65−2
@@ -1,2 +1,65 @@
1−@Library('ubports-build-tools') _
1+pipeline {
2−buildAndProvideDebianPackage()
2+ agent any
3+ stages {
4+ stage('Build source') {
5+ steps {
6+ sh '/usr/bin/build-source.sh'
7+ stash(name: 'source', includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt')
8+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
9+ }
10+ }
11+ stage('Build binary - armhf') {
12+ steps {
13+ parallel(
14+ "Build binary - armhf": {
15+ node(label: 'arm64') {
16+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
17+ unstash 'source'
18+ sh '''export architecture="armhf"
19+build-binary.sh'''
20+ stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-armhf')
21+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
22+ }
23+
24+
25+ },
26+ "Build binary - arm64": {
27+ node(label: 'arm64') {
28+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
29+ unstash 'source'
30+ sh '''export architecture="arm64"
31+ build-binary.sh'''
32+ stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-arm64')
33+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
34+ }
35+ },
36+ "Build binary - amd64": {
37+ node(label: 'amd64') {
38+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
39+ unstash 'source'
40+ sh '''export architecture="amd64"
41+ build-binary.sh'''
42+ stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-amd64')
43+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
44+ }
45+ }
46+ )
47+ }
48+ }
49+ stage('Results') {
50+ steps {
51+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
52+ unstash 'build-armhf'
53+ unstash 'build-arm64'
54+ unstash 'build-amd64'
55+ archiveArtifacts(artifacts: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo', fingerprint: true, onlyIfSuccessful: true)
56+ sh '''/usr/bin/build-repo.sh'''
57+ }
58+ }
59+ stage('Cleanup') {
60+ steps {
61+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
62+ }
63+ }
64+ }
65+}
README.mddeleted−31
@@ -1,31 +0,0 @@
1−# Lomiri
2−
3−Lomiri is the operating environment for everywhere. It is able to span the gaps between touch, mouse, and keyboard; between phones, tablets, and workstations; and look good doing it.
4−
5−If you want to contribute to Lomiri on Ubuntu Touch, you've come to the right place. If you want to package Lomiri for other operating systems, you'll be better served by the main branch on the repository that we're migrating to: https://gitlab.com/ubports/core/lomiri
6−
7−Lomiri has been renamed from Unity8. Most of the software on-device in Ubuntu Touch based on Ubuntu 16.04 is still called `unity8`.
8−
9−## Where to report issues
10−
11−Issues related to the version of Lomiri that currently runs on Ubuntu Touch devices may still be reported on this repository. We will move these reports to the GitLab repository as part of our final migration.
12−
13−## Developing Lomiri on Ubuntu Touch
14−
15−This repository contains the code for Lomiri currently running on Ubuntu Touch. If you would like to modify this version of Lomiri, follow the steps below. If you would like to modify Lomiri in another operating system, check out our new repository: https://gitlab.com/ubports/core/lomiri
16−
17−Lomiri can be built and its test suite run using [`clickable`](https://clickable-ut.dev). This is a convenient method to try out most graphical changes to Lomiri without an annoying redeployment process. If you wish to test your changes on your device or make changes that are more difficult to test without real hardware, check out [Making changes and testing locally on the UBports documentation](https://docs.ubports.com/en/latest/systemdev/testing-locally.html). If not, read on.
18−
19−Before you start, [install Clickable](https://clickable-ut.dev/en/latest/install.html).
20−
21−Now, clone this repository to your computer: `git clone https://github.com/ubports/unity8.git`
22−
23−Move into this directory: `cd unity8`
24−
25−Now you can use the full suite of tools provided by this repository's [clickable.yaml](clickable.yaml). For example:
26−
27−* `clickable ide qtcreator` will open QtCreator with this repository open as a project. You can edit and build the project this way, but running the tests will be a bit difficult.
28−* `clickable build --libs --verbose` will build Lomiri in the same environment as it would receive in Ubuntu Touch.
29−* `clickable test --libs` will run the entire Lomiri test suite. This test suite includes graphical tests (which are run on a virtual, invisible desktop) and non-graphical unit tests. These tests make sure Lomiri functions as prescribed and prevents new bugs from being added. You should run them before you create a PR on this repository. This command takes about 7 minutes on an Intel i7-8550U, so plan your time accordingly and use the next two options to reduce the number of times you need to run the whole test suite...
30−* `clickable ide 'cd build/x86_64-linux-gnu/unity8/ && make tryShell'` and similar commands that replace the `Shell` with another test target defined in [tests/qmltests/CMakeLists.txt](tests/qmltests/CMakeLists.txt) allow trying out some Lomiri components in a mock environment. You can use this to try out your changes to Lomiri as you develop.
31−* `clickable ide 'cd build/x86_64-linux-gnu/unity8/ && make xvfbtestShell'` and similar commands that replace the `Shell` with another test target defined in [tests/qmltests/CMakeLists.txt](tests/qmltests/CMakeLists.txt) allow running a single TestCase. You can remove the `xvfb` part of the make target to run the test case graphically, which might help you see what is causing the test to fail.
clickable.yamldeleted−153
@@ -1,153 +0,0 @@
1−clickable_minimum_required: '7'
2−builder: custom
3−build: echo Run \'clickable build --libs --verbose\' to build && false
4−restrict_arch: amd64
5−libraries:
6− unity8:
7− builder: cmake
8− src_dir: "${ROOT}"
9− test: make xvfballtests -j${NUM_PROCS}
10− dependencies_host:
11− - android-headers
12− - cmake
13− - cmake-extras
14− - dbus-test-runner
15− - debhelper
16− - dh-apparmor
17− - doxyqml
18− - g++:native
19− - gdb
20− - graphviz
21− - gsettings-ubuntu-schemas
22− - libandroid-properties-dev
23− - libconnectivity-qt1-dev
24− - libevdev-dev
25− - libgeonames-dev
26− - libgl1-mesa-dev
27− - libgl1-mesa-dri
28− - libgles2-mesa-dev
29− - libglib2.0-dev
30− - libgnome-desktop-3-12
31− - libgnome-desktop-3-dev
32− - libgsettings-qt-dev
33− - libhardware-dev
34− - liblightdm-qt5-3-dev
35− - libpam0g-dev
36− - libpulse-dev
37− - libqmenumodel-dev
38− - libqt5sql5-sqlite
39− - libqt5svg5-dev
40− - libqt5xmlpatterns5-dev
41− - libqtdbusmock1-dev
42− - libqtdbustest1-dev
43− - libsystemsettings-dev
44− - libubuntu-app-launch2-dev
45− - libubuntu-download-manager-common-dev
46− - libubuntugestures5-dev
47− - libubuntugestures5-private-dev
48− - libudev-dev
49− - libudm-common-dev
50− - libunity-api-dev
51− - libusermetricsoutput1-dev
52− - libx11-dev
53− - libxcb1-dev
54− - libxi-dev
55− - pkg-config
56− - python3-all:any
57− - python3-setuptools:native
58− - qml-module-qt-labs-folderlistmodel
59− - qml-module-qt-labs-settings
60− - qml-module-qtmultimedia
61− - qml-module-qtqml-statemachine
62− - qml-module-qtquick-layouts
63− - qml-module-qtquick-xmllistmodel
64− - qml-module-qtquick2
65− - qml-module-qtsysteminfo
66− - qml-module-qttest
67− - qml-module-ubuntu-components
68− - qml-module-ubuntu-layouts
69− - qml-module-ubuntu-settings-components
70− - qml-module-ubuntu-test
71− - qtbase5-dev
72− - qtbase5-dev-tools
73− - qtbase5-private-dev
74− - qtdbustest-runner
75− - qtdeclarative5-dev
76− - qtdeclarative5-dev-tools
77− - qtdeclarative5-private-dev
78− - qtdeclarative5-ubuntu-content1
79− - ttf-ubuntu-font-family
80− - ubports-wallpapers
81− - xvfb
82−dependencies_target:
83− - android-headers
84− - cmake
85− - cmake-extras
86− - dbus-test-runner
87− - debhelper
88− - dh-apparmor
89− - doxyqml
90− - g++:native
91− - gdb
92− - graphviz
93− - gsettings-ubuntu-schemas
94− - libandroid-properties-dev
95− - libconnectivity-qt1-dev
96− - libevdev-dev
97− - libgeonames-dev
98− - libgl1-mesa-dev
99− - libgl1-mesa-dri
100− - libgles2-mesa-dev
101− - libglib2.0-dev
102− - libgnome-desktop-3-12
103− - libgnome-desktop-3-dev
104− - libgsettings-qt-dev
105− - libhardware-dev
106− - liblightdm-qt5-3-dev
107− - libpam0g-dev
108− - libpulse-dev
109− - libqmenumodel-dev
110− - libqt5sql5-sqlite
111− - libqt5svg5-dev
112− - libqt5xmlpatterns5-dev
113− - libqtdbusmock1-dev
114− - libqtdbustest1-dev
115− - libsystemsettings-dev
116− - libubuntu-app-launch2-dev
117− - libubuntu-download-manager-common-dev
118− - libubuntugestures5-dev
119− - libubuntugestures5-private-dev
120− - libudev-dev
121− - libudm-common-dev
122− - libunity-api-dev
123− - libusermetricsoutput1-dev
124− - libx11-dev
125− - libxcb1-dev
126− - libxi-dev
127− - pkg-config
128− - python3-all:any
129− - python3-setuptools:native
130− - qml-module-qt-labs-folderlistmodel
131− - qml-module-qt-labs-settings
132− - qml-module-qtmultimedia
133− - qml-module-qtqml-statemachine
134− - qml-module-qtquick-layouts
135− - qml-module-qtquick-xmllistmodel
136− - qml-module-qtquick2
137− - qml-module-qtsysteminfo
138− - qml-module-qttest
139− - qml-module-ubuntu-components
140− - qml-module-ubuntu-layouts
141− - qml-module-ubuntu-settings-components
142− - qml-module-ubuntu-test
143− - qtbase5-dev
144− - qtbase5-dev-tools
145− - qtbase5-private-dev
146− - qtdbustest-runner
147− - qtdeclarative5-dev
148− - qtdeclarative5-dev-tools
149− - qtdeclarative5-private-dev
150− - qtdeclarative5-ubuntu-content1
151− - ttf-ubuntu-font-family
152− - ubports-wallpapers
153− - xvfb
cmake/modules/QmlPlugins.cmakenew file+148
@@ -0,0 +1,148 @@
1+# If you need to override the qmlplugindump binary, create the qmlplugin executable
2+# target before loading this plugin.
3+
4+if(NOT TARGET qmlplugindump)
5+ find_program(qmlplugindump_exe qmlplugindump)
6+
7+ if(NOT qmlplugindump_exe)
8+ msg(FATAL_ERROR "Could not locate qmlplugindump.")
9+ endif()
10+
11+ add_executable(qmlplugindump IMPORTED)
12+ set_target_properties(qmlplugindump PROPERTIES IMPORTED_LOCATION ${qmlplugindump_exe})
13+endif()
14+
15+#
16+# A custom target for building the qmltypes files manually.
17+#
18+if (NOT TARGET qmltypes)
19+ add_custom_target(qmltypes)
20+endif()
21+
22+# Creates a target for copying resource files into build dir and optionally installing them.
23+#
24+# Files will be copied into ${BINARY_DIR}/${path} or ${CMAKE_CURRENT_BINARY_DIR} and installed
25+# into ${DESTINATION}/${path}.
26+#
27+# Resource file names are matched against {*.{qml,js,jpg,png,sci,svg},qmldir}.
28+#
29+# export_qmlfiles(plugin path
30+# [SEARCH_PATH path] # Path to search for resources in (defaults to ${CMAKE_CURRENT_SOURCE_DIR})
31+# [BINARY_DIR path]
32+# [DESTINATION path]
33+# [TARGET_PREFIX string] # Will be prefixed to the target name
34+# )
35+#
36+# Created target:
37+# - ${TARGET_PREFIX}${plugin}-qmlfiles - Copies resources into the binary dir.
38+
39+macro(export_qmlfiles PLUGIN PATH)
40+ set(single SEARCH_PATH BINARY_DIR DESTINATION TARGET_PREFIX)
41+ cmake_parse_arguments(QMLFILES "" "${single}" "" ${ARGN})
42+
43+ if(NOT QMLFILES_SEARCH_PATH)
44+ set(QMLFILES_SEARCH_PATH ${CMAKE_CURRENT_SOURCE_DIR})
45+ endif()
46+
47+ if(QMLFILES_BINARY_DIR)
48+ set(qmlfiles_dir ${QMLFILES_BINARY_DIR}/${PATH})
49+ else()
50+ set(qmlfiles_dir ${CMAKE_CURRENT_BINARY_DIR})
51+ endif()
52+
53+ file(GLOB QMLFILES
54+ ${QMLFILES_SEARCH_PATH}/*.qml
55+ ${QMLFILES_SEARCH_PATH}/*.js
56+ ${QMLFILES_SEARCH_PATH}/*.jpg
57+ ${QMLFILES_SEARCH_PATH}/*.png
58+ ${QMLFILES_SEARCH_PATH}/*.sci
59+ ${QMLFILES_SEARCH_PATH}/*.svg
60+ ${QMLFILES_SEARCH_PATH}/*.qmltypes
61+ ${QMLFILES_SEARCH_PATH}/qmldir
62+ )
63+
64+ execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${qmlfiles_dir})
65+
66+ # copy the files
67+ add_custom_target(${QMLFILES_TARGET_PREFIX}${PLUGIN}-qmlfiles ALL
68+ COMMAND cp ${QMLFILES} ${qmlfiles_dir}
69+ DEPENDS ${QMLFILES}
70+ SOURCES ${QMLFILES}
71+ )
72+
73+ if(QMLFILES_DESTINATION)
74+ # install the qmlfiles file.
75+ install(FILES ${QMLFILES}
76+ DESTINATION ${QMLFILES_DESTINATION}/${PATH}
77+ )
78+ endif()
79+endmacro()
80+
81+
82+# Creates a target for generating the typeinfo file for a QML plugin and/or installs the plugin
83+# targets.
84+#
85+# Files will be copied into ${BINARY_DIR}/${path} or ${CMAKE_CURRENT_BINARY_DIR} and installed
86+# into ${DESTINATION}/${path}. If you don't pass BINARY_DIR, it's assumed that current source
87+# path ends with ${path}.
88+#
89+# The generated file will be named after the last segment of the plugin name, e.g. Foo.qmltypes.
90+#
91+# export_qmlplugin(plugin version path
92+# [BINARY_DIR path]
93+# [DESTINATION path]
94+# [TARGET_PREFIX string] # Will be prefixed to the target name
95+# [ENVIRONMENT string] # Will be added to qmlplugindump's env
96+# [TARGETS target1 [target2 ...]] # Targets to depend on and install (e.g. the plugin shared object)
97+# [NO_TYPES] # Do not create the qmltypes target
98+# )
99+#
100+# Created target:
101+# - ${TARGET_PREFIX}${plugin}-qmltypes - Generates the qmltypes file in the source dir.
102+# It will be made a dependency of the "qmltypes" target.
103+
104+macro(export_qmlplugin PLUGIN VERSION PATH)
105+ set(options NO_TYPES)
106+ set(single BINARY_DIR DESTINATION TARGET_PREFIX ENVIRONMENT)
107+ set(multi TARGETS)
108+ cmake_parse_arguments(QMLPLUGIN "${options}" "${single}" "${multi}" ${ARGN})
109+
110+ if(QMLPLUGIN_BINARY_DIR)
111+ set(qmlplugin_dir ${QMLPLUGIN_BINARY_DIR}/${PATH})
112+ else()
113+ # Find import path to point qmlplugindump at
114+ string(REGEX REPLACE "/${PATH}$" "" QMLPLUGIN_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
115+ set(qmlplugin_dir ${CMAKE_CURRENT_BINARY_DIR})
116+ endif()
117+
118+ if(NOT QMLPLUGIN_NO_TYPES)
119+ # Relative path for the module
120+ string(REPLACE "${CMAKE_BINARY_DIR}/" "" QMLPLUGIN_MODULE_DIR "${QMLPLUGIN_BINARY_DIR}")
121+
122+ # Find the last segment of the plugin name to use as qmltypes basename
123+ string(REGEX MATCH "[^.]+$" plugin_suffix ${PLUGIN})
124+ set(target_prefix ${QMLPLUGIN_TARGET_PREFIX}${PLUGIN})
125+ set(qmltypes_path ${CMAKE_CURRENT_SOURCE_DIR}/${plugin_suffix}.qmltypes)
126+
127+ add_custom_target(${target_prefix}-qmltypes
128+ COMMAND env ${QMLPLUGIN_ENVIRONMENT} $<TARGET_FILE:qmlplugindump> -notrelocatable
129+ ${PLUGIN} ${VERSION} ${QMLPLUGIN_MODULE_DIR} > ${qmltypes_path}
130+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
131+ )
132+ add_dependencies(${target_prefix}-qmltypes ${target_prefix}-qmlfiles ${QMLPLUGIN_TARGETS})
133+ add_dependencies(qmltypes ${target_prefix}-qmltypes)
134+ endif()
135+
136+ set_target_properties(${QMLPLUGIN_TARGETS} PROPERTIES
137+ ARCHIVE_OUTPUT_DIRECTORY ${qmlplugin_dir}
138+ LIBRARY_OUTPUT_DIRECTORY ${qmlplugin_dir}
139+ RUNTIME_OUTPUT_DIRECTORY ${qmlplugin_dir}
140+ )
141+
142+ if (QMLPLUGIN_DESTINATION)
143+ # Install additional targets
144+ install(TARGETS ${QMLPLUGIN_TARGETS}
145+ DESTINATION ${QMLPLUGIN_DESTINATION}/${PATH}
146+ )
147+ endif()
148+endmacro()
cmake/modules/QmlTest.cmake+1−1
@@ -201,7 +201,7 @@ function(add_executable_test COMPONENT_NAME TARGET)
201 add_qmltest_target(xvfbtest${COMPONENT_NAME} ${TARGET}
201 add_qmltest_target(xvfbtest${COMPONENT_NAME} ${TARGET}
202 COMMAND $<TARGET_FILE:xvfb-run> --server-args "-screen 0 1024x768x24" --auto-servernum ${qmltest_command}
202 COMMAND $<TARGET_FILE:xvfb-run> --server-args "-screen 0 1024x768x24" --auto-servernum ${qmltest_command}
203 ${depends}
203 ${depends}
204− ENVIRONMENT QT_QPA_PLATFORM=xcb QML2_IMPORT_PATH=${imports} LD_PRELOAD=/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/mesa/libGL.so.1 ${QMLTEST_ENVIRONMENT}
204+ ENVIRONMENT QML2_IMPORT_PATH=${imports} LD_PRELOAD=/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/mesa/libGL.so.1 ${QMLTEST_ENVIRONMENT}
205 TARGETS ${xvfb_targets}
205 TARGETS ${xvfb_targets}
206 )
206 )
207 endif()
207 endif()
data/CMakeLists.txt+9
@@ -1,11 +1,13 @@
1# generate desktop files
1# generate desktop files
2configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
2configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
3+configure_file(${DASH_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop @ONLY)
3configure_file(${INDICATORS_CLIENT_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop @ONLY)
4configure_file(${INDICATORS_CLIENT_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop @ONLY)
4configure_file(${GREETER_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop @ONLY)
5configure_file(${GREETER_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop @ONLY)
5
6
6# install desktop files
7# install desktop files
7install(FILES
8install(FILES
8 ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
9 ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
10+ ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop
9 ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop
11 ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop
10 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
12 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
11 )
13 )
@@ -20,8 +22,15 @@ install(FILES
20 DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/lightdm.conf.d
22 DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/lightdm.conf.d
21 )
23 )
22
24
25+# install dash icon
26+install(FILES
27+ ${CMAKE_CURRENT_SOURCE_DIR}/${DASH_APP}.png
28+ DESTINATION ${SHELL_APP_DIR}/Dash/
29+ )
30+
23add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
31add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
24
32
25install(FILES com.canonical.Unity8.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
33install(FILES com.canonical.Unity8.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
26install(FILES com.canonical.Unity.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
34install(FILES com.canonical.Unity.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
35+install(FILES unity8-dash.url-dispatcher DESTINATION ${CMAKE_INSTALL_DATADIR}/url-dispatcher/urls)
27install(FILES ${CMAKE_CURRENT_BINARY_DIR}/version DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/unity8)
36install(FILES ${CMAKE_CURRENT_BINARY_DIR}/version DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/unity8)
data/com.canonical.Unity.gschema.xml+1−1
@@ -164,7 +164,7 @@
164 'appid://openstore.openstore-team/openstore/current-user-version',
164 'appid://openstore.openstore-team/openstore/current-user-version',
165 'appid://com.ubuntu.camera/camera/current-user-version',
165 'appid://com.ubuntu.camera/camera/current-user-version',
166 'appid://com.ubuntu.gallery/gallery/current-user-version',
166 'appid://com.ubuntu.gallery/gallery/current-user-version',
167− 'application:///morph-browser.desktop'
167+ 'application:///webbrowser-app.desktop'
168 ]</default>
168 ]</default>
169 <summary>List of items that should be shown by default in the launcher</summary>
169 <summary>List of items that should be shown by default in the launcher</summary>
170 <description>These items can be: application:///desktop-id.desktop or appid://package/app/current-user-version.</description>
170 <description>These items can be: application:///desktop-id.desktop or appid://package/app/current-user-version.</description>
data/com.canonical.Unity8.gschema.xml+6−1
@@ -11,7 +11,7 @@
11 <summary>The usage mode.</summary>
11 <summary>The usage mode.</summary>
12 <description>The usage mode chosen will affect the Window Management behaviour.</description>
12 <description>The usage mode chosen will affect the Window Management behaviour.</description>
13 </key>
13 </key>
14− <key type="u" name="edge-barrier-sensitivity">
14+ <key type="y" name="edge-barrier-sensitivity">
15 <default>50</default>
15 <default>50</default>
16 <range min="1" max="100"/>
16 <range min="1" max="100"/>
17 <summary>Sensitivity of screen edge barriers for the mouse pointer.</summary>
17 <summary>Sensitivity of screen edge barriers for the mouse pointer.</summary>
@@ -43,6 +43,11 @@
43 <summary>Width of the launcher in grid units.</summary>
43 <summary>Width of the launcher in grid units.</summary>
44 <description>Changes the width of the launcher in all usage modes.</description>
44 <description>Changes the width of the launcher in all usage modes.</description>
45 </key>
45 </key>
46+ <key type="b" name="enable-launcher">
47+ <default>true</default>
48+ <summary>Enable or disable the launcher</summary>
49+ <description>Toggle the availability of the launcher</description>
50+ </key>
46 <key type="b" name="enable-indicator-menu">
51 <key type="b" name="enable-indicator-menu">
47 <default>true</default>
52 <default>true</default>
48 <summary>Enable or disable the indicator pull down menus</summary>
53 <summary>Enable or disable the indicator pull down menus</summary>
data/unity8-dash.confnew file+26
@@ -0,0 +1,26 @@
1+description "Unity Shell v8 Dash"
2+author "Michael Zanetti <michael.zanetti@canonical.com>"
3+
4+emits scope-ui-starting
5+
6+start on started unity8
7+stop on stopping unity8
8+
9+kill timeout 120
10+
11+# Focused app is 100 so we want to be less likely to get
12+# killed than the focused app but more than Unity8
13+
14+## FIXME
15+#oom score 50
16+
17+respawn
18+respawn limit unlimited
19+
20+env APP_ID=unity8-dash
21+
22+pre-start script
23+ initctl emit scope-ui-starting
24+end script
25+
26+exec ${BINARY:-unity8-dash} $ARGS --desktop_file_hint=unity8-dash.desktop
data/unity8-dash.desktop.innew file+8
@@ -0,0 +1,8 @@
1+[Desktop Entry]
2+Type=Application
3+Name=Scopes
4+Comment=An interface for using the Scopes system
5+Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8-dash
6+Terminal=false
7+Icon=@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/Dash/unity8-dash.png
8+X-Ubuntu-Touch=true
data/unity8-dash.pngnew file

Binary file not shown.

data/unity8-dash.svgnew file+326
@@ -0,0 +1,326 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:xlink="http://www.w3.org/1999/xlink"
11+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13+ viewBox="0 0 512 512"
14+ style="enable-background:new"
15+ inkscape:export-ydpi="180"
16+ inkscape:export-xdpi="180"
17+ inkscape:export-filename="app_shape02.png"
18+ sodipodi:docname="apps-scope.svg"
19+ inkscape:version="0.91+devel r"
20+ version="1.1"
21+ id="svg3336"
22+ height="512"
23+ width="512">
24+ <sodipodi:namedview
25+ inkscape:snap-global="false"
26+ fit-margin-bottom="18"
27+ fit-margin-right="0"
28+ fit-margin-left="0"
29+ fit-margin-top="18"
30+ inkscape:snap-grids="true"
31+ inkscape:guide-bbox="true"
32+ showguides="false"
33+ inkscape:snap-center="true"
34+ inkscape:snap-object-midpoints="true"
35+ inkscape:snap-midpoints="true"
36+ inkscape:snap-smooth-nodes="true"
37+ inkscape:snap-intersection-paths="true"
38+ inkscape:object-nodes="true"
39+ inkscape:object-paths="true"
40+ inkscape:snap-bbox-midpoints="true"
41+ inkscape:snap-bbox-edge-midpoints="true"
42+ inkscape:bbox-nodes="true"
43+ inkscape:bbox-paths="true"
44+ inkscape:snap-bbox="true"
45+ showborder="true"
46+ inkscape:showpageshadow="false"
47+ inkscape:snap-page="true"
48+ inkscape:window-maximized="1"
49+ inkscape:window-y="24"
50+ inkscape:window-x="0"
51+ inkscape:window-height="1029"
52+ inkscape:window-width="1920"
53+ showgrid="false"
54+ inkscape:current-layer="layer3"
55+ inkscape:document-units="px"
56+ inkscape:cy="204.04409"
57+ inkscape:cx="-384.5809"
58+ inkscape:zoom="0.64"
59+ inkscape:pageshadow="2"
60+ inkscape:pageopacity="0"
61+ borderopacity="1.0"
62+ bordercolor="#666666"
63+ pagecolor="#4f4f4f"
64+ id="base">
65+ <inkscape:grid
66+ type="xygrid"
67+ id="grid811"
68+ originx="0"
69+ originy="15.999999"
70+ visible="true"
71+ enabled="true" />
72+ <sodipodi:guide
73+ orientation="1,0"
74+ position="104,176"
75+ id="guide819" />
76+ <sodipodi:guide
77+ orientation="1,0"
78+ position="120,160"
79+ id="guide821" />
80+ <sodipodi:guide
81+ orientation="1,0"
82+ position="392,144"
83+ id="guide823" />
84+ <sodipodi:guide
85+ orientation="1,0"
86+ position="408,144"
87+ id="guide825" />
88+ <sodipodi:guide
89+ orientation="0,1"
90+ position="328,408"
91+ id="guide827" />
92+ <sodipodi:guide
93+ orientation="0,1"
94+ position="336,392"
95+ id="guide829" />
96+ <sodipodi:guide
97+ orientation="0,1"
98+ position="176,120"
99+ id="guide831" />
100+ <sodipodi:guide
101+ orientation="0,1"
102+ position="216,104"
103+ id="guide833" />
104+ <inkscape:grid
105+ type="axonomgrid"
106+ id="grid835"
107+ units="px"
108+ empspacing="60"
109+ gridanglex="42.9"
110+ gridanglez="42.9"
111+ spacingy="3.522px"
112+ enabled="false"
113+ originx="0"
114+ originy="16.999996" />
115+ <sodipodi:guide
116+ orientation="0,1"
117+ position="344,376"
118+ id="guide4126" />
119+ <sodipodi:guide
120+ orientation="0,1"
121+ position="160,136"
122+ id="guide4128" />
123+ <sodipodi:guide
124+ orientation="1,0"
125+ position="136,96"
126+ id="guide4130" />
127+ <sodipodi:guide
128+ orientation="1,0"
129+ position="376,136"
130+ id="guide4134" />
131+ <sodipodi:guide
132+ orientation="-0.70710678,0.70710678"
133+ position="544,544"
134+ id="guide4136" />
135+ <sodipodi:guide
136+ orientation="1,0"
137+ position="256,-32.000001"
138+ id="guide4138" />
139+ <sodipodi:guide
140+ orientation="0,1"
141+ position="544,256"
142+ id="guide4140" />
143+ <sodipodi:guide
144+ orientation="0.70710678,0.70710678"
145+ position="544,-32.000001"
146+ id="guide4142" />
147+ <sodipodi:guide
148+ orientation="0,1"
149+ position="248,15.999999"
150+ id="guide4152" />
151+ <sodipodi:guide
152+ orientation="0,1"
153+ position="336,496"
154+ id="guide4154" />
155+ <sodipodi:guide
156+ position="344,96"
157+ orientation="1,0"
158+ id="guide4361" />
159+ <sodipodi:guide
160+ position="576,168"
161+ orientation="0,1"
162+ id="guide4363" />
163+ <sodipodi:guide
164+ position="168,192"
165+ orientation="1,0"
166+ id="guide4229" />
167+ <sodipodi:guide
168+ position="312,344"
169+ orientation="0,1"
170+ id="guide4233" />
171+ <sodipodi:guide
172+ position="180.48,-96"
173+ orientation="0,1"
174+ id="guide4235" />
175+ </sodipodi:namedview>
176+ <defs
177+ id="defs3338">
178+ <linearGradient
179+ inkscape:collect="always"
180+ id="linearGradient4203">
181+ <stop
182+ style="stop-color:#ea5420;stop-opacity:1"
183+ offset="0"
184+ id="stop4205" />
185+ <stop
186+ style="stop-color:#f37e40;stop-opacity:1"
187+ offset="1"
188+ id="stop4207" />
189+ </linearGradient>
190+ <clipPath
191+ clipPathUnits="userSpaceOnUse"
192+ id="clipPath4755">
193+ <path
194+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.24899998;fill:#5e2c73;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
195+ d="M 360,50 594,284 V 215.89844 C 594,70.73665 573.2426,50 427.94531,50 Z"
196+ id="path4757"
197+ inkscape:connector-curvature="0" />
198+ </clipPath>
199+ <clipPath
200+ clipPathUnits="userSpaceOnUse"
201+ id="clipPath4767">
202+ <path
203+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#f6f6f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
204+ d="M 543.8125,454.1875 312.18945,685.81055 367.94531,681 C 512.70468,668.50896 526.55393,654.72881 539,510.10156 Z"
205+ id="path4769"
206+ inkscape:connector-curvature="0" />
207+ </clipPath>
208+ <linearGradient
209+ inkscape:collect="always"
210+ xlink:href="#linearGradient4203"
211+ id="linearGradient4209"
212+ x1="167.5"
213+ y1="17.25"
214+ x2="343.25"
215+ y2="491"
216+ gradientUnits="userSpaceOnUse" />
217+ <filter
218+ inkscape:collect="always"
219+ style="color-interpolation-filters:sRGB"
220+ id="filter4220"
221+ x="-0.012"
222+ width="1.024"
223+ y="-0.012"
224+ height="1.024">
225+ <feGaussianBlur
226+ inkscape:collect="always"
227+ stdDeviation="1.4390401"
228+ id="feGaussianBlur4222" />
229+ </filter>
230+ <linearGradient
231+ inkscape:collect="always"
232+ xlink:href="#linearGradient4226"
233+ id="linearGradient4232"
234+ x1="255.99998"
235+ y1="-255.99998"
236+ x2="405.35773"
237+ y2="-255.99998"
238+ gradientUnits="userSpaceOnUse"
239+ spreadMethod="reflect" />
240+ <linearGradient
241+ inkscape:collect="always"
242+ id="linearGradient4226">
243+ <stop
244+ style="stop-color:#a73812;stop-opacity:1"
245+ offset="0"
246+ id="stop4228" />
247+ <stop
248+ style="stop-color:#973310;stop-opacity:0"
249+ offset="1"
250+ id="stop4230" />
251+ </linearGradient>
252+ <filter
253+ inkscape:collect="always"
254+ style="color-interpolation-filters:sRGB"
255+ id="filter4234"
256+ x="-0.096000001"
257+ width="1.192"
258+ y="-0.096000001"
259+ height="1.192">
260+ <feGaussianBlur
261+ inkscape:collect="always"
262+ stdDeviation="11.512321"
263+ id="feGaussianBlur4236" />
264+ </filter>
265+ </defs>
266+ <metadata
267+ id="metadata3341">
268+ <rdf:RDF>
269+ <cc:Work
270+ rdf:about="">
271+ <dc:format>image/svg+xml</dc:format>
272+ <dc:type
273+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
274+ <dc:title></dc:title>
275+ </cc:Work>
276+ </rdf:RDF>
277+ </metadata>
278+ <g
279+ inkscape:groupmode="layer"
280+ id="layer3"
281+ inkscape:label="Background">
282+ <path
283+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient4209);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
284+ d="M 0 0 L 0 183.89844 L 0 328.10156 L 0 512 L 512 512 L 512 328.10156 L 512 183.89844 L 512 0 L 0 0 z "
285+ id="rect4158" />
286+ <path
287+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
288+ d="M 0 256 L 0 328.10156 L 0 462.53516 C 0 479.69677 0.052846476 496.03174 0.13085938 512 L 511.86914 512 C 511.94715 496.03174 512 479.69677 512 462.53516 L 512 256 L 0 256 z "
289+ id="rect4286" />
290+ </g>
291+ <g
292+ inkscape:groupmode="layer"
293+ id="layer1"
294+ inkscape:label="Pictogram"
295+ style="display:inline"
296+ transform="translate(-32,-32)">
297+ <circle
298+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#d04616;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.99999952;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;filter:url(#filter4220);enable-background:accumulate"
299+ id="circle4218"
300+ cx="258"
301+ cy="-256"
302+ r="143.90401"
303+ transform="rotate(90,-7.1132638e-7,31.999996)" />
304+ <circle
305+ transform="rotate(90,-7.1132638e-7,31.999996)"
306+ r="143.90401"
307+ cy="-256"
308+ cx="258"
309+ id="circle4224"
310+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#linearGradient4232);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.99999952;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;filter:url(#filter4234);enable-background:accumulate" />
311+ <circle
312+ transform="rotate(90)"
313+ r="143.90401"
314+ cy="-288"
315+ cx="288"
316+ id="circle4206"
317+ style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.99999952;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
318+ <path
319+ style="display:inline;fill:#ea5420;fill-opacity:1;stroke-width:2.9398191;enable-background:new"
320+ id="path4258"
321+ d="m 193.9963,269.54024 c -10.19878,0 -18.46137,8.2634 -18.46137,18.46139 0,10.19309 8.26259,18.45568 18.46137,18.45568 10.19311,0 18.45569,-8.26259 18.45569,-18.45568 0,-10.19799 -8.26258,-18.46139 -18.45569,-18.46139 z m 131.78525,83.88906 c -8.82832,5.09898 -11.85536,16.38129 -6.75557,25.20475 5.0933,8.82834 16.37561,11.85455 25.20393,6.75556 8.82752,-5.0933 11.85457,-16.37561 6.75559,-25.20475 -5.0933,-8.82263 -16.38212,-11.84887 -25.20395,-6.75556 z m -91.69319,-65.42767 c 0,-18.24028 9.05999,-34.35498 22.92309,-44.11321 l -13.49406,-22.6012 c -16.14883,10.79461 -28.16435,27.28971 -33.15766,46.60863 5.82648,4.75434 9.55584,11.99194 9.55584,20.10497 0,8.10813 -3.72936,15.34572 -9.55584,20.10006 4.98681,19.32463 17.00232,35.82055 33.15766,46.61514 l 13.49406,-22.60689 c -13.8631,-9.75253 -22.92309,-25.86641 -22.92309,-44.1075 z m 53.91207,-53.91776 c 28.16514,0 51.27274,21.59491 53.69828,49.13495 l 26.30048,-0.38772 c -1.29405,-20.33173 -10.17604,-38.58421 -23.82372,-52.00594 -7.01814,2.65149 -15.12464,2.2459 -22.13139,-1.79314 -7.01894,-4.0504 -11.41969,-10.88319 -12.62271,-18.30044 -6.8214,-1.88254 -14.00046,-2.91323 -21.42257,-2.91323 -12.75925,0 -24.82271,2.99695 -35.53359,8.29836 l 12.82509,22.98243 c 6.89944,-3.21075 14.5963,-5.01526 22.71013,-5.01526 z m 0,107.82982 c -8.11383,0 -15.81069,-1.80533 -22.70931,-5.01528 l -12.82511,22.98163 c 10.71088,5.3079 22.77434,8.30568 35.53442,8.30568 7.42211,0 14.60118,-1.0315 21.42177,-2.91975 1.20301,-7.41724 5.60537,-14.24352 12.6227,-18.30125 7.01161,-4.04555 15.11326,-4.44382 22.13137,-1.79232 13.64769,-13.42174 22.52968,-31.67421 23.82372,-52.00595 l -26.30696,-0.38772 c -2.41986,27.54738 -25.52665,49.13496 -53.6926,49.13496 z m 37.77461,-119.35113 c 8.82834,5.09818 20.11145,2.07845 25.20475,-6.74987 5.099,-8.82833 2.07928,-20.11145 -6.74988,-25.21126 -8.82832,-5.0933 -20.11063,-2.06705 -25.21125,6.76127 -5.09247,8.82345 -2.06625,20.10657 6.75638,25.19986 z"
322+ inkscape:connector-curvature="0"
323+ inkscape:transform-center-x="16.232534"
324+ inkscape:transform-center-y="-0.0024900663" />
325+ </g>
326+</svg>
data/unity8-dash.url-dispatchernew file+6
@@ -0,0 +1,6 @@
1+[
2+ {
3+ "protocol": "scope"
4+ }
5+]
6+
data/unity8.conf−2
@@ -2,7 +2,6 @@ description "Unity Shell v8"
2author "Ricardo Mendoza <ricmm@ubuntu.com>"
2author "Ricardo Mendoza <ricmm@ubuntu.com>"
3
3
4emits indicator-services-start
4emits indicator-services-start
5−emits indicator-services-end
6
5
7start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=unity8-mir) or (xsession SESSION=unity8)) and started dbus
6start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=unity8-mir) or (xsession SESSION=unity8)) and started dbus
8stop on desktop-end
7stop on desktop-end
@@ -95,5 +94,4 @@ post-stop script
95 initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
94 initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
96 initctl unset-env --global MIR_SERVER_PROMPT_FILE
95 initctl unset-env --global MIR_SERVER_PROMPT_FILE
97 initctl emit application-end
96 initctl emit application-end
98− initctl emit indicator-services-end
99end script
97end script
debian/control+203−207
@@ -2,224 +2,226 @@ Source: unity8
2Section: x11
2Section: x11
3Priority: optional
3Priority: optional
4Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
4Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
5−Build-Depends:
5+Build-Depends: cmake,
6− android-headers,
7− cmake,
8− cmake-extras,
9− dbus-test-runner,
6+ dbus-test-runner,
10− debhelper (>= 9),
7+ debhelper (>= 9),
11− dh-apparmor,
8+ dh-apparmor,
12− doxyqml,
9+ doxyqml,
10+# To allow cross-compiling to work, we also must append :native
11+# to g++ so we don't try to run arm g++
12+# on an x86 CPU for example, when cross-compiling.
13− g++:native,
13+ g++:native,
14− gdb,
14+ gdb,
15− graphviz,
15+ graphviz,
16− gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
16+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
17− libandroid-properties-dev,
17+ libandroid-properties-dev,
18− libconnectivity-qt1-dev (>= 0.7.1),
18+ libconnectivity-qt1-dev (>= 0.7.1),
19− libevdev-dev,
19+ libevdev-dev,
20− libgeonames-dev (>= 0.2),
20+ libgeonames-dev (>= 0.2),
21+ libgnome-desktop-3-dev,
21− libgl1-mesa-dev[!arm64 !armhf] | libgl-dev[!arm64 !armhf],
22+ libgl1-mesa-dev[!arm64 !armhf] | libgl-dev[!arm64 !armhf],
22− libgl1-mesa-dri,
23+ libgl1-mesa-dri,
23− libgles2-mesa-dev[arm64 armhf],
24+ libgles2-mesa-dev[arm64 armhf],
24− libglib2.0-dev,
25+ libglib2.0-dev,
25− libgnome-desktop-3-dev,
26− libgsettings-qt-dev,
26+ libgsettings-qt-dev,
27− libhardware-dev,
27+ libhardware-dev,
28− liblightdm-qt5-3-dev,
28+ liblightdm-qt5-3-dev,
29− libpam0g-dev,
29+ libpam0g-dev,
30− libpulse-dev,
30+ libpulse-dev,
31− libqmenumodel-dev (>= 0.2.12),
31+ libqmenumodel-dev (>= 0.2.12),
32− libqt5sql5-sqlite,
32+ libqtdbusmock1-dev (>= 0.7),
33+ libqtdbustest1-dev,
33− libqt5svg5-dev,
34+ libqt5svg5-dev,
34− libqt5xmlpatterns5-dev,
35+ libqt5xmlpatterns5-dev,
35− libqtdbusmock1-dev (>= 0.7),
36− libqtdbustest1-dev,
37− libsystemsettings-dev,
36+ libsystemsettings-dev,
38− libubuntu-app-launch2-dev,
37+ libubuntu-app-launch2-dev,
39− libubuntu-download-manager-common-dev,
38+ libubuntu-download-manager-common-dev,
40− libubuntugestures5-dev (>= 1.3.2030),
39+ libubuntugestures5-dev (>= 1.3.2030),
41− libubuntugestures5-private-dev (>= 1.3.2030),
40+ libubuntugestures5-private-dev (>= 1.3.2030),
42− libudev-dev,
41+ libudev-dev,
43− libudm-common-dev,
42+ libudm-common-dev,
44− libunity-api-dev (>= 8.7),
43+ libunity-api-dev (>= 8.7),
45− libusermetricsoutput1-dev,
44+ libusermetricsoutput1-dev,
45+# Need those X11 libs touch emulation from mouse events in manual QML tests on a X11 desktop
46− libx11-dev[!arm64 !armhf],
46+ libx11-dev[!arm64 !armhf],
47− libxcb1-dev[!arm64 !armhf],
47+ libxcb1-dev[!arm64 !armhf],
48− libxi-dev[!arm64 !armhf],
48+ libxi-dev[!arm64 !armhf],
49+# End of X11 libs
49− pkg-config,
50+ pkg-config,
50− python3-all:any,
51+ python3-all:any,
51− python3-setuptools,
52+ python3-setuptools,
53+ qtdbustest-runner,
52− qml-module-qt-labs-folderlistmodel,
54+ qml-module-qt-labs-folderlistmodel,
53− qml-module-qt-labs-settings,
55+ qml-module-qt-labs-settings,
54− qml-module-qtmultimedia (>= 5.6),
55− qml-module-qtqml-statemachine,
56+ qml-module-qtqml-statemachine,
57+ qml-module-qtmultimedia (>= 5.6),
56− qml-module-qtquick-layouts,
58+ qml-module-qtquick-layouts,
57− qml-module-qtquick-xmllistmodel,
59+ qml-module-qtquick-xmllistmodel,
58− qml-module-qtquick2,
60+ qml-module-qtquick2,
59− qml-module-qtsysteminfo,
61+ qml-module-qtsysteminfo,
60− qml-module-qttest,
62+ qml-module-qttest,
61− qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
63+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
62− qml-module-ubuntu-layouts,
64+# qml-module-ubuntu-web,
63− qml-module-ubuntu-settings-components,
65+ qt5-default,
64− qml-module-ubuntu-test,
65− qtbase5-dev (>= 5.6),
66+ qtbase5-dev (>= 5.6),
66− qtbase5-dev-tools,
67+ qtbase5-dev-tools,
67− qtbase5-private-dev (>= 5.6),
68+ qtbase5-private-dev (>= 5.6),
68− qtdbustest-runner,
69− qtdeclarative5-dev (>= 5.6),
69+ qtdeclarative5-dev (>= 5.6),
70− qtdeclarative5-dev-tools,
70+ qtdeclarative5-dev-tools,
71− qtdeclarative5-private-dev (>= 5.6),
71+ qtdeclarative5-private-dev (>= 5.6),
72− qtdeclarative5-ubuntu-content1,
72+ qtdeclarative5-ubuntu-content1,
73+ qtdeclarative5-ubuntu-settings-components (>= 0.11),
73− ttf-ubuntu-font-family,
74+ ttf-ubuntu-font-family,
74− ubports-wallpapers,
75− xvfb,
75+ xvfb,
76+ android-headers,
76Standards-Version: 3.9.4
77Standards-Version: 3.9.4
77−Homepage: https://github.com/ubports/unity8
78+Homepage: http://launchpad.net/unity
78−Vcs-Git: https://github.com/ubports/unity8
79+# If you aren't a member of ~unity-team but need to upload
80+# packaging changes, just go ahead. ~unity-team will notice
81+# and sync up the code again.
82+Vcs-Bzr: https://code.launchpad.net/unity8
83+Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
79XS-Testsuite: autopkgtest
84XS-Testsuite: autopkgtest
80X-Ubuntu-Use-Langpack: yes
85X-Ubuntu-Use-Langpack: yes
81
86
82Package: indicators-client
87Package: indicators-client
83Architecture: any
88Architecture: any
84−Depends:
85− qmenumodel-qml (>= 0.2.11),
89+Depends: qmenumodel-qml (>= 0.2.11),
86− qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
90+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
87− unity8 (= ${binary:Version}),
91+ unity8 (= ${binary:Version}),
88− ${misc:Depends},
92+ ${misc:Depends},
89− ${shlibs:Depends},
93+ ${shlibs:Depends},
90Description: Indicators client test application
94Description: Indicators client test application
91 This package contains the client application for indicators used by autopilot
95 This package contains the client application for indicators used by autopilot
92
96
93Package: unity8-greeter
97Package: unity8-greeter
94Architecture: any
98Architecture: any
95−Depends:
96− unity-system-compositor,
97− unity8 (= ${binary:Version}),
99+Depends: unity8 (= ${binary:Version}),
100+ unity-system-compositor,
98− ${misc:Depends},
101+ ${misc:Depends},
99− ${shlibs:Depends},
102+ ${shlibs:Depends}
100−Recommends:
103+Recommends: lightdm
101− lightdm,
102−Provides:
103− lightdm-greeter,
104+Provides: lightdm-greeter
104Description: The Unity8 Greeter
105Description: The Unity8 Greeter
105 The Unity 8 greeter is the primary login greeter for Ubuntu devices.
106 The Unity 8 greeter is the primary login greeter for Ubuntu devices.
106
107
108+Package: unity-scope-tool
109+Architecture: any
110+Depends: unity8-common (= ${source:Version}),
111+ unity8-private (= ${binary:Version}),
112+ ${misc:Depends},
113+ ${shlibs:Depends},
114+# We do call pkg-config libunity-scopes from the code
115+ pkg-config,
116+ libunity-scopes-dev,
117+Description: Development tool for Unity scopes
118+ This package contains the development tool for new generation Unity scopes, based
119+ on Unity8.
120+
107Package: unity8
121Package: unity8
108Architecture: any
122Architecture: any
109−Provides:
110− indicator-renderer,
123+Provides: indicator-renderer,
111−Depends:
112− dmz-cursor-theme,
124+Depends: dmz-cursor-theme,
113− gsettings-desktop-schemas,
125+ gsettings-desktop-schemas,
114− libcap2-bin,
126+ libcap2-bin,
115− libglib2.0-bin,
127+ libglib2.0-bin,
116− qmenumodel-qml (>= 0.2.11),
128+ qmenumodel-qml (>= 0.2.11),
117− qml-module-biometryd,
129+ qml-module-biometryd,
118− qml-module-qt-labs-folderlistmodel,
130+ qml-module-qt-labs-folderlistmodel,
119− qml-module-qt-labs-settings,
131+ qml-module-qt-labs-settings,
120− qml-module-qtqml-statemachine,
132+ qml-module-qtqml-statemachine,
121− qml-module-qtquick-xmllistmodel,
133+ qml-module-qtquick-xmllistmodel,
122− qml-module-qtsysteminfo,
134+ qml-module-qtsysteminfo,
135+# qml-module-ubuntu-web,
123− qtdeclarative5-qtmir-plugin (>= 0.4.8),
136+ qtdeclarative5-qtmir-plugin (>= 0.4.8),
124− qtdeclarative5-ubuntu-telephony0.1,
137+ qtdeclarative5-ubuntu-telephony0.1,
125− ubuntu-system-settings (>= 0.4),
138+ ubuntu-system-settings (>= 0.4),
126− unity-launcher-impl-13,
139+ unity-launcher-impl-13,
127− unity8-common (= ${source:Version}),
140+ unity8-common (= ${source:Version}),
128− unity8-private (= ${binary:Version}),
141+ unity8-private (= ${binary:Version}),
129− unity8-private | unity-launcher-impl,
142+ unity8-private | unity-launcher-impl,
130− ${misc:Depends},
143+ ${misc:Depends},
131− ${shlibs:Depends},
144+ ${shlibs:Depends},
132−Recommends:
133− indicator-keyboard,
145+Recommends: indicator-keyboard,
134− indicator-session,
146+ indicator-session,
135− unity-greeter-session-broadcast,
147+ unity-greeter-session-broadcast,
136−Breaks:
148+Suggests: unity-scope-mediascanner2,
137− indicator-network (<< 0.5.1+14.10.20141014),
149+Breaks: indicator-network (<< 0.5.1+14.10.20141014),
150+ ubuntu-touch-session (<< 0.107),
151+ unity8-greeter (<< 7.89),
138− ubuntu-keyboard (<< 0.100),
152+ ubuntu-keyboard (<< 0.100),
139− ubuntu-touch-session (<< 0.107),
140− unity-scope-tool,
141− unity8-greeter (<< 7.89),
142−Replaces:
143− ubuntu-touch-session (<< 0.82~),
153+Replaces: ubuntu-touch-session (<< 0.82~),
144− unity-scope-tool,
145− unity8-greeter (<< 7.89),
154+ unity8-greeter (<< 7.89),
146−Conflicts:
147− ubuntu-system-settings-wizard,
155+Conflicts: ubuntu-system-settings-wizard,
148Description: Unity 8 shell
156Description: Unity 8 shell
149 The Unity 8 shell is the primary user interface for Ubuntu devices.
157 The Unity 8 shell is the primary user interface for Ubuntu devices.
150
158
151Package: unity8-common
159Package: unity8-common
152Architecture: all
160Architecture: all
153−Depends:
154− qml-module-qtquick-layouts,
161+Depends: qml-module-qtquick-layouts,
155− qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
162+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
163+ qml-module-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
156− qml-module-ubuntu-settings-components,
164+ qtdeclarative5-ubuntu-settings-components (>= 0.11),
157− qml-module-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
158− qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
165+ qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
159− qttranslations5-l10n,
166+ qttranslations5-l10n,
160− ubuntu-thumbnailer-impl-0,
167+ ubuntu-thumbnailer-impl-0,
161− unity-application-impl-27,
168+ unity-application-impl-27,
162− unity-notifications-impl-3,
169+ unity-notifications-impl-3,
170+ unity-plugin-scopes | unity-scopes-impl,
171+ unity-scopes-impl-12,
172+ unity8-tests | unity-application-impl,
163− unity8-schemas,
173+ unity8-schemas,
164− unity8-tests | unity-application-impl,
165− ${misc:Depends},
174+ ${misc:Depends},
166−Breaks:
167− unity8 (<< 7.86),
175+Breaks: unity8 (<< 7.86),
168−Replaces:
169− unity8 (<< 7.86),
176+Replaces: unity8 (<< 7.86),
170Description: Unity 8 shell (common files)
177Description: Unity 8 shell (common files)
171 The Unity 8 shell is the primary user interface for Ubuntu devices.
178 The Unity 8 shell is the primary user interface for Ubuntu devices.
172 .
179 .
173− This package contains the QML, graphics and locale files for unity8.
180+ This package contains the QML, graphics and locale files shared between
181+ unity8 and unity-scope-tool.
174
182
175Package: unity8-autopilot
183Package: unity8-autopilot
176Architecture: all
184Architecture: all
177−Depends:
178− autopilot-qt5 (>= 1.4),
185+Depends: autopilot-qt5 (>= 1.4),
179− gir1.2-glib-2.0,
186+ gir1.2-glib-2.0,
180− gir1.2-notify-0.7,
187+ gir1.2-notify-0.7,
181− libqt5test5,
188+ libqt5test5,
182− libqt5widgets5,
189+ libqt5widgets5,
183− ofono-phonesim,
190+ ofono-phonesim,
184− python3-autopilot,
191+ python3-autopilot,
185− python3-evdev,
192+ python3-evdev,
186− python3-fixtures,
193+ python3-fixtures,
187− python3-gi,
194+ python3-gi,
188− qttestability-autopilot (>= 1.4),
195+ qttestability-autopilot (>= 1.4),
189− ubuntu-ui-toolkit-autopilot (>= 1.3.2030),
196+ ubuntu-ui-toolkit-autopilot (>= 1.3.2030),
190− unity8 (= ${source:Version}),
197+ unity8 (= ${source:Version}),
191− unity8-tests (= ${source:Version}),
198+ unity8-tests (= ${source:Version}),
192− url-dispatcher-tools,
199+ url-dispatcher-tools,
193− xvfb,
200+ xvfb,
194− ${misc:Depends},
201+ ${misc:Depends},
195− ${python3:Depends},
202+ ${python3:Depends},
196Description: Test package for Unity 8 shell
203Description: Test package for Unity 8 shell
197 Autopilot tests for the unity8 package
204 Autopilot tests for the unity8 package
198
205
199Package: unity8-tests
206Package: unity8-tests
200Architecture: any
207Architecture: any
201Multi-Arch: same
208Multi-Arch: same
202−Pre-Depends:
203− ${misc:Pre-Depends},
209+Pre-Depends: ${misc:Pre-Depends},
204−Depends:
205− dbus-test-runner,
210+Depends: dbus-test-runner,
206− parallel,
211+ parallel,
212+ qtdbustest-runner,
207− qt5-default,
213+ qt5-default,
208− qtdbustest-runner,
209− qtdeclarative5-dev-tools,
214+ qtdeclarative5-dev-tools,
210− unity8 (= ${source:Version}),
215+ unity8 (= ${source:Version}),
211− xvfb,
216+ xvfb,
212− ${misc:Depends},
217+ ${misc:Depends},
213− ${shlibs:Depends},
218+ ${shlibs:Depends},
214−Provides:
215− unity-application-impl,
219+Provides: unity-application-impl,
216− unity-application-impl-27,
220+ unity-application-impl-27,
217− unity8-fake-env,
221+ unity8-fake-env,
218−Replaces:
219− unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1),
222+Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1),
220− unity8-fake-env,
223+ unity8-fake-env,
221−Conflicts:
222− unity8-fake-env,
224+Conflicts: unity8-fake-env,
223Description: Scripts and mocks for running Unity 8 shell tests
225Description: Scripts and mocks for running Unity 8 shell tests
224 Provides fake implementations of some QML modules used by Unity 8 shell
226 Provides fake implementations of some QML modules used by Unity 8 shell
225 (e.g Ubuntu.Application) so that you can run it in a sandboxed environment
227 (e.g Ubuntu.Application) so that you can run it in a sandboxed environment
@@ -228,35 +230,30 @@ Description: Scripts and mocks for running Unity 8 shell tests
228Package: unity8-private
230Package: unity8-private
229Architecture: any
231Architecture: any
230Multi-Arch: same
232Multi-Arch: same
231−Pre-Depends:
232− ${misc:Pre-Depends},
233+Pre-Depends: ${misc:Pre-Depends},
233−Depends:
234− accountsservice-ubuntu-schemas (>= 0.0.7),
234+Depends: accountsservice-ubuntu-schemas (>= 0.0.7),
235− gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
235+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
236− libhardware2,
236+ libhardware2,
237+ unity8-schemas,
238+ qtdeclarative5-gsettings1.0,
237− qml-module-qtmultimedia,
239+ qml-module-qtmultimedia,
238− qtdeclarative5-gsettings1.0,
239− unity8-schemas,
240− ${misc:Depends},
240+ ${misc:Depends},
241− ${shlibs:Depends},
241+ ${shlibs:Depends},
242−Provides:
243− unity-launcher-impl,
242+Provides: unity-launcher-impl,
244− unity-launcher-impl-13,
243+ unity-launcher-impl-13,
245Description: Unity 8 private libs
244Description: Unity 8 private libs
246 The Unity 8 shell is the primary user interface for Ubuntu devices.
245 The Unity 8 shell is the primary user interface for Ubuntu devices.
247 .
246 .
248 This package contains the private libraries for QML and other components
247 This package contains the private libraries for QML and other components
249 only used by the shell.
248 only used by the shell.
250
249
250+
251Package: unity8-schemas
251Package: unity8-schemas
252Architecture: all
252Architecture: all
253Multi-Arch: foreign
253Multi-Arch: foreign
254−Depends:
255− ${misc:Depends},
254+Depends: ${misc:Depends},
256−Replaces:
257− unity-schemas (>= 7.3.1+14.10.20140915),
255+Replaces: unity-schemas (>= 7.3.1+14.10.20140915),
258−Breaks:
259− unity-schemas (>= 7.3.1+14.10.20140915),
256+Breaks: unity-schemas (>= 7.3.1+14.10.20140915),
260Description: Unity 8 schemas
257Description: Unity 8 schemas
261 The Unity 8 shell is the primary user interface for Ubuntu devices.
258 The Unity 8 shell is the primary user interface for Ubuntu devices.
262 .
259 .
@@ -266,7 +263,6 @@ Package: unity8-doc
266Section: doc
263Section: doc
267Architecture: all
264Architecture: all
268Multi-Arch: foreign
265Multi-Arch: foreign
269−Depends:
270− ${misc:Depends},
266+Depends: ${misc:Depends},
271Description: Documentation for Unity8
267Description: Documentation for Unity8
272 The Unity 8 shell is the primary user interface for Ubuntu devices. (documentation)
268 The Unity 8 shell is the primary user interface for Ubuntu devices. (documentation)
debian/rules+5−19
@@ -7,12 +7,6 @@ include /usr/share/dpkg/default.mk
7#export DH_VERBOSE=1
7#export DH_VERBOSE=1
8export DPKG_GENSYMBOLS_CHECK_LEVEL=4
8export DPKG_GENSYMBOLS_CHECK_LEVEL=4
9export NO_PNG_PKG_MANGLE=1
9export NO_PNG_PKG_MANGLE=1
10−export QT_SELECT=qt5
11−
12−DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
13−
14−# Skip tests on the archs they are known to be flaky with current configuration
15−testskip_architectures := arm64 powerpc ppc64el s390x
16
10
17%:
11%:
18 dh $@ --parallel --fail-missing --with python3
12 dh $@ --parallel --fail-missing --with python3
@@ -24,19 +18,7 @@ override_dh_auto_configure:
24
18
25override_dh_auto_build:
19override_dh_auto_build:
26 # doc is not a default target
20 # doc is not a default target
27− dh_auto_build -- -O all doc
21+ dh_auto_build -- all doc
28−
29−override_dh_auto_test:
30− # Run the entire test battery
31− # Parallel tests have a risk of starting xvfb on the same DISPLAY multiple times,
32− # causing the whole battery to fail.
33−ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
34−ifneq (,$(filter $(DEB_HOST_ARCH),$(testskip_architectures)))
35− -dh_auto_test --no-parallel -- -O -k xvfballtests
36−else
37− dh_auto_test --no-parallel -- -O -k xvfballtests
38−endif
39−endif
40
22
41override_dh_install:
23override_dh_install:
42 # install autopilot tests
24 # install autopilot tests
@@ -47,6 +29,10 @@ override_dh_install:
47 cd $(CURDIR)
29 cd $(CURDIR)
48 dh_install -X'*.pyc' --fail-missing
30 dh_install -X'*.pyc' --fail-missing
49
31
32+override_dh_installdeb:
33+ dh_apparmor --profile-name=usr.bin.unity8-dash -punity8-dash
34+ dh_installdeb
35+
50# use private lib directories
36# use private lib directories
51override_dh_makeshlibs:
37override_dh_makeshlibs:
52 dh_makeshlibs -Nunity8-private -Nunity8-tests
38 dh_makeshlibs -Nunity8-private -Nunity8-tests
debian/tests/control+3−5
@@ -1,11 +1,9 @@
1Tests: qmluitests.sh
1Tests: qmluitests.sh
2Restrictions: allow-stderr
2Restrictions: allow-stderr
3−Depends:
3+Depends: dpkg-dev,
4− dpkg-dev,
5− unity8-tests,
4+ unity8-tests,
6
5
7Tests: autopilot.sh
6Tests: autopilot.sh
8Restrictions: allow-stderr,
7Restrictions: allow-stderr,
9 isolation-machine,
8 isolation-machine,
10−Depends:
11− unity8-autopilot,
9+Depends: unity8-autopilot,
debian/unity-scope-tool.installnew file+2
@@ -0,0 +1,2 @@
1+usr/bin/unity-scope-tool
2+usr/share/unity8/ScopeTool.qml
debian/unity8-common.install+1
@@ -1,5 +1,6 @@
1usr/share/locale
1usr/share/locale
2usr/share/unity8/Components
2usr/share/unity8/Components
3+usr/share/unity8/Dash
3usr/share/unity8/Notifications
4usr/share/unity8/Notifications
4usr/share/unity8/graphics
5usr/share/unity8/graphics
5var/lib/polkit-1/localauthority/10-vendor.d
6var/lib/polkit-1/localauthority/10-vendor.d
debian/unity8-greeter.install+1−1
@@ -1,5 +1,5 @@
1−data/unity8-greeter-init.conf usr/share/upstart/sessions/
2data/unity8-greeter-wrapper usr/bin/
1data/unity8-greeter-wrapper usr/bin/
2+data/unity8-greeter-init.conf usr/share/upstart/sessions/
3data/unity8-greeter.pkla /var/lib/polkit-1/localauthority/10-vendor.d/
3data/unity8-greeter.pkla /var/lib/polkit-1/localauthority/10-vendor.d/
4usr/share/lightdm/greeters/unity8-greeter.desktop
4usr/share/lightdm/greeters/unity8-greeter.desktop
5usr/share/lightdm/lightdm.conf.d/51-unity8-greeter.conf
5usr/share/lightdm/lightdm.conf.d/51-unity8-greeter.conf
debian/unity8-private.install+3−1
@@ -1,16 +1,18 @@
1usr/lib/*/libunity8-private.*
1usr/lib/*/libunity8-private.*
2usr/lib/*/unity8/qml/AccountsService
2usr/lib/*/unity8/qml/AccountsService
3usr/lib/*/unity8/qml/Cursor
3usr/lib/*/unity8/qml/Cursor
4+usr/lib/*/unity8/qml/Dash
4usr/lib/*/unity8/qml/GlobalShortcut
5usr/lib/*/unity8/qml/GlobalShortcut
5usr/lib/*/unity8/qml/Greeter
6usr/lib/*/unity8/qml/Greeter
7+usr/lib/*/unity8/qml/ImageCache
6usr/lib/*/unity8/qml/LightDM
8usr/lib/*/unity8/qml/LightDM
7usr/lib/*/unity8/qml/Lights
9usr/lib/*/unity8/qml/Lights
8usr/lib/*/unity8/qml/Powerd
10usr/lib/*/unity8/qml/Powerd
9usr/lib/*/unity8/qml/ScreenshotDirectory
11usr/lib/*/unity8/qml/ScreenshotDirectory
10usr/lib/*/unity8/qml/SessionBroadcast
12usr/lib/*/unity8/qml/SessionBroadcast
11−usr/lib/*/unity8/qml/UInput
12usr/lib/*/unity8/qml/Ubuntu
13usr/lib/*/unity8/qml/Ubuntu
13usr/lib/*/unity8/qml/Unity
14usr/lib/*/unity8/qml/Unity
15+usr/lib/*/unity8/qml/UInput
14usr/lib/*/unity8/qml/Utils
16usr/lib/*/unity8/qml/Utils
15usr/lib/*/unity8/qml/WindowManager
17usr/lib/*/unity8/qml/WindowManager
16usr/lib/*/unity8/qml/Wizard
18usr/lib/*/unity8/qml/Wizard
debian/unity8-tests.install+1−1
@@ -2,7 +2,7 @@ data/unity-mock-indicator-service.conf usr/share/upstart/sessions/
2usr/bin/unity-mock-indicator-service
2usr/bin/unity-mock-indicator-service
3usr/lib/*/unity8/qml/mocks
3usr/lib/*/unity8/qml/mocks
4usr/lib/*/unity8/qml/nonmirplugins
4usr/lib/*/unity8/qml/nonmirplugins
5−usr/lib/*/unity8/qml/utils
5+usr/lib/*/unity8/qml/scopefakes
6usr/lib/*/unity8/tests
6usr/lib/*/unity8/tests
7usr/lib/*/unity8/uqmlscene
7usr/lib/*/unity8/uqmlscene
8usr/share/unity8/mocks
8usr/share/unity8/mocks
debian/unity8.install+10−6
@@ -1,19 +1,23 @@
1−data/devices.conf etc/ubuntu/
1+debian/usr.bin.unity8-dash etc/apparmor.d
2−data/test.sensors etc/ubuntusensors/
2+var/lib/unity8/version
3data/unity8-filewatcher.conf usr/share/upstart/sessions/
3data/unity8-filewatcher.conf usr/share/upstart/sessions/
4data/unity8.conf usr/share/upstart/sessions/
4data/unity8.conf usr/share/upstart/sessions/
5+data/devices.conf etc/ubuntu/
6+data/test.sensors etc/ubuntusensors/
5usr/bin/unity8
7usr/bin/unity8
8+usr/bin/unity8-dash
9+usr/share/applications/unity8-dash.desktop
6usr/share/applications/unity8.desktop
10usr/share/applications/unity8.desktop
7usr/share/unity8/ApplicationMenus
11usr/share/unity8/ApplicationMenus
8−usr/share/unity8/DeviceConfiguration.qml
9−usr/share/unity8/DisabledScreenNotice.qml
10usr/share/unity8/Greeter
12usr/share/unity8/Greeter
11usr/share/unity8/Launcher
13usr/share/unity8/Launcher
12−usr/share/unity8/OrientedShell.qml
13usr/share/unity8/Panel
14usr/share/unity8/Panel
14usr/share/unity8/Rotation
15usr/share/unity8/Rotation
16+usr/share/unity8/DeviceConfiguration.qml
17+usr/share/unity8/OrientedShell.qml
18+usr/share/unity8/DisabledScreenNotice.qml
15usr/share/unity8/Shell.qml
19usr/share/unity8/Shell.qml
16usr/share/unity8/Stage
20usr/share/unity8/Stage
17usr/share/unity8/Tutorial
21usr/share/unity8/Tutorial
18usr/share/unity8/Wizard
22usr/share/unity8/Wizard
19−var/lib/unity8/version
23+usr/share/url-dispatcher/urls/unity8-dash.url-dispatcher
debian/usr.bin.unity8-dashnew file+21
@@ -0,0 +1,21 @@
1+# vim:syntax=apparmor
2+
3+#include <tunables/global>
4+
5+# v2 compatible wildly permissive profile
6+profile unity8-dash /usr/bin/unity8-dash (attach_disconnected) {
7+ capability,
8+ network,
9+ / rwkl,
10+ /** rwlkm,
11+ /** pix,
12+
13+ mount,
14+ remount,
15+ umount,
16+ pivot_root,
17+ dbus,
18+ signal,
19+ ptrace,
20+ unix,
21+}
plugins/AccountsService/AccountsService.cpp+30−1
@@ -25,6 +25,7 @@
25#include <glib.h>
25#include <glib.h>
26
26
27#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
27#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
28+#define IFACE_LOCATION_HERE QStringLiteral("com.ubuntu.location.providers.here.AccountsService")
28#define IFACE_UBUNTU_INPUT QStringLiteral("com.ubuntu.AccountsService.Input")
29#define IFACE_UBUNTU_INPUT QStringLiteral("com.ubuntu.AccountsService.Input")
29#define IFACE_UBUNTU_SECURITY QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy")
30#define IFACE_UBUNTU_SECURITY QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy")
30#define IFACE_UBUNTU_SECURITY_OLD QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy")
31#define IFACE_UBUNTU_SECURITY_OLD QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy")
@@ -32,7 +33,7 @@
32#define IFACE_UNITY_PRIVATE QStringLiteral("com.canonical.unity.AccountsService.Private")
33#define IFACE_UNITY_PRIVATE QStringLiteral("com.canonical.unity.AccountsService.Private")
33
34
34#define PROP_BACKGROUND_FILE QStringLiteral("BackgroundFile")
35#define PROP_BACKGROUND_FILE QStringLiteral("BackgroundFile")
35−#define PROP_DEMO_EDGES QStringLiteral("DemoEdges2")
36+#define PROP_DEMO_EDGES QStringLiteral("demo-edges")
36#define PROP_DEMO_EDGES_COMPLETED QStringLiteral("DemoEdgesCompleted")
37#define PROP_DEMO_EDGES_COMPLETED QStringLiteral("DemoEdgesCompleted")
37#define PROP_EMAIL QStringLiteral("Email")
38#define PROP_EMAIL QStringLiteral("Email")
38#define PROP_ENABLE_FINGERPRINT_IDENTIFICATION QStringLiteral("EnableFingerprintIdentification")
39#define PROP_ENABLE_FINGERPRINT_IDENTIFICATION QStringLiteral("EnableFingerprintIdentification")
@@ -92,6 +93,8 @@ AccountsService::AccountsService(QObject* parent, const QString &user)
92 registerProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL, QStringLiteral("emailChanged"));
93 registerProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL, QStringLiteral("emailChanged"));
93 registerProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME, QStringLiteral("realNameChanged"));
94 registerProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME, QStringLiteral("realNameChanged"));
94 registerProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES, QStringLiteral("keymapsChanged"));
95 registerProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES, QStringLiteral("keymapsChanged"));
96+ registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, QStringLiteral("hereEnabledChanged"));
97+ registerProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH, QStringLiteral("hereLicensePathChanged"));
95 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_FINGERPRINT_IDENTIFICATION, QStringLiteral("enableFingerprintIdentificationChanged"));
98 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_FINGERPRINT_IDENTIFICATION, QStringLiteral("enableFingerprintIdentificationChanged"));
96 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED, QStringLiteral("enableLauncherWhileLockedChanged"));
99 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED, QStringLiteral("enableLauncherWhileLockedChanged"));
97 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED, QStringLiteral("enableIndicatorsWhileLockedChanged"));
100 registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED, QStringLiteral("enableIndicatorsWhileLockedChanged"));
@@ -213,6 +216,32 @@ AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() cons
213 return (PasswordDisplayHint)value.toInt();
216 return (PasswordDisplayHint)value.toInt();
214}
217}
215
218
219+bool AccountsService::hereEnabled() const
220+{
221+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED);
222+ return value.toBool();
223+}
224+
225+void AccountsService::setHereEnabled(bool enabled)
226+{
227+ setProperty(IFACE_LOCATION_HERE, PROP_LICENSE_ACCEPTED, enabled);
228+}
229+
230+QString AccountsService::hereLicensePath() const
231+{
232+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH);
233+ QString hereLicensePath = value.toString();
234+ if (hereLicensePath.isEmpty() || !QFile::exists(hereLicensePath))
235+ hereLicensePath = QStringLiteral("");
236+ return hereLicensePath;
237+}
238+
239+bool AccountsService::hereLicensePathValid() const
240+{
241+ auto value = getProperty(IFACE_LOCATION_HERE, PROP_LICENSE_BASE_PATH);
242+ return !value.toString().isNull();
243+}
244+
216QString AccountsService::realName() const
245QString AccountsService::realName() const
217{
246{
218 auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME);
247 auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME);
plugins/AccountsService/AccountsService.h+16
@@ -66,6 +66,16 @@ class AccountsService: public QObject
66 READ failedFingerprintLogins
66 READ failedFingerprintLogins
67 WRITE setFailedFingerprintLogins
67 WRITE setFailedFingerprintLogins
68 NOTIFY failedFingerprintLoginsChanged)
68 NOTIFY failedFingerprintLoginsChanged)
69+ Q_PROPERTY(bool hereEnabled
70+ READ hereEnabled
71+ WRITE setHereEnabled
72+ NOTIFY hereEnabledChanged)
73+ Q_PROPERTY(QString hereLicensePath
74+ READ hereLicensePath
75+ NOTIFY hereLicensePathChanged)
76+ Q_PROPERTY(bool hereLicensePathValid // qml sees a null string as "", so we use proxy setting for that
77+ READ hereLicensePathValid
78+ NOTIFY hereLicensePathChanged)
69 Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
79 Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
70 Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
80 Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
71 Q_PROPERTY(QStringList keymaps READ keymaps WRITE setKeymaps NOTIFY keymapsChanged)
81 Q_PROPERTY(QStringList keymaps READ keymaps WRITE setKeymaps NOTIFY keymapsChanged)
@@ -96,6 +106,10 @@ public:
96 void setFailedLogins(uint failedLogins);
106 void setFailedLogins(uint failedLogins);
97 uint failedFingerprintLogins() const;
107 uint failedFingerprintLogins() const;
98 void setFailedFingerprintLogins(uint failedFingerprintLogins);
108 void setFailedFingerprintLogins(uint failedFingerprintLogins);
109+ bool hereEnabled() const;
110+ void setHereEnabled(bool enabled);
111+ QString hereLicensePath() const;
112+ bool hereLicensePathValid() const;
99 QString realName() const;
113 QString realName() const;
100 void setRealName(const QString &realName);
114 void setRealName(const QString &realName);
101 QString email() const;
115 QString email() const;
@@ -115,6 +129,8 @@ Q_SIGNALS:
115 void passwordDisplayHintChanged();
129 void passwordDisplayHintChanged();
116 void failedLoginsChanged();
130 void failedLoginsChanged();
117 void failedFingerprintLoginsChanged();
131 void failedFingerprintLoginsChanged();
132+ void hereEnabledChanged();
133+ void hereLicensePathChanged();
118 void realNameChanged();
134 void realNameChanged();
119 void emailChanged();
135 void emailChanged();
120 void keymapsChanged();
136 void keymapsChanged();
plugins/AccountsService/CMakeLists.txt+2−1
@@ -7,8 +7,9 @@ add_library(AccountsService-qml MODULE
7 plugin.cpp
7 plugin.cpp
8 )
8 )
9
9
10+qt5_use_modules(AccountsService-qml DBus Qml)
11+
10target_link_libraries(AccountsService-qml
12target_link_libraries(AccountsService-qml
11− Qt5::DBus Qt5::Qml
12 ${GLIB_LIBRARIES}
13 ${GLIB_LIBRARIES}
13 )
14 )
14
15
plugins/AccountsService/com.canonical.unity.AccountsService.xml−6
@@ -9,17 +9,11 @@
9 <annotation name="org.freedesktop.Accounts.Authentication.ChangeAny"
9 <annotation name="org.freedesktop.Accounts.Authentication.ChangeAny"
10 value="com.ubuntu.AccountsService.GreeterChangeAny"/>
10 value="com.ubuntu.AccountsService.GreeterChangeAny"/>
11
11
12− <!-- Marks that V1 (pre-8.21) edge demos have been run. Legacy value. -->
13 <!-- Should have been named DemoEdges, sorry folks. -mterry -->
12 <!-- Should have been named DemoEdges, sorry folks. -mterry -->
14 <property name="demo-edges" type="b" access="readwrite">
13 <property name="demo-edges" type="b" access="readwrite">
15 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
14 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
16 </property>
15 </property>
17
16
18− <!-- Marks that V2 (post-8.21) edge demos have been run -->
19− <property name="DemoEdges2" type="b" access="readwrite">
20− <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
21− </property>
22−
23 <!-- List of tutorial pages that have been completed by the user -->
17 <!-- List of tutorial pages that have been completed by the user -->
24 <property name="DemoEdgesCompleted" type="as" access="readwrite">
18 <property name="DemoEdgesCompleted" type="as" access="readwrite">
25 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
19 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
plugins/CMakeLists.txt+3−1
@@ -1,4 +1,4 @@
1−find_package(QmlPlugins)
1+include(QmlPlugins)
2
2
3# Set up and install a plugin for unity8.
3# Set up and install a plugin for unity8.
4#
4#
@@ -15,8 +15,10 @@ add_subdirectory(AccountsService)
15add_subdirectory(Cursor)
15add_subdirectory(Cursor)
16add_subdirectory(GlobalShortcut)
16add_subdirectory(GlobalShortcut)
17add_subdirectory(Greeter)
17add_subdirectory(Greeter)
18+add_subdirectory(ImageCache)
18add_subdirectory(LightDM)
19add_subdirectory(LightDM)
19add_subdirectory(Lights)
20add_subdirectory(Lights)
21+add_subdirectory(Dash)
20add_subdirectory(Powerd)
22add_subdirectory(Powerd)
21add_subdirectory(ScreenshotDirectory)
23add_subdirectory(ScreenshotDirectory)
22add_subdirectory(SessionBroadcast)
24add_subdirectory(SessionBroadcast)
plugins/Cursor/CMakeLists.txt+2−1
@@ -26,7 +26,8 @@ add_library(Cursor-qml SHARED
26target_link_libraries(Cursor-qml
26target_link_libraries(Cursor-qml
27 xcursorloader-static
27 xcursorloader-static
28 ${QT5PLATFORM_SUPPORT_LDFLAGS}
28 ${QT5PLATFORM_SUPPORT_LDFLAGS}
29− Qt5::Qml Qt5::Quick Qt5::Svg
30)
29)
31
30
31+qt5_use_modules(Cursor-qml Qml Quick Svg)
32+
32add_unity8_plugin(Cursor 1.1 Cursor TARGETS Cursor-qml)
33add_unity8_plugin(Cursor 1.1 Cursor TARGETS Cursor-qml)
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: theme.palette.normal.activity
53+ }
54+}
plugins/Dash/CMakeLists.txtnew file+47
@@ -0,0 +1,47 @@
1+# There's no cmake var for v8 include path :-/
2+# so create one
3+LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
4+if(${Qt5Core_VERSION_STRING} VERSION_LESS "5.1.0")
5+ SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/../QtV8/${Qt5Core_VERSION_STRING}/QtV8)
6+else()
7+ SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
8+endif()
9+
10+include_directories(
11+ ${CMAKE_CURRENT_SOURCE_DIR}
12+ ${CMAKE_CURRENT_BINARY_DIR}
13+)
14+
15+include_directories(
16+ SYSTEM
17+ ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
18+ ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
19+ ${Qt5V8_PRIVATE_INCLUDE_DIR}
20+)
21+
22+remove_definitions(-DQT_NO_KEYWORDS)
23+
24+set(QMLPLUGIN_SRC
25+ plugin.cpp
26+ listviewwithpageheader.cpp
27+ abstractdashview.cpp
28+ verticaljournal.cpp
29+ horizontaljournal.cpp
30+ organicgrid.cpp
31+ )
32+
33+add_library(Dash-qml MODULE
34+ ${QMLPLUGIN_SRC}
35+ )
36+
37+target_link_libraries(Dash-qml
38+ ${Qt5Gui_LIBRARIES}
39+ ${Qt5Quick_LIBRARIES}
40+ )
41+
42+qt5_use_modules(Dash-qml Qml Quick Concurrent)
43+
44+add_unity8_plugin(Dash 0.1 Dash TARGETS Dash-qml)
45+
46+install(FILES graphics/music_progress_bg.png DESTINATION ${SHELL_INSTALL_QML}/Dash/graphics/)
47+file(COPY graphics/music_progress_bg.png DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/graphics/)
plugins/Dash/CardAttributes.qmlnew file+71
@@ -0,0 +1,71 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+import QtQuick.Layouts 1.1
19+import Ubuntu.Components 1.3
20+
21+GridLayout {
22+ id: grid
23+ anchors {
24+ left: parent.left;
25+ right: parent.right;
26+ }
27+ columns: 2 + repeater.count % 2
28+ rowSpacing: units.gu(.5)
29+ property alias model: repeater.model
30+ property color color: theme.palette.normal.baseText
31+ property real fontScale: 1.0
32+
33+ Repeater {
34+ id: repeater
35+ delegate: Row {
36+ spacing: units.gu(0.5)
37+ readonly property int column: index % grid.columns;
38+ Layout.alignment: {
39+ if (column == 0) return Qt.AlignLeft;
40+ if (column == grid.columns - 1 || index == repeater.count - 1) return Qt.AlignRight;
41+ if (column == 1) return Qt.AlignHCenter;
42+ }
43+ Layout.column: index % grid.columns
44+ Layout.row: index / grid.columns
45+ Layout.columnSpan: index == repeater.count - 1 && grid.columns == 3 && column == 1 ? 2 : 1
46+ Layout.maximumWidth: Math.max(icon.width, label.x + label.implicitWidth)
47+ Layout.fillWidth: true
48+ height: units.gu(2)
49+ Icon {
50+ id: icon
51+ height: units.gu(2)
52+ // FIXME Workaround for bug https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1421293
53+ width: implicitWidth > 0 && implicitHeight > 0 ? (implicitWidth / implicitHeight * height) : implicitWidth
54+ source: "icon" in modelData && modelData["icon"] || ""
55+ color: grid.color
56+ }
57+ Label {
58+ id: label
59+ width: parent.width - x
60+ anchors.verticalCenter: parent.verticalCenter
61+ text: "value" in modelData && modelData["value"] || "";
62+ elide: Text.ElideRight
63+ maximumLineCount: 1
64+ font.weight: "style" in modelData && modelData["style"] === "highlighted" ? Font.Bold : Font.Light
65+ fontSize: "x-small"
66+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
67+ color: grid.color
68+ }
69+ }
70+ }
71+}
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.jsnew file+999
@@ -0,0 +1,999 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+.pragma library
18+
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
23+var kBackgroundLoaderCode = 'Loader {\n\
24+ id: backgroundLoader; \n\
25+ objectName: "backgroundLoader"; \n\
26+ anchors.fill: parent; \n\
27+ asynchronous: %3; \n\
28+ visible: status === Loader.Ready; \n\
29+ sourceComponent: UbuntuShape { \n\
30+ objectName: "background"; \n\
31+ radius: "small"; \n\
32+ aspect: { \n\
33+ switch (root.backgroundShapeStyle) { \n\
34+ case "inset": return UbuntuShape.Inset; \n\
35+ case "shadow": return UbuntuShape.DropShadow; \n\
36+ default: \n\
37+ case "flat": return UbuntuShape.Flat; \n\
38+ } \n\
39+ } \n\
40+ backgroundColor: getColor(0) || "white"; \n\
41+ secondaryBackgroundColor: getColor(1) || backgroundColor; \n\
42+ backgroundMode: UbuntuShape.VerticalGradient; \n\
43+ anchors.fill: parent; \n\
44+ source: backgroundImage.source ? backgroundImage : null; \n\
45+ property real luminance: Style.luminance(backgroundColor); \n\
46+ property Image backgroundImage: Image { \n\
47+ objectName: "backgroundImage"; \n\
48+ source: { \n\
49+ if (cardData && typeof cardData["background"] === "string") return cardData["background"]; \n\
50+ else return %4; \n\
51+ } \n\
52+ } \n\
53+ function getColor(index) { \n\
54+ if (cardData && typeof cardData["background"] === "object" \n\
55+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) { \n\
56+ return cardData["background"]["elements"][index]; \n\
57+ } else return index === 0 ? %1 : %2; \n\
58+ } \n\
59+ } \n\
60+ }\n';
61+
62+// %1 is the aspect of the UbuntuShape
63+var kArtUbuntuShapeCode = 'UbuntuShape { \n\
64+ anchors.fill: parent; \n\
65+ source: artImage; \n\
66+ sourceFillMode: UbuntuShape.PreserveAspectCrop; \n\
67+ radius: "small"; \n\
68+ aspect: %1; \n\
69+ }';
70+
71+var kArtProportionalShapeCode = 'ProportionalShape { \n\
72+ anchors.left: parent.left; \n\
73+ anchors.right: parent.right; \n\
74+ source: artImage; \n\
75+ aspect: UbuntuShape.DropShadow; \n\
76+ }';
77+
78+// %1 is used as anchors of artShapeLoader
79+// %2 is used as image width
80+// %3 is used as image height
81+// %4 is whether the image should be visible
82+// %5 is whether the loader should be asynchronous or not
83+// %6 is the shape code we want to use
84+// %7 is injected as code to artImage
85+// %8 is used as image fallback
86+var kArtShapeHolderCode = 'Loader { \n\
87+ id: artShapeLoader; \n\
88+ height: root.fixedArtShapeSize.height; \n\
89+ width: root.fixedArtShapeSize.width; \n\
90+ anchors { %1 } \n\
91+ objectName: "artShapeLoader"; \n\
92+ readonly property string cardArt: cardData && cardData["art"] || %8; \n\
93+ onCardArtChanged: { if (item) { item.image.source = cardArt; } } \n\
94+ active: cardArt != ""; \n\
95+ asynchronous: %5; \n\
96+ visible: status === Loader.Ready; \n\
97+ sourceComponent: Item { \n\
98+ id: artShape; \n\
99+ objectName: "artShape"; \n\
100+ visible: image.status === Image.Ready; \n\
101+ readonly property alias image: artImage; \n\
102+ %6 \n\
103+ width: root.fixedArtShapeSize.width; \n\
104+ height: root.fixedArtShapeSize.height; \n\
105+ CroppedImageMinimumSourceSize { \n\
106+ id: artImage; \n\
107+ objectName: "artImage"; \n\
108+ source: artShapeLoader.cardArt; \n\
109+ asynchronous: %5; \n\
110+ visible: %4; \n\
111+ width: %2; \n\
112+ height: %3; \n\
113+ %7 \n\
114+ } \n\
115+ } \n\
116+ }\n';
117+
118+// %1 is used as anchors of artShapeLoader
119+// %2 is used as image width
120+// %3 is used as image height
121+// %4 is whether the image should be visible
122+// %5 is whether the loader should be asynchronous or not
123+// %6 is the shape code we want to use
124+// %7 is injected as code to artImage
125+// %8 is used as image fallback
126+var kArtShapeHolderCodeCardToolCard = 'Loader { \n\
127+ id: artShapeLoader; \n\
128+ anchors { %1 } \n\
129+ objectName: "artShapeLoader"; \n\
130+ readonly property string cardArt: cardData && cardData["art"] || %8; \n\
131+ onCardArtChanged: { if (item) { item.image.source = cardArt; } } \n\
132+ active: cardArt != ""; \n\
133+ asynchronous: %5; \n\
134+ visible: status === Loader.Ready; \n\
135+ sourceComponent: Item { \n\
136+ id: artShape; \n\
137+ objectName: "artShape"; \n\
138+ visible: image.status === Image.Ready; \n\
139+ readonly property alias image: artImage; \n\
140+ %6 \n\
141+ width: image.status !== Image.Ready ? 0 : image.width; \n\
142+ height: image.status !== Image.Ready ? 0 : image.height; \n\
143+ CroppedImageMinimumSourceSize { \n\
144+ id: artImage; \n\
145+ objectName: "artImage"; \n\
146+ source: artShapeLoader.cardArt; \n\
147+ asynchronous: %5; \n\
148+ visible: %4; \n\
149+ width: %2; \n\
150+ height: %3; \n\
151+ %7 \n\
152+ } \n\
153+ } \n\
154+ }\n';
155+
156+// %1 is anchors.fill
157+// %2 is width
158+// %3 is height
159+// %4 is whether the icon should be asynchronous or not
160+var kAudioButtonCode = 'AbstractButton { \n\
161+ id: audioButton; \n\
162+ anchors.fill: %1; \n\
163+ width: %2; \n\
164+ height: %3; \n\
165+ readonly property url source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || ""; \n\
166+ UbuntuShape { \n\
167+ anchors.fill: parent; \n\
168+ visible: parent.pressed; \n\
169+ radius: "small"; \n\
170+ } \n\
171+ Rectangle { \n\
172+ color: Qt.rgba(0, 0, 0, 0.5); \n\
173+ anchors.centerIn: parent; \n\
174+ width: parent.width * 0.5; \n\
175+ height: width; \n\
176+ radius: width / 2; \n\
177+ } \n\
178+ Icon { \n\
179+ anchors.centerIn: parent; \n\
180+ width: parent.width * 0.3; \n\
181+ height: width; \n\
182+ opacity: 0.9; \n\
183+ name: DashAudioPlayer.playing && AudioUrlComparer.compare(parent.source, DashAudioPlayer.currentSource) ? "media-playback-pause" : "media-playback-start"; \n\
184+ color: "white"; \n\
185+ asynchronous: %4; \n\
186+ } \n\
187+ onClicked: { \n\
188+ if (AudioUrlComparer.compare(source, DashAudioPlayer.currentSource)) { \n\
189+ if (DashAudioPlayer.playing) { \n\
190+ DashAudioPlayer.pause(); \n\
191+ } else { \n\
192+ DashAudioPlayer.play(); \n\
193+ } \n\
194+ } else { \n\
195+ var playlist = (cardData["quickPreviewData"] && cardData["quickPreviewData"]["playlist"]) || null; \n\
196+ DashAudioPlayer.playSource(source, playlist); \n\
197+ } \n\
198+ } \n\
199+ onPressAndHold: { \n\
200+ root.pressAndHold(); \n\
201+ } \n\
202+ }';
203+
204+// %1 is whether the loader should be asynchronous or not
205+// %2 is the header height code
206+var kOverlayLoaderCode = 'Loader { \n\
207+ id: overlayLoader; \n\
208+ readonly property real overlayHeight: %2 + units.gu(2); \n\
209+ anchors.fill: artShapeLoader; \n\
210+ active: artShapeLoader.active && artShapeLoader.item && artShapeLoader.item.image.status === Image.Ready || false; \n\
211+ asynchronous: %1; \n\
212+ visible: showHeader && status === Loader.Ready; \n\
213+ sourceComponent: UbuntuShapeOverlay { \n\
214+ id: overlay; \n\
215+ property real luminance: Style.luminance(overlayColor); \n\
216+ aspect: UbuntuShape.Flat; \n\
217+ radius: "small"; \n\
218+ overlayColor: cardData && cardData["overlayColor"] || "#99000000"; \n\
219+ overlayRect: Qt.rect(0, 1 - overlayLoader.overlayHeight / height, 1, 1); \n\
220+ } \n\
221+ }\n';
222+
223+// multiple row version of HeaderRowCode
224+function kHeaderRowCodeGenerator() {
225+ var kHeaderRowCodeTemplate = 'Row { \n\
226+ id: row; \n\
227+ objectName: "outerRow"; \n\
228+ property real margins: units.gu(1); \n\
229+ spacing: margins; \n\
230+ %2\
231+ anchors { %1 } \n\
232+ anchors.right: parent.right; \n\
233+ anchors.margins: margins; \n\
234+ anchors.rightMargin: 0; \n\
235+ data: [ \n\
236+ %3 \n\
237+ ] \n\
238+ }\n';
239+ var args = Array.prototype.slice.call(arguments);
240+ var isCardTool = args.shift();
241+ var heightCode = isCardTool ? "" : "height: root.fixedHeaderHeight; \n";
242+ var code = kHeaderRowCodeTemplate.arg(args.shift()).arg(heightCode).arg(args.join(',\n'));
243+ return code;
244+}
245+
246+// multiple item version of kHeaderContainerCode
247+function kHeaderContainerCodeGenerator() {
248+ var headerContainerCodeTemplate = 'Item { \n\
249+ id: headerTitleContainer; \n\
250+ anchors { %1 } \n\
251+ width: parent.width - x; \n\
252+ implicitHeight: %2; \n\
253+ data: [ \n\
254+ %3 \n\
255+ ]\n\
256+ }\n';
257+ var args = Array.prototype.slice.call(arguments);
258+ var code = headerContainerCodeTemplate.arg(args.shift()).arg(args.shift()).arg(args.join(',\n'));
259+ return code;
260+}
261+
262+// %1 is used as anchors of mascotShapeLoader
263+// %2 is whether the loader should be asynchronous or not
264+var kMascotShapeLoaderCode = 'Loader { \n\
265+ id: mascotShapeLoader; \n\
266+ objectName: "mascotShapeLoader"; \n\
267+ asynchronous: %2; \n\
268+ active: mascotImage.status === Image.Ready; \n\
269+ visible: showHeader && active && status === Loader.Ready; \n\
270+ width: units.gu(6); \n\
271+ height: units.gu(5.625); \n\
272+ sourceComponent: UbuntuShape { aspect: UbuntuShape.Flat; image: mascotImage } \n\
273+ anchors { %1 } \n\
274+ }\n';
275+
276+// %1 is used as anchors of mascotImage
277+// %2 is used as visible of mascotImage
278+// %3 is injected as code to mascotImage
279+// %4 is used as fallback image
280+var kMascotImageCode = 'CroppedImageMinimumSourceSize { \n\
281+ id: mascotImage; \n\
282+ objectName: "mascotImage"; \n\
283+ anchors { %1 } \n\
284+ source: cardData && cardData["mascot"] || %4; \n\
285+ width: units.gu(6); \n\
286+ height: units.gu(5.625); \n\
287+ horizontalAlignment: Image.AlignHCenter; \n\
288+ verticalAlignment: Image.AlignVCenter; \n\
289+ visible: %2; \n\
290+ %3 \n\
291+ }\n';
292+
293+// %1 is used as anchors of titleLabel
294+// %2 is used as color of titleLabel
295+// %3 is used as extra condition for visible of titleLabel
296+// %4 is used as title width
297+// %5 is used as horizontal alignment
298+var kTitleLabelCode = 'Label { \n\
299+ id: titleLabel; \n\
300+ objectName: "titleLabel"; \n\
301+ anchors { %1 } \n\
302+ elide: Text.ElideRight; \n\
303+ fontSize: "small"; \n\
304+ wrapMode: Text.Wrap; \n\
305+ maximumLineCount: 2; \n\
306+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
307+ color: %2; \n\
308+ visible: showHeader %3; \n\
309+ width: %4; \n\
310+ text: root.title; \n\
311+ font.weight: Font.Normal; \n\
312+ horizontalAlignment: %5; \n\
313+ }\n';
314+
315+// %1 is used as extra anchors of emblemIcon
316+// %2 is used as color of emblemIcon
317+// FIXME The width code is a
318+// Workaround for bug https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1421293
319+var kEmblemIconCode = 'Icon { \n\
320+ id: emblemIcon; \n\
321+ objectName: "emblemIcon"; \n\
322+ anchors { \n\
323+ bottom: titleLabel.baseline; \n\
324+ right: parent.right; \n\
325+ %1 \n\
326+ } \n\
327+ source: cardData && cardData["emblem"] || ""; \n\
328+ color: %2; \n\
329+ height: source != "" ? titleLabel.font.pixelSize : 0; \n\
330+ width: implicitWidth > 0 && implicitHeight > 0 ? (implicitWidth / implicitHeight * height) : implicitWidth; \n\
331+ }\n';
332+
333+// %1 is used as anchors of touchdown effect
334+var kTouchdownCode = 'Loader { \n\
335+ active: root.pressed; \n\
336+ anchors { %1 } \n\
337+ sourceComponent: UbuntuShape { \n\
338+ objectName: "touchdown"; \n\
339+ anchors.fill: parent; \n\
340+ radius: "small"; \n\
341+ borderSource: "radius_pressed.sci" \n\
342+ } \n\
343+ }\n';
344+
345+// %1 is used as anchors of subtitleLabel
346+// %2 is used as color of subtitleLabel
347+var kSubtitleLabelCode = 'Label { \n\
348+ id: subtitleLabel; \n\
349+ objectName: "subtitleLabel"; \n\
350+ anchors { %1 } \n\
351+ anchors.topMargin: units.dp(2); \n\
352+ elide: Text.ElideRight; \n\
353+ maximumLineCount: 1; \n\
354+ fontSize: "x-small"; \n\
355+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale); \n\
356+ color: %2; \n\
357+ visible: titleLabel.visible && titleLabel.text; \n\
358+ text: cardData && cardData["subtitle"] || ""; \n\
359+ font.weight: Font.Light; \n\
360+ }\n';
361+
362+// %1 is used as anchors of attributesRow
363+// %2 is used as color of attributesRow
364+var kAttributesRowCode = 'CardAttributes { \n\
365+ id: attributesRow; \n\
366+ objectName: "attributesRow"; \n\
367+ anchors { %1 } \n\
368+ color: %2; \n\
369+ fontScale: root.fontScale; \n\
370+ model: cardData && cardData["attributes"]; \n\
371+ }\n';
372+
373+// %1 is used as anchors of socialActionsRow
374+// %2 is used as color of socialActionsRow
375+var kSocialActionsRowCode = 'CardSocialActions { \n\
376+ id: socialActionsRow; \n\
377+ objectName: "socialActionsRow"; \n\
378+ anchors { %1 } \n\
379+ color: %2; \n\
380+ model: cardData && cardData["socialActions"]; \n\
381+ onClicked: root.action(actionId); \n\
382+ }\n';
383+
384+// %1 is used as top anchor of summary
385+// %2 is used as topMargin anchor of summary
386+// %3 is used as color of summary
387+var kSummaryLabelCode = 'Label { \n\
388+ id: summary; \n\
389+ objectName: "summaryLabel"; \n\
390+ anchors { \n\
391+ top: %1; \n\
392+ left: parent.left; \n\
393+ right: parent.right; \n\
394+ margins: units.gu(1); \n\
395+ topMargin: %2; \n\
396+ } \n\
397+ wrapMode: Text.Wrap; \n\
398+ maximumLineCount: 5; \n\
399+ elide: Text.ElideRight; \n\
400+ text: cardData && cardData["summary"] || ""; \n\
401+ height: text ? implicitHeight : 0; \n\
402+ fontSize: "x-small"; \n\
403+ font.weight: Font.Light; \n\
404+ color: %3; \n\
405+ }\n';
406+
407+// %1 is used as bottom anchor of audio progress bar
408+// %2 is used as left anchor of audio progress bar
409+// %3 is used as text color
410+var kAudioProgressBarCode = 'CardAudioProgress { \n\
411+ id: audioProgressBar; \n\
412+ duration: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["duration"]) || 0; \n\
413+ source: (cardData["quickPreviewData"] && cardData["quickPreviewData"]["uri"]) || ""; \n\
414+ anchors { \n\
415+ bottom: %1; \n\
416+ left: %2; \n\
417+ right: parent.right; \n\
418+ margins: units.gu(1); \n\
419+ } \n\
420+ color: %3; \n\
421+ }';
422+
423+function sanitizeColor(colorString) {
424+ if (colorString !== undefined) {
425+ if (colorString.match(/^[#a-z0-9]*$/i) === null) {
426+ // This is not the perfect regexp for color
427+ // but what we're trying to do here is just protect
428+ // against injection so it's ok
429+ return "";
430+ }
431+ }
432+ return colorString;
433+}
434+
435+function cardString(template, components, isCardTool, artShapeStyle, categoryLayout) {
436+ var code;
437+
438+ var templateInteractive = (template == null ? true : (template["non-interactive"] !== undefined ? !template["non-interactive"] : true)) ? "true" : "false";
439+
440+ code = 'AbstractButton { \n\
441+ id: root; \n\
442+ property var cardData; \n\
443+ property string backgroundShapeStyle: "flat"; \n\
444+ property real fontScale: 1.0; \n\
445+ property var scopeStyle: null; \n\
446+ readonly property string title: cardData && cardData["title"] || ""; \n\
447+ property bool showHeader: true; \n\
448+ implicitWidth: childrenRect.width; \n\
449+ enabled: %1; \n\
450+ \n'.arg(templateInteractive);
451+
452+ if (!isCardTool) {
453+ code += "property int fixedHeaderHeight: -1; \n\
454+ property size fixedArtShapeSize: Qt.size(-1, -1); \n";
455+ }
456+
457+ var hasArt = components["art"] && components["art"]["field"] || false;
458+ var hasSummary = components["summary"] || false;
459+ var isConciergeMode = components["art"] && components["art"]["conciergeMode"] || false;
460+ var artAndSummary = hasArt && hasSummary && !isConciergeMode;
461+ var isHorizontal = template["card-layout"] === "horizontal";
462+ var hasBackground = (!isHorizontal && (template["card-background"] || components["background"] || artAndSummary)) ||
463+ (hasSummary && (template["card-background"] || components["background"]));
464+ var hasTitle = components["title"] || false;
465+ var hasMascot = components["mascot"] || false;
466+ var hasEmblem = components["emblem"] && !(hasMascot && template["card-size"] === "small") || false;
467+ var headerAsOverlay = hasArt && template && template["overlay"] === true && (hasTitle || hasMascot);
468+ var hasSubtitle = hasTitle && components["subtitle"] || false;
469+ var hasHeaderRow = hasMascot && hasTitle;
470+ var hasAttributes = hasTitle && components["attributes"] && components["attributes"]["field"] || false;
471+ var hasSocialActions = hasTitle && components["social-actions"] || false;
472+ var isAudio = template["quick-preview-type"] === "audio";
473+ var asynchronous = isCardTool ? "false" : "true";
474+
475+ code += 'signal action(var actionId);\n';
476+ if (isAudio) {
477+ // For now we only support audio cards with [optional] art, title, subtitle
478+ // in horizontal mode
479+ // Anything else makes it behave not like an audio card
480+ if (hasSummary) isAudio = false;
481+ if (!isHorizontal) isAudio = false;
482+ if (hasMascot) isAudio = false;
483+ if (hasEmblem) isAudio = false;
484+ if (headerAsOverlay) isAudio = false;
485+ if (hasAttributes) isAudio = false;
486+ }
487+
488+ if (hasBackground) {
489+ var templateCardBackground;
490+ if (template && typeof template["card-background"] === "string") {
491+ templateCardBackground = 'decodeURI("' + encodeURI(template["card-background"]) + '")';
492+ } else {
493+ templateCardBackground = '""';
494+ }
495+
496+ var backgroundElements0;
497+ var backgroundElements1;
498+ if (template && typeof template["card-background"] === "object" && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
499+ var element0 = sanitizeColor(template["card-background"]["elements"][0]);
500+ var element1 = sanitizeColor(template["card-background"]["elements"][1]);
501+ if (element0 !== undefined) {
502+ backgroundElements0 = '"%1"'.arg(element0);
503+ }
504+ if (element1 !== undefined) {
505+ backgroundElements1 = '"%1"'.arg(element1);
506+ }
507+ }
508+ code += kBackgroundLoaderCode.arg(backgroundElements0).arg(backgroundElements1).arg(asynchronous).arg(templateCardBackground);
509+ }
510+
511+ if (hasArt) {
512+ var artShapeAspect;
513+ if (isCardTool) {
514+ code += 'readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);\n';
515+
516+ var artShapeAspect = components["art"] && components["art"]["aspect-ratio"] || 1;
517+ if (isNaN(artShapeAspect)) {
518+ artShapeAspect = 1;
519+ }
520+ } else {
521+ artShapeAspect = "(root.fixedArtShapeSize.width / root.fixedArtShapeSize.height)";
522+ }
523+
524+ var widthCode, heightCode;
525+ var artAnchors;
526+ if (isHorizontal) {
527+ artAnchors = 'left: parent.left';
528+ if (hasMascot || hasTitle) {
529+ widthCode = 'height * ' + artShapeAspect;
530+ heightCode = 'headerHeight + 2 * units.gu(1)';
531+ } else {
532+ // This side of the else is a bit silly, who wants an horizontal layout without mascot and title?
533+ // So we define a "random" height of the image height + 2 gu for the margins
534+ widthCode = 'height * ' + artShapeAspect
535+ heightCode = 'units.gu(7.625)';
536+ }
537+ } else {
538+ artAnchors = 'horizontalCenter: parent.horizontalCenter;';
539+ widthCode = 'root.width'
540+ heightCode = 'width / ' + artShapeAspect;
541+ }
542+
543+ var fallback = !isCardTool && components["art"] && components["art"]["fallback"] || "";
544+ fallback = encodeURI(fallback);
545+ var fallbackStatusCode = "";
546+ var fallbackURICode = '""';
547+ if (fallback !== "") {
548+ // fallbackStatusCode has %8 in it because we want to substitute it for fallbackURICode
549+ // which in kArtShapeHolderCode is %8
550+ fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %8;';
551+ fallbackURICode = 'decodeURI("%1")'.arg(fallback);
552+ }
553+ var artShapeHolderShapeCode;
554+ if (!isConciergeMode) {
555+ if (artShapeStyle === "icon") {
556+ artShapeHolderShapeCode = kArtProportionalShapeCode;
557+ } else {
558+ var artShapeHolderShapeAspect;
559+ switch (artShapeStyle) {
560+ case "inset": artShapeHolderShapeAspect = "UbuntuShape.Inset"; break;
561+ case "shadow": artShapeHolderShapeAspect = "UbuntuShape.DropShadow"; break;
562+ default:
563+ case "flat": artShapeHolderShapeAspect = "UbuntuShape.Flat"; break;
564+ }
565+ artShapeHolderShapeCode = kArtUbuntuShapeCode.arg(artShapeHolderShapeAspect);
566+ }
567+ } else {
568+ artShapeHolderShapeCode = "";
569+ }
570+ var artShapeHolderCode = isCardTool ? kArtShapeHolderCodeCardToolCard : kArtShapeHolderCode;
571+ code += artShapeHolderCode.arg(artAnchors)
572+ .arg(widthCode)
573+ .arg(heightCode)
574+ .arg(isConciergeMode ? "true" : "false")
575+ .arg(asynchronous)
576+ .arg(artShapeHolderShapeCode)
577+ .arg(fallbackStatusCode)
578+ .arg(fallbackURICode);
579+ } else if (isCardTool) {
580+ code += 'readonly property size artShapeSize: Qt.size(-1, -1);\n'
581+ }
582+
583+ if (headerAsOverlay) {
584+ var headerHeightCode = isCardTool ? "headerHeight" : "root.fixedHeaderHeight";
585+ code += kOverlayLoaderCode.arg(asynchronous).arg(headerHeightCode);
586+ }
587+
588+ var headerVerticalAnchors;
589+ if (headerAsOverlay) {
590+ headerVerticalAnchors = 'bottom: artShapeLoader.bottom; \n\
591+ bottomMargin: units.gu(1);\n';
592+ } else {
593+ if (hasArt) {
594+ if (isHorizontal) {
595+ headerVerticalAnchors = 'top: artShapeLoader.top; \n\
596+ topMargin: units.gu(1);\n';
597+ } else {
598+ headerVerticalAnchors = 'top: artShapeLoader.bottom; \n\
599+ topMargin: units.gu(1);\n';
600+ }
601+ } else {
602+ headerVerticalAnchors = 'top: parent.top; \n\
603+ topMargin: units.gu(1);\n';
604+ }
605+ }
606+
607+ var headerLeftAnchor;
608+ var headerLeftAnchorHasMargin = false;
609+ if (isHorizontal && hasArt) {
610+ headerLeftAnchor = 'left: artShapeLoader.right; \n\
611+ leftMargin: units.gu(1);\n';
612+ headerLeftAnchorHasMargin = true;
613+ } else if (isHorizontal && isAudio) {
614+ headerLeftAnchor = 'left: audioButton.right; \n\
615+ leftMargin: units.gu(1);\n';
616+ headerLeftAnchorHasMargin = true;
617+ } else {
618+ headerLeftAnchor = 'left: parent.left;\n';
619+ }
620+
621+ var touchdownOnArtShape = !hasBackground && hasArt && !hasMascot && !hasSummary && !isAudio;
622+
623+ if (hasHeaderRow) {
624+ code += 'readonly property int headerHeight: row.height;\n'
625+ } else if (hasMascot) {
626+ code += 'readonly property int headerHeight: mascotImage.height;\n'
627+ } else if (hasAttributes) {
628+ if (hasTitle && hasSubtitle) {
629+ code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin + attributesRow.height + attributesRow.anchors.topMargin;\n'
630+ } else if (hasTitle) {
631+ code += 'readonly property int headerHeight: titleLabel.height + attributesRow.height + attributesRow.anchors.topMargin;\n'
632+ } else {
633+ code += 'readonly property int headerHeight: attributesRow.height;\n'
634+ }
635+ } else if (isAudio) {
636+ if (hasSubtitle) {
637+ code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin + audioProgressBar.height + audioProgressBar.anchors.topMargin;\n'
638+ } else if (hasTitle) {
639+ code += 'readonly property int headerHeight: titleLabel.height + audioProgressBar.height + audioProgressBar.anchors.topMargin;\n'
640+ } else {
641+ code += 'readonly property int headerHeight: audioProgressBar.height;\n'
642+ }
643+ } else if (hasSubtitle) {
644+ code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;\n'
645+ } else if (hasTitle) {
646+ code += 'readonly property int headerHeight: titleLabel.height;\n'
647+ } else {
648+ code += 'readonly property int headerHeight: 0;\n'
649+ }
650+
651+ var mascotShapeCode = '';
652+ var mascotCode = '';
653+ if (hasMascot) {
654+ var useMascotShape = !hasBackground && !headerAsOverlay;
655+ var mascotAnchors = '';
656+ if (!hasHeaderRow) {
657+ mascotAnchors += headerLeftAnchor;
658+ mascotAnchors += headerVerticalAnchors;
659+ if (!headerLeftAnchorHasMargin) {
660+ mascotAnchors += 'leftMargin: units.gu(1);\n'
661+ }
662+ } else {
663+ mascotAnchors = 'verticalCenter: parent.verticalCenter;'
664+ }
665+
666+ if (useMascotShape) {
667+ mascotShapeCode = kMascotShapeLoaderCode.arg(mascotAnchors).arg(asynchronous);
668+ }
669+
670+ var mascotImageVisible = useMascotShape ? 'false' : 'showHeader';
671+ var fallback = !isCardTool && components["mascot"] && components["mascot"]["fallback"] || "";
672+ fallback = encodeURI(fallback);
673+ var fallbackStatusCode = "";
674+ var fallbackURICode = '""';
675+ if (fallback !== "") {
676+ // fallbackStatusCode has %4 in it because we want to substitute it for fallbackURICode
677+ // which in kMascotImageCode is %4
678+ fallbackStatusCode += 'onStatusChanged: if (status === Image.Error) source = %4;';
679+ fallbackURICode = 'decodeURI("%1")'.arg(fallback);
680+ }
681+ mascotCode = kMascotImageCode.arg(mascotAnchors).arg(mascotImageVisible).arg(fallbackStatusCode).arg(fallbackURICode);
682+ }
683+
684+ 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")';
685+
686+ var hasTitleContainer = hasTitle && (hasEmblem || (hasMascot && (hasSubtitle || hasAttributes)));
687+ var titleSubtitleCode = '';
688+ if (hasTitle) {
689+ var titleColor;
690+ if (headerAsOverlay) {
691+ titleColor = 'root.scopeStyle && overlayLoader.item ? root.scopeStyle.getTextColor(overlayLoader.item.luminance) : (overlayLoader.item && overlayLoader.item.luminance > 0.7 ? theme.palette.normal.baseText : "white")';
692+ } else if (hasSummary) {
693+ titleColor = 'summary.color';
694+ } else if (hasBackground) {
695+ titleColor = summaryColorWithBackground;
696+ } else {
697+ titleColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
698+ }
699+
700+ var titleAnchors;
701+ var subtitleAnchors;
702+ var attributesAnchors;
703+ var titleContainerAnchors;
704+ var titleRightAnchor;
705+ var titleWidth = "undefined";
706+
707+ var extraRightAnchor = '';
708+ var extraLeftAnchor = '';
709+ if (!touchdownOnArtShape) {
710+ extraRightAnchor = 'rightMargin: units.gu(1); \n';
711+ extraLeftAnchor = 'leftMargin: units.gu(1); \n';
712+ } else if (headerAsOverlay && !hasEmblem) {
713+ extraRightAnchor = 'rightMargin: units.gu(1); \n';
714+ }
715+
716+ if (hasMascot) {
717+ titleContainerAnchors = 'verticalCenter: parent.verticalCenter; ';
718+ } else {
719+ titleContainerAnchors = 'right: parent.right; ';
720+ titleContainerAnchors += headerLeftAnchor;
721+ titleContainerAnchors += headerVerticalAnchors;
722+ if (!headerLeftAnchorHasMargin) {
723+ titleContainerAnchors += extraLeftAnchor;
724+ }
725+ }
726+ if (hasEmblem) {
727+ titleRightAnchor = 'right: emblemIcon.left; \n\
728+ rightMargin: emblemIcon.width > 0 ? units.gu(0.5) : 0; \n';
729+ } else {
730+ titleRightAnchor = 'right: parent.right; \n'
731+ titleRightAnchor += extraRightAnchor;
732+ }
733+
734+ if (hasTitleContainer) {
735+ // Using headerTitleContainer
736+ titleAnchors = titleRightAnchor;
737+ titleAnchors += 'left: parent.left; \n\
738+ top: parent.top;';
739+ subtitleAnchors = 'right: parent.right; \n\
740+ left: parent.left; \n';
741+ subtitleAnchors += extraRightAnchor;
742+ if (hasSubtitle) {
743+ attributesAnchors = subtitleAnchors + 'top: subtitleLabel.bottom;\n';
744+ subtitleAnchors += 'top: titleLabel.bottom;\n';
745+ } else {
746+ attributesAnchors = subtitleAnchors + 'top: titleLabel.bottom;\n';
747+ }
748+ } else if (hasMascot) {
749+ // Using row without titleContainer
750+ titleAnchors = 'verticalCenter: parent.verticalCenter;\n';
751+ titleWidth = "parent.width - x";
752+ } else {
753+ if (headerAsOverlay) {
754+ // Using anchors to the overlay
755+ titleAnchors = titleRightAnchor;
756+ titleAnchors += 'left: parent.left; \n\
757+ leftMargin: units.gu(1); \n\
758+ top: overlayLoader.top; \n\
759+ topMargin: units.gu(1) + overlayLoader.height - overlayLoader.overlayHeight; \n';
760+ } else {
761+ // Using anchors to the mascot/parent
762+ titleAnchors = titleRightAnchor;
763+ titleAnchors += headerLeftAnchor;
764+ titleAnchors += headerVerticalAnchors;
765+ if (!headerLeftAnchorHasMargin) {
766+ titleAnchors += extraLeftAnchor;
767+ }
768+ }
769+ subtitleAnchors = 'left: titleLabel.left; \n\
770+ leftMargin: titleLabel.leftMargin; \n';
771+ subtitleAnchors += extraRightAnchor;
772+ if (hasEmblem) {
773+ // using container
774+ subtitleAnchors += 'right: parent.right; \n';
775+ } else {
776+ subtitleAnchors += 'right: titleLabel.right; \n';
777+ }
778+
779+ if (hasSubtitle) {
780+ attributesAnchors = subtitleAnchors + 'top: subtitleLabel.bottom;\n';
781+ subtitleAnchors += 'top: titleLabel.bottom;\n';
782+ } else {
783+ attributesAnchors = subtitleAnchors + 'top: titleLabel.bottom;\n';
784+ }
785+ }
786+
787+ var titleAlignment = "Text.AlignHCenter";
788+ if (template["card-layout"] === "horizontal"
789+ || typeof components["title"] !== "object"
790+ || components["title"]["align"] === "left") titleAlignment = "Text.AlignLeft";
791+ var keys = ["mascot", "emblem", "subtitle", "attributes", "summary"];
792+ for (var key in keys) {
793+ key = keys[key];
794+ try {
795+ if (typeof components[key] === "string"
796+ || typeof components[key]["field"] === "string") titleAlignment = "Text.AlignLeft";
797+ } catch (e) {
798+ continue;
799+ }
800+ }
801+
802+ // code for different elements
803+ var titleLabelVisibleExtra = (headerAsOverlay ? '&& overlayLoader.active': '');
804+ var titleCode = kTitleLabelCode.arg(titleAnchors).arg(titleColor).arg(titleLabelVisibleExtra).arg(titleWidth).arg(titleAlignment);
805+ var subtitleCode;
806+ var attributesCode;
807+
808+ // code for the title container
809+ var containerCode = [];
810+ var containerHeight = 'titleLabel.height';
811+ containerCode.push(titleCode);
812+ if (hasSubtitle) {
813+ subtitleCode = kSubtitleLabelCode.arg(subtitleAnchors).arg(titleColor);
814+ containerCode.push(subtitleCode);
815+ containerHeight += ' + subtitleLabel.height';
816+ }
817+ if (hasEmblem) {
818+ containerCode.push(kEmblemIconCode.arg(extraRightAnchor).arg(titleColor));
819+ }
820+ if (hasAttributes) {
821+ attributesCode = kAttributesRowCode.arg(attributesAnchors).arg(titleColor);
822+ containerCode.push(attributesCode);
823+ containerHeight += ' + attributesRow.height';
824+ }
825+
826+ if (hasTitleContainer) {
827+ // use container
828+ titleSubtitleCode = kHeaderContainerCodeGenerator(titleContainerAnchors, containerHeight, containerCode);
829+ } else {
830+ // no container
831+ titleSubtitleCode = titleCode;
832+ if (hasSubtitle) {
833+ titleSubtitleCode += subtitleCode;
834+ }
835+ if (hasAttributes) {
836+ titleSubtitleCode += attributesCode;
837+ }
838+ }
839+ }
840+
841+ if (hasHeaderRow) {
842+ var rowCode = [mascotCode, titleSubtitleCode];
843+ if (mascotShapeCode != '') {
844+ rowCode.unshift(mascotShapeCode);
845+ }
846+ code += kHeaderRowCodeGenerator(isCardTool, headerVerticalAnchors + headerLeftAnchor, rowCode)
847+ } else {
848+ code += mascotShapeCode + mascotCode + titleSubtitleCode;
849+ }
850+
851+ if (isAudio) {
852+ var audioProgressBarLeftAnchor = 'audioButton.right';
853+ var audioProgressBarBottomAnchor = 'audioButton.bottom';
854+ var audioProgressBarTextColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
855+
856+ code += kAudioProgressBarCode.arg(audioProgressBarBottomAnchor)
857+ .arg(audioProgressBarLeftAnchor)
858+ .arg(audioProgressBarTextColor);
859+
860+ var audioButtonAnchorsFill;
861+ var audioButtonWidth;
862+ var audioButtonHeight;
863+ if (hasArt) {
864+ audioButtonAnchorsFill = 'artShapeLoader';
865+ audioButtonWidth = 'undefined';
866+ audioButtonHeight = 'undefined';
867+ } else {
868+ audioButtonAnchorsFill = 'undefined';
869+ audioButtonWidth = 'height';
870+ audioButtonHeight = isCardTool ? 'headerHeight + 2 * units.gu(1)'
871+ : 'root.fixedHeaderHeight + 2 * units.gu(1)';
872+ }
873+ code += kAudioButtonCode.arg(audioButtonAnchorsFill).arg(audioButtonWidth).arg(audioButtonHeight).arg(asynchronous);
874+ }
875+
876+ if (hasSummary) {
877+ var summaryTopAnchor;
878+ if (isHorizontal && hasArt) summaryTopAnchor = 'artShapeLoader.bottom';
879+ else if (headerAsOverlay && hasArt) summaryTopAnchor = 'artShapeLoader.bottom';
880+ else if (hasHeaderRow) summaryTopAnchor = 'row.bottom';
881+ else if (hasTitleContainer) summaryTopAnchor = 'headerTitleContainer.bottom';
882+ else if (hasMascot) summaryTopAnchor = 'mascotImage.bottom';
883+ else if (hasAttributes) summaryTopAnchor = 'attributesRow.bottom';
884+ else if (hasSubtitle) summaryTopAnchor = 'subtitleLabel.bottom';
885+ else if (hasTitle) summaryTopAnchor = 'titleLabel.bottom';
886+ else if (hasArt) summaryTopAnchor = 'artShapeLoader.bottom';
887+ else summaryTopAnchor = 'parent.top';
888+
889+ var summaryColor;
890+ if (hasBackground) {
891+ summaryColor = summaryColorWithBackground;
892+ } else {
893+ summaryColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
894+ }
895+
896+ var summaryTopMargin = (hasMascot || hasSubtitle || hasAttributes ? 'anchors.margins' : '0');
897+
898+ code += kSummaryLabelCode.arg(summaryTopAnchor).arg(summaryTopMargin).arg(summaryColor);
899+ }
900+
901+ if (hasSocialActions) {
902+ var socialAnchors;
903+ var socialTopAnchor;
904+
905+ if (hasSummary) socialTopAnchor = 'summary.bottom;';
906+ else if (isHorizontal && hasArt) socialTopAnchor = 'artShapeLoader.bottom;';
907+ else if (headerAsOverlay && hasArt) socialTopAnchor = 'artShapeLoader.bottom;';
908+ else if (hasHeaderRow) socialTopAnchor = 'row.bottom;';
909+ else if (hasTitleContainer) socialTopAnchor = 'headerTitleContainer.bottom;';
910+ else if (hasMascot) socialTopAnchor = 'mascotImage.bottom;';
911+ else if (hasAttributes) socialTopAnchor = 'attributesRow.bottom;';
912+ else if (hasSubtitle) socialTopAnchor = 'subtitleLabel.bottom;';
913+ else if (hasTitle) socialTopAnchor = 'titleLabel.bottom;';
914+ else if (hasArt) socialTopAnchor = 'artShapeLoader.bottom;';
915+ else socialTopAnchor = 'parent.top';
916+
917+ socialAnchors = 'top: ' + socialTopAnchor + ' left: parent.left; right: parent.right; topMargin: units.gu(1);'
918+
919+ var socialColor;
920+ if (hasBackground) {
921+ socialColor = summaryColorWithBackground;
922+ } else {
923+ socialColor = 'root.scopeStyle ? root.scopeStyle.foreground : theme.palette.normal.baseText';
924+ }
925+
926+ code += kSocialActionsRowCode.arg(socialAnchors).arg(socialColor);
927+ }
928+
929+ if (artShapeStyle != "shadow" && artShapeStyle != "icon" && !isCardTool) {
930+ var touchdownAnchors;
931+ if (hasBackground) {
932+ touchdownAnchors = 'fill: backgroundLoader';
933+ } else if (touchdownOnArtShape) {
934+ touchdownAnchors = 'fill: artShapeLoader';
935+ } else {
936+ touchdownAnchors = 'fill: root'
937+ }
938+ code += kTouchdownCode.arg(touchdownAnchors);
939+ }
940+
941+ if (isCardTool || categoryLayout !== "grid") {
942+ var implicitHeight = 'implicitHeight: ';
943+ if (hasSocialActions) {
944+ implicitHeight += 'socialActionsRow.y + socialActionsRow.height + units.gu(1);\n';
945+ } else if (hasSummary) {
946+ implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
947+ } else if (isAudio) {
948+ implicitHeight += 'audioButton.height;\n';
949+ } else if (headerAsOverlay) {
950+ implicitHeight += 'artShapeLoader.height;\n';
951+ } else if (hasHeaderRow) {
952+ implicitHeight += 'row.y + row.height + units.gu(1);\n';
953+ } else if (hasMascot) {
954+ implicitHeight += 'mascotImage.y + mascotImage.height;\n';
955+ } else if (hasTitleContainer) {
956+ implicitHeight += 'headerTitleContainer.y + headerTitleContainer.height + units.gu(1);\n';
957+ } else if (hasAttributes) {
958+ implicitHeight += 'attributesRow.y + attributesRow.height + units.gu(1);\n';
959+ } else if (hasSubtitle) {
960+ implicitHeight += 'subtitleLabel.y + subtitleLabel.height + units.gu(1);\n';
961+ } else if (hasTitle) {
962+ implicitHeight += 'titleLabel.y + titleLabel.height + units.gu(1);\n';
963+ } else if (hasArt) {
964+ implicitHeight += 'artShapeLoader.height;\n';
965+ } else {
966+ implicitHeight = '';
967+ }
968+ } else {
969+ implicitHeight = '';
970+ }
971+
972+ // Close the AbstractButton
973+ code += implicitHeight + '}\n';
974+
975+ return code;
976+}
977+
978+function createCardComponent(parent, template, components, isCardTool, artShapeStyle, categoryLayout, identifier) {
979+ var imports = 'import QtQuick 2.4; \n\
980+ import Ubuntu.Components 1.3; \n\
981+ import Ubuntu.Settings.Components 0.1; \n\
982+ import Dash 0.1;\n\
983+ import Utils 0.1;\n';
984+ var card = cardString(template, components, isCardTool, artShapeStyle, categoryLayout);
985+ var code = imports + 'Component {\n' + card + '}\n';
986+
987+ try {
988+ return Qt.createQmlObject(code, parent, identifier);
989+ } catch (e) {
990+ console.error("ERROR: Invalid component created.");
991+ console.error("Template:");
992+ console.error(JSON.stringify(template));
993+ console.error("Components:");
994+ console.error(JSON.stringify(components));
995+ console.error("Code:");
996+ console.error(code);
997+ throw e;
998+ }
999+}
plugins/Dash/CardCreatorCache.qmlnew file+40
@@ -0,0 +1,40 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+pragma Singleton
18+import QtQuick 2.4
19+import "CardCreator.js" as CardCreator
20+
21+QtObject {
22+ id: root
23+
24+ property var cache: new Object();
25+
26+ function getCardComponent(template, components, isCardTool, artShapeStyle, categoryLayout) {
27+ if (template === undefined || components === undefined)
28+ return undefined;
29+
30+ var tString = JSON.stringify(template);
31+ var cString = JSON.stringify(components);
32+ var allString = tString + cString + isCardTool + artShapeStyle + categoryLayout;
33+ var component = cache[allString];
34+ if (component === undefined) {
35+ component = CardCreator.createCardComponent(root, template, components, isCardTool, artShapeStyle, categoryLayout, allString);
36+ cache[allString] = component;
37+ }
38+ return component;
39+ }
40+}
plugins/Dash/CardSocialActions.qmlnew file+94
@@ -0,0 +1,94 @@
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 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 QtQuick.Layouts 1.1
19+import Ubuntu.Components 1.3
20+
21+Column {
22+ id: socialActions
23+ spacing: units.gu(0.5)
24+
25+ property alias model: repeater.model
26+ property color color: theme.palette.normal.baseText
27+
28+ signal clicked(var actionId)
29+
30+ Rectangle {
31+ id: divider
32+ visible: repeater.count > 0
33+ anchors {
34+ left: parent.left;
35+ right: parent.right;
36+ leftMargin:units.dp(1);
37+ rightMargin: units.dp(1);
38+ }
39+ color: Qt.darker(theme.palette.normal.background, 1.12)
40+ height: visible ? units.dp(1) : 0
41+ }
42+
43+ Row {
44+ id: row
45+ anchors {
46+ left: parent.left
47+ right: parent.right
48+ leftMargin: units.gu(1)
49+ rightMargin: units.gu(1)
50+ }
51+ spacing: units.gu(2)
52+ readonly property int visibleItems: {
53+ if (width <= units.gu(12)) // small card
54+ return 2;
55+ else if (width <= units.gu(21)) // medium card
56+ return 3;
57+ else // large or horizontal card
58+ return 4;
59+ }
60+
61+ Repeater {
62+ id: repeater
63+ delegate: Loader {
64+ height: units.gu(2)
65+ active: index < row.visibleItems
66+ sourceComponent: AbstractButton {
67+ objectName: "delegate" + index
68+ height: units.gu(2)
69+ width: icon.width
70+ Icon {
71+ id: icon
72+ objectName: "icon"
73+
74+ readonly property url urlIcon: modelData && modelData["icon"] || ""
75+ readonly property url urlTemporaryIcon: "temporaryIcon" in modelData && modelData["temporaryIcon"] || ""
76+
77+ height: units.gu(2)
78+ // FIXME Workaround for bug https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1421293
79+ width: implicitWidth > 0 && implicitHeight > 0 ? (implicitWidth / implicitHeight * height) : implicitWidth
80+ source: urlIcon
81+ color: socialActions.color
82+
83+ onUrlIconChanged: {
84+ if (urlIcon) source = urlIcon
85+ }
86+ }
87+
88+ onClicked: socialActions.clicked(modelData["id"]);
89+ onPressedChanged: if (pressed && icon.urlTemporaryIcon != "") icon.source = icon.urlTemporaryIcon
90+ }
91+ }
92+ }
93+ }
94+}
plugins/Dash/CroppedImageMinimumSourceSize.qmlnew file+38
@@ -0,0 +1,38 @@
1+/*
2+ * Copyright (C) 2014, 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+
19+Image {
20+ id: root
21+
22+ fillMode: Image.PreserveAspectCrop
23+
24+ property bool useHeight: false
25+ function updateUseHeight()
26+ {
27+ // Do not turn into a binding since otherwise the qml
28+ // engine complains about binding loops
29+ useHeight = (implicitWidth / implicitHeight) > (width / height);
30+ }
31+
32+ onHeightChanged: updateUseHeight();
33+ onWidthChanged: updateUseHeight();
34+ onImplicitHeightChanged: updateUseHeight();
35+ onImplicitWidthChanged: updateUseHeight();
36+
37+ sourceSize: useHeight ? Qt.size(0, height) : Qt.size(width, 0)
38+}
plugins/Dash/DashAudioPlayer.qmlnew file+120
@@ -0,0 +1,120 @@
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+ id: root
24+ readonly property real progress: priv.audio ? priv.audio.position / priv.audio.duration : 0.0
25+ readonly property bool playing: priv.audio ? priv.audio.playbackState === Audio.PlayingState : false
26+ readonly property bool paused: priv.audio ? priv.audio.playbackState === Audio.PausedState : false
27+ readonly property bool stopped: priv.audio ? priv.audio.playbackState === Audio.StoppedState : true
28+ readonly property int position: priv.audio ? priv.audio.position : 0
29+ readonly property url currentSource: priv.audio ? priv.audio.playlist.currentItemSource : ""
30+ readonly property Playlist playlist: priv.audio ? priv.audio.playlist : null
31+
32+ function playSource(newSource, newPlaylist) {
33+ if (!priv.audio) {
34+ console.info("DashAudioPlayer: creating player");
35+ priv.audio = priv.audioComponent.createObject(root);
36+ }
37+ stop();
38+ priv.audio.playlist.clear();
39+ if (newPlaylist) {
40+ // Look for newSource in newPlaylist
41+ var sourceIndex = -1;
42+ for (var i in newPlaylist) {
43+ if (AudioUrlComparer.compare(newSource, newPlaylist[i])) {
44+ sourceIndex = i;
45+ break;
46+ }
47+ }
48+ var urls = [];
49+ if (sourceIndex === -1 && newSource != "") {
50+ // If the playing song is not in the playlist, add it
51+ urls.push(newSource);
52+ sourceIndex = 0;
53+ }
54+ for (var i in newPlaylist) {
55+ urls.push(newPlaylist[i]);
56+ }
57+ priv.audio.playlist.addItems(urls);
58+ priv.audio.playlist.currentIndex = sourceIndex;
59+ } else {
60+ priv.audio.playlist.addItem(newSource);
61+ priv.audio.playlist.currentIndex = 0;
62+ }
63+ play();
64+ }
65+
66+ function stop() {
67+ if (priv.audio) {
68+ priv.audio.stop();
69+ }
70+ }
71+
72+ function play() {
73+ if (priv.audio) {
74+ priv.audio.play();
75+ }
76+ }
77+
78+ function pause() {
79+ if (priv.audio) {
80+ priv.audio.pause();
81+ }
82+ }
83+
84+ property QtObject priv: QtObject {
85+ id: priv
86+ property Audio audio: null
87+ property Component audioComponent: Component {
88+ Audio {
89+ playlist: Playlist {
90+ objectName: "playlist"
91+ }
92+ /* Remove player in case of error so it gets recreated next time
93+ * we need it. Happens if backend media player restarted, for
94+ * instance. qtmultimedia should probably handle this
95+ * transparently (LP: #1616425).
96+ */
97+ onError: {
98+ console.warn("DashAudioPlayer: error event (" +
99+ priv.audio.errorString + "), destroying");
100+ priv.audio.destroy();
101+ }
102+ }
103+ }
104+ }
105+
106+ function lengthToString(s) {
107+ if (typeof(s) !== "number" || s < 0) return "";
108+
109+ var sec = "" + s % 60;
110+ if (sec.length == 1) sec = "0" + sec;
111+ var hour = Math.floor(s / 3600);
112+ if (hour < 1) {
113+ return Math.floor(s / 60) + ":" + sec;
114+ } else {
115+ var min = "" + Math.floor(s / 60) % 60;
116+ if (min.length == 1) min = "0" + min;
117+ return hour + ":" + min + ":" + sec;
118+ }
119+ }
120+}
plugins/Dash/ScopeStyle.qmlnew file+102
@@ -0,0 +1,102 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+import Utils 0.1
19+import GSettings 1.0
20+import Ubuntu.Components 1.3
21+import Ubuntu.Components.Themes 1.3
22+
23+/*! \brief Helper for processing scope customization options.
24+
25+ It will take the customizations object passed by the scope and
26+ process it to provide the scope UI with data such as colors or
27+ image paths.
28+ */
29+
30+QtObject {
31+
32+ property var gsettings: GSettings {
33+ schema.id: "com.ubuntu.touch.system-settings"
34+ }
35+
36+ /// Style object passed from the scope
37+ property var style: Object()
38+
39+ /// Color used for text and symbolic icons
40+ property color foreground: gsettings.dashBackground ? "white" : ("foreground-color" in style ? style["foreground-color"] : d.defaultDark)
41+
42+ /// Luminance of the foreground color
43+ readonly property real foregroundLuminance: foreground ? Style.luminance(foreground) : Style.luminance(d.defaultDark)
44+
45+ /// Color used for the overall background
46+ property color background: "background-color" in style ? style["background-color"] : gsettings.dashBackground ? "transparent" : "#00f5f5f5"
47+
48+ /// Luminance of the background color
49+ readonly property real backgroundLuminance: background ? Style.luminance(background) : Style.luminance(d.defaultLight)
50+
51+ /*! \brief Get the most contrasting available color based on luminance
52+ *
53+ * If background color is transparent, theme provided colors are taken into account
54+ */
55+ function getTextColor(luminance) {
56+ if (Math.abs(foregroundLuminance - luminance) >
57+ Math.abs(d.opaqueBackgroundLuminance - luminance)) {
58+ return foreground;
59+ } else {
60+ return d.opaqueBackground;
61+ }
62+ }
63+
64+ /// Source of the logo image for the header
65+ readonly property url headerLogo: "logo" in d.headerStyle ? d.headerStyle["logo"] : ""
66+
67+ /// Background style for the header
68+ property url headerBackground: "background" in d.headerStyle ? d.headerStyle["background"] : gsettings.dashBackground ? "color:///transparent" : "color:///#ffffff"
69+
70+ /// Foreground color for the header
71+ property color headerForeground: "foreground-color" in d.headerStyle ? d.headerStyle["foreground-color"] : gsettings.dashBackground ? "white" : foreground
72+
73+ /// Color of the header divider
74+ property color headerDividerColor: "divider-color" in d.headerStyle ? d.headerStyle["divider-color"] : gsettings.dashBackground ? "transparent" : "#e0e0e0"
75+
76+ /// Background style for the navigation
77+ property url navigationBackground: "navigation-background" in d.headerStyle ? d.headerStyle["navigation-background"] : gsettings.dashBackground ? "color:///white" : "color:///#f5f5f5"
78+
79+ /// Color of the primary preview button
80+ readonly property color previewButtonColor: "preview-button-color" in style ? style["preview-button-color"] : theme.palette.normal.positive
81+
82+ //! @cond
83+ property var d: QtObject {
84+ // FIXME: should be taken from the theme
85+ readonly property color defaultLight: "white"
86+ readonly property color defaultDark: UbuntuColors.darkGrey
87+ readonly property real defaultLightLuminance: Style.luminance(defaultLight)
88+ readonly property real defaultDarkLuminance: Style.luminance(defaultDark)
89+
90+ readonly property color opaqueBackground: {
91+ background.a > 0 ?
92+ background :
93+ (Math.abs(foregroundLuminance - defaultLightLuminance) >
94+ Math.abs(foregroundLuminance - defaultDarkLuminance)) ?
95+ defaultLight : defaultDark
96+ }
97+ readonly property real opaqueBackgroundLuminance: Style.luminance(opaqueBackground)
98+
99+ readonly property var headerStyle: "page-header" in style ? style["page-header"] : { }
100+ }
101+ //! @endcond
102+}
plugins/Dash/abstractdashview.cppnew file+359
@@ -0,0 +1,359 @@
1+/*
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "abstractdashview.h"
18+
19+#include <private/qquickitem_p.h>
20+
21+AbstractDashView::AbstractDashView()
22+ : m_delegateModel(nullptr)
23+ , m_asyncRequestedIndex(-1)
24+ , m_columnSpacing(0)
25+ , m_rowSpacing(0)
26+ , m_buffer(320) // Same value as QML_VIEW_DEFAULTCACHEBUFFER in qquickitemview.cpp (Qt 5.6)
27+ , m_displayMarginBeginning(0)
28+ , m_displayMarginEnd(0)
29+ , m_needsRelayout(false)
30+ , m_delegateValidated(false)
31+ , m_implicitHeightDirty(false)
32+{
33+ connect(this, &AbstractDashView::widthChanged, this, &AbstractDashView::relayout);
34+ connect(this, &AbstractDashView::heightChanged, this, &AbstractDashView::onHeightChanged);
35+}
36+
37+QAbstractItemModel *AbstractDashView::model() const
38+{
39+ return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
40+}
41+
42+void AbstractDashView::setModel(QAbstractItemModel *model)
43+{
44+ if (model != this->model()) {
45+ if (!m_delegateModel) {
46+ createDelegateModel();
47+ } else {
48+ disconnect(m_delegateModel, &QQmlDelegateModel::modelUpdated, this, &AbstractDashView::onModelUpdated);
49+ }
50+ m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
51+ connect(m_delegateModel, &QQmlDelegateModel::modelUpdated, this, &AbstractDashView::onModelUpdated);
52+
53+ cleanupExistingItems();
54+
55+ Q_EMIT modelChanged();
56+ polish();
57+ }
58+}
59+
60+QQmlComponent *AbstractDashView::delegate() const
61+{
62+ return m_delegateModel ? m_delegateModel->delegate() : nullptr;
63+}
64+
65+void AbstractDashView::setDelegate(QQmlComponent *delegate)
66+{
67+ if (delegate != this->delegate()) {
68+ if (!m_delegateModel) {
69+ createDelegateModel();
70+ }
71+
72+ cleanupExistingItems();
73+
74+ m_delegateModel->setDelegate(delegate);
75+
76+ Q_EMIT delegateChanged();
77+ m_delegateValidated = false;
78+ polish();
79+ }
80+}
81+
82+qreal AbstractDashView::columnSpacing() const
83+{
84+ return m_columnSpacing;
85+}
86+
87+void AbstractDashView::setColumnSpacing(qreal columnSpacing)
88+{
89+ if (columnSpacing != m_columnSpacing) {
90+ m_columnSpacing = columnSpacing;
91+ Q_EMIT columnSpacingChanged();
92+
93+ if (isComponentComplete()) {
94+ relayout();
95+ }
96+ }
97+}
98+
99+qreal AbstractDashView::rowSpacing() const
100+{
101+ return m_rowSpacing;
102+}
103+
104+void AbstractDashView::setRowSpacing(qreal rowSpacing)
105+{
106+ if (rowSpacing != m_rowSpacing) {
107+ m_rowSpacing = rowSpacing;
108+ Q_EMIT rowSpacingChanged();
109+
110+ if (isComponentComplete()) {
111+ relayout();
112+ }
113+ }
114+}
115+
116+int AbstractDashView::cacheBuffer() const
117+{
118+ return m_buffer;
119+}
120+
121+void AbstractDashView::setCacheBuffer(int buffer)
122+{
123+ if (buffer < 0) {
124+ qmlInfo(this) << "Cannot set a negative cache buffer";
125+ return;
126+ }
127+
128+ if (m_buffer != buffer) {
129+ m_buffer = buffer;
130+ if (isComponentComplete()) {
131+ polish();
132+ }
133+ emit cacheBufferChanged();
134+ }
135+}
136+
137+qreal AbstractDashView::displayMarginBeginning() const
138+{
139+ return m_displayMarginBeginning;
140+}
141+
142+void AbstractDashView::setDisplayMarginBeginning(qreal begin)
143+{
144+ if (m_displayMarginBeginning == begin)
145+ return;
146+ m_displayMarginBeginning = begin;
147+ if (isComponentComplete()) {
148+ polish();
149+ }
150+ emit displayMarginBeginningChanged();
151+}
152+
153+qreal AbstractDashView::displayMarginEnd() const
154+{
155+ return m_displayMarginEnd;
156+}
157+
158+void AbstractDashView::setDisplayMarginEnd(qreal end)
159+{
160+ if (m_displayMarginEnd == end)
161+ return;
162+ m_displayMarginEnd = end;
163+ if (isComponentComplete()) {
164+ polish();
165+ }
166+ emit displayMarginEndChanged();
167+}
168+
169+void AbstractDashView::createDelegateModel()
170+{
171+ m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
172+ connect(m_delegateModel, &QQmlDelegateModel::createdItem, this, &AbstractDashView::itemCreated);
173+ if (isComponentComplete())
174+ m_delegateModel->componentComplete();
175+}
176+
177+void AbstractDashView::refill()
178+{
179+ if (!isComponentComplete() || height() < 0) {
180+ return;
181+ }
182+
183+ const qreal from = -m_displayMarginBeginning;
184+ const qreal to = height() + m_displayMarginEnd;
185+ const qreal bufferFrom = from - m_buffer;
186+ const qreal bufferTo = to + m_buffer;
187+
188+ bool added = addVisibleItems(from, to, false);
189+ bool removed = removeNonVisibleItems(bufferFrom, bufferTo);
190+ added |= addVisibleItems(bufferFrom, bufferTo, true);
191+
192+ if (added || removed) {
193+ m_implicitHeightDirty = true;
194+ polish();
195+ }
196+}
197+
198+bool AbstractDashView::addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous)
199+{
200+ if (fillToY <= fillFromY)
201+ return false;
202+
203+ if (!delegate())
204+ return false;
205+
206+ if (m_delegateModel->count() == 0)
207+ return false;
208+
209+ int modelIndex;
210+ qreal yPos;
211+ findBottomModelIndexToAdd(&modelIndex, &yPos);
212+ bool changed = false;
213+ while (modelIndex < m_delegateModel->count() && yPos <= fillToY) {
214+ if (!createItem(modelIndex, asynchronous))
215+ break;
216+
217+ changed = true;
218+ findBottomModelIndexToAdd(&modelIndex, &yPos);
219+ }
220+
221+ findTopModelIndexToAdd(&modelIndex, &yPos);
222+ while (modelIndex >= 0 && yPos > fillFromY) {
223+ if (!createItem(modelIndex, asynchronous))
224+ break;
225+
226+ changed = true;
227+ findTopModelIndexToAdd(&modelIndex, &yPos);
228+ }
229+
230+ return changed;
231+}
232+
233+QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
234+{
235+ if (asynchronous && m_asyncRequestedIndex != -1)
236+ return nullptr;
237+
238+ m_asyncRequestedIndex = -1;
239+ QObject* object = m_delegateModel->object(modelIndex, asynchronous ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested);
240+ QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
241+ if (!item) {
242+ if (object) {
243+ m_delegateModel->release(object);
244+ if (!m_delegateValidated) {
245+ m_delegateValidated = true;
246+ QObject* delegateObj = delegate();
247+ qmlInfo(delegateObj ? delegateObj : this) << "Delegate must be of Item type";
248+ }
249+ } else {
250+ m_asyncRequestedIndex = modelIndex;
251+ }
252+ return nullptr;
253+ } else {
254+ QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
255+ addItemToView(modelIndex, item);
256+ return item;
257+ }
258+}
259+
260+void AbstractDashView::releaseItem(QQuickItem *item)
261+{
262+ QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
263+ QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
264+ if (flags & QQmlDelegateModel::Destroyed) {
265+ item->setParentItem(nullptr);
266+ }
267+}
268+
269+void AbstractDashView::setImplicitHeightDirty()
270+{
271+ m_implicitHeightDirty = true;
272+}
273+
274+void AbstractDashView::itemCreated(int modelIndex, QObject *object)
275+{
276+ QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
277+ if (!item) {
278+ qWarning() << "AbstractDashView::itemCreated got a non item for index" << modelIndex;
279+ return;
280+ }
281+ item->setParentItem(this);
282+
283+ // We only need to call createItem if we are here because of an asynchronous generation
284+ // otherwise we are in this slot because createItem is creating the item sync
285+ // and thus we don't need to call createItem again, nor need to set m_implicitHeightDirty
286+ // and call polish because the sync createItem was called from addVisibleItems that
287+ // is called from refill that will already do those if an item was added
288+ if (modelIndex == m_asyncRequestedIndex) {
289+ createItem(modelIndex, false);
290+ m_implicitHeightDirty = true;
291+ polish();
292+ }
293+}
294+
295+void AbstractDashView::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
296+{
297+ if (reset) {
298+ cleanupExistingItems();
299+ } else {
300+ processModelRemoves(changeSet.removes());
301+
302+ // The current AbstractDashViews do not support insertions that are not at the end
303+ // so reset if that happens
304+ Q_FOREACH(const QQmlChangeSet::Change insert, changeSet.inserts()) {
305+ if (insert.index < m_delegateModel->count() - 1) {
306+ cleanupExistingItems();
307+ break;
308+ }
309+ }
310+ }
311+ polish();
312+}
313+
314+
315+void AbstractDashView::relayout()
316+{
317+ m_needsRelayout = true;
318+ polish();
319+}
320+
321+void AbstractDashView::onHeightChanged()
322+{
323+ polish();
324+}
325+
326+void AbstractDashView::updatePolish()
327+{
328+ if (!model())
329+ return;
330+
331+ if (m_needsRelayout) {
332+ doRelayout();
333+ m_needsRelayout = false;
334+ m_implicitHeightDirty = true;
335+ }
336+
337+ refill();
338+
339+ const qreal from = -m_displayMarginBeginning;
340+ const qreal to = height() + m_displayMarginEnd;
341+ updateItemCulling(from, to);
342+
343+ if (m_implicitHeightDirty) {
344+ calculateImplicitHeight();
345+ m_implicitHeightDirty = false;
346+ }
347+}
348+
349+void AbstractDashView::componentComplete()
350+{
351+ if (m_delegateModel)
352+ m_delegateModel->componentComplete();
353+
354+ QQuickItem::componentComplete();
355+
356+ m_needsRelayout = true;
357+
358+ polish();
359+}
plugins/Dash/abstractdashview.hnew file+128
@@ -0,0 +1,128 @@
1+/*
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef ABSTRACTDASHVIEW_H
18+#define ABSTRACTDASHVIEW_H
19+
20+#include <QQuickItem>
21+
22+class QAbstractItemModel;
23+class QQmlComponent;
24+
25+#include <private/qqmldelegatemodel_p.h>
26+#include <private/qquickitemchangelistener_p.h>
27+#include <qqmlinfo.h>
28+
29+class AbstractDashView : public QQuickItem, public QQuickItemChangeListener
30+{
31+ Q_OBJECT
32+
33+ Q_PROPERTY(QAbstractItemModel *model READ model WRITE setModel NOTIFY modelChanged)
34+ Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
35+ Q_PROPERTY(qreal columnSpacing READ columnSpacing WRITE setColumnSpacing NOTIFY columnSpacingChanged)
36+ Q_PROPERTY(qreal rowSpacing READ rowSpacing WRITE setRowSpacing NOTIFY rowSpacingChanged)
37+ Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
38+ Q_PROPERTY(qreal displayMarginBeginning READ displayMarginBeginning
39+ WRITE setDisplayMarginBeginning
40+ NOTIFY displayMarginBeginningChanged)
41+ Q_PROPERTY(qreal displayMarginEnd READ displayMarginEnd
42+ WRITE setDisplayMarginEnd
43+ NOTIFY displayMarginEndChanged)
44+
45+friend class VerticalJournalTest;
46+friend class HorizontalJournalTest;
47+friend class OrganicGridTest;
48+
49+public:
50+ AbstractDashView();
51+
52+ QAbstractItemModel *model() const;
53+ void setModel(QAbstractItemModel *model);
54+
55+ QQmlComponent *delegate() const;
56+ void setDelegate(QQmlComponent *delegate);
57+
58+ qreal columnSpacing() const;
59+ void setColumnSpacing(qreal columnSpacing);
60+
61+ qreal rowSpacing() const;
62+ void setRowSpacing(qreal rowSpacing);
63+
64+ int cacheBuffer() const;
65+ void setCacheBuffer(int);
66+
67+ qreal displayMarginBeginning() const;
68+ void setDisplayMarginBeginning(qreal);
69+
70+ qreal displayMarginEnd() const;
71+ void setDisplayMarginEnd(qreal);
72+
73+Q_SIGNALS:
74+ void modelChanged();
75+ void delegateChanged();
76+ void columnSpacingChanged();
77+ void rowSpacingChanged();
78+ void cacheBufferChanged();
79+ void displayMarginBeginningChanged();
80+ void displayMarginEndChanged();
81+
82+protected Q_SLOTS:
83+ void relayout();
84+
85+protected:
86+ void updatePolish() override;
87+ void componentComplete() override;
88+
89+ void releaseItem(QQuickItem *item);
90+ void setImplicitHeightDirty();
91+
92+private Q_SLOTS:
93+ void itemCreated(int modelIndex, QObject *object);
94+ void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
95+ void onHeightChanged();
96+
97+private:
98+ void createDelegateModel();
99+ void refill();
100+ bool addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous);
101+ QQuickItem *createItem(int modelIndex, bool asynchronous);
102+
103+ virtual void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
104+ virtual void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
105+ virtual void addItemToView(int modelIndex, QQuickItem *item) = 0;
106+ virtual bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) = 0;
107+ virtual void cleanupExistingItems() = 0;
108+ virtual void doRelayout() = 0;
109+ virtual void updateItemCulling(qreal visibleFromY, qreal visibleToY) = 0;
110+ virtual void calculateImplicitHeight() = 0;
111+ virtual void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) = 0;
112+
113+ QQmlDelegateModel *m_delegateModel;
114+
115+ // Index we are waiting because we requested it asynchronously
116+ int m_asyncRequestedIndex;
117+
118+ int m_columnSpacing;
119+ int m_rowSpacing;
120+ int m_buffer;
121+ qreal m_displayMarginBeginning;
122+ qreal m_displayMarginEnd;
123+ bool m_needsRelayout;
124+ bool m_delegateValidated;
125+ bool m_implicitHeightDirty;
126+};
127+
128+#endif
plugins/Dash/graphics/music_progress_bg.pngnew file

Binary file not shown.

plugins/Dash/horizontaljournal.cppnew file+239
@@ -0,0 +1,239 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+/*
18+ * The implementation is centered around m_visibleItems
19+ * that a list for each of the items in the view.
20+ * m_firstVisibleIndex is the index of the first item in m_visibleItems
21+ * m_lastInRowIndexPosition is a map that contains the x position
22+ * of items that are the last ones of a row so we can reconstruct the rows
23+ * when building back
24+ */
25+
26+#include "horizontaljournal.h"
27+
28+#include <qqmlengine.h>
29+#include <qqmlinfo.h>
30+#include <private/qqmldelegatemodel_p.h>
31+#include <private/qquickitem_p.h>
32+
33+HorizontalJournal::HorizontalJournal()
34+ : m_firstVisibleIndex(-1)
35+ , m_rowHeight(0)
36+{
37+}
38+
39+qreal HorizontalJournal::rowHeight() const
40+{
41+ return m_rowHeight;
42+}
43+
44+void HorizontalJournal::setRowHeight(qreal rowHeight)
45+{
46+ if (rowHeight != m_rowHeight) {
47+ m_rowHeight = rowHeight;
48+ Q_EMIT rowHeightChanged();
49+
50+ if (isComponentComplete()) {
51+ Q_FOREACH(QQuickItem *item, m_visibleItems) {
52+ item->setHeight(rowHeight);
53+ }
54+ relayout();
55+ }
56+ }
57+}
58+
59+void HorizontalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
60+{
61+ if (m_visibleItems.isEmpty()) {
62+ *modelIndex = 0;
63+ *yPos = 0;
64+ } else {
65+ *modelIndex = m_firstVisibleIndex + m_visibleItems.count();
66+ if (m_lastInRowIndexPosition.contains(*modelIndex - 1)) {
67+ *yPos = m_visibleItems.last()->y() + m_rowHeight + rowSpacing();
68+ } else {
69+ *yPos = m_visibleItems.last()->y();
70+ }
71+ }
72+}
73+
74+void HorizontalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
75+{
76+ if (m_visibleItems.isEmpty()) {
77+ *modelIndex = -1;
78+ *yPos = INT_MIN;
79+ } else {
80+ *modelIndex = m_firstVisibleIndex - 1;
81+ if (m_lastInRowIndexPosition.contains(*modelIndex)) {
82+ *yPos = m_visibleItems.first()->y() - rowSpacing() - m_rowHeight;
83+ } else {
84+ *yPos = m_visibleItems.first()->y();
85+ }
86+ }
87+}
88+
89+bool HorizontalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
90+{
91+ bool changed = false;
92+
93+ while (!m_visibleItems.isEmpty() && m_visibleItems.first()->y() + m_rowHeight < bufferFromY) {
94+ releaseItem(m_visibleItems.takeFirst());
95+ changed = true;
96+ m_firstVisibleIndex++;
97+ }
98+
99+ while (!m_visibleItems.isEmpty() && m_visibleItems.last()->y() > bufferToY) {
100+ releaseItem(m_visibleItems.takeLast());
101+ changed = true;
102+ m_lastInRowIndexPosition.remove(m_firstVisibleIndex + m_visibleItems.count());
103+ }
104+
105+ if (m_visibleItems.isEmpty()) {
106+ m_firstVisibleIndex = -1;
107+ }
108+
109+ return changed;
110+}
111+
112+void HorizontalJournal::addItemToView(int modelIndex, QQuickItem *item)
113+{
114+ if (item->height() != m_rowHeight) {
115+ qWarning() << "Item" << modelIndex << "height is not the one that the rowHeight mandates, resetting it";
116+ item->setHeight(m_rowHeight);
117+ }
118+
119+ if (m_visibleItems.isEmpty()) {
120+ Q_ASSERT(modelIndex == 0);
121+ item->setY(0);
122+ item->setX(0);
123+ m_visibleItems << item;
124+ m_firstVisibleIndex = 0;
125+ } else {
126+ // modelIndex has to be either m_firstVisibleIndex - 1 or m_firstVisibleIndex + m_visibleItems.count()
127+ if (modelIndex == m_firstVisibleIndex + m_visibleItems.count()) {
128+ QQuickItem *lastItem = m_visibleItems.last();
129+ if (lastItem->x() + lastItem->width() + columnSpacing() + item->width() <= width()) {
130+ // Fits in the row
131+ item->setY(lastItem->y());
132+ item->setX(lastItem->x() + lastItem->width() + columnSpacing());
133+ } else {
134+ // Starts a new row
135+ item->setY(lastItem->y() + m_rowHeight + rowSpacing());
136+ item->setX(0);
137+ m_lastInRowIndexPosition[modelIndex - 1] = lastItem->x();
138+ }
139+ m_visibleItems << item;
140+ } else if (modelIndex == m_firstVisibleIndex - 1) {
141+ QQuickItem *firstItem = m_visibleItems.first();
142+ if (m_lastInRowIndexPosition.contains(modelIndex)) {
143+ // It is the last item of its row, so start a new one since we're going back
144+ item->setY(firstItem->y() - rowSpacing() - m_rowHeight);
145+ item->setX(m_lastInRowIndexPosition[modelIndex]);
146+ } else {
147+ item->setY(firstItem->y());
148+ item->setX(firstItem->x() - columnSpacing() - item->width());
149+ }
150+ m_firstVisibleIndex = modelIndex;
151+ m_visibleItems.prepend(item);
152+ } else {
153+ qWarning() << "HorizontalJournal::addItemToView - Got unexpected modelIndex"
154+ << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
155+ }
156+ }
157+}
158+
159+void HorizontalJournal::cleanupExistingItems()
160+{
161+ // Cleanup the existing items
162+ Q_FOREACH(QQuickItem *item, m_visibleItems)
163+ releaseItem(item);
164+ m_visibleItems.clear();
165+ m_lastInRowIndexPosition.clear();
166+ m_firstVisibleIndex = -1;
167+ setImplicitHeightDirty();
168+}
169+
170+void HorizontalJournal::calculateImplicitHeight()
171+{
172+ if (m_firstVisibleIndex >= 0) {
173+ const int nIndexes = m_firstVisibleIndex + m_visibleItems.count();
174+ const double bottomMostY = m_visibleItems.last()->y() + m_rowHeight;
175+ const double averageHeight = bottomMostY / nIndexes;
176+ setImplicitHeight(bottomMostY + averageHeight * (model()->rowCount() - nIndexes));
177+ } else {
178+ setImplicitHeight(0);
179+ }
180+}
181+
182+void HorizontalJournal::processModelRemoves(const QVector<QQmlChangeSet::Change> &removes)
183+{
184+ Q_FOREACH(const QQmlChangeSet::Change remove, removes) {
185+ for (int i = remove.count - 1; i >= 0; --i) {
186+ const int indexToRemove = remove.index + i;
187+ // We only support removing from the end so
188+ // any of the last items of a column has to be indexToRemove
189+ const int lastIndex = m_firstVisibleIndex + m_visibleItems.count() - 1;
190+ if (indexToRemove == lastIndex) {
191+ releaseItem(m_visibleItems.takeLast());
192+ m_lastInRowIndexPosition.remove(indexToRemove);
193+ } else {
194+ if (indexToRemove < lastIndex) {
195+ qDebug() << "HorizontalJournal only supports removal from the end of the model, resetting instead";
196+ cleanupExistingItems();
197+ break;
198+ } else {
199+ setImplicitHeightDirty();
200+ }
201+ }
202+ }
203+ }
204+ if (m_visibleItems.isEmpty()) {
205+ m_firstVisibleIndex = -1;
206+ }
207+}
208+
209+
210+void HorizontalJournal::doRelayout()
211+{
212+ // If m_firstVisibleIndex is not 0 we need to drop all the delegates
213+ // since we can't consistently relayout without the first item being there
214+
215+ if (m_firstVisibleIndex == 0) {
216+ int i = 0;
217+ const QList<QQuickItem*> allItems = m_visibleItems;
218+ m_visibleItems.clear();
219+ m_lastInRowIndexPosition.clear();
220+ Q_FOREACH(QQuickItem *item, allItems) {
221+ addItemToView(i, item);
222+ ++i;
223+ }
224+ } else {
225+ Q_FOREACH(QQuickItem *item, m_visibleItems) {
226+ releaseItem(item);
227+ }
228+ m_visibleItems.clear();
229+ m_lastInRowIndexPosition.clear();
230+ m_firstVisibleIndex = -1;
231+ }
232+}
233+
234+void HorizontalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
235+{
236+ Q_FOREACH(QQuickItem *item, m_visibleItems) {
237+ QQuickItemPrivate::get(item)->setCulled(item->y() + m_rowHeight <= visibleFromY || item->y() >= visibleToY);
238+ }
239+}
plugins/Dash/horizontaljournal.hnew file+63
@@ -0,0 +1,63 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef HORIZONTALJOURNAL_H
18+#define HORIZONTALJOURNAL_H
19+
20+#include "abstractdashview.h"
21+
22+ /** A horizontal journal is a view that creates delegates
23+ * based on a model and layouts them one after the other
24+ * in the same row until there is no more free space for the next item
25+ * and so that item is layouted in the next row
26+ *
27+ * All delegates are forced to rowHeight if they don't have it.
28+ */
29+ class HorizontalJournal : public AbstractDashView
30+{
31+ Q_OBJECT
32+
33+ Q_PROPERTY(qreal rowHeight READ rowHeight WRITE setRowHeight NOTIFY rowHeightChanged)
34+
35+friend class HorizontalJournalTest;
36+
37+public:
38+ HorizontalJournal();
39+
40+ qreal rowHeight() const;
41+ void setRowHeight(qreal rowHeight);
42+
43+Q_SIGNALS:
44+ void rowHeightChanged();
45+
46+private:
47+ void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
48+ void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
49+ bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
50+ void addItemToView(int modelIndex, QQuickItem *item) override;
51+ void cleanupExistingItems() override;
52+ void calculateImplicitHeight() override;
53+ void doRelayout() override;
54+ void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
55+ void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) override;
56+
57+ int m_firstVisibleIndex;
58+ QList<QQuickItem*> m_visibleItems;
59+ QMap<int, double> m_lastInRowIndexPosition;
60+ int m_rowHeight;
61+};
62+
63+#endif
plugins/Dash/listviewwithpageheader.cppnew file+1396
@@ -0,0 +1,1396 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+/*
18+ * Some documentation on how this thing works:
19+ *
20+ * A flickable has two very important concepts that define the top and
21+ * height of the flickable area.
22+ * The top is returned in minYExtent()
23+ * The height is set using setContentHeight()
24+ * By changing those two values we can make the list grow up or down
25+ * as needed. e.g. if we are in the middle of the list
26+ * and something that is above the viewport grows, since we do not
27+ * want to change the viewport because of that we just adjust the
28+ * minYExtent so that the list grows up.
29+ *
30+ * The implementation on the list relies on the delegateModel doing
31+ * most of the instantiation work. You call createItem() when you
32+ * need to create an item asking for it async or not. If returns null
33+ * it means the item will be created async and the model will call the
34+ * itemCreated slot with the item.
35+ *
36+ * updatePolish is the central point of dispatch for the work of the
37+ * class. It is called by the scene graph just before drawing the class.
38+ * In it we:
39+ * * Make sure all items are positioned correctly
40+ * * Add/Remove items if needed
41+ * * Update the content height if it was dirty
42+ *
43+ * m_visibleItems contains all the items we have created at the moment.
44+ * Actually not all of them are visible since it includes the ones
45+ * in the cache area we create asynchronously to help performance.
46+ * The first item in m_visibleItems has the m_firstVisibleIndex in
47+ * the model. If you actually want to know what is the first
48+ * item in the viewport you have to find the first non culled element
49+ * in m_visibleItems
50+ *
51+ * All the items (except the header) are childs of m_clipItem which
52+ * is a child of the contentItem() of the flickable (The contentItem()
53+ * is what actually 'moves' in a a flickable). This way
54+ * we can implement the clipping needed so we can have the header
55+ * shown in the middle of the list over the items without the items
56+ * leaking under the header in case it is transparent.
57+ *
58+ * The first item of m_visibleItems is the one that defines the
59+ * positions of all the rest of items (see updatePolish()) and
60+ * this is why sometimes we move it even if it's not the item
61+ * that has triggered the function (i.e. in itemGeometryChanged())
62+ *
63+ * m_visibleItems is a list of ListItem. Each ListItem
64+ * will contain a item and potentially a sectionItem. The sectionItem
65+ * is only there when the list is using sectionDelegate+sectionProperty
66+ * and this is the first item of the section. Each ListItem is vertically
67+ * layouted with the sectionItem first and then the item.
68+ *
69+ * For sectioning we also have a section item alone (m_topSectionItem)
70+ * that is used for the cases we need to show the sticky section item at
71+ * the top of the view.
72+ *
73+ * Each delegate item has a context property called heightToClip that is
74+ * used to communicate to the delegate implementation in case it has to
75+ * clip itself because of overlapping with the top sticky section item.
76+ * This is an implementation decision since it has been agreed it
77+ * is easier to implement the clipping in QML with this info than to
78+ * do it at the C++ level.
79+ *
80+ * Note that minYExtent and height are not always totally accurate, since
81+ * we don't have the items created we can't guess their heights
82+ * so we can only guarantee the values are correct when the first/last
83+ * items of the list are visible, otherwise we just live with good enough
84+ * values that make the list scrollable
85+ *
86+ * There are a few things that are not really implemented or tested properly
87+ * which we don't use at the moment like changing the model, changing
88+ * the section delegate, having a section delegate that changes its size, etc.
89+ * The known missing features are marked with TODOs along the code.
90+ */
91+
92+#include "listviewwithpageheader.h"
93+
94+#include <QCoreApplication>
95+#include <QDebug>
96+#include <qqmlinfo.h>
97+#include <qqmlengine.h>
98+#include <private/qqmlcontext_p.h>
99+#include <private/qqmldelegatemodel_p.h>
100+#include <private/qqmlglobal_p.h>
101+#include <private/qquickitem_p.h>
102+#include <private/qquickanimation_p.h>
103+// #include <private/qquickrectangle_p.h>
104+
105+qreal ListViewWithPageHeader::ListItem::height() const
106+{
107+ return m_item->height() + (m_sectionItem ? m_sectionItem->height() : 0);
108+}
109+
110+qreal ListViewWithPageHeader::ListItem::y() const
111+{
112+ return m_item->y() - (m_sectionItem ? m_sectionItem->height() : 0);
113+}
114+
115+void ListViewWithPageHeader::ListItem::setY(qreal newY)
116+{
117+ if (m_sectionItem) {
118+ m_sectionItem->setY(newY);
119+ m_item->setY(newY + m_sectionItem->height());
120+ } else {
121+ m_item->setY(newY);
122+ }
123+}
124+
125+bool ListViewWithPageHeader::ListItem::culled() const
126+{
127+ return QQuickItemPrivate::get(m_item)->culled;
128+}
129+
130+void ListViewWithPageHeader::ListItem::setCulled(bool culled)
131+{
132+ QQuickItemPrivate::get(m_item)->setCulled(culled);
133+ if (m_sectionItem)
134+ QQuickItemPrivate::get(m_sectionItem)->setCulled(culled);
135+}
136+
137+void ListViewWithPageHeader::ListItem::setSectionItem(QQuickItem *sectionItem)
138+{
139+ m_sectionItem = sectionItem;
140+}
141+
142+ListViewWithPageHeader::ListViewWithPageHeader()
143+ : m_delegateModel(nullptr)
144+ , m_asyncRequestedIndex(-1)
145+ , m_delegateValidated(false)
146+ , m_firstVisibleIndex(-1)
147+ , m_minYExtent(0)
148+ , m_contentHeightDirty(false)
149+ , m_headerItem(nullptr)
150+ , m_previousContentY(0)
151+ , m_headerItemShownHeight(0)
152+ , m_sectionDelegate(nullptr)
153+ , m_topSectionItem(nullptr)
154+ , m_forceNoClip(false)
155+ , m_inLayout(false)
156+ , m_inContentHeightKeepHeaderShown(false)
157+ , m_cacheBuffer(0)
158+{
159+ m_clipItem = new QQuickItem(contentItem());
160+// m_clipItem = new QQuickRectangle(contentItem());
161+// ((QQuickRectangle*)m_clipItem)->setColor(Qt::gray);
162+
163+ m_contentYAnimation = new QQuickNumberAnimation(this);
164+ m_contentYAnimation->setEasing(QEasingCurve::OutQuad);
165+ m_contentYAnimation->setProperty(QStringLiteral("contentY"));
166+ m_contentYAnimation->setDuration(200);
167+ m_contentYAnimation->setTargetObject(this);
168+
169+ connect(contentItem(), &QQuickItem::widthChanged, this, &ListViewWithPageHeader::onContentWidthChanged);
170+ connect(this, &ListViewWithPageHeader::contentHeightChanged, this, &ListViewWithPageHeader::onContentHeightChanged);
171+ connect(this, &ListViewWithPageHeader::heightChanged, this, &ListViewWithPageHeader::onHeightChanged);
172+ connect(m_contentYAnimation, &QQuickNumberAnimation::runningChanged, this, &ListViewWithPageHeader::contentYAnimationRunningChanged);
173+
174+ setFlickableDirection(VerticalFlick);
175+}
176+
177+ListViewWithPageHeader::~ListViewWithPageHeader()
178+{
179+}
180+
181+QAbstractItemModel *ListViewWithPageHeader::model() const
182+{
183+ return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
184+}
185+
186+void ListViewWithPageHeader::setModel(QAbstractItemModel *model)
187+{
188+ if (model != this->model()) {
189+ if (!m_delegateModel) {
190+ createDelegateModel();
191+ } else {
192+ disconnect(m_delegateModel, &QQmlDelegateModel::modelUpdated, this, &ListViewWithPageHeader::onModelUpdated);
193+ }
194+ m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
195+ connect(m_delegateModel, &QQmlDelegateModel::modelUpdated, this, &ListViewWithPageHeader::onModelUpdated);
196+ Q_EMIT modelChanged();
197+ polish();
198+ // TODO?
199+// Q_EMIT contentHeightChanged();
200+// Q_EMIT contentYChanged();
201+ }
202+}
203+
204+QQmlComponent *ListViewWithPageHeader::delegate() const
205+{
206+ return m_delegateModel ? m_delegateModel->delegate() : nullptr;
207+}
208+
209+void ListViewWithPageHeader::setDelegate(QQmlComponent *delegate)
210+{
211+ if (delegate != this->delegate()) {
212+ if (!m_delegateModel) {
213+ createDelegateModel();
214+ }
215+
216+ // Cleanup the existing items
217+ Q_FOREACH(ListItem *item, m_visibleItems)
218+ releaseItem(item);
219+ m_visibleItems.clear();
220+ initializeValuesForEmptyList();
221+
222+ m_delegateModel->setDelegate(delegate);
223+
224+ Q_EMIT delegateChanged();
225+ m_delegateValidated = false;
226+ m_contentHeightDirty = true;
227+ polish();
228+ }
229+}
230+
231+void ListViewWithPageHeader::initializeValuesForEmptyList()
232+{
233+ m_firstVisibleIndex = -1;
234+ adjustMinYExtent();
235+ setContentY(0);
236+ m_clipItem->setY(0);
237+ if (m_topSectionItem) {
238+ QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
239+ }
240+}
241+
242+QQuickItem *ListViewWithPageHeader::header() const
243+{
244+ return m_headerItem;
245+}
246+
247+void ListViewWithPageHeader::setHeader(QQuickItem *headerItem)
248+{
249+ if (m_headerItem != headerItem) {
250+ qreal oldHeaderHeight = 0;
251+ qreal oldHeaderY = 0;
252+ if (m_headerItem) {
253+ oldHeaderHeight = m_headerItem->height();
254+ oldHeaderY = m_headerItem->y();
255+ m_headerItem->setParentItem(nullptr);
256+ QQuickItemPrivate::get(m_headerItem)->removeItemChangeListener(this, QQuickItemPrivate::ImplicitHeight);
257+ }
258+ m_headerItem = headerItem;
259+ if (m_headerItem) {
260+ m_headerItem->setParentItem(contentItem());
261+ m_headerItem->setZ(1);
262+ m_previousHeaderImplicitHeight = m_headerItem->implicitHeight();
263+ QQuickItemPrivate::get(m_headerItem)->addItemChangeListener(this, QQuickItemPrivate::ImplicitHeight);
264+ }
265+ qreal newHeaderHeight = m_headerItem ? m_headerItem->height() : 0;
266+ if (!m_visibleItems.isEmpty() && newHeaderHeight != oldHeaderHeight) {
267+ headerHeightChanged(newHeaderHeight, oldHeaderHeight, oldHeaderY);
268+ polish();
269+ m_contentHeightDirty = true;
270+ }
271+ Q_EMIT headerChanged();
272+ }
273+}
274+
275+QQmlComponent *ListViewWithPageHeader::sectionDelegate() const
276+{
277+ return m_sectionDelegate;
278+}
279+
280+void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
281+{
282+ if (delegate != m_sectionDelegate) {
283+ // TODO clean existing sections
284+
285+ m_sectionDelegate = delegate;
286+
287+ m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
288+ if (m_topSectionItem) {
289+ m_topSectionItem->setZ(3);
290+ QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
291+ connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
292+ }
293+
294+ // TODO create sections for existing items
295+
296+ Q_EMIT sectionDelegateChanged();
297+ Q_EMIT stickyHeaderHeightChanged();
298+ }
299+}
300+
301+QString ListViewWithPageHeader::sectionProperty() const
302+{
303+ return m_sectionProperty;
304+}
305+
306+void ListViewWithPageHeader::setSectionProperty(const QString &property)
307+{
308+ if (property != m_sectionProperty) {
309+ m_sectionProperty = property;
310+
311+ updateWatchedRoles();
312+
313+ // TODO recreate sections
314+
315+ Q_EMIT sectionPropertyChanged();
316+ }
317+}
318+
319+bool ListViewWithPageHeader::forceNoClip() const
320+{
321+ return m_forceNoClip;
322+}
323+
324+void ListViewWithPageHeader::setForceNoClip(bool noClip)
325+{
326+ if (noClip != m_forceNoClip) {
327+ m_forceNoClip = noClip;
328+ updateClipItem();
329+ Q_EMIT forceNoClipChanged();
330+ }
331+}
332+
333+int ListViewWithPageHeader::stickyHeaderHeight() const
334+{
335+ return m_topSectionItem ? m_topSectionItem->height() : 0;
336+}
337+
338+qreal ListViewWithPageHeader::headerItemShownHeight() const
339+{
340+ return m_headerItemShownHeight;
341+}
342+
343+int ListViewWithPageHeader::cacheBuffer() const
344+{
345+ return m_cacheBuffer;
346+}
347+
348+void ListViewWithPageHeader::setCacheBuffer(int cacheBuffer)
349+{
350+ if (cacheBuffer < 0) {
351+ qmlInfo(this) << "Cannot set a negative cache buffer";
352+ return;
353+ }
354+
355+ if (cacheBuffer != m_cacheBuffer) {
356+ m_cacheBuffer = cacheBuffer;
357+ Q_EMIT cacheBufferChanged();
358+ polish();
359+ }
360+}
361+
362+void ListViewWithPageHeader::positionAtBeginning()
363+{
364+ if (m_delegateModel->count() <= 0)
365+ return;
366+
367+ qreal headerHeight = (m_headerItem ? m_headerItem->height() : 0);
368+ if (m_firstVisibleIndex != 0) {
369+ // TODO This could be optimized by trying to reuse the interesection
370+ // of items that may end up intersecting between the existing
371+ // m_visibleItems and the items we are creating in the next loop
372+ Q_FOREACH(ListItem *item, m_visibleItems)
373+ releaseItem(item);
374+ m_visibleItems.clear();
375+ m_firstVisibleIndex = -1;
376+
377+ // Create the item 0, it will be already correctly positioned at createItem()
378+ m_clipItem->setY(0);
379+ ListItem *item = createItem(0, false);
380+ // Create the subsequent items
381+ int modelIndex = 1;
382+ qreal pos = item->y() + item->height();
383+ const qreal bufferTo = height() + m_cacheBuffer;
384+ while (modelIndex < m_delegateModel->count() && pos <= bufferTo) {
385+ if (!(item = createItem(modelIndex, false)))
386+ break;
387+ pos += item->height();
388+ ++modelIndex;
389+ }
390+
391+ m_previousContentY = m_visibleItems.first()->y() - headerHeight;
392+ }
393+ setContentY(m_visibleItems.first()->y() + m_clipItem->y() - headerHeight);
394+ if (m_headerItem) {
395+ // TODO This should not be needed and the code that adjust the m_headerItem position
396+ // in viewportMoved() should be enough but in some cases we have not found a way to reproduce
397+ // yet the code of viewportMoved() fails so here we make sure that at least if we are calling
398+ // positionAtBeginning the header item will be correctly positioned
399+ m_headerItem->setY(-m_minYExtent);
400+ }
401+}
402+
403+static inline bool uFuzzyCompare(qreal r1, qreal r2)
404+{
405+ return qFuzzyCompare(r1, r2) || (qFuzzyIsNull(r1) && qFuzzyIsNull(r2));
406+}
407+
408+void ListViewWithPageHeader::showHeader()
409+{
410+ if (!m_headerItem)
411+ return;
412+
413+ const auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
414+ if (!uFuzzyCompare(to, contentY())) {
415+ const bool headerShownByItsOwn = contentY() < m_headerItem->y() + m_headerItem->height();
416+ if (headerShownByItsOwn && m_headerItemShownHeight == 0) {
417+ // We are not clipping since we are just at the top of the viewport
418+ // but because of the showHeader animation we will need to, so
419+ // enable the clipping without logically moving the items
420+ m_headerItemShownHeight = m_headerItem->y() + m_headerItem->height() - contentY();
421+ if (!m_visibleItems.isEmpty()) {
422+ updateClipItem();
423+ ListItem *firstItem = m_visibleItems.first();
424+ firstItem->setY(firstItem->y() - m_headerItemShownHeight);
425+ layout();
426+ }
427+ Q_EMIT headerItemShownHeightChanged();
428+ }
429+ m_contentYAnimation->setTo(to);
430+ contentYAnimationType = ContentYAnimationShowHeader;
431+ m_contentYAnimation->start();
432+ }
433+}
434+
435+int ListViewWithPageHeader::firstCreatedIndex() const
436+{
437+ return m_firstVisibleIndex;
438+}
439+
440+int ListViewWithPageHeader::createdItemCount() const
441+{
442+ return m_visibleItems.count();
443+}
444+
445+QQuickItem *ListViewWithPageHeader::item(int modelIndex) const
446+{
447+ ListItem *item = itemAtIndex(modelIndex);
448+ if (item)
449+ return item->m_item;
450+ else
451+ return nullptr;
452+}
453+
454+bool ListViewWithPageHeader::maximizeVisibleArea(int modelIndex)
455+{
456+ ListItem *listItem = itemAtIndex(modelIndex);
457+ if (listItem) {
458+ return maximizeVisibleArea(listItem, listItem->height());
459+ }
460+
461+ return false;
462+}
463+
464+bool ListViewWithPageHeader::maximizeVisibleArea(int modelIndex, int itemHeight)
465+{
466+ if (itemHeight < 0)
467+ return false;
468+
469+ ListItem *listItem = itemAtIndex(modelIndex);
470+ if (listItem) {
471+ return maximizeVisibleArea(listItem, itemHeight + (listItem->sectionItem() ? listItem->sectionItem()->height() : 0));
472+ }
473+
474+ return false;
475+}
476+
477+bool ListViewWithPageHeader::maximizeVisibleArea(ListItem *listItem, int listItemHeight)
478+{
479+ if (listItem) {
480+ layout();
481+ const auto listItemY = m_clipItem->y() + listItem->y();
482+ if (listItemY > contentY() && listItemY + listItemHeight > contentY() + height()) {
483+ // we can scroll the list up to show more stuff
484+ const auto to = qMin(listItemY, listItemY + listItemHeight - height());
485+ m_contentYAnimation->setTo(to);
486+ contentYAnimationType = ContentYAnimationMaximizeVisibleArea;
487+ m_contentYAnimation->start();
488+ } else if ((listItemY < contentY() && listItemY + listItemHeight < contentY() + height()) ||
489+ (m_topSectionItem && !listItem->sectionItem() && listItemY - m_topSectionItem->height() < contentY() && listItemY + listItemHeight < contentY() + height()))
490+ {
491+ // we can scroll the list down to show more stuff
492+ auto realVisibleListItemY = listItemY;
493+ if (m_topSectionItem) {
494+ // If we are showing the top section sticky item and this item doesn't have a section
495+ // item we have to make sure to scroll it a bit more so that it is not underlapping
496+ // the top section sticky item
497+ bool topSectionShown = !QQuickItemPrivate::get(m_topSectionItem)->culled;
498+ if (topSectionShown && !listItem->sectionItem()) {
499+ realVisibleListItemY -= m_topSectionItem->height();
500+ }
501+ }
502+ const auto to = qMax(realVisibleListItemY, listItemY + listItemHeight - height());
503+ m_contentYAnimation->setTo(to);
504+ contentYAnimationType = ContentYAnimationMaximizeVisibleArea;
505+ m_contentYAnimation->start();
506+ }
507+ return true;
508+ }
509+ return false;
510+}
511+
512+qreal ListViewWithPageHeader::minYExtent() const
513+{
514+// qDebug() << "ListViewWithPageHeader::minYExtent" << m_minYExtent;
515+ return m_minYExtent;
516+}
517+
518+qreal ListViewWithPageHeader::maxYExtent() const
519+{
520+ return height() - contentHeight();
521+}
522+
523+void ListViewWithPageHeader::componentComplete()
524+{
525+ if (m_delegateModel)
526+ m_delegateModel->componentComplete();
527+
528+ QQuickFlickable::componentComplete();
529+
530+ polish();
531+}
532+
533+void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
534+{
535+ // Check we are not being taken down and don't paint anything
536+ // TODO Check if we still need this in 5.2
537+ // For reproduction just inifnite loop testDash or testDashContent
538+ if (!QQmlEngine::contextForObject(this)->parentContext())
539+ return;
540+
541+ QQuickFlickable::viewportMoved(orient);
542+// qDebug() << "ListViewWithPageHeader::viewportMoved" << contentY();
543+ const qreal diff = m_previousContentY - contentY();
544+ adjustHeader(diff);
545+ m_previousContentY = contentY();
546+ layout();
547+ polish();
548+}
549+
550+void ListViewWithPageHeader::adjustHeader(qreal diff)
551+{
552+ const bool showHeaderAnimationRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationShowHeader;
553+ if (m_headerItem) {
554+ const auto oldHeaderItemShownHeight = m_headerItemShownHeight;
555+ if (uFuzzyCompare(contentY(), -m_minYExtent) || contentY() > -m_minYExtent) {
556+ m_headerItem->setHeight(m_headerItem->implicitHeight());
557+ // We are going down (but it's not because of the rebound at the end)
558+ // (but the header was not shown by it's own position)
559+ // or the header is partially shown and we are not doing a maximizeVisibleArea either
560+ const bool scrolledUp = m_previousContentY > contentY();
561+ const bool notRebounding = qRound(contentY() + height()) < qRound(contentHeight());
562+ const bool notShownByItsOwn = contentY() + diff >= m_headerItem->y() + m_headerItem->height();
563+ const bool maximizeVisibleAreaRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationMaximizeVisibleArea;
564+
565+ if (!scrolledUp && (contentY() == -m_minYExtent || (m_headerItemShownHeight == 0 && m_previousContentY == m_headerItem->y()))) {
566+ m_headerItemShownHeight = 0;
567+ m_headerItem->setY(-m_minYExtent);
568+ } else if ((scrolledUp && notRebounding && notShownByItsOwn && !maximizeVisibleAreaRunning) || (m_headerItemShownHeight > 0) || m_inContentHeightKeepHeaderShown) {
569+ if (maximizeVisibleAreaRunning && diff > 0) {
570+ // If we are maximizing and the header was shown, make sure we hide it
571+ m_headerItemShownHeight -= diff;
572+ } else {
573+ m_headerItemShownHeight += diff;
574+ }
575+ if (uFuzzyCompare(contentY(), -m_minYExtent)) {
576+ m_headerItemShownHeight = 0;
577+ } else {
578+ m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, m_headerItem->height());
579+ }
580+ if (m_headerItemShownHeight > 0) {
581+ if (uFuzzyCompare(m_headerItem->height(), m_headerItemShownHeight)) {
582+ m_headerItem->setY(contentY());
583+ m_headerItemShownHeight = m_headerItem->height();
584+ } else {
585+ m_headerItem->setY(contentY() - m_headerItem->height() + m_headerItemShownHeight);
586+ }
587+ } else {
588+ m_headerItem->setY(-m_minYExtent);
589+ }
590+ } else if (m_headerItemShownHeight == 0 && m_previousContentY > m_headerItem->y() && contentY() < m_headerItem->y()) {
591+ // The header was hidden but now that we've moved up (e.g. because of item removed) it's visible
592+ // make sure it isn't
593+ m_headerItem->setY(-m_minYExtent);
594+ }
595+ Q_EMIT headerItemShownHeightChanged();
596+ } else {
597+ // Stick the header item to the top when dragging down
598+ m_headerItem->setY(contentY());
599+ m_headerItem->setHeight(m_headerItem->implicitHeight() + (-m_minYExtent - contentY()));
600+ }
601+ // We will be changing the clip item, need to accomadate for it
602+ // otherwise we move the firstItem down/up twice (unless the
603+ // show header animation is running, where we want to keep the viewport stable)
604+ if (!showHeaderAnimationRunning) {
605+ diff += oldHeaderItemShownHeight - m_headerItemShownHeight;
606+ } else {
607+ diff = -diff;
608+ }
609+ }
610+ if (!m_visibleItems.isEmpty()) {
611+ updateClipItem();
612+ ListItem *firstItem = m_visibleItems.first();
613+ firstItem->setY(firstItem->y() + diff);
614+ if (showHeaderAnimationRunning) {
615+ adjustMinYExtent();
616+ }
617+ }
618+}
619+
620+void ListViewWithPageHeader::createDelegateModel()
621+{
622+ m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
623+ connect(m_delegateModel, &QQmlDelegateModel::createdItem, this, &ListViewWithPageHeader::itemCreated);
624+ if (isComponentComplete())
625+ m_delegateModel->componentComplete();
626+ updateWatchedRoles();
627+}
628+
629+void ListViewWithPageHeader::refill()
630+{
631+ if (m_inLayout) {
632+ return;
633+ }
634+ if (!isComponentComplete()) {
635+ return;
636+ }
637+
638+ const qreal from = contentY();
639+ const qreal to = from + height();
640+ const qreal bufferFrom = from - m_cacheBuffer;
641+ const qreal bufferTo = to + m_cacheBuffer;
642+
643+ bool added = addVisibleItems(from, to, false);
644+ bool removed = removeNonVisibleItems(bufferFrom, bufferTo);
645+ added |= addVisibleItems(bufferFrom, bufferTo, true);
646+
647+ if (added || removed) {
648+ m_contentHeightDirty = true;
649+ }
650+}
651+
652+bool ListViewWithPageHeader::addVisibleItems(qreal fillFrom, qreal fillTo, bool asynchronous)
653+{
654+ if (!delegate())
655+ return false;
656+
657+ if (m_delegateModel->count() == 0)
658+ return false;
659+
660+ ListItem *item;
661+// qDebug() << "ListViewWithPageHeader::addVisibleItems" << fillFrom << fillTo << asynchronous;
662+
663+ int modelIndex = 0;
664+ qreal pos = 0;
665+ if (!m_visibleItems.isEmpty()) {
666+ modelIndex = m_firstVisibleIndex + m_visibleItems.count();
667+ item = m_visibleItems.last();
668+ pos = item->y() + item->height() + m_clipItem->y();
669+ }
670+ bool changed = false;
671+// qDebug() << (modelIndex < m_delegateModel->count()) << pos << fillTo;
672+ while (modelIndex < m_delegateModel->count() && pos <= fillTo) {
673+// qDebug() << "refill: append item" << modelIndex << "pos" << pos << "asynchronous" << asynchronous;
674+ if (!(item = createItem(modelIndex, asynchronous)))
675+ break;
676+ pos += item->height();
677+ ++modelIndex;
678+ changed = true;
679+ }
680+
681+ modelIndex = 0;
682+ pos = 0;
683+ if (!m_visibleItems.isEmpty()) {
684+ modelIndex = m_firstVisibleIndex - 1;
685+ item = m_visibleItems.first();
686+ pos = item->y() + m_clipItem->y();
687+ }
688+ while (modelIndex >= 0 && pos > fillFrom) {
689+// qDebug() << "refill: prepend item" << modelIndex << "pos" << pos << "fillFrom" << fillFrom << "asynchronous" << asynchronous;
690+ if (!(item = createItem(modelIndex, asynchronous)))
691+ break;
692+ pos -= item->height();
693+ --modelIndex;
694+ changed = true;
695+ }
696+
697+ return changed;
698+}
699+
700+void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
701+{
702+ QQuickItem *item = listItem->m_item;
703+ QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
704+ if (flags & QQmlDelegateModel::Destroyed) {
705+ item->setParentItem(nullptr);
706+ }
707+ if (listItem->sectionItem()) {
708+ listItem->sectionItem()->deleteLater();
709+ }
710+ delete listItem;
711+}
712+
713+void ListViewWithPageHeader::releaseItem(ListItem *listItem)
714+{
715+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
716+ if (listItem->sectionItem()) {
717+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
718+ }
719+ m_itemsToRelease << listItem;
720+}
721+
722+void ListViewWithPageHeader::updateWatchedRoles()
723+{
724+ if (m_delegateModel) {
725+ QList<QByteArray> roles;
726+ if (!m_sectionProperty.isEmpty())
727+ roles << m_sectionProperty.toUtf8();
728+ m_delegateModel->setWatchedRoles(roles);
729+ }
730+}
731+
732+QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyInserted)
733+{
734+ if (!m_sectionDelegate)
735+ return nullptr;
736+
737+ const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
738+
739+ if (modelIndex > 0) {
740+ const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
741+ if (section == prevSection)
742+ return nullptr;
743+ }
744+ if (modelIndex + 1 < model()->rowCount() && !alreadyInserted) {
745+ // Already inserted items can't steal next section header
746+ const QString nextSection = m_delegateModel->stringValue(modelIndex + 1, m_sectionProperty);
747+ if (section == nextSection) {
748+ // Steal the section header
749+ ListItem *nextItem = itemAtIndex(modelIndex); // Not +1 since not yet inserted into m_visibleItems
750+ if (nextItem) {
751+ QQuickItem *sectionItem = nextItem->sectionItem();
752+ nextItem->setSectionItem(nullptr);
753+ return sectionItem;
754+ }
755+ }
756+ }
757+
758+ return getSectionItem(section);
759+}
760+
761+QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText, bool watchGeometry)
762+{
763+ QQuickItem *sectionItem = nullptr;
764+
765+ QQmlContext *creationContext = m_sectionDelegate->creationContext();
766+ QQmlContext *context = new QQmlContext(creationContext ? creationContext : qmlContext(this));
767+ QObject *nobj = m_sectionDelegate->beginCreate(context);
768+ if (nobj) {
769+ QQml_setParent_noEvent(context, nobj);
770+ sectionItem = qobject_cast<QQuickItem *>(nobj);
771+ if (!sectionItem) {
772+ delete nobj;
773+ } else {
774+ sectionItem->setProperty("text", sectionText);
775+ sectionItem->setProperty("delegate", QVariant());
776+ sectionItem->setZ(2);
777+ QQml_setParent_noEvent(sectionItem, m_clipItem);
778+ sectionItem->setParentItem(m_clipItem);
779+ }
780+ } else {
781+ delete context;
782+ }
783+ m_sectionDelegate->completeCreate();
784+
785+ if (watchGeometry && sectionItem) {
786+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
787+ }
788+
789+ return sectionItem;
790+}
791+
792+void ListViewWithPageHeader::updateSectionItem(int modelIndex)
793+{
794+ ListItem *item = itemAtIndex(modelIndex);
795+ if (item) {
796+ const QString sectionText = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
797+
798+ bool needSectionHeader = true;
799+ // if it is the same section as the previous item need to drop the section
800+ if (modelIndex > 0) {
801+ const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
802+ if (sectionText == prevSection) {
803+ needSectionHeader = false;
804+ }
805+ }
806+
807+ if (needSectionHeader) {
808+ if (!item->sectionItem()) {
809+ item->setSectionItem(getSectionItem(sectionText));
810+ } else {
811+ item->sectionItem()->setProperty("text", sectionText);
812+ }
813+ } else {
814+ if (item->sectionItem()) {
815+ item->sectionItem()->deleteLater();
816+ item->setSectionItem(nullptr);
817+ }
818+ }
819+ }
820+}
821+
822+bool ListViewWithPageHeader::removeNonVisibleItems(qreal bufferFrom, qreal bufferTo)
823+{
824+// qDebug() << "ListViewWithPageHeader::removeNonVisibleItems" << bufferFrom << bufferTo;
825+ // Do not remove items if we are overshooting up or down, since we'll come back
826+ // to the "stable" position and delete/create items without any reason
827+ if (contentY() < -m_minYExtent) {
828+ return false;
829+ } else if (contentY() + height() > contentHeight()) {
830+ return false;
831+ }
832+ bool changed = false;
833+
834+ bool foundVisible = false;
835+ int i = 0;
836+ int removedItems = 0;
837+ const auto oldFirstVisibleIndex = m_firstVisibleIndex;
838+ while (i < m_visibleItems.count()) {
839+ ListItem *item = m_visibleItems[i];
840+ const qreal pos = item->y() + m_clipItem->y();
841+// qDebug() << i << pos << (pos + item->height()) << bufferFrom << bufferTo;
842+ if (pos + item->height() < bufferFrom || pos > bufferTo) {
843+// qDebug() << "Releasing" << i << (pos + item->height() < bufferFrom) << pos + item->height() << bufferFrom << (pos > bufferTo) << pos << bufferTo;
844+ releaseItem(item);
845+ m_visibleItems.removeAt(i);
846+ changed = true;
847+ ++removedItems;
848+ } else {
849+ if (!foundVisible) {
850+ foundVisible = true;
851+ const int itemIndex = m_firstVisibleIndex + removedItems + i;
852+ m_firstVisibleIndex = itemIndex;
853+ }
854+ ++i;
855+ }
856+ }
857+ if (!foundVisible) {
858+ initializeValuesForEmptyList();
859+ }
860+ if (m_firstVisibleIndex != oldFirstVisibleIndex) {
861+ adjustMinYExtent();
862+ }
863+
864+ return changed;
865+}
866+
867+ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIndex, bool asynchronous)
868+{
869+// qDebug() << "CREATE ITEM" << modelIndex;
870+ if (asynchronous && m_asyncRequestedIndex != -1)
871+ return nullptr;
872+
873+ m_asyncRequestedIndex = -1;
874+ QObject* object = m_delegateModel->object(modelIndex, asynchronous ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested);
875+ QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
876+ if (!item) {
877+ if (object) {
878+ m_delegateModel->release(object);
879+ if (!m_delegateValidated) {
880+ m_delegateValidated = true;
881+ QObject* delegateObj = delegate();
882+ qmlInfo(delegateObj ? delegateObj : this) << "Delegate must be of Item type";
883+ }
884+ } else {
885+ m_asyncRequestedIndex = modelIndex;
886+ }
887+ return 0;
888+ } else {
889+// qDebug() << "ListViewWithPageHeader::createItem::We have the item" << modelIndex << item;
890+ ListItem *listItem = new ListItem;
891+ listItem->m_item = item;
892+ listItem->setSectionItem(getSectionItem(modelIndex, false /*Not yet inserted into m_visibleItems*/));
893+ QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
894+ ListItem *prevItem = itemAtIndex(modelIndex - 1);
895+ bool lostItem = false; // Is an item that we requested async but because of model changes
896+ // it is no longer attached to any of the existing items (has no prev nor next item)
897+ // nor is the first item
898+ if (prevItem) {
899+ listItem->setY(prevItem->y() + prevItem->height());
900+ } else {
901+ ListItem *currItem = itemAtIndex(modelIndex);
902+ if (currItem) {
903+ // There's something already in m_visibleItems at out index, meaning this is an insert, so attach to its top
904+ listItem->setY(currItem->y() - listItem->height());
905+ } else {
906+ ListItem *nextItem = itemAtIndex(modelIndex + 1);
907+ if (nextItem) {
908+ listItem->setY(nextItem->y() - listItem->height());
909+ } else if (modelIndex == 0) {
910+ listItem->setY(-m_clipItem->y() + (m_headerItem ? m_headerItem->height() : 0));
911+ } else if (!m_visibleItems.isEmpty()) {
912+ lostItem = true;
913+ }
914+ }
915+ }
916+ if (lostItem) {
917+ listItem->setCulled(true);
918+ releaseItem(listItem);
919+ listItem = nullptr;
920+ } else {
921+ listItem->setCulled(listItem->y() + listItem->height() + m_clipItem->y() <= contentY() || listItem->y() + m_clipItem->y() >= contentY() + height());
922+ if (m_visibleItems.isEmpty()) {
923+ m_visibleItems << listItem;
924+ } else {
925+ m_visibleItems.insert(modelIndex - m_firstVisibleIndex, listItem);
926+ }
927+ if (m_firstVisibleIndex < 0 || modelIndex < m_firstVisibleIndex) {
928+ m_firstVisibleIndex = modelIndex;
929+ polish();
930+ }
931+ if (listItem->sectionItem()) {
932+ listItem->sectionItem()->setProperty("delegate", QVariant::fromValue(listItem->m_item));
933+ }
934+ adjustMinYExtent();
935+ m_contentHeightDirty = true;
936+ }
937+ return listItem;
938+ }
939+}
940+
941+void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
942+{
943+ QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
944+ if (!item) {
945+ qWarning() << "ListViewWithPageHeader::itemCreated got a non item for index" << modelIndex;
946+ return;
947+ }
948+// qDebug() << "ListViewWithPageHeader::itemCreated" << modelIndex << item;
949+ // Check we are not being taken down and don't paint anything
950+ // TODO Check if we still need this in 5.2
951+ // For reproduction just inifnite loop testDash or testDashContent
952+ if (!QQmlEngine::contextForObject(this)->parentContext())
953+ return;
954+
955+ item->setParentItem(m_clipItem);
956+ // FIXME Why do we need the refreshExpressions call?
957+ QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
958+ QQmlContextPrivate::get(context)->data->refreshExpressions();
959+ item->setProperty("heightToClip", QVariant::fromValue<int>(0));
960+ if (modelIndex == m_asyncRequestedIndex) {
961+ createItem(modelIndex, false);
962+ refill();
963+ }
964+}
965+
966+void ListViewWithPageHeader::updateClipItem()
967+{
968+ m_clipItem->setHeight(height() - m_headerItemShownHeight);
969+ m_clipItem->setY(contentY() + m_headerItemShownHeight);
970+ m_clipItem->setClip(!m_forceNoClip && m_headerItemShownHeight > 0);
971+}
972+
973+void ListViewWithPageHeader::onContentHeightChanged()
974+{
975+ updateClipItem();
976+}
977+
978+void ListViewWithPageHeader::onContentWidthChanged()
979+{
980+ m_clipItem->setWidth(contentItem()->width());
981+}
982+
983+void ListViewWithPageHeader::onHeightChanged()
984+{
985+ m_clipItem->setHeight(height() - m_headerItemShownHeight);
986+ polish();
987+}
988+
989+
990+void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool /*reset*/)
991+{
992+ // TODO Do something with reset
993+// qDebug() << "ListViewWithPageHeader::onModelUpdated" << changeSet << reset;
994+ const auto oldFirstVisibleIndex = m_firstVisibleIndex;
995+
996+ Q_FOREACH(const QQmlChangeSet::Change remove, changeSet.removes()) {
997+// qDebug() << "ListViewWithPageHeader::onModelUpdated Remove" << remove.index << remove.count;
998+ if (remove.index + remove.count > m_firstVisibleIndex && remove.index < m_firstVisibleIndex + m_visibleItems.count()) {
999+ const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
1000+ // If all the items we are removing are either not created or culled
1001+ // we have to grow down to avoid viewport changing
1002+ bool growDown = true;
1003+ for (int i = 0; growDown && i < remove.count; ++i) {
1004+ const int modelIndex = remove.index + i;
1005+ ListItem *item = itemAtIndex(modelIndex);
1006+ if (item && !item->culled()) {
1007+ growDown = false;
1008+ }
1009+ }
1010+ for (int i = remove.count - 1; i >= 0; --i) {
1011+ const int visibleIndex = remove.index + i - m_firstVisibleIndex;
1012+ if (visibleIndex >= 0 && visibleIndex < m_visibleItems.count()) {
1013+ ListItem *item = m_visibleItems[visibleIndex];
1014+ // Pass the section item down if needed
1015+ if (item->sectionItem() && visibleIndex + 1 < m_visibleItems.count()) {
1016+ ListItem *nextItem = m_visibleItems[visibleIndex + 1];
1017+ if (!nextItem->sectionItem()) {
1018+ nextItem->setSectionItem(item->sectionItem());
1019+ item->setSectionItem(nullptr);
1020+ }
1021+ }
1022+ releaseItem(item);
1023+ m_visibleItems.removeAt(visibleIndex);
1024+ }
1025+ }
1026+ if (growDown) {
1027+ adjustMinYExtent();
1028+ } else if (remove.index <= m_firstVisibleIndex && !m_visibleItems.isEmpty()) {
1029+ m_visibleItems.first()->setY(oldFirstValidIndexPos);
1030+ }
1031+ if (m_visibleItems.isEmpty()) {
1032+ m_firstVisibleIndex = -1;
1033+ } else {
1034+ m_firstVisibleIndex -= qMax(0, m_firstVisibleIndex - remove.index);
1035+ }
1036+ } else if (remove.index + remove.count <= m_firstVisibleIndex) {
1037+ m_firstVisibleIndex -= remove.count;
1038+ }
1039+ for (int i = remove.count - 1; i >= 0; --i) {
1040+ const int modelIndex = remove.index + i;
1041+ if (modelIndex == m_asyncRequestedIndex) {
1042+ m_asyncRequestedIndex = -1;
1043+ } else if (modelIndex < m_asyncRequestedIndex) {
1044+ m_asyncRequestedIndex--;
1045+ }
1046+ }
1047+ }
1048+
1049+ Q_FOREACH(const QQmlChangeSet::Change insert, changeSet.inserts()) {
1050+// qDebug() << "ListViewWithPageHeader::onModelUpdated Insert" << insert.index << insert.count;
1051+ const bool insertingInValidIndexes = insert.index > m_firstVisibleIndex && insert.index < m_firstVisibleIndex + m_visibleItems.count();
1052+ const bool firstItemWithViewOnTop = insert.index == 0 && m_firstVisibleIndex == 0 && m_visibleItems.first()->y() + m_clipItem->y() > contentY();
1053+ if (insertingInValidIndexes || firstItemWithViewOnTop)
1054+ {
1055+ // If the items we are adding won't be really visible
1056+ // we grow up instead of down to not change the viewport
1057+ bool growUp = false;
1058+ if (!firstItemWithViewOnTop) {
1059+ for (int i = 0; i < m_visibleItems.count(); ++i) {
1060+ if (!m_visibleItems[i]->culled()) {
1061+ if (insert.index <= m_firstVisibleIndex + i) {
1062+ growUp = true;
1063+ }
1064+ break;
1065+ }
1066+ }
1067+ }
1068+
1069+ const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
1070+ for (int i = insert.count - 1; i >= 0; --i) {
1071+ const int modelIndex = insert.index + i;
1072+ ListItem *item = createItem(modelIndex, false);
1073+ if (growUp) {
1074+ ListItem *firstItem = m_visibleItems.first();
1075+ firstItem->setY(firstItem->y() - item->height());
1076+ }
1077+ // Adding an item may break a "same section" chain, so check
1078+ // if we need adding a new section item
1079+ if (m_sectionDelegate) {
1080+ ListItem *nextItem = itemAtIndex(modelIndex + 1);
1081+ if (nextItem && !nextItem->sectionItem()) {
1082+ nextItem->setSectionItem(getSectionItem(modelIndex + 1, true /* alredy inserted into m_visibleItems*/));
1083+ if (growUp && nextItem->sectionItem()) {
1084+ ListItem *firstItem = m_visibleItems.first();
1085+ firstItem->setY(firstItem->y() - nextItem->sectionItem()->height());
1086+ }
1087+ }
1088+ }
1089+ }
1090+ if (firstItemWithViewOnTop) {
1091+ ListItem *firstItem = m_visibleItems.first();
1092+ firstItem->setY(oldFirstValidIndexPos);
1093+ }
1094+ adjustMinYExtent();
1095+ } else if (insert.index <= m_firstVisibleIndex) {
1096+ m_firstVisibleIndex += insert.count;
1097+ }
1098+
1099+ for (int i = insert.count - 1; i >= 0; --i) {
1100+ const int modelIndex = insert.index + i;
1101+ if (modelIndex <= m_asyncRequestedIndex) {
1102+ m_asyncRequestedIndex++;
1103+ }
1104+ }
1105+ }
1106+
1107+ Q_FOREACH(const QQmlChangeSet::Change change, changeSet.changes()) {
1108+ for (int i = change.start(); i < change.end(); ++i) {
1109+ updateSectionItem(i);
1110+ }
1111+ // Also update the section header for the next item after the change since it may be influenced
1112+ updateSectionItem(change.end());
1113+ }
1114+
1115+ if (m_firstVisibleIndex != oldFirstVisibleIndex) {
1116+ if (m_visibleItems.isEmpty()) {
1117+ initializeValuesForEmptyList();
1118+ } else {
1119+ adjustMinYExtent();
1120+ }
1121+ }
1122+
1123+ for (int i = 0; i < m_visibleItems.count(); ++i) {
1124+ ListItem *item = m_visibleItems[i];
1125+ if (item->sectionItem()) {
1126+ item->sectionItem()->setProperty("delegate", QVariant::fromValue(item->m_item));
1127+ }
1128+ }
1129+
1130+ layout();
1131+ polish();
1132+ m_contentHeightDirty = true;
1133+}
1134+
1135+void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
1136+{
1137+ setInteractive(!running);
1138+ if (!running) {
1139+ m_contentHeightDirty = true;
1140+ polish();
1141+ }
1142+}
1143+
1144+/*
1145+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1146+{
1147+ const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1148+ if (heightDiff != 0) {
1149+ if (!m_visibleItems.isEmpty()) {
1150+ ListItem *firstItem = m_visibleItems.first();
1151+ const auto prevFirstItemY = firstItem->y();
1152+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1153+ firstItem->setY(firstItem->y() - heightDiff);
1154+ } else if (item == firstItem->sectionItem()) {
1155+ firstItem->setY(firstItem->y() + heightDiff);
1156+ }
1157+
1158+ if (firstItem->y() != prevFirstItemY) {
1159+ adjustMinYExtent();
1160+ layout();
1161+ }
1162+ }
1163+ refill();
1164+ adjustMinYExtent();
1165+ polish();
1166+ m_contentHeightDirty = true;
1167+ }
1168+}
1169+*/
1170+
1171+void ListViewWithPageHeader::itemImplicitHeightChanged(QQuickItem *item)
1172+{
1173+ if (item == m_headerItem) {
1174+ const qreal diff = m_headerItem->implicitHeight() - m_previousHeaderImplicitHeight;
1175+ if (diff != 0) {
1176+ adjustHeader(diff);
1177+ m_previousHeaderImplicitHeight = m_headerItem->implicitHeight();
1178+ layout();
1179+ polish();
1180+ m_contentHeightDirty = true;
1181+ }
1182+ }
1183+}
1184+
1185+void ListViewWithPageHeader::headerHeightChanged(qreal newHeaderHeight, qreal oldHeaderHeight, qreal oldHeaderY)
1186+{
1187+ const qreal heightDiff = newHeaderHeight - oldHeaderHeight;
1188+ if (m_headerItemShownHeight > 0) {
1189+ // If the header is shown because of the clip
1190+ // Change its size
1191+ m_headerItemShownHeight += heightDiff;
1192+ m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, newHeaderHeight);
1193+ updateClipItem();
1194+ adjustMinYExtent();
1195+ Q_EMIT headerItemShownHeightChanged();
1196+ } else {
1197+ if (oldHeaderY + oldHeaderHeight > contentY()) {
1198+ // If the header is shown because its position
1199+ // Change its size
1200+ ListItem *firstItem = m_visibleItems.first();
1201+ firstItem->setY(firstItem->y() + heightDiff);
1202+ layout();
1203+ } else {
1204+ // If the header is not on screen, just change the start of the list
1205+ // so the viewport is not changed
1206+ adjustMinYExtent();
1207+ }
1208+ }
1209+}
1210+
1211+
1212+void ListViewWithPageHeader::adjustMinYExtent()
1213+{
1214+ if (m_visibleItems.isEmpty() || (contentHeight() + m_minYExtent < height())) {
1215+ m_minYExtent = 0;
1216+ } else {
1217+ qreal nonCreatedHeight = 0;
1218+ if (m_firstVisibleIndex != 0) {
1219+ // Calculate the average height of items to estimate the position of the list start
1220+ const int visibleItems = m_visibleItems.count();
1221+ qreal visibleItemsHeight = 0;
1222+ Q_FOREACH(ListItem *item, m_visibleItems) {
1223+ visibleItemsHeight += item->height();
1224+ }
1225+ nonCreatedHeight = m_firstVisibleIndex * visibleItemsHeight / visibleItems;
1226+// qDebug() << m_firstVisibleIndex << visibleItemsHeight << visibleItems << nonCreatedHeight;
1227+ }
1228+ const qreal headerHeight = (m_headerItem ? m_headerItem->implicitHeight() : 0);
1229+ m_minYExtent = nonCreatedHeight - m_visibleItems.first()->y() - m_clipItem->y() + headerHeight;
1230+ if (m_minYExtent != 0 && qFuzzyIsNull(m_minYExtent)) {
1231+ m_minYExtent = 0;
1232+ m_visibleItems.first()->setY(nonCreatedHeight - m_clipItem->y() + headerHeight);
1233+ }
1234+ }
1235+}
1236+
1237+ListViewWithPageHeader::ListItem *ListViewWithPageHeader::itemAtIndex(int modelIndex) const
1238+{
1239+ const int visibleIndexedModelIndex = modelIndex - m_firstVisibleIndex;
1240+ if (visibleIndexedModelIndex >= 0 && visibleIndexedModelIndex < m_visibleItems.count())
1241+ return m_visibleItems[visibleIndexedModelIndex];
1242+
1243+ return nullptr;
1244+}
1245+
1246+void ListViewWithPageHeader::layout()
1247+{
1248+ if (m_inLayout)
1249+ return;
1250+
1251+ m_inLayout = true;
1252+ if (!m_visibleItems.isEmpty()) {
1253+ const qreal visibleFrom = contentY() - m_clipItem->y() + m_headerItemShownHeight;
1254+ const qreal visibleTo = contentY() + height() - m_clipItem->y();
1255+
1256+ qreal pos = m_visibleItems.first()->y();
1257+
1258+// qDebug() << "ListViewWithPageHeader::layout Updating positions and heights. contentY" << contentY() << "minYExtent" << minYExtent();
1259+ int firstReallyVisibleItem = -1;
1260+ int modelIndex = m_firstVisibleIndex;
1261+ Q_FOREACH(ListItem *item, m_visibleItems) {
1262+ const bool cull = pos + item->height() <= visibleFrom || pos >= visibleTo;
1263+ item->setCulled(cull);
1264+ item->setY(pos);
1265+ if (!cull && firstReallyVisibleItem == -1) {
1266+ firstReallyVisibleItem = modelIndex;
1267+ if (m_topSectionItem) {
1268+ // Positing the top section sticky item is a two step process
1269+ // First we set it either we cull it (because it doesn't need to be sticked to the top)
1270+ // or stick it to the top
1271+ // Then after the loop we'll make sure that if there's another section just below it
1272+ // pushed the sticky section up to make it disappear
1273+ const qreal topSectionStickPos = m_headerItemShownHeight + contentY() - m_clipItem->y();
1274+ bool showStickySectionItem;
1275+ // We need to show the "top section sticky item" when the position at the "top" of the
1276+ // viewport is bigger than the start of the position of the first visible item
1277+ // i.e. the first visible item starts before the viewport, or when the first
1278+ // visible item starts just at the viewport start and it does not have its own section item
1279+ if (topSectionStickPos > pos) {
1280+ showStickySectionItem = true;
1281+ } else if (topSectionStickPos == pos) {
1282+ showStickySectionItem = !item->sectionItem();
1283+ } else {
1284+ showStickySectionItem = false;
1285+ }
1286+ if (!showStickySectionItem) {
1287+ QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
1288+ if (item->sectionItem()) {
1289+ // This seems it should happen since why would we cull the top section
1290+ // if the first visible item has no section header? This only happens briefly
1291+ // when increasing the height of a list that is at the bottom, the m_topSectionItem
1292+ // gets shown shortly in the next polish call
1293+ QQuickItemPrivate::get(item->sectionItem())->setCulled(false);
1294+ }
1295+ } else {
1296+ // Update the top sticky section header
1297+ const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
1298+ m_topSectionItem->setProperty("text", section);
1299+
1300+ QQuickItemPrivate::get(m_topSectionItem)->setCulled(false);
1301+ m_topSectionItem->setY(topSectionStickPos);
1302+ m_topSectionItem->setProperty("delegate", QVariant::fromValue(item->m_item));
1303+ if (item->sectionItem()) {
1304+ QQuickItemPrivate::get(item->sectionItem())->setCulled(true);
1305+ }
1306+ }
1307+ }
1308+ }
1309+ const qreal clipFrom = visibleFrom + (!item->sectionItem() && m_topSectionItem && !QQuickItemPrivate::get(m_topSectionItem)->culled ? m_topSectionItem->height() : 0);
1310+ if (!cull && pos < clipFrom) {
1311+ item->m_item->setProperty("heightToClip", clipFrom - pos);
1312+ } else {
1313+ item->m_item->setProperty("heightToClip", QVariant::fromValue<int>(0));
1314+ }
1315+// qDebug() << "ListViewWithPageHeader::layout" << item->m_item;
1316+ pos += item->height();
1317+ ++modelIndex;
1318+ }
1319+
1320+ // Second step of section sticky item positioning
1321+ // Look at the next section header, check if it's pushing up the sticky one
1322+ if (m_topSectionItem) {
1323+ if (firstReallyVisibleItem >= 0) {
1324+ for (int i = firstReallyVisibleItem - m_firstVisibleIndex + 1; i < m_visibleItems.count(); ++i) {
1325+ ListItem *item = m_visibleItems[i];
1326+ if (item->sectionItem()) {
1327+ if (m_topSectionItem->y() + m_topSectionItem->height() > item->y()) {
1328+ m_topSectionItem->setY(item->y() - m_topSectionItem->height());
1329+ }
1330+ break;
1331+ }
1332+ }
1333+ }
1334+ }
1335+ }
1336+ if (m_headerItem) {
1337+ const bool cullHeader = m_headerItem->y() + m_headerItem->height() < contentY();
1338+ QQuickItemPrivate::get(m_headerItem)->setCulled(cullHeader);
1339+ }
1340+ m_inLayout = false;
1341+}
1342+
1343+void ListViewWithPageHeader::updatePolish()
1344+{
1345+ // Check we are not being taken down and don't paint anything
1346+ // TODO Check if we still need this in 5.2
1347+ // For reproduction just inifnite loop testDash or testDashContent
1348+ if (!QQmlEngine::contextForObject(this)->parentContext())
1349+ return;
1350+
1351+ Q_FOREACH(ListItem *item, m_itemsToRelease)
1352+ reallyReleaseItem(item);
1353+ m_itemsToRelease.clear();
1354+
1355+ if (!model())
1356+ return;
1357+
1358+ layout();
1359+
1360+ refill();
1361+
1362+ if (m_contentHeightDirty) {
1363+ qreal contentHeight;
1364+ if (m_visibleItems.isEmpty()) {
1365+ contentHeight = m_headerItem ? m_headerItem->height() : 0;
1366+ } else {
1367+ const int modelCount = model()->rowCount();
1368+ const int visibleItems = m_visibleItems.count();
1369+ const int lastValidIndex = m_firstVisibleIndex + visibleItems - 1;
1370+ qreal nonCreatedHeight = 0;
1371+ if (lastValidIndex != modelCount - 1) {
1372+ const int visibleItems = m_visibleItems.count();
1373+ qreal visibleItemsHeight = 0;
1374+ Q_FOREACH(ListItem *item, m_visibleItems) {
1375+ visibleItemsHeight += item->height();
1376+ }
1377+ const int unknownSizes = modelCount - (m_firstVisibleIndex + visibleItems);
1378+ nonCreatedHeight = unknownSizes * visibleItemsHeight / visibleItems;
1379+ }
1380+ ListItem *item = m_visibleItems.last();
1381+ contentHeight = nonCreatedHeight + item->y() + item->height() + m_clipItem->y();
1382+ if (m_firstVisibleIndex != 0) {
1383+ // Make sure that if we are shrinking we tell the view we still fit
1384+ m_minYExtent = qMax(m_minYExtent, -(contentHeight - height()));
1385+ }
1386+ }
1387+
1388+ m_contentHeightDirty = false;
1389+ adjustMinYExtent();
1390+ m_inContentHeightKeepHeaderShown = m_headerItem && m_headerItem->y() == contentY();
1391+ setContentHeight(contentHeight);
1392+ m_inContentHeightKeepHeaderShown = false;
1393+ }
1394+}
1395+
1396+#include "moc_listviewwithpageheader.cpp"
plugins/Dash/listviewwithpageheader.hnew file+218
@@ -0,0 +1,218 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef LISTVIEWWITHPAGEHEADER_H
18+#define LISTVIEWWITHPAGEHEADER_H
19+
20+#include <private/qquickitemchangelistener_p.h>
21+#include <private/qquickflickable_p.h>
22+
23+class QAbstractItemModel;
24+class QQuickNumberAnimation;
25+class QQmlChangeSet;
26+class QQmlDelegateModel;
27+
28+
29+/**
30+ Note for users of this class
31+
32+ ListViewWithPageHeader already loads delegates async when appropiate so if
33+ your delegate uses a Loader you should not enable the asynchronous feature since
34+ that will need to introduce sizing problems
35+
36+ With the double async it may happen what while we are scrolling down
37+ we reach to a point where given the size of the just created delegate with loader not yet loaded (which will be very close to 0)
38+ we are already "at the end" of the list, but then a few milliseconds later the loader finishes loading and we could
39+ have kept scrolling. This is specially visible at the end of the list where you realize
40+ that scrolling ended a bit before the end of the list but the speed of the flicking was good
41+ to reach the end
42+
43+ By not having the second async we get a better sizing when the delegate is created and things work better
44+*/
45+
46+class ListViewWithPageHeader : public QQuickFlickable, public QQuickItemChangeListener
47+{
48+ Q_OBJECT
49+ Q_PROPERTY(QAbstractItemModel *model READ model WRITE setModel NOTIFY modelChanged)
50+ Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
51+ Q_PROPERTY(QQuickItem *pageHeader READ header WRITE setHeader NOTIFY headerChanged)
52+ Q_PROPERTY(QQmlComponent *sectionDelegate READ sectionDelegate WRITE setSectionDelegate NOTIFY sectionDelegateChanged)
53+ Q_PROPERTY(QString sectionProperty READ sectionProperty WRITE setSectionProperty NOTIFY sectionPropertyChanged)
54+ Q_PROPERTY(bool forceNoClip READ forceNoClip WRITE setForceNoClip NOTIFY forceNoClipChanged)
55+ Q_PROPERTY(int stickyHeaderHeight READ stickyHeaderHeight NOTIFY stickyHeaderHeightChanged)
56+ Q_PROPERTY(qreal headerItemShownHeight READ headerItemShownHeight NOTIFY headerItemShownHeightChanged)
57+ Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
58+
59+ friend class ListViewWithPageHeaderTest;
60+ friend class ListViewWithPageHeaderTestSection;
61+ friend class ListViewWithPageHeaderTestExternalModel;
62+
63+public:
64+ ListViewWithPageHeader();
65+ ~ListViewWithPageHeader();
66+
67+ QAbstractItemModel *model() const;
68+ void setModel(QAbstractItemModel *model);
69+
70+ QQmlComponent *delegate() const;
71+ void setDelegate(QQmlComponent *delegate);
72+
73+ QQuickItem *header() const;
74+ void setHeader(QQuickItem *header);
75+
76+ QQmlComponent *sectionDelegate() const;
77+ void setSectionDelegate(QQmlComponent *delegate);
78+
79+ QString sectionProperty() const;
80+ void setSectionProperty(const QString &property);
81+
82+ bool forceNoClip() const;
83+ void setForceNoClip(bool noClip);
84+
85+ int stickyHeaderHeight() const;
86+ qreal headerItemShownHeight() const;
87+
88+ int cacheBuffer() const;
89+ void setCacheBuffer(int cacheBuffer);
90+
91+ Q_INVOKABLE void positionAtBeginning();
92+ Q_INVOKABLE void showHeader();
93+ Q_INVOKABLE int firstCreatedIndex() const;
94+ Q_INVOKABLE int createdItemCount() const;
95+ Q_INVOKABLE QQuickItem *item(int modelIndex) const;
96+
97+ // The index has to be created for this to try to do something
98+ // Created items are those visible and the precached ones
99+ // Returns if the item existed or not
100+ Q_INVOKABLE bool maximizeVisibleArea(int modelIndex);
101+ Q_INVOKABLE bool maximizeVisibleArea(int modelIndex, int itemHeight);
102+
103+Q_SIGNALS:
104+ void modelChanged();
105+ void delegateChanged();
106+ void headerChanged();
107+ void sectionDelegateChanged();
108+ void sectionPropertyChanged();
109+ void forceNoClipChanged();
110+ void stickyHeaderHeightChanged();
111+ void headerItemShownHeightChanged();
112+ void cacheBufferChanged();
113+
114+protected:
115+ void componentComplete() override;
116+ void viewportMoved(Qt::Orientations orient) override;
117+ qreal minYExtent() const override;
118+ qreal maxYExtent() const override;
119+ //void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
120+ void itemImplicitHeightChanged(QQuickItem *item) override;
121+ void updatePolish() override;
122+
123+private Q_SLOTS:
124+ void itemCreated(int modelIndex, QObject *object);
125+ void onContentHeightChanged();
126+ void onContentWidthChanged();
127+ void onHeightChanged();
128+ void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
129+ void contentYAnimationRunningChanged(bool running);
130+
131+private:
132+ class ListItem
133+ {
134+ public:
135+ qreal height() const;
136+
137+ qreal y() const;
138+ void setY(qreal newY);
139+
140+ bool culled() const;
141+ void setCulled(bool culled);
142+
143+ QQuickItem *sectionItem() const { return m_sectionItem; }
144+ void setSectionItem(QQuickItem *sectionItem);
145+
146+ QQuickItem *m_item;
147+ private:
148+ QQuickItem *m_sectionItem;
149+ };
150+
151+ bool maximizeVisibleArea(ListItem *listItem, int listItemHeight);
152+
153+ void createDelegateModel();
154+
155+ void layout();
156+ void refill();
157+ bool addVisibleItems(qreal fillFrom, qreal fillTo, bool asynchronous);
158+ bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo);
159+ ListItem *createItem(int modelIndex, bool asynchronous);
160+
161+ void adjustHeader(qreal diff);
162+ void adjustMinYExtent();
163+ void updateClipItem();
164+ void headerHeightChanged(qreal newHeaderHeight, qreal oldHeaderHeight, qreal oldHeaderY);
165+ ListItem *itemAtIndex(int modelIndex) const; // Returns the item at modelIndex if has been created
166+ void releaseItem(ListItem *item);
167+ void reallyReleaseItem(ListItem *item);
168+ void updateWatchedRoles();
169+ QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
170+ QQuickItem *getSectionItem(const QString &sectionText, bool watchGeometry = true);
171+ void updateSectionItem(int modelIndex);
172+ void initializeValuesForEmptyList();
173+
174+ QQmlDelegateModel *m_delegateModel;
175+
176+ // Index we are waiting because we requested it asynchronously
177+ int m_asyncRequestedIndex;
178+
179+ // Used to only give a warning once if the delegate does not return objects
180+ bool m_delegateValidated;
181+
182+ // Visible indexes, [0] is m_firstValidIndex, [0+1] is m_firstValidIndex +1, ...
183+ QList<ListItem *> m_visibleItems;
184+ int m_firstVisibleIndex;
185+
186+ qreal m_minYExtent;
187+
188+ QQuickItem *m_clipItem;
189+
190+ // If any of the heights has changed
191+ // or new items have been added/removed
192+ bool m_contentHeightDirty;
193+
194+ QQuickItem *m_headerItem;
195+ qreal m_previousContentY;
196+ qreal m_previousHeaderImplicitHeight;
197+ qreal m_headerItemShownHeight; // The height of header shown when the header is shown outside its topmost position
198+ // i.e. it's being shown after dragging down in the middle of the list
199+ enum ContentYAnimationType { ContentYAnimationShowHeader, ContentYAnimationMaximizeVisibleArea };
200+ ContentYAnimationType contentYAnimationType;
201+ QQuickNumberAnimation *m_contentYAnimation;
202+
203+ QQmlComponent *m_sectionDelegate;
204+ QString m_sectionProperty;
205+ QQuickItem *m_topSectionItem;
206+
207+ bool m_forceNoClip;
208+ bool m_inLayout;
209+ bool m_inContentHeightKeepHeaderShown;
210+ int m_cacheBuffer;
211+
212+ // Qt 5.0 doesn't like releasing the items just after itemCreated
213+ // so we delay the releasing until the next updatePolish
214+ QList<ListItem *> m_itemsToRelease;
215+};
216+
217+
218+#endif
plugins/Dash/organicgrid.cppnew file+259
@@ -0,0 +1,259 @@
1+/*
2+ * Copyright (C) 2014, 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 "organicgrid.h"
18+
19+#include <math.h>
20+
21+#include <private/qquickitem_p.h>
22+
23+OrganicGrid::OrganicGrid()
24+ : m_firstVisibleIndex(-1)
25+ , m_numberOfModulesPerRow(-1)
26+{
27+}
28+
29+QSizeF OrganicGrid::smallDelegateSize() const
30+{
31+ return m_smallDelegateSize;
32+}
33+
34+void OrganicGrid::setSmallDelegateSize(const QSizeF size)
35+{
36+ if (m_smallDelegateSize != size) {
37+ m_smallDelegateSize = size;
38+ Q_EMIT smallDelegateSizeChanged();
39+
40+ if (isComponentComplete()) {
41+ relayout();
42+ }
43+ }
44+}
45+
46+QSizeF OrganicGrid::bigDelegateSize() const
47+{
48+ return m_bigDelegateSize;
49+}
50+
51+void OrganicGrid::setBigDelegateSize(const QSizeF size)
52+{
53+ if (m_bigDelegateSize != size) {
54+ m_bigDelegateSize = size;
55+ Q_EMIT bigDelegateSizeChanged();
56+
57+ if (isComponentComplete()) {
58+ relayout();
59+ }
60+ }
61+}
62+
63+QPointF OrganicGrid::positionForIndex(int modelIndex) const
64+{
65+ const qreal moduleHeight = m_smallDelegateSize.height() + rowSpacing() + m_bigDelegateSize.height();
66+ const qreal moduleWidth = m_smallDelegateSize.width() * 2 + columnSpacing() * 2 + m_bigDelegateSize.width();
67+ const int itemsPerRow = m_numberOfModulesPerRow * 6;
68+ const int rowIndex = floor(modelIndex / itemsPerRow);
69+ const int columnIndex = floor((modelIndex - rowIndex * itemsPerRow) / 6);
70+
71+ qreal yPos = (moduleHeight + rowSpacing()) * rowIndex;
72+ const int moduleIndex = modelIndex % 6;
73+ if (moduleIndex == 2) {
74+ yPos += m_smallDelegateSize.height() + rowSpacing();
75+ } else if (moduleIndex == 3 || moduleIndex == 5) {
76+ yPos += m_bigDelegateSize.height() + rowSpacing();
77+ }
78+
79+ qreal xPos = (moduleWidth + columnSpacing()) * columnIndex;
80+ if (moduleIndex == 1) {
81+ xPos += m_smallDelegateSize.width() + columnSpacing();
82+ } else if (moduleIndex == 3) {
83+ xPos += m_bigDelegateSize.width() + columnSpacing();
84+ } else if (moduleIndex == 4) {
85+ xPos += (m_smallDelegateSize.width() + columnSpacing()) * 2;
86+ } else if (moduleIndex == 5) {
87+ xPos += m_bigDelegateSize.width() + m_smallDelegateSize.width() + columnSpacing() * 2;
88+ }
89+
90+ return QPointF(xPos, yPos);
91+}
92+
93+QSizeF OrganicGrid::sizeForIndex(int modelIndex) const
94+{
95+ const int moduleIndex = modelIndex % 6;
96+ if (moduleIndex == 0 || moduleIndex == 1 || moduleIndex == 3 || moduleIndex == 5) {
97+ return m_smallDelegateSize;
98+ } else {
99+ return m_bigDelegateSize;
100+ }
101+}
102+
103+void OrganicGrid::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
104+{
105+ if (m_visibleItems.isEmpty()) {
106+ *modelIndex = 0;
107+ *yPos = 0;
108+ } else {
109+ *modelIndex = m_firstVisibleIndex + m_visibleItems.count();
110+ // We create stuff in a 6-module basis, so always return back
111+ // the y position of the first item
112+ const int firstModuleIndex = ((*modelIndex) / 6) * 6;
113+ *yPos = positionForIndex(firstModuleIndex).y();
114+ }
115+}
116+
117+void OrganicGrid::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
118+{
119+ if (m_visibleItems.isEmpty()) {
120+ *modelIndex = 0;
121+ *yPos = 0;
122+ } else {
123+ *modelIndex = m_firstVisibleIndex - 1;
124+ // We create stuff in a 6-module basis, so always return back
125+ // the y position of the last item bottom
126+ const int lastModuleIndex = ((*modelIndex) / 6) * 6 + 5;
127+ *yPos = positionForIndex(lastModuleIndex).y();
128+ *yPos += sizeForIndex(lastModuleIndex).height();
129+ }
130+}
131+
132+void OrganicGrid::addItemToView(int modelIndex, QQuickItem *item)
133+{
134+ // modelIndex has to be either m_firstVisibleIndex - 1 or m_firstVisibleIndex + m_visibleItems.count() or the first
135+ if (modelIndex == m_firstVisibleIndex + m_visibleItems.count()) {
136+ m_visibleItems << item;
137+ } else if (modelIndex == m_firstVisibleIndex - 1) {
138+ m_firstVisibleIndex = modelIndex;
139+ m_visibleItems.prepend(item);
140+ } else if (modelIndex == 0) {
141+ m_firstVisibleIndex = 0;
142+ m_visibleItems << item;
143+ } else {
144+ qWarning() << "OrganicGrid::addItemToView - Got unexpected modelIndex"
145+ << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
146+ return;
147+ }
148+
149+ const QPointF pos = positionForIndex(modelIndex);
150+ item->setPosition(pos);
151+
152+ item->setSize(sizeForIndex(modelIndex));
153+}
154+
155+bool OrganicGrid::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
156+{
157+ bool changed = false;
158+
159+ // As adding, we also remove in a 6-module basis
160+ int lastModuleIndex = (m_firstVisibleIndex / 6) * 6 + 5;
161+ bool removeIndex = positionForIndex(lastModuleIndex).y() + sizeForIndex(lastModuleIndex).height() < bufferFromY;
162+ while (removeIndex && !m_visibleItems.isEmpty()) {
163+ releaseItem(m_visibleItems.takeFirst());
164+ changed = true;
165+ m_firstVisibleIndex++;
166+
167+ lastModuleIndex = (m_firstVisibleIndex / 6) * 6 + 5;
168+ removeIndex = positionForIndex(lastModuleIndex).y() + sizeForIndex(lastModuleIndex).height() < bufferFromY;
169+ }
170+
171+ int firstModuleIndex = ((m_firstVisibleIndex + m_visibleItems.count() - 1) / 6) * 6;
172+ removeIndex = positionForIndex(firstModuleIndex).y() > bufferToY;
173+ while (removeIndex && !m_visibleItems.isEmpty()) {
174+ releaseItem(m_visibleItems.takeLast());
175+ changed = true;
176+
177+ firstModuleIndex = ((m_firstVisibleIndex + m_visibleItems.count() - 1) / 6) * 6;
178+ removeIndex = positionForIndex(firstModuleIndex).y() > bufferToY;
179+ }
180+
181+ if (m_visibleItems.isEmpty()) {
182+ m_firstVisibleIndex = -1;
183+ }
184+
185+ return changed;
186+}
187+
188+void OrganicGrid::cleanupExistingItems()
189+{
190+ Q_FOREACH(QQuickItem *item, m_visibleItems)
191+ releaseItem(item);
192+ m_visibleItems.clear();
193+ m_firstVisibleIndex = -1;
194+ setImplicitHeightDirty();
195+}
196+
197+void OrganicGrid::doRelayout()
198+{
199+ const qreal moduleWidth = m_smallDelegateSize.width() * 2 + columnSpacing() * 2 + m_bigDelegateSize.width();
200+ m_numberOfModulesPerRow = floor((width() + columnSpacing()) / (moduleWidth + columnSpacing()));
201+ m_numberOfModulesPerRow = qMax(1, m_numberOfModulesPerRow);
202+
203+ int i = m_firstVisibleIndex;
204+ const QList<QQuickItem*> allItems = m_visibleItems;
205+ m_visibleItems.clear();
206+ Q_FOREACH(QQuickItem *item, allItems) {
207+ addItemToView(i, item);
208+ ++i;
209+ }
210+}
211+
212+void OrganicGrid::updateItemCulling(qreal visibleFromY, qreal visibleToY)
213+{
214+ Q_FOREACH(QQuickItem *item, m_visibleItems) {
215+ QQuickItemPrivate::get(item)->setCulled(item->y() + item->height() <= visibleFromY || item->y() >= visibleToY);
216+ }
217+}
218+
219+void OrganicGrid::calculateImplicitHeight()
220+{
221+ const qreal moduleHeight = m_smallDelegateSize.height() + rowSpacing() + m_bigDelegateSize.height();
222+ const int itemCount = !model() ? 0 : model()->rowCount();
223+ const int itemsPerRow = m_numberOfModulesPerRow * 6;
224+ const int fullRows = floor(itemCount / itemsPerRow);
225+ const qreal fullRowsHeight = fullRows == 0 ? 0 : fullRows * moduleHeight + rowSpacing() * (fullRows - 1);
226+
227+ const int remainingItems = itemCount - fullRows * itemsPerRow;
228+ if (remainingItems == 0) {
229+ setImplicitHeight(fullRowsHeight);
230+ } else if (remainingItems <= 2) {
231+ setImplicitHeight(fullRowsHeight + m_smallDelegateSize.height() + rowSpacing());
232+ } else {
233+ setImplicitHeight(fullRowsHeight + rowSpacing() + moduleHeight);
234+ }
235+}
236+
237+void OrganicGrid::processModelRemoves(const QVector<QQmlChangeSet::Change> &removes)
238+{
239+ Q_FOREACH(const QQmlChangeSet::Change remove, removes) {
240+ for (int i = remove.count - 1; i >= 0; --i) {
241+ const int indexToRemove = remove.index + i;
242+ // We only support removing from the end
243+ const int lastIndex = m_firstVisibleIndex + m_visibleItems.count() - 1;
244+ if (indexToRemove == lastIndex) {
245+ releaseItem(m_visibleItems.takeLast());
246+ } else {
247+ if (indexToRemove < lastIndex) {
248+ qDebug() << "OrganicGrid only supports removal from the end of the model, resetting instead";
249+ cleanupExistingItems();
250+ break;
251+ }
252+ }
253+ }
254+ }
255+ if (m_visibleItems.isEmpty()) {
256+ m_firstVisibleIndex = -1;
257+ }
258+ setImplicitHeightDirty();
259+}
plugins/Dash/organicgrid.hnew file+91
@@ -0,0 +1,91 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef ORGANICGRID_H
18+#define ORGANICGRID_H
19+
20+#include "abstractdashview.h"
21+
22+ /** An Organic Grid is is a view that creates delegates
23+ * based on a model and layouts them in groups of six items (called module).
24+ *
25+ * In each module there are 4 items that are forced to the small delegate size
26+ * and two that are forced to the big delegate size.
27+ *
28+ * Example:
29+ *
30+ * +---+ +---+ +-----+
31+ * | 1 | | 2 | | |
32+ * +---+ +---+ | 5 |
33+ * +-----+ | |
34+ * | | +-----+
35+ * | 3 | +---+ +---+
36+ * | | | 4 | | 6 |
37+ * +-----+ +---+ +---+
38+ *
39+ * Modules are positioned one after the other in a grid like fashion, i.e.
40+ *
41+ * +---+ +---+
42+ * | 1 | | 2 |
43+ * +---+ +---+
44+ * +---+ +---+
45+ * | 3 | | 4 |
46+ * +---+ +---+
47+ */
48+
49+class OrganicGrid : public AbstractDashView
50+{
51+ Q_OBJECT
52+
53+ Q_PROPERTY(QSizeF smallDelegateSize READ smallDelegateSize WRITE setSmallDelegateSize NOTIFY smallDelegateSizeChanged)
54+ Q_PROPERTY(QSizeF bigDelegateSize READ bigDelegateSize WRITE setBigDelegateSize NOTIFY bigDelegateSizeChanged)
55+
56+friend class OrganicGridTest;
57+
58+public:
59+ OrganicGrid();
60+
61+ QSizeF smallDelegateSize() const;
62+ void setSmallDelegateSize(const QSizeF size);
63+
64+ QSizeF bigDelegateSize() const;
65+ void setBigDelegateSize(const QSizeF size);
66+
67+Q_SIGNALS:
68+ void smallDelegateSizeChanged();
69+ void bigDelegateSizeChanged();
70+private:
71+ QPointF positionForIndex(int modelIndex) const;
72+ QSizeF sizeForIndex(int modelIndex) const;
73+
74+ void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
75+ void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
76+ void addItemToView(int modelIndex, QQuickItem *item) override;
77+ bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
78+ void cleanupExistingItems() override;
79+ void doRelayout() override;
80+ void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
81+ void calculateImplicitHeight() override;
82+ void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) override;
83+
84+ QSizeF m_smallDelegateSize;
85+ QSizeF m_bigDelegateSize;
86+ int m_firstVisibleIndex;
87+ int m_numberOfModulesPerRow;
88+ QList<QQuickItem*> m_visibleItems;
89+};
90+
91+#endif
plugins/Dash/plugin.cppnew file+70
@@ -0,0 +1,70 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#include "plugin.h"
19+
20+#include "horizontaljournal.h"
21+#include "listviewwithpageheader.h"
22+#include "organicgrid.h"
23+#include "verticaljournal.h"
24+
25+#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+}
58+
59+void DashPlugin::registerTypes(const char *uri)
60+{
61+ Q_ASSERT(uri == QLatin1String("Dash"));
62+ qmlRegisterType<QAbstractItemModel>();
63+ qmlRegisterType<HorizontalJournal>(uri, 0, 1, "HorizontalJournal");
64+ qmlRegisterType<ListViewWithPageHeader>(uri, 0, 1, "ListViewWithPageHeader");
65+ qmlRegisterType<OrganicGrid>(uri, 0, 1, "OrganicGrid");
66+ qmlRegisterType<VerticalJournal>(uri, 0, 1, "VerticalJournal");
67+ qmlRegisterSingletonType<AudioComparer>(uri, 0, 1, "AudioUrlComparer", audio_comparer_singleton_provider);
68+}
69+
70+#include "plugin.moc"
plugins/Lights/HfdLights.h → plugins/Dash/plugin.hrenamed+8−17
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2021 UBports Foundation.
2+ * Copyright (C) 2012 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -13,30 +13,21 @@
13 * You should have received a copy of the GNU General Public License
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/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
15 *
16− * Author: Florian Leeber <florian@ubports.com>
17 */
16 */
18
17
19−#ifndef UNITY_HFDLIGHTS_H
18+#ifndef DASH_PLUGIN_H
20−#define UNITY_HFDLIGHTS_H
19+#define DASH_PLUGIN_H
21
20
22−#include <QtCore/QObject>
21+#include <QtQml/QQmlEngine>
23−#include <QDBusInterface>
22+#include <QtQml/QQmlExtensionPlugin>
24−#include "Lights.h"
25
23
26−class HfdLights: public Lights
24+class DashPlugin : public QQmlExtensionPlugin
27{
25{
28 Q_OBJECT
26 Q_OBJECT
27+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
28
30public:
29public:
31− explicit HfdLights(QObject *parent = 0);
30+ void registerTypes(const char *uri) override;
32−
33−protected:
34− bool init() override;
35− void turnOff() override;
36− void turnOn() override;
37−
38−private:
39− QDBusInterface* m_hfdInterface;
40};
31};
41
32
42#endif
33#endif
plugins/Dash/qmldirnew file+11
@@ -0,0 +1,11 @@
1+module Dash
2+plugin Dash-qml
3+typeinfo Dash.qmltypes
4+singleton CardCreatorCache 0.1 CardCreatorCache.qml
5+singleton DashAudioPlayer 0.1 DashAudioPlayer.qml
6+ScopeStyle 0.1 ScopeStyle.qml
7+CardAttributes 0.1 CardAttributes.qml
8+CardSocialActions 0.1 CardSocialActions.qml
9+CroppedImageMinimumSourceSize 0.1 CroppedImageMinimumSourceSize.qml
10+AudioProgressBar 0.1 AudioProgressBar.qml
11+CardAudioProgress 0.1 CardAudioProgress.qml
plugins/Dash/verticaljournal.cppnew file+281
@@ -0,0 +1,281 @@
1+/*
2+ * Copyright (C) 2013, 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+/*
18+ * The implementation is centered around m_columnVisibleItems
19+ * that holds a vector of lists. There's a list for each of the
20+ * columns the view has. In the list the items of the column are
21+ * ordered as they appear topdown in the view. m_indexColumnMap is
22+ * used when re-building the list up since given a position
23+ * in the middle of the list and the need to create the previous does
24+ * not give us enough information to know in which column we have
25+ * to position the item so that when we reach the item the view is
26+ * correctly layouted at 0 for all the columns
27+ */
28+#include "verticaljournal.h"
29+
30+#include <math.h>
31+
32+#include <private/qquickitem_p.h>
33+
34+VerticalJournal::VerticalJournal()
35+ : m_columnWidth(0)
36+{
37+}
38+
39+qreal VerticalJournal::columnWidth() const
40+{
41+ return m_columnWidth;
42+}
43+
44+void VerticalJournal::setColumnWidth(qreal columnWidth)
45+{
46+ if (columnWidth != m_columnWidth) {
47+ m_columnWidth = columnWidth;
48+ Q_EMIT columnWidthChanged();
49+
50+ if (isComponentComplete()) {
51+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
52+ Q_FOREACH(const ViewItem item, column) {
53+ item.m_item->setWidth(columnWidth);
54+ }
55+ }
56+ relayout();
57+ }
58+ }
59+}
60+
61+void VerticalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
62+{
63+ *modelIndex = 0;
64+ *yPos = std::numeric_limits<qreal>::max();
65+
66+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
67+ if (!column.isEmpty()) {
68+ const ViewItem &item = column.last();
69+ *yPos = qMin(*yPos, item.y() + item.height() + rowSpacing());
70+ *modelIndex = qMax(*modelIndex, item.m_modelIndex + 1);
71+ } else {
72+ *yPos = 0;
73+ }
74+ }
75+}
76+
77+void VerticalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
78+{
79+ *modelIndex = 0;
80+ *yPos = std::numeric_limits<qreal>::lowest();
81+ int columnToAddTo = -1;
82+
83+ // Find the topmost free column
84+ for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
85+ const auto &column = m_columnVisibleItems[i];
86+ if (!column.isEmpty()) {
87+ const ViewItem &item = column.first();
88+ const auto itemTopPos = item.y() - rowSpacing();
89+ if (itemTopPos > *yPos) {
90+ *yPos = itemTopPos;
91+ *modelIndex = item.m_modelIndex - 1;
92+ columnToAddTo = i;
93+ }
94+ }
95+ }
96+
97+ if (*modelIndex > 0) {
98+ Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
99+ while (*modelIndex > 0 && m_indexColumnMap[*modelIndex] != columnToAddTo) {
100+ // We found out that we have to add to columnToAddTo
101+ // and thought that we had to add *modelIndex, but history tells
102+ // it is not correct, so find up from *modelIndex until we found the index
103+ // that has to end up in columnToAddTo
104+ *modelIndex = *modelIndex - 1;
105+ Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
106+ }
107+ }
108+}
109+
110+bool VerticalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
111+{
112+ bool changed = false;
113+
114+ for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
115+ QList<ViewItem> &column = m_columnVisibleItems[i];
116+ while (!column.isEmpty() && column.first().y() + column.first().height() < bufferFromY) {
117+ releaseItem(column.takeFirst().m_item);
118+ changed = true;
119+ }
120+
121+ while (!column.isEmpty() && column.last().y() > bufferToY) {
122+ releaseItem(column.takeLast().m_item);
123+ changed = true;
124+ }
125+ }
126+
127+ return changed;
128+}
129+
130+void VerticalJournal::addItemToView(int modelIndex, QQuickItem *item)
131+{
132+ if (item->width() != m_columnWidth) {
133+ qWarning() << "Item" << modelIndex << "width is not the one that the columnWidth mandates, resetting it";
134+ item->setWidth(m_columnWidth);
135+ }
136+
137+ // Check if we add it to the bottom of existing column items
138+ const QList<ViewItem> &firstColumn = m_columnVisibleItems[0];
139+ qreal columnToAddY = !firstColumn.isEmpty() ? firstColumn.last().y() + firstColumn.last().height() : -rowSpacing();
140+ int columnToAddTo = 0;
141+ for (int i = 1; i < m_columnVisibleItems.count(); ++i) {
142+ const QList<ViewItem> &column = m_columnVisibleItems[i];
143+ const qreal iY = !column.isEmpty() ? column.last().y() + column.last().height() : -rowSpacing();
144+ if (iY < columnToAddY) {
145+ columnToAddTo = i;
146+ columnToAddY = iY;
147+ }
148+ }
149+
150+ const QList<ViewItem> &columnToAdd = m_columnVisibleItems[columnToAddTo];
151+ if (columnToAdd.isEmpty() || columnToAdd.last().m_modelIndex < modelIndex) {
152+ item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
153+ item->setY(columnToAddY + rowSpacing());
154+
155+ m_columnVisibleItems[columnToAddTo] << ViewItem(item, modelIndex);
156+ m_indexColumnMap[modelIndex] = columnToAddTo;
157+ } else {
158+ Q_ASSERT(m_indexColumnMap.contains(modelIndex));
159+ columnToAddTo = m_indexColumnMap[modelIndex];
160+ columnToAddY = m_columnVisibleItems[columnToAddTo].first().y();
161+
162+ item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
163+ item->setY(columnToAddY - rowSpacing() - item->height());
164+
165+ m_columnVisibleItems[columnToAddTo].prepend(ViewItem(item, modelIndex));
166+ }
167+}
168+
169+void VerticalJournal::cleanupExistingItems()
170+{
171+ // Cleanup the existing items
172+ for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
173+ QList<ViewItem> &column = m_columnVisibleItems[i];
174+ Q_FOREACH(const ViewItem item, column)
175+ releaseItem(item.m_item);
176+ column.clear();
177+ }
178+ m_indexColumnMap.clear();
179+ setImplicitHeightDirty();
180+}
181+
182+void VerticalJournal::calculateImplicitHeight()
183+{
184+ int lastModelIndex = -1;
185+ qreal bottomMostY = 0;
186+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
187+ if (!column.isEmpty()) {
188+ const ViewItem &item = column.last();
189+ lastModelIndex = qMax(lastModelIndex, item.m_modelIndex);
190+ bottomMostY = qMax(bottomMostY, item.y() + item.height());
191+ }
192+ }
193+ if (lastModelIndex >= 0) {
194+ const double averageHeight = bottomMostY / (lastModelIndex + 1);
195+ setImplicitHeight(bottomMostY + averageHeight * (model()->rowCount() - lastModelIndex - 1));
196+ } else {
197+ setImplicitHeight(0);
198+ }
199+}
200+
201+void VerticalJournal::doRelayout()
202+{
203+ QList<ViewItem> allItems;
204+ Q_FOREACH(const auto &column, m_columnVisibleItems)
205+ allItems << column;
206+
207+ qSort(allItems);
208+
209+ const int nColumns = qMax(1., floor((double)(width() + columnSpacing()) / (m_columnWidth + columnSpacing())));
210+ m_columnVisibleItems.resize(nColumns);
211+ m_indexColumnMap.clear();
212+ for (int i = 0; i < nColumns; ++i)
213+ m_columnVisibleItems[i].clear();
214+
215+ // If the first of allItems doesn't contain index 0 we need to drop them
216+ // all since we can't consistently relayout without the first item being there
217+
218+ if (!allItems.isEmpty()) {
219+ if (allItems.first().m_modelIndex == 0) {
220+ Q_FOREACH(const ViewItem item, allItems)
221+ addItemToView(item.m_modelIndex, item.m_item);
222+ } else {
223+ Q_FOREACH(const ViewItem item, allItems)
224+ releaseItem(item.m_item);
225+ }
226+ }
227+}
228+
229+void VerticalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
230+{
231+ Q_FOREACH(const auto &column, m_columnVisibleItems) {
232+ Q_FOREACH(const ViewItem item, column) {
233+ const bool cull = item.y() + item.height() <= visibleFromY || item.y() >= visibleToY;
234+ QQuickItemPrivate::get(item.m_item)->setCulled(cull);
235+ }
236+ }
237+}
238+
239+void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Change> &removes)
240+{
241+ Q_FOREACH(const QQmlChangeSet::Change remove, removes) {
242+ for (int i = remove.count - 1; i >= 0; --i) {
243+ const int indexToRemove = remove.index + i;
244+ // Since we only support removing from the end, indexToRemove
245+ // must refer to the last item of one of the columns or
246+ // be bigger than them (because it's not in the viewport and
247+ // thus we have not created a delegate for it)
248+ bool found = false;
249+ int lastCreatedIndex = INT_MIN;
250+ for (int i = 0; !found && i < m_columnVisibleItems.count(); ++i) {
251+ QList<ViewItem> &column = m_columnVisibleItems[i];
252+ if (!column.isEmpty()) {
253+ const int lastColumnIndex = column.last().m_modelIndex;
254+ if (lastColumnIndex == indexToRemove) {
255+ releaseItem(column.takeLast().m_item);
256+ found = true;
257+ }
258+ lastCreatedIndex = qMax(lastCreatedIndex, lastColumnIndex);
259+ }
260+ }
261+ if (!found) {
262+ if (indexToRemove < lastCreatedIndex) {
263+ qDebug() << "VerticalJournal only supports removal from the end of the model, resetting instead";
264+ cleanupExistingItems();
265+ break;
266+ } else {
267+ setImplicitHeightDirty();
268+ }
269+ }
270+ }
271+ }
272+}
273+
274+
275+//void VerticalJournal::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
276+//{
277+// const qreal heightDiff = newGeometry.height() - oldGeometry.height();
278+// if (heightDiff != 0) {
279+// relayout();
280+// }
281+//}
plugins/Dash/verticaljournal.hnew file+103
@@ -0,0 +1,103 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef VERTICALJOURNAL_H
18+#define VERTICALJOURNAL_H
19+
20+#include "abstractdashview.h"
21+
22+ /** A vertical journal is a view that creates delegates
23+ * based on a model and layouts them in columns following
24+ * a top-left most position rule.
25+ *
26+ * The number of columns is calculated using the width of
27+ * the view itself, the columnWidth (i.e. the width of each individual delegate)
28+ * and the columnSpacing between columns.
29+ *
30+ * All delegates are forced to columnWidth if they don't have it.
31+ *
32+ * The first nColumns items are layouted at row 0 from column 0
33+ * to column nColumns-1 in order. After that every new item
34+ * is positioned in the column which provides the free topmost
35+ * position as possible. If more than one column tie in providing
36+ * the topmost free position the leftmost column will be used.
37+ *
38+ * Example:
39+ *
40+ * +-----+ +-----+ +-----+
41+ * | | | 2 | | |
42+ * | | | | | |
43+ * | 1 | +-----+ | 3 |
44+ * | | +-----+ | |
45+ * | | | | +-----+
46+ * +-----+ | 4 | +-----+
47+ * +-----+ | | | 5 |
48+ * | 6 | +-----+ | |
49+ * | | +-----+
50+ * +-----+
51+ *
52+ */
53+
54+class VerticalJournal : public AbstractDashView
55+{
56+ Q_OBJECT
57+
58+ Q_PROPERTY(qreal columnWidth READ columnWidth WRITE setColumnWidth NOTIFY columnWidthChanged)
59+
60+friend class VerticalJournalTest;
61+
62+public:
63+ VerticalJournal();
64+
65+ qreal columnWidth() const;
66+ void setColumnWidth(qreal columnWidth);
67+
68+protected:
69+// void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
70+
71+Q_SIGNALS:
72+ void columnWidthChanged();
73+
74+private:
75+ class ViewItem
76+ {
77+ public:
78+ ViewItem(QQuickItem *item, int modelIndex) : m_item(item), m_modelIndex(modelIndex) {}
79+ qreal x() const { return m_item->x(); }
80+ qreal y() const { return m_item->y(); }
81+ qreal height() const { return m_item->height(); }
82+ bool operator<(const ViewItem v) const { return m_modelIndex < v.m_modelIndex; }
83+
84+ QQuickItem *m_item;
85+ int m_modelIndex;
86+ };
87+
88+ void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
89+ void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
90+ bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
91+ void addItemToView(int modelIndex, QQuickItem *item) override;
92+ void cleanupExistingItems() override;
93+ void calculateImplicitHeight() override;
94+ void doRelayout() override;
95+ void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
96+ void processModelRemoves(const QVector<QQmlChangeSet::Change> &removes) override;
97+
98+ QVector<QList<ViewItem>> m_columnVisibleItems;
99+ QHash<int, int> m_indexColumnMap;
100+ int m_columnWidth;
101+};
102+
103+#endif
plugins/GlobalShortcut/CMakeLists.txt+1−1
@@ -5,6 +5,6 @@ set(globalshortcutplugin_SRCS
5
5
6add_library(GlobalShortcut-qml SHARED ${globalshortcutplugin_SRCS})
6add_library(GlobalShortcut-qml SHARED ${globalshortcutplugin_SRCS})
7
7
8−target_link_libraries(GlobalShortcut-qml Qt5::Quick Qt5::Gui)
8+qt5_use_modules(GlobalShortcut-qml Quick Gui)
9
9
10add_unity8_plugin(GlobalShortcut 1.0 GlobalShortcut TARGETS GlobalShortcut-qml)
10add_unity8_plugin(GlobalShortcut 1.0 GlobalShortcut TARGETS GlobalShortcut-qml)
plugins/GlobalShortcut/globalshortcut.cpp−3
@@ -58,9 +58,6 @@ void GlobalShortcut::setActive(bool active)
58
58
59void GlobalShortcut::componentComplete()
59void GlobalShortcut::componentComplete()
60{
60{
61− if (this->window()) {
62− QMetaObject::invokeMethod(this, "setupFilterOnWindow", Q_ARG(QQuickWindow*, this->window()));
63− }
64 connect(this, &QQuickItem::windowChanged, this, &GlobalShortcut::setupFilterOnWindow);
61 connect(this, &QQuickItem::windowChanged, this, &GlobalShortcut::setupFilterOnWindow);
65}
62}
66
63
plugins/Greeter/Unity/Launcher/CMakeLists.txt+2−1
@@ -29,7 +29,8 @@ add_library(UnityLauncherAS-qml MODULE
29target_link_libraries(UnityLauncherAS-qml
29target_link_libraries(UnityLauncherAS-qml
30 unity8-private
30 unity8-private
31 ${GSETTINGS_QT_LDFLAGS}
31 ${GSETTINGS_QT_LDFLAGS}
32− Qt5::DBus Qt5::Qml Qt5::Gui
33 )
32 )
34
33
34+qt5_use_modules(UnityLauncherAS-qml DBus Qml Gui)
35+
35add_unity8_greeter_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncherAS-qml)
36add_unity8_greeter_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncherAS-qml)
plugins/ImageCache/CMakeLists.txtnew file+8
@@ -0,0 +1,8 @@
1+add_library(ImageCache-qml MODULE
2+ ImageCache.cpp
3+ plugin.cpp
4+ )
5+
6+qt5_use_modules(ImageCache-qml Gui Qml Quick)
7+
8+add_unity8_plugin(ImageCache 0.1 ImageCache TARGETS ImageCache-qml)
plugins/ImageCache/ImageCache.cppnew file+135
@@ -0,0 +1,135 @@
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 <QDateTime>
18+#include <QDebug>
19+#include <QDir>
20+#include <QUrl>
21+#include <QUrlQuery>
22+
23+#include "ImageCache.h"
24+
25+ImageCache::ImageCache()
26+ : QQuickImageProvider(QQmlImageProviderBase::Image,
27+ QQmlImageProviderBase::ForceAsynchronousImageLoading)
28+{
29+}
30+
31+QString ImageCache::imageCacheRoot()
32+{
33+ QString xdgCache(qgetenv("XDG_CACHE_HOME"));
34+ if (xdgCache.isEmpty()) {
35+ xdgCache = QDir::homePath() + QStringLiteral("/.cache");
36+ }
37+
38+ return QDir::cleanPath(xdgCache) + QStringLiteral("/unity8/imagecache");
39+}
40+
41+QFileInfo ImageCache::imagePath(const QUrl &image)
42+{
43+ QUrlQuery query(image);
44+
45+ auto name = query.queryItemValue(QStringLiteral("name"));
46+ if (name.isEmpty()) {
47+ name = QStringLiteral("/paths") + image.toLocalFile();
48+ } else {
49+ name = QStringLiteral("/names/") + name;
50+ }
51+
52+ return QFileInfo(imageCacheRoot() + name);
53+}
54+
55+bool ImageCache::needsUpdate(const QUrl &image, const QFileInfo &cachePath, const QSize &imageSize, const QSize &requestedSize, QSize &finalSize)
56+{
57+ if (!cachePath.exists())
58+ return true;
59+
60+ QFileInfo imageInfo(image.toLocalFile());
61+ if (imageInfo.lastModified() > cachePath.lastModified())
62+ return true;
63+
64+ QSize cacheSize(QImageReader(cachePath.filePath()).size());
65+ finalSize = calculateSize(imageSize, requestedSize);
66+ if (finalSize.isValid() && cacheSize != finalSize)
67+ return true;
68+
69+ return false;
70+}
71+
72+QSize ImageCache::calculateSize(const QSize &imageSize, const QSize &requestedSize)
73+{
74+ QSize finalSize(requestedSize);
75+
76+ if (finalSize.width() == 0) {
77+ finalSize.setWidth(imageSize.width() * (((double)finalSize.height()) / imageSize.height()));
78+ } else if (finalSize.height() == 0) {
79+ finalSize.setHeight(imageSize.height() * (((double)finalSize.width()) / imageSize.width()));
80+ }
81+
82+ return finalSize;
83+}
84+
85+QImage ImageCache::loadAndCacheImage(QImageReader &reader, const QFileInfo &cachePath, const QSize &finalSize)
86+{
87+ reader.setQuality(100);
88+ reader.setScaledSize(finalSize);
89+ auto format = reader.format(); // can't get this after reading
90+
91+ QImage loadedImage(reader.read());
92+ if (loadedImage.isNull()) {
93+ qWarning() << "ImageCache could not read image" << reader.fileName() << ":" << reader.errorString();
94+ return QImage();
95+ }
96+
97+ cachePath.dir().mkpath(QStringLiteral("."));
98+ loadedImage.save(cachePath.filePath(), format, 100);
99+
100+ return loadedImage;
101+}
102+
103+QImage ImageCache::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
104+{
105+ QUrl image(id);
106+ QImageReader imageReader(image.toLocalFile());
107+ QSize imageSize(imageReader.size());
108+ QImage result;
109+
110+ // Early exit here, with no sourceSize, scaled-up sourceSize, or bad source image
111+ if ((requestedSize.width() <= 0 && requestedSize.height() <= 0) ||
112+ imageSize.isEmpty() ||
113+ requestedSize.height() >= imageSize.height() ||
114+ requestedSize.width() >= imageSize.width()) {
115+ // We're only interested in scaling down, not up.
116+ result = imageReader.read();
117+ *size = result.size();
118+ return result;
119+ }
120+
121+ auto cachePath = imagePath(image);
122+ QSize finalSize;
123+
124+ if (needsUpdate(image, cachePath, imageSize, requestedSize, finalSize)) {
125+ if (finalSize.isEmpty()) {
126+ finalSize = calculateSize(imageSize, requestedSize);
127+ }
128+ result = loadAndCacheImage(imageReader, cachePath, finalSize);
129+ } else {
130+ result = QImage(cachePath.filePath());
131+ }
132+
133+ *size = result.size();
134+ return result;
135+}
plugins/ImageCache/ImageCache.hnew file+53
@@ -0,0 +1,53 @@
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+#pragma once
18+
19+#include <QFileInfo>
20+#include <QImageReader>
21+#include <QQuickImageProvider>
22+#include <QSize>
23+
24+/**
25+ * This class accepts an id formulated like a URL. So you'd use something like:
26+ *
27+ * Image {
28+ * source: "image://unity8imagecache/file:///usr/share/..."
29+ * }
30+ *
31+ * Right now, we only support file:/// URLs. We do accept some flags though:
32+ *
33+ * ?name=NAME
34+ * - This will use NAME as the cache lookup key instead of the provided URL.
35+ *
36+ * We don't do any cleaning of old cached files yet. So you may want to always
37+ * provide a name to avoid leaving lots of files around.
38+ */
39+
40+class ImageCache: public QQuickImageProvider
41+{
42+public:
43+ ImageCache();
44+
45+ QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override;
46+
47+private:
48+ static QString imageCacheRoot();
49+ static QFileInfo imagePath(const QUrl &image);
50+ static bool needsUpdate(const QUrl &image, const QFileInfo &cachePath, const QSize &imageSize, const QSize &requestedSize, QSize &finalSize);
51+ static QSize calculateSize(const QSize &imageSize, const QSize &requestedSize);
52+ static QImage loadAndCacheImage(QImageReader &reader, const QFileInfo &cachePath, const QSize &finalSize);
53+};
plugins/ImageCache/plugin.cppnew file+39
@@ -0,0 +1,39 @@
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 <QQmlEngine>
18+
19+#include "ImageCache.h"
20+#include "plugin.h"
21+
22+#include <QtQml>
23+
24+void ImageCachePlugin::registerTypes(const char *uri)
25+{
26+ Q_ASSERT(uri == QLatin1String("ImageCache"));
27+
28+ qmlRegisterTypeNotAvailable(uri, 0, 1, "__ImageCacheIgnoreMe",
29+ QStringLiteral("Ignore this: QML plugins must contain at least one type"));
30+}
31+
32+void ImageCachePlugin::initializeEngine(QQmlEngine* engine, const char* uri)
33+{
34+ Q_ASSERT(uri == QLatin1String("ImageCache"));
35+
36+ QQmlExtensionPlugin::initializeEngine(engine, uri);
37+
38+ engine->addImageProvider("unity8imagecache", new ImageCache);
39+}
plugins/ImageCache/plugin.hnew file+31
@@ -0,0 +1,31 @@
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+#pragma once
18+
19+#include <QQmlExtensionPlugin>
20+
21+class QQmlEngine;
22+
23+class ImageCachePlugin : 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+ void initializeEngine(QQmlEngine* engine, const char* uri) override;
31+};
plugins/ImageCache/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module ImageCache
2+plugin ImageCache-qml
plugins/LightDM/DBusGreeterList.cpp+3−3
@@ -25,7 +25,7 @@ DBusGreeterList::DBusGreeterList(Greeter *greeter, const QString &path)
25 m_greeter(greeter)
25 m_greeter(greeter)
26{
26{
27 connect(m_greeter, &Greeter::authenticationUserChanged, this, &DBusGreeterList::authenticationUserChangedHandler);
27 connect(m_greeter, &Greeter::authenticationUserChanged, this, &DBusGreeterList::authenticationUserChangedHandler);
28− connect(m_greeter, &Greeter::promptlessChanged, this, &DBusGreeterList::promptlessChangedHandler);
28+ connect(m_greeter, &Greeter::isAuthenticatedChanged, this, &DBusGreeterList::authenticatedChangedHandler);
29}
29}
30
30
31QString DBusGreeterList::GetActiveEntry() const
31QString DBusGreeterList::GetActiveEntry() const
@@ -40,7 +40,7 @@ void DBusGreeterList::SetActiveEntry(const QString &entry)
40
40
41bool DBusGreeterList::entryIsLocked() const
41bool DBusGreeterList::entryIsLocked() const
42{
42{
43− return !m_greeter->promptless();
43+ return !m_greeter->isAuthenticated();
44}
44}
45
45
46void DBusGreeterList::authenticationUserChangedHandler()
46void DBusGreeterList::authenticationUserChangedHandler()
@@ -49,7 +49,7 @@ void DBusGreeterList::authenticationUserChangedHandler()
49 Q_EMIT EntrySelected(m_greeter->authenticationUser());
49 Q_EMIT EntrySelected(m_greeter->authenticationUser());
50}
50}
51
51
52−void DBusGreeterList::promptlessChangedHandler()
52+void DBusGreeterList::authenticatedChangedHandler()
53{
53{
54 notifyPropertyChanged(QStringLiteral("EntryIsLocked"), entryIsLocked());
54 notifyPropertyChanged(QStringLiteral("EntryIsLocked"), entryIsLocked());
55 Q_EMIT entryIsLockedChanged();
55 Q_EMIT entryIsLockedChanged();
plugins/LightDM/DBusGreeterList.h+1−1
@@ -48,7 +48,7 @@ Q_SIGNALS:
48
48
49private Q_SLOTS:
49private Q_SLOTS:
50 void authenticationUserChangedHandler();
50 void authenticationUserChangedHandler();
51− void promptlessChangedHandler();
51+ void authenticatedChangedHandler();
52
52
53private:
53private:
54 Greeter *m_greeter;
54 Greeter *m_greeter;
plugins/LightDM/FullLightDM/CMakeLists.txt+1−1
@@ -26,7 +26,7 @@ target_link_libraries(FullLightDM-qml
26 unity8-private
26 unity8-private
27 ${LIBLIGHTDM_LDFLAGS}
27 ${LIBLIGHTDM_LDFLAGS}
28 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
29− Qt5::DBus Qt5::Gui Qt5::Qml
30 )
29 )
31
30
31+qt5_use_modules(FullLightDM-qml DBus Gui Qml)
32add_unity8_plugin(FullLightDM 0.1 LightDM/FullLightDM TARGETS FullLightDM-qml)
32add_unity8_plugin(FullLightDM 0.1 LightDM/FullLightDM TARGETS FullLightDM-qml)
plugins/LightDM/Greeter.cpp−16
@@ -27,7 +27,6 @@ GreeterPrivate::GreeterPrivate(Greeter* parent)
27 m_active(false),
27 m_active(false),
28 responded(false),
28 responded(false),
29 everResponded(false),
29 everResponded(false),
30− promptless(false),
31 q_ptr(parent)
30 q_ptr(parent)
32{
31{
33}
32}
@@ -113,12 +112,6 @@ QString Greeter::defaultSessionHint() const
113 return d->m_greeter->defaultSessionHint();
112 return d->m_greeter->defaultSessionHint();
114}
113}
115
114
116−bool Greeter::promptless() const
117−{
118− Q_D(const Greeter);
119− return d->promptless;
120−}
121−
122QString Greeter::selectUser() const
115QString Greeter::selectUser() const
123{
116{
124 Q_D(const Greeter);
117 Q_D(const Greeter);
@@ -153,10 +146,6 @@ void Greeter::authenticate(const QString &username)
153 d->prompts.clear();
146 d->prompts.clear();
154 d->responded = false;
147 d->responded = false;
155 d->everResponded = false;
148 d->everResponded = false;
156− if (d->promptless) {
157− d->promptless = false;
158− Q_EMIT promptlessChanged();
159− }
160
149
161 if (authenticationUser() == username) {
150 if (authenticationUser() == username) {
162 d->prompts = d->leftovers;
151 d->prompts = d->leftovers;
@@ -246,11 +235,6 @@ void Greeter::authenticationCompleteFilter()
246 bool automatic = !d->everResponded;
235 bool automatic = !d->everResponded;
247 bool pamHasLeftoverMessages = !d->prompts.hasPrompt() && d->prompts.rowCount() > 0;
236 bool pamHasLeftoverMessages = !d->prompts.hasPrompt() && d->prompts.rowCount() > 0;
248
237
249− if (isAuthenticated() && automatic) {
250− d->promptless = true;
251− Q_EMIT promptlessChanged();
252− }
253−
254 if (!isAuthenticated()) {
238 if (!isAuthenticated()) {
255 if (pamHasLeftoverMessages) {
239 if (pamHasLeftoverMessages) {
256 d->leftovers = d->prompts; // Prefer PAM's messages
240 d->leftovers = d->prompts; // Prefer PAM's messages
plugins/LightDM/Greeter.h−3
@@ -37,7 +37,6 @@ class Greeter : public QObject
37 Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
37 Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
38 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
38 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
39 Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
39 Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
40− Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
41 Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
40 Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
42
41
43public:
42public:
@@ -48,7 +47,6 @@ public:
48 bool isAuthenticated() const;
47 bool isAuthenticated() const;
49 QString authenticationUser() const;
48 QString authenticationUser() const;
50 QString defaultSessionHint() const;
49 QString defaultSessionHint() const;
51− bool promptless() const;
52 QString selectUser() const;
50 QString selectUser() const;
53 bool hasGuestAccount() const;
51 bool hasGuestAccount() const;
54 bool showManualLoginHint() const;
52 bool showManualLoginHint() const;
@@ -66,7 +64,6 @@ Q_SIGNALS:
66 void authenticationUserChanged();
64 void authenticationUserChanged();
67 void isActiveChanged();
65 void isActiveChanged();
68 void isAuthenticatedChanged();
66 void isAuthenticatedChanged();
69− void promptlessChanged();
70 void showGreeter();
67 void showGreeter();
71 void hideGreeter();
68 void hideGreeter();
72 void loginError(bool automatic);
69 void loginError(bool automatic);
plugins/LightDM/GreeterPrivate.h−1
@@ -34,7 +34,6 @@ public:
34 PromptsModel leftovers; // prompts to show during next auth for same user
34 PromptsModel leftovers; // prompts to show during next auth for same user
35 bool responded;
35 bool responded;
36 bool everResponded;
36 bool everResponded;
37− bool promptless;
38 QString cachedAuthUser;
37 QString cachedAuthUser;
39
38
40protected:
39protected:
plugins/LightDM/IntegratedLightDM/CMakeLists.txt+1−1
@@ -25,9 +25,9 @@ target_link_libraries(IntegratedLightDM-qml
25 integratedLightDM
25 integratedLightDM
26 unity8-private
26 unity8-private
27 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
27 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28− Qt5::DBus Qt5::Gui Qt5::Qml
29 )
28 )
30
29
30+qt5_use_modules(IntegratedLightDM-qml DBus Gui Qml)
31add_unity8_plugin(IntegratedLightDM 0.1 LightDM/IntegratedLightDM TARGETS IntegratedLightDM-qml)
31add_unity8_plugin(IntegratedLightDM 0.1 LightDM/IntegratedLightDM TARGETS IntegratedLightDM-qml)
32
32
33add_subdirectory(liblightdm)
33add_subdirectory(liblightdm)
plugins/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txt+4−3
@@ -26,21 +26,22 @@ target_link_libraries(integratedLightDM
26 ${GLIB_LIBRARIES}
26 ${GLIB_LIBRARIES}
27 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
27 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28 -lpam
28 -lpam
29− Qt5::Concurrent Qt5::DBus Qt5::Gui
30)
29)
31target_link_libraries(integratedLightDMSession
30target_link_libraries(integratedLightDMSession
32 ${GLIB_LIBRARIES}
31 ${GLIB_LIBRARIES}
33 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
32 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
34 -lpam
33 -lpam
35− Qt5::Concurrent Qt5::DBus Qt5::Gui
36)
34)
37target_link_libraries(MockLightDM-demo-shared
35target_link_libraries(MockLightDM-demo-shared
38 ${GLIB_LIBRARIES}
36 ${GLIB_LIBRARIES}
39 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
37 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
40 -lpam
38 -lpam
41− Qt5::Concurrent Qt5::DBus Qt5::Gui
42)
39)
43
40
41+qt5_use_modules(integratedLightDM Concurrent DBus Gui)
42+qt5_use_modules(integratedLightDMSession Concurrent DBus Gui)
43+qt5_use_modules(MockLightDM-demo-shared Concurrent DBus Gui)
44+
44set_target_properties(integratedLightDM PROPERTIES
45set_target_properties(integratedLightDM PROPERTIES
45 COMPILE_FLAGS "-DSM_BUSNAME=systemBus -fPIC")
46 COMPILE_FLAGS "-DSM_BUSNAME=systemBus -fPIC")
46set_target_properties(integratedLightDMSession PROPERTIES
47set_target_properties(integratedLightDMSession PROPERTIES
plugins/Lights/CMakeLists.txt+2−8
@@ -1,6 +1,5 @@
1pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
1pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
2pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
2pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
3−pkg_check_modules(ANDROID_PROPERTIES REQUIRED libandroid-properties)
4
3
5include_directories(
4include_directories(
6 SYSTEM
5 SYSTEM
@@ -10,14 +9,9 @@ include_directories(
10add_library(Lights-qml MODULE
9add_library(Lights-qml MODULE
11 plugin.cpp
10 plugin.cpp
12 Lights.cpp
11 Lights.cpp
13− LegacyLights.cpp
14− HfdLights.cpp
15 )
12 )
16
13
17−target_link_libraries(Lights-qml
14+qt5_use_modules(Lights-qml Qml Gui)
18− Qt5::Qml Qt5::Gui Qt5::DBus
19− ${ANDROID_HARDWARE_LIBRARIES}
15+target_link_libraries(Lights-qml ${ANDROID_HARDWARE_LIBRARIES})
20− ${ANDROID_PROPERTIES_LIBRARIES}
21− )
22
16
23add_unity8_plugin(Lights 0.1 Lights TARGETS Lights-qml)
17add_unity8_plugin(Lights 0.1 Lights TARGETS Lights-qml)
plugins/Lights/HfdLights.cppdeleted−62
@@ -1,62 +0,0 @@
1−/*
2− * Copyright (C) 2021 UBports Foundation.
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− * Author: Florian Leeber <florian@ubports.com>
17− */
18−
19−#include "HfdLights.h"
20−#include <QtCore/QDebug>
21−#include <QDBusArgument>
22−#include <QDBusConnection>
23−#include <iostream>
24−
25−#define HFD_SERVICE_NAME "com.lomiri.hfd"
26−#define HFD_SERVICE_PATH "/com/lomiri/hfd"
27−#define HFD_SERVICE_INTERFACE "com.lomiri.hfd.Leds"
28−
29−HfdLights::HfdLights(QObject* parent)
30− : Lights(parent)
31−{
32− m_hfdInterface = new QDBusInterface(
33− QStringLiteral(HFD_SERVICE_NAME),
34− QStringLiteral(HFD_SERVICE_PATH),
35− QStringLiteral(HFD_SERVICE_INTERFACE),
36− QDBusConnection::systemBus(),
37− this
38− );
39−}
40−
41−bool HfdLights::init()
42−{
43− // hfd does not need any initalization to be used
44− return true;
45−}
46−
47−void HfdLights::turnOn()
48−{
49− m_hfdInterface->call(QStringLiteral("setState"), 0);
50− m_hfdInterface->call(QStringLiteral("setColor"), (quint32)m_color.rgba());
51− m_hfdInterface->call(QStringLiteral("setOnMs"), m_onMs);
52− m_hfdInterface->call(QStringLiteral("setOffMs"), m_offMs);
53− m_hfdInterface->call(QStringLiteral("setState"), 1);
54−}
55−
56−void HfdLights::turnOff()
57−{
58− m_hfdInterface->call(QStringLiteral("setState"), 0);
59− m_hfdInterface->call(QStringLiteral("setColor"), (quint32)0);
60− m_hfdInterface->call(QStringLiteral("setOnMs"), 0);
61− m_hfdInterface->call(QStringLiteral("setOffMs"), 0);
62−}
plugins/Lights/LegacyLights.cppdeleted−91
@@ -1,91 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− * Copyright (C) 2021 UBports Foundation.
4− *
5− * This program is free software; you can redistribute it and/or modify
6− * it under the terms of the GNU General Public License as published by
7− * the Free Software Foundation; version 3.
8− *
9− * This program is distributed in the hope that it will be useful,
10− * but WITHOUT ANY WARRANTY; without even the implied warranty of
11− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12− * GNU General Public License for more details.
13− *
14− * You should have received a copy of the GNU General Public License
15− * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− *
17− * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
18− */
19−
20−#include "LegacyLights.h"
21−#include <QtCore/QDebug>
22−
23−extern "C" {
24−#include "android-hardware.h"
25−#include <string.h>
26−}
27−
28−LegacyLights::~LegacyLights()
29−{
30− if (m_lightDevice) {
31− hw_device_t* device = (hw_device_t*) m_lightDevice;
32− device->close(device);
33− }
34−}
35−
36−bool LegacyLights::init()
37−{
38− if (m_lightDevice) {
39− return true;
40− }
41−
42− int err;
43− hw_module_t* module;
44−
45− err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
46− if (err == 0) {
47− hw_device_t* device;
48− err = module->methods->open(module, LIGHT_ID_NOTIFICATIONS, &device);
49− if (err == 0) {
50− m_lightDevice = (light_device_t*)device;
51− turnOff();
52− return true;
53− } else {
54− qWarning() << "Failed to access notification lights";
55− }
56− } else {
57− qWarning() << "Failed to initialize lights hardware.";
58− }
59− return false;
60−}
61−
62−void LegacyLights::turnOn()
63−{
64− // pulse
65− light_state_t state;
66− memset(&state, 0, sizeof(light_state_t));
67− state.color = m_color.rgba();
68− state.flashMode = LIGHT_FLASH_TIMED;
69− state.flashOnMS = m_onMs;
70− state.flashOffMS = m_offMs;
71− state.brightnessMode = BRIGHTNESS_MODE_USER;
72−
73− if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
74− qWarning() << "Failed to turn the light off";
75− }
76−}
77−
78−void LegacyLights::turnOff()
79−{
80− light_state_t state;
81− memset(&state, 0, sizeof(light_state_t));
82− state.color = 0x00000000;
83− state.flashMode = LIGHT_FLASH_NONE;
84− state.flashOnMS = 0;
85− state.flashOffMS = 0;
86− state.brightnessMode = 0;
87−
88− if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
89− qWarning() << "Failed to turn the light off";
90− }
91−}
plugins/Lights/Lights.cpp+65
@@ -26,12 +26,20 @@ extern "C" {
26
26
27Lights::Lights(QObject* parent)
27Lights::Lights(QObject* parent)
28 : QObject(parent),
28 : QObject(parent),
29+ m_lightDevice(0),
29 m_color("blue"),
30 m_color("blue"),
30 m_state(Lights::Off),
31 m_state(Lights::Off),
31 m_onMs(1000),
32 m_onMs(1000),
32 m_offMs(3000)
33 m_offMs(3000)
33{
34{
35+}
34
36
37+Lights::~Lights()
38+{
39+ if (m_lightDevice) {
40+ hw_device_t* device = (hw_device_t*) m_lightDevice;
41+ device->close(device);
42+ }
35}
43}
36
44
37void Lights::setState(Lights::State newState)
45void Lights::setState(Lights::State newState)
@@ -99,3 +107,60 @@ void Lights::setOffMillisec(int offMs)
99 // FIXME: update the property if the light is already on
107 // FIXME: update the property if the light is already on
100 }
108 }
101}
109}
110+
111+bool Lights::init()
112+{
113+ if (m_lightDevice) {
114+ return true;
115+ }
116+
117+ int err;
118+ hw_module_t* module;
119+
120+ err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
121+ if (err == 0) {
122+ hw_device_t* device;
123+ err = module->methods->open(module, LIGHT_ID_NOTIFICATIONS, &device);
124+ if (err == 0) {
125+ m_lightDevice = (light_device_t*)device;
126+ turnOff();
127+ return true;
128+ } else {
129+ qWarning() << "Failed to access notification lights";
130+ }
131+ } else {
132+ qWarning() << "Failed to initialize lights hardware.";
133+ }
134+ return false;
135+}
136+
137+void Lights::turnOn()
138+{
139+ // pulse
140+ light_state_t state;
141+ memset(&state, 0, sizeof(light_state_t));
142+ state.color = m_color.rgba();
143+ state.flashMode = LIGHT_FLASH_TIMED;
144+ state.flashOnMS = m_onMs;
145+ state.flashOffMS = m_offMs;
146+ state.brightnessMode = BRIGHTNESS_MODE_USER;
147+
148+ if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
149+ qWarning() << "Failed to turn the light off";
150+ }
151+}
152+
153+void Lights::turnOff()
154+{
155+ light_state_t state;
156+ memset(&state, 0, sizeof(light_state_t));
157+ state.color = 0x00000000;
158+ state.flashMode = LIGHT_FLASH_NONE;
159+ state.flashOnMS = 0;
160+ state.flashOffMS = 0;
161+ state.brightnessMode = 0;
162+
163+ if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
164+ qWarning() << "Failed to turn the light off";
165+ }
166+}
plugins/Lights/Lights.h+8−4
@@ -22,6 +22,8 @@
22#include <QtCore/QObject>
22#include <QtCore/QObject>
23#include <QtGui/QColor>
23#include <QtGui/QColor>
24
24
25+struct light_device_t;
26+
25class Lights: public QObject
27class Lights: public QObject
26{
28{
27 Q_OBJECT
29 Q_OBJECT
@@ -38,6 +40,7 @@ public:
38 Q_ENUM(State)
40 Q_ENUM(State)
39
41
40 explicit Lights(QObject *parent = 0);
42 explicit Lights(QObject *parent = 0);
43+ ~Lights();
41
44
42 void setState(State newState);
45 void setState(State newState);
43 State state() const;
46 State state() const;
@@ -57,15 +60,16 @@ Q_SIGNALS:
57 void onMillisecChanged(int onMs);
60 void onMillisecChanged(int onMs);
58 void offMillisecChanged(int offMs);
61 void offMillisecChanged(int offMs);
59
62
60−protected:
63+private:
64+ light_device_t* m_lightDevice;
61 QColor m_color;
65 QColor m_color;
62 State m_state;
66 State m_state;
63 int m_onMs;
67 int m_onMs;
64 int m_offMs;
68 int m_offMs;
65
69
66− virtual bool init() = 0;
70+ bool init();
67− virtual void turnOff() = 0;
71+ void turnOff();
68− virtual void turnOn() = 0;
72+ void turnOn();
69};
73};
70
74
71#endif
75#endif
plugins/Lights/plugin.cpp+1−20
@@ -18,11 +18,6 @@
18
18
19#include "plugin.h"
19#include "plugin.h"
20#include "Lights.h"
20#include "Lights.h"
21−#include "HfdLights.h"
22−#include "LegacyLights.h"
23−
24−// libandroid-properties
25−#include <hybris/properties/properties.h>
26
21
27#include <QtQml/qqml.h>
22#include <QtQml/qqml.h>
28
23
@@ -30,21 +25,7 @@ static QObject *lights_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
30{
25{
31 Q_UNUSED(engine)
26 Q_UNUSED(engine)
32 Q_UNUSED(scriptEngine)
27 Q_UNUSED(scriptEngine)
33−
34− bool use_hfd = false;
35− char buffer[PROP_VALUE_MAX];
36− auto result = property_get("ro.build.version.sdk", buffer, "0");
37− if (result) {
38− auto sdkVersion = QString(buffer).toInt();
39− if (sdkVersion >= 27 || sdkVersion == 0) {
40− use_hfd = true;
41− }
42− }
43− if (use_hfd) {
44− return new HfdLights();
28+ return new Lights();
45− } else {
46− return new LegacyLights();
47− }
48}
29}
49
30
50void LightsPlugin::registerTypes(const char *uri)
31void LightsPlugin::registerTypes(const char *uri)
plugins/Powerd/CMakeLists.txt+2−4
@@ -9,9 +9,7 @@ add_library(Powerd-qml MODULE
9 Powerd.cpp
9 Powerd.cpp
10 )
10 )
11
11
12−target_link_libraries(Powerd-qml
12+qt5_use_modules(Powerd-qml DBus Qml)
13− Qt5::DBus Qt5::Qml
14− ${GIO_LDFLAGS}
13+target_link_libraries(Powerd-qml ${GIO_LDFLAGS})
15− )
16
14
17add_unity8_plugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
15add_unity8_plugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
plugins/ScreenshotDirectory/CMakeLists.txt+1−1
@@ -4,6 +4,6 @@ set(PLUGIN_SOURCES
4)
4)
5
5
6add_library(ScreenshotDirectory-qml MODULE ${PLUGIN_SOURCES})
6add_library(ScreenshotDirectory-qml MODULE ${PLUGIN_SOURCES})
7−target_link_libraries(ScreenshotDirectory-qml Qt5::Qml Qt5::Gui Qt5::Quick)
7+qt5_use_modules(ScreenshotDirectory-qml Qml Gui Quick)
8
8
9add_unity8_plugin(ScreenshotDirectory 0.1 ScreenshotDirectory TARGETS ScreenshotDirectory-qml)
9add_unity8_plugin(ScreenshotDirectory 0.1 ScreenshotDirectory TARGETS ScreenshotDirectory-qml)
plugins/SessionBroadcast/CMakeLists.txt+2−1
@@ -6,8 +6,9 @@ add_library(SessionBroadcast-qml MODULE
6 plugin.cpp
6 plugin.cpp
7 )
7 )
8
8
9+qt5_use_modules(SessionBroadcast-qml DBus Qml)
10+
9target_link_libraries(SessionBroadcast-qml
11target_link_libraries(SessionBroadcast-qml
10− Qt5::DBus Qt5::Qml
11 ${GLIB_LIBRARIES}
12 ${GLIB_LIBRARIES}
12 )
13 )
13
14
plugins/UInput/CMakeLists.txt+1−1
@@ -3,5 +3,5 @@ add_library(UInput-qml MODULE
3 uinput.cpp
3 uinput.cpp
4)
4)
5
5
6−target_link_libraries(UInput-qml Qt5::Qml)
6+qt5_use_modules(UInput-qml Qml)
7add_unity8_plugin(UInput 0.1 UInput TARGETS UInput-qml)
7add_unity8_plugin(UInput 0.1 UInput TARGETS UInput-qml)
plugins/Ubuntu/DownloadDaemonListener/CMakeLists.txt+2−4
@@ -11,10 +11,8 @@ set(DOWNLOADDAEMONLISTENER_SOURCES
11
11
12add_library(DownloadDaemonListener MODULE ${DOWNLOADDAEMONLISTENER_SOURCES})
12add_library(DownloadDaemonListener MODULE ${DOWNLOADDAEMONLISTENER_SOURCES})
13
13
14+qt5_use_modules(DownloadDaemonListener Qml Quick DBus Core)
14pkg_check_modules(DDLADAPTER REQUIRED udm-common)
15pkg_check_modules(DDLADAPTER REQUIRED udm-common)
15add_definitions(${DDLADAPTER_CFLAGS} ${DDLADAPTER_CFLAGS_OTHER})
16add_definitions(${DDLADAPTER_CFLAGS} ${DDLADAPTER_CFLAGS_OTHER})
16−target_link_libraries(DownloadDaemonListener
17+target_link_libraries(DownloadDaemonListener ${DDLADAPTER_LIBRARIES})
17− Qt5::Qml Qt5::Quick Qt5::DBus Qt5::Core
18− ${DDLADAPTER_LIBRARIES}
19− )
20add_unity8_plugin(Ubuntu.DownloadDaemonListener 0.1 Ubuntu/DownloadDaemonListener TARGETS DownloadDaemonListener)
18add_unity8_plugin(Ubuntu.DownloadDaemonListener 0.1 Ubuntu/DownloadDaemonListener TARGETS DownloadDaemonListener)
plugins/Ubuntu/Gestures/CMakeLists.txt+3−1
@@ -17,7 +17,9 @@ pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
17add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
17add_definitions(-DUBUNTUGESTURESQML_LIBRARY)
18
18
19add_library(UbuntuGesturesQml SHARED ${UbuntuGesturesQml_SOURCES})
19add_library(UbuntuGesturesQml SHARED ${UbuntuGesturesQml_SOURCES})
20−target_link_libraries(UbuntuGesturesQml ${UBUNTUGESTURES_LIBRARIES} Qt5::Core Qt5::Quick)
20+target_link_libraries(UbuntuGesturesQml ${UBUNTUGESTURES_LIBRARIES})
21+
22+qt5_use_modules(UbuntuGesturesQml Core Quick)
21
23
22# So that Foo.cpp can #include "Foo.moc"
24# So that Foo.cpp can #include "Foo.moc"
23include_directories(${CMAKE_CURRENT_BINARY_DIR})
25include_directories(${CMAKE_CURRENT_BINARY_DIR})
plugins/Ubuntu/Gestures/TouchGestureArea.cpp−6
@@ -328,12 +328,6 @@ void TouchGestureArea::touchEvent_rejected(QTouchEvent *event)
328 }
328 }
329 }
329 }
330 }
330 }
331−
332− // If this event is a new touch, ignore it and let the item below have it.
333− // We won't recognize any new touch until the whole current gesture is done
334− // i.e. we're in WaitingForTouch state.
335− // And even if it isn't, just ignore it anyway; we don't care about it.
336− event->ignore();
337}
331}
338
332
339void TouchGestureArea::unownedTouchEvent(QTouchEvent *unownedTouchEvent)
333void TouchGestureArea::unownedTouchEvent(QTouchEvent *unownedTouchEvent)
plugins/Unity/ApplicationMenu/CMakeLists.txt+1−1
@@ -14,6 +14,6 @@ qt5_add_dbus_adaptor(applicationMenu_SRCS com.ubuntu.MenuRegistrar.xml dbusappli
14
14
15add_library(ApplicationMenu-qml MODULE ${applicationMenu_SRCS})
15add_library(ApplicationMenu-qml MODULE ${applicationMenu_SRCS})
16
16
17−target_link_libraries(ApplicationMenu-qml Qt5::DBus Qt5::Qml)
17+qt5_use_modules(ApplicationMenu-qml DBus Qml)
18
18
19add_unity8_plugin(Unity.ApplicationMenu 0.1 Unity/ApplicationMenu TARGETS ApplicationMenu-qml)
19add_unity8_plugin(Unity.ApplicationMenu 0.1 Unity/ApplicationMenu TARGETS ApplicationMenu-qml)
plugins/Unity/CMakeLists.txt+1
@@ -3,5 +3,6 @@ add_subdirectory(Connectivity)
3add_subdirectory(Indicators)
3add_subdirectory(Indicators)
4add_subdirectory(Launcher)
4add_subdirectory(Launcher)
5add_subdirectory(Session)
5add_subdirectory(Session)
6+add_subdirectory(DashCommunicator)
6add_subdirectory(InputInfo)
7add_subdirectory(InputInfo)
7add_subdirectory(Platform)
8add_subdirectory(Platform)
plugins/Unity/Connectivity/CMakeLists.txt+1−1
@@ -5,6 +5,6 @@ set(CONNECTIVITY_SOURCES
5
5
6add_library(Connectivity MODULE ${CONNECTIVITY_SOURCES})
6add_library(Connectivity MODULE ${CONNECTIVITY_SOURCES})
7
7
8−target_link_libraries(Connectivity Qt5::Qml Qt5::DBus Qt5::Core)
8+qt5_use_modules(Connectivity Qml DBus Core)
9
9
10add_unity8_plugin(Unity.Connectivity 0.1 Unity/Connectivity TARGETS Connectivity)
10add_unity8_plugin(Unity.Connectivity 0.1 Unity/Connectivity TARGETS Connectivity)
plugins/Unity/DashCommunicator/CMakeLists.txtnew file+26
@@ -0,0 +1,26 @@
1+include_directories(
2+ ${CMAKE_CURRENT_SOURCE_DIR}
3+ ${CMAKE_CURRENT_BINARY_DIR}
4+ ${libunity8-private_SOURCE_DIR}
5+)
6+
7+set(QMLDASHCOMMUNICATORPLUGIN_SRC
8+ plugin.cpp
9+ dbusdashcommunicatorservice.cpp
10+ dashcommunicatorservice.cpp
11+ dashcommunicator.cpp
12+ dashconnection.cpp
13+)
14+
15+add_library(DashCommunicator-qml MODULE
16+ ${QMLDASHCOMMUNICATORPLUGIN_SRC}
17+)
18+
19+qt5_use_modules(DashCommunicator-qml DBus Qml)
20+
21+target_link_libraries(DashCommunicator-qml
22+ unity8-private
23+)
24+
25+# export the qmldir and qmltypes files
26+add_unity8_plugin(Unity.DashCommunicator 0.1 Unity/DashCommunicator TARGETS DashCommunicator-qml)
plugins/Unity/DashCommunicator/dashcommunicator.cppnew file+58
@@ -0,0 +1,58 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "dashcommunicator.h"
18+#include "dashconnection.h"
19+
20+#include <QObject>
21+
22+DashCommunicator::DashCommunicator(QObject *parent):
23+ QThread(parent),
24+ m_dashConnection(nullptr),
25+ m_created(false)
26+{
27+ start();
28+}
29+
30+DashCommunicator::~DashCommunicator()
31+{
32+ quit();
33+ wait();
34+}
35+
36+void DashCommunicator::setCurrentScope(int index, bool animate, bool isSwipe)
37+{
38+ m_mutex.lock();
39+ if (m_created) {
40+ QMetaObject::invokeMethod(m_dashConnection, "setCurrentScope",
41+ Q_ARG(int, index),
42+ Q_ARG(bool, animate),
43+ Q_ARG(bool, isSwipe));
44+ }
45+ m_mutex.unlock();
46+}
47+
48+void DashCommunicator::run()
49+{
50+ m_dashConnection = new DashConnection(QStringLiteral("com.canonical.UnityDash"),
51+ QStringLiteral("/com/canonical/UnityDash"),
52+ QLatin1String(""), this);
53+ m_mutex.lock();
54+ m_created = true;
55+ m_mutex.unlock();
56+
57+ exec();
58+}
plugins/Unity/DashCommunicator/dashcommunicator.hnew file+45
@@ -0,0 +1,45 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef DASHCOMMUNICATOR_H
18+#define DASHCOMMUNICATOR_H
19+
20+// Qt
21+#include <QThread>
22+#include <QMutex>
23+
24+class DashConnection;
25+
26+class DashCommunicator: public QThread
27+{
28+ Q_OBJECT
29+public:
30+ explicit DashCommunicator(QObject *parent = 0);
31+ ~DashCommunicator();
32+
33+public Q_SLOTS:
34+ void setCurrentScope(int index, bool animate, bool isSwipe);
35+
36+protected:
37+ void run() override;
38+
39+private:
40+ DashConnection *m_dashConnection;
41+ bool m_created;
42+ QMutex m_mutex;
43+};
44+
45+#endif
plugins/Unity/DashCommunicator/dashcommunicatorservice.cppnew file+30
@@ -0,0 +1,30 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "dashcommunicatorservice.h"
18+
19+DashCommunicatorService::DashCommunicatorService(QObject *parent):
20+ QObject(parent),
21+ m_dbusService(new DBusDashCommunicatorService(this))
22+{
23+ connect(m_dbusService, &DBusDashCommunicatorService::setCurrentScopeRequested, this, &DashCommunicatorService::setCurrentScopeRequested);
24+}
25+
26+
27+DashCommunicatorService::~DashCommunicatorService()
28+{
29+
30+}
plugins/Unity/DashCommunicator/dashcommunicatorservice.hnew file+38
@@ -0,0 +1,38 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef DASHCOMMUNICATORSERVICE_H
18+#define DASHCOMMUNICATORSERVICE_H
19+
20+#include "dbusdashcommunicatorservice.h"
21+
22+#include <QObject>
23+
24+class DashCommunicatorService: public QObject
25+{
26+ Q_OBJECT
27+public:
28+ DashCommunicatorService(QObject *parent = 0);
29+ ~DashCommunicatorService();
30+
31+Q_SIGNALS:
32+ void setCurrentScopeRequested(int index, bool animate, bool isSwipe);
33+
34+private:
35+ DBusDashCommunicatorService *m_dbusService;
36+};
37+
38+#endif // DBUSUNITYSESSIONSERVICE_H
plugins/Unity/DashCommunicator/dashconnection.cppnew file+66
@@ -0,0 +1,66 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "dashconnection.h"
18+
19+#include <QDBusInterface>
20+#include <QDBusPendingCall>
21+
22+/* The default implementation of AbstractDBusServiceMonitor creates a QDBusInterface when the service
23+ * appears on the bus.
24+ *
25+ * On construction QDBusInterface synchronously introspects the service, which will block the GUI
26+ * thread of this process if the service is busy. QDBusAbstractInterface does not perform this
27+ * introspection, so let's subclass that and avoid the blocking scenario.
28+ *
29+ * However we lose Qt's wrapping of the DBus service with a MetaObject, with the result that we
30+ * cannot easily connect to DBus signals with the usual connect() calls. So this approach only
31+ * suited to push communication with the DBus service.
32+ */
33+class AsyncDBusInterface : public QDBusAbstractInterface
34+{
35+ Q_OBJECT
36+public:
37+ AsyncDBusInterface(const QString &service, const QString &path,
38+ const QString &interface, const QDBusConnection &connection,
39+ QObject *parent = 0)
40+ : QDBusAbstractInterface(service, path, interface.toLatin1().data(), connection, parent)
41+ {}
42+ ~AsyncDBusInterface() = default;
43+};
44+
45+
46+DashConnection::DashConnection(const QString &service, const QString &path, const QString &interface, QObject *parent):
47+ AbstractDBusServiceMonitor(service, path, interface, SessionBus, parent)
48+{
49+
50+}
51+
52+/* Override the default implementation to create a non-blocking DBus interface (see note above). */
53+QDBusAbstractInterface* DashConnection::createInterface(const QString &service, const QString &path,
54+ const QString &interface, const QDBusConnection &connection)
55+{
56+ return new AsyncDBusInterface(service, path, interface, connection);
57+}
58+
59+void DashConnection::setCurrentScope(int index, bool animate, bool isSwipe)
60+{
61+ if (dbusInterface()) {
62+ dbusInterface()->asyncCall(QStringLiteral("SetCurrentScope"), index, animate, isSwipe);
63+ }
64+}
65+
66+#include "dashconnection.moc"
plugins/Unity/DashCommunicator/dashconnection.hnew file+37
@@ -0,0 +1,37 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef THREADEDDASHCONNECTION_H
18+#define THREADEDDASHCONNECTION_H
19+
20+// local
21+#include "abstractdbusservicemonitor.h"
22+
23+class DashConnection: public AbstractDBusServiceMonitor
24+{
25+ Q_OBJECT
26+public:
27+ DashConnection(const QString &service, const QString &path, const QString &interface, QObject *parent = 0);
28+
29+public Q_SLOTS:
30+ void setCurrentScope(int index, bool animate, bool isSwipe);
31+
32+private:
33+ QDBusAbstractInterface* createInterface(const QString &service, const QString &path,
34+ const QString &interface, const QDBusConnection &connection) override;
35+};
36+
37+#endif
plugins/Unity/DashCommunicator/dbusdashcommunicatorservice.cppnew file+35
@@ -0,0 +1,35 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "dbusdashcommunicatorservice.h"
18+
19+#include <QDBusConnection>
20+#include <QDBusInterface>
21+#include <QDebug>
22+
23+DBusDashCommunicatorService::DBusDashCommunicatorService(QObject *parent):
24+ UnityDBusObject(QStringLiteral("/com/canonical/UnityDash"), QStringLiteral("com.canonical.UnityDash"), false, parent)
25+{
26+}
27+
28+DBusDashCommunicatorService::~DBusDashCommunicatorService()
29+{
30+}
31+
32+void DBusDashCommunicatorService::SetCurrentScope(int index, bool animate, bool isSwipe)
33+{
34+ Q_EMIT setCurrentScopeRequested(index, animate, isSwipe);
35+}
plugins/Unity/DashCommunicator/dbusdashcommunicatorservice.hnew file+39
@@ -0,0 +1,39 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef DBUSDASHCOMMUNICATORSERVICE_H
18+#define DBUSDASHCOMMUNICATORSERVICE_H
19+
20+#include "unitydbusobject.h"
21+
22+class DBusDashCommunicatorService: public UnityDBusObject
23+{
24+ Q_OBJECT
25+ Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity.DashCommunicator")
26+
27+public:
28+ DBusDashCommunicatorService(QObject *parent = 0);
29+ ~DBusDashCommunicatorService();
30+
31+Q_SIGNALS:
32+ void setCurrentScopeRequested(int index, bool animate, bool isSwipe);
33+
34+public Q_SLOTS:
35+ Q_SCRIPTABLE void SetCurrentScope(int index, bool animate, bool isSwipe);
36+
37+};
38+
39+#endif // DBUSDASHCOMMUNICATORSERVICE_H
plugins/Unity/DashCommunicator/plugin.cppnew file+32
@@ -0,0 +1,32 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ */
18+
19+#include "plugin.h"
20+#include "dashcommunicator.h"
21+#include "dashcommunicatorservice.h"
22+
23+#include <QDBusConnection>
24+#include <QtQml/qqml.h>
25+
26+void DashCommunicatorPlugin::registerTypes(const char *uri)
27+{
28+ // @uri Unity.DashCommunicator
29+ Q_ASSERT(uri == QStringLiteral("Unity.DashCommunicator"));
30+ qmlRegisterType<DashCommunicatorService>(uri, 0, 1, "DashCommunicatorService");
31+ qmlRegisterType<DashCommunicator>(uri, 0, 1, "DashCommunicator");
32+}
plugins/Lights/LegacyLights.h → plugins/Unity/DashCommunicator/plugin.hrenamed+8−19
@@ -1,6 +1,5 @@
1/*
1/*
2 * Copyright (C) 2014 Canonical, Ltd.
2 * Copyright (C) 2014 Canonical, Ltd.
3− * Copyright (C) 2021 UBports Foundation.
4 *
3 *
5 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -14,32 +13,22 @@
14 * You should have received a copy of the GNU General Public License
13 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 *
15 *
17− * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
16+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
18 */
17 */
19
18
20−#ifndef UNITY_LEGACYLIGHTS_H
19+#ifndef DASHCOMMUNICATOR_PLUGIN_H
21−#define UNITY_LEGACYLIGHTS_H
20+#define DASHCOMMUNICATOR_PLUGIN_H
22
21
23−#include <QtCore/QObject>
22+#include <QtQml/QQmlEngine>
24−#include "Lights.h"
23+#include <QtQml/QQmlExtensionPlugin>
25
24
26−struct light_device_t;
25+class DashCommunicatorPlugin : public QQmlExtensionPlugin
27−
28−class LegacyLights: public Lights
29{
26{
30 Q_OBJECT
27 Q_OBJECT
28+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
31
29
32public:
30public:
33− ~LegacyLights();
31+ void registerTypes(const char *uri) override;
34−
35−protected:
36− bool init() override;
37− void turnOff() override;
38− void turnOn() override;
39−
40−private:
41− light_device_t* m_lightDevice;
42−
43};
32};
44
33
45#endif
34#endif
plugins/Unity/DashCommunicator/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Unity.DashCommunicator
2+plugin DashCommunicator-qml
3+typeinfo DashCommunicator.qmltypes
plugins/Unity/Indicators/CMakeLists.txt+2−1
@@ -44,7 +44,8 @@ target_link_libraries(IndicatorsQml
44 ${GLIB_LIBRARIES}
44 ${GLIB_LIBRARIES}
45 ${GIO_LIBRARIES}
45 ${GIO_LIBRARIES}
46 ${QMENUMODEL_LDFLAGS}
46 ${QMENUMODEL_LDFLAGS}
47− Qt5::Core Qt5::Qml Qt5::Quick Qt5::DBus
48)
47)
49
48
49+qt5_use_modules(IndicatorsQml Core Qml Quick DBus)
50+
50add_unity8_plugin(Unity.Indicators 0.1 Unity/Indicators TARGETS IndicatorsQml)
51add_unity8_plugin(Unity.Indicators 0.1 Unity/Indicators TARGETS IndicatorsQml)
plugins/Unity/Indicators/indicatorsmodel.cpp−13
@@ -103,19 +103,6 @@ void IndicatorsModel::setProfile(const QString &profile)
103 m_manager->setProfile(profile);
103 m_manager->setProfile(profile);
104}
104}
105
105
106−bool IndicatorsModel::light() const
107−{
108− return m_light;
109−}
110−
111−void IndicatorsModel::setLight(const bool &light)
112−{
113− if (m_light != light) {
114− m_light = light;
115− Q_EMIT lightChanged();
116− }
117−}
118−
119/*!
106/*!
120 \qmlmethod IndicatorsModel::unload()
107 \qmlmethod IndicatorsModel::unload()
121
108
plugins/Unity/Indicators/indicatorsmodel.h−9
@@ -35,9 +35,6 @@ class UNITYINDICATORS_EXPORT IndicatorsModel : public QAbstractListModel
35 Q_PROPERTY(int count READ count NOTIFY countChanged)
35 Q_PROPERTY(int count READ count NOTIFY countChanged)
36 Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
36 Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
37
37
38− // Used for tests
39− Q_PROPERTY(bool light READ light WRITE setLight NOTIFY lightChanged)
40−
41public:
38public:
42
39
43 IndicatorsModel(QObject *parent=nullptr);
40 IndicatorsModel(QObject *parent=nullptr);
@@ -51,9 +48,6 @@ public:
51 QString profile() const;
48 QString profile() const;
52 void setProfile(const QString& profile);
49 void setProfile(const QString& profile);
53
50
54− bool light() const;
55− void setLight(const bool &light);
56−
57 /* QAbstractItemModel */
51 /* QAbstractItemModel */
58 QHash<int, QByteArray> roleNames() const override;
52 QHash<int, QByteArray> roleNames() const override;
59 int columnCount(const QModelIndex &parent = QModelIndex()) const override;
53 int columnCount(const QModelIndex &parent = QModelIndex()) const override;
@@ -66,7 +60,6 @@ Q_SIGNALS:
66 void countChanged();
60 void countChanged();
67 void profileChanged();
61 void profileChanged();
68 void indicatorDataChanged(const QVariant& data);
62 void indicatorDataChanged(const QVariant& data);
69− void lightChanged();
70
63
71private Q_SLOTS:
64private Q_SLOTS:
72 void onIdentifierChanged();
65 void onIdentifierChanged();
@@ -81,8 +74,6 @@ private:
81
74
82 void notifyDataChanged(QObject *sender, int role);
75 void notifyDataChanged(QObject *sender, int role);
83 int count() const;
76 int count() const;
84−
85− bool m_light;
86};
77};
87
78
88#endif // INDICATORSMODEL_H
79#endif // INDICATORSMODEL_H
plugins/Unity/InputInfo/CMakeLists.txt+2−1
@@ -32,7 +32,8 @@ add_library(InputInfo SHARED
32target_link_libraries(InputInfo
32target_link_libraries(InputInfo
33 ${LIBUDEV_LDFLAGS}
33 ${LIBUDEV_LDFLAGS}
34 ${LIBEVDEV_LDFLAGS}
34 ${LIBEVDEV_LDFLAGS}
35− Qt5::Core Qt5::Qml Qt5::Quick
36)
35)
37
36
37+qt5_use_modules(InputInfo Core Qml Quick)
38+
38add_unity8_plugin(Unity.InputInfo 0.1 Unity/InputInfo TARGETS InputInfo)
39add_unity8_plugin(Unity.InputInfo 0.1 Unity/InputInfo TARGETS InputInfo)
plugins/Unity/Launcher/CMakeLists.txt+2−2
@@ -26,7 +26,6 @@ set(QMLLAUNCHERPLUGIN_SRC
26 asadapter.cpp
26 asadapter.cpp
27 appdrawermodel.cpp
27 appdrawermodel.cpp
28 ualwrapper.cpp
28 ualwrapper.cpp
29− xdgwatcher.cpp
30 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
29 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
31 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
30 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
32 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
31 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
@@ -48,7 +47,8 @@ target_link_libraries(UnityLauncher-qml
48 ${GSETTINGS_QT_LDFLAGS}
47 ${GSETTINGS_QT_LDFLAGS}
49 ${GLIB_LIBRARIES}
48 ${GLIB_LIBRARIES}
50 ${UAL_LIBRARIES}
49 ${UAL_LIBRARIES}
51− Qt5::DBus Qt5::Qml Qt5::Gui Qt5::Concurrent
52 )
50 )
53
51
52+qt5_use_modules(UnityLauncher-qml DBus Qml Gui)
53+
54add_unity8_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncher-qml)
54add_unity8_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncher-qml)
plugins/Unity/Launcher/appdrawermodel.cpp+19−88
@@ -1,6 +1,5 @@
1/*
1/*
2 * Copyright (C) 2016 Canonical, Ltd.
2 * Copyright (C) 2016 Canonical, Ltd.
3− * Copyright (C) 2020 UBports Foundation.
4 *
3 *
5 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -17,35 +16,30 @@
17
16
18#include "appdrawermodel.h"
17#include "appdrawermodel.h"
19#include "ualwrapper.h"
18#include "ualwrapper.h"
20−#include "xdgwatcher.h"
21
19
22#include <QDebug>
20#include <QDebug>
23#include <QDateTime>
21#include <QDateTime>
24−#include <QtConcurrentRun>
25−
26−static std::shared_ptr<LauncherItem> makeSharedLauncherItem(
27− const QString &appId, const QString &name, const QString &icon, QObject * parent)
28−{
29− return std::shared_ptr<LauncherItem>(
30− new LauncherItem(appId, name, icon, parent),
31− [] (LauncherItem *item) { item->deleteLater(); });
32−}
33
22
34AppDrawerModel::AppDrawerModel(QObject *parent):
23AppDrawerModel::AppDrawerModel(QObject *parent):
35 AppDrawerModelInterface(parent),
24 AppDrawerModelInterface(parent),
36− m_ual(new UalWrapper(this)),
25+ m_ual(new UalWrapper(this))
37− m_xdgWatcher(new XdgWatcher(this)),
38− m_refreshing(false)
39{
26{
40− connect(&m_refreshFutureWatcher, &QFutureWatcher<ItemList>::finished,
27+ Q_FOREACH (const QString &appId, UalWrapper::installedApps()) {
41− this, &AppDrawerModel::onRefreshFinished);
28+ UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
29+ if (!info.valid) {
30+ qWarning() << "Failed to get app info for app" << appId;
31+ continue;
32+ }
33+ LauncherItem* item = new LauncherItem(appId, info.name, info.icon, this);
34+ item->setKeywords(info.keywords);
35+ item->setPopularity(info.popularity);
36+ m_list.append(item);
37+ }
42
38
43 // keep this a queued connection as it's coming from another thread.
39 // keep this a queued connection as it's coming from another thread.
44− connect(m_xdgWatcher, &XdgWatcher::appAdded, this, &AppDrawerModel::appAdded, Qt::QueuedConnection);
40+ connect(m_ual, &UalWrapper::appAdded, this, &AppDrawerModel::appAdded, Qt::QueuedConnection);
45− connect(m_xdgWatcher, &XdgWatcher::appRemoved, this, &AppDrawerModel::appRemoved, Qt::QueuedConnection);
41+ connect(m_ual, &UalWrapper::appRemoved, this, &AppDrawerModel::appRemoved, Qt::QueuedConnection);
46− connect(m_xdgWatcher, &XdgWatcher::appInfoChanged, this, &AppDrawerModel::appInfoChanged, Qt::QueuedConnection);
42+ connect(m_ual, &UalWrapper::appInfoChanged, this, &AppDrawerModel::appInfoChanged, Qt::QueuedConnection);
47−
48− refresh();
49}
43}
50
44
51int AppDrawerModel::rowCount(const QModelIndex &parent) const
45int AppDrawerModel::rowCount(const QModelIndex &parent) const
@@ -74,10 +68,6 @@ QVariant AppDrawerModel::data(const QModelIndex &index, int role) const
74
68
75void AppDrawerModel::appAdded(const QString &appId)
69void AppDrawerModel::appAdded(const QString &appId)
76{
70{
77− if (m_refreshing)
78− // Will be replaced by the refresh result anyway.
79− return;
80−
81 UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
71 UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
82 if (!info.valid) {
72 if (!info.valid) {
83 qWarning() << "App added signal received but failed to get app info for app" << appId;
73 qWarning() << "App added signal received but failed to get app info for app" << appId;
@@ -85,19 +75,15 @@ void AppDrawerModel::appAdded(const QString &appId)
85 }
75 }
86
76
87 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
77 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
88− auto item = makeSharedLauncherItem(appId, info.name, info.icon, /* parent */ nullptr);
78+ LauncherItem* item = new LauncherItem(appId, info.name, info.icon, this);
89 item->setKeywords(info.keywords);
79 item->setKeywords(info.keywords);
90 item->setPopularity(info.popularity);
80 item->setPopularity(info.popularity);
91− m_list.append(std::move(item));
81+ m_list.append(item);
92 endInsertRows();
82 endInsertRows();
93}
83}
94
84
95void AppDrawerModel::appRemoved(const QString &appId)
85void AppDrawerModel::appRemoved(const QString &appId)
96{
86{
97− if (m_refreshing)
98− // Will be replaced by the refresh result anyway.
99− return;
100−
101 int idx = -1;
87 int idx = -1;
102 for (int i = 0; i < m_list.count(); i++) {
88 for (int i = 0; i < m_list.count(); i++) {
103 if (m_list.at(i)->appId() == appId) {
89 if (m_list.at(i)->appId() == appId) {
@@ -110,17 +96,13 @@ void AppDrawerModel::appRemoved(const QString &appId)
110 return;
96 return;
111 }
97 }
112 beginRemoveRows(QModelIndex(), idx, idx);
98 beginRemoveRows(QModelIndex(), idx, idx);
113− m_list.removeAt(idx);
99+ m_list.takeAt(idx)->deleteLater();
114 endRemoveRows();
100 endRemoveRows();
115}
101}
116
102
117void AppDrawerModel::appInfoChanged(const QString &appId)
103void AppDrawerModel::appInfoChanged(const QString &appId)
118{
104{
119− if (m_refreshing)
120− // Will be replaced by the refresh result anyway.
121− return;
122−
123− std::shared_ptr<LauncherItem> item;
105+ LauncherItem *item = nullptr;
124 int idx = -1;
106 int idx = -1;
125
107
126 for(int i = 0; i < m_list.count(); i++) {
108 for(int i = 0; i < m_list.count(); i++) {
@@ -139,54 +121,3 @@ void AppDrawerModel::appInfoChanged(const QString &appId)
139 item->setPopularity(info.popularity);
121 item->setPopularity(info.popularity);
140 Q_EMIT dataChanged(index(idx), index(idx), {AppDrawerModelInterface::RoleUsage});
122 Q_EMIT dataChanged(index(idx), index(idx), {AppDrawerModelInterface::RoleUsage});
141}
123}
142−
143−bool AppDrawerModel::refreshing() {
144− return m_refreshing;
145−}
146−
147−void AppDrawerModel::refresh() {
148− if (m_refreshing)
149− return;
150−
151− m_refreshFutureWatcher.setFuture(QtConcurrent::run([](QThread *thread) {
152− ItemList list;
153−
154− Q_FOREACH (const QString &appId, UalWrapper::installedApps()) {
155− UalWrapper::AppInfo info = UalWrapper::getApplicationInfo(appId);
156− if (!info.valid) {
157− qWarning() << "Failed to get app info for app" << appId;
158− continue;
159− }
160− // We don't pass parent in because this may run after the model is destroyed.
161− // (And, in fact, we can't, because the model is in a diferent thread.)
162− auto item = makeSharedLauncherItem(appId, info.name, info.icon, /* parent */ nullptr);
163− item->setKeywords(info.keywords);
164− item->setPopularity(info.popularity);
165− item->moveToThread(thread);
166− list.append(std::move(item));
167− }
168−
169− return list;
170− }, this->thread()));
171−
172− m_refreshing = true;
173− Q_EMIT refreshingChanged();
174−}
175−
176−void AppDrawerModel::onRefreshFinished() {
177− if (m_refreshFutureWatcher.isCanceled())
178− // This is the result of setting canceled future below.
179− return;
180−
181− beginResetModel();
182−
183− m_list = m_refreshFutureWatcher.result();
184− // Remove the future & its result, so that future modifications won't
185− // create a copy.
186− m_refreshFutureWatcher.setFuture(QFuture<ItemList>());
187−
188− endResetModel();
189−
190− m_refreshing = false;
191− Q_EMIT refreshingChanged();
192−}
plugins/Unity/Launcher/appdrawermodel.h+2−25
@@ -1,6 +1,5 @@
1/*
1/*
2 * Copyright (C) 2016 Canonical, Ltd.
2 * Copyright (C) 2016 Canonical, Ltd.
3− * Copyright (C) 2020 UBports Foundation.
4 *
3 *
5 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -15,50 +14,28 @@
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
15 */
17
16
18−#include <memory>
17+
19−#include <QFutureWatcher>
20#include <unity/shell/launcher/AppDrawerModelInterface.h>
18#include <unity/shell/launcher/AppDrawerModelInterface.h>
21
19
22#include "launcheritem.h"
20#include "launcheritem.h"
23
21
24class UalWrapper;
22class UalWrapper;
25−class XdgWatcher;
26
23
27class AppDrawerModel: public AppDrawerModelInterface
24class AppDrawerModel: public AppDrawerModelInterface
28{
25{
29 Q_OBJECT
26 Q_OBJECT
30− // TODO: Add this to AppDrawerModelInterface in unity-api.
31− // Or, better yet, remove AppDrawerModelInterface from unity-api.
32− Q_PROPERTY(bool refreshing READ refreshing NOTIFY refreshingChanged)
33public:
27public:
34 AppDrawerModel(QObject* parent = nullptr);
28 AppDrawerModel(QObject* parent = nullptr);
35
29
36 int rowCount(const QModelIndex &parent) const override;
30 int rowCount(const QModelIndex &parent) const override;
37 QVariant data(const QModelIndex &index, int role) const override;
31 QVariant data(const QModelIndex &index, int role) const override;
38
32
39− // TODO: add these to AppDrawerModelInterface too.
40− bool refreshing();
41− Q_INVOKABLE void refresh();
42−
43−Q_SIGNALS:
44− void refreshingChanged();
45−
46private Q_SLOTS:
33private Q_SLOTS:
47 void appAdded(const QString &appId);
34 void appAdded(const QString &appId);
48 void appRemoved(const QString &appId);
35 void appRemoved(const QString &appId);
49 void appInfoChanged(const QString &appId);
36 void appInfoChanged(const QString &appId);
50
37
51− void onRefreshFinished();
52−
53private:
38private:
54− // Using shared_ptr is unavoidable in order to share the refresh result
55− // from the worker thread safely without a memory leak, in case the model
56− // is destructed before the worker finishes.
57− typedef QList<std::shared_ptr<LauncherItem>> ItemList;
39+ QList<LauncherItem*> m_list;
58−
59− ItemList m_list;
60 UalWrapper *m_ual;
40 UalWrapper *m_ual;
61− XdgWatcher *m_xdgWatcher;
62− QFutureWatcher<ItemList> m_refreshFutureWatcher;
63− bool m_refreshing;
64};
41};
plugins/Unity/Launcher/launcheritem.cpp+1
@@ -37,6 +37,7 @@ LauncherItem::LauncherItem(const QString &appId, const QString &name, const QStr
37 m_alerting(false),
37 m_alerting(false),
38 m_quickList(new QuickListModel(this))
38 m_quickList(new QuickListModel(this))
39{
39{
40+ Q_ASSERT(parent != nullptr);
40 QuickListEntry nameAction;
41 QuickListEntry nameAction;
41 nameAction.setActionId(QStringLiteral("launch_item"));
42 nameAction.setActionId(QStringLiteral("launch_item"));
42 nameAction.setText(m_name);
43 nameAction.setText(m_name);
plugins/Unity/Launcher/launchermodel.cpp+5
@@ -521,6 +521,11 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
521 return;
521 return;
522 }
522 }
523
523
524+ if (app->appId() == QLatin1String("unity8-dash")) {
525+ // Not adding the dash app
526+ return;
527+ }
528+
524 const int itemIndex = findApplication(app->appId());
529 const int itemIndex = findApplication(app->appId());
525 if (itemIndex != -1) {
530 if (itemIndex != -1) {
526 LauncherItem *item = m_list.at(itemIndex);
531 LauncherItem *item = m_list.at(itemIndex);
plugins/Unity/Launcher/ualwrapper.cpp+11
@@ -24,6 +24,17 @@ using namespace ubuntu::app_launch;
24UalWrapper::UalWrapper(QObject *parent):
24UalWrapper::UalWrapper(QObject *parent):
25 QObject(parent)
25 QObject(parent)
26{
26{
27+/* Disable for now
28+ Registry::appAdded().connect([this](const std::shared_ptr<Application>&app) {
29+ Q_EMIT appAdded(QString::fromStdString(app->appId()));
30+ });
31+ Registry::appRemoved().connect([this](const AppID &appId) {
32+ Q_EMIT appRemoved(QString::fromStdString(appId));
33+ });
34+ Registry::appInfoUpdated().connect([this](const std::shared_ptr<Application>&app){
35+ Q_EMIT appInfoChanged(QString::fromStdString(app->appId()));
36+ });
37+*/
27}
38}
28
39
29QStringList UalWrapper::installedApps()
40QStringList UalWrapper::installedApps()
plugins/Unity/Launcher/ualwrapper.h+5
@@ -33,4 +33,9 @@ public:
33
33
34 static QStringList installedApps();
34 static QStringList installedApps();
35 static AppInfo getApplicationInfo(const QString &appId);
35 static AppInfo getApplicationInfo(const QString &appId);
36+
37+Q_SIGNALS:
38+ void appAdded(const QString &appId);
39+ void appRemoved(const QString &appId);
40+ void appInfoChanged(const QString &appId);
36};
41};
plugins/Unity/Launcher/xdgwatcher.cppdeleted−129
@@ -1,129 +0,0 @@
1−/*
2− * Copyright (C) 2019 UBports Foundation
3− * Author(s): Marius Gripsgard <marius@ubports.com>
4− *
5− * This program is free software; you can redistribute it and/or modify
6− * it under the terms of the GNU General Public License as published by
7− * the Free Software Foundation; version 3.
8− *
9− * This program is distributed in the hope that it will be useful,
10− * but WITHOUT ANY WARRANTY; without even the implied warranty of
11− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12− * GNU General Public License for more details.
13− *
14− * You should have received a copy of the GNU General Public License
15− * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− */
17−
18−#include "xdgwatcher.h"
19−
20−#include <QDebug>
21−#include <QDir>
22−#include <QFile>
23−#include <QStandardPaths>
24−#include <QTextStream>
25−
26−XdgWatcher::XdgWatcher(QObject* parent)
27− : QObject(parent),
28− m_watcher(new QFileSystemWatcher(this))
29−{
30− connect(m_watcher, &QFileSystemWatcher::directoryChanged, this, &XdgWatcher::onDirectoryChanged);
31− connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &XdgWatcher::onFileChanged);
32−
33− const auto paths = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
34− for (const auto &path: paths) {
35− const auto qdir = QDir(path);
36− if (!qdir.exists()) {
37− continue;
38− }
39−
40− // Add the path itself to watch for newly added apps
41− m_watcher->addPath(path);
42−
43− // Add watcher for eatch app to watch for changes
44− const auto files = qdir.entryInfoList(QDir::Files);
45− for (const auto &file: files) {
46− if (file.suffix() == "desktop") {
47− const auto path = file.absoluteFilePath();
48− m_watcher->addPath(path);
49− m_registry.insert(path, getAppId(file));
50− }
51− }
52− }
53−}
54−
55−// "Ubuntu style" appID is filename without versionNumber after last "_"
56−const QString XdgWatcher::stripAppIdVersion(const QString rawAppID) const {
57− auto appIdComponents = rawAppID.split("_");
58− appIdComponents.removeLast();
59− return appIdComponents.join("_");
60−}
61−
62−// Standard appID see:
63−// https://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#desktop-file-id
64−const QString XdgWatcher::toStandardAppId(const QFileInfo fileInfo) const {
65− const auto paths = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
66− for (const auto &path: paths) {
67− if (fileInfo.absolutePath() == path) {
68− break;
69− }
70− if (fileInfo.absolutePath().contains(path)) {
71− auto fileStr = fileInfo.absoluteFilePath();
72− fileStr.replace(path, "");
73− fileStr.replace("/", "-");
74− fileStr.replace(".desktop", "");
75− return fileStr;
76− }
77− }
78− return fileInfo.completeBaseName();
79−}
80−
81−const QString XdgWatcher::getAppId(const QFileInfo fileInfo) const {
82− // We need to open the file to check if its and Ual application
83− // as we cant just rely on the app name as "normal" apps can also
84− // contain 3 _ causing us to belive its an ubuntu app
85− // Example kde_org_kate would become kde_org
86− QFile qFile(fileInfo.absoluteFilePath());
87− qFile.open(QIODevice::ReadOnly);
88− QTextStream fileStream(&qFile);
89− QString line;
90− while (fileStream.readLineInto(&line)) {
91− if (line.startsWith("X-Ubuntu-Application-ID=")) {
92− auto rawAppID = line.replace("X-Ubuntu-Application-ID=", "");
93− qFile.close();
94− return stripAppIdVersion(rawAppID);
95− }
96− }
97− qFile.close();
98−
99− // If it's not an "Ubuntu" appID, we follow freedesktop standard
100− return toStandardAppId(fileInfo);
101−}
102−
103−// Watch for newly added apps
104−void XdgWatcher::onDirectoryChanged(const QString &path) {
105− const auto files = QDir(path).entryInfoList(QDir::Files);
106− const auto watchedFiles = m_watcher->files();
107− for (const auto &file: files) {
108− const auto appPath = file.absoluteFilePath();
109− if (file.suffix() == "desktop" && !watchedFiles.contains(appPath)) {
110− m_watcher->addPath(appPath);
111−
112− const auto appId = getAppId(file);
113− m_registry.insert(appPath, appId);
114− Q_EMIT appAdded(appId);
115− }
116− }
117−}
118−
119−void XdgWatcher::onFileChanged(const QString &path) {
120− QFileInfo file(path);
121− if (file.exists()) {
122− // The file exists, this must be an modify event
123− Q_EMIT appInfoChanged(m_registry.value(path));
124− } else {
125− // File does not exist, assume this is an remove event.
126− // onDirectoryChanged will handle rename event
127− Q_EMIT appRemoved(m_registry.take(path));
128− }
129−}
plugins/Unity/Launcher/xdgwatcher.hdeleted−46
@@ -1,46 +0,0 @@
1−/*
2− * Copyright (C) 2019 UBports Foundation
3− * Author(s): Marius Gripsgard <marius@ubports.com>
4− *
5− * This program is free software; you can redistribute it and/or modify
6− * it under the terms of the GNU General Public License as published by
7− * the Free Software Foundation; version 3.
8− *
9− * This program is distributed in the hope that it will be useful,
10− * but WITHOUT ANY WARRANTY; without even the implied warranty of
11− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12− * GNU General Public License for more details.
13− *
14− * You should have received a copy of the GNU General Public License
15− * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− */
17−
18−#include <QFileSystemWatcher>
19−#include <QHash>
20−#include <QFileInfo>
21−
22−class QFileInfo;
23−
24−class XdgWatcher: public QObject
25−{
26− Q_OBJECT
27−public:
28− XdgWatcher(QObject* parent = nullptr);
29−
30−Q_SIGNALS:
31− void appAdded(const QString &appId);
32− void appRemoved(const QString &appId);
33− void appInfoChanged(const QString &appId);
34−
35−private Q_SLOTS:
36− void onDirectoryChanged(const QString &path);
37− void onFileChanged(const QString &path);
38−
39−private:
40− const QString toStandardAppId(const QFileInfo fileInfo) const;
41− const QString getAppId(const QFileInfo file) const;
42− const QString stripAppIdVersion(const QString rawAppID) const;
43−
44− QFileSystemWatcher* m_watcher;
45− QHash<const QString, QString> m_registry;
46−};
plugins/Unity/Platform/CMakeLists.txt+1−1
@@ -6,6 +6,6 @@ set(platformplugin_SRCS
6
6
7add_library(Platform-qml SHARED ${platformplugin_SRCS})
7add_library(Platform-qml SHARED ${platformplugin_SRCS})
8
8
9−target_link_libraries(Platform-qml Qt5::DBus Qt5::Qml)
9+qt5_use_modules(Platform-qml DBus Qml)
10
10
11add_unity8_plugin(Unity.Platform 1.0 Unity/Platform TARGETS Platform-qml)
11add_unity8_plugin(Unity.Platform 1.0 Unity/Platform TARGETS Platform-qml)
plugins/Unity/Session/CMakeLists.txt+1−1
@@ -18,8 +18,8 @@ add_library(UnitySession-qml MODULE
18 ${QMLSESSIONPLUGIN_SRC}
18 ${QMLSESSIONPLUGIN_SRC}
19 )
19 )
20
20
21+qt5_use_modules(UnitySession-qml DBus Qml)
21target_link_libraries(UnitySession-qml
22target_link_libraries(UnitySession-qml
22− Qt5::DBus Qt5::Qml
23 unity8-private
23 unity8-private
24 ${GIO_LDFLAGS}
24 ${GIO_LDFLAGS}
25 ${GLIB_LIBRARIES}
25 ${GLIB_LIBRARIES}
plugins/Utils/CMakeLists.txt+4−3
@@ -7,6 +7,7 @@ include_directories(
7 SYSTEM
7 SYSTEM
8 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
8 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
9 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
9 ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
10+ ${GIO_INCLUDE_DIRS}
10)
11)
11
12
12set(QMLPLUGIN_SRC
13set(QMLPLUGIN_SRC
@@ -43,9 +44,7 @@ add_library(Utils-qml SHARED
43 ${QMLPLUGIN_SRC}
44 ${QMLPLUGIN_SRC}
44 )
45 )
45
46
46−target_link_libraries(Utils-qml
47+target_link_libraries(Utils-qml ${GIO_LDFLAGS})
47− Qt5::Qml Qt5::Quick Qt5::DBus Qt5::Network Qt5::Gui Qt5::Sql Qt5::Concurrent
48− )
49
48
50# Because this is an internal support library, we want
49# Because this is an internal support library, we want
51# to expose all symbols in it. Consider changing this
50# to expose all symbols in it. Consider changing this
@@ -53,4 +52,6 @@ target_link_libraries(Utils-qml
53# files directly in targets.
52# files directly in targets.
54set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
53set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
55
54
55+qt5_use_modules(Utils-qml Qml Quick DBus Network Gui Sql Concurrent)
56+
56add_unity8_plugin(Utils 0.1 Utils TARGETS Utils-qml)
57add_unity8_plugin(Utils 0.1 Utils TARGETS Utils-qml)
plugins/Utils/appdrawerproxymodel.cpp+1−1
@@ -158,7 +158,7 @@ bool AppDrawerProxyModel::filterAcceptsRow(int source_row, const QModelIndex &so
158 allWords.prepend(m_source->data(m_source->index(source_row, 0), AppDrawerModelInterface::RoleName).toString());
158 allWords.prepend(m_source->data(m_source->index(source_row, 0), AppDrawerModelInterface::RoleName).toString());
159 bool found = false;
159 bool found = false;
160 Q_FOREACH (const QString &currentWord, allWords) {
160 Q_FOREACH (const QString &currentWord, allWords) {
161− if (currentWord.contains(m_filterString, Qt::CaseInsensitive)) {
161+ if (currentWord.startsWith(m_filterString, Qt::CaseInsensitive)) {
162 found = true;
162 found = true;
163 break;
163 break;
164 }
164 }
plugins/Utils/deviceconfigparser.cpp−18
@@ -116,24 +116,6 @@ QString DeviceConfigParser::category() const
116 return value;
116 return value;
117}
117}
118
118
119−bool DeviceConfigParser::supportsMultiColorLed() const
120−{
121− return readBoolFromConfig("SupportsMultiColorLed", true);
122−}
123−
124−bool DeviceConfigParser::readBoolFromConfig(const QString &key, bool defaultValue) const
125−{
126− m_config->beginGroup(m_name);
127−
128− bool ret = defaultValue;
129− if (m_config->contains(key)) {
130− ret = m_config->value(key).toBool();
131− }
132−
133− m_config->endGroup();
134− return ret;
135−}
136−
137QStringList DeviceConfigParser::readOrientationsFromConfig(const QString &key) const
119QStringList DeviceConfigParser::readOrientationsFromConfig(const QString &key) const
138{
120{
139 m_config->beginGroup(m_name);
121 m_config->beginGroup(m_name);
plugins/Utils/deviceconfigparser.h−3
@@ -33,7 +33,6 @@ class DeviceConfigParser: public QObject
33 Q_PROPERTY(Qt::ScreenOrientation portraitOrientation READ portraitOrientation NOTIFY changed)
33 Q_PROPERTY(Qt::ScreenOrientation portraitOrientation READ portraitOrientation NOTIFY changed)
34 Q_PROPERTY(Qt::ScreenOrientation invertedPortraitOrientation READ invertedPortraitOrientation NOTIFY changed)
34 Q_PROPERTY(Qt::ScreenOrientation invertedPortraitOrientation READ invertedPortraitOrientation NOTIFY changed)
35 Q_PROPERTY(QString category READ category NOTIFY changed)
35 Q_PROPERTY(QString category READ category NOTIFY changed)
36− Q_PROPERTY(bool supportsMultiColorLed READ supportsMultiColorLed NOTIFY changed)
37
36
38public:
37public:
39 DeviceConfigParser(QObject *parent = nullptr);
38 DeviceConfigParser(QObject *parent = nullptr);
@@ -48,7 +47,6 @@ public:
48 Qt::ScreenOrientation portraitOrientation() const;
47 Qt::ScreenOrientation portraitOrientation() const;
49 Qt::ScreenOrientation invertedPortraitOrientation() const;
48 Qt::ScreenOrientation invertedPortraitOrientation() const;
50 QString category() const;
49 QString category() const;
51− bool supportsMultiColorLed() const;
52
50
53Q_SIGNALS:
51Q_SIGNALS:
54 void changed();
52 void changed();
@@ -60,7 +58,6 @@ private:
60 QStringList readOrientationsFromConfig(const QString &key) const;
58 QStringList readOrientationsFromConfig(const QString &key) const;
61 QString readOrientationFromConfig(const QString &key) const;
59 QString readOrientationFromConfig(const QString &key) const;
62 Qt::ScreenOrientation stringToOrientation(const QString &orientationString, Qt::ScreenOrientation defaultValue) const;
60 Qt::ScreenOrientation stringToOrientation(const QString &orientationString, Qt::ScreenOrientation defaultValue) const;
63− bool readBoolFromConfig(const QString &key, bool defaultValue) const;
64};
61};
65
62
66#endif
63#endif
plugins/Utils/windowstatestorage.cpp+131−293
@@ -1,6 +1,5 @@
1/*
1/*
2 * Copyright 2015-2016 Canonical Ltd.
2 * Copyright 2015-2016 Canonical Ltd.
3− * Copyright 2021 UBports Foundation
4 *
3 *
5 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
5 * it under the terms of the GNU Lesser General Public License as published by
@@ -17,344 +16,185 @@
17
16
18#include "windowstatestorage.h"
17#include "windowstatestorage.h"
19
18
19+#include <QtConcurrent>
20#include <QDebug>
20#include <QDebug>
21−#include <QDir>
21+#include <QFutureSynchronizer>
22−#include <QMetaObject>
23−#include <QObject>
24#include <QSqlQuery>
22#include <QSqlQuery>
25#include <QSqlError>
23#include <QSqlError>
26#include <QSqlResult>
24#include <QSqlResult>
27−#include <QStandardPaths>
28#include <QRect>
25#include <QRect>
29#include <unity/shell/application/ApplicationInfoInterface.h>
26#include <unity/shell/application/ApplicationInfoInterface.h>
30
27
28+QMutex WindowStateStorage::s_mutex;
31
29
32−class AsyncQuery: public QObject
30+inline QString sanitiseString(QString string) {
33−{
31+ return string.remove(QLatin1Char('\"'))
34− Q_OBJECT
32+ .remove(QLatin1Char('\''))
33+ .remove(QLatin1Char('\\'));
34+}
35
35
36−public:
36+WindowStateStorage::WindowStateStorage(QObject *parent):
37− AsyncQuery(const QString &dbName):
37+ QObject(parent)
38− m_dbName(dbName)
38+{
39− {
39+ const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
40+ m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"));
41+ QDir dir;
42+ dir.mkpath(dbPath);
43+ m_db.setDatabaseName(dbPath + "windowstatestorage.sqlite");
44+ initdb();
40− }
45+}
41
46
42− ~AsyncQuery()
47+WindowStateStorage::~WindowStateStorage()
43− {
48+{
44− QSqlDatabase::removeDatabase(m_connectionName);
49+ QFutureSynchronizer<void> futureSync;
50+ for (int i = 0; i < m_asyncQueries.count(); ++i) {
51+ futureSync.addFuture(m_asyncQueries[i]);
45 }
52 }
53+ futureSync.waitForFinished();
54+ m_db.close();
55+}
46
56
47− Q_INVOKABLE const QString getDbName()
57+void WindowStateStorage::saveState(const QString &windowId, WindowStateStorage::WindowState state)
48− {
58+{
49− if (!m_ok) {
59+ const QString queryString = QStringLiteral("INSERT OR REPLACE INTO state (windowId, state) values ('%1', '%2');")
50− return "ERROR";
60+ .arg(sanitiseString(windowId))
51− }
61+ .arg((int)state);
52− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
53− return connection.databaseName();
54− }
55
62
56− Q_INVOKABLE bool initdb()
63+ saveValue(queryString);
57− {
58− if (m_ok) {
59− return true;
60− }
61− QSqlDatabase connection = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), m_connectionName);
62− connection.setDatabaseName(m_dbName);
63− connection.setConnectOptions(QStringLiteral("QSQLITE_BUSY_TIMEOUT=1000"));
64− if (!connection.open()) {
65− qWarning() << "AsyncQuery::initdb: Error opening state database. Window positions will not be saved or restored." << m_dbName << connection.lastError().driverText() << connection.lastError().databaseText();
66− return false;
67− }
68− QSqlQuery query(connection);
69−
70− if (!connection.tables().contains(QStringLiteral("geometry"))) {
71− QString geometryQuery = QStringLiteral("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);");
72− if (!query.exec(geometryQuery)) {
73− logSqlError(query);
74− return false;
75− }
76− }
77−
78− if (!connection.tables().contains(QStringLiteral("state"))) {
79− QString stateQuery = QStringLiteral("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);");
80− if (!query.exec(stateQuery)) {
81− logSqlError(query);
82− return false;
83− }
84− }
85−
86− if (!connection.tables().contains(QStringLiteral("stage"))) {
87− QString stageQuery = QStringLiteral("CREATE TABLE stage(appId TEXT UNIQUE, stage INTEGER);");
88− if (!query.exec(stageQuery)) {
89− logSqlError(query);
90− return false;
91− }
92− }
93− m_ok = true;
94− return true;
95− }
64+}
96
65
97− Q_INVOKABLE int getState(const QString &windowId) const
66+WindowStateStorage::WindowState WindowStateStorage::getState(const QString &windowId, WindowStateStorage::WindowState defaultValue) const
98− {
67+{
99− if (!m_ok) {
68+ const QString queryString = QStringLiteral("SELECT state FROM state WHERE windowId = '%1';")
100− return -1;
69+ .arg(sanitiseString(windowId));
101− }
102− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
103− QSqlQuery query(connection);
104− query.prepare(m_getStateQuery);
105− query.bindValue(":windowId", windowId);
106− query.exec();
107− if (!query.isActive() || !query.isSelect()) {
108− logSqlError(query);
109− return -1;
110− }
111− if (!query.first()) {
112− return -1;
113− }
114− bool converted = false;
115− QVariant resultStr = query.value(0);
116− int result = resultStr.toInt(&converted);
117− if (converted) {
118− return result;
119− } else {
120− qWarning() << "getState result expected integer, got " << resultStr;
121− return -1;
122− }
123− }
124
70
125− Q_INVOKABLE QRect getGeometry(const QString &windowId) const
126− {
127− if (!m_ok) {
128− return QRect();
129− }
130− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
131− QSqlQuery query(connection);
71+ QSqlQuery query = getValue(queryString);
132− query.prepare(m_getGeometryQuery);
133− query.bindValue(":windowId", windowId);
134− query.exec();
135− if (!query.isActive() || !query.isSelect()) {
136− logSqlError(query);
137− return QRect();
138− }
139−
140− if (!query.first()) {
141− return QRect();
142− }
143−
144− bool xConverted, yConverted, widthConverted, heightConverted = false;
145− int x, y, width, height;
146− QVariant xResultStr = query.value(QStringLiteral("x"));
147− QVariant yResultStr = query.value(QStringLiteral("y"));
148− QVariant widthResultStr = query.value(QStringLiteral("width"));
149− QVariant heightResultStr = query.value(QStringLiteral("height"));
150− x = xResultStr.toInt(&xConverted);
151− y = yResultStr.toInt(&yConverted);
152− width = widthResultStr.toInt(&widthConverted);
153− height = heightResultStr.toInt(&heightConverted);
154−
155− if (xConverted && yConverted && widthConverted && heightConverted) {
156− return QRect(x, y, width, height);
157− } else {
158− qWarning() << "getGeometry result expected integers, got x:"
159− << xResultStr << "y:" << yResultStr << "width" << widthResultStr
160− << "height:" << heightResultStr;
161− return QRect();
162− }
163
72
73+ if (!query.first()) {
74+ return defaultValue;
164 }
75 }
76+ return (WindowState)query.value(QStringLiteral("state")).toInt();
77+}
165
78
166− Q_INVOKABLE int getStage(const QString &appId) const
79+void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect)
167− {
80+{
168− if (!m_ok) {
81+ const QString queryString = QStringLiteral("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
169− return -1;
82+ .arg(sanitiseString(windowId))
170− }
83+ .arg(rect.x())
171− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
84+ .arg(rect.y())
172− QSqlQuery query(connection);
85+ .arg(rect.width())
173− query.prepare(m_getStageQuery);
86+ .arg(rect.height());
174− query.bindValue(":appId", appId);
87+
175− query.exec();
88+ saveValue(queryString);
176− if (!query.isActive() || !query.isSelect()) {
177− logSqlError(query);
178− return -1;
179− }
180− if (!query.first()) {
181− return -1;
182− }
183− bool converted = false;
184− QVariant resultStr = query.value(0);
185− int result = resultStr.toInt(&converted);
186− if (converted) {
187− return result;
188− } else {
189− qWarning() << "getStage result expected integer, got " << resultStr;
190− return -1;
191− }
192− }
89+}
193
90
194−public Q_SLOTS:
91+void WindowStateStorage::saveStage(const QString &appId, int stage)
195−
92+{
196− void saveState(const QString &windowId, WindowStateStorage::WindowState state)
93+ const QString queryString = QStringLiteral("INSERT OR REPLACE INTO stage (appId, stage) values ('%1', '%2');")
197− {
94+ .arg(sanitiseString(appId))
198− if (!m_ok) {
95+ .arg(stage);
199− return;
200− }
201− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
202− QSqlQuery query(connection);
203− query.prepare(m_saveStateQuery);
204− query.bindValue(":windowId", windowId);
205− query.bindValue(":state", (int)state);
206− if (!query.exec()) {
207− logSqlError(query);
208− }
209− }
210
96
211− void saveGeometry(const QString &windowId, const QRect &rect)
97+ saveValue(queryString);
212− {
213− if (!m_ok) {
214− return;
215− }
216− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
217− QSqlQuery query(connection);
218− query.prepare(m_saveGeometryQuery);
219− query.bindValue(":windowId", windowId);
220− query.bindValue(":x", rect.x());
221− query.bindValue(":y", rect.y());
222− query.bindValue(":width", rect.width());
223− query.bindValue(":height", rect.height());
224− if (!query.exec()) {
225− logSqlError(query);
226− }
227− }
98+}
228
99
229− void saveStage(const QString &appId, int stage)
100+int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
230− {
101+{
231− if (!m_ok) {
102+ const QString queryString = QStringLiteral("SELECT stage FROM stage WHERE appId = '%1';")
232− return;
103+ .arg(sanitiseString(appId));
233− }
234− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
235− QSqlQuery query(connection);
236− query.prepare(m_saveStageQuery);
237− query.bindValue(":appId", appId);
238− query.bindValue(":stage", stage);
239− if (!query.exec()) {
240− logSqlError(query);
241− }
242− }
243
104
244−private:
105+ QSqlQuery query = getValue(queryString);
245− static const QString m_connectionName;
246− static const QString m_getStateQuery;
247− static const QString m_saveStateQuery;
248− static const QString m_getGeometryQuery;
249− static const QString m_saveGeometryQuery;
250− static const QString m_getStageQuery;
251− static const QString m_saveStageQuery;
252−
253− static void logSqlError(const QSqlQuery query)
254− {
255− qWarning() << "Error executing query" << query.lastQuery()
256− << "Driver error:" << query.lastError().driverText()
257− << "Database error:" << query.lastError().databaseText();
258− }
259
106
260− QString m_dbName;
107+ if (!query.first()) {
261− bool m_ok = false;
108+ return defaultValue;
262−};
263−
264−const QString AsyncQuery::m_connectionName = QStringLiteral("WindowStateStorage");
265−const QString AsyncQuery::m_getStateQuery = QStringLiteral("SELECT state FROM state WHERE windowId = :windowId");
266−const QString AsyncQuery::m_saveStateQuery = QStringLiteral("INSERT OR REPLACE INTO state (windowId, state) values (:windowId, :state)");
267−const QString AsyncQuery::m_getGeometryQuery = QStringLiteral("SELECT * FROM geometry WHERE windowId = :windowId");
268−const QString AsyncQuery::m_saveGeometryQuery = QStringLiteral("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values (:windowId, :x, :y, :width, :height)");
269−const QString AsyncQuery::m_getStageQuery = QStringLiteral("SELECT stage FROM stage WHERE appId = :appId");
270−const QString AsyncQuery::m_saveStageQuery = QStringLiteral("INSERT OR REPLACE INTO stage (appId, stage) values (:appId, :stage)");
271−
272−WindowStateStorage::WindowStateStorage(const QString &dbName, QObject *parent):
273− QObject(parent),
274− m_thread()
275−{
276− qRegisterMetaType<WindowStateStorage::WindowState>("WindowStateStorage::WindowState");
277− QString dbFile;
278− if (dbName.isEmpty()) {
279− const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
280− QDir dir;
281− dir.mkpath(dbPath);
282− dbFile = QString(dbPath) + QStringLiteral("windowstatestorage.sqlite");
283− } else {
284− dbFile = dbName;
285 }
109 }
286− m_asyncQuery = new AsyncQuery(dbFile);
110+ return query.value("stage").toInt();
287− m_asyncQuery->moveToThread(&m_thread);
288− connect(&m_thread, &QThread::finished, m_asyncQuery, &QObject::deleteLater);
289− m_thread.start();
290− // Note that we're relying on initdb being called before any other methods
291− // on AsyncQuery. Given the current behavior of QueuedConnection (slots
292− // invoked in the order they are received), this is fine.
293− QMetaObject::invokeMethod(m_asyncQuery, "initdb",
294− Qt::QueuedConnection);
295− connect(this, &WindowStateStorage::saveState, m_asyncQuery, &AsyncQuery::saveState);
296− connect(this, &WindowStateStorage::saveGeometry, m_asyncQuery, &AsyncQuery::saveGeometry);
297− connect(this, &WindowStateStorage::saveStage, m_asyncQuery, &AsyncQuery::saveStage);
298}
111}
299
112
300−WindowStateStorage::~WindowStateStorage()
113+void WindowStateStorage::executeAsyncQuery(const QString &queryString)
301{
114{
302− m_thread.quit();
115+ QMutexLocker l(&s_mutex);
303− m_thread.wait();
116+ QSqlQuery query;
117+
118+ bool ok = query.exec(queryString);
119+ if (!ok) {
120+ qWarning() << "Error executing query" << queryString
121+ << "Driver error:" << query.lastError().driverText()
122+ << "Database error:" << query.lastError().databaseText();
123+ }
304}
124}
305
125
306−WindowStateStorage::WindowState WindowStateStorage::getState(const QString &windowId, WindowStateStorage::WindowState defaultValue) const
126+QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue) const
307{
127{
308− int state;
128+ QString queryString = QStringLiteral("SELECT * FROM geometry WHERE windowId = '%1';")
129+ .arg(sanitiseString(windowId));
309
130
310− QMetaObject::invokeMethod(m_asyncQuery, "getState", Qt::BlockingQueuedConnection,
131+ QSqlQuery query = getValue(queryString);
311− Q_RETURN_ARG(int, state),
312− Q_ARG(const QString&, windowId)
313− );
314
132
315− if (state == -1) {
133+ if (!query.first()) {
316 return defaultValue;
134 return defaultValue;
317 }
135 }
318
136
319− return (WindowState)state;
137+ const QRect result(query.value(QStringLiteral("x")).toInt(), query.value(QStringLiteral("y")).toInt(),
138+ query.value(QStringLiteral("width")).toInt(), query.value(QStringLiteral("height")).toInt());
139+
140+ if (result.isValid()) {
141+ return result;
142+ }
143+
144+ return defaultValue;
320}
145}
321
146
322−int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
147+void WindowStateStorage::initdb()
323{
148{
324− int stage;
149+ m_db.open();
150+ if (!m_db.open()) {
151+ qWarning() << "Error opening state database:" << m_db.lastError().driverText() << m_db.lastError().databaseText();
152+ return;
153+ }
325
154
326− QMetaObject::invokeMethod(m_asyncQuery, "getStage", Qt::BlockingQueuedConnection,
155+ if (!m_db.tables().contains(QStringLiteral("geometry"))) {
327− Q_RETURN_ARG(int, stage),
156+ QSqlQuery query;
328− Q_ARG(const QString&, appId)
157+ query.exec(QStringLiteral("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);"));
329− );
158+ }
330
159
331− if (stage == -1) {
160+ if (!m_db.tables().contains(QStringLiteral("state"))) {
332− return defaultValue;
161+ QSqlQuery query;
162+ query.exec(QStringLiteral("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);"));
333 }
163 }
334
164
335− return stage;
165+ if (!m_db.tables().contains(QStringLiteral("stage"))) {
166+ QSqlQuery query;
167+ query.exec(QStringLiteral("CREATE TABLE stage(appId TEXT UNIQUE, stage INTEGER);"));
168+ }
336}
169}
337
170
338−QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue) const
171+void WindowStateStorage::saveValue(const QString &queryString)
339{
172{
340− QRect geometry;
173+ QMutexLocker mutexLocker(&s_mutex);
341− QMetaObject::invokeMethod(m_asyncQuery, "getGeometry", Qt::BlockingQueuedConnection,
174+
342− Q_RETURN_ARG(QRect, geometry),
175+ QFuture<void> future = QtConcurrent::run(&m_threadPool, executeAsyncQuery, queryString);
343− Q_ARG(const QString&, windowId)
176+ m_asyncQueries.append(future);
344− );
177+
345− if (geometry.isNull() || !geometry.isValid()) {
178+ QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
346− return defaultValue;
179+ futureWatcher->setFuture(future);
347− }
180+ connect(futureWatcher, &QFutureWatcher<void>::finished,
348− return geometry;
181+ this,
182+ [=](){ m_asyncQueries.removeAll(futureWatcher->future());
183+ futureWatcher->deleteLater(); });
349}
184}
350
185
351−const QString WindowStateStorage::getDbName()
186+QSqlQuery WindowStateStorage::getValue(const QString &queryString) const
352{
187{
353− QString dbName;
188+ QMutexLocker l(&s_mutex);
354− QMetaObject::invokeMethod(m_asyncQuery, "getDbName", Qt::BlockingQueuedConnection,
189+ QSqlQuery query;
355− Q_RETURN_ARG(QString, dbName)
190+
356− );
191+ bool ok = query.exec(queryString);
192+ if (!ok) {
193+ qWarning() << "Error retrieving database query:" << queryString
194+ << "Driver error:" << query.lastError().driverText()
195+ << "Database error:" << query.lastError().databaseText();
196+ }
357− return QString(dbName);
197+ return query;
358}
198}
359
199
360Mir::State WindowStateStorage::toMirState(WindowState state) const
200Mir::State WindowStateStorage::toMirState(WindowState state) const
@@ -379,5 +219,3 @@ Mir::State WindowStateStorage::toMirState(WindowState state) const
379 return Mir::RestoredState;
219 return Mir::RestoredState;
380 }
220 }
381}
221}
382−
383−#include "windowstatestorage.moc"
plugins/Utils/windowstatestorage.h+17−14
@@ -1,6 +1,5 @@
1/*
1/*
2 * Copyright 2015-2016 Canonical Ltd.
2 * Copyright 2015-2016 Canonical Ltd.
3− * Copyright 2021 UBports Foundation
4 *
3 *
5 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
5 * it under the terms of the GNU Lesser General Public License as published by
@@ -17,16 +16,13 @@
17
16
18#include <QObject>
17#include <QObject>
19#include <QSqlDatabase>
18#include <QSqlDatabase>
20−#include <QSqlQuery>
21#include <QMutex>
19#include <QMutex>
22#include <QFuture>
20#include <QFuture>
23−#include <QThread>
21+#include <QThreadPool>
24
22
25// unity-api
23// unity-api
26#include <unity/shell/application/Mir.h>
24#include <unity/shell/application/Mir.h>
27
25
28−class AsyncQuery;
29−
30class WindowStateStorage: public QObject
26class WindowStateStorage: public QObject
31{
27{
32 Q_OBJECT
28 Q_OBJECT
@@ -50,25 +46,32 @@ public:
50 Q_DECLARE_FLAGS(WindowStates, WindowState)
46 Q_DECLARE_FLAGS(WindowStates, WindowState)
51 Q_FLAG(WindowStates)
47 Q_FLAG(WindowStates)
52
48
53− WindowStateStorage(const QString &dbName = QString(), QObject *parent = nullptr);
49+ WindowStateStorage(QObject *parent = nullptr);
54 virtual ~WindowStateStorage();
50 virtual ~WindowStateStorage();
55
51
52+ Q_INVOKABLE void saveState(const QString &windowId, WindowState state);
56 Q_INVOKABLE WindowState getState(const QString &windowId, WindowState defaultValue) const;
53 Q_INVOKABLE WindowState getState(const QString &windowId, WindowState defaultValue) const;
57
54
55+ Q_INVOKABLE void saveGeometry(const QString &windowId, const QRect &rect);
58 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect &defaultValue) const;
56 Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect &defaultValue) const;
59
57
58+ Q_INVOKABLE void saveStage(const QString &appId, int stage);
60 Q_INVOKABLE int getStage(const QString &appId, int defaultValue) const;
59 Q_INVOKABLE int getStage(const QString &appId, int defaultValue) const;
61
60
62 Q_INVOKABLE Mir::State toMirState(WindowState state) const;
61 Q_INVOKABLE Mir::State toMirState(WindowState state) const;
63
62
64− const QString getDbName();
63+private:
64+ void initdb();
65
65
66−Q_SIGNALS:
67− void saveStage(const QString &appId, int stage);
66+ void saveValue(const QString &queryString);
68− void saveGeometry(const QString &windowId, const QRect &rect);
67+ QSqlQuery getValue(const QString &queryString) const;
69− void saveState(const QString &windowId, WindowStateStorage::WindowState state);
70
68
71−private:
69+ static void executeAsyncQuery(const QString &queryString);
72− QThread m_thread;
70+ static QMutex s_mutex;
73− AsyncQuery *m_asyncQuery;
71+
72+ // NB: This is accessed from threads. Make sure to mutex it.
73+ QSqlDatabase m_db;
74+
75+ QList<QFuture<void>> m_asyncQueries;
76+ QThreadPool m_threadPool;
74};
77};
plugins/WindowManager/CMakeLists.txt+1−2
@@ -4,7 +4,6 @@ set(WINDOWMANAGER_SRC
4 Window.cpp
4 Window.cpp
5 WindowManagerPlugin.cpp
5 WindowManagerPlugin.cpp
6 WindowMargins.cpp
6 WindowMargins.cpp
7− InputMethodManager.cpp
8 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
7 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
9 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
8 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
10 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
9 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
@@ -21,6 +20,6 @@ include_directories(
21
20
22add_library(windowmanager-qml SHARED ${WINDOWMANAGER_SRC})
21add_library(windowmanager-qml SHARED ${WINDOWMANAGER_SRC})
23
22
24−target_link_libraries(windowmanager-qml Qt5::Qml Qt5::Quick Qt5::Gui)
23+qt5_use_modules(windowmanager-qml Qml Quick Gui)
25
24
26add_unity8_plugin(WindowManager 0.1 WindowManager TARGETS windowmanager-qml)
25add_unity8_plugin(WindowManager 0.1 WindowManager TARGETS windowmanager-qml)
plugins/WindowManager/InputMethodManager.cppdeleted−56
@@ -1,56 +0,0 @@
1−/*
2− * Copyright (C) 2019 UBports Foundation.
3− * Author(s) Marius Gripsgard <marius@ubports.com>
4− *
5− * This program is free software: you can redistribute it and/or modify it under
6− * the terms of the GNU Lesser General Public License version 3, as published by
7− * the Free Software Foundation.
8− *
9− * This program is distributed in the hope that it will be useful, but WITHOUT
10− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
11− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12− * Lesser General Public License for more details.
13− *
14− * You should have received a copy of the GNU Lesser General Public License
15− * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− */
17−
18−#include "InputMethodManager.h"
19−#include <QDebug>
20−
21−#include <unity/shell/application/MirSurfaceInterface.h>
22−
23−// local
24−#include "Window.h"
25−
26−Q_LOGGING_CATEGORY(INPUTMETHODMANAGER, "InputMethodManager", QtInfoMsg)
27−#define DEBUG_MSG qCDebug(INPUTMETHODMANAGER).nospace().noquote() << __func__
28−
29−namespace unityapi = unity::shell::application;
30−
31−InputMethodManager *InputMethodManager::instance()
32−{
33− static InputMethodManager* inputMethod(new InputMethodManager());
34− return inputMethod;
35−}
36−
37−InputMethodManager::InputMethodManager()
38−{
39−}
40−
41−void InputMethodManager::setWindow(Window* window)
42−{
43− if (window == m_inputMethodWindow) {
44− return;
45− }
46−
47− DEBUG_MSG << "(" << window << ")";
48−
49− m_inputMethodWindow = window;
50− Q_EMIT surfaceChanged(surface());
51−}
52−
53−unityapi::MirSurfaceInterface* InputMethodManager::surface() const
54−{
55− return m_inputMethodWindow ? m_inputMethodWindow->surface() : nullptr;
56−}
plugins/WindowManager/InputMethodManager.hdeleted−55
@@ -1,55 +0,0 @@
1−/*
2− * Copyright (C) 2019 UBports Foundation.
3− * Author(s) Marius Gripsgard <marius@ubports.com>
4− *
5− * This program is free software: you can redistribute it and/or modify it under
6− * the terms of the GNU Lesser General Public License version 3, as published by
7− * the Free Software Foundation.
8− *
9− * This program is distributed in the hope that it will be useful, but WITHOUT
10− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
11− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12− * Lesser General Public License for more details.
13− *
14− * You should have received a copy of the GNU Lesser General Public License
15− * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− */
17−
18−#pragma once
19−
20−#include <QLoggingCategory>
21−#include <QObject>
22−
23−#include "WindowManagerGlobal.h"
24−
25−Q_DECLARE_LOGGING_CATEGORY(INPUTMETHODMANAGER)
26−
27−class Window;
28−
29−namespace unity {
30− namespace shell {
31− namespace application {
32− class MirSurfaceInterface;
33− }
34− }
35−}
36−
37−class WINDOWMANAGERQML_EXPORT InputMethodManager : public QObject
38−{
39− Q_OBJECT
40− Q_PROPERTY(unity::shell::application::MirSurfaceInterface* surface READ surface NOTIFY surfaceChanged)
41−
42−public:
43− InputMethodManager();
44− static InputMethodManager* instance();
45−
46− void setWindow(Window* window);
47−
48−Q_SIGNALS:
49− void surfaceChanged(unity::shell::application::MirSurfaceInterface* inputMethodSurface);
50−
51−private:
52− unity::shell::application::MirSurfaceInterface* surface() const;
53−
54− Window* m_inputMethodWindow{nullptr};
55−};
plugins/WindowManager/TopLevelWindowModel.cpp+42−103
@@ -1,6 +1,5 @@
1/*
1/*
2 * Copyright (C) 2016-2017 Canonical, Ltd.
2 * Copyright (C) 2016-2017 Canonical, Ltd.
3− * Copyright 2019 UBports Foundation
4 *
3 *
5 * This program is free software: you can redistribute it and/or modify it under
4 * This program is free software: you can redistribute it and/or modify it under
6 * the terms of the GNU Lesser General Public License version 3, as published by
5 * the terms of the GNU Lesser General Public License version 3, as published by
@@ -30,7 +29,6 @@
30
29
31// local
30// local
32#include "Window.h"
31#include "Window.h"
33−#include "InputMethodManager.h"
34
32
35Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
33Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
36
34
@@ -40,12 +38,7 @@ Q_LOGGING_CATEGORY(TOPLEVELWINDOWMODEL, "toplevelwindowmodel", QtInfoMsg)
40namespace unityapi = unity::shell::application;
38namespace unityapi = unity::shell::application;
41
39
42TopLevelWindowModel::TopLevelWindowModel()
40TopLevelWindowModel::TopLevelWindowModel()
43− : m_nullWindow(createNullWindow()),
44− m_surfaceManagerBusy(false)
45{
41{
46− connect(m_nullWindow, &Window::focusedChanged, this, [this] {
47− Q_EMIT rootFocusChanged();
48− });
49}
42}
50
43
51void TopLevelWindowModel::setApplicationManager(unityapi::ApplicationManagerInterface* value)
44void TopLevelWindowModel::setApplicationManager(unityapi::ApplicationManagerInterface* value)
@@ -195,8 +188,9 @@ void TopLevelWindowModel::prependSurfaceHelper(unityapi::MirSurfaceInterface *su
195
188
196 prependWindow(window, application);
189 prependWindow(window, application);
197
190
198− // Activate the newly-prepended window.
191+ if (!surface) {
199− window->activate();
192+ activateEmptyWindow(window);
193+ }
200
194
201 INFO_MSG << " after " << toString();
195 INFO_MSG << " after " << toString();
202}
196}
@@ -317,11 +311,10 @@ void TopLevelWindowModel::onSurfaceDied(unityapi::MirSurfaceInterface *surface)
317
311
318 auto application = m_windowModel[i].application;
312 auto application = m_windowModel[i].application;
319
313
320− DEBUG_MSG << " application->name()=" << application->name()
314+ // can't be starting if it already has a surface
321− << " application->state()=" << application->state();
315+ Q_ASSERT(application->state() != unityapi::ApplicationInfoInterface::Starting);
322
316
323− if (application->state() == unityapi::ApplicationInfoInterface::Running
317+ if (application->state() == unityapi::ApplicationInfoInterface::Running) {
324− || application->state() == unityapi::ApplicationInfoInterface::Starting) {
325 m_windowModel[i].removeOnceSurfaceDestroyed = true;
318 m_windowModel[i].removeOnceSurfaceDestroyed = true;
326 } else {
319 } else {
327 // assume it got killed by the out-of-memory daemon.
320 // assume it got killed by the out-of-memory daemon.
@@ -351,17 +344,7 @@ void TopLevelWindowModel::onSurfaceDestroyed(unityapi::MirSurfaceInterface *surf
351
344
352Window *TopLevelWindowModel::createWindow(unityapi::MirSurfaceInterface *surface)
345Window *TopLevelWindowModel::createWindow(unityapi::MirSurfaceInterface *surface)
353{
346{
354− int id = m_nextId.fetchAndAddAcquire(1);
347+ int id = generateId();
355− return createWindowWithId(surface, id);
356−}
357−
358−Window *TopLevelWindowModel::createNullWindow()
359−{
360− return createWindowWithId(nullptr, 0);
361−}
362−
363−Window *TopLevelWindowModel::createWindowWithId(unityapi::MirSurfaceInterface *surface, int id)
364−{
365 Window *qmlWindow = new Window(id, this);
348 Window *qmlWindow = new Window(id, this);
366 connectWindow(qmlWindow);
349 connectWindow(qmlWindow);
367 if (surface) {
350 if (surface) {
@@ -452,17 +435,7 @@ void TopLevelWindowModel::removeAt(int index)
452 setFocusedWindow(nullptr);
435 setFocusedWindow(nullptr);
453 }
436 }
454
437
455− if (m_previousWindow == window) {
456− m_previousWindow = nullptr;
457− }
458−
459− if (m_closingAllApps) {
460− if (m_windowModel.isEmpty()) {
461− Q_EMIT closedAllWindows();
462− }
463− }
464−
465− INFO_MSG << " after " << toString() << " apps left " << m_windowModel.count();
438+ INFO_MSG << " after " << toString();
466}
439}
467
440
468void TopLevelWindowModel::setInputMethodWindow(Window *window)
441void TopLevelWindowModel::setInputMethodWindow(Window *window)
@@ -473,7 +446,6 @@ void TopLevelWindowModel::setInputMethodWindow(Window *window)
473 }
446 }
474 m_inputMethodWindow = window;
447 m_inputMethodWindow = window;
475 Q_EMIT inputMethodSurfaceChanged(m_inputMethodWindow->surface());
448 Q_EMIT inputMethodSurfaceChanged(m_inputMethodWindow->surface());
476− InputMethodManager::instance()->setWindow(window);
477}
449}
478
450
479void TopLevelWindowModel::removeInputMethodWindow()
451void TopLevelWindowModel::removeInputMethodWindow()
@@ -482,7 +454,6 @@ void TopLevelWindowModel::removeInputMethodWindow()
482 delete m_inputMethodWindow;
454 delete m_inputMethodWindow;
483 m_inputMethodWindow = nullptr;
455 m_inputMethodWindow = nullptr;
484 Q_EMIT inputMethodSurfaceChanged(nullptr);
456 Q_EMIT inputMethodSurfaceChanged(nullptr);
485− InputMethodManager::instance()->setWindow(nullptr);
486 }
457 }
487}
458}
488
459
@@ -528,6 +499,37 @@ int TopLevelWindowModel::findIndexOf(const unityapi::MirSurfaceInterface *surfac
528 return -1;
499 return -1;
529}
500}
530
501
502+int TopLevelWindowModel::generateId()
503+{
504+ int id = m_nextId;
505+ m_nextId = nextFreeId(nextId(id), id);
506+ return id;
507+}
508+
509+int TopLevelWindowModel::nextId(int id) const
510+{
511+ if (id == m_maxId) {
512+ return id = 1;
513+ } else {
514+ return id + 1;
515+ }
516+}
517+
518+int TopLevelWindowModel::nextFreeId(int candidateId, const int latestId)
519+{
520+ int firstCandidateId = candidateId;
521+
522+ while (indexForId(candidateId) != -1 || candidateId == latestId) {
523+ candidateId = nextId(candidateId);
524+
525+ if (candidateId == firstCandidateId) {
526+ qFatal("TopLevelWindowModel: run out of window ids.");
527+ }
528+ }
529+
530+ return candidateId;
531+}
532+
531QString TopLevelWindowModel::toString()
533QString TopLevelWindowModel::toString()
532{
534{
533 QString str;
535 QString str;
@@ -641,19 +643,16 @@ void TopLevelWindowModel::setFocusedWindow(Window *window)
641 if (window != m_focusedWindow) {
643 if (window != m_focusedWindow) {
642 INFO_MSG << "(" << window << ")";
644 INFO_MSG << "(" << window << ")";
643
645
644− m_previousWindow = m_focusedWindow;
646+ Window* previousWindow = m_focusedWindow;
645
647
646 m_focusedWindow = window;
648 m_focusedWindow = window;
647 Q_EMIT focusedWindowChanged(m_focusedWindow);
649 Q_EMIT focusedWindowChanged(m_focusedWindow);
648
650
649− if (m_previousWindow && m_previousWindow->focused() && !m_previousWindow->surface()) {
651+ if (previousWindow && previousWindow->focused() && !previousWindow->surface()) {
650 // do it ourselves. miral doesn't know about this window
652 // do it ourselves. miral doesn't know about this window
651− m_previousWindow->setFocused(false);
653+ previousWindow->setFocused(false);
652 }
654 }
653 }
655 }
654−
655− // Reset
656− m_pendingActivation = false;
657}
656}
658
657
659unityapi::MirSurfaceInterface* TopLevelWindowModel::inputMethodSurface() const
658unityapi::MirSurfaceInterface* TopLevelWindowModel::inputMethodSurface() const
@@ -697,7 +696,6 @@ void TopLevelWindowModel::move(int from, int to)
697}
696}
698void TopLevelWindowModel::onModificationsStarted()
697void TopLevelWindowModel::onModificationsStarted()
699{
698{
700− m_surfaceManagerBusy = true;
701}
699}
702
700
703void TopLevelWindowModel::onModificationsEnded()
701void TopLevelWindowModel::onModificationsEnded()
@@ -708,7 +706,6 @@ void TopLevelWindowModel::onModificationsEnded()
708 // reset
706 // reset
709 m_focusedWindowChanged = false;
707 m_focusedWindowChanged = false;
710 m_newlyFocusedWindow = nullptr;
708 m_newlyFocusedWindow = nullptr;
711− m_surfaceManagerBusy = false;
712}
709}
713
710
714void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
711void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
@@ -719,64 +716,6 @@ void TopLevelWindowModel::activateTopMostWindowWithoutId(int forbiddenId)
719 Window *window = m_windowModel[i].window;
716 Window *window = m_windowModel[i].window;
720 if (window->id() != forbiddenId) {
717 if (window->id() != forbiddenId) {
721 window->activate();
718 window->activate();
722− break;
723 }
719 }
724 }
720 }
725}
721}
726−
727−void TopLevelWindowModel::closeAllWindows()
728−{
729− m_closingAllApps = true;
730− for (auto win : m_windowModel) {
731− win.window->close();
732− }
733−
734− // This is done after the for loop in the unlikely event that
735− // an app starts in between this
736− if (m_windowModel.isEmpty()) {
737− Q_EMIT closedAllWindows();
738− }
739−}
740−
741−bool TopLevelWindowModel::rootFocus()
742−{
743− return !m_nullWindow->focused();
744−}
745−
746−void TopLevelWindowModel::setRootFocus(bool focus)
747−{
748− INFO_MSG << "(" << focus << "), surfaceManagerBusy is " << m_surfaceManagerBusy;
749−
750− if (m_surfaceManagerBusy) {
751− // Something else is probably being focused already, let's not add to
752− // the noise.
753− return;
754− }
755−
756− if (focus) {
757− // Give focus back to previous focused window, only if null window is focused.
758− // If null window is not focused, a different app had taken the focus and we
759− // should repect that, or if a pendingActivation is going on.
760− if (m_previousWindow && !m_previousWindow->focused() && !m_pendingActivation &&
761− m_nullWindow == m_focusedWindow && m_previousWindow != m_nullWindow) {
762− m_previousWindow->activate();
763− } else if (!m_pendingActivation) {
764− // The previous window does not exist any more, focus top window.
765− activateTopMostWindowWithoutId(-1);
766− }
767− } else {
768− if (!m_nullWindow->focused()) {
769− m_nullWindow->activate();
770− }
771− }
772−}
773−
774−// Pending Activation will block refocus of previous focused window
775−// this is needed since surface activation with miral is async,
776−// and activation of placeholder is sync. This causes a race condition
777−// between placeholder and prev window. This results in prev window
778−// gets focused, as it will always be later than the placeholder.
779−void TopLevelWindowModel::pendingActivation()
780−{
781− m_pendingActivation = true;
782−}
plugins/WindowManager/TopLevelWindowModel.h+8−50
@@ -1,6 +1,5 @@
1/*
1/*
2 * Copyright (C) 2016-2017 Canonical, Ltd.
2 * Copyright (C) 2016-2017 Canonical, Ltd.
3− * Copyright 2019 UBports Foundation
4 *
3 *
5 * This program is free software: you can redistribute it and/or modify it under
4 * This program is free software: you can redistribute it and/or modify it under
6 * the terms of the GNU Lesser General Public License version 3, as published by
5 * the terms of the GNU Lesser General Public License version 3, as published by
@@ -19,7 +18,6 @@
19#define TOPLEVELWINDOWMODEL_H
18#define TOPLEVELWINDOWMODEL_H
20
19
21#include <QAbstractListModel>
20#include <QAbstractListModel>
22−#include <QAtomicInteger>
23#include <QLoggingCategory>
21#include <QLoggingCategory>
24
22
25#include "WindowManagerGlobal.h"
23#include "WindowManagerGlobal.h"
@@ -88,28 +86,7 @@ class WINDOWMANAGERQML_EXPORT TopLevelWindowModel : public QAbstractListModel
88 The id to be used on the next entry created
86 The id to be used on the next entry created
89 Useful for tests
87 Useful for tests
90 */
88 */
91− Q_PROPERTY(int nextId READ nextId)
89+ Q_PROPERTY(int nextId READ nextId NOTIFY nextIdChanged)
92−
93−
94− /**
95− * @brief Sets whether a user Window or "nothing" should be focused
96− *
97− * This implementation of TLWM must have something focused. However, the
98− * user may wish to have nothing in some cases - for example, when they
99− * minimize all their windows on the desktop or unfocus the app they're
100− * using by clicking the background or indicators.
101− *
102− * Unsetting rootFocus effectively focuses "nothing" by setting up a Window
103− * that has no displayable Surfaces and bringing it into focus.
104− *
105− * Setting rootFocus attempts to focus the Window which was focused last -
106− * unless another app is attempting to gain focus (as determined by
107− * pendingActivation) and that's why we got rootFocus.
108− *
109− * If the previously-focused Window was closed before rootFocus was set,
110− * the next available window will be focused.
111− */
112− Q_PROPERTY(bool rootFocus READ rootFocus WRITE setRootFocus NOTIFY rootFocusChanged)
113
90
114public:
91public:
115 /**
92 /**
@@ -145,7 +122,7 @@ public:
145 unity::shell::application::SurfaceManagerInterface *surfaceManager() const { return m_surfaceManager; }
122 unity::shell::application::SurfaceManagerInterface *surfaceManager() const { return m_surfaceManager; }
146 void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
123 void setSurfaceManager(unity::shell::application::SurfaceManagerInterface*);
147
124
148− int nextId() const { return m_nextId.load(); }
125+ int nextId() const { return m_nextId; }
149
126
150public:
127public:
151 /**
128 /**
@@ -187,19 +164,6 @@ public:
187 */
164 */
188 Q_INVOKABLE void raiseId(int id);
165 Q_INVOKABLE void raiseId(int id);
189
166
190− /**
191− * @brief Closes all windows, emits closedAllWindows when done
192− */
193− Q_INVOKABLE void closeAllWindows();
194−
195− /**
196− * @brief Sets pending activation flag
197− */
198− Q_INVOKABLE void pendingActivation();
199−
200− void setRootFocus(bool focus);
201− bool rootFocus();
202−
203Q_SIGNALS:
167Q_SIGNALS:
204 void countChanged();
168 void countChanged();
205 void inputMethodSurfaceChanged(unity::shell::application::MirSurfaceInterface* inputMethodSurface);
169 void inputMethodSurfaceChanged(unity::shell::application::MirSurfaceInterface* inputMethodSurface);
@@ -214,9 +178,7 @@ Q_SIGNALS:
214 */
178 */
215 void listChanged();
179 void listChanged();
216
180
217− void closedAllWindows();
181+ void nextIdChanged();
218−
219− void rootFocusChanged();
220
182
221private Q_SLOTS:
183private Q_SLOTS:
222 void onSurfaceCreated(unity::shell::application::MirSurfaceInterface *surface);
184 void onSurfaceCreated(unity::shell::application::MirSurfaceInterface *surface);
@@ -263,8 +225,6 @@ private:
263 void activateTopMostWindowWithoutId(int forbiddenId);
225 void activateTopMostWindowWithoutId(int forbiddenId);
264
226
265 Window *createWindow(unity::shell::application::MirSurfaceInterface *surface);
227 Window *createWindow(unity::shell::application::MirSurfaceInterface *surface);
266− Window *createWindowWithId(unity::shell::application::MirSurfaceInterface *surface, int id);
267− Window *createNullWindow();
268
228
269 struct ModelEntry {
229 struct ModelEntry {
270 ModelEntry() {}
230 ModelEntry() {}
@@ -279,15 +239,15 @@ private:
279 QVector<ModelEntry> m_windowModel;
239 QVector<ModelEntry> m_windowModel;
280 Window* m_inputMethodWindow{nullptr};
240 Window* m_inputMethodWindow{nullptr};
281 Window* m_focusedWindow{nullptr};
241 Window* m_focusedWindow{nullptr};
282− Window* m_nullWindow;
283− Window* m_previousWindow{nullptr};
284− bool m_pendingActivation;
285
242
286− QAtomicInteger<int> m_nextId{1};
243+ int m_nextId{1};
244+ // Just something big enough that we don't risk running out of unused id numbers.
245+ // Not sure if QML int type supports something close to std::numeric_limits<int>::max() and
246+ // there's no reason to try out its limits.
247+ static const int m_maxId{1000000};
287
248
288 unity::shell::application::ApplicationManagerInterface* m_applicationManager{nullptr};
249 unity::shell::application::ApplicationManagerInterface* m_applicationManager{nullptr};
289 unity::shell::application::SurfaceManagerInterface *m_surfaceManager{nullptr};
250 unity::shell::application::SurfaceManagerInterface *m_surfaceManager{nullptr};
290− bool m_surfaceManagerBusy;
291
251
292 enum ModelState {
252 enum ModelState {
293 IdleState,
253 IdleState,
@@ -301,8 +261,6 @@ private:
301 // Valid between modificationsStarted and modificationsEnded
261 // Valid between modificationsStarted and modificationsEnded
302 bool m_focusedWindowChanged{false};
262 bool m_focusedWindowChanged{false};
303 Window *m_newlyFocusedWindow{nullptr};
263 Window *m_newlyFocusedWindow{nullptr};
304−
305− bool m_closingAllApps{false};
306};
264};
307
265
308#endif // TOPLEVELWINDOWMODEL_H
266#endif // TOPLEVELWINDOWMODEL_H
plugins/WindowManager/Window.cpp−9
@@ -27,7 +27,6 @@ namespace unityapi = unity::shell::application;
27Q_LOGGING_CATEGORY(UNITY_WINDOW, "unity.window", QtWarningMsg)
27Q_LOGGING_CATEGORY(UNITY_WINDOW, "unity.window", QtWarningMsg)
28
28
29#define DEBUG_MSG qCDebug(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
29#define DEBUG_MSG qCDebug(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
30−#define WARNING_MSG qCWarning(UNITY_WINDOW).nospace() << qPrintable(toString()) << "::" << __func__
31
30
32Window::Window(int id, QObject *parent)
31Window::Window(int id, QObject *parent)
33 : QObject(parent)
32 : QObject(parent)
@@ -185,15 +184,7 @@ void Window::setSurface(unityapi::MirSurfaceInterface *surface)
185 setSurface(nullptr);
184 setSurface(nullptr);
186 });
185 });
187
186
188− // Surface should never be focused at this point!
189− if (m_surface->focused()) {
190− WARNING_MSG << "Inital surface is focused!";
191− }
192−
193 // bring it up to speed
187 // bring it up to speed
194− if (m_focused) {
195− m_surface->activate();
196− }
197 if (m_positionRequested) {
188 if (m_positionRequested) {
198 m_surface->setRequestedPosition(m_requestedPosition);
189 m_surface->setRequestedPosition(m_requestedPosition);
199 }
190 }
plugins/WindowManager/WindowManagerPlugin.cpp−9
@@ -20,23 +20,14 @@
20#include "TopLevelWindowModel.h"
20#include "TopLevelWindowModel.h"
21#include "Window.h"
21#include "Window.h"
22#include "WindowMargins.h"
22#include "WindowMargins.h"
23−#include "InputMethodManager.h"
24
23
25#include <QtQml>
24#include <QtQml>
26
25
27−QObject *inputMethodManager(QQmlEngine *engine, QJSEngine *scriptEngine)
28−{
29− Q_UNUSED(engine)
30− Q_UNUSED(scriptEngine)
31− return InputMethodManager::instance();
32−}
33−
34void WindowManagerPlugin::registerTypes(const char *uri)
26void WindowManagerPlugin::registerTypes(const char *uri)
35{
27{
36 qmlRegisterType<AvailableDesktopArea>(uri, 1, 0, "AvailableDesktopArea");
28 qmlRegisterType<AvailableDesktopArea>(uri, 1, 0, "AvailableDesktopArea");
37 qmlRegisterType<TopLevelWindowModel>(uri, 1, 0, "TopLevelWindowModel");
29 qmlRegisterType<TopLevelWindowModel>(uri, 1, 0, "TopLevelWindowModel");
38 qmlRegisterType<WindowMargins>(uri, 1, 0, "WindowMargins");
30 qmlRegisterType<WindowMargins>(uri, 1, 0, "WindowMargins");
39− qmlRegisterSingletonType<InputMethodManager>(uri, 1, 0, "InputMethodManager", inputMethodManager);
40
31
41 qRegisterMetaType<Window*>("Window*");
32 qRegisterMetaType<Window*>("Window*");
42
33
plugins/Wizard/CMakeLists.txt+2−4
@@ -13,10 +13,8 @@ add_library(Wizard-qml MODULE
13 Changelog.cpp
13 Changelog.cpp
14)
14)
15
15
16−target_link_libraries(Wizard-qml
16+qt5_use_modules(Wizard-qml DBus Qml)
17− Qt5::DBus Qt5::Qml
18− ${GD3_LDFLAGS} ${GLIB_LDFLAGS} ${GEONAMES_LDFLAGS}
17+target_link_libraries(Wizard-qml ${GD3_LDFLAGS} ${GLIB_LDFLAGS} ${GEONAMES_LDFLAGS})
19−)
20add_unity8_plugin(Wizard 0.1 Wizard TARGETS Wizard-qml)
18add_unity8_plugin(Wizard 0.1 Wizard TARGETS Wizard-qml)
21
19
22set(POLKIT_LIB_DIR "${CMAKE_INSTALL_LOCALSTATEDIR}/lib/polkit-1")
20set(POLKIT_LIB_DIR "${CMAKE_INSTALL_LOCALSTATEDIR}/lib/polkit-1")
plugins/Wizard/System.cpp+4−1
@@ -168,10 +168,13 @@ void System::updateSessionLocale(const QString &locale)
168
168
169 // Restart bits of the session to pick up new language.
169 // Restart bits of the session to pick up new language.
170 QProcess::startDetached(QStringLiteral("sh -c \"initctl emit indicator-services-end; \
170 QProcess::startDetached(QStringLiteral("sh -c \"initctl emit indicator-services-end; \
171+ initctl stop scope-registry; \
172+ initctl stop smart-scopes-proxy; \
171 initctl emit --no-wait indicator-services-start; \
173 initctl emit --no-wait indicator-services-start; \
172 initctl restart --no-wait ubuntu-location-service-trust-stored; \
174 initctl restart --no-wait ubuntu-location-service-trust-stored; \
173 initctl restart --no-wait maliit-server; \
175 initctl restart --no-wait maliit-server; \
174− initctl restart --no-wait indicator-messages"));
176+ initctl restart --no-wait indicator-messages; \
177+ initctl restart --no-wait unity8-dash\""));
175}
178}
176
179
177void System::skipUntilFinishedPage()
180void System::skipUntilFinishedPage()
plugins/Wizard/Utils/CMakeLists.txt+1−1
@@ -20,7 +20,7 @@ add_library(WizardUtils-qml SHARED
20# files directly in targets.
20# files directly in targets.
21set_target_properties(WizardUtils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
21set_target_properties(WizardUtils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
22
22
23−target_link_libraries(WizardUtils-qml Qt5::DBus Qt5::Qml Qt5::Quick)
23+qt5_use_modules(WizardUtils-qml DBus Qml Quick)
24
24
25set(PLUG_DIR ${PLUGIN_PRIVATE_MODULE_DIR}/Ubuntu/SystemSettings/Wizard/Utils)
25set(PLUG_DIR ${PLUGIN_PRIVATE_MODULE_DIR}/Ubuntu/SystemSettings/Wizard/Utils)
26install(FILES qmldir DESTINATION ${PLUG_DIR})
26install(FILES qmldir DESTINATION ${PLUG_DIR})
plugins/Wizard/test.shnew file+18
@@ -0,0 +1,18 @@
1+#!/bin/sh
2+
3+TOPDIR=$(readlink -e "$(dirname ${0})/..")
4+
5+LOCAL_PRIVATE_DIR=$(ls -d ${TOPDIR}/debian/tmp/usr/lib/*/ubuntu-system-settings/private)
6+if [ -n ${LOCAL_PRIVATE_DIR} ]; then
7+ echo "Testing against locally built version"
8+ export UBUNTU_SYSTEM_SETTINGS_WIZARD_ROOT="${TOPDIR}/debian/tmp/usr/share"
9+ export UBUNTU_SYSTEM_SETTINGS_WIZARD_MODULES="${LOCAL_PRIVATE_DIR}"
10+ export QML2_IMPORT_PATH=${LOCAL_PRIVATE_DIR}:${QML2_IMPORT_PATH}
11+ export PATH=${TOPDIR}/debian/tmp/usr/bin:${PATH}
12+else
13+ echo "Testing against system version"
14+fi
15+
16+export QML2_IMPORT_PATH=${TOPDIR}/tests/mocks:${QML2_IMPORT_PATH}
17+
18+exec system-settings-wizard
po/aa.po+257−154
@@ -6,41 +6,39 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: \n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2021-01-29 11:42-0600\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2021-03-08 10:42+0000\n"
11+"PO-Revision-Date: 2016-02-12 10:18+0000\n"
12−"Last-Translator: TigranKhachatryan0 <tigrank2008@gmail.com>\n"
12+"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
13−"Language-Team: Afar <https://translate.ubports.com/projects/ubports/lomiri/"
13+"Language-Team: Afar <aa@li.org>\n"
14−"aa/>\n"
15−"Language: aa\n"
16"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Generator: Weblate 3.11.3\n"
21−"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
22
20
23−#: plugins/LightDM/Greeter.cpp:199
21+#: plugins/LightDM/Greeter.cpp:188
24msgid "Password: "
22msgid "Password: "
25−msgstr ""
23+msgstr "Cuumita "
26
24
27−#: plugins/LightDM/Greeter.cpp:214
25+#: plugins/LightDM/Greeter.cpp:203
28msgid "Username"
26msgid "Username"
29msgstr ""
27msgstr ""
30
28
31−#: plugins/LightDM/Greeter.cpp:258
29+#: plugins/LightDM/Greeter.cpp:242
32msgid "Failed to authenticate"
30msgid "Failed to authenticate"
33msgstr ""
31msgstr ""
34
32
35−#: plugins/LightDM/Greeter.cpp:260
33+#: plugins/LightDM/Greeter.cpp:244
36msgid "Invalid password, please try again"
34msgid "Invalid password, please try again"
37msgstr ""
35msgstr ""
38
36
39−#: plugins/LightDM/Greeter.cpp:270
37+#: plugins/LightDM/Greeter.cpp:254
40msgid "Log In"
38msgid "Log In"
41msgstr ""
39msgstr ""
42
40
43−#: plugins/LightDM/Greeter.cpp:270
41+#: plugins/LightDM/Greeter.cpp:254
44msgid "Retry"
42msgid "Retry"
45msgstr "Qagis"
43msgstr "Qagis"
46
44
@@ -52,16 +50,16 @@ msgstr ""
52msgid "Guest Session"
50msgid "Guest Session"
53msgstr ""
51msgstr ""
54
52
55−#: plugins/Unity/Launcher/launcheritem.cpp:48
53+#: plugins/Unity/Launcher/launcheritem.cpp:49
56−#: plugins/Unity/Launcher/launcheritem.cpp:122
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
57msgid "Pin shortcut"
55msgid "Pin shortcut"
58msgstr ""
56msgstr ""
59
57
60−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
61msgid "Quit"
59msgid "Quit"
62msgstr "Kat"
60msgstr "Kat"
63
61
64−#: plugins/Unity/Launcher/launcheritem.cpp:122
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
65msgid "Unpin shortcut"
63msgid "Unpin shortcut"
66msgstr ""
64msgstr ""
67
65
@@ -84,8 +82,9 @@ msgctxt "Button: Log out from the system"
84msgid "Log Out"
82msgid "Log Out"
85msgstr "Eweq"
83msgstr "Eweq"
86
84
87−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
88−#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Wizard/Pages/passcode-confirm.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
90msgid "Cancel"
89msgid "Cancel"
91msgstr "Bayis"
90msgstr "Bayis"
@@ -107,37 +106,33 @@ msgstr "Maleey"
107msgid "Yes"
106msgid "Yes"
108msgstr "Yeey"
107msgstr "Yeey"
109
108
110−#: qml/Components/Dialogs.qml:243
109+#: qml/Components/Dialogs.qml:239
111msgctxt "Title: Power off/Restart dialog"
110msgctxt "Title: Power off/Restart dialog"
112msgid "Power"
111msgid "Power"
113msgstr "Cayla"
112msgstr "Cayla"
114
113
115−#: qml/Components/Dialogs.qml:244
114+#: qml/Components/Dialogs.qml:240
116msgid ""
115msgid ""
117"Are you sure you would like\n"
116"Are you sure you would like\n"
118"to power off?"
117"to power off?"
119msgstr "Timmi haytuh digga maay litoo?"
118msgstr "Timmi haytuh digga maay litoo?"
120
119
121−#: qml/Components/Dialogs.qml:248
120+#: qml/Components/Dialogs.qml:244
122msgctxt "Button: Power off the system"
121msgctxt "Button: Power off the system"
123msgid "Power off"
122msgid "Power off"
124msgstr "Timmi hayis"
123msgstr "Timmi hayis"
125
124
126−#: qml/Components/Dialogs.qml:263
125+#: qml/Components/Dialogs.qml:255
127msgctxt "Button: Restart the system"
126msgctxt "Button: Restart the system"
128msgid "Restart"
127msgid "Restart"
129msgstr "Wadir-qimbis"
128msgstr "Wadir-qimbis"
130
129
131−#: qml/Components/Dialogs.qml:276
132−msgid "Screenshot"
133−msgstr ""
134−
135#: qml/Components/KeyboardShortcutsOverlay.qml:41
130#: qml/Components/KeyboardShortcutsOverlay.qml:41
136msgid "Keyboard Shortcuts"
131msgid "Keyboard Shortcuts"
137msgstr ""
132msgstr ""
138
133
139#: qml/Components/KeyboardShortcutsOverlay.qml:55
134#: qml/Components/KeyboardShortcutsOverlay.qml:55
140−msgid "Lomiri"
135+msgid "Unity 8"
141msgstr ""
136msgstr ""
142
137
143#: qml/Components/KeyboardShortcutsOverlay.qml:62
138#: qml/Components/KeyboardShortcutsOverlay.qml:62
@@ -224,6 +219,18 @@ msgstr ""
224msgid "Opens the Application Drawer."
219msgid "Opens the Application Drawer."
225msgstr ""
220msgstr ""
226
221
222+#: qml/Components/KeyboardShortcutsOverlay.qml:207
223+msgid "Scopes"
224+msgstr ""
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:214
227+msgid "Super (Tap)"
228+msgstr ""
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:219
231+msgid "Opens the Scopes home."
232+msgstr ""
233+
227#: qml/Components/KeyboardShortcutsOverlay.qml:235
234#: qml/Components/KeyboardShortcutsOverlay.qml:235
228msgid "Switching"
235msgid "Switching"
229msgstr ""
236msgstr ""
@@ -296,7 +303,7 @@ msgstr ""
296msgid "Closes the current window."
303msgid "Closes the current window."
297msgstr ""
304msgstr ""
298
305
299−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
306+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
300msgid "Return to Call"
307msgid "Return to Call"
301msgstr "Seecol gacis"
308msgstr "Seecol gacis"
302
309
@@ -370,6 +377,103 @@ msgstr ""
370msgid "Find more settings in the system settings."
377msgid "Find more settings in the system settings."
371msgstr ""
378msgstr ""
372
379
380+#: qml/Dash/DashPageHeader.qml:361
381+msgctxt "Button: Open the Ubuntu Store"
382+msgid "Store"
383+msgstr ""
384+
385+#: qml/Dash/DashPageHeader.qml:368
386+msgctxt "Button: Start a search in the current dash scope"
387+msgid "Search"
388+msgstr "Goranto"
389+
390+#: qml/Dash/DashPageHeader.qml:378
391+msgctxt "Button: Show the current dash scope settings"
392+msgid "Settings"
393+msgstr "Massosu"
394+
395+#: qml/Dash/DashPageHeader.qml:385
396+msgid "Remove from Favorites"
397+msgstr ""
398+
399+#: qml/Dash/DashPageHeader.qml:385
400+msgid "Add to Favorites"
401+msgstr ""
402+
403+#: qml/Dash/FiltersPopover.qml:61
404+msgid "Refine your results"
405+msgstr ""
406+
407+#: qml/Dash/FiltersPopover.qml:70
408+msgid "Reset"
409+msgstr ""
410+
411+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
412+msgid "Show less"
413+msgstr ""
414+
415+#: qml/Dash/GenericScopeView.qml:547
416+msgid "Show all"
417+msgstr ""
418+
419+#: qml/Dash/GenericScopeView.qml:578
420+msgctxt "Label: Hint for dash search line edit"
421+msgid "Search"
422+msgstr "Goranto"
423+
424+#: qml/Dash/PageHeaderExtraPanel.qml:67
425+msgid "Recent Searches"
426+msgstr ""
427+
428+#: qml/Dash/PageHeaderExtraPanel.qml:78
429+msgid "Clear All"
430+msgstr ""
431+
432+#: qml/Dash/Previews/PreviewActionCombo.qml:36
433+msgid "More..."
434+msgstr ""
435+
436+#: qml/Dash/Previews/PreviewActionCombo.qml:36
437+msgid "Less..."
438+msgstr ""
439+
440+#: qml/Dash/Previews/PreviewCommentInput.qml:83
441+#: qml/Dash/Previews/PreviewRatingInput.qml:202
442+msgid "Send"
443+msgstr "Rub"
444+
445+#: qml/Dash/Previews/PreviewRatingInput.qml:109
446+msgid "Rate this"
447+msgstr ""
448+
449+#: qml/Dash/Previews/PreviewRatingInput.qml:184
450+msgid "Add a review"
451+msgstr ""
452+
453+#: qml/Dash/PullToRefreshScopeStyle.qml:56
454+msgid "Pull to refresh…"
455+msgstr ""
456+
457+#: qml/Dash/PullToRefreshScopeStyle.qml:61
458+msgid "Release to refresh…"
459+msgstr ""
460+
461+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
462+msgid "Enable location data"
463+msgstr ""
464+
465+#: qml/Dash/ScopesList.qml:146
466+msgid "Manage"
467+msgstr ""
468+
469+#: qml/Dash/ScopesList.qml:187
470+msgid "Home"
471+msgstr "Dabqi"
472+
473+#: qml/Dash/ScopesList.qml:188
474+msgid "Also installed"
475+msgstr ""
476+
373#: qml/Greeter/CoverPage.qml:127
477#: qml/Greeter/CoverPage.qml:127
374msgid "Unlock"
478msgid "Unlock"
375msgstr ""
479msgstr ""
@@ -398,18 +502,14 @@ msgid "Try again"
398msgstr ""
502msgstr ""
399
503
400#: qml/Greeter/Greeter.qml:551
504#: qml/Greeter/Greeter.qml:551
401−#, fuzzy
402−#| msgid "Enter passphrase"
403msgid "Enter passphrase to unlock"
505msgid "Enter passphrase to unlock"
404−msgstr "Tatur-maxco culus"
506+msgstr ""
405
507
406#: qml/Greeter/Greeter.qml:552
508#: qml/Greeter/Greeter.qml:552
407−#, fuzzy
408−#| msgid "Enter passcode"
409msgid "Enter passcode to unlock"
509msgid "Enter passcode to unlock"
410−msgstr "Tatur-mudenta culus"
510+msgstr ""
411
511
412−#: qml/Greeter/NarrowView.qml:235
512+#: qml/Greeter/NarrowView.qml:228
413msgid "Emergency"
513msgid "Emergency"
414msgstr ""
514msgstr ""
415
515
@@ -425,19 +525,17 @@ msgstr ""
425msgid "Select desktop environment"
525msgid "Select desktop environment"
426msgstr ""
526msgstr ""
427
527
428−#: qml/Launcher/Drawer.qml:250
528+#: qml/Launcher/Drawer.qml:94
429−#, fuzzy
430−#| msgctxt "Button: Start a search in the current dash scope"
431−#| msgid "Search"
432msgid "Search…"
529msgid "Search…"
433−msgstr "Goranto"
530+msgstr ""
434
531
435−#: qml/Launcher/PullToRefreshScopeStyle.qml:56
532+#: qml/Launcher/Drawer.qml:129
533+msgctxt "Apps sorted alphabetically"
436−msgid "Pull to refresh…"
534+msgid "A-Z"
437msgstr ""
535msgstr ""
438
536
439−#: qml/Launcher/PullToRefreshScopeStyle.qml:61
537+#: qml/Launcher/MoreAppsHeader.qml:55
440−msgid "Release to refresh…"
538+msgid "More apps in the store"
441msgstr ""
539msgstr ""
442
540
443#: qml/Notifications/NotificationMenuItemFactory.qml:124
541#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -528,20 +626,13 @@ msgid "Call back"
528msgstr ""
626msgstr ""
529
627
530#: qml/Panel/PanelMenuPage.qml:92
628#: qml/Panel/PanelMenuPage.qml:92
531−#, fuzzy
532−#| msgctxt "Button: Go back one page in the Wizard"
533−#| msgid "Back"
534msgid "Back"
629msgid "Back"
535−msgstr "Derre"
630+msgstr ""
536
631
537#: qml/Stage/SideStage.qml:76
632#: qml/Stage/SideStage.qml:76
538msgid "Drag using 3 fingers any application from one window to the other"
633msgid "Drag using 3 fingers any application from one window to the other"
539msgstr ""
634msgstr ""
540
635
541−#: qml/Stage/Stage.qml:671
542−msgid "No running apps"
543−msgstr ""
544−
545#: qml/Tutorial/TutorialLeftLong.qml:49
636#: qml/Tutorial/TutorialLeftLong.qml:49
546msgid "Long swipe from the left edge to open the Application Drawer"
637msgid "Long swipe from the left edge to open the Application Drawer"
547msgstr ""
638msgstr ""
@@ -550,11 +641,11 @@ msgstr ""
550msgid "Short swipe from the left edge to open the launcher"
641msgid "Short swipe from the left edge to open the launcher"
551msgstr ""
642msgstr ""
552
643
553−#: qml/Tutorial/TutorialRight.qml:54
644+#: qml/Tutorial/TutorialRight.qml:55
554msgid "Push your mouse against the right edge to view your open apps"
645msgid "Push your mouse against the right edge to view your open apps"
555msgstr ""
646msgstr ""
556
647
557−#: qml/Tutorial/TutorialRight.qml:55
648+#: qml/Tutorial/TutorialRight.qml:56
558msgid "Swipe from the right edge to view your open apps"
649msgid "Swipe from the right edge to view your open apps"
559msgstr ""
650msgstr ""
560
651
@@ -562,41 +653,25 @@ msgstr ""
562msgid "Swipe from the top edge to access notifications and quick settings"
653msgid "Swipe from the top edge to access notifications and quick settings"
563msgstr ""
654msgstr ""
564
655
565−#: qml/Wizard/Page.qml:59
656+#: qml/Wizard/Page.qml:54
566msgctxt "Button: Go back one page in the Wizard"
657msgctxt "Button: Go back one page in the Wizard"
567msgid "Back"
658msgid "Back"
568msgstr "Derre"
659msgstr "Derre"
569
660
570−#: qml/Wizard/Pages/10-welcome.qml:29
661+#: qml/Wizard/Pages/10-welcome.qml:28
571msgid "Language"
662msgid "Language"
572msgstr ""
663msgstr ""
573
664
574−#: qml/Wizard/Pages/10-welcome.qml:176
665+#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
575−#: qml/Wizard/Pages/10-welcome-update.qml:126
666+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
576−#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
577−#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
667+#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
578−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
668+#: qml/Wizard/Pages/70-passwd-type.qml:145
669+#: qml/Wizard/Pages/75-report-check.qml:84
579−#: qml/Wizard/Pages/passcode-desktop.qml:154
670+#: qml/Wizard/Pages/passcode-desktop.qml:142
580−#: qml/Wizard/Pages/password-set.qml:153
671+#: qml/Wizard/Pages/password-set.qml:142
581msgid "Next"
672msgid "Next"
582msgstr ""
673msgstr ""
583
674
584−#: qml/Wizard/Pages/10-welcome-update.qml:91
585−msgid "Welcome to "
586−msgstr ""
587−
588−#: qml/Wizard/Pages/10-welcome-update.qml:106
589−msgid "We will make sure your device is ready to use "
590−msgstr ""
591−
592−#: qml/Wizard/Pages/11-changelog.qml:28
593−msgid "What's new"
594−msgstr ""
595−
596−#: qml/Wizard/Pages/11-changelog.qml:74
597−msgid "Loading..."
598−msgstr ""
599−
600#: qml/Wizard/Pages/20-keyboard.qml:31
675#: qml/Wizard/Pages/20-keyboard.qml:31
601msgid "Select Keyboard"
676msgid "Select Keyboard"
602msgstr ""
677msgstr ""
@@ -609,33 +684,64 @@ msgstr ""
609msgid "Keyboard layout"
684msgid "Keyboard layout"
610msgstr ""
685msgstr ""
611
686
612−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
687+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
613−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
614−#: qml/Wizard/Pages/sim.qml:101
688+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
615msgid "Skip"
689msgid "Skip"
616msgstr "Kaqit"
690msgstr "Kaqit"
617
691
618−#: qml/Wizard/Pages/30-wifi.qml:31
692+#: qml/Wizard/Pages/30-wifi.qml:30
619msgid "Connect to Wi‑Fi"
693msgid "Connect to Wi‑Fi"
620msgstr ""
694msgstr ""
621
695
622−#: qml/Wizard/Pages/30-wifi.qml:139
696+#: qml/Wizard/Pages/30-wifi.qml:131
623msgid "Connected"
697msgid "Connected"
624msgstr ""
698msgstr ""
625
699
626−#: qml/Wizard/Pages/30-wifi.qml:172
700+#: qml/Wizard/Pages/30-wifi.qml:164
627msgid "Available Wi-Fi networks"
701msgid "Available Wi-Fi networks"
628msgstr ""
702msgstr ""
629
703
630−#: qml/Wizard/Pages/30-wifi.qml:173
704+#: qml/Wizard/Pages/30-wifi.qml:165
631msgid "No available Wi-Fi networks"
705msgid "No available Wi-Fi networks"
632msgstr ""
706msgstr ""
633
707
708+#: qml/Wizard/Pages/40-location.qml:27
709+msgid "Location Services"
710+msgstr ""
711+
712+#: qml/Wizard/Pages/40-location.qml:83
713+msgid ""
714+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
715+"(recommended)"
716+msgstr ""
717+
718+#: qml/Wizard/Pages/40-location.qml:105
719+#, qt-format
720+msgid "By selecting this option you agree to the Nokia HERE %1."
721+msgstr ""
722+
723+#: qml/Wizard/Pages/40-location.qml:106
724+msgctxt "part of: Nokia HERE terms and conditions"
725+msgid "terms and conditions"
726+msgstr ""
727+
728+#: qml/Wizard/Pages/40-location.qml:160
729+msgid "GPS only"
730+msgstr ""
731+
732+#: qml/Wizard/Pages/40-location.qml:214
733+msgid "Don't use my location"
734+msgstr ""
735+
736+#: qml/Wizard/Pages/40-location.qml:260
737+msgid "You can change it later in System Settings."
738+msgstr ""
739+
634#: qml/Wizard/Pages/50-timezone.qml:30
740#: qml/Wizard/Pages/50-timezone.qml:30
635msgid "Time Zone"
741msgid "Time Zone"
636msgstr ""
742msgstr ""
637
743
638−#: qml/Wizard/Pages/50-timezone.qml:183
744+#: qml/Wizard/Pages/50-timezone.qml:182
639msgid "Enter your city"
745msgid "Enter your city"
640msgstr ""
746msgstr ""
641
747
@@ -643,7 +749,7 @@ msgstr ""
643msgid "Personalize Your Device"
749msgid "Personalize Your Device"
644msgstr ""
750msgstr ""
645
751
646−#: qml/Wizard/Pages/60-account.qml:54
752+#: qml/Wizard/Pages/60-account.qml:48
647msgid "Preferred Name"
753msgid "Preferred Name"
648msgstr ""
754msgstr ""
649
755
@@ -651,72 +757,81 @@ msgstr ""
651msgid "Lock Screen"
757msgid "Lock Screen"
652msgstr ""
758msgstr ""
653
759
654−#: qml/Wizard/Pages/70-passwd-type.qml:103
760+#: qml/Wizard/Pages/70-passwd-type.qml:102
655msgctxt "Label: Type of security method"
761msgctxt "Label: Type of security method"
656msgid "Create new password"
762msgid "Create new password"
657msgstr ""
763msgstr ""
658
764
659−#: qml/Wizard/Pages/70-passwd-type.qml:105
765+#: qml/Wizard/Pages/70-passwd-type.qml:104
660msgctxt "Label: Type of security method"
766msgctxt "Label: Type of security method"
661msgid "Create passcode (numbers only)"
767msgid "Create passcode (numbers only)"
662msgstr ""
768msgstr ""
663
769
664−#: qml/Wizard/Pages/70-passwd-type.qml:107
770+#: qml/Wizard/Pages/70-passwd-type.qml:106
665msgctxt "Label: Type of security method"
771msgctxt "Label: Type of security method"
666msgid "No lock code"
772msgid "No lock code"
667msgstr ""
773msgstr ""
668
774
669−#: qml/Wizard/Pages/79-system-update.qml:28
775+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
670−msgid "Update Device"
776+msgid "Privacy Policy"
671msgstr ""
777msgstr ""
672
778
673−#: qml/Wizard/Pages/79-system-update.qml:55
779+#: qml/Wizard/Pages/75-report-check.qml:26
674−msgid ""
780+msgid "Help Us Improve"
675−"There is a system update available and ready to install. Afterwards, the "
676−"device will automatically restart."
677msgstr ""
781msgstr ""
678
782
679−#: qml/Wizard/Pages/79-system-update.qml:76
783+#: qml/Wizard/Pages/75-report-check.qml:59
680−msgctxt "string identifying name of the update"
784+msgid "Improve system performance by sending us crashes and error reports."
681−msgid "Ubuntu Touch system"
682msgstr ""
785msgstr ""
683
786
684−#: qml/Wizard/Pages/79-system-update.qml:83
787+#: qml/Wizard/Pages/75-report-check.qml:60
685−#, qt-format
788+msgid "Privacy policy"
686−msgctxt "version of the system update"
687−msgid "Version %1"
688msgstr ""
789msgstr ""
689
790
690−#: qml/Wizard/Pages/79-system-update.qml:95
791+#: qml/Wizard/Pages/80-finished.qml:89
691−msgid "This could take a few minutes..."
792+msgid "Welcome to Ubuntu"
692msgstr ""
793msgstr ""
693
794
694−#: qml/Wizard/Pages/79-system-update.qml:109
795+#: qml/Wizard/Pages/80-finished.qml:104
695−msgid "Install and restart now"
796+msgid "You are ready to use your device now"
696msgstr ""
797msgstr ""
697
798
698−#: qml/Wizard/Pages/80-finished.qml:91
799+#: qml/Wizard/Pages/80-finished.qml:124
699−msgid "Welcome Back"
800+msgid "Get Started"
700msgstr ""
801msgstr ""
701
802
702−#: qml/Wizard/Pages/80-finished.qml:91
803+#: qml/Wizard/Pages/here-terms.qml:25
703−msgid "Welcome to Ubuntu"
804+msgid "Terms & Conditions"
704msgstr ""
805msgstr ""
705
806
706−#: qml/Wizard/Pages/80-finished.qml:106
807+#: qml/Wizard/Pages/here-terms.qml:69
707−msgid "You are ready to use your device now"
808+msgid "Your device uses positioning technologies provided by HERE."
708msgstr ""
809msgstr ""
709
810
710−#: qml/Wizard/Pages/80-finished.qml:126
811+#: qml/Wizard/Pages/here-terms.qml:81
711−msgid "Continue"
812+msgid ""
813+"To provide you with positioning services and to improve their quality, HERE "
814+"collects information about nearby cell towers and Wi-Fi hotspots around your "
815+"current location whenever your position is being found."
712−msgstr "Tatur"
816+msgstr ""
713
817
714−#: qml/Wizard/Pages/80-finished.qml:126
818+#: qml/Wizard/Pages/here-terms.qml:93
715−msgid "Get Started"
819+msgid ""
820+"The information collected is used to analyze the service and to improve the "
821+"use of service, but not to identify you personally."
822+msgstr ""
823+
824+#: qml/Wizard/Pages/here-terms.qml:106
825+#, qt-format
826+msgid "By continuing, you agree to the HERE platform %1 and %2."
827+msgstr ""
828+
829+#: qml/Wizard/Pages/here-terms.qml:107
830+msgid "Service Terms"
716msgstr ""
831msgstr ""
717
832
718#: qml/Wizard/Pages/passcode-confirm.qml:43
833#: qml/Wizard/Pages/passcode-confirm.qml:43
719−#: qml/Wizard/Pages/passcode-desktop.qml:104
834+#: qml/Wizard/Pages/passcode-desktop.qml:97
720msgid "Confirm passcode"
835msgid "Confirm passcode"
721msgstr ""
836msgstr ""
722
837
@@ -733,24 +848,24 @@ msgstr ""
733msgid "Lock Screen Passcode"
848msgid "Lock Screen Passcode"
734msgstr ""
849msgstr ""
735
850
736−#: qml/Wizard/Pages/passcode-desktop.qml:68
851+#: qml/Wizard/Pages/passcode-desktop.qml:61
737msgid "Enter 4 numbers to setup your passcode"
852msgid "Enter 4 numbers to setup your passcode"
738msgstr ""
853msgstr ""
739
854
740−#: qml/Wizard/Pages/passcode-desktop.qml:84
855+#: qml/Wizard/Pages/passcode-desktop.qml:77
741#: qml/Wizard/Pages/passcode-set.qml:54
856#: qml/Wizard/Pages/passcode-set.qml:54
742msgid "Choose passcode"
857msgid "Choose passcode"
743msgstr ""
858msgstr ""
744
859
745−#: qml/Wizard/Pages/passcode-desktop.qml:139
860+#: qml/Wizard/Pages/passcode-desktop.qml:127
746msgid "Passcode too short"
861msgid "Passcode too short"
747msgstr ""
862msgstr ""
748
863
749−#: qml/Wizard/Pages/passcode-desktop.qml:141
864+#: qml/Wizard/Pages/passcode-desktop.qml:129
750msgid "Passcodes match"
865msgid "Passcodes match"
751msgstr ""
866msgstr ""
752
867
753−#: qml/Wizard/Pages/passcode-desktop.qml:143
868+#: qml/Wizard/Pages/passcode-desktop.qml:131
754msgid "Passcodes do not match"
869msgid "Passcodes do not match"
755msgstr ""
870msgstr ""
756
871
@@ -762,15 +877,15 @@ msgstr ""
762msgid "Lock Screen Password"
877msgid "Lock Screen Password"
763msgstr ""
878msgstr ""
764
879
765−#: qml/Wizard/Pages/password-set.qml:68
880+#: qml/Wizard/Pages/password-set.qml:62
766msgid "Enter at least 8 characters"
881msgid "Enter at least 8 characters"
767msgstr ""
882msgstr ""
768
883
769−#: qml/Wizard/Pages/password-set.qml:80
884+#: qml/Wizard/Pages/password-set.qml:74
770msgid "Choose password"
885msgid "Choose password"
771msgstr ""
886msgstr ""
772
887
773−#: qml/Wizard/Pages/password-set.qml:110
888+#: qml/Wizard/Pages/password-set.qml:104
774msgid "Confirm password"
889msgid "Confirm password"
775msgstr ""
890msgstr ""
776
891
@@ -826,28 +941,6 @@ msgstr ""
826msgid "Very weak password"
941msgid "Very weak password"
827msgstr ""
942msgstr ""
828
943
829−#~ msgctxt "Button: Show the current dash scope settings"
830−#~ msgid "Settings"
831−#~ msgstr "Massosu"
832−
833−#~ msgctxt "Label: Hint for dash search line edit"
834−#~ msgid "Search"
835−#~ msgstr "Goranto"
836−
837−#~ msgid "Send"
838−#~ msgstr "Rub"
839−
840−#~ msgid "Home"
841−#~ msgstr "Dabqi"
842−
843−#, fuzzy
844−#~ msgid "Download"
845−#~ msgstr "Qulluumah"
846−
847−#, fuzzy
848−#~ msgid "Downloaded"
849−#~ msgstr "Qulluumah"
850−
851#~ msgctxt "Title: Reboot/Shut down dialog"
944#~ msgctxt "Title: Reboot/Shut down dialog"
852#~ msgid "Shut down"
945#~ msgid "Shut down"
853#~ msgstr "Bargus"
946#~ msgstr "Bargus"
@@ -863,9 +956,16 @@ msgstr ""
863#~ msgid "Reboot"
956#~ msgid "Reboot"
864#~ msgstr "Wadir-ugus"
957#~ msgstr "Wadir-ugus"
865
958
959+#, qt-format
866#~ msgid "Enter %1"
960#~ msgid "Enter %1"
867#~ msgstr "%1 culus"
961#~ msgstr "%1 culus"
868
962
963+#~ msgid "Enter passphrase"
964+#~ msgstr "Tatur-maxco culus"
965+
966+#~ msgid "Enter passcode"
967+#~ msgstr "Tatur-mudenta culus"
968+
869#~ msgctxt "Label: Type of security method"
969#~ msgctxt "Label: Type of security method"
870#~ msgid "Swipe"
970#~ msgid "Swipe"
871#~ msgstr "Uysuttuc"
971#~ msgstr "Uysuttuc"
@@ -878,3 +978,6 @@ msgstr ""
878
978
879#~ msgid "Let’s get started."
979#~ msgid "Let’s get started."
880#~ msgstr "Hayya qimbisnay."
980#~ msgstr "Hayya qimbisnay."
981+
982+#~ msgid "Continue"
983+#~ msgstr "Tatur"
po/am.po+334−368
@@ -6,41 +6,39 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: \n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2021-01-29 11:42-0600\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2021-08-29 20:18+0000\n"
11+"PO-Revision-Date: 2017-01-26 15:04+0000\n"
12−"Last-Translator: Samson <sambelet@yahoo.com>\n"
12+"Last-Translator: samson <Unknown>\n"
13−"Language-Team: Amharic <https://translate.ubports.com/projects/ubports/"
13+"Language-Team: Amharic <am@li.org>\n"
14−"lomiri/am/>\n"
15−"Language: am\n"
16"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
20−"X-Generator: Weblate 3.11.3\n"
21−"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
22
20
23−#: plugins/LightDM/Greeter.cpp:199
21+#: plugins/LightDM/Greeter.cpp:188
24msgid "Password: "
22msgid "Password: "
25msgstr "የ መግቢያ ቃል: "
23msgstr "የ መግቢያ ቃል: "
26
24
27−#: plugins/LightDM/Greeter.cpp:214
25+#: plugins/LightDM/Greeter.cpp:203
28msgid "Username"
26msgid "Username"
29msgstr "የ ተጠቃሚ ስም"
27msgstr "የ ተጠቃሚ ስም"
30
28
31−#: plugins/LightDM/Greeter.cpp:258
29+#: plugins/LightDM/Greeter.cpp:242
32msgid "Failed to authenticate"
30msgid "Failed to authenticate"
33msgstr "ማረጋገጥ አልተቻለም"
31msgstr "ማረጋገጥ አልተቻለም"
34
32
35−#: plugins/LightDM/Greeter.cpp:260
33+#: plugins/LightDM/Greeter.cpp:244
36msgid "Invalid password, please try again"
34msgid "Invalid password, please try again"
37−msgstr "ዋጋ የሌለው የ መግቢያ ቃል: እባክዎን እንደገና ይሞክሩ"
35+msgstr "እባክዎን እንደገና ይሞክሩ ዋጋ የሌለው የመግቢያ ቃል"
38
36
39−#: plugins/LightDM/Greeter.cpp:270
37+#: plugins/LightDM/Greeter.cpp:254
40msgid "Log In"
38msgid "Log In"
41msgstr "መግቢያ"
39msgstr "መግቢያ"
42
40
43−#: plugins/LightDM/Greeter.cpp:270
41+#: plugins/LightDM/Greeter.cpp:254
44msgid "Retry"
42msgid "Retry"
45msgstr "እንደገና ይሞክሩ"
43msgstr "እንደገና ይሞክሩ"
46
44
@@ -52,16 +50,16 @@ msgstr "መግቢያ"
52msgid "Guest Session"
50msgid "Guest Session"
53msgstr "የ እንግዳ ክፍለ ጊዜ"
51msgstr "የ እንግዳ ክፍለ ጊዜ"
54
52
55−#: plugins/Unity/Launcher/launcheritem.cpp:48
53+#: plugins/Unity/Launcher/launcheritem.cpp:49
56−#: plugins/Unity/Launcher/launcheritem.cpp:122
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
57msgid "Pin shortcut"
55msgid "Pin shortcut"
58msgstr "አቋራጭ ማጣበቂያ"
56msgstr "አቋራጭ ማጣበቂያ"
59
57
60−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
61msgid "Quit"
59msgid "Quit"
62msgstr "ማጥፊያ"
60msgstr "ማጥፊያ"
63
61
64−#: plugins/Unity/Launcher/launcheritem.cpp:122
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
65msgid "Unpin shortcut"
63msgid "Unpin shortcut"
66msgstr "አቋራጭ መለያያ"
64msgstr "አቋራጭ መለያያ"
67
65
@@ -84,8 +82,9 @@ msgctxt "Button: Log out from the system"
84msgid "Log Out"
82msgid "Log Out"
85msgstr "መውጫ"
83msgstr "መውጫ"
86
84
87−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
88−#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Wizard/Pages/passcode-confirm.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
90msgid "Cancel"
89msgid "Cancel"
91msgstr "መሰረዣ"
90msgstr "መሰረዣ"
@@ -107,12 +106,12 @@ msgstr "አይ"
107msgid "Yes"
106msgid "Yes"
108msgstr "አዎ"
107msgstr "አዎ"
109
108
110−#: qml/Components/Dialogs.qml:243
109+#: qml/Components/Dialogs.qml:239
111msgctxt "Title: Power off/Restart dialog"
110msgctxt "Title: Power off/Restart dialog"
112msgid "Power"
111msgid "Power"
113msgstr "ሐይል"
112msgstr "ሐይል"
114
113
115−#: qml/Components/Dialogs.qml:244
114+#: qml/Components/Dialogs.qml:240
116msgid ""
115msgid ""
117"Are you sure you would like\n"
116"Are you sure you would like\n"
118"to power off?"
117"to power off?"
@@ -120,27 +119,23 @@ msgstr ""
120"በእርግጥ ሐይሉን ማጥፋት\n"
119"በእርግጥ ሐይሉን ማጥፋት\n"
121"ይፈልጋሉ?"
120"ይፈልጋሉ?"
122
121
123−#: qml/Components/Dialogs.qml:248
122+#: qml/Components/Dialogs.qml:244
124msgctxt "Button: Power off the system"
123msgctxt "Button: Power off the system"
125msgid "Power off"
124msgid "Power off"
126msgstr "ሐይል ማጥፊያ"
125msgstr "ሐይል ማጥፊያ"
127
126
128−#: qml/Components/Dialogs.qml:263
127+#: qml/Components/Dialogs.qml:255
129msgctxt "Button: Restart the system"
128msgctxt "Button: Restart the system"
130msgid "Restart"
129msgid "Restart"
131msgstr "እንደገና ማስጀመሪያ"
130msgstr "እንደገና ማስጀመሪያ"
132
131
133−#: qml/Components/Dialogs.qml:276
134−msgid "Screenshot"
135−msgstr "መመልከቻ ፎቶ ማንሻ"
136−
137#: qml/Components/KeyboardShortcutsOverlay.qml:41
132#: qml/Components/KeyboardShortcutsOverlay.qml:41
138msgid "Keyboard Shortcuts"
133msgid "Keyboard Shortcuts"
139msgstr "የ ፊደል ገበታ አቋራጮች"
134msgstr "የ ፊደል ገበታ አቋራጮች"
140
135
141#: qml/Components/KeyboardShortcutsOverlay.qml:55
136#: qml/Components/KeyboardShortcutsOverlay.qml:55
142−msgid "Lomiri"
137+msgid "Unity 8"
143−msgstr "Lomiri"
138+msgstr "Unity 8"
144
139
145#: qml/Components/KeyboardShortcutsOverlay.qml:62
140#: qml/Components/KeyboardShortcutsOverlay.qml:62
146msgid "PrtScr"
141msgid "PrtScr"
@@ -156,7 +151,7 @@ msgstr "Alt + PrtScr"
156
151
157#: qml/Components/KeyboardShortcutsOverlay.qml:80
152#: qml/Components/KeyboardShortcutsOverlay.qml:80
158msgid "Takes a screenshot of the current window."
153msgid "Takes a screenshot of the current window."
159−msgstr "የ አሁኑን መስኮት መመልከቻ ፎቶ ማንሻ"
154+msgstr "የ አሁኑን መስኮት ፎቶ ማንሻ"
160
155
161#: qml/Components/KeyboardShortcutsOverlay.qml:88
156#: qml/Components/KeyboardShortcutsOverlay.qml:88
162msgid "Super + Space"
157msgid "Super + Space"
@@ -212,7 +207,7 @@ msgstr "መተግበሪያዎችን በ ማስጀመሪያ መቀየሪያ"
212
207
213#: qml/Components/KeyboardShortcutsOverlay.qml:177
208#: qml/Components/KeyboardShortcutsOverlay.qml:177
214msgid "Super + 1 to 0"
209msgid "Super + 1 to 0"
215−msgstr "Super + 0 እስከ 9"
210+msgstr "Super + 1 ወደ 0"
216
211
217#: qml/Components/KeyboardShortcutsOverlay.qml:182
212#: qml/Components/KeyboardShortcutsOverlay.qml:182
218msgid "Same as clicking on a launcher icon."
213msgid "Same as clicking on a launcher icon."
@@ -224,7 +219,19 @@ msgstr "Super + A"
224
219
225#: qml/Components/KeyboardShortcutsOverlay.qml:195
220#: qml/Components/KeyboardShortcutsOverlay.qml:195
226msgid "Opens the Application Drawer."
221msgid "Opens the Application Drawer."
227−msgstr "የ መሳያ መተግበሪያ ማስጀመሪያ"
222+msgstr "መተግበሪያ መክፈቻ"
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
225+msgid "Scopes"
226+msgstr "ክልል"
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
229+msgid "Super (Tap)"
230+msgstr "Super (Tap)"
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
233+msgid "Opens the Scopes home."
234+msgstr "የ ክልል ቤት መክፈቻ"
228
235
229#: qml/Components/KeyboardShortcutsOverlay.qml:235
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
230msgid "Switching"
237msgid "Switching"
@@ -298,7 +305,7 @@ msgstr "Alt + F4"
298msgid "Closes the current window."
305msgid "Closes the current window."
299msgstr "የ አሁኑን መስኮት መዝጊያ"
306msgstr "የ አሁኑን መስኮት መዝጊያ"
300
307
301−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
302msgid "Return to Call"
309msgid "Return to Call"
303msgstr "ወደ ጥሪ መመለሻ"
310msgstr "ወደ ጥሪ መመለሻ"
304
311
@@ -358,19 +365,116 @@ msgstr "የ እርስዎ አካል አሁን ከ ውጪ ማሳያ ጋር ተገ
358
365
359#: qml/Components/VirtualTouchPad.qml:327
366#: qml/Components/VirtualTouchPad.qml:327
360msgid "Tap left button to click."
367msgid "Tap left button to click."
361−msgstr "የ ግራ ቁልፍ መታ ያድርጉ ለ መጫን"
368+msgstr "መታ ያድርጉ በ ግራ ቁልፍ ላይ ለ መጫን"
362
369
363#: qml/Components/VirtualTouchPad.qml:339
370#: qml/Components/VirtualTouchPad.qml:339
364msgid "Tap right button to right click."
371msgid "Tap right button to right click."
365−msgstr "የ ቀኝ ቁልፍ መታ ያድርጉ በ ቀኝ ለ መጫን"
372+msgstr "መታ ያድርጉ በ ቀኝ ቁልፍ ላይ ለ መጫን"
366
373
367#: qml/Components/VirtualTouchPad.qml:351
374#: qml/Components/VirtualTouchPad.qml:351
368msgid "Swipe with two fingers to scroll."
375msgid "Swipe with two fingers to scroll."
369−msgstr "ለ መሸብለል በ ሁለት ጣቶች ይጥረጉ"
376+msgstr "ለ መሽብለል በ ሁለት ጣት ይጥረጉ"
370
377
371#: qml/Components/VirtualTouchPad.qml:396
378#: qml/Components/VirtualTouchPad.qml:396
372msgid "Find more settings in the system settings."
379msgid "Find more settings in the system settings."
373−msgstr "ተጨማሪ ማሰናጃ በ ስርአት ማሰናጃ ውስጥ መፈለጊያ"
380+msgstr "ተጨማሪ ማሰናጃዎችን ያግኙ በ ስርአት ማሰናጃ ውስጥ"
381+
382+#: qml/Dash/DashPageHeader.qml:361
383+msgctxt "Button: Open the Ubuntu Store"
384+msgid "Store"
385+msgstr "ማስቀመጫ"
386+
387+#: qml/Dash/DashPageHeader.qml:368
388+msgctxt "Button: Start a search in the current dash scope"
389+msgid "Search"
390+msgstr "መፈለጊያ"
391+
392+#: qml/Dash/DashPageHeader.qml:378
393+msgctxt "Button: Show the current dash scope settings"
394+msgid "Settings"
395+msgstr "ማሰናጃዎች"
396+
397+#: qml/Dash/DashPageHeader.qml:385
398+msgid "Remove from Favorites"
399+msgstr "ከምወዳቸው ማስወገጃ"
400+
401+#: qml/Dash/DashPageHeader.qml:385
402+msgid "Add to Favorites"
403+msgstr "ወደምወዳቸው መጨመሪያ"
404+
405+#: qml/Dash/FiltersPopover.qml:61
406+msgid "Refine your results"
407+msgstr "የ እርስዎን ውጤቶች እንደገና ማጣሪያ"
408+
409+#: qml/Dash/FiltersPopover.qml:70
410+msgid "Reset"
411+msgstr "እንደ ነበረ መመለሻ"
412+
413+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
414+msgid "Show less"
415+msgstr "ትንሽ ማሳያ"
416+
417+#: qml/Dash/GenericScopeView.qml:547
418+msgid "Show all"
419+msgstr "ሁሉንም ማሳያ"
420+
421+#: qml/Dash/GenericScopeView.qml:578
422+msgctxt "Label: Hint for dash search line edit"
423+msgid "Search"
424+msgstr "መፈለጊያ"
425+
426+#: qml/Dash/PageHeaderExtraPanel.qml:67
427+msgid "Recent Searches"
428+msgstr "የ ቅርብ ጊዜ ፍለጋዎች"
429+
430+#: qml/Dash/PageHeaderExtraPanel.qml:78
431+msgid "Clear All"
432+msgstr "ሁሉንም ማጽጃ"
433+
434+#: qml/Dash/Previews/PreviewActionCombo.qml:36
435+msgid "More..."
436+msgstr "ተጨማሪ..."
437+
438+#: qml/Dash/Previews/PreviewActionCombo.qml:36
439+msgid "Less..."
440+msgstr "አነስተኛ..."
441+
442+#: qml/Dash/Previews/PreviewCommentInput.qml:83
443+#: qml/Dash/Previews/PreviewRatingInput.qml:202
444+msgid "Send"
445+msgstr "መላኪያ"
446+
447+#: qml/Dash/Previews/PreviewRatingInput.qml:109
448+msgid "Rate this"
449+msgstr "ለዚህ ደረጃ ይስጡ"
450+
451+#: qml/Dash/Previews/PreviewRatingInput.qml:184
452+msgid "Add a review"
453+msgstr "ግምገማ መጨመሪያ"
454+
455+#: qml/Dash/PullToRefreshScopeStyle.qml:56
456+msgid "Pull to refresh…"
457+msgstr "ይሳቡ ለማነቃቃት…"
458+
459+#: qml/Dash/PullToRefreshScopeStyle.qml:61
460+msgid "Release to refresh…"
461+msgstr "ይልቀቁ ለማነቃቃት…"
462+
463+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
464+msgid "Enable location data"
465+msgstr "የአካባቢ ዳታ ማስቻያ"
466+
467+#: qml/Dash/ScopesList.qml:146
468+msgid "Manage"
469+msgstr "አስተዳዳሪ"
470+
471+#: qml/Dash/ScopesList.qml:187
472+msgid "Home"
473+msgstr "ቤት"
474+
475+#: qml/Dash/ScopesList.qml:188
476+msgid "Also installed"
477+msgstr "እንዲሁም የተገጠሙ"
374
478
375#: qml/Greeter/CoverPage.qml:127
479#: qml/Greeter/CoverPage.qml:127
376msgid "Unlock"
480msgid "Unlock"
@@ -401,13 +505,13 @@ msgstr "እንደገና ይሞክሩ"
401
505
402#: qml/Greeter/Greeter.qml:551
506#: qml/Greeter/Greeter.qml:551
403msgid "Enter passphrase to unlock"
507msgid "Enter passphrase to unlock"
404−msgstr "የ ማለፊያ ሀረግ ያስገቡ"
508+msgstr "የ ማለፊያ ሀረግ ያስገቡ ለ መክፈት"
405
509
406#: qml/Greeter/Greeter.qml:552
510#: qml/Greeter/Greeter.qml:552
407msgid "Enter passcode to unlock"
511msgid "Enter passcode to unlock"
408msgstr "የ ማለፊያ ኮድ ያስገቡ ለ መክፈት"
512msgstr "የ ማለፊያ ኮድ ያስገቡ ለ መክፈት"
409
513
410−#: qml/Greeter/NarrowView.qml:235
514+#: qml/Greeter/NarrowView.qml:228
411msgid "Emergency"
515msgid "Emergency"
412msgstr "ድንገተኛ"
516msgstr "ድንገተኛ"
413
517
@@ -423,17 +527,18 @@ msgstr "ማለፊያ ኮድ"
423msgid "Select desktop environment"
527msgid "Select desktop environment"
424msgstr "የ ዴስክቶፕ አይነት ይምረጡ"
528msgstr "የ ዴስክቶፕ አይነት ይምረጡ"
425
529
426−#: qml/Launcher/Drawer.qml:250
530+#: qml/Launcher/Drawer.qml:94
427msgid "Search…"
531msgid "Search…"
428−msgstr "መፈለጊያ…"
532+msgstr "መፈለጊያ..."
429
533
430−#: qml/Launcher/PullToRefreshScopeStyle.qml:56
534+#: qml/Launcher/Drawer.qml:129
535+msgctxt "Apps sorted alphabetically"
431−msgid "Pull to refresh…"
536+msgid "A-Z"
432−msgstr "ይሳቡ ለማነቃቃት…"
537+msgstr "A-Z"
433
538
434−#: qml/Launcher/PullToRefreshScopeStyle.qml:61
539+#: qml/Launcher/MoreAppsHeader.qml:55
435−msgid "Release to refresh…"
540+msgid "More apps in the store"
436−msgstr "ይልቀቁ ለማነቃቃት…"
541+msgstr "ተጨማሪ መተግበሪያ በ ሱቅ ውስጥ"
437
542
438#: qml/Notifications/NotificationMenuItemFactory.qml:124
543#: qml/Notifications/NotificationMenuItemFactory.qml:124
439msgid "Show password"
544msgid "Show password"
@@ -530,25 +635,19 @@ msgstr "ወደ ኋላ"
530msgid "Drag using 3 fingers any application from one window to the other"
635msgid "Drag using 3 fingers any application from one window to the other"
531msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
636msgstr "መጎተቻ 3 ጣቶች በ መጠቀም ማንኛውንም መተግበሪያ ከ አንድ መስኮት ወደ ሌላ"
532
637
533−#: qml/Stage/Stage.qml:671
534−msgid "No running apps"
535−msgstr ""
536−
537#: qml/Tutorial/TutorialLeftLong.qml:49
638#: qml/Tutorial/TutorialLeftLong.qml:49
538−#, fuzzy
539−#| msgid "Long swipe from the left edge to open the Today scope"
540msgid "Long swipe from the left edge to open the Application Drawer"
639msgid "Long swipe from the left edge to open the Application Drawer"
541−msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
640+msgstr "በረጅሙ ይጥረጉ ከ ግራ ጠርዝ በኩል መተግበሪያ ለ መክፈት ከ መሳቢያ ውስጥ"
542
641
543#: qml/Tutorial/TutorialLeft.qml:47
642#: qml/Tutorial/TutorialLeft.qml:47
544msgid "Short swipe from the left edge to open the launcher"
643msgid "Short swipe from the left edge to open the launcher"
545msgstr "በ አጭሩ ይጥረጉ ከ ግራ ጠርዝ በኩል ማስጀመሪያውን ለ መክፈት"
644msgstr "በ አጭሩ ይጥረጉ ከ ግራ ጠርዝ በኩል ማስጀመሪያውን ለ መክፈት"
546
645
547−#: qml/Tutorial/TutorialRight.qml:54
646+#: qml/Tutorial/TutorialRight.qml:55
548msgid "Push your mouse against the right edge to view your open apps"
647msgid "Push your mouse against the right edge to view your open apps"
549msgstr "የ እርስዎን አይጥ መጠቆሚያ ወደ ቀኝ ጠርዝ በኩል ያስጠጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
648msgstr "የ እርስዎን አይጥ መጠቆሚያ ወደ ቀኝ ጠርዝ በኩል ያስጠጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
550
649
551−#: qml/Tutorial/TutorialRight.qml:55
650+#: qml/Tutorial/TutorialRight.qml:56
552msgid "Swipe from the right edge to view your open apps"
651msgid "Swipe from the right edge to view your open apps"
553msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
652msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎችን ለ መመልከት"
554
653
@@ -556,44 +655,28 @@ msgstr "ከ ቀኝ በኩል ይጥረጉ የ ተከፈቱ መተግበሪያዎ
556msgid "Swipe from the top edge to access notifications and quick settings"
655msgid "Swipe from the top edge to access notifications and quick settings"
557msgstr "ከ ላይ ጠረዝ በኩል ይጥረጉ ማስታወቂያዎች እና በፍጥነት ማሰናጃዎች ጋር ለ መድረስ"
656msgstr "ከ ላይ ጠረዝ በኩል ይጥረጉ ማስታወቂያዎች እና በፍጥነት ማሰናጃዎች ጋር ለ መድረስ"
558
657
559−#: qml/Wizard/Page.qml:59
658+#: qml/Wizard/Page.qml:54
560msgctxt "Button: Go back one page in the Wizard"
659msgctxt "Button: Go back one page in the Wizard"
561msgid "Back"
660msgid "Back"
562msgstr "ወደ ኋላ"
661msgstr "ወደ ኋላ"
563
662
564−#: qml/Wizard/Pages/10-welcome.qml:29
663+#: qml/Wizard/Pages/10-welcome.qml:28
565msgid "Language"
664msgid "Language"
566msgstr "ቋንቋ"
665msgstr "ቋንቋ"
567
666
568−#: qml/Wizard/Pages/10-welcome.qml:176
667+#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
569−#: qml/Wizard/Pages/10-welcome-update.qml:126
668+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
570−#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
571−#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
669+#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
572−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
670+#: qml/Wizard/Pages/70-passwd-type.qml:145
671+#: qml/Wizard/Pages/75-report-check.qml:84
573−#: qml/Wizard/Pages/passcode-desktop.qml:154
672+#: qml/Wizard/Pages/passcode-desktop.qml:142
574−#: qml/Wizard/Pages/password-set.qml:153
673+#: qml/Wizard/Pages/password-set.qml:142
575msgid "Next"
674msgid "Next"
576msgstr "ይቀጥሉ"
675msgstr "ይቀጥሉ"
577
676
578−#: qml/Wizard/Pages/10-welcome-update.qml:91
579−msgid "Welcome to "
580−msgstr "እንኳን ደህና መጡ ወደ: "
581−
582−#: qml/Wizard/Pages/10-welcome-update.qml:106
583−msgid "We will make sure your device is ready to use "
584−msgstr "የ እርስዎ አካል ለ መጠቀም ዝግጁ ነው: "
585−
586−#: qml/Wizard/Pages/11-changelog.qml:28
587−msgid "What's new"
588−msgstr "ምን አዲስ ነገር አለ"
589−
590−#: qml/Wizard/Pages/11-changelog.qml:74
591−msgid "Loading..."
592−msgstr "በ መጫን ላይ..."
593−
594#: qml/Wizard/Pages/20-keyboard.qml:31
677#: qml/Wizard/Pages/20-keyboard.qml:31
595msgid "Select Keyboard"
678msgid "Select Keyboard"
596−msgstr "የ ፊደል ገበታ ይምረጡ"
679+msgstr "ቋንቋ ይምረጡ"
597
680
598#: qml/Wizard/Pages/20-keyboard.qml:71
681#: qml/Wizard/Pages/20-keyboard.qml:71
599msgid "Keyboard language"
682msgid "Keyboard language"
@@ -603,33 +686,64 @@ msgstr "የ ፊደል ገበታ ቋንቋ"
603msgid "Keyboard layout"
686msgid "Keyboard layout"
604msgstr "የ ፊደል ገበታ አቀራረብ"
687msgstr "የ ፊደል ገበታ አቀራረብ"
605
688
606−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
689+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
607−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
608−#: qml/Wizard/Pages/sim.qml:101
690+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
609msgid "Skip"
691msgid "Skip"
610msgstr "መዝለያ"
692msgstr "መዝለያ"
611
693
612−#: qml/Wizard/Pages/30-wifi.qml:31
694+#: qml/Wizard/Pages/30-wifi.qml:30
613msgid "Connect to Wi‑Fi"
695msgid "Connect to Wi‑Fi"
614msgstr "ወደ ዋይ‑ፋይ መገናኛ"
696msgstr "ወደ ዋይ‑ፋይ መገናኛ"
615
697
616−#: qml/Wizard/Pages/30-wifi.qml:139
698+#: qml/Wizard/Pages/30-wifi.qml:131
617msgid "Connected"
699msgid "Connected"
618msgstr "ተገናኝቷል"
700msgstr "ተገናኝቷል"
619
701
620−#: qml/Wizard/Pages/30-wifi.qml:172
702+#: qml/Wizard/Pages/30-wifi.qml:164
621msgid "Available Wi-Fi networks"
703msgid "Available Wi-Fi networks"
622msgstr "ዝግጁ የ ዋይ-ፋይ ኔትዎርኮች"
704msgstr "ዝግጁ የ ዋይ-ፋይ ኔትዎርኮች"
623
705
624−#: qml/Wizard/Pages/30-wifi.qml:173
706+#: qml/Wizard/Pages/30-wifi.qml:165
625msgid "No available Wi-Fi networks"
707msgid "No available Wi-Fi networks"
626msgstr "ምንም ዝግጁ ዋይ-ፋይ ኔትዎርኮች አልተገኙም"
708msgstr "ምንም ዝግጁ ዋይ-ፋይ ኔትዎርኮች አልተገኙም"
627
709
710+#: qml/Wizard/Pages/40-location.qml:27
711+msgid "Location Services"
712+msgstr "የ አካባቢ ግልጋሎት"
713+
714+#: qml/Wizard/Pages/40-location.qml:83
715+msgid ""
716+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
717+"(recommended)"
718+msgstr "ይጠቀሙ ጂፒኤስ: ዋይ-ፋይ: hotspots እና ተንቀሳቃሽ ኔትዎርክ ሳይታወቁ አካባቢ ለማግኘት (ይመከራሉ)"
719+
720+#: qml/Wizard/Pages/40-location.qml:105
721+#, qt-format
722+msgid "By selecting this option you agree to the Nokia HERE %1."
723+msgstr "ይህን ምርጫ በ መምረጥ እርስዎ ተስማምተዋል ከ Nokia HERE %1."
724+
725+#: qml/Wizard/Pages/40-location.qml:106
726+msgctxt "part of: Nokia HERE terms and conditions"
727+msgid "terms and conditions"
728+msgstr "ስምምነት እና ሁኔታዎች"
729+
730+#: qml/Wizard/Pages/40-location.qml:160
731+msgid "GPS only"
732+msgstr "ጂፒኤስ ብቻ"
733+
734+#: qml/Wizard/Pages/40-location.qml:214
735+msgid "Don't use my location"
736+msgstr "የ እኔን አካባቢ አትጠቀም"
737+
738+#: qml/Wizard/Pages/40-location.qml:260
739+msgid "You can change it later in System Settings."
740+msgstr "እርስዎ በኋላ በ ስርአት ማሰናጃ ውስጥ መቀየር ይችላሉ"
741+
628#: qml/Wizard/Pages/50-timezone.qml:30
742#: qml/Wizard/Pages/50-timezone.qml:30
629msgid "Time Zone"
743msgid "Time Zone"
630msgstr "የ ሰአት ክልል"
744msgstr "የ ሰአት ክልል"
631
745
632−#: qml/Wizard/Pages/50-timezone.qml:183
746+#: qml/Wizard/Pages/50-timezone.qml:182
633msgid "Enter your city"
747msgid "Enter your city"
634msgstr "የ እርስዎን ከተማ ያስገቡ"
748msgstr "የ እርስዎን ከተማ ያስገቡ"
635
749
@@ -637,7 +751,7 @@ msgstr "የ እርስዎን ከተማ ያስገቡ"
637msgid "Personalize Your Device"
751msgid "Personalize Your Device"
638msgstr "የ እርስዎን አካል የ ግልዎ ያድርጉ"
752msgstr "የ እርስዎን አካል የ ግልዎ ያድርጉ"
639
753
640−#: qml/Wizard/Pages/60-account.qml:54
754+#: qml/Wizard/Pages/60-account.qml:48
641msgid "Preferred Name"
755msgid "Preferred Name"
642msgstr "የመረጡት ስም"
756msgstr "የመረጡት ስም"
643
757
@@ -645,75 +759,83 @@ msgstr "የመረጡት ስም"
645msgid "Lock Screen"
759msgid "Lock Screen"
646msgstr "መመልከቻውን መቆለፊያ"
760msgstr "መመልከቻውን መቆለፊያ"
647
761
648−#: qml/Wizard/Pages/70-passwd-type.qml:103
762+#: qml/Wizard/Pages/70-passwd-type.qml:102
649msgctxt "Label: Type of security method"
763msgctxt "Label: Type of security method"
650msgid "Create new password"
764msgid "Create new password"
651msgstr "አዲስ የ መግቢያ ቃል መፍጠሪያ"
765msgstr "አዲስ የ መግቢያ ቃል መፍጠሪያ"
652
766
653−#: qml/Wizard/Pages/70-passwd-type.qml:105
767+#: qml/Wizard/Pages/70-passwd-type.qml:104
654msgctxt "Label: Type of security method"
768msgctxt "Label: Type of security method"
655msgid "Create passcode (numbers only)"
769msgid "Create passcode (numbers only)"
656msgstr "አዲስ የ ማለፊያ ኮድ መፍጠሪያ (ቁጥር ብቻ)"
770msgstr "አዲስ የ ማለፊያ ኮድ መፍጠሪያ (ቁጥር ብቻ)"
657
771
658−#: qml/Wizard/Pages/70-passwd-type.qml:107
772+#: qml/Wizard/Pages/70-passwd-type.qml:106
659msgctxt "Label: Type of security method"
773msgctxt "Label: Type of security method"
660msgid "No lock code"
774msgid "No lock code"
661msgstr "ምንም መቆለፊያ ኮድ አልተገኘም"
775msgstr "ምንም መቆለፊያ ኮድ አልተገኘም"
662
776
663−#: qml/Wizard/Pages/79-system-update.qml:28
777+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
664−msgid "Update Device"
778+msgid "Privacy Policy"
665−msgstr "አካሉን ማሻሻያ"
779+msgstr "የ ግላዊነት መመሪያ"
666
780
667−#: qml/Wizard/Pages/79-system-update.qml:55
781+#: qml/Wizard/Pages/75-report-check.qml:26
668−msgid ""
782+msgid "Help Us Improve"
669−"There is a system update available and ready to install. Afterwards, the "
783+msgstr "እንድንሻሻል ይርዱን"
670−"device will automatically restart."
671−msgstr "የ ስርአት ማሻሻያ ዝግጁ ነው ለ መግጠም: ከዚያ በኋላ አካሉ ራሱ በራሱ እንደገና ይጀምራል"
672−
673−#: qml/Wizard/Pages/79-system-update.qml:76
674−#, fuzzy
675−#| msgctxt "string identifying name of the update"
676−#| msgid "Ubuntu system"
677−msgctxt "string identifying name of the update"
678−msgid "Ubuntu Touch system"
679−msgstr "የ ኡቡቱ ስርአት"
680−
681−#: qml/Wizard/Pages/79-system-update.qml:83
682−#, qt-format
683−msgctxt "version of the system update"
684−msgid "Version %1"
685−msgstr "እትም %1"
686
784
687−#: qml/Wizard/Pages/79-system-update.qml:95
785+#: qml/Wizard/Pages/75-report-check.qml:59
688−msgid "This could take a few minutes..."
786+msgid "Improve system performance by sending us crashes and error reports."
689−msgstr "ይህ ትንሽ ደቂቃዎች ይወስዳል..."
787+msgstr "የ ስርአቱን አፈጻጸም ለማሻሻል የ ግጭት እና የ ስህተት መልእክቶች ይላኩልን"
690
788
691−#: qml/Wizard/Pages/79-system-update.qml:109
789+#: qml/Wizard/Pages/75-report-check.qml:60
692−msgid "Install and restart now"
790+msgid "Privacy policy"
693−msgstr "መግጠሚያ እና እንደገና ማስጀመሪያ"
791+msgstr "የ ግላዊነት መመሪያ"
694
792
695−#: qml/Wizard/Pages/80-finished.qml:91
793+#: qml/Wizard/Pages/80-finished.qml:89
696−msgid "Welcome Back"
697−msgstr "እንኳን ደህና መጡ:"
698−
699−#: qml/Wizard/Pages/80-finished.qml:91
700msgid "Welcome to Ubuntu"
794msgid "Welcome to Ubuntu"
701msgstr "እንኳን ደህና መጡ ወደ ኡቡንቱ"
795msgstr "እንኳን ደህና መጡ ወደ ኡቡንቱ"
702
796
703−#: qml/Wizard/Pages/80-finished.qml:106
797+#: qml/Wizard/Pages/80-finished.qml:104
704msgid "You are ready to use your device now"
798msgid "You are ready to use your device now"
705msgstr "የ እርስዎን አካል ለ መጠቀም አሁን ዝግጁ ነው"
799msgstr "የ እርስዎን አካል ለ መጠቀም አሁን ዝግጁ ነው"
706
800
707−#: qml/Wizard/Pages/80-finished.qml:126
801+#: qml/Wizard/Pages/80-finished.qml:124
708−msgid "Continue"
709−msgstr "ይቀጥሉ"
710−
711−#: qml/Wizard/Pages/80-finished.qml:126
712msgid "Get Started"
802msgid "Get Started"
713msgstr "እንጀምር"
803msgstr "እንጀምር"
714
804
805+#: qml/Wizard/Pages/here-terms.qml:25
806+msgid "Terms & Conditions"
807+msgstr "ውሎች & ሁኔታዎች"
808+
809+#: qml/Wizard/Pages/here-terms.qml:69
810+msgid "Your device uses positioning technologies provided by HERE."
811+msgstr "የ እርስዎ አካል ይጠቀማል ያሉበትን አካባቢ ቴክኖሎጂ የቀረበውን በ HERE."
812+
813+#: qml/Wizard/Pages/here-terms.qml:81
814+msgid ""
815+"To provide you with positioning services and to improve their quality, HERE "
816+"collects information about nearby cell towers and Wi-Fi hotspots around your "
817+"current location whenever your position is being found."
818+msgstr ""
819+"እርስዎ ያሉበትን አካባቢ ግልጋሎት ለ መስጠት እና ለማሻሻል: HERE መረጃ ይሰበስባል በቅርብ ያሉ የ ሴል ምሶሶዎች እና "
820+"ዋይ-ፋይ hotspots እርስዎ አሁን ያሉበትን አካባቢ ሲታወቅ"
821+
822+#: qml/Wizard/Pages/here-terms.qml:93
823+msgid ""
824+"The information collected is used to analyze the service and to improve the "
825+"use of service, but not to identify you personally."
826+msgstr "የ ተሰበሰበው መረጃ የሚጠቅመው ግልጋሎት ለማሻሻል ነው: ነገር ግን እርስዎን በ ግል ለ መለየት አይደለም"
827+
828+#: qml/Wizard/Pages/here-terms.qml:106
829+#, qt-format
830+msgid "By continuing, you agree to the HERE platform %1 and %2."
831+msgstr "በ መቀጠል እርስዎ ተስማምተዋል ከ HERE platform %1 እና %2."
832+
833+#: qml/Wizard/Pages/here-terms.qml:107
834+msgid "Service Terms"
835+msgstr "የ ግልጋሎት ስምምነቶች"
836+
715#: qml/Wizard/Pages/passcode-confirm.qml:43
837#: qml/Wizard/Pages/passcode-confirm.qml:43
716−#: qml/Wizard/Pages/passcode-desktop.qml:104
838+#: qml/Wizard/Pages/passcode-desktop.qml:97
717msgid "Confirm passcode"
839msgid "Confirm passcode"
718msgstr "የማለፊያ ኮድ ማረጋገጫ"
840msgstr "የማለፊያ ኮድ ማረጋገጫ"
719
841
@@ -730,24 +852,24 @@ msgstr "እባክዎን እንደገና-ያስገቡ"
730msgid "Lock Screen Passcode"
852msgid "Lock Screen Passcode"
731msgstr "የ መመልከቻው መቆለፊያ የ ማለፊያ ኮድ"
853msgstr "የ መመልከቻው መቆለፊያ የ ማለፊያ ኮድ"
732
854
733−#: qml/Wizard/Pages/passcode-desktop.qml:68
855+#: qml/Wizard/Pages/passcode-desktop.qml:61
734msgid "Enter 4 numbers to setup your passcode"
856msgid "Enter 4 numbers to setup your passcode"
735msgstr "ያስገቡ 4 ቁጥሮች የ እርስዎን የ ማለፊያ ኮድ ለማሰናዳት"
857msgstr "ያስገቡ 4 ቁጥሮች የ እርስዎን የ ማለፊያ ኮድ ለማሰናዳት"
736
858
737−#: qml/Wizard/Pages/passcode-desktop.qml:84
859+#: qml/Wizard/Pages/passcode-desktop.qml:77
738#: qml/Wizard/Pages/passcode-set.qml:54
860#: qml/Wizard/Pages/passcode-set.qml:54
739msgid "Choose passcode"
861msgid "Choose passcode"
740msgstr "የ ማለፊያ ኮድ ይምረጡ"
862msgstr "የ ማለፊያ ኮድ ይምረጡ"
741
863
742−#: qml/Wizard/Pages/passcode-desktop.qml:139
864+#: qml/Wizard/Pages/passcode-desktop.qml:127
743msgid "Passcode too short"
865msgid "Passcode too short"
744msgstr "የ ማለፊያ ኮዱ በጣም አጭር ነው"
866msgstr "የ ማለፊያ ኮዱ በጣም አጭር ነው"
745
867
746−#: qml/Wizard/Pages/passcode-desktop.qml:141
868+#: qml/Wizard/Pages/passcode-desktop.qml:129
747msgid "Passcodes match"
869msgid "Passcodes match"
748msgstr "የ ማለፊያ ኮዶቹ ተመሳሳይ ናቸው"
870msgstr "የ ማለፊያ ኮዶቹ ተመሳሳይ ናቸው"
749
871
750−#: qml/Wizard/Pages/passcode-desktop.qml:143
872+#: qml/Wizard/Pages/passcode-desktop.qml:131
751msgid "Passcodes do not match"
873msgid "Passcodes do not match"
752msgstr "የ ማለፊያ ኮዶቹ አይመሳሰሉም"
874msgstr "የ ማለፊያ ኮዶቹ አይመሳሰሉም"
753
875
@@ -759,15 +881,15 @@ msgstr "የ ማለፊያ ኮድ 4 ባህሪዎች መሆን አለበት"
759msgid "Lock Screen Password"
881msgid "Lock Screen Password"
760msgstr "የ መመልከቻ መቆለፊያ የ መግቢያ ቃል"
882msgstr "የ መመልከቻ መቆለፊያ የ መግቢያ ቃል"
761
883
762−#: qml/Wizard/Pages/password-set.qml:68
884+#: qml/Wizard/Pages/password-set.qml:62
763msgid "Enter at least 8 characters"
885msgid "Enter at least 8 characters"
764msgstr "ያስገቡ ቢያንስ 8 ባህሪዎች"
886msgstr "ያስገቡ ቢያንስ 8 ባህሪዎች"
765
887
766−#: qml/Wizard/Pages/password-set.qml:80
888+#: qml/Wizard/Pages/password-set.qml:74
767msgid "Choose password"
889msgid "Choose password"
768msgstr "የ መግቢያ ቃል ይምረጡ"
890msgstr "የ መግቢያ ቃል ይምረጡ"
769
891
770−#: qml/Wizard/Pages/password-set.qml:110
892+#: qml/Wizard/Pages/password-set.qml:104
771msgid "Confirm password"
893msgid "Confirm password"
772msgstr "የ መግቢያ ቃሉን ያረጋግጡ"
894msgstr "የ መግቢያ ቃሉን ያረጋግጡ"
773
895
@@ -823,217 +945,6 @@ msgstr "ደካማ የ መግቢያ ቃል"
823msgid "Very weak password"
945msgid "Very weak password"
824msgstr "በጣም ደካማ የ መግቢያ ቃል"
946msgstr "በጣም ደካማ የ መግቢያ ቃል"
825
947
826−#~ msgid "Unity 8"
827−#~ msgstr "Unity 8"
828−
829−#~ msgid "Scopes"
830−#~ msgstr "ክልል"
831−
832−#~ msgid "Super (Tap)"
833−#~ msgstr "Super (Tap)"
834−
835−#~ msgid "Opens the Scopes home."
836−#~ msgstr "የ ክልል ቤት መክፈቻ"
837−
838−#~ msgctxt "Button: Open the Ubuntu Store"
839−#~ msgid "Store"
840−#~ msgstr "ማስቀመጫ"
841−
842−#~ msgctxt "Button: Start a search in the current dash scope"
843−#~ msgid "Search"
844−#~ msgstr "መፈለጊያ"
845−
846−#~ msgctxt "Button: Show the current dash scope settings"
847−#~ msgid "Settings"
848−#~ msgstr "ማሰናጃዎች"
849−
850−#~ msgid "Remove from Favorites"
851−#~ msgstr "ከምወዳቸው ማስወገጃ"
852−
853−#~ msgid "Add to Favorites"
854−#~ msgstr "ወደምወዳቸው መጨመሪያ"
855−
856−#~ msgid "Refine your results"
857−#~ msgstr "የ እርስዎን ውጤቶች እንደገና ማጣሪያ"
858−
859−#~ msgid "Reset"
860−#~ msgstr "እንደ ነበረ መመለሻ"
861−
862−#~ msgid "Show less"
863−#~ msgstr "ትንሽ ማሳያ"
864−
865−#~ msgid "Show all"
866−#~ msgstr "ሁሉንም ማሳያ"
867−
868−#~ msgctxt "Label: Hint for dash search line edit"
869−#~ msgid "Search"
870−#~ msgstr "መፈለጊያ"
871−
872−#~ msgid "Recent Searches"
873−#~ msgstr "የ ቅርብ ጊዜ ፍለጋዎች"
874−
875−#~ msgid "Clear All"
876−#~ msgstr "ሁሉንም ማጽጃ"
877−
878−#~ msgid "More..."
879−#~ msgstr "ተጨማሪ..."
880−
881−#~ msgid "Less..."
882−#~ msgstr "አነስተኛ..."
883−
884−#~ msgid "Send"
885−#~ msgstr "መላኪያ"
886−
887−#~ msgid "Rate this"
888−#~ msgstr "ለዚህ ደረጃ ይስጡ"
889−
890−#~ msgid "Add a review"
891−#~ msgstr "ግምገማ መጨመሪያ"
892−
893−#~ msgid "Enable location data"
894−#~ msgstr "የአካባቢ ዳታ ማስቻያ"
895−
896−#~ msgid "Manage"
897−#~ msgstr "አስተዳዳሪ"
898−
899−#~ msgid "Home"
900−#~ msgstr "ቤት"
901−
902−#~ msgid "Also installed"
903−#~ msgstr "እንዲሁም የተገጠሙ"
904−
905−#~ msgid "Privacy Policy"
906−#~ msgstr "የ ግላዊነት መመሪያ"
907−
908−#~ msgid "Help Us Improve"
909−#~ msgstr "እንድንሻሻል ይርዱን"
910−
911−#~ msgid "Improve system performance by sending us crashes and error reports."
912−#~ msgstr "የ ስርአቱን አፈጻጸም ለማሻሻል የ ግጭት እና የ ስህተት መልእክቶች ይላኩልን"
913−
914−#~ msgid "Privacy policy"
915−#~ msgstr "የ ግላዊነት መመሪያ"
916−
917−#~ msgid "Update Apps"
918−#~ msgstr "መተግበሪያ ማሻሻያ"
919−
920−#~ msgid "This device is not connected to the internet."
921−#~ msgstr "ይህ አካል ከ ኢንተርኔት ጋር አልተገናኘም:"
922−
923−#~ msgid "Software is up to date"
924−#~ msgstr "ሶፍትዌሩ ዘመናዊ ነው:"
925−
926−#~ msgid "The update server is not responding."
927−#~ msgstr "የ ማሻሻያ ሰርቨር አይመልስም:"
928−
929−#~ msgid "Please wait..."
930−#~ msgstr "እባክዎን ይቆዩ..."
931−
932−#~ msgid "Installation failed"
933−#~ msgstr "መግጠሙ አልተሳካም:"
934−
935−#~ msgid "Checking for updates…"
936−#~ msgstr "ማሻሻያ በ መፈለግ ላይ…"
937−
938−#~ msgid "%1 update available"
939−#~ msgid_plural "%1 updates available"
940−#~ msgstr[0] "%1 ማሻሻያ ዝግጁ ነው:"
941−#~ msgstr[1] "%1 ማሻሻያዎች ዝግጁ ናቸው:"
942−
943−#~ msgid "Update all…"
944−#~ msgstr "ሁሉንም ማሻሻያ…"
945−
946−#~ msgid "Update all"
947−#~ msgstr "ሁሉንም ማሻሻያ"
948−
949−#~ msgid "Update"
950−#~ msgstr "ማሻሻያ"
951−
952−#~ msgid "Download"
953−#~ msgstr "የ ወረደ"
954−
955−#~ msgid "Resume"
956−#~ msgstr "ይቀጥሉ"
957−
958−#~ msgid "Install…"
959−#~ msgstr "መግጠሚያ…"
960−
961−#~ msgid "Install"
962−#~ msgstr "መግጠሚያ"
963−
964−#~ msgid "Open"
965−#~ msgstr "መክፈቻ"
966−
967−#~ msgid "Installing"
968−#~ msgstr "በ መግጠም ላይ"
969−
970−#~ msgid "Waiting to download"
971−#~ msgstr "ለ ማውረድ በ መጠበቅ ላይ"
972−
973−#~ msgid "%1 of %2"
974−#~ msgstr "%1 ከ %2"
975−
976−#~ msgid "Downloaded"
977−#~ msgstr "የ ወረደ"
978−
979−#~ msgid "Installed"
980−#~ msgstr "ተገጥሟል:"
981−
982−#~ msgid "Updated %1"
983−#~ msgstr "ተሻሽሏል %1"
984−
985−#~ msgid "Update failed"
986−#~ msgstr "ማሻሻል አልተቻለም:"
987−
988−#~ msgid "Location Services"
989−#~ msgstr "የ አካባቢ ግልጋሎት"
990−
991−#~ msgid ""
992−#~ "Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
993−#~ "(recommended)"
994−#~ msgstr "ይጠቀሙ ጂፒኤስ: ዋይ-ፋይ: hotspots እና ተንቀሳቃሽ ኔትዎርክ ሳይታወቁ አካባቢ ለማግኘት (ይመከራሉ)"
995−
996−#~ msgid "By selecting this option you agree to the Nokia HERE %1."
997−#~ msgstr "ይህን ምርጫ በ መምረጥ እርስዎ ተስማምተዋል ከ Nokia HERE %1."
998−
999−#~ msgctxt "part of: Nokia HERE terms and conditions"
1000−#~ msgid "terms and conditions"
1001−#~ msgstr "ስምምነት እና ሁኔታዎች"
1002−
1003−#~ msgid "GPS only"
1004−#~ msgstr "ጂፒኤስ ብቻ"
1005−
1006−#~ msgid "Don't use my location"
1007−#~ msgstr "የ እኔን አካባቢ አትጠቀም"
1008−
1009−#~ msgid "You can change it later in System Settings."
1010−#~ msgstr "እርስዎ በኋላ በ ስርአት ማሰናጃ ውስጥ መቀየር ይችላሉ"
1011−
1012−#~ msgid "Terms & Conditions"
1013−#~ msgstr "ውሎች & ሁኔታዎች"
1014−
1015−#~ msgid "Your device uses positioning technologies provided by HERE."
1016−#~ msgstr "የ እርስዎ አካል ይጠቀማል ያሉበትን አካባቢ ቴክኖሎጂ የቀረበውን በ HERE."
1017−
1018−#~ msgid ""
1019−#~ "To provide you with positioning services and to improve their quality, "
1020−#~ "HERE collects information about nearby cell towers and Wi-Fi hotspots "
1021−#~ "around your current location whenever your position is being found."
1022−#~ msgstr ""
1023−#~ "እርስዎ ያሉበትን አካባቢ ግልጋሎት ለ መስጠት እና ለማሻሻል: HERE መረጃ ይሰበስባል በቅርብ ያሉ የ ሴል ምሶሶዎች "
1024−#~ "እና ዋይ-ፋይ hotspots እርስዎ አሁን ያሉበትን አካባቢ ሲታወቅ"
1025−
1026−#~ msgid ""
1027−#~ "The information collected is used to analyze the service and to improve "
1028−#~ "the use of service, but not to identify you personally."
1029−#~ msgstr "የ ተሰበሰበው መረጃ የሚጠቅመው ግልጋሎት ለማሻሻል ነው: ነገር ግን እርስዎን በ ግል ለ መለየት አይደለም"
1030−
1031−#~ msgid "By continuing, you agree to the HERE platform %1 and %2."
1032−#~ msgstr "በ መቀጠል እርስዎ ተስማምተዋል ከ HERE platform %1 እና %2."
1033−
1034−#~ msgid "Service Terms"
1035−#~ msgstr "የ ግልጋሎት ስምምነቶች"
1036−
1037#~ msgid "Top edge"
948#~ msgid "Top edge"
1038#~ msgstr "የላይ ጠርዝ"
949#~ msgstr "የላይ ጠርዝ"
1039
950
@@ -1049,12 +960,21 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1049#~ msgid "Type or say a command"
960#~ msgid "Type or say a command"
1050#~ msgstr "ትእዛዝ ይናገሩ ወይንም ይጻፉ"
961#~ msgstr "ትእዛዝ ይናገሩ ወይንም ይጻፉ"
1051
962
963+#~ msgid "Loading. Please Wait..."
964+#~ msgstr "እባክዎን ይቆዩ በመጫን ላይ..."
965+
966+#~ msgid "Speaking..."
967+#~ msgstr "በመናገር ላይ..."
968+
1052#~ msgid "Speak Now..."
969#~ msgid "Speak Now..."
1053#~ msgstr "አሁን ይናገሩ..."
970#~ msgstr "አሁን ይናገሩ..."
1054
971
1055#~ msgid "Confirm"
972#~ msgid "Confirm"
1056#~ msgstr "ማረጋገጫ"
973#~ msgstr "ማረጋገጫ"
1057
974
975+#~ msgid "Search"
976+#~ msgstr "መፈለጊያ"
977+
1058#~ msgid "See less"
978#~ msgid "See less"
1059#~ msgstr "አነስተኛ መመልከቻ"
979#~ msgstr "አነስተኛ መመልከቻ"
1060
980
@@ -1097,6 +1017,7 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1097#~ msgid "This will be your last attempt."
1017#~ msgid "This will be your last attempt."
1098#~ msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
1018#~ msgstr "ይህ የመጨረሻ ሙከራዎ ነው"
1099
1019
1020+#, qt-format
1100#~ msgid "Sorry, incorrect %1"
1021#~ msgid "Sorry, incorrect %1"
1101#~ msgstr "አዝናለሁ: የተሳሳተ%1"
1022#~ msgstr "አዝናለሁ: የተሳሳተ%1"
1102
1023
@@ -1137,12 +1058,11 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1137#~ "You have now mastered the edge gestures and can start using the "
1058#~ "You have now mastered the edge gestures and can start using the "
1138#~ "phone<br><br>Tap on the screen to start"
1059#~ "phone<br><br>Tap on the screen to start"
1139#~ msgstr ""
1060#~ msgstr ""
1140−#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ "
1061+#~ "አሁን የ ጠርዝ እንቅስቃሴን አውቀዋል እና መጀመር ይችላሉ ስልኩን መጠቀም <br><br>መመልከቻውን መታ ያድርጉ ለመጀመር"
1141−#~ "ለመጀመር"
1142
1062
1143#~ msgid ""
1063#~ msgid ""
1144−#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1064+#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1145−#~ "reset and all personal data will be deleted."
1065+#~ "and all personal data will be deleted."
1146#~ msgstr ""
1066#~ msgstr ""
1147#~ "የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
1067#~ "የተሳሳተ የማለፊያ ኮድ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
1148#~ "ይጠፋል"
1068#~ "ይጠፋል"
@@ -1151,8 +1071,8 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1151#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1071#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1152#~ "reset and all personal data will be deleted."
1072#~ "reset and all personal data will be deleted."
1153#~ msgstr ""
1073#~ msgstr ""
1154−#~ "የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ "
1074+#~ "የተሳሳተ የማለፊያ ሐረግ ካስገቡ የ እርስዎ ስልክ ወደ ነበረበት ወደ ፋክቶሪው ዘዴ ይመለሳል: እና የ ግል ዳታ በሙሉ "
1155−#~ "በሙሉ ይጠፋል"
1075+#~ "ይጠፋል"
1156
1076
1157#~ msgid "Roaming"
1077#~ msgid "Roaming"
1158#~ msgstr "ማዘዋወሪያ"
1078#~ msgstr "ማዘዋወሪያ"
@@ -1160,12 +1080,19 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1160#~ msgid "Manage Scopes"
1080#~ msgid "Manage Scopes"
1161#~ msgstr "የ ክልል አስተዳዳሪ"
1081#~ msgstr "የ ክልል አስተዳዳሪ"
1162
1082
1083+#, qt-format
1163#~ msgid "Enter %1"
1084#~ msgid "Enter %1"
1164#~ msgstr "ማስገቢያ %1"
1085#~ msgstr "ማስገቢያ %1"
1165
1086
1166#~ msgid "Please re-enter"
1087#~ msgid "Please re-enter"
1167#~ msgstr "እባክዎን እንደገና-ያስገቡ"
1088#~ msgstr "እባክዎን እንደገና-ያስገቡ"
1168
1089
1090+#~ msgid "Enter passphrase"
1091+#~ msgstr "የ ማለፊያ ሀረግ ያስገቡ"
1092+
1093+#~ msgid "Enter passcode"
1094+#~ msgstr "የ ማለፊያ ኮድ ያስገቡ"
1095+
1169#~ msgid "Lock security"
1096#~ msgid "Lock security"
1170#~ msgstr "ደህንነት መቆለፊያ"
1097#~ msgstr "ደህንነት መቆለፊያ"
1171
1098
@@ -1188,8 +1115,7 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1188#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
1115#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
1189#~ "Privacy</b>"
1116#~ "Privacy</b>"
1190#~ msgstr ""
1117#~ msgstr ""
1191−#~ "ይህን ግልጋሎት ማሰናከል ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b> under <b>Security &amp; "
1118+#~ "ይህን ግልጋሎት ማሰናከል ይችላሉ ከ <b>ስርአት ማሰናጃዎች</b> under <b>Security &amp; Privacy</b>"
1192−#~ "Privacy</b>"
1193
1119
1194#~ msgid "Nice work!"
1120#~ msgid "Nice work!"
1195#~ msgstr "ጥሩ ሰርተዋል!"
1121#~ msgstr "ጥሩ ሰርተዋል!"
@@ -1224,6 +1150,9 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1224#~ msgid "Let’s get started."
1150#~ msgid "Let’s get started."
1225#~ msgstr "ስራ እንጀምር"
1151#~ msgstr "ስራ እንጀምር"
1226
1152
1153+#~ msgid "Continue"
1154+#~ msgstr "ይቀጥሉ"
1155+
1227#~ msgid "Passphrase must be 4 characters long"
1156#~ msgid "Passphrase must be 4 characters long"
1228#~ msgstr "የ ማለፊያ ሀረግ ቢያንስ 4 ባህሪዎች መሆን አለበት"
1157#~ msgstr "የ ማለፊያ ሀረግ ቢያንስ 4 ባህሪዎች መሆን አለበት"
1229
1158
@@ -1233,9 +1162,11 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1233#~ msgid "Let the phone detect your location:"
1162#~ msgid "Let the phone detect your location:"
1234#~ msgstr "እባክዎን እርስዎ ያሉበትን አካባቢ ስልኩ እራሱ ይፈልግ:"
1163#~ msgstr "እባክዎን እርስዎ ያሉበትን አካባቢ ስልኩ እራሱ ይፈልግ:"
1235
1164
1165+#, qt-format
1236#~ msgid "〈 %1"
1166#~ msgid "〈 %1"
1237#~ msgstr "〈 %1"
1167#~ msgstr "〈 %1"
1238
1168
1169+#, qt-format
1239#~ msgid "%1 〉"
1170#~ msgid "%1 〉"
1240#~ msgstr "%1 〉"
1171#~ msgstr "%1 〉"
1241
1172
@@ -1252,12 +1183,12 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1252#~ "Your phone is set up to automatically report errors to Canonical and its "
1183#~ "Your phone is set up to automatically report errors to Canonical and its "
1253#~ "partners, the makers of the operating system."
1184#~ "partners, the makers of the operating system."
1254#~ msgstr ""
1185#~ msgstr ""
1255−#~ "የ እርስዎ ስልክ ራሱ በራሱ የ ስህተት መግለጫዎች ወደ Canonical and its partners, የ መስሪያ "
1186+#~ "የ እርስዎ ስልክ ራሱ በራሱ የ ስህተት መግለጫዎች ወደ Canonical and its partners, የ መስሪያ ስርአት "
1256−#~ "ስርአት አምራቾች"
1187+#~ "አምራቾች"
1257
1188
1258#~ msgid ""
1189#~ msgid ""
1259−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1190+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1260−#~ "and conditions</a>."
1191+#~ "conditions</a>."
1261#~ msgstr "ይህን ምርጫ በመምረጥ ተስማምቻለሁ ከ Nokia HERE <a href='#'>ውሎች እና ሁኔታዎች ጋር</a>."
1192#~ msgstr "ይህን ምርጫ በመምረጥ ተስማምቻለሁ ከ Nokia HERE <a href='#'>ውሎች እና ሁኔታዎች ጋር</a>."
1262
1193
1263#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1194#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
@@ -1272,6 +1203,9 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1272#~ msgid "Short swipe from the left edge."
1203#~ msgid "Short swipe from the left edge."
1273#~ msgstr "ከ ግራ ጠርዝ በኩል በትንሹ ይጥረጉ"
1204#~ msgstr "ከ ግራ ጠርዝ በኩል በትንሹ ይጥረጉ"
1274
1205
1206+#~ msgid "Open the launcher"
1207+#~ msgstr "ማስጀመሪያውን መክፈቻ"
1208+
1275#~ msgid "Tap here to continue."
1209#~ msgid "Tap here to continue."
1276#~ msgstr "እዚህ መታ ይድርጉ ለመቀጠል"
1210#~ msgstr "እዚህ መታ ይድርጉ ለመቀጠል"
1277
1211
@@ -1399,8 +1333,40 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1399#~ msgid "Short or long swipe from the right edge to view your open apps"
1333#~ msgid "Short or long swipe from the right edge to view your open apps"
1400#~ msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
1334#~ msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
1401
1335
1336+#~ msgid "Long swipe from the left edge to open the Today scope"
1337+#~ msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
1338+
1402#~ msgid "Swipe from the left edge to open the launcher"
1339#~ msgid "Swipe from the left edge to open the launcher"
1403#~ msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
1340#~ msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
1404
1341
1405#~ msgid "Hover your mouse on the right edge to view your open apps"
1342#~ msgid "Hover your mouse on the right edge to view your open apps"
1406#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
1343#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
1344+
1345+#~ msgid "Takes a screenshot of a window."
1346+#~ msgstr "የ መስኮት መመልከቻ ፎቶ ማንሻ"
1347+
1348+#~ msgid "Super + 0 to 9"
1349+#~ msgstr "Super + 0 እስከ 9"
1350+
1351+#~ msgid "Install and restart now"
1352+#~ msgstr "መግጠሚያ እና እንደገና ማስጀመሪያ"
1353+
1354+#~ msgid "This could take a few minutes..."
1355+#~ msgstr "ይህ ትንሽ ደቂቆች ይወስዳል"
1356+
1357+#, qt-format
1358+#~ msgctxt "version of the system update"
1359+#~ msgid "Version %1"
1360+#~ msgstr "እትም %1"
1361+
1362+#~ msgctxt "string identifying name of the update"
1363+#~ msgid "Ubuntu system"
1364+#~ msgstr "የ ኡቡቱ ስርአት"
1365+
1366+#~ msgid "Update Device"
1367+#~ msgstr "አካሉን ማሻሻያ"
1368+
1369+#~ msgid ""
1370+#~ "There is a system update available and ready to install. Afterwards, the "
1371+#~ "device will automatically restart."
1372+#~ msgstr "የ ስርአት ማሻሻያ ዝግጁ ነው ለ መግጠም: ከዚያ በኋላ አካሉ ራሱ በራሱ እንደገና ይጀምራል"
po/ar.po+431−405
@@ -6,74 +6,72 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: \n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2021-01-29 11:42-0600\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2021-10-12 07:49+0000\n"
11+"PO-Revision-Date: 2017-01-14 05:20+0000\n"
12−"Last-Translator: HEROBRINE7GAMER <tapermeerkat77@gmail.com>\n"
12+"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13−"Language-Team: Arabic <https://translate.ubports.com/projects/ubports/lomiri/"
13+"Language-Team: Arabic <ar@li.org>\n"
14−"ar/>\n"
15−"Language: ar\n"
16"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
19−"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
17+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
20−"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
18+"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
21−"X-Generator: Weblate 3.11.3\n"
22−"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
19+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20+"X-Generator: Launchpad (build 18343)\n"
23
21
24−#: plugins/LightDM/Greeter.cpp:199
22+#: plugins/LightDM/Greeter.cpp:188
25msgid "Password: "
23msgid "Password: "
26msgstr "كلمة السر: "
24msgstr "كلمة السر: "
27
25
28−#: plugins/LightDM/Greeter.cpp:214
26+#: plugins/LightDM/Greeter.cpp:203
29msgid "Username"
27msgid "Username"
30−msgstr "اسم المستخدم"
28+msgstr ""
31
29
32−#: plugins/LightDM/Greeter.cpp:258
30+#: plugins/LightDM/Greeter.cpp:242
33msgid "Failed to authenticate"
31msgid "Failed to authenticate"
34−msgstr "فشل التحقق"
32+msgstr ""
35
33
36−#: plugins/LightDM/Greeter.cpp:260
34+#: plugins/LightDM/Greeter.cpp:244
37msgid "Invalid password, please try again"
35msgid "Invalid password, please try again"
38−msgstr "كلمة المرور غير صحيحة، الرجاء المحاولة مرة أخرى"
36+msgstr ""
39
37
40−#: plugins/LightDM/Greeter.cpp:270
38+#: plugins/LightDM/Greeter.cpp:254
41msgid "Log In"
39msgid "Log In"
42−msgstr "سجل الدخول"
40+msgstr ""
43
41
44−#: plugins/LightDM/Greeter.cpp:270
42+#: plugins/LightDM/Greeter.cpp:254
45msgid "Retry"
43msgid "Retry"
46−msgstr "حاول مجدداً"
44+msgstr "إعادة المحاولة"
47
45
48#: plugins/LightDM/UsersModel.cpp:157
46#: plugins/LightDM/UsersModel.cpp:157
49msgid "Login"
47msgid "Login"
50−msgstr "سجل الدخول"
48+msgstr ""
51
49
52#: plugins/LightDM/UsersModel.cpp:165
50#: plugins/LightDM/UsersModel.cpp:165
53msgid "Guest Session"
51msgid "Guest Session"
54−msgstr "جلسة ضيف"
52+msgstr ""
55
53
56−#: plugins/Unity/Launcher/launcheritem.cpp:48
54+#: plugins/Unity/Launcher/launcheritem.cpp:49
57−#: plugins/Unity/Launcher/launcheritem.cpp:122
55+#: plugins/Unity/Launcher/launcheritem.cpp:123
58msgid "Pin shortcut"
56msgid "Pin shortcut"
59−msgstr "ثبت اختصارًا"
57+msgstr "تثبيت الاختصار"
60
58
61−#: plugins/Unity/Launcher/launcheritem.cpp:54
59+#: plugins/Unity/Launcher/launcheritem.cpp:55
62msgid "Quit"
60msgid "Quit"
63msgstr "خروج"
61msgstr "خروج"
64
62
65−#: plugins/Unity/Launcher/launcheritem.cpp:122
63+#: plugins/Unity/Launcher/launcheritem.cpp:123
66msgid "Unpin shortcut"
64msgid "Unpin shortcut"
67−msgstr "ألغ تثبيت الاختصار"
65+msgstr "إزالة تثبيت الاختصار"
68
66
69#: qml/Components/Dialogs.qml:176
67#: qml/Components/Dialogs.qml:176
70msgctxt "Title: Lock/Log out dialog"
68msgctxt "Title: Lock/Log out dialog"
71msgid "Log out"
69msgid "Log out"
72−msgstr "اخرج"
70+msgstr "خروج"
73
71
74#: qml/Components/Dialogs.qml:177
72#: qml/Components/Dialogs.qml:177
75msgid "Are you sure you want to log out?"
73msgid "Are you sure you want to log out?"
76−msgstr "أمتأكد أنك تريد تسجيل الخروج ؟"
74+msgstr "هل أنت متأكد من رغبتك في تسجيل الخروج؟"
77
75
78#: qml/Components/Dialogs.qml:180
76#: qml/Components/Dialogs.qml:180
79msgctxt "Button: Lock the system"
77msgctxt "Button: Lock the system"
@@ -83,22 +81,23 @@ msgstr "أوصِد"
83#: qml/Components/Dialogs.qml:191
81#: qml/Components/Dialogs.qml:191
84msgctxt "Button: Log out from the system"
82msgctxt "Button: Log out from the system"
85msgid "Log Out"
83msgid "Log Out"
86−msgstr "اخرج"
84+msgstr "خروج"
87
85
88−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
89−#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
88+#: qml/Wizard/Pages/passcode-confirm.qml:32
90#: qml/Wizard/Pages/passcode-set.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
91msgid "Cancel"
90msgid "Cancel"
92−msgstr "ألغ"
91+msgstr "إلغاء"
93
92
94#: qml/Components/Dialogs.qml:211
93#: qml/Components/Dialogs.qml:211
95msgctxt "Title: Reboot dialog"
94msgctxt "Title: Reboot dialog"
96msgid "Reboot"
95msgid "Reboot"
97−msgstr "أعد التشغيل"
96+msgstr "إعادة التشغيل"
98
97
99#: qml/Components/Dialogs.qml:212
98#: qml/Components/Dialogs.qml:212
100msgid "Are you sure you want to reboot?"
99msgid "Are you sure you want to reboot?"
101−msgstr "أمتأكد أنك تريد إعادة التشغيل؟"
100+msgstr "هل أنت متأكد من رغبتك في إعادة تشغيل الجهاز؟"
102
101
103#: qml/Components/Dialogs.qml:215
102#: qml/Components/Dialogs.qml:215
104msgid "No"
103msgid "No"
@@ -108,12 +107,12 @@ msgstr "لا"
108msgid "Yes"
107msgid "Yes"
109msgstr "نعم"
108msgstr "نعم"
110
109
111−#: qml/Components/Dialogs.qml:243
110+#: qml/Components/Dialogs.qml:239
112msgctxt "Title: Power off/Restart dialog"
111msgctxt "Title: Power off/Restart dialog"
113msgid "Power"
112msgid "Power"
114msgstr "الطاقة"
113msgstr "الطاقة"
115
114
116−#: qml/Components/Dialogs.qml:244
115+#: qml/Components/Dialogs.qml:240
117msgid ""
116msgid ""
118"Are you sure you would like\n"
117"Are you sure you would like\n"
119"to power off?"
118"to power off?"
@@ -121,27 +120,23 @@ msgstr ""
121"هل أنت متأكد من رغبتك\n"
120"هل أنت متأكد من رغبتك\n"
122"في إيقاف التشغيل؟"
121"في إيقاف التشغيل؟"
123
122
124−#: qml/Components/Dialogs.qml:248
123+#: qml/Components/Dialogs.qml:244
125msgctxt "Button: Power off the system"
124msgctxt "Button: Power off the system"
126msgid "Power off"
125msgid "Power off"
127−msgstr "أوقف التشغيل"
126+msgstr "إيقاف التشغيل"
128
127
129−#: qml/Components/Dialogs.qml:263
128+#: qml/Components/Dialogs.qml:255
130msgctxt "Button: Restart the system"
129msgctxt "Button: Restart the system"
131msgid "Restart"
130msgid "Restart"
132−msgstr "أعد التشغيل"
131+msgstr "إعادة التشغيل"
133−
134−#: qml/Components/Dialogs.qml:276
135−msgid "Screenshot"
136−msgstr "لقطة شاشة"
137
132
138#: qml/Components/KeyboardShortcutsOverlay.qml:41
133#: qml/Components/KeyboardShortcutsOverlay.qml:41
139msgid "Keyboard Shortcuts"
134msgid "Keyboard Shortcuts"
140msgstr "اختصارات لوحة المفاتيح"
135msgstr "اختصارات لوحة المفاتيح"
141
136
142#: qml/Components/KeyboardShortcutsOverlay.qml:55
137#: qml/Components/KeyboardShortcutsOverlay.qml:55
143−msgid "Lomiri"
138+msgid "Unity 8"
144−msgstr "لوميري"
139+msgstr "يونتي 8"
145
140
146#: qml/Components/KeyboardShortcutsOverlay.qml:62
141#: qml/Components/KeyboardShortcutsOverlay.qml:62
147msgid "PrtScr"
142msgid "PrtScr"
@@ -149,7 +144,7 @@ msgstr "PrtScr"
149
144
150#: qml/Components/KeyboardShortcutsOverlay.qml:67
145#: qml/Components/KeyboardShortcutsOverlay.qml:67
151msgid "Takes a screenshot."
146msgid "Takes a screenshot."
152−msgstr "خُذ لقطة للشاشة."
147+msgstr "أخذ لقطة للشاشة"
153
148
154#: qml/Components/KeyboardShortcutsOverlay.qml:75
149#: qml/Components/KeyboardShortcutsOverlay.qml:75
155msgid "Alt + PrtScr"
150msgid "Alt + PrtScr"
@@ -157,7 +152,7 @@ msgstr "Alt + PrtScr"
157
152
158#: qml/Components/KeyboardShortcutsOverlay.qml:80
153#: qml/Components/KeyboardShortcutsOverlay.qml:80
159msgid "Takes a screenshot of the current window."
154msgid "Takes a screenshot of the current window."
160−msgstr "خُذ لقطة شاشة للنافذة الحالية."
155+msgstr ""
161
156
162#: qml/Components/KeyboardShortcutsOverlay.qml:88
157#: qml/Components/KeyboardShortcutsOverlay.qml:88
163msgid "Super + Space"
158msgid "Super + Space"
@@ -165,7 +160,7 @@ msgstr "Super + Space"
165
160
166#: qml/Components/KeyboardShortcutsOverlay.qml:93
161#: qml/Components/KeyboardShortcutsOverlay.qml:93
167msgid "Switches to next keyboard layout."
162msgid "Switches to next keyboard layout."
168−msgstr "بدل إلى تخطيط لوحة المفاتيح التالي."
163+msgstr "للتحويل إلى مخطط لوحة المفاتيح التالي."
169
164
170#: qml/Components/KeyboardShortcutsOverlay.qml:101
165#: qml/Components/KeyboardShortcutsOverlay.qml:101
171msgid "Super + Shift + Space"
166msgid "Super + Shift + Space"
@@ -173,27 +168,27 @@ msgstr "Super + Shift + Space"
173
168
174#: qml/Components/KeyboardShortcutsOverlay.qml:106
169#: qml/Components/KeyboardShortcutsOverlay.qml:106
175msgid "Switches to previous keyboard layout."
170msgid "Switches to previous keyboard layout."
176−msgstr "بدل إلى تخطيط لوحة المفاتيح السابق."
171+msgstr "للتحويل إلى مخطط لوحة المفاتيح السابق."
177
172
178#: qml/Components/KeyboardShortcutsOverlay.qml:114
173#: qml/Components/KeyboardShortcutsOverlay.qml:114
179msgid "Ctrl + Alt + T"
174msgid "Ctrl + Alt + T"
180−msgstr "Ctrl + Alt + T"
175+msgstr ""
181
176
182#: qml/Components/KeyboardShortcutsOverlay.qml:119
177#: qml/Components/KeyboardShortcutsOverlay.qml:119
183msgid "Starts the Terminal application."
178msgid "Starts the Terminal application."
184−msgstr "شغِل الطرفية."
179+msgstr ""
185
180
186#: qml/Components/KeyboardShortcutsOverlay.qml:131
181#: qml/Components/KeyboardShortcutsOverlay.qml:131
187msgid "Launcher"
182msgid "Launcher"
188−msgstr "مطلق"
183+msgstr "شريط بدء التطبيقات"
189
184
190#: qml/Components/KeyboardShortcutsOverlay.qml:138
185#: qml/Components/KeyboardShortcutsOverlay.qml:138
191msgid "Super (Hold)"
186msgid "Super (Hold)"
192−msgstr "Super (ضغط مع التعليق)"
187+msgstr "Super (Hold)"
193
188
194#: qml/Components/KeyboardShortcutsOverlay.qml:143
189#: qml/Components/KeyboardShortcutsOverlay.qml:143
195msgid "Opens the launcher, displays shortcuts."
190msgid "Opens the launcher, displays shortcuts."
196−msgstr "يشغل المطلق، ويعرض الاختصارات."
191+msgstr "لفتح شريط بدء التطبيقات، وإظهار الاختصارات."
197
192
198#: qml/Components/KeyboardShortcutsOverlay.qml:151
193#: qml/Components/KeyboardShortcutsOverlay.qml:151
199msgid "Alt + F1"
194msgid "Alt + F1"
@@ -201,7 +196,7 @@ msgstr "Alt + F1"
201
196
202#: qml/Components/KeyboardShortcutsOverlay.qml:156
197#: qml/Components/KeyboardShortcutsOverlay.qml:156
203msgid "Opens launcher keyboard navigation mode."
198msgid "Opens launcher keyboard navigation mode."
204−msgstr "فتح وضع التنقل بلوحة المفاتيح المشغلة."
199+msgstr ""
205
200
206#: qml/Components/KeyboardShortcutsOverlay.qml:164
201#: qml/Components/KeyboardShortcutsOverlay.qml:164
207msgid "Super + Tab"
202msgid "Super + Tab"
@@ -209,15 +204,15 @@ msgstr "Super + Tab"
209
204
210#: qml/Components/KeyboardShortcutsOverlay.qml:169
205#: qml/Components/KeyboardShortcutsOverlay.qml:169
211msgid "Switches applications via the launcher."
206msgid "Switches applications via the launcher."
212−msgstr "انتقل بين التطبيقات عبر المُطلق."
207+msgstr "للتحويل بين التطبيقات عبر شريط بدء التطبيقات."
213
208
214#: qml/Components/KeyboardShortcutsOverlay.qml:177
209#: qml/Components/KeyboardShortcutsOverlay.qml:177
215msgid "Super + 1 to 0"
210msgid "Super + 1 to 0"
216−msgstr "Super + 1 to 0"
211+msgstr ""
217
212
218#: qml/Components/KeyboardShortcutsOverlay.qml:182
213#: qml/Components/KeyboardShortcutsOverlay.qml:182
219msgid "Same as clicking on a launcher icon."
214msgid "Same as clicking on a launcher icon."
220−msgstr "نفس تأثير النقر على أيقونة المطلق."
215+msgstr "نفس إجراء الضغط على أيقونة في الشريط."
221
216
222#: qml/Components/KeyboardShortcutsOverlay.qml:190
217#: qml/Components/KeyboardShortcutsOverlay.qml:190
223msgid "Super + A"
218msgid "Super + A"
@@ -225,11 +220,23 @@ msgstr "Super + A"
225
220
226#: qml/Components/KeyboardShortcutsOverlay.qml:195
221#: qml/Components/KeyboardShortcutsOverlay.qml:195
227msgid "Opens the Application Drawer."
222msgid "Opens the Application Drawer."
228−msgstr "يفتح درج التطبيقات."
223+msgstr ""
224+
225+#: qml/Components/KeyboardShortcutsOverlay.qml:207
226+msgid "Scopes"
227+msgstr ""
228+
229+#: qml/Components/KeyboardShortcutsOverlay.qml:214
230+msgid "Super (Tap)"
231+msgstr ""
232+
233+#: qml/Components/KeyboardShortcutsOverlay.qml:219
234+msgid "Opens the Scopes home."
235+msgstr ""
229
236
230#: qml/Components/KeyboardShortcutsOverlay.qml:235
237#: qml/Components/KeyboardShortcutsOverlay.qml:235
231msgid "Switching"
238msgid "Switching"
232−msgstr "يبدل"
239+msgstr "التبديل"
233
240
234#: qml/Components/KeyboardShortcutsOverlay.qml:242
241#: qml/Components/KeyboardShortcutsOverlay.qml:242
235msgid "Alt + Tab"
242msgid "Alt + Tab"
@@ -237,27 +244,27 @@ msgstr "Alt + Tab"
237
244
238#: qml/Components/KeyboardShortcutsOverlay.qml:247
245#: qml/Components/KeyboardShortcutsOverlay.qml:247
239msgid "Switches between applications."
246msgid "Switches between applications."
240−msgstr "يبدل بين التطبيقات."
247+msgstr "للتبديل بين التطبيقات المفتوحة."
241
248
242#: qml/Components/KeyboardShortcutsOverlay.qml:255
249#: qml/Components/KeyboardShortcutsOverlay.qml:255
243msgid "Super + W"
250msgid "Super + W"
244−msgstr "Super + W"
251+msgstr ""
245
252
246#: qml/Components/KeyboardShortcutsOverlay.qml:260
253#: qml/Components/KeyboardShortcutsOverlay.qml:260
247msgid "Opens the desktop spread."
254msgid "Opens the desktop spread."
248−msgstr "يفتح وضع سطح المكتب."
255+msgstr ""
249
256
250#: qml/Components/KeyboardShortcutsOverlay.qml:268
257#: qml/Components/KeyboardShortcutsOverlay.qml:268
251msgid "Cursor Left or Right"
258msgid "Cursor Left or Right"
252−msgstr "اتجاه المؤشر لليمين أو اليسار"
259+msgstr ""
253
260
254#: qml/Components/KeyboardShortcutsOverlay.qml:273
261#: qml/Components/KeyboardShortcutsOverlay.qml:273
255msgid "Moves the focus."
262msgid "Moves the focus."
256−msgstr "بدّل التركيز."
263+msgstr "لنقل التركيز."
257
264
258#: qml/Components/KeyboardShortcutsOverlay.qml:285
265#: qml/Components/KeyboardShortcutsOverlay.qml:285
259msgid "Windows"
266msgid "Windows"
260−msgstr "نوافذ"
267+msgstr "النوافذ"
261
268
262#: qml/Components/KeyboardShortcutsOverlay.qml:292
269#: qml/Components/KeyboardShortcutsOverlay.qml:292
263msgid "Ctrl + Super + D"
270msgid "Ctrl + Super + D"
@@ -265,7 +272,7 @@ msgstr "Ctrl + Super + D"
265
272
266#: qml/Components/KeyboardShortcutsOverlay.qml:297
273#: qml/Components/KeyboardShortcutsOverlay.qml:297
267msgid "Minimizes all windows."
274msgid "Minimizes all windows."
268−msgstr "يصغر كل النوافذ."
275+msgstr "لتصغير جميع النوافذ."
269
276
270#: qml/Components/KeyboardShortcutsOverlay.qml:305
277#: qml/Components/KeyboardShortcutsOverlay.qml:305
271msgid "Ctrl + Super + Up"
278msgid "Ctrl + Super + Up"
@@ -273,7 +280,7 @@ msgstr "Ctrl + Super + Up"
273
280
274#: qml/Components/KeyboardShortcutsOverlay.qml:310
281#: qml/Components/KeyboardShortcutsOverlay.qml:310
275msgid "Maximizes the current window."
282msgid "Maximizes the current window."
276−msgstr "يكبر النافذة الحالية."
283+msgstr "لتكبير النافذة الحالية."
277
284
278#: qml/Components/KeyboardShortcutsOverlay.qml:318
285#: qml/Components/KeyboardShortcutsOverlay.qml:318
279msgid "Ctrl + Super + Down"
286msgid "Ctrl + Super + Down"
@@ -281,27 +288,27 @@ msgstr "Ctrl + Super + Down"
281
288
282#: qml/Components/KeyboardShortcutsOverlay.qml:323
289#: qml/Components/KeyboardShortcutsOverlay.qml:323
283msgid "Minimizes or restores the current window."
290msgid "Minimizes or restores the current window."
284−msgstr "يصغر أو يستعيد النافذة الحالية."
291+msgstr "لتصغير او استعادة النافذة الحالية."
285
292
286#: qml/Components/KeyboardShortcutsOverlay.qml:331
293#: qml/Components/KeyboardShortcutsOverlay.qml:331
287msgid "Ctrl + Super + Left or Right"
294msgid "Ctrl + Super + Left or Right"
288−msgstr "Ctrl + Super + Left or Right"
295+msgstr ""
289
296
290#: qml/Components/KeyboardShortcutsOverlay.qml:336
297#: qml/Components/KeyboardShortcutsOverlay.qml:336
291msgid "Semi-maximizes the current window."
298msgid "Semi-maximizes the current window."
292−msgstr "كبر النافذة الحالة جزئيا."
299+msgstr ""
293
300
294#: qml/Components/KeyboardShortcutsOverlay.qml:344
301#: qml/Components/KeyboardShortcutsOverlay.qml:344
295msgid "Alt + F4"
302msgid "Alt + F4"
296−msgstr "Alt + F4"
303+msgstr ""
297
304
298#: qml/Components/KeyboardShortcutsOverlay.qml:349
305#: qml/Components/KeyboardShortcutsOverlay.qml:349
299msgid "Closes the current window."
306msgid "Closes the current window."
300−msgstr "يغلق النافذة الحالية."
307+msgstr ""
301
308
302−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
303msgid "Return to Call"
310msgid "Return to Call"
304−msgstr "عُد للمكالمة"
311+msgstr "العودة إلى المكالمة"
305
312
306#: qml/Components/Lockscreen.qml:212
313#: qml/Components/Lockscreen.qml:212
307msgid "Emergency Call"
314msgid "Emergency Call"
@@ -314,48 +321,48 @@ msgstr "موافق"
314#: qml/Components/MediaServices/VideoPlayerControls.qml:44
321#: qml/Components/MediaServices/VideoPlayerControls.qml:44
315#, qt-format
322#, qt-format
316msgid "%1:%2:%3"
323msgid "%1:%2:%3"
317−msgstr "%1:%2:%3"
324+msgstr ""
318
325
319#: qml/Components/MediaServices/VideoPlayerControls.qml:49
326#: qml/Components/MediaServices/VideoPlayerControls.qml:49
320#, qt-format
327#, qt-format
321msgid "%1:%2"
328msgid "%1:%2"
322−msgstr "%1:%2"
329+msgstr ""
323
330
324#: qml/Components/ModeSwitchWarningDialog.qml:33
331#: qml/Components/ModeSwitchWarningDialog.qml:33
325msgid "Apps may have unsaved data:"
332msgid "Apps may have unsaved data:"
326−msgstr "ربما لم تَحفظ بيانات هذه التطبيقات:"
333+msgstr ""
327
334
328#: qml/Components/ModeSwitchWarningDialog.qml:60
335#: qml/Components/ModeSwitchWarningDialog.qml:60
329msgctxt ""
336msgctxt ""
330"Re-dock means connect the device again to an external screen/mouse/keyboard"
337"Re-dock means connect the device again to an external screen/mouse/keyboard"
331msgid "Re-dock, save your work and close these apps to continue."
338msgid "Re-dock, save your work and close these apps to continue."
332−msgstr "أعد الوصل، احفظ عملك على هذه التطبيقات ثم أغلقها للمتابعة."
339+msgstr ""
333
340
334#: qml/Components/ModeSwitchWarningDialog.qml:67
341#: qml/Components/ModeSwitchWarningDialog.qml:67
335msgid "Or force close now (unsaved data will be lost)."
342msgid "Or force close now (unsaved data will be lost)."
336−msgstr "أو أغلقها قسريا (ستفقد البيانات غير المحفوظة)."
343+msgstr "أو أغلق إجباريا الآن (ستفقد أي بيانات غير محفوظة)."
337
344
338#: qml/Components/ModeSwitchWarningDialog.qml:80
345#: qml/Components/ModeSwitchWarningDialog.qml:80
339msgid "OK, I will reconnect"
346msgid "OK, I will reconnect"
340−msgstr "موافق، سؤعيد الاتصال"
347+msgstr ""
341
348
342#: qml/Components/ModeSwitchWarningDialog.qml:81
349#: qml/Components/ModeSwitchWarningDialog.qml:81
343msgid "Reconnect now!"
350msgid "Reconnect now!"
344−msgstr "أعد الاتصال الآن!"
351+msgstr ""
345
352
346#: qml/Components/ModeSwitchWarningDialog.qml:94
353#: qml/Components/ModeSwitchWarningDialog.qml:94
347msgid "Close all"
354msgid "Close all"
348−msgstr "أغلق الكل"
355+msgstr ""
349
356
350#: qml/Components/SharingPicker.qml:54
357#: qml/Components/SharingPicker.qml:54
351msgid "Preview Share Item"
358msgid "Preview Share Item"
352−msgstr "معاينة الملف المشارك"
359+msgstr ""
353
360
354#: qml/Components/VirtualTouchPad.qml:317
361#: qml/Components/VirtualTouchPad.qml:317
355msgid ""
362msgid ""
356"Your device is now connected to an external display. Use this screen as a "
363"Your device is now connected to an external display. Use this screen as a "
357"touch pad to interact with the pointer."
364"touch pad to interact with the pointer."
358−msgstr "جهازك متصل بجهاز عرض خارجي. استخدم جهازك كلوحة لمس لتحكم بالمؤشر."
365+msgstr ""
359
366
360#: qml/Components/VirtualTouchPad.qml:327
367#: qml/Components/VirtualTouchPad.qml:327
361msgid "Tap left button to click."
368msgid "Tap left button to click."
@@ -363,19 +370,116 @@ msgstr "اضغط الزر الأيسر للنقر."
363
370
364#: qml/Components/VirtualTouchPad.qml:339
371#: qml/Components/VirtualTouchPad.qml:339
365msgid "Tap right button to right click."
372msgid "Tap right button to right click."
366−msgstr "اضغط على الزر الأيمن للنقر."
373+msgstr "اضغط الزر الأيمن للنقر الأيمن."
367
374
368#: qml/Components/VirtualTouchPad.qml:351
375#: qml/Components/VirtualTouchPad.qml:351
369msgid "Swipe with two fingers to scroll."
376msgid "Swipe with two fingers to scroll."
370−msgstr "اسحب بإصبعين للتمرير."
377+msgstr ""
371
378
372#: qml/Components/VirtualTouchPad.qml:396
379#: qml/Components/VirtualTouchPad.qml:396
373msgid "Find more settings in the system settings."
380msgid "Find more settings in the system settings."
374−msgstr "جد إعدادات إضافية في إعدادات النظام."
381+msgstr "اعثر على مزيد من الإعدادات في إعدادات النظام."
382+
383+#: qml/Dash/DashPageHeader.qml:361
384+msgctxt "Button: Open the Ubuntu Store"
385+msgid "Store"
386+msgstr "المتجر"
387+
388+#: qml/Dash/DashPageHeader.qml:368
389+msgctxt "Button: Start a search in the current dash scope"
390+msgid "Search"
391+msgstr "بحث"
392+
393+#: qml/Dash/DashPageHeader.qml:378
394+msgctxt "Button: Show the current dash scope settings"
395+msgid "Settings"
396+msgstr "الإعدادات"
397+
398+#: qml/Dash/DashPageHeader.qml:385
399+msgid "Remove from Favorites"
400+msgstr "حذف من المفضلات"
401+
402+#: qml/Dash/DashPageHeader.qml:385
403+msgid "Add to Favorites"
404+msgstr "إضافة إلى المفضلات"
405+
406+#: qml/Dash/FiltersPopover.qml:61
407+msgid "Refine your results"
408+msgstr ""
409+
410+#: qml/Dash/FiltersPopover.qml:70
411+msgid "Reset"
412+msgstr ""
413+
414+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
415+msgid "Show less"
416+msgstr "عرض أقل"
417+
418+#: qml/Dash/GenericScopeView.qml:547
419+msgid "Show all"
420+msgstr "عرض الكل"
421+
422+#: qml/Dash/GenericScopeView.qml:578
423+msgctxt "Label: Hint for dash search line edit"
424+msgid "Search"
425+msgstr "بحث"
426+
427+#: qml/Dash/PageHeaderExtraPanel.qml:67
428+msgid "Recent Searches"
429+msgstr ""
430+
431+#: qml/Dash/PageHeaderExtraPanel.qml:78
432+msgid "Clear All"
433+msgstr ""
434+
435+#: qml/Dash/Previews/PreviewActionCombo.qml:36
436+msgid "More..."
437+msgstr "المزيد..."
438+
439+#: qml/Dash/Previews/PreviewActionCombo.qml:36
440+msgid "Less..."
441+msgstr "أقل..."
442+
443+#: qml/Dash/Previews/PreviewCommentInput.qml:83
444+#: qml/Dash/Previews/PreviewRatingInput.qml:202
445+msgid "Send"
446+msgstr "أرسل"
447+
448+#: qml/Dash/Previews/PreviewRatingInput.qml:109
449+msgid "Rate this"
450+msgstr "قيّم ذلك"
451+
452+#: qml/Dash/Previews/PreviewRatingInput.qml:184
453+msgid "Add a review"
454+msgstr "أضف تعليق"
455+
456+#: qml/Dash/PullToRefreshScopeStyle.qml:56
457+msgid "Pull to refresh…"
458+msgstr "اسحب للتحديث..."
459+
460+#: qml/Dash/PullToRefreshScopeStyle.qml:61
461+msgid "Release to refresh…"
462+msgstr "حرّر للتحديث..."
463+
464+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
465+msgid "Enable location data"
466+msgstr "تفعيل بيانات الموقع"
467+
468+#: qml/Dash/ScopesList.qml:146
469+msgid "Manage"
470+msgstr "إدارة"
471+
472+#: qml/Dash/ScopesList.qml:187
473+msgid "Home"
474+msgstr "الرئيسية"
475+
476+#: qml/Dash/ScopesList.qml:188
477+msgid "Also installed"
478+msgstr "أيضا تم تثبيت"
375
479
376#: qml/Greeter/CoverPage.qml:127
480#: qml/Greeter/CoverPage.qml:127
377msgid "Unlock"
481msgid "Unlock"
378−msgstr "فك الإيصاد"
482+msgstr "فك القفل"
379
483
380#: qml/Greeter/DelayedLockscreen.qml:43
484#: qml/Greeter/DelayedLockscreen.qml:43
381msgid "Device Locked"
485msgid "Device Locked"
@@ -395,56 +499,57 @@ msgstr ""
395#, qt-format
499#, qt-format
396msgid "Please wait %1 minute and then try again…"
500msgid "Please wait %1 minute and then try again…"
397msgid_plural "Please wait %1 minutes and then try again…"
501msgid_plural "Please wait %1 minutes and then try again…"
398−msgstr[0] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا…"
502+msgstr[0] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
399−msgstr[1] "برجاء الانتظار دقيقة واحدة (%1) ثم المحاولة مجددًا…"
503+msgstr[1] "برجاء الانتظار دقيقة واحدة (%1) ثم المحاولة مجددًا..."
400−msgstr[2] "برجاء الانتظار دقيقتين (%1) ثم المحاولة مجددًا…"
504+msgstr[2] "برجاء الانتظار دقيقتين (%1) ثم المحاولة مجددًا..."
401−msgstr[3] "برجاء الانتظار %1 دقائق ثم المحاولة مجددًا…"
505+msgstr[3] "برجاء الانتظار %1 دقائق ثم المحاولة مجددًا..."
402−msgstr[4] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا…"
506+msgstr[4] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
403−msgstr[5] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا…"
507+msgstr[5] "برجاء الانتظار %1 دقيقة ثم المحاولة مجددًا..."
404
508
405#: qml/Greeter/Greeter.qml:550
509#: qml/Greeter/Greeter.qml:550
406msgid "Try again"
510msgid "Try again"
407−msgstr "حاول مجددا"
511+msgstr ""
408
512
409#: qml/Greeter/Greeter.qml:551
513#: qml/Greeter/Greeter.qml:551
410msgid "Enter passphrase to unlock"
514msgid "Enter passphrase to unlock"
411−msgstr "أدخِل العبارة السرية لفك الإيصاد"
515+msgstr ""
412
516
413#: qml/Greeter/Greeter.qml:552
517#: qml/Greeter/Greeter.qml:552
414msgid "Enter passcode to unlock"
518msgid "Enter passcode to unlock"
415−msgstr "أدخِل الرمز السرّي لفك الإيصاد"
519+msgstr ""
416
520
417−#: qml/Greeter/NarrowView.qml:235
521+#: qml/Greeter/NarrowView.qml:228
418msgid "Emergency"
522msgid "Emergency"
419−msgstr "طوارئ"
523+msgstr ""
420
524
421#: qml/Greeter/PromptList.qml:126
525#: qml/Greeter/PromptList.qml:126
422msgid "Passphrase"
526msgid "Passphrase"
423−msgstr "كلمة السر"
527+msgstr ""
424
528
425#: qml/Greeter/PromptList.qml:126
529#: qml/Greeter/PromptList.qml:126
426msgid "Passcode"
530msgid "Passcode"
427−msgstr "الرمز السري"
531+msgstr ""
428
532
429#: qml/Greeter/SessionsList.qml:124
533#: qml/Greeter/SessionsList.qml:124
430msgid "Select desktop environment"
534msgid "Select desktop environment"
431−msgstr "اختر بيئة سطح المكتب"
535+msgstr ""
432
536
433−#: qml/Launcher/Drawer.qml:250
537+#: qml/Launcher/Drawer.qml:94
434msgid "Search…"
538msgid "Search…"
435−msgstr "ابحث…"
539+msgstr ""
436
540
437−#: qml/Launcher/PullToRefreshScopeStyle.qml:56
541+#: qml/Launcher/Drawer.qml:129
542+msgctxt "Apps sorted alphabetically"
438−msgid "Pull to refresh…"
543+msgid "A-Z"
439−msgstr "اسحب للتحديث…"
544+msgstr ""
440
545
441−#: qml/Launcher/PullToRefreshScopeStyle.qml:61
546+#: qml/Launcher/MoreAppsHeader.qml:55
442−msgid "Release to refresh…"
547+msgid "More apps in the store"
443−msgstr "حرّر للتحديث…"
548+msgstr ""
444
549
445#: qml/Notifications/NotificationMenuItemFactory.qml:124
550#: qml/Notifications/NotificationMenuItemFactory.qml:124
446msgid "Show password"
551msgid "Show password"
447−msgstr "اعرض كلمة السر"
552+msgstr "عرض كلمة السر"
448
553
449#: qml/Panel/ActiveCallHint.qml:79
554#: qml/Panel/ActiveCallHint.qml:79
450msgid "Tap to return to call..."
555msgid "Tap to return to call..."
@@ -473,9 +578,9 @@ msgstr[5] "%1 ساعة"
473#, qt-format
578#, qt-format
474msgid "%1 minute"
579msgid "%1 minute"
475msgid_plural "%1 minutes"
580msgid_plural "%1 minutes"
476−msgstr[0] "%1 دقيقة"
581+msgstr[0] "أقل من دقيقة (%1)"
477−msgstr[1] "دقيقة واحدة"
582+msgstr[1] "دقيقة واحدة (%1)"
478−msgstr[2] "دقيقتان"
583+msgstr[2] "دقيقتان (%1)"
479msgstr[3] "%1 دقائق"
584msgstr[3] "%1 دقائق"
480msgstr[4] "%1 دقيقة"
585msgstr[4] "%1 دقيقة"
481msgstr[5] "%1 دقيقة"
586msgstr[5] "%1 دقيقة"
@@ -503,11 +608,11 @@ msgstr "باق %1"
503
608
504#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
609#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
505msgid "In queue…"
610msgid "In queue…"
506−msgstr "في الانتظار…"
611+msgstr "في الانتظار..."
507
612
508#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
613#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
509msgid "Downloading"
614msgid "Downloading"
510−msgstr "ينزل"
615+msgstr "التنزيل"
511
616
512#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
617#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
513msgid "Paused, tap to resume"
618msgid "Paused, tap to resume"
@@ -515,7 +620,7 @@ msgstr "مُلبث، انقر للاستئناف"
515
620
516#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
621#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
517msgid "Canceled"
622msgid "Canceled"
518−msgstr "أُلغي"
623+msgstr "تم إلغائه"
519
624
520#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
625#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
521msgid "Finished"
626msgid "Finished"
@@ -523,13 +628,13 @@ msgstr "انتهى"
523
628
524#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
629#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
525msgid "Failed, tap to retry"
630msgid "Failed, tap to retry"
526−msgstr "فشل، انقر لإعادة المحاولة"
631+msgstr "فشل، انقل لإعادة المحاولة"
527
632
528#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
633#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
529#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
634#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
530msgctxt "Button: Send a reply message"
635msgctxt "Button: Send a reply message"
531msgid "Send"
636msgid "Send"
532−msgstr "أرسل"
637+msgstr ""
533
638
534#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
639#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
535msgctxt "Label: Hint in message indicator line edit"
640msgctxt "Label: Hint in message indicator line edit"
@@ -539,431 +644,323 @@ msgstr "رد"
539#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
644#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
540msgctxt "Button: Call back on phone"
645msgctxt "Button: Call back on phone"
541msgid "Call back"
646msgid "Call back"
542−msgstr "عاود الاتصال"
647+msgstr ""
543
648
544#: qml/Panel/PanelMenuPage.qml:92
649#: qml/Panel/PanelMenuPage.qml:92
545msgid "Back"
650msgid "Back"
546−msgstr "للخلف"
651+msgstr ""
547
652
548#: qml/Stage/SideStage.qml:76
653#: qml/Stage/SideStage.qml:76
549msgid "Drag using 3 fingers any application from one window to the other"
654msgid "Drag using 3 fingers any application from one window to the other"
550−msgstr "اسحب أي تطبيق بثلاث أصابع من نافذة لأخرى"
655+msgstr ""
551−
552−#: qml/Stage/Stage.qml:671
553−msgid "No running apps"
554−msgstr "لا توجد تطبيقات مشغلة"
555
656
556#: qml/Tutorial/TutorialLeftLong.qml:49
657#: qml/Tutorial/TutorialLeftLong.qml:49
557msgid "Long swipe from the left edge to open the Application Drawer"
658msgid "Long swipe from the left edge to open the Application Drawer"
558−msgstr "اسحب اصبعك مطولا بدءً من الحافة اليسرى لفتح درج التطبيقات"
659+msgstr ""
559
660
560#: qml/Tutorial/TutorialLeft.qml:47
661#: qml/Tutorial/TutorialLeft.qml:47
561msgid "Short swipe from the left edge to open the launcher"
662msgid "Short swipe from the left edge to open the launcher"
562−msgstr "اسحب اصبعك سحبا قصيرا بدءً من الحافة اليسرى لفتح المُطلِق"
663+msgstr ""
563
664
564−#: qml/Tutorial/TutorialRight.qml:54
665+#: qml/Tutorial/TutorialRight.qml:55
565msgid "Push your mouse against the right edge to view your open apps"
666msgid "Push your mouse against the right edge to view your open apps"
566−msgstr "حرك المؤشر للحافة اليمنى لعرض التطبيقات المفتوحة"
667+msgstr ""
567
668
568−#: qml/Tutorial/TutorialRight.qml:55
669+#: qml/Tutorial/TutorialRight.qml:56
569msgid "Swipe from the right edge to view your open apps"
670msgid "Swipe from the right edge to view your open apps"
570−msgstr "اسحب اصبعك بدءً من الحافة اليمنى لعرض التطبيقات المفتوحة"
671+msgstr ""
571
672
572#: qml/Tutorial/TutorialTop.qml:53
673#: qml/Tutorial/TutorialTop.qml:53
573msgid "Swipe from the top edge to access notifications and quick settings"
674msgid "Swipe from the top edge to access notifications and quick settings"
574msgstr ""
675msgstr ""
575−"اسحب اصبعك بدءً من الحافة العلوية للوصول الى التنبيهات والإعدادات السريعة"
576
676
577−#: qml/Wizard/Page.qml:59
677+#: qml/Wizard/Page.qml:54
578msgctxt "Button: Go back one page in the Wizard"
678msgctxt "Button: Go back one page in the Wizard"
579msgid "Back"
679msgid "Back"
580−msgstr "للخلف"
680+msgstr "عودة"
581
681
582−#: qml/Wizard/Pages/10-welcome.qml:29
682+#: qml/Wizard/Pages/10-welcome.qml:28
583msgid "Language"
683msgid "Language"
584−msgstr "اللغة"
684+msgstr ""
585−
586−#: qml/Wizard/Pages/10-welcome.qml:176
587−#: qml/Wizard/Pages/10-welcome-update.qml:126
588−#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
589−#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
590−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
591−#: qml/Wizard/Pages/passcode-desktop.qml:154
592−#: qml/Wizard/Pages/password-set.qml:153
593−msgid "Next"
594−msgstr "التالي"
595−
596−#: qml/Wizard/Pages/10-welcome-update.qml:91
597−msgid "Welcome to "
598−msgstr "مرحبا بك في "
599−
600−#: qml/Wizard/Pages/10-welcome-update.qml:106
601−msgid "We will make sure your device is ready to use "
602−msgstr "سوف نتأكد أن جهازك معد للاستخدام "
603−
604−#: qml/Wizard/Pages/11-changelog.qml:28
605−msgid "What's new"
606−msgstr "ما الجديد"
607
685
608−#: qml/Wizard/Pages/11-changelog.qml:74
686+#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
687+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
688+#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
689+#: qml/Wizard/Pages/70-passwd-type.qml:145
690+#: qml/Wizard/Pages/75-report-check.qml:84
691+#: qml/Wizard/Pages/passcode-desktop.qml:142
692+#: qml/Wizard/Pages/password-set.qml:142
609−msgid "Loading..."
693+msgid "Next"
610−msgstr "يحمل..."
694+msgstr ""
611
695
612#: qml/Wizard/Pages/20-keyboard.qml:31
696#: qml/Wizard/Pages/20-keyboard.qml:31
613msgid "Select Keyboard"
697msgid "Select Keyboard"
614−msgstr "اختر لوحة المفاتيح"
698+msgstr ""
615
699
616#: qml/Wizard/Pages/20-keyboard.qml:71
700#: qml/Wizard/Pages/20-keyboard.qml:71
617msgid "Keyboard language"
701msgid "Keyboard language"
618−msgstr "لغة لوحة المفاتيح"
702+msgstr ""
619
703
620#: qml/Wizard/Pages/20-keyboard.qml:93
704#: qml/Wizard/Pages/20-keyboard.qml:93
621msgid "Keyboard layout"
705msgid "Keyboard layout"
622−msgstr "تخطيط لوحة المفاتيح"
706+msgstr ""
623
707
624−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
708+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
625−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
626−#: qml/Wizard/Pages/sim.qml:101
709+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
627msgid "Skip"
710msgid "Skip"
628−msgstr "تخط"
711+msgstr "تخطي"
629
712
630−#: qml/Wizard/Pages/30-wifi.qml:31
713+#: qml/Wizard/Pages/30-wifi.qml:30
631msgid "Connect to Wi‑Fi"
714msgid "Connect to Wi‑Fi"
632−msgstr "اتصل بالإنترنت"
715+msgstr "اتصل بالواي فاي"
633
716
634−#: qml/Wizard/Pages/30-wifi.qml:139
717+#: qml/Wizard/Pages/30-wifi.qml:131
635msgid "Connected"
718msgid "Connected"
636−msgstr "متصل"
719+msgstr ""
637
720
638−#: qml/Wizard/Pages/30-wifi.qml:172
721+#: qml/Wizard/Pages/30-wifi.qml:164
639msgid "Available Wi-Fi networks"
722msgid "Available Wi-Fi networks"
640−msgstr "شبكات الواي فاي المتاحة"
723+msgstr ""
641
724
642−#: qml/Wizard/Pages/30-wifi.qml:173
725+#: qml/Wizard/Pages/30-wifi.qml:165
643msgid "No available Wi-Fi networks"
726msgid "No available Wi-Fi networks"
644−msgstr "لا توجد شبكات واي فاي"
727+msgstr ""
728+
729+#: qml/Wizard/Pages/40-location.qml:27
730+msgid "Location Services"
731+msgstr ""
732+
733+#: qml/Wizard/Pages/40-location.qml:83
734+msgid ""
735+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
736+"(recommended)"
737+msgstr ""
738+
739+#: qml/Wizard/Pages/40-location.qml:105
740+#, qt-format
741+msgid "By selecting this option you agree to the Nokia HERE %1."
742+msgstr ""
743+
744+#: qml/Wizard/Pages/40-location.qml:106
745+msgctxt "part of: Nokia HERE terms and conditions"
746+msgid "terms and conditions"
747+msgstr ""
748+
749+#: qml/Wizard/Pages/40-location.qml:160
750+msgid "GPS only"
751+msgstr ""
752+
753+#: qml/Wizard/Pages/40-location.qml:214
754+msgid "Don't use my location"
755+msgstr ""
756+
757+#: qml/Wizard/Pages/40-location.qml:260
758+msgid "You can change it later in System Settings."
759+msgstr ""
645
760
646#: qml/Wizard/Pages/50-timezone.qml:30
761#: qml/Wizard/Pages/50-timezone.qml:30
647msgid "Time Zone"
762msgid "Time Zone"
648−msgstr "المنطقة الزمنية"
763+msgstr ""
649
764
650−#: qml/Wizard/Pages/50-timezone.qml:183
765+#: qml/Wizard/Pages/50-timezone.qml:182
651msgid "Enter your city"
766msgid "Enter your city"
652−msgstr "أدخل مدينتك"
767+msgstr ""
653
768
654#: qml/Wizard/Pages/60-account.qml:24
769#: qml/Wizard/Pages/60-account.qml:24
655msgid "Personalize Your Device"
770msgid "Personalize Your Device"
656−msgstr "خصص جهازك"
771+msgstr ""
657
772
658−#: qml/Wizard/Pages/60-account.qml:54
773+#: qml/Wizard/Pages/60-account.qml:48
659msgid "Preferred Name"
774msgid "Preferred Name"
660−msgstr "اسم مستحسن"
775+msgstr ""
661
776
662#: qml/Wizard/Pages/70-passwd-type.qml:40
777#: qml/Wizard/Pages/70-passwd-type.qml:40
663msgid "Lock Screen"
778msgid "Lock Screen"
664−msgstr "قفل الشاشة"
779+msgstr ""
665
780
666−#: qml/Wizard/Pages/70-passwd-type.qml:103
781+#: qml/Wizard/Pages/70-passwd-type.qml:102
667msgctxt "Label: Type of security method"
782msgctxt "Label: Type of security method"
668msgid "Create new password"
783msgid "Create new password"
669−msgstr "أنشئ كلمة سر جديدة"
784+msgstr ""
670
785
671−#: qml/Wizard/Pages/70-passwd-type.qml:105
786+#: qml/Wizard/Pages/70-passwd-type.qml:104
672msgctxt "Label: Type of security method"
787msgctxt "Label: Type of security method"
673msgid "Create passcode (numbers only)"
788msgid "Create passcode (numbers only)"
674−msgstr "أنشئ رمز مرور (أرقام فقط)"
789+msgstr ""
675
790
676−#: qml/Wizard/Pages/70-passwd-type.qml:107
791+#: qml/Wizard/Pages/70-passwd-type.qml:106
677msgctxt "Label: Type of security method"
792msgctxt "Label: Type of security method"
678msgid "No lock code"
793msgid "No lock code"
679−msgstr "لا يوجد رمز إيصاد"
794+msgstr ""
680
795
681−#: qml/Wizard/Pages/79-system-update.qml:28
796+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
682−msgid "Update Device"
797+msgid "Privacy Policy"
683−msgstr "حدث الجهاز"
798+msgstr ""
684
799
685−#: qml/Wizard/Pages/79-system-update.qml:55
800+#: qml/Wizard/Pages/75-report-check.qml:26
686−msgid ""
801+msgid "Help Us Improve"
687−"There is a system update available and ready to install. Afterwards, the "
802+msgstr ""
688−"device will automatically restart."
689−msgstr "يتوفر تحديث للنظام وهو جاهز للتثبيت، سيُعاد تشغيل الجهاز تلقائيا."
690
803
691−#: qml/Wizard/Pages/79-system-update.qml:76
804+#: qml/Wizard/Pages/75-report-check.qml:59
692−msgctxt "string identifying name of the update"
805+msgid "Improve system performance by sending us crashes and error reports."
693−msgid "Ubuntu Touch system"
806+msgstr ""
694−msgstr "نظام أبونتو تاتش"
695
807
696−#: qml/Wizard/Pages/79-system-update.qml:83
808+#: qml/Wizard/Pages/75-report-check.qml:60
697−#, qt-format
809+msgid "Privacy policy"
698−msgctxt "version of the system update"
699−msgid "Version %1"
700−msgstr "الإصدار %1"
810+msgstr ""
701
811
702−#: qml/Wizard/Pages/79-system-update.qml:95
812+#: qml/Wizard/Pages/80-finished.qml:89
703−msgid "This could take a few minutes..."
813+msgid "Welcome to Ubuntu"
704−msgstr "قد يحتاج بضع دقائق..."
814+msgstr ""
705
815
706−#: qml/Wizard/Pages/79-system-update.qml:109
816+#: qml/Wizard/Pages/80-finished.qml:104
707−msgid "Install and restart now"
817+msgid "You are ready to use your device now"
708−msgstr "ثبت وأعد التشغيل الآن"
818+msgstr ""
709
819
710−#: qml/Wizard/Pages/80-finished.qml:91
820+#: qml/Wizard/Pages/80-finished.qml:124
711−msgid "Welcome Back"
821+msgid "Get Started"
712−msgstr "مرحبا بعودتك"
822+msgstr ""
713
823
714−#: qml/Wizard/Pages/80-finished.qml:91
824+#: qml/Wizard/Pages/here-terms.qml:25
715−msgid "Welcome to Ubuntu"
825+msgid "Terms & Conditions"
716−msgstr "مرحبا بك في أبونتو"
826+msgstr "الشروط والأحكام"
717
827
718−#: qml/Wizard/Pages/80-finished.qml:106
828+#: qml/Wizard/Pages/here-terms.qml:69
719−msgid "You are ready to use your device now"
829+msgid "Your device uses positioning technologies provided by HERE."
720−msgstr "أنت مستعد لاستخدام جهازك"
830+msgstr ""
721
831
722−#: qml/Wizard/Pages/80-finished.qml:126
832+#: qml/Wizard/Pages/here-terms.qml:81
723−msgid "Continue"
833+msgid ""
834+"To provide you with positioning services and to improve their quality, HERE "
835+"collects information about nearby cell towers and Wi-Fi hotspots around your "
836+"current location whenever your position is being found."
724−msgstr "تابع"
837+msgstr ""
725
838
726−#: qml/Wizard/Pages/80-finished.qml:126
839+#: qml/Wizard/Pages/here-terms.qml:93
727−msgid "Get Started"
840+msgid ""
841+"The information collected is used to analyze the service and to improve the "
842+"use of service, but not to identify you personally."
843+msgstr ""
844+
845+#: qml/Wizard/Pages/here-terms.qml:106
846+#, qt-format
847+msgid "By continuing, you agree to the HERE platform %1 and %2."
728−msgstr "ابدأ"
848+msgstr ""
849+
850+#: qml/Wizard/Pages/here-terms.qml:107
851+msgid "Service Terms"
852+msgstr ""
729
853
730#: qml/Wizard/Pages/passcode-confirm.qml:43
854#: qml/Wizard/Pages/passcode-confirm.qml:43
731−#: qml/Wizard/Pages/passcode-desktop.qml:104
855+#: qml/Wizard/Pages/passcode-desktop.qml:97
732msgid "Confirm passcode"
856msgid "Confirm passcode"
733−msgstr "تأكيد كلمة السر"
857+msgstr "تأكيد الرمز السري"
734
858
735#: qml/Wizard/Pages/passcode-confirm.qml:45
859#: qml/Wizard/Pages/passcode-confirm.qml:45
736msgid "Incorrect passcode."
860msgid "Incorrect passcode."
737−msgstr "الرمز السري غير صحيح."
861+msgstr ""
738
862
739#: qml/Wizard/Pages/passcode-confirm.qml:45
863#: qml/Wizard/Pages/passcode-confirm.qml:45
740msgctxt "Enter the passcode again"
864msgctxt "Enter the passcode again"
741msgid "Please re-enter."
865msgid "Please re-enter."
742−msgstr "رجاء أعد الإدخال."
866+msgstr ""
743
867
744#: qml/Wizard/Pages/passcode-desktop.qml:31
868#: qml/Wizard/Pages/passcode-desktop.qml:31
745msgid "Lock Screen Passcode"
869msgid "Lock Screen Passcode"
746−msgstr "الرمز السري لقفل الشاشة"
870+msgstr ""
747
871
748−#: qml/Wizard/Pages/passcode-desktop.qml:68
872+#: qml/Wizard/Pages/passcode-desktop.qml:61
749msgid "Enter 4 numbers to setup your passcode"
873msgid "Enter 4 numbers to setup your passcode"
750−msgstr "أدخل 4 أرقام لإعداد الرمز السري"
874+msgstr ""
751
875
752−#: qml/Wizard/Pages/passcode-desktop.qml:84
876+#: qml/Wizard/Pages/passcode-desktop.qml:77
753#: qml/Wizard/Pages/passcode-set.qml:54
877#: qml/Wizard/Pages/passcode-set.qml:54
754msgid "Choose passcode"
878msgid "Choose passcode"
755−msgstr "اختر كلمة السر"
879+msgstr ""
756
880
757−#: qml/Wizard/Pages/passcode-desktop.qml:139
881+#: qml/Wizard/Pages/passcode-desktop.qml:127
758msgid "Passcode too short"
882msgid "Passcode too short"
759−msgstr "الرمز السري قصير جدا"
883+msgstr ""
760
884
761−#: qml/Wizard/Pages/passcode-desktop.qml:141
885+#: qml/Wizard/Pages/passcode-desktop.qml:129
762msgid "Passcodes match"
886msgid "Passcodes match"
763−msgstr "الرمزان السريان متطابقة"
887+msgstr ""
764
888
765−#: qml/Wizard/Pages/passcode-desktop.qml:143
889+#: qml/Wizard/Pages/passcode-desktop.qml:131
766msgid "Passcodes do not match"
890msgid "Passcodes do not match"
767−msgstr "الرمزان السريان لا يتطبقان"
891+msgstr ""
768
892
769#: qml/Wizard/Pages/passcode-set.qml:62
893#: qml/Wizard/Pages/passcode-set.qml:62
770msgid "Passcode must be 4 characters long"
894msgid "Passcode must be 4 characters long"
771−msgstr "يجب أن يكون الرمز السري 4 محارف"
895+msgstr ""
772
896
773#: qml/Wizard/Pages/password-set.qml:31
897#: qml/Wizard/Pages/password-set.qml:31
774msgid "Lock Screen Password"
898msgid "Lock Screen Password"
775−msgstr "كلمة سر قفل الشاشة"
899+msgstr ""
776
900
777−#: qml/Wizard/Pages/password-set.qml:68
901+#: qml/Wizard/Pages/password-set.qml:62
778msgid "Enter at least 8 characters"
902msgid "Enter at least 8 characters"
779−msgstr "أدخل 8 محارف على الأقل"
903+msgstr ""
780
904
781−#: qml/Wizard/Pages/password-set.qml:80
905+#: qml/Wizard/Pages/password-set.qml:74
782msgid "Choose password"
906msgid "Choose password"
783−msgstr "اختر كلمة السر"
907+msgstr ""
784
908
785−#: qml/Wizard/Pages/password-set.qml:110
909+#: qml/Wizard/Pages/password-set.qml:104
786msgid "Confirm password"
910msgid "Confirm password"
787−msgstr "أكد كلمة السر"
911+msgstr ""
788
912
789#: qml/Wizard/Pages/sim.qml:27
913#: qml/Wizard/Pages/sim.qml:27
790msgid "No SIM card installed"
914msgid "No SIM card installed"
791−msgstr "لم تدخل بطاقة SIM"
915+msgstr ""
792
916
793#: qml/Wizard/Pages/sim.qml:54
917#: qml/Wizard/Pages/sim.qml:54
794msgid "SIM card added"
918msgid "SIM card added"
795−msgstr "أُدخلت بطاقة SIM"
919+msgstr ""
796
920
797#: qml/Wizard/Pages/sim.qml:55
921#: qml/Wizard/Pages/sim.qml:55
798msgid "You must restart the device to access the mobile network."
922msgid "You must restart the device to access the mobile network."
799−msgstr "يجب عليك إعادة تشغيل الجهاز لتتمكن من دخول شبكة الجوال."
923+msgstr ""
800
924
801#: qml/Wizard/Pages/sim.qml:59
925#: qml/Wizard/Pages/sim.qml:59
802msgid "Restart"
926msgid "Restart"
803−msgstr "أعد التشغيل"
927+msgstr ""
804
928
805#: qml/Wizard/Pages/sim.qml:78
929#: qml/Wizard/Pages/sim.qml:78
806msgid "You won’t be able to make calls or use text messaging without a SIM."
930msgid "You won’t be able to make calls or use text messaging without a SIM."
807−msgstr "لن تتمكن من إجراء المكالمات أو إرسال الرسائل القصيرة بدون بطاقة SIM."
931+msgstr ""
808
932
809#: qml/Wizard/Pages/sim.qml:90
933#: qml/Wizard/Pages/sim.qml:90
810msgid "To proceed with no SIM tap Skip."
934msgid "To proceed with no SIM tap Skip."
811−msgstr "للاستمرار بدون بطاقة SIM اضغط تخطى."
935+msgstr ""
812
936
813#: qml/Wizard/PasswordMeter.qml:87
937#: qml/Wizard/PasswordMeter.qml:87
814msgid "Password too short"
938msgid "Password too short"
815−msgstr "كلمة السر قصيرة جداً"
939+msgstr ""
816
940
817#: qml/Wizard/PasswordMeter.qml:89
941#: qml/Wizard/PasswordMeter.qml:89
818msgid "Passwords match"
942msgid "Passwords match"
819−msgstr "كلمتا المرور متطابقتان"
943+msgstr ""
820
944
821#: qml/Wizard/PasswordMeter.qml:91
945#: qml/Wizard/PasswordMeter.qml:91
822msgid "Passwords do not match"
946msgid "Passwords do not match"
823−msgstr "كلمتا المرور غير متطابقتين"
947+msgstr ""
824
948
825#: qml/Wizard/PasswordMeter.qml:95
949#: qml/Wizard/PasswordMeter.qml:95
826msgid "Strong password"
950msgid "Strong password"
827−msgstr "كلمة سر قوية"
951+msgstr ""
828
952
829#: qml/Wizard/PasswordMeter.qml:97
953#: qml/Wizard/PasswordMeter.qml:97
830msgid "Fair password"
954msgid "Fair password"
831−msgstr "كلمة سر متوسطة"
955+msgstr ""
832
956
833#: qml/Wizard/PasswordMeter.qml:99
957#: qml/Wizard/PasswordMeter.qml:99
834msgid "Weak password"
958msgid "Weak password"
835−msgstr "كلمة سر ضعيفة"
959+msgstr ""
836
960
837#: qml/Wizard/PasswordMeter.qml:101
961#: qml/Wizard/PasswordMeter.qml:101
838msgid "Very weak password"
962msgid "Very weak password"
839−msgstr "كلمة السر ضعيفة جداً"
963+msgstr ""
840−
841−#~ msgid "Unity 8"
842−#~ msgstr "يونتي 8"
843−
844−#~ msgid "Super (Tap)"
845−#~ msgstr "Super (نقر)"
846−
847−#~ msgctxt "Button: Open the Ubuntu Store"
848−#~ msgid "Store"
849−#~ msgstr "المتجر"
850−
851−#~ msgctxt "Button: Start a search in the current dash scope"
852−#~ msgid "Search"
853−#~ msgstr "بحث"
854−
855−#~ msgctxt "Button: Show the current dash scope settings"
856−#~ msgid "Settings"
857−#~ msgstr "الإعدادات"
858−
859−#~ msgid "Remove from Favorites"
860−#~ msgstr "حذف من المفضلات"
861−
862−#~ msgid "Add to Favorites"
863−#~ msgstr "إضافة إلى المفضلات"
864−
865−#~ msgctxt "Label: Hint for dash search line edit"
866−#~ msgid "Search"
867−#~ msgstr "بحث"
868−
869−#~ msgid "More..."
870−#~ msgstr "المزيد..."
871−
872−#~ msgid "Less..."
873−#~ msgstr "أقل..."
874−
875−#~ msgid "Send"
876−#~ msgstr "أرسل"
877−
878−#~ msgid "Rate this"
879−#~ msgstr "قيّم ذلك"
880−
881−#~ msgid "Add a review"
882−#~ msgstr "أضف تعليق"
883−
884−#~ msgid "Enable location data"
885−#~ msgstr "تفعيل بيانات الموقع"
886−
887−#~ msgid "Manage"
888−#~ msgstr "إدارة"
889−
890−#~ msgid "Home"
891−#~ msgstr "الرئيسية"
892−
893−#~ msgid "Also installed"
894−#~ msgstr "أيضا تم تثبيت"
895−
896−#~ msgid "Privacy Policy"
897−#~ msgstr "سياسة الخصوصية"
898−
899−#~ msgid "Help Us Improve"
900−#~ msgstr "ساعدنا على التحسن"
901−
902−#~ msgid "Improve system performance by sending us crashes and error reports."
903−#~ msgstr "تحسين أداء النظام عير إرسال تقارير التوقف والأخطاء"
904−
905−#~ msgid "Privacy policy"
906−#~ msgstr "سياسة الخصوصية"
907−
908−#~ msgid "Update Apps"
909−#~ msgstr "تحديث التطبيقات"
910−
911−#~ msgid "This device is not connected to the internet."
912−#~ msgstr "الجهاز غير متصل باﻹنترنت"
913−
914−#, fuzzy
915−#~ msgid "Please wait..."
916−#~ msgstr "يجري التحميل. برجاء الانتظار..."
917−
918−#~ msgid "Update"
919−#~ msgstr "تحديث"
920−
921−#~ msgid "Download"
922−#~ msgstr "تنزيل"
923−
924−#~ msgid "Resume"
925−#~ msgstr "استئناف"
926−
927−#~ msgid "Pause"
928−#~ msgstr "إيقاف"
929−
930−#~ msgid "Install…"
931−#~ msgstr "تثبيت …"
932−
933−#~ msgid "Install"
934−#~ msgstr "تثبيت"
935−
936−#~ msgid "Open"
937−#~ msgstr "فتح"
938−
939−#~ msgid "Installing"
940−#~ msgstr "جاري التثبيت"
941−
942−#~ msgid "Paused"
943−#~ msgstr "تم اﻹيقاف"
944−
945−#~ msgid "Waiting to download"
946−#~ msgstr "انتظار التنزيل"
947−
948−#~ msgid "%1 of %2"
949−#~ msgstr "%1 من 2%"
950−
951−#, fuzzy
952−#~ msgid "Downloaded"
953−#~ msgstr "التنزيل"
954−
955−#, fuzzy
956−#~ msgid "Installed"
957−#~ msgstr "أيضا تم تثبيت"
958−
959−#~ msgid "Updated %1"
960−#~ msgstr "تحديث 1%"
961−
962−#~ msgid "Update failed"
963−#~ msgstr "فشل التحديث"
964−
965−#~ msgid "Terms & Conditions"
966−#~ msgstr "الشروط والأحكام"
967
964
968#~ msgid "Confirm"
965#~ msgid "Confirm"
969#~ msgstr "التأكيد"
966#~ msgstr "التأكيد"
@@ -971,9 +968,21 @@ msgstr "كلمة السر ضعيفة جداً"
971#~ msgid "Type or say a command"
968#~ msgid "Type or say a command"
972#~ msgstr "اكتب أو قُل أمرا"
969#~ msgstr "اكتب أو قُل أمرا"
973
970
971+#~ msgid "Loading. Please Wait..."
972+#~ msgstr "يجري التحميل. برجاء الانتظار..."
973+
974#~ msgid "Speak Now..."
974#~ msgid "Speak Now..."
975#~ msgstr "تكلم الآن..."
975#~ msgstr "تكلم الآن..."
976
976
977+#~ msgid "Speaking..."
978+#~ msgstr "تتكلم الآن..."
979+
980+#~ msgid "Search"
981+#~ msgstr "ابحث"
982+
983+#~ msgid "Try swiping from the top edge to access the indicators"
984+#~ msgstr "اسحب اصبعك من الحافة العلوية للوصول إلى المؤشرات"
985+
977#~ msgid "Top edge"
986#~ msgid "Top edge"
978#~ msgstr "الحافة العلوية"
987#~ msgstr "الحافة العلوية"
979
988
@@ -1009,8 +1018,8 @@ msgstr "كلمة السر ضعيفة جداً"
1009#~ "You have now mastered the edge gestures and can start using the "
1018#~ "You have now mastered the edge gestures and can start using the "
1010#~ "phone<br><br>Tap on the screen to start"
1019#~ "phone<br><br>Tap on the screen to start"
1011#~ msgstr ""
1020#~ msgstr ""
1012−#~ "أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر "
1021+#~ "أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
1013−#~ "على الشاشة للبدء"
1022+#~ "الشاشة للبدء"
1014
1023
1015#~ msgid "%a %l:%M %p"
1024#~ msgid "%a %l:%M %p"
1016#~ msgstr "%a %l:%M %p"
1025#~ msgstr "%a %l:%M %p"
@@ -1063,18 +1072,26 @@ msgstr "كلمة السر ضعيفة جداً"
1063#~ msgid "Tap to unlock"
1072#~ msgid "Tap to unlock"
1064#~ msgstr "انقر لفك القفل"
1073#~ msgstr "انقر لفك القفل"
1065
1074
1075+#, qt-format
1066#~ msgid "Enter %1"
1076#~ msgid "Enter %1"
1067#~ msgstr "أدخِل %1"
1077#~ msgstr "أدخِل %1"
1068
1078
1069#~ msgid "Sorry, incorrect passcode."
1079#~ msgid "Sorry, incorrect passcode."
1070#~ msgstr "عذرًا، رمز سرّي خاطيء."
1080#~ msgstr "عذرًا، رمز سرّي خاطيء."
1071
1081
1082+#~ msgid "Enter passphrase"
1083+#~ msgstr "أدخِل العبارة السرية"
1084+
1085+#~ msgid "Enter passcode"
1086+#~ msgstr "أدخِل الرمز السرّي"
1087+
1072#~ msgid "Sorry, incorrect passphrase."
1088#~ msgid "Sorry, incorrect passphrase."
1073#~ msgstr "عذرًا، عبارة سرّية خاطئة."
1089#~ msgstr "عذرًا، عبارة سرّية خاطئة."
1074
1090
1075#~ msgid "This will be your last attempt."
1091#~ msgid "This will be your last attempt."
1076#~ msgstr "هذه ستكون المحاولة الأخيرة لك."
1092#~ msgstr "هذه ستكون المحاولة الأخيرة لك."
1077
1093
1094+#, qt-format
1078#~ msgid "Sorry, incorrect %1"
1095#~ msgid "Sorry, incorrect %1"
1079#~ msgstr "نأسف، %1 غير صحيحية"
1096#~ msgstr "نأسف، %1 غير صحيحية"
1080
1097
@@ -1145,6 +1162,9 @@ msgstr "كلمة السر ضعيفة جداً"
1145#~ msgid "Let’s get started."
1162#~ msgid "Let’s get started."
1146#~ msgstr "هيا بنا نبدأ."
1163#~ msgstr "هيا بنا نبدأ."
1147
1164
1165+#~ msgid "Continue"
1166+#~ msgstr "متابعة"
1167+
1148#~ msgid "Choose your passcode"
1168#~ msgid "Choose your passcode"
1149#~ msgstr "اختر الرمز السري خاصتك"
1169#~ msgstr "اختر الرمز السري خاصتك"
1150
1170
@@ -1241,15 +1261,15 @@ msgstr "كلمة السر ضعيفة جداً"
1241#~ msgstr "فتح قفل بطاقة SIM"
1261#~ msgstr "فتح قفل بطاقة SIM"
1242
1262
1243#~ msgid ""
1263#~ msgid ""
1244−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1264+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1245−#~ "and conditions</a>."
1265+#~ "conditions</a>."
1246#~ msgstr ""
1266#~ msgstr ""
1247−#~ "باختيارك لهذا الخيار فإنك توافق على <a href='#'>الشروط والأحكام</a> "
1267+#~ "باختيارك لهذا الخيار فإنك توافق على <a href='#'>الشروط والأحكام</a> الخاصة "
1248−#~ "الخاصة بـ Nokia HERE."
1268+#~ "بـ Nokia HERE."
1249
1269
1250#~ msgid ""
1270#~ msgid ""
1251−#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1271+#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1252−#~ "reset and all personal data will be deleted."
1272+#~ "and all personal data will be deleted."
1253#~ msgstr ""
1273#~ msgstr ""
1254#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
1274#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
1255#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
1275#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
@@ -1260,3 +1280,9 @@ msgstr "كلمة السر ضعيفة جداً"
1260#~ msgstr ""
1280#~ msgstr ""
1261#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
1281#~ "إذا تم إدخال العبارة السرية بشكل خاطئ، فسوف يتم إعادة الهاتف لحالة ضبط "
1262#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
1282#~ "المصنع وسيتم حذف كافة البيانات الشخصية."
1283+
1284+#~ msgid "Takes a screenshot of a window."
1285+#~ msgstr "أخذ لقطة شاشة للنافذة"
1286+
1287+#~ msgid "Super + 0 to 9"
1288+#~ msgstr "Super + 0 to 9"
po/ast.po+453−469
@@ -6,43 +6,41 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: \n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2021-01-29 11:42-0600\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2019-10-30 03:35+0000\n"
11+"PO-Revision-Date: 2016-12-16 02:13+0000\n"
12"Last-Translator: enolp <enolp@softastur.org>\n"
12"Last-Translator: enolp <enolp@softastur.org>\n"
13−"Language-Team: Asturian <https://translate.ubports.com/projects/unity8/"
13+"Language-Team: Asturian <ast@li.org>\n"
14−"unity8/ast/>\n"
15−"Language: ast\n"
16"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Generator: Weblate 3.8\n"
21−"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
22
20
23−#: plugins/LightDM/Greeter.cpp:199
21+#: plugins/LightDM/Greeter.cpp:188
24msgid "Password: "
22msgid "Password: "
25msgstr "Contraseña: "
23msgstr "Contraseña: "
26
24
27−#: plugins/LightDM/Greeter.cpp:214
25+#: plugins/LightDM/Greeter.cpp:203
28msgid "Username"
26msgid "Username"
29msgstr ""
27msgstr ""
30
28
31−#: plugins/LightDM/Greeter.cpp:258
29+#: plugins/LightDM/Greeter.cpp:242
32msgid "Failed to authenticate"
30msgid "Failed to authenticate"
33msgstr ""
31msgstr ""
34
32
35−#: plugins/LightDM/Greeter.cpp:260
33+#: plugins/LightDM/Greeter.cpp:244
36msgid "Invalid password, please try again"
34msgid "Invalid password, please try again"
37msgstr ""
35msgstr ""
38
36
39−#: plugins/LightDM/Greeter.cpp:270
37+#: plugins/LightDM/Greeter.cpp:254
40msgid "Log In"
38msgid "Log In"
41−msgstr ""
39+msgstr "Aniciar sesión"
42
40
43−#: plugins/LightDM/Greeter.cpp:270
41+#: plugins/LightDM/Greeter.cpp:254
44msgid "Retry"
42msgid "Retry"
45−msgstr ""
43+msgstr "Reintentar"
46
44
47#: plugins/LightDM/UsersModel.cpp:157
45#: plugins/LightDM/UsersModel.cpp:157
48msgid "Login"
46msgid "Login"
@@ -52,23 +50,23 @@ msgstr ""
52msgid "Guest Session"
50msgid "Guest Session"
53msgstr ""
51msgstr ""
54
52
55−#: plugins/Unity/Launcher/launcheritem.cpp:48
53+#: plugins/Unity/Launcher/launcheritem.cpp:49
56−#: plugins/Unity/Launcher/launcheritem.cpp:122
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
57msgid "Pin shortcut"
55msgid "Pin shortcut"
58−msgstr "Fixar l'atayu"
56+msgstr "Anclar atayu"
59
57
60−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
61msgid "Quit"
59msgid "Quit"
62msgstr "Colar"
60msgstr "Colar"
63
61
64−#: plugins/Unity/Launcher/launcheritem.cpp:122
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
65msgid "Unpin shortcut"
63msgid "Unpin shortcut"
66−msgstr "Quitar l'atayu"
64+msgstr "Desanclar atayu"
67
65
68#: qml/Components/Dialogs.qml:176
66#: qml/Components/Dialogs.qml:176
69msgctxt "Title: Lock/Log out dialog"
67msgctxt "Title: Lock/Log out dialog"
70msgid "Log out"
68msgid "Log out"
71−msgstr "Zarru de la sesión"
69+msgstr "Zarrar sesión"
72
70
73#: qml/Components/Dialogs.qml:177
71#: qml/Components/Dialogs.qml:177
74msgid "Are you sure you want to log out?"
72msgid "Are you sure you want to log out?"
@@ -84,8 +82,9 @@ msgctxt "Button: Log out from the system"
84msgid "Log Out"
82msgid "Log Out"
85msgstr "Zarrar sesión"
83msgstr "Zarrar sesión"
86
84
87−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
88−#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Wizard/Pages/passcode-confirm.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
90msgid "Cancel"
89msgid "Cancel"
91msgstr "Encaboxar"
90msgstr "Encaboxar"
@@ -107,42 +106,36 @@ msgstr "Non"
107msgid "Yes"
106msgid "Yes"
108msgstr "Sí"
107msgstr "Sí"
109
108
110−#: qml/Components/Dialogs.qml:243
109+#: qml/Components/Dialogs.qml:239
111msgctxt "Title: Power off/Restart dialog"
110msgctxt "Title: Power off/Restart dialog"
112msgid "Power"
111msgid "Power"
113−msgstr "Enerxía"
112+msgstr "Apagáu"
114
113
115−#: qml/Components/Dialogs.qml:244
114+#: qml/Components/Dialogs.qml:240
116msgid ""
115msgid ""
117"Are you sure you would like\n"
116"Are you sure you would like\n"
118"to power off?"
117"to power off?"
119msgstr ""
118msgstr ""
120−"¿De xuru que quies\n"
119+"¿De xuru que te prestaría\n"
121"apagar?"
120"apagar?"
122
121
123−#: qml/Components/Dialogs.qml:248
122+#: qml/Components/Dialogs.qml:244
124msgctxt "Button: Power off the system"
123msgctxt "Button: Power off the system"
125msgid "Power off"
124msgid "Power off"
126msgstr "Apagar"
125msgstr "Apagar"
127
126
128−#: qml/Components/Dialogs.qml:263
127+#: qml/Components/Dialogs.qml:255
129msgctxt "Button: Restart the system"
128msgctxt "Button: Restart the system"
130msgid "Restart"
129msgid "Restart"
131msgstr "Reaniciar"
130msgstr "Reaniciar"
132
131
133−#: qml/Components/Dialogs.qml:276
134−#, fuzzy
135−#| msgid "Takes a screenshot."
136−msgid "Screenshot"
137−msgstr "Fai una captura de pantalla."
138−
139#: qml/Components/KeyboardShortcutsOverlay.qml:41
132#: qml/Components/KeyboardShortcutsOverlay.qml:41
140msgid "Keyboard Shortcuts"
133msgid "Keyboard Shortcuts"
141−msgstr "Atayos del tecláu"
134+msgstr "Atayos de tecláu"
142
135
143#: qml/Components/KeyboardShortcutsOverlay.qml:55
136#: qml/Components/KeyboardShortcutsOverlay.qml:55
144−msgid "Lomiri"
137+msgid "Unity 8"
145−msgstr ""
138+msgstr "Unity 8"
146
139
147#: qml/Components/KeyboardShortcutsOverlay.qml:62
140#: qml/Components/KeyboardShortcutsOverlay.qml:62
148msgid "PrtScr"
141msgid "PrtScr"
@@ -150,39 +143,35 @@ msgstr "ImprPant"
150
143
151#: qml/Components/KeyboardShortcutsOverlay.qml:67
144#: qml/Components/KeyboardShortcutsOverlay.qml:67
152msgid "Takes a screenshot."
145msgid "Takes a screenshot."
153−msgstr "Fai una captura de pantalla."
146+msgstr "Saca una imaxe de la pantalla."
154
147
155#: qml/Components/KeyboardShortcutsOverlay.qml:75
148#: qml/Components/KeyboardShortcutsOverlay.qml:75
156msgid "Alt + PrtScr"
149msgid "Alt + PrtScr"
157msgstr "Alt + ImprPant"
150msgstr "Alt + ImprPant"
158
151
159#: qml/Components/KeyboardShortcutsOverlay.qml:80
152#: qml/Components/KeyboardShortcutsOverlay.qml:80
160−#, fuzzy
161−#| msgid "Takes a screenshot of a window."
162msgid "Takes a screenshot of the current window."
153msgid "Takes a screenshot of the current window."
163−msgstr "Fai una captura d'una ventana."
154+msgstr ""
164
155
165#: qml/Components/KeyboardShortcutsOverlay.qml:88
156#: qml/Components/KeyboardShortcutsOverlay.qml:88
166msgid "Super + Space"
157msgid "Super + Space"
167−msgstr "Súper + Espaciu"
158+msgstr "Super + Espaciu"
168
159
169#: qml/Components/KeyboardShortcutsOverlay.qml:93
160#: qml/Components/KeyboardShortcutsOverlay.qml:93
170msgid "Switches to next keyboard layout."
161msgid "Switches to next keyboard layout."
171−msgstr "Cambia a la distribución siguiente del tecláu."
162+msgstr "Salta al siguiente diseñu de tecláu."
172
163
173#: qml/Components/KeyboardShortcutsOverlay.qml:101
164#: qml/Components/KeyboardShortcutsOverlay.qml:101
174msgid "Super + Shift + Space"
165msgid "Super + Shift + Space"
175−msgstr "Súper + Mayús + Espaciu"
166+msgstr "Super +Mayús + Espaciu"
176
167
177#: qml/Components/KeyboardShortcutsOverlay.qml:106
168#: qml/Components/KeyboardShortcutsOverlay.qml:106
178msgid "Switches to previous keyboard layout."
169msgid "Switches to previous keyboard layout."
179−msgstr "Cambia a la distribución anterior del tecláu."
170+msgstr "Salta al diseñu de tecláu anterior."
180
171
181#: qml/Components/KeyboardShortcutsOverlay.qml:114
172#: qml/Components/KeyboardShortcutsOverlay.qml:114
182−#, fuzzy
183−#| msgid "Ctrl + Super + D"
184msgid "Ctrl + Alt + T"
173msgid "Ctrl + Alt + T"
185−msgstr "Ctrl + Súper + D"
174+msgstr ""
186
175
187#: qml/Components/KeyboardShortcutsOverlay.qml:119
176#: qml/Components/KeyboardShortcutsOverlay.qml:119
188msgid "Starts the Terminal application."
177msgid "Starts the Terminal application."
@@ -194,11 +183,11 @@ msgstr "Llanzador"
194
183
195#: qml/Components/KeyboardShortcutsOverlay.qml:138
184#: qml/Components/KeyboardShortcutsOverlay.qml:138
196msgid "Super (Hold)"
185msgid "Super (Hold)"
197−msgstr ""
186+msgstr "Super (Caltener)"
198
187
199#: qml/Components/KeyboardShortcutsOverlay.qml:143
188#: qml/Components/KeyboardShortcutsOverlay.qml:143
200msgid "Opens the launcher, displays shortcuts."
189msgid "Opens the launcher, displays shortcuts."
201−msgstr "Abre'l llanzador, amuesa los atayos."
190+msgstr "Abre'l llanzador, amuesa atayos."
202
191
203#: qml/Components/KeyboardShortcutsOverlay.qml:151
192#: qml/Components/KeyboardShortcutsOverlay.qml:151
204msgid "Alt + F1"
193msgid "Alt + F1"
@@ -206,81 +195,87 @@ msgstr "Alt + F1"
206
195
207#: qml/Components/KeyboardShortcutsOverlay.qml:156
196#: qml/Components/KeyboardShortcutsOverlay.qml:156
208msgid "Opens launcher keyboard navigation mode."
197msgid "Opens launcher keyboard navigation mode."
209−msgstr ""
198+msgstr "Abre'l mou de navegación con tecláu del llanzador."
210
199
211#: qml/Components/KeyboardShortcutsOverlay.qml:164
200#: qml/Components/KeyboardShortcutsOverlay.qml:164
212msgid "Super + Tab"
201msgid "Super + Tab"
213−msgstr "Súper + Tabulador"
202+msgstr "Super + Tab"
214
203
215#: qml/Components/KeyboardShortcutsOverlay.qml:169
204#: qml/Components/KeyboardShortcutsOverlay.qml:169
216msgid "Switches applications via the launcher."
205msgid "Switches applications via the launcher."
217−msgstr ""
206+msgstr "Cambia d'aplicaciones col llanzador."
218
207
219#: qml/Components/KeyboardShortcutsOverlay.qml:177
208#: qml/Components/KeyboardShortcutsOverlay.qml:177
220−#, fuzzy
221−#| msgid "Super + 0 to 9"
222msgid "Super + 1 to 0"
209msgid "Super + 1 to 0"
223−msgstr "Súper + 0 a 9"
210+msgstr ""
224
211
225#: qml/Components/KeyboardShortcutsOverlay.qml:182
212#: qml/Components/KeyboardShortcutsOverlay.qml:182
226msgid "Same as clicking on a launcher icon."
213msgid "Same as clicking on a launcher icon."
227−msgstr "Igual que calcar nun iconu del llanzador."
214+msgstr "Igual que facer click nel iconu del llanzador."
228
215
229#: qml/Components/KeyboardShortcutsOverlay.qml:190
216#: qml/Components/KeyboardShortcutsOverlay.qml:190
230−#, fuzzy
231−#| msgid "Super + W"
232msgid "Super + A"
217msgid "Super + A"
233−msgstr "Súper + W"
218+msgstr ""
234
219
235#: qml/Components/KeyboardShortcutsOverlay.qml:195
220#: qml/Components/KeyboardShortcutsOverlay.qml:195
236−#, fuzzy
237−#| msgid "Open the launcher"
238msgid "Opens the Application Drawer."
221msgid "Opens the Application Drawer."
239−msgstr "Abrir el llanzador"
222+msgstr "Abre'l caxón d'aplicaciones."
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
225+msgid "Scopes"
226+msgstr "Ámbitos"
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
229+msgid "Super (Tap)"
230+msgstr "Super (Tocar)"
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
233+msgid "Opens the Scopes home."
234+msgstr "Abre'l principiu d'Ámbitos"
240
235
241#: qml/Components/KeyboardShortcutsOverlay.qml:235
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
242msgid "Switching"
237msgid "Switching"
243−msgstr "Cambéu"
238+msgstr "Conmutación"
244
239
245#: qml/Components/KeyboardShortcutsOverlay.qml:242
240#: qml/Components/KeyboardShortcutsOverlay.qml:242
246msgid "Alt + Tab"
241msgid "Alt + Tab"
247−msgstr "Alt + Tabulador"
242+msgstr "Alt + Tab"
248
243
249#: qml/Components/KeyboardShortcutsOverlay.qml:247
244#: qml/Components/KeyboardShortcutsOverlay.qml:247
250msgid "Switches between applications."
245msgid "Switches between applications."
251−msgstr ""
246+msgstr "Conmuta ente aplicaciones."
252
247
253#: qml/Components/KeyboardShortcutsOverlay.qml:255
248#: qml/Components/KeyboardShortcutsOverlay.qml:255
254msgid "Super + W"
249msgid "Super + W"
255−msgstr "Súper + W"
250+msgstr "Super + W"
256
251
257#: qml/Components/KeyboardShortcutsOverlay.qml:260
252#: qml/Components/KeyboardShortcutsOverlay.qml:260
258msgid "Opens the desktop spread."
253msgid "Opens the desktop spread."
259−msgstr ""
254+msgstr "Abre esparder l'escritoriu."
260
255
261#: qml/Components/KeyboardShortcutsOverlay.qml:268
256#: qml/Components/KeyboardShortcutsOverlay.qml:268
262msgid "Cursor Left or Right"
257msgid "Cursor Left or Right"
263−msgstr ""
258+msgstr "Flecha izq. o dre."
264
259
265#: qml/Components/KeyboardShortcutsOverlay.qml:273
260#: qml/Components/KeyboardShortcutsOverlay.qml:273
266msgid "Moves the focus."
261msgid "Moves the focus."
267−msgstr "Mueve'l focu."
262+msgstr "Mueve'l focu"
268
263
269#: qml/Components/KeyboardShortcutsOverlay.qml:285
264#: qml/Components/KeyboardShortcutsOverlay.qml:285
270msgid "Windows"
265msgid "Windows"
271−msgstr ""
266+msgstr "Ventanes"
272
267
273#: qml/Components/KeyboardShortcutsOverlay.qml:292
268#: qml/Components/KeyboardShortcutsOverlay.qml:292
274msgid "Ctrl + Super + D"
269msgid "Ctrl + Super + D"
275−msgstr "Ctrl + Súper + D"
270+msgstr "Ctrl + Super + D"
276
271
277#: qml/Components/KeyboardShortcutsOverlay.qml:297
272#: qml/Components/KeyboardShortcutsOverlay.qml:297
278msgid "Minimizes all windows."
273msgid "Minimizes all windows."
279−msgstr "Minimiza toles ventanes."
274+msgstr "Amenorga toles ventanes."
280
275
281#: qml/Components/KeyboardShortcutsOverlay.qml:305
276#: qml/Components/KeyboardShortcutsOverlay.qml:305
282msgid "Ctrl + Super + Up"
277msgid "Ctrl + Super + Up"
283−msgstr "Ctrl + Súper + Arriba"
278+msgstr "Ctrl + Super + Arriba"
284
279
285#: qml/Components/KeyboardShortcutsOverlay.qml:310
280#: qml/Components/KeyboardShortcutsOverlay.qml:310
286msgid "Maximizes the current window."
281msgid "Maximizes the current window."
@@ -288,19 +283,19 @@ msgstr "Maximiza la ventana actual."
288
283
289#: qml/Components/KeyboardShortcutsOverlay.qml:318
284#: qml/Components/KeyboardShortcutsOverlay.qml:318
290msgid "Ctrl + Super + Down"
285msgid "Ctrl + Super + Down"
291−msgstr "Ctrl + Súper + Abaxo"
286+msgstr "Ctrl + Super + Abaxo"
292
287
293#: qml/Components/KeyboardShortcutsOverlay.qml:323
288#: qml/Components/KeyboardShortcutsOverlay.qml:323
294msgid "Minimizes or restores the current window."
289msgid "Minimizes or restores the current window."
295−msgstr "Minimiza o restaura la ventana actual."
290+msgstr "Amenorga o restaura la ventana actual."
296
291
297#: qml/Components/KeyboardShortcutsOverlay.qml:331
292#: qml/Components/KeyboardShortcutsOverlay.qml:331
298msgid "Ctrl + Super + Left or Right"
293msgid "Ctrl + Super + Left or Right"
299−msgstr "Ctrl + Súper + Esquierda o Drecha"
294+msgstr "Ctrl + Super + Izquierda o Drecha"
300
295
301#: qml/Components/KeyboardShortcutsOverlay.qml:336
296#: qml/Components/KeyboardShortcutsOverlay.qml:336
302msgid "Semi-maximizes the current window."
297msgid "Semi-maximizes the current window."
303−msgstr ""
298+msgstr "Semi-maximiza la ventana actual."
304
299
305#: qml/Components/KeyboardShortcutsOverlay.qml:344
300#: qml/Components/KeyboardShortcutsOverlay.qml:344
306msgid "Alt + F4"
301msgid "Alt + F4"
@@ -308,11 +303,11 @@ msgstr "Alt + F4"
308
303
309#: qml/Components/KeyboardShortcutsOverlay.qml:349
304#: qml/Components/KeyboardShortcutsOverlay.qml:349
310msgid "Closes the current window."
305msgid "Closes the current window."
311−msgstr "Zarra toles ventanes actuales."
306+msgstr "Zarra la ventana actual."
312
307
313−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
314msgid "Return to Call"
309msgid "Return to Call"
315−msgstr ""
310+msgstr "Tornar a la llamada"
316
311
317#: qml/Components/Lockscreen.qml:212
312#: qml/Components/Lockscreen.qml:212
318msgid "Emergency Call"
313msgid "Emergency Call"
@@ -320,7 +315,7 @@ msgstr "Llamada d'emerxencia"
320
315
321#: qml/Components/Lockscreen.qml:245
316#: qml/Components/Lockscreen.qml:245
322msgid "OK"
317msgid "OK"
323−msgstr ""
318+msgstr "Aceutar"
324
319
325#: qml/Components/MediaServices/VideoPlayerControls.qml:44
320#: qml/Components/MediaServices/VideoPlayerControls.qml:44
326#, qt-format
321#, qt-format
@@ -334,25 +329,25 @@ msgstr "%1:%2"
334
329
335#: qml/Components/ModeSwitchWarningDialog.qml:33
330#: qml/Components/ModeSwitchWarningDialog.qml:33
336msgid "Apps may have unsaved data:"
331msgid "Apps may have unsaved data:"
337−msgstr "Aplicaciones con datos ensin guardar:"
332+msgstr "Apps que pueden tener datos sin guardar:"
338
333
339#: qml/Components/ModeSwitchWarningDialog.qml:60
334#: qml/Components/ModeSwitchWarningDialog.qml:60
340msgctxt ""
335msgctxt ""
341"Re-dock means connect the device again to an external screen/mouse/keyboard"
336"Re-dock means connect the device again to an external screen/mouse/keyboard"
342msgid "Re-dock, save your work and close these apps to continue."
337msgid "Re-dock, save your work and close these apps to continue."
343−msgstr ""
338+msgstr "Reconeuta, guarda'l trabayu y zarra eses apps pa siguir."
344
339
345#: qml/Components/ModeSwitchWarningDialog.qml:67
340#: qml/Components/ModeSwitchWarningDialog.qml:67
346msgid "Or force close now (unsaved data will be lost)."
341msgid "Or force close now (unsaved data will be lost)."
347−msgstr ""
342+msgstr "O fuerza salir agora (perderás tolos datos sin guardar)."
348
343
349#: qml/Components/ModeSwitchWarningDialog.qml:80
344#: qml/Components/ModeSwitchWarningDialog.qml:80
350msgid "OK, I will reconnect"
345msgid "OK, I will reconnect"
351−msgstr ""
346+msgstr "D'alcuerdu, reconeutaré"
352
347
353#: qml/Components/ModeSwitchWarningDialog.qml:81
348#: qml/Components/ModeSwitchWarningDialog.qml:81
354msgid "Reconnect now!"
349msgid "Reconnect now!"
355−msgstr ""
350+msgstr "Reconeutar agora."
356
351
357#: qml/Components/ModeSwitchWarningDialog.qml:94
352#: qml/Components/ModeSwitchWarningDialog.qml:94
358msgid "Close all"
353msgid "Close all"
@@ -360,33 +355,128 @@ msgstr "Zarrar too"
360
355
361#: qml/Components/SharingPicker.qml:54
356#: qml/Components/SharingPicker.qml:54
362msgid "Preview Share Item"
357msgid "Preview Share Item"
363−msgstr ""
358+msgstr "Entever l'elementu compartíu"
364
359
365#: qml/Components/VirtualTouchPad.qml:317
360#: qml/Components/VirtualTouchPad.qml:317
366msgid ""
361msgid ""
367"Your device is now connected to an external display. Use this screen as a "
362"Your device is now connected to an external display. Use this screen as a "
368"touch pad to interact with the pointer."
363"touch pad to interact with the pointer."
369msgstr ""
364msgstr ""
370−"Agora'l preséu ta coneutáu a una pantalla esterna. Usa esta pantalla como "
365+"El preséu agora ta coneutáu con una pantalla esterna. Usa esta pantalla como "
371−"panel táutil pa interactuar col punteru."
366+"touch pad pa interactuar col punteru."
372
367
373#: qml/Components/VirtualTouchPad.qml:327
368#: qml/Components/VirtualTouchPad.qml:327
374−#, fuzzy
375−#| msgid "Tap to return to call..."
376msgid "Tap left button to click."
369msgid "Tap left button to click."
377−msgstr "Toca pa volver a la llamada…"
370+msgstr "Calca nel botón esquierdu pa facer clic."
378
371
379#: qml/Components/VirtualTouchPad.qml:339
372#: qml/Components/VirtualTouchPad.qml:339
380msgid "Tap right button to right click."
373msgid "Tap right button to right click."
381−msgstr ""
374+msgstr "Calca nel botón drechu pa facer clic."
382
375
383#: qml/Components/VirtualTouchPad.qml:351
376#: qml/Components/VirtualTouchPad.qml:351
384msgid "Swipe with two fingers to scroll."
377msgid "Swipe with two fingers to scroll."
385−msgstr ""
378+msgstr "Esliza con dos deos pa desplazate."
386
379
387#: qml/Components/VirtualTouchPad.qml:396
380#: qml/Components/VirtualTouchPad.qml:396
388msgid "Find more settings in the system settings."
381msgid "Find more settings in the system settings."
389−msgstr ""
382+msgstr "Alcuentra más axustes nos Axustes del Sistema."
383+
384+#: qml/Dash/DashPageHeader.qml:361
385+msgctxt "Button: Open the Ubuntu Store"
386+msgid "Store"
387+msgstr "Tienda"
388+
389+#: qml/Dash/DashPageHeader.qml:368
390+msgctxt "Button: Start a search in the current dash scope"
391+msgid "Search"
392+msgstr "Guetar"
393+
394+#: qml/Dash/DashPageHeader.qml:378
395+msgctxt "Button: Show the current dash scope settings"
396+msgid "Settings"
397+msgstr "Axustes"
398+
399+#: qml/Dash/DashPageHeader.qml:385
400+msgid "Remove from Favorites"
401+msgstr "Desaniciar de favoritos"
402+
403+#: qml/Dash/DashPageHeader.qml:385
404+msgid "Add to Favorites"
405+msgstr "Amestar a favoritos"
406+
407+#: qml/Dash/FiltersPopover.qml:61
408+msgid "Refine your results"
409+msgstr "Refina los resultaos"
410+
411+#: qml/Dash/FiltersPopover.qml:70
412+msgid "Reset"
413+msgstr "Reafitar"
414+
415+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
416+msgid "Show less"
417+msgstr "Ver menos"
418+
419+#: qml/Dash/GenericScopeView.qml:547
420+msgid "Show all"
421+msgstr "Ver too"
422+
423+#: qml/Dash/GenericScopeView.qml:578
424+msgctxt "Label: Hint for dash search line edit"
425+msgid "Search"
426+msgstr "Guetar"
427+
428+#: qml/Dash/PageHeaderExtraPanel.qml:67
429+msgid "Recent Searches"
430+msgstr "Guetes recién"
431+
432+#: qml/Dash/PageHeaderExtraPanel.qml:78
433+msgid "Clear All"
434+msgstr "Llimpiar too"
435+
436+#: qml/Dash/Previews/PreviewActionCombo.qml:36
437+msgid "More..."
438+msgstr "Más…"
439+
440+#: qml/Dash/Previews/PreviewActionCombo.qml:36
441+msgid "Less..."
442+msgstr "Menos…"
443+
444+#: qml/Dash/Previews/PreviewCommentInput.qml:83
445+#: qml/Dash/Previews/PreviewRatingInput.qml:202
446+msgid "Send"
447+msgstr "Unviar"
448+
449+#: qml/Dash/Previews/PreviewRatingInput.qml:109
450+msgid "Rate this"
451+msgstr "Valorar esto"
452+
453+#: qml/Dash/Previews/PreviewRatingInput.qml:184
454+msgid "Add a review"
455+msgstr "Amestar una reseña"
456+
457+#: qml/Dash/PullToRefreshScopeStyle.qml:56
458+msgid "Pull to refresh…"
459+msgstr "Tira p'anovar..."
460+
461+#: qml/Dash/PullToRefreshScopeStyle.qml:61
462+msgid "Release to refresh…"
463+msgstr "Sueltar p'anovar..."
464+
465+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
466+msgid "Enable location data"
467+msgstr "Habilitar datos d'allugamientu"
468+
469+#: qml/Dash/ScopesList.qml:146
470+msgid "Manage"
471+msgstr "Xestionar"
472+
473+#: qml/Dash/ScopesList.qml:187
474+msgid "Home"
475+msgstr "Aniciu"
476+
477+#: qml/Dash/ScopesList.qml:188
478+msgid "Also installed"
479+msgstr "Tamién instalaos"
390
480
391#: qml/Greeter/CoverPage.qml:127
481#: qml/Greeter/CoverPage.qml:127
392msgid "Unlock"
482msgid "Unlock"
@@ -398,39 +488,33 @@ msgstr "Preséu bloquiáu"
398
488
399#: qml/Greeter/DelayedLockscreen.qml:58
489#: qml/Greeter/DelayedLockscreen.qml:58
400msgid "You have been locked out due to too many failed passphrase attempts."
490msgid "You have been locked out due to too many failed passphrase attempts."
401−msgstr ""
491+msgstr "Quedasti bloquiáu polos escesivos intentos fallíos de fras de pasu."
402−"Bloquióse'l preséu dempués d'introducir mal el códigu numbéricu milenta "
403−"vegaes."
404
492
405#: qml/Greeter/DelayedLockscreen.qml:59
493#: qml/Greeter/DelayedLockscreen.qml:59
406msgid "You have been locked out due to too many failed passcode attempts."
494msgid "You have been locked out due to too many failed passcode attempts."
407msgstr ""
495msgstr ""
408−"Bloquióse'l preséu dempués d'introducir mal la contraseña milenta vegaes."
496+"Quedasti bloquiáu polos escesivos intentos fallíos de códigu de pasu."
409
497
410#: qml/Greeter/DelayedLockscreen.qml:68
498#: qml/Greeter/DelayedLockscreen.qml:68
411#, qt-format
499#, qt-format
412msgid "Please wait %1 minute and then try again…"
500msgid "Please wait %1 minute and then try again…"
413msgid_plural "Please wait %1 minutes and then try again…"
501msgid_plural "Please wait %1 minutes and then try again…"
414−msgstr[0] "Espera %1 minutu y volvi tentalo darréu…"
502+msgstr[0] "Por favor, espera %1 minutu y vuelvi a intentalo…"
415−msgstr[1] "Espera %1 minutos y volvi tentalo darréu…"
503+msgstr[1] "Por favor, espera %1 minutos y vuelvi a intentalo…"
416
504
417#: qml/Greeter/Greeter.qml:550
505#: qml/Greeter/Greeter.qml:550
418msgid "Try again"
506msgid "Try again"
419−msgstr ""
507+msgstr "Tentar otra vuelta"
420
508
421#: qml/Greeter/Greeter.qml:551
509#: qml/Greeter/Greeter.qml:551
422−#, fuzzy
423−#| msgid "Enter passphrase"
424msgid "Enter passphrase to unlock"
510msgid "Enter passphrase to unlock"
425−msgstr "Introduz la fras de pasu"
511+msgstr ""
426
512
427#: qml/Greeter/Greeter.qml:552
513#: qml/Greeter/Greeter.qml:552
428−#, fuzzy
429−#| msgid "Enter passcode"
430msgid "Enter passcode to unlock"
514msgid "Enter passcode to unlock"
431−msgstr "Introduz el códigu de pasu"
515+msgstr ""
432
516
433−#: qml/Greeter/NarrowView.qml:235
517+#: qml/Greeter/NarrowView.qml:228
434msgid "Emergency"
518msgid "Emergency"
435msgstr "Emerxencia"
519msgstr "Emerxencia"
436
520
@@ -440,33 +524,32 @@ msgstr "Fras de pasu"
440
524
441#: qml/Greeter/PromptList.qml:126
525#: qml/Greeter/PromptList.qml:126
442msgid "Passcode"
526msgid "Passcode"
443−msgstr "Códigu numbéricu"
527+msgstr "Códigu de pasu"
444
528
445#: qml/Greeter/SessionsList.qml:124
529#: qml/Greeter/SessionsList.qml:124
446msgid "Select desktop environment"
530msgid "Select desktop environment"
447−msgstr ""
531+msgstr "Esbillar entornu d'escritoriu"
448
532
449−#: qml/Launcher/Drawer.qml:250
533+#: qml/Launcher/Drawer.qml:94
450−#, fuzzy
451−#| msgid "Search"
452msgid "Search…"
534msgid "Search…"
453−msgstr "Guetar"
535+msgstr "Guetar..."
454
536
455−#: qml/Launcher/PullToRefreshScopeStyle.qml:56
537+#: qml/Launcher/Drawer.qml:129
538+msgctxt "Apps sorted alphabetically"
456−msgid "Pull to refresh…"
539+msgid "A-Z"
457−msgstr "Tira pa refrescar…"
540+msgstr "A-Z"
458
541
459−#: qml/Launcher/PullToRefreshScopeStyle.qml:61
542+#: qml/Launcher/MoreAppsHeader.qml:55
460−msgid "Release to refresh…"
543+msgid "More apps in the store"
461−msgstr "Suelta pa refrescar…"
544+msgstr "Más aplicaciones na tienda"
462
545
463#: qml/Notifications/NotificationMenuItemFactory.qml:124
546#: qml/Notifications/NotificationMenuItemFactory.qml:124
464msgid "Show password"
547msgid "Show password"
465−msgstr "Amosar la contraseña"
548+msgstr "Amosar contraseña"
466
549
467#: qml/Panel/ActiveCallHint.qml:79
550#: qml/Panel/ActiveCallHint.qml:79
468msgid "Tap to return to call..."
551msgid "Tap to return to call..."
469−msgstr "Toca pa volver a la llamada…"
552+msgstr "Toca pa tornar a la llamada..."
470
553
471#: qml/Panel/ActiveCallHint.qml:92
554#: qml/Panel/ActiveCallHint.qml:92
472msgid "Conference"
555msgid "Conference"
@@ -474,7 +557,7 @@ msgstr "Conferencia"
474
557
475#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
558#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
476msgid "Nothing is playing"
559msgid "Nothing is playing"
477−msgstr "Nada en reproducción"
560+msgstr "Nun ta reproduciéndose nada"
478
561
479#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
562#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
480#, qt-format
563#, qt-format
@@ -505,11 +588,11 @@ msgstr "0 segundos"
505#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
588#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
506#, qt-format
589#, qt-format
507msgid "%1 remaining"
590msgid "%1 remaining"
508−msgstr "%1 restante(s)"
591+msgstr "Queden %1"
509
592
510#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
593#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
511msgid "In queue…"
594msgid "In queue…"
512−msgstr "Na cola…"
595+msgstr "Na cola..."
513
596
514#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
597#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
515msgid "Downloading"
598msgid "Downloading"
@@ -517,11 +600,11 @@ msgstr "Baxando"
517
600
518#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
601#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
519msgid "Paused, tap to resume"
602msgid "Paused, tap to resume"
520−msgstr "Posóse, toca pa siguir"
603+msgstr "Posáu, toca pa reanudar"
521
604
522#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
605#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
523msgid "Canceled"
606msgid "Canceled"
524−msgstr "Encaboxóse"
607+msgstr "Encaboxáu"
525
608
526#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
609#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
527msgid "Finished"
610msgid "Finished"
@@ -529,7 +612,7 @@ msgstr "Finó"
529
612
530#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
613#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
531msgid "Failed, tap to retry"
614msgid "Failed, tap to retry"
532−msgstr "Falló, toca pa retentar"
615+msgstr "Falló, toca pa reintentar"
533
616
534#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
617#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
535#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
618#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
@@ -540,88 +623,65 @@ msgstr "Unviar"
540#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
623#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
541msgctxt "Label: Hint in message indicator line edit"
624msgctxt "Label: Hint in message indicator line edit"
542msgid "Reply"
625msgid "Reply"
543−msgstr ""
626+msgstr "Responder"
544
627
545#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
628#: qml/Panel/Indicators/MessageMenuItemFactory.qml:209
546msgctxt "Button: Call back on phone"
629msgctxt "Button: Call back on phone"
547msgid "Call back"
630msgid "Call back"
548−msgstr "Rellamar"
631+msgstr "Devolver llamada"
549
632
550#: qml/Panel/PanelMenuPage.qml:92
633#: qml/Panel/PanelMenuPage.qml:92
551−#, fuzzy
552−#| msgctxt "Button: Go back one page in the Wizard"
553−#| msgid "Back"
554msgid "Back"
634msgid "Back"
555−msgstr "Atrás"
635+msgstr ""
556
636
557#: qml/Stage/SideStage.qml:76
637#: qml/Stage/SideStage.qml:76
558msgid "Drag using 3 fingers any application from one window to the other"
638msgid "Drag using 3 fingers any application from one window to the other"
559−msgstr "Arrastra con tres deos cualquier aplicación dende una ventana a otra"
639+msgstr "Abasnar cualquier aplicación d'una ventana a otra usando 3 deos"
560−
561−#: qml/Stage/Stage.qml:671
562−msgid "No running apps"
563−msgstr ""
564
640
565#: qml/Tutorial/TutorialLeftLong.qml:49
641#: qml/Tutorial/TutorialLeftLong.qml:49
566−#, fuzzy
567−#| msgid "Long swipe from the left edge to open the Today scope"
568msgid "Long swipe from the left edge to open the Application Drawer"
642msgid "Long swipe from the left edge to open the Application Drawer"
569−msgstr "Eslizamientu llargu dende'l berbesu esquierdu p'abrir l'ámbitu Güei"
643+msgstr ""
570
644
571#: qml/Tutorial/TutorialLeft.qml:47
645#: qml/Tutorial/TutorialLeft.qml:47
572msgid "Short swipe from the left edge to open the launcher"
646msgid "Short swipe from the left edge to open the launcher"
573−msgstr "Esliza dende'l berbesu esquierdu p'abrir el llanzador"
647+msgstr "Barríu curtiu dende'l berbesu izquierdu p'abrir el llanzador"
574
648
575−#: qml/Tutorial/TutorialRight.qml:54
649+#: qml/Tutorial/TutorialRight.qml:55
576msgid "Push your mouse against the right edge to view your open apps"
650msgid "Push your mouse against the right edge to view your open apps"
577−msgstr "Lleva'l mur al berbesu drechu pa ver les aplicaciones abiertes"
651+msgstr "Emburria'l mur escontra'l berbesu drechu pa ver les apps abiertes"
578
652
579−#: qml/Tutorial/TutorialRight.qml:55
653+#: qml/Tutorial/TutorialRight.qml:56
580msgid "Swipe from the right edge to view your open apps"
654msgid "Swipe from the right edge to view your open apps"
581−msgstr "Esliza dende'l berbesu drechu pa ver les aplicaciones abiertes"
655+msgstr "Barríu dende'l berbesu drechu pa ver les apps abiertes"
582
656
583#: qml/Tutorial/TutorialTop.qml:53
657#: qml/Tutorial/TutorialTop.qml:53
584msgid "Swipe from the top edge to access notifications and quick settings"
658msgid "Swipe from the top edge to access notifications and quick settings"
585−msgstr "Esliza dende'l berbesu cimeru p'acceder a los avisos y axustes rápidos"
659+msgstr ""
660+"Barríu dende'l berbesu superior pa tener accesu a los avisos y configuración "
661+"nel intre"
586
662
587−#: qml/Wizard/Page.qml:59
663+#: qml/Wizard/Page.qml:54
588msgctxt "Button: Go back one page in the Wizard"
664msgctxt "Button: Go back one page in the Wizard"
589msgid "Back"
665msgid "Back"
590−msgstr "Atrás"
666+msgstr "Atrás"
591
667
592−#: qml/Wizard/Pages/10-welcome.qml:29
668+#: qml/Wizard/Pages/10-welcome.qml:28
593msgid "Language"
669msgid "Language"
594msgstr "Llingua"
670msgstr "Llingua"
595
671
596−#: qml/Wizard/Pages/10-welcome.qml:176
672+#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
597−#: qml/Wizard/Pages/10-welcome-update.qml:126
673+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
598−#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
599−#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
674+#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
600−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
675+#: qml/Wizard/Pages/70-passwd-type.qml:145
676+#: qml/Wizard/Pages/75-report-check.qml:84
601−#: qml/Wizard/Pages/passcode-desktop.qml:154
677+#: qml/Wizard/Pages/passcode-desktop.qml:142
602−#: qml/Wizard/Pages/password-set.qml:153
678+#: qml/Wizard/Pages/password-set.qml:142
603msgid "Next"
679msgid "Next"
604msgstr "Siguiente"
680msgstr "Siguiente"
605
681
606−#: qml/Wizard/Pages/10-welcome-update.qml:91
607−msgid "Welcome to "
608−msgstr ""
609−
610−#: qml/Wizard/Pages/10-welcome-update.qml:106
611−msgid "We will make sure your device is ready to use "
612−msgstr "Vamos aseguranos de que'l preséu ta preparáu pa usase "
613−
614−#: qml/Wizard/Pages/11-changelog.qml:28
615−msgid "What's new"
616−msgstr "Qué hai nuevo"
617−
618−#: qml/Wizard/Pages/11-changelog.qml:74
619−msgid "Loading..."
620−msgstr "Cargando…"
621−
622#: qml/Wizard/Pages/20-keyboard.qml:31
682#: qml/Wizard/Pages/20-keyboard.qml:31
623msgid "Select Keyboard"
683msgid "Select Keyboard"
624−msgstr ""
684+msgstr "Escoyer tecláu"
625
685
626#: qml/Wizard/Pages/20-keyboard.qml:71
686#: qml/Wizard/Pages/20-keyboard.qml:71
627msgid "Keyboard language"
687msgid "Keyboard language"
@@ -631,203 +691,247 @@ msgstr "Llingua del tecláu"
631msgid "Keyboard layout"
691msgid "Keyboard layout"
632msgstr "Distribución del tecláu"
692msgstr "Distribución del tecláu"
633
693
634−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
694+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
635−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
636−#: qml/Wizard/Pages/sim.qml:101
695+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
637msgid "Skip"
696msgid "Skip"
638msgstr "Saltar"
697msgstr "Saltar"
639
698
640−#: qml/Wizard/Pages/30-wifi.qml:31
699+#: qml/Wizard/Pages/30-wifi.qml:30
641msgid "Connect to Wi‑Fi"
700msgid "Connect to Wi‑Fi"
642−msgstr "Conexón a una Wi-Fi"
701+msgstr "Coneutase al WiFi"
643
702
644−#: qml/Wizard/Pages/30-wifi.qml:139
703+#: qml/Wizard/Pages/30-wifi.qml:131
645msgid "Connected"
704msgid "Connected"
646−msgstr "Coneutóse"
705+msgstr "Coneutáu"
647
706
648−#: qml/Wizard/Pages/30-wifi.qml:172
707+#: qml/Wizard/Pages/30-wifi.qml:164
649msgid "Available Wi-Fi networks"
708msgid "Available Wi-Fi networks"
650msgstr "Redes Wi-Fi disponibles"
709msgstr "Redes Wi-Fi disponibles"
651
710
652−#: qml/Wizard/Pages/30-wifi.qml:173
711+#: qml/Wizard/Pages/30-wifi.qml:165
653msgid "No available Wi-Fi networks"
712msgid "No available Wi-Fi networks"
654msgstr "Nun hai redes Wi-Fi disponibles"
713msgstr "Nun hai redes Wi-Fi disponibles"
655
714
715+#: qml/Wizard/Pages/40-location.qml:27
716+msgid "Location Services"
717+msgstr "Servicios d'allugamientu"
718+
719+#: qml/Wizard/Pages/40-location.qml:83
720+msgid ""
721+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
722+"(recommended)"
723+msgstr ""
724+"Usar GPS, puntos Wi-Fi y redes móviles de mou anónimu pa detectar "
725+"l'allugamientu (recomendao)"
726+
727+#: qml/Wizard/Pages/40-location.qml:105
728+#, qt-format
729+msgid "By selecting this option you agree to the Nokia HERE %1."
730+msgstr "Seleicionando esta opción aceutes los %1 de Nokia HERE."
731+
732+#: qml/Wizard/Pages/40-location.qml:106
733+msgctxt "part of: Nokia HERE terms and conditions"
734+msgid "terms and conditions"
735+msgstr "términos y condiciones"
736+
737+#: qml/Wizard/Pages/40-location.qml:160
738+msgid "GPS only"
739+msgstr "Sólo GPS"
740+
741+#: qml/Wizard/Pages/40-location.qml:214
742+msgid "Don't use my location"
743+msgstr "Nun usar l'allugamientu"
744+
745+#: qml/Wizard/Pages/40-location.qml:260
746+msgid "You can change it later in System Settings."
747+msgstr "Pues camudalo sero na Configuración del Sistema."
748+
656#: qml/Wizard/Pages/50-timezone.qml:30
749#: qml/Wizard/Pages/50-timezone.qml:30
657msgid "Time Zone"
750msgid "Time Zone"
658−msgstr "Fusu horariu"
751+msgstr "Estaya horaria"
659
752
660−#: qml/Wizard/Pages/50-timezone.qml:183
753+#: qml/Wizard/Pages/50-timezone.qml:182
661msgid "Enter your city"
754msgid "Enter your city"
662−msgstr "Introduz la to ciudá"
755+msgstr "Escribe la ciudá"
663
756
664#: qml/Wizard/Pages/60-account.qml:24
757#: qml/Wizard/Pages/60-account.qml:24
665msgid "Personalize Your Device"
758msgid "Personalize Your Device"
666−msgstr "Personalización del preséu"
759+msgstr "Personaliza'l preséu"
667
760
668−#: qml/Wizard/Pages/60-account.qml:54
761+#: qml/Wizard/Pages/60-account.qml:48
669msgid "Preferred Name"
762msgid "Preferred Name"
670msgstr "Nome preferíu"
763msgstr "Nome preferíu"
671
764
672#: qml/Wizard/Pages/70-passwd-type.qml:40
765#: qml/Wizard/Pages/70-passwd-type.qml:40
673msgid "Lock Screen"
766msgid "Lock Screen"
674−msgstr "Pantalla de bloquéu"
767+msgstr "Bloquiar pantalla"
675
768
676−#: qml/Wizard/Pages/70-passwd-type.qml:103
769+#: qml/Wizard/Pages/70-passwd-type.qml:102
677msgctxt "Label: Type of security method"
770msgctxt "Label: Type of security method"
678msgid "Create new password"
771msgid "Create new password"
679−msgstr "Crear una contraseña"
772+msgstr "Crear contraseña nueva"
680
773
681−#: qml/Wizard/Pages/70-passwd-type.qml:105
774+#: qml/Wizard/Pages/70-passwd-type.qml:104
682msgctxt "Label: Type of security method"
775msgctxt "Label: Type of security method"
683msgid "Create passcode (numbers only)"
776msgid "Create passcode (numbers only)"
684−msgstr "Crear un códigu numbéricu"
777+msgstr "Crear códigu d'accesu (sólo númberos)"
685
778
686−#: qml/Wizard/Pages/70-passwd-type.qml:107
779+#: qml/Wizard/Pages/70-passwd-type.qml:106
687msgctxt "Label: Type of security method"
780msgctxt "Label: Type of security method"
688msgid "No lock code"
781msgid "No lock code"
689−msgstr "Nada"
782+msgstr "Ensin códigu de bloquéu"
690−
691−#: qml/Wizard/Pages/79-system-update.qml:28
692−msgid "Update Device"
693−msgstr ""
694
783
695−#: qml/Wizard/Pages/79-system-update.qml:55
784+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
696−msgid ""
785+msgid "Privacy Policy"
697−"There is a system update available and ready to install. Afterwards, the "
786+msgstr "Política d'intimidá"
698−"device will automatically restart."
699−msgstr ""
700−"Hai un anovamientu del sistema disponible y preparáu pa instalase. Dempués, "
701−"el preséu va reaniciase automáticamente."
702−
703−#: qml/Wizard/Pages/79-system-update.qml:76
704−#, fuzzy
705−#| msgctxt "string identifying name of the update"
706−#| msgid "Ubuntu system"
707−msgctxt "string identifying name of the update"
708−msgid "Ubuntu Touch system"
709−msgstr "Sistema Ubuntu"
710−
711−#: qml/Wizard/Pages/79-system-update.qml:83
712−#, qt-format
713−msgctxt "version of the system update"
714−msgid "Version %1"
715−msgstr "Versión %1"
716
787
717−#: qml/Wizard/Pages/79-system-update.qml:95
788+#: qml/Wizard/Pages/75-report-check.qml:26
718−msgid "This could take a few minutes..."
789+msgid "Help Us Improve"
719−msgstr "Esto podría tardar unos minutos…"
790+msgstr "Ayúdanos a meyorar"
720
791
721−#: qml/Wizard/Pages/79-system-update.qml:109
792+#: qml/Wizard/Pages/75-report-check.qml:59
722−msgid "Install and restart now"
793+msgid "Improve system performance by sending us crashes and error reports."
723msgstr ""
794msgstr ""
795+"Ameyora'l rindimientu del sistema unviándonos los informes d'errores y "
796+"cuelgues."
724
797
725−#: qml/Wizard/Pages/80-finished.qml:91
798+#: qml/Wizard/Pages/75-report-check.qml:60
726−msgid "Welcome Back"
799+msgid "Privacy policy"
727−msgstr "Volvi afayate"
800+msgstr "Política d'intimidá"
728
801
729−#: qml/Wizard/Pages/80-finished.qml:91
802+#: qml/Wizard/Pages/80-finished.qml:89
730msgid "Welcome to Ubuntu"
803msgid "Welcome to Ubuntu"
731−msgstr "Afáyate n'Ubuntu"
804+msgstr "Bienveníu/a a Ubuntu"
732
805
733−#: qml/Wizard/Pages/80-finished.qml:106
806+#: qml/Wizard/Pages/80-finished.qml:104
734msgid "You are ready to use your device now"
807msgid "You are ready to use your device now"
735−msgstr "Agora tas preparáu pa usar el preséu"
808+msgstr "Ya tas preparáu pa usar el preséu"
736−
737−#: qml/Wizard/Pages/80-finished.qml:126
738−msgid "Continue"
739−msgstr "Siguir"
740
809
741−#: qml/Wizard/Pages/80-finished.qml:126
810+#: qml/Wizard/Pages/80-finished.qml:124
742msgid "Get Started"
811msgid "Get Started"
743−msgstr "Entamar"
812+msgstr "Primeros pasos"
813+
814+#: qml/Wizard/Pages/here-terms.qml:25
815+msgid "Terms & Conditions"
816+msgstr "Términos y condiciones"
817+
818+#: qml/Wizard/Pages/here-terms.qml:69
819+msgid "Your device uses positioning technologies provided by HERE."
820+msgstr "El preséu usa teunoloxíes de posición qu'ufre HERE."
821+
822+#: qml/Wizard/Pages/here-terms.qml:81
823+msgid ""
824+"To provide you with positioning services and to improve their quality, HERE "
825+"collects information about nearby cell towers and Wi-Fi hotspots around your "
826+"current location whenever your position is being found."
827+msgstr ""
828+"Pa ufrir los servicios de posición y ameyorar la so calidá, HERE collecha "
829+"información de les antenes celulares y puntos d'accesu Wi-Fi cercanos al to "
830+"allugamientu actual siempre que se conoza la to posición."
831+
832+#: qml/Wizard/Pages/here-terms.qml:93
833+msgid ""
834+"The information collected is used to analyze the service and to improve the "
835+"use of service, but not to identify you personally."
836+msgstr ""
837+"La información collechada úsase p'analizar el serviciu y ameyorar l'usu del "
838+"serviciu, non pa identificate personalmente."
839+
840+#: qml/Wizard/Pages/here-terms.qml:106
841+#, qt-format
842+msgid "By continuing, you agree to the HERE platform %1 and %2."
843+msgstr "Al siguir, aceutes %1 y %2 de la plataforma HERE."
844+
845+#: qml/Wizard/Pages/here-terms.qml:107
846+msgid "Service Terms"
847+msgstr "Términos del serviciu"
744
848
745#: qml/Wizard/Pages/passcode-confirm.qml:43
849#: qml/Wizard/Pages/passcode-confirm.qml:43
746−#: qml/Wizard/Pages/passcode-desktop.qml:104
850+#: qml/Wizard/Pages/passcode-desktop.qml:97
747msgid "Confirm passcode"
851msgid "Confirm passcode"
748−msgstr "Confirmación"
852+msgstr "Confirmar códigu de pasu"
749
853
750#: qml/Wizard/Pages/passcode-confirm.qml:45
854#: qml/Wizard/Pages/passcode-confirm.qml:45
751msgid "Incorrect passcode."
855msgid "Incorrect passcode."
752−msgstr "El códigu numbéricu ye incorreutu."
856+msgstr "Códigu de pasu incorreutu."
753
857
754#: qml/Wizard/Pages/passcode-confirm.qml:45
858#: qml/Wizard/Pages/passcode-confirm.qml:45
755msgctxt "Enter the passcode again"
859msgctxt "Enter the passcode again"
756msgid "Please re-enter."
860msgid "Please re-enter."
757−msgstr "Volvi introducilu."
861+msgstr "Vuelve a escribilu."
758
862
759#: qml/Wizard/Pages/passcode-desktop.qml:31
863#: qml/Wizard/Pages/passcode-desktop.qml:31
760msgid "Lock Screen Passcode"
864msgid "Lock Screen Passcode"
761−msgstr "Códigu numbéricu de la pantalla de bloquéu"
865+msgstr "Códigu de pasu de bloquéu de pantalla"
762
866
763−#: qml/Wizard/Pages/passcode-desktop.qml:68
867+#: qml/Wizard/Pages/passcode-desktop.qml:61
764msgid "Enter 4 numbers to setup your passcode"
868msgid "Enter 4 numbers to setup your passcode"
765−msgstr "Introduz 4 númberos pa configurar el códigu numbéricu"
869+msgstr "Escribi 4 númberos pa configurar el códigu de pasu"
766
870
767−#: qml/Wizard/Pages/passcode-desktop.qml:84
871+#: qml/Wizard/Pages/passcode-desktop.qml:77
768#: qml/Wizard/Pages/passcode-set.qml:54
872#: qml/Wizard/Pages/passcode-set.qml:54
769msgid "Choose passcode"
873msgid "Choose passcode"
770−msgstr "Códigu numbéricu"
874+msgstr "Escueyi'l códigu de pasu"
771
875
772−#: qml/Wizard/Pages/passcode-desktop.qml:139
876+#: qml/Wizard/Pages/passcode-desktop.qml:127
773msgid "Passcode too short"
877msgid "Passcode too short"
774−msgstr "El códigu numbéricu ye percurtiu"
878+msgstr "Códigu de pasu curtiu enforma"
775
879
776−#: qml/Wizard/Pages/passcode-desktop.qml:141
880+#: qml/Wizard/Pages/passcode-desktop.qml:129
777msgid "Passcodes match"
881msgid "Passcodes match"
778−msgstr "Los códigos numbéricos concasen"
882+msgstr "Los códigos de pasu casen"
779
883
780−#: qml/Wizard/Pages/passcode-desktop.qml:143
884+#: qml/Wizard/Pages/passcode-desktop.qml:131
781msgid "Passcodes do not match"
885msgid "Passcodes do not match"
782−msgstr "Los códigos numbéricos nun concasen"
886+msgstr "Los códigos de pasu nun casen"
783
887
784#: qml/Wizard/Pages/passcode-set.qml:62
888#: qml/Wizard/Pages/passcode-set.qml:62
785msgid "Passcode must be 4 characters long"
889msgid "Passcode must be 4 characters long"
786−msgstr "El códigu numbéricu a ser de 4 caráuteres"
890+msgstr "El códigu de pasu tien de tener 4 caráuteres de llargo"
787
891
788#: qml/Wizard/Pages/password-set.qml:31
892#: qml/Wizard/Pages/password-set.qml:31
789msgid "Lock Screen Password"
893msgid "Lock Screen Password"
790−msgstr "Contraseña de la pantalla de bloquéu"
894+msgstr "Contraseña del Bloquéu de pantalla"
791
895
792−#: qml/Wizard/Pages/password-set.qml:68
896+#: qml/Wizard/Pages/password-set.qml:62
793msgid "Enter at least 8 characters"
897msgid "Enter at least 8 characters"
794−msgstr "Introduz 8 caráuteres polo menos"
898+msgstr "Escribe polo menos 8 caráuteres"
795
899
796−#: qml/Wizard/Pages/password-set.qml:80
900+#: qml/Wizard/Pages/password-set.qml:74
797msgid "Choose password"
901msgid "Choose password"
798−msgstr "Contraseña"
902+msgstr "Escueye la contraseña"
799
903
800−#: qml/Wizard/Pages/password-set.qml:110
904+#: qml/Wizard/Pages/password-set.qml:104
801msgid "Confirm password"
905msgid "Confirm password"
802−msgstr "Confirmación"
906+msgstr "Confirmar contraseña"
803
907
804#: qml/Wizard/Pages/sim.qml:27
908#: qml/Wizard/Pages/sim.qml:27
805msgid "No SIM card installed"
909msgid "No SIM card installed"
806−msgstr "Nun s'instaló denguna tarxeta SIM"
910+msgstr "Nun ta instalada nenguna tarxeta SIM"
807
911
808#: qml/Wizard/Pages/sim.qml:54
912#: qml/Wizard/Pages/sim.qml:54
809msgid "SIM card added"
913msgid "SIM card added"
810−msgstr ""
914+msgstr "Amestóse tarxeta SIM"
811
915
812#: qml/Wizard/Pages/sim.qml:55
916#: qml/Wizard/Pages/sim.qml:55
813msgid "You must restart the device to access the mobile network."
917msgid "You must restart the device to access the mobile network."
814−msgstr "Has reaniciar el preséu p'acceder a la rede móvil."
918+msgstr "Tienes de reaniciar el preséu pa tener accesu a la rede móvil."
815
919
816#: qml/Wizard/Pages/sim.qml:59
920#: qml/Wizard/Pages/sim.qml:59
817msgid "Restart"
921msgid "Restart"
818−msgstr ""
922+msgstr "Reaniciar"
819
923
820#: qml/Wizard/Pages/sim.qml:78
924#: qml/Wizard/Pages/sim.qml:78
821msgid "You won’t be able to make calls or use text messaging without a SIM."
925msgid "You won’t be able to make calls or use text messaging without a SIM."
822−msgstr "Nun vas ser a facer llamaes o unviar SMS ensin una SIM."
926+msgstr "Nun podrás facer llamaes nin usar mensaxería de testu sin una SIM."
823
927
824#: qml/Wizard/Pages/sim.qml:90
928#: qml/Wizard/Pages/sim.qml:90
825msgid "To proceed with no SIM tap Skip."
929msgid "To proceed with no SIM tap Skip."
826−msgstr "Pa siguir ensin una tarxeta SIM toca Saltar."
930+msgstr "Pa siguir ensin SIM toca Saltar."
827
931
828#: qml/Wizard/PasswordMeter.qml:87
932#: qml/Wizard/PasswordMeter.qml:87
829msgid "Password too short"
933msgid "Password too short"
830−msgstr "La contraseña ye percurtia"
934+msgstr "Contraseña curtia enforma"
831
935
832#: qml/Wizard/PasswordMeter.qml:89
936#: qml/Wizard/PasswordMeter.qml:89
833msgid "Passwords match"
937msgid "Passwords match"
@@ -839,11 +943,11 @@ msgstr "Les contraseñes nun concasen"
839
943
840#: qml/Wizard/PasswordMeter.qml:95
944#: qml/Wizard/PasswordMeter.qml:95
841msgid "Strong password"
945msgid "Strong password"
842−msgstr "Contraseña perbona"
946+msgstr "Contraseña fuerte"
843
947
844#: qml/Wizard/PasswordMeter.qml:97
948#: qml/Wizard/PasswordMeter.qml:97
845msgid "Fair password"
949msgid "Fair password"
846−msgstr "Contraseña bona"
950+msgstr "Contraseña aceutable"
847
951
848#: qml/Wizard/PasswordMeter.qml:99
952#: qml/Wizard/PasswordMeter.qml:99
849msgid "Weak password"
953msgid "Weak password"
@@ -851,185 +955,7 @@ msgstr "Contraseña feble"
851
955
852#: qml/Wizard/PasswordMeter.qml:101
956#: qml/Wizard/PasswordMeter.qml:101
853msgid "Very weak password"
957msgid "Very weak password"
854−msgstr "Contraseña perfeble"
958+msgstr "Contraseña feble enforma"
855−
856−#~ msgid "Unity 8"
857−#~ msgstr "Unity 8"
858−
859−#~ msgid "Scopes"
860−#~ msgstr "Ámbitos"
861−
862−#~ msgid "Super (Tap)"
863−#~ msgstr "Súper (Toque)"
864−
865−#~ msgid "Opens the Scopes home."
866−#~ msgstr "Abre l'aniciu d'Ámbitos."
867−
868−#~ msgctxt "Button: Open the Ubuntu Store"
869−#~ msgid "Store"
870−#~ msgstr "Tienda"
871−
872−#~ msgctxt "Button: Start a search in the current dash scope"
873−#~ msgid "Search"
874−#~ msgstr "Guetar"
875−
876−#~ msgctxt "Button: Show the current dash scope settings"
877−#~ msgid "Settings"
878−#~ msgstr "Axustes"
879−
880−#~ msgid "Show less"
881−#~ msgstr "Amosar menos"
882−
883−#~ msgid "Show all"
884−#~ msgstr "Amosar too"
885−
886−#~ msgid "Recent Searches"
887−#~ msgstr "Guetes d'apocayá"
888−
889−#~ msgid "Clear All"
890−#~ msgstr "Llimpiar too"
891−
892−#~ msgid "More..."
893−#~ msgstr "Más…"
894−
895−#~ msgid "Less..."
896−#~ msgstr "Menos…"
897−
898−#~ msgid "Manage"
899−#~ msgstr "Xestión"
900−
901−#~ msgid "Home"
902−#~ msgstr "Aniciu"
903−
904−#~ msgid "Also installed"
905−#~ msgstr "Tamién s'instaló"
906−
907−#~ msgid "Privacy Policy"
908−#~ msgstr "Política de privacidá"
909−
910−#~ msgid "Help Us Improve"
911−#~ msgstr "Ayúdanos a ameyorar"
912−
913−#~ msgid "Improve system performance by sending us crashes and error reports."
914−#~ msgstr ""
915−#~ "Ameyora'l rindimientu del sistema unviándonos informes de casques y "
916−#~ "fallos."
917−
918−#~ msgid "Privacy policy"
919−#~ msgstr "Política de privacidá"
920−
921−#~ msgid "This device is not connected to the internet."
922−#~ msgstr "El preséu nun ta coneutáu a internet."
923−
924−#~ msgid "Software is up to date"
925−#~ msgstr "El software ta anováu"
926−
927−#~ msgid "The update server is not responding."
928−#~ msgstr "El sirvidor d'anovamientos nun ta respondiendo."
929−
930−#~ msgid "Please wait..."
931−#~ msgstr "Espera…"
932−
933−#~ msgid "Installation failed"
934−#~ msgstr "Falló la instalación"
935−
936−#~ msgid "Checking for updates…"
937−#~ msgstr "Comprobando anovamientos…"
938−
939−#~ msgid "%1 update available"
940−#~ msgid_plural "%1 updates available"
941−#~ msgstr[0] "%1 anovamientu disponible"
942−#~ msgstr[1] "%1 anovamientos disponibles"
943−
944−#~ msgid "Update all…"
945−#~ msgstr "Anovar too…"
946−
947−#~ msgid "Update all"
948−#~ msgstr "Anovar too"
949−
950−#~ msgid "Resume"
951−#~ msgstr "Siguir"
952−
953−#~ msgid "Install…"
954−#~ msgstr "Instalar…"
955−
956−#~ msgid "Open"
957−#~ msgstr "Abrir"
958−
959−#~ msgid "Installing"
960−#~ msgstr "Instalando"
961−
962−#~ msgid "Paused"
963−#~ msgstr "Posóse"
964−
965−#~ msgid "Waiting to download"
966−#~ msgstr "Esperando pola descarga"
967−
968−#~ msgid "%1 of %2"
969−#~ msgstr "%1 de %2"
970−
971−#~ msgid "Downloaded"
972−#~ msgstr "Baxó"
973−
974−#~ msgid "Installed"
975−#~ msgstr "Instalóse"
976−
977−#~ msgid "Updated %1"
978−#~ msgstr "Anovóse %1"
979−
980−#~ msgid "Location Services"
981−#~ msgstr "Servicios d'allugamientu"
982−
983−#~ msgid ""
984−#~ "Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
985−#~ "(recommended)"
986−#~ msgstr ""
987−#~ "Usar GPS, puntos Wi-Fi y redes móviles de mou anónimu pa detectar "
988−#~ "l'allugamientu (recomendao)"
989−
990−#~ msgid "By selecting this option you agree to the Nokia HERE %1."
991−#~ msgstr "Seleicionando esta opción aceutes los %1 de Nokia HERE."
992−
993−#~ msgctxt "part of: Nokia HERE terms and conditions"
994−#~ msgid "terms and conditions"
995−#~ msgstr "términos y condiciones"
996−
997−#~ msgid "GPS only"
998−#~ msgstr "Sólo GPS"
999−
1000−#~ msgid "Don't use my location"
1001−#~ msgstr "Nun usar l'allugamientu"
1002−
1003−#~ msgid "You can change it later in System Settings."
1004−#~ msgstr "Pues camudalo sero na Configuración del Sistema."
1005−
1006−#~ msgid "Terms & Conditions"
1007−#~ msgstr "Términos y condiciones"
1008−
1009−#~ msgid "Your device uses positioning technologies provided by HERE."
1010−#~ msgstr "El preséu usa teunoloxíes de posición qu'ufre HERE."
1011−
1012−#~ msgid ""
1013−#~ "To provide you with positioning services and to improve their quality, "
1014−#~ "HERE collects information about nearby cell towers and Wi-Fi hotspots "
1015−#~ "around your current location whenever your position is being found."
1016−#~ msgstr ""
1017−#~ "Pa ufrir los servicios de posición y ameyorar la so calidá, HERE collecha "
1018−#~ "información de les antenes celulares y puntos d'accesu Wi-Fi cercanos al "
1019−#~ "to allugamientu actual siempre que se conoza la to posición."
1020−
1021−#~ msgid ""
1022−#~ "The information collected is used to analyze the service and to improve "
1023−#~ "the use of service, but not to identify you personally."
1024−#~ msgstr ""
1025−#~ "La información collechada úsase p'analizar el serviciu y ameyorar l'usu "
1026−#~ "del serviciu, non pa identificate personalmente."
1027−
1028−#~ msgid "By continuing, you agree to the HERE platform %1 and %2."
1029−#~ msgstr "Al siguir, aceutes %1 y %2 de la plataforma HERE."
1030−
1031−#~ msgid "Service Terms"
1032−#~ msgstr "Términos del serviciu"
1033
959
1034#~ msgid "Skip intro"
960#~ msgid "Skip intro"
1035#~ msgstr "Omitir la intro"
961#~ msgstr "Omitir la intro"
@@ -1057,8 +983,8 @@ msgstr "Contraseña perfeble"
1057
983
1058#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
984#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
1059#~ msgstr ""
985#~ msgstr ""
1060−#~ "Esliza'l deu dende la esquierda p'amosar el llanzador y acceder "
986+#~ "Esliza'l deu dende la esquierda p'amosar el llanzador y acceder rápidamente "
1061−#~ "rápidamente a les aplicaciones"
987+#~ "a les aplicaciones"
1062
988
1063#~ msgid "Well done"
989#~ msgid "Well done"
1064#~ msgstr "Bien fecho"
990#~ msgstr "Bien fecho"
@@ -1066,12 +992,21 @@ msgstr "Contraseña perfeble"
1066#~ msgid "Confirm"
992#~ msgid "Confirm"
1067#~ msgstr "Confirmar"
993#~ msgstr "Confirmar"
1068
994
995+#~ msgid "Speaking..."
996+#~ msgstr "Falando…"
997+
998+#~ msgid "Loading. Please Wait..."
999+#~ msgstr "Cargando, espera…"
1000+
1069#~ msgid "Type or say a command"
1001#~ msgid "Type or say a command"
1070#~ msgstr "Escribi o di una orde"
1002#~ msgstr "Escribi o di una orde"
1071
1003
1072#~ msgid "Speak Now..."
1004#~ msgid "Speak Now..."
1073#~ msgstr "Fala agora…"
1005#~ msgstr "Fala agora…"
1074
1006
1007+#~ msgid "Search"
1008+#~ msgstr "Guetar"
1009+
1075#~ msgid "See less"
1010#~ msgid "See less"
1076#~ msgstr "Ver menos"
1011#~ msgstr "Ver menos"
1077
1012
@@ -1118,6 +1053,7 @@ msgstr "Contraseña perfeble"
1118#~ msgid "Store"
1053#~ msgid "Store"
1119#~ msgstr "Tienda"
1054#~ msgstr "Tienda"
1120
1055
1056+#, qt-format
1121#~ msgid "Sorry, incorrect %1"
1057#~ msgid "Sorry, incorrect %1"
1122#~ msgstr "Sentímoslo, %1 incorreutu"
1058#~ msgstr "Sentímoslo, %1 incorreutu"
1123
1059
@@ -1133,6 +1069,9 @@ msgstr "Contraseña perfeble"
1133#~ msgid "Manage Scopes"
1069#~ msgid "Manage Scopes"
1134#~ msgstr "Xestionar ámbitos"
1070#~ msgstr "Xestionar ámbitos"
1135
1071
1072+#~ msgid "Continue"
1073+#~ msgstr "Siguir"
1074+
1136#~ msgid "Without it, you won’t be able to make calls or use text messaging."
1075#~ msgid "Without it, you won’t be able to make calls or use text messaging."
1137#~ msgstr "Ensin ella, nun vas poder facer llamaes nin unviar mensaxes."
1076#~ msgstr "Ensin ella, nun vas poder facer llamaes nin unviar mensaxes."
1138
1077
@@ -1164,12 +1103,17 @@ msgstr "Contraseña perfeble"
1164#~ msgid "Not at all"
1103#~ msgid "Not at all"
1165#~ msgstr "De nengún mou"
1104#~ msgstr "De nengún mou"
1166
1105
1106+#, qt-format
1167#~ msgid "〈 %1"
1107#~ msgid "〈 %1"
1168#~ msgstr "〈 %1"
1108#~ msgstr "〈 %1"
1169
1109
1110+#, qt-format
1170#~ msgid "%1 〉"
1111#~ msgid "%1 〉"
1171#~ msgstr "%1 〉"
1112#~ msgstr "%1 〉"
1172
1113
1114+#~ msgid "Open the launcher"
1115+#~ msgstr "Abrir el llanzador"
1116+
1173#~ msgid "Tap here to continue."
1117#~ msgid "Tap here to continue."
1174#~ msgstr "Toca equí pa siguir."
1118#~ msgstr "Toca equí pa siguir."
1175
1119
@@ -1210,28 +1154,35 @@ msgstr "Contraseña perfeble"
1210#~ msgid "Sorry, incorrect passphrase."
1154#~ msgid "Sorry, incorrect passphrase."
1211#~ msgstr "Perdón, fras de pasu incorreuta"
1155#~ msgstr "Perdón, fras de pasu incorreuta"
1212
1156
1157+#, qt-format
1213#~ msgid "Enter %1"
1158#~ msgid "Enter %1"
1214#~ msgstr "Introduz %1"
1159#~ msgstr "Introduz %1"
1215
1160
1216#~ msgid "Sorry, incorrect passcode."
1161#~ msgid "Sorry, incorrect passcode."
1217#~ msgstr "Perdón, códigu de pasu incorreutu."
1162#~ msgstr "Perdón, códigu de pasu incorreutu."
1218
1163
1164+#~ msgid "Enter passcode"
1165+#~ msgstr "Introduz el códigu de pasu"
1166+
1167+#~ msgid "Enter passphrase"
1168+#~ msgstr "Introduz la fras de pasu"
1169+
1219#~ msgid "Please re-enter"
1170#~ msgid "Please re-enter"
1220#~ msgstr "Por favor, reintroduzla"
1171#~ msgstr "Por favor, reintroduzla"
1221
1172
1222#~ msgid ""
1173#~ msgid ""
1223−#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1174+#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1224−#~ "reset and all personal data will be deleted."
1175+#~ "and all personal data will be deleted."
1225#~ msgstr ""
1176#~ msgstr ""
1226−#~ "Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va "
1177+#~ "Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va reafitase y "
1227−#~ "reafitase y van desaniciase tolos datos personales."
1178+#~ "van desaniciase tolos datos personales."
1228
1179
1229#~ msgid ""
1180#~ msgid ""
1230#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1181#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1231#~ "reset and all personal data will be deleted."
1182#~ "reset and all personal data will be deleted."
1232#~ msgstr ""
1183#~ msgstr ""
1233−#~ "Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase "
1184+#~ "Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase y "
1234−#~ "y van desaniciase tolos datos personales."
1185+#~ "van desaniciase tolos datos personales."
1235
1186
1236#~ msgid "This will be your last attempt."
1187#~ msgid "This will be your last attempt."
1237#~ msgstr "Esti sedra'l to caberu intentu"
1188#~ msgstr "Esti sedra'l to caberu intentu"
@@ -1315,11 +1266,11 @@ msgstr "Contraseña perfeble"
1315#~ msgstr "¡Bon trabayu!"
1266#~ msgstr "¡Bon trabayu!"
1316
1267
1317#~ msgid ""
1268#~ msgid ""
1318−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1269+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1319−#~ "and conditions</a>."
1270+#~ "conditions</a>."
1320#~ msgstr ""
1271#~ msgstr ""
1321−#~ "Esbillando esta opción aceutes los <a href='#'>términos y condiciones</a> "
1272+#~ "Esbillando esta opción aceutes los <a href='#'>términos y condiciones</a> de "
1322−#~ "de Nokia HERE."
1273+#~ "Nokia HERE."
1323
1274
1324#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1275#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1325#~ msgstr ""
1276#~ msgstr ""
@@ -1398,11 +1349,44 @@ msgstr "Contraseña perfeble"
1398
1349
1399#~ msgid "Short or long swipe from the right edge to view your open apps"
1350#~ msgid "Short or long swipe from the right edge to view your open apps"
1400#~ msgstr ""
1351#~ msgstr ""
1401−#~ "Eslizamientu curtiu o llargu dende'l berbesu drechu pa ver les apps "
1352+#~ "Eslizamientu curtiu o llargu dende'l berbesu drechu pa ver les apps abiertes"
1402−#~ "abiertes"
1403
1353
1404#~ msgid "Swipe up to manage the app"
1354#~ msgid "Swipe up to manage the app"
1405#~ msgstr "Eslizar p'alministrar la app"
1355#~ msgstr "Eslizar p'alministrar la app"
1406
1356
1407#~ msgid "Swipe up to create a message"
1357#~ msgid "Swipe up to create a message"
1408#~ msgstr "Eslizar pa crear un mensaxe"
1358#~ msgstr "Eslizar pa crear un mensaxe"
1359+
1360+#~ msgid "Long swipe from the left edge to open the Today scope"
1361+#~ msgstr "Eslizamientu llargu dende'l berbesu izquierdu pa ver el scope Güei"
1362+
1363+#~ msgid "Takes a screenshot of a window."
1364+#~ msgstr "Saca una imaxe d'una ventana."
1365+
1366+#~ msgid "Super + 0 to 9"
1367+#~ msgstr "Super + 0 a 9"
1368+
1369+#~ msgid "Install and restart now"
1370+#~ msgstr "Instalar y reaniciar agora"
1371+
1372+#~ msgid "This could take a few minutes..."
1373+#~ msgstr "Esto podría tardar dellos minutos..."
1374+
1375+#, qt-format
1376+#~ msgctxt "version of the system update"
1377+#~ msgid "Version %1"
1378+#~ msgstr "Versión %1"
1379+
1380+#~ msgctxt "string identifying name of the update"
1381+#~ msgid "Ubuntu system"
1382+#~ msgstr "Sistema Ubuntu"
1383+
1384+#~ msgid "Update Device"
1385+#~ msgstr "Anovar preséu"
1386+
1387+#~ msgid ""
1388+#~ "There is a system update available and ready to install. Afterwards, the "
1389+#~ "device will automatically restart."
1390+#~ msgstr ""
1391+#~ "Hai un anovamientu del sistema disponible y preparáu pa instalar. Darréu, el "
1392+#~ "preséu reaniciará de mou automáticu."
po/az.po+260−161
@@ -6,40 +6,39 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: \n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2021-01-29 11:42-0600\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
14−"Language: az\n"
15"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20−"X-Generator: Launchpad (build 18269)\n"
19+"X-Generator: Launchpad (build 18343)\n"
21
20
22−#: plugins/LightDM/Greeter.cpp:199
21+#: plugins/LightDM/Greeter.cpp:188
23msgid "Password: "
22msgid "Password: "
24msgstr "Şifrә: "
23msgstr "Şifrә: "
25
24
26−#: plugins/LightDM/Greeter.cpp:214
25+#: plugins/LightDM/Greeter.cpp:203
27msgid "Username"
26msgid "Username"
28msgstr ""
27msgstr ""
29
28
30−#: plugins/LightDM/Greeter.cpp:258
29+#: plugins/LightDM/Greeter.cpp:242
31msgid "Failed to authenticate"
30msgid "Failed to authenticate"
32msgstr ""
31msgstr ""
33
32
34−#: plugins/LightDM/Greeter.cpp:260
33+#: plugins/LightDM/Greeter.cpp:244
35msgid "Invalid password, please try again"
34msgid "Invalid password, please try again"
36msgstr ""
35msgstr ""
37
36
38−#: plugins/LightDM/Greeter.cpp:270
37+#: plugins/LightDM/Greeter.cpp:254
39msgid "Log In"
38msgid "Log In"
40msgstr ""
39msgstr ""
41
40
42−#: plugins/LightDM/Greeter.cpp:270
41+#: plugins/LightDM/Greeter.cpp:254
43msgid "Retry"
42msgid "Retry"
44msgstr ""
43msgstr ""
45
44
@@ -51,16 +50,16 @@ msgstr ""
51msgid "Guest Session"
50msgid "Guest Session"
52msgstr ""
51msgstr ""
53
52
54−#: plugins/Unity/Launcher/launcheritem.cpp:48
53+#: plugins/Unity/Launcher/launcheritem.cpp:49
55−#: plugins/Unity/Launcher/launcheritem.cpp:122
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
56msgid "Pin shortcut"
55msgid "Pin shortcut"
57msgstr "Pin qısayolu"
56msgstr "Pin qısayolu"
58
57
59−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
60msgid "Quit"
59msgid "Quit"
61msgstr ""
60msgstr ""
62
61
63−#: plugins/Unity/Launcher/launcheritem.cpp:122
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
64msgid "Unpin shortcut"
63msgid "Unpin shortcut"
65msgstr "Açma qısayolu"
64msgstr "Açma qısayolu"
66
65
@@ -83,8 +82,9 @@ msgctxt "Button: Log out from the system"
83msgid "Log Out"
82msgid "Log Out"
84msgstr ""
83msgstr ""
85
84
86−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Wizard/Pages/passcode-confirm.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
89msgid "Cancel"
89msgid "Cancel"
90msgstr "İmtina"
90msgstr "İmtina"
@@ -106,37 +106,33 @@ msgstr "Yox"
106msgid "Yes"
106msgid "Yes"
107msgstr "Hə"
107msgstr "Hə"
108
108
109−#: qml/Components/Dialogs.qml:243
109+#: qml/Components/Dialogs.qml:239
110msgctxt "Title: Power off/Restart dialog"
110msgctxt "Title: Power off/Restart dialog"
111msgid "Power"
111msgid "Power"
112msgstr ""
112msgstr ""
113
113
114−#: qml/Components/Dialogs.qml:244
114+#: qml/Components/Dialogs.qml:240
115msgid ""
115msgid ""
116"Are you sure you would like\n"
116"Are you sure you would like\n"
117"to power off?"
117"to power off?"
118msgstr ""
118msgstr ""
119
119
120−#: qml/Components/Dialogs.qml:248
120+#: qml/Components/Dialogs.qml:244
121msgctxt "Button: Power off the system"
121msgctxt "Button: Power off the system"
122msgid "Power off"
122msgid "Power off"
123msgstr ""
123msgstr ""
124
124
125−#: qml/Components/Dialogs.qml:263
125+#: qml/Components/Dialogs.qml:255
126msgctxt "Button: Restart the system"
126msgctxt "Button: Restart the system"
127msgid "Restart"
127msgid "Restart"
128msgstr ""
128msgstr ""
129
129
130−#: qml/Components/Dialogs.qml:276
131−msgid "Screenshot"
132−msgstr ""
133−
134#: qml/Components/KeyboardShortcutsOverlay.qml:41
130#: qml/Components/KeyboardShortcutsOverlay.qml:41
135msgid "Keyboard Shortcuts"
131msgid "Keyboard Shortcuts"
136msgstr ""
132msgstr ""
137
133
138#: qml/Components/KeyboardShortcutsOverlay.qml:55
134#: qml/Components/KeyboardShortcutsOverlay.qml:55
139−msgid "Lomiri"
135+msgid "Unity 8"
140msgstr ""
136msgstr ""
141
137
142#: qml/Components/KeyboardShortcutsOverlay.qml:62
138#: qml/Components/KeyboardShortcutsOverlay.qml:62
@@ -223,6 +219,18 @@ msgstr ""
223msgid "Opens the Application Drawer."
219msgid "Opens the Application Drawer."
224msgstr ""
220msgstr ""
225
221
222+#: qml/Components/KeyboardShortcutsOverlay.qml:207
223+msgid "Scopes"
224+msgstr ""
225+
226+#: qml/Components/KeyboardShortcutsOverlay.qml:214
227+msgid "Super (Tap)"
228+msgstr ""
229+
230+#: qml/Components/KeyboardShortcutsOverlay.qml:219
231+msgid "Opens the Scopes home."
232+msgstr ""
233+
226#: qml/Components/KeyboardShortcutsOverlay.qml:235
234#: qml/Components/KeyboardShortcutsOverlay.qml:235
227msgid "Switching"
235msgid "Switching"
228msgstr ""
236msgstr ""
@@ -295,7 +303,7 @@ msgstr ""
295msgid "Closes the current window."
303msgid "Closes the current window."
296msgstr ""
304msgstr ""
297
305
298−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
306+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
299msgid "Return to Call"
307msgid "Return to Call"
300msgstr ""
308msgstr ""
301
309
@@ -354,10 +362,8 @@ msgid ""
354msgstr ""
362msgstr ""
355
363
356#: qml/Components/VirtualTouchPad.qml:327
364#: qml/Components/VirtualTouchPad.qml:327
357−#, fuzzy
358−#| msgid "Tap to return to call..."
359msgid "Tap left button to click."
365msgid "Tap left button to click."
360−msgstr "Zəngə qayıtmaq üçün toxunun..."
366+msgstr ""
361
367
362#: qml/Components/VirtualTouchPad.qml:339
368#: qml/Components/VirtualTouchPad.qml:339
363msgid "Tap right button to right click."
369msgid "Tap right button to right click."
@@ -371,6 +377,103 @@ msgstr ""
371msgid "Find more settings in the system settings."
377msgid "Find more settings in the system settings."
372msgstr ""
378msgstr ""
373
379
380+#: qml/Dash/DashPageHeader.qml:361
381+msgctxt "Button: Open the Ubuntu Store"
382+msgid "Store"
383+msgstr ""
384+
385+#: qml/Dash/DashPageHeader.qml:368
386+msgctxt "Button: Start a search in the current dash scope"
387+msgid "Search"
388+msgstr ""
389+
390+#: qml/Dash/DashPageHeader.qml:378
391+msgctxt "Button: Show the current dash scope settings"
392+msgid "Settings"
393+msgstr ""
394+
395+#: qml/Dash/DashPageHeader.qml:385
396+msgid "Remove from Favorites"
397+msgstr "Seçilmişlәrdәn çıxart"
398+
399+#: qml/Dash/DashPageHeader.qml:385
400+msgid "Add to Favorites"
401+msgstr "Seçilmişlәrә әlavә et"
402+
403+#: qml/Dash/FiltersPopover.qml:61
404+msgid "Refine your results"
405+msgstr ""
406+
407+#: qml/Dash/FiltersPopover.qml:70
408+msgid "Reset"
409+msgstr ""
410+
411+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
412+msgid "Show less"
413+msgstr ""
414+
415+#: qml/Dash/GenericScopeView.qml:547
416+msgid "Show all"
417+msgstr ""
418+
419+#: qml/Dash/GenericScopeView.qml:578
420+msgctxt "Label: Hint for dash search line edit"
421+msgid "Search"
422+msgstr ""
423+
424+#: qml/Dash/PageHeaderExtraPanel.qml:67
425+msgid "Recent Searches"
426+msgstr ""
427+
428+#: qml/Dash/PageHeaderExtraPanel.qml:78
429+msgid "Clear All"
430+msgstr ""
431+
432+#: qml/Dash/Previews/PreviewActionCombo.qml:36
433+msgid "More..."
434+msgstr "Daha çox..."
435+
436+#: qml/Dash/Previews/PreviewActionCombo.qml:36
437+msgid "Less..."
438+msgstr "Az..."
439+
440+#: qml/Dash/Previews/PreviewCommentInput.qml:83
441+#: qml/Dash/Previews/PreviewRatingInput.qml:202
442+msgid "Send"
443+msgstr "Göndər"
444+
445+#: qml/Dash/Previews/PreviewRatingInput.qml:109
446+msgid "Rate this"
447+msgstr "Qiymәtlәndir"
448+
449+#: qml/Dash/Previews/PreviewRatingInput.qml:184
450+msgid "Add a review"
451+msgstr "Rəy yaz"
452+
453+#: qml/Dash/PullToRefreshScopeStyle.qml:56
454+msgid "Pull to refresh…"
455+msgstr ""
456+
457+#: qml/Dash/PullToRefreshScopeStyle.qml:61
458+msgid "Release to refresh…"
459+msgstr ""
460+
461+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
462+msgid "Enable location data"
463+msgstr ""
464+
465+#: qml/Dash/ScopesList.qml:146
466+msgid "Manage"
467+msgstr ""
468+
469+#: qml/Dash/ScopesList.qml:187
470+msgid "Home"
471+msgstr ""
472+
473+#: qml/Dash/ScopesList.qml:188
474+msgid "Also installed"
475+msgstr ""
476+
374#: qml/Greeter/CoverPage.qml:127
477#: qml/Greeter/CoverPage.qml:127
375msgid "Unlock"
478msgid "Unlock"
376msgstr ""
479msgstr ""
@@ -406,7 +509,7 @@ msgstr ""
406msgid "Enter passcode to unlock"
509msgid "Enter passcode to unlock"
407msgstr ""
510msgstr ""
408
511
409−#: qml/Greeter/NarrowView.qml:235
512+#: qml/Greeter/NarrowView.qml:228
410msgid "Emergency"
513msgid "Emergency"
411msgstr ""
514msgstr ""
412
515
@@ -422,18 +525,17 @@ msgstr ""
422msgid "Select desktop environment"
525msgid "Select desktop environment"
423msgstr ""
526msgstr ""
424
527
425−#: qml/Launcher/Drawer.qml:250
528+#: qml/Launcher/Drawer.qml:94
426−#, fuzzy
427−#| msgid "Search"
428msgid "Search…"
529msgid "Search…"
429−msgstr "Axtar"
530+msgstr ""
430
531
431−#: qml/Launcher/PullToRefreshScopeStyle.qml:56
532+#: qml/Launcher/Drawer.qml:129
533+msgctxt "Apps sorted alphabetically"
432−msgid "Pull to refresh…"
534+msgid "A-Z"
433msgstr ""
535msgstr ""
434
536
435−#: qml/Launcher/PullToRefreshScopeStyle.qml:61
537+#: qml/Launcher/MoreAppsHeader.qml:55
436−msgid "Release to refresh…"
538+msgid "More apps in the store"
437msgstr ""
539msgstr ""
438
540
439#: qml/Notifications/NotificationMenuItemFactory.qml:124
541#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -531,25 +633,19 @@ msgstr ""
531msgid "Drag using 3 fingers any application from one window to the other"
633msgid "Drag using 3 fingers any application from one window to the other"
532msgstr ""
634msgstr ""
533
635
534−#: qml/Stage/Stage.qml:671
535−msgid "No running apps"
536−msgstr ""
537−
538#: qml/Tutorial/TutorialLeftLong.qml:49
636#: qml/Tutorial/TutorialLeftLong.qml:49
539−#, fuzzy
540−#| msgid "Try swiping from the top edge to access the indicators"
541msgid "Long swipe from the left edge to open the Application Drawer"
637msgid "Long swipe from the left edge to open the Application Drawer"
542−msgstr "Göstəriciləri görmәk üçün yuxarı küncdən sürüşdürün"
638+msgstr ""
543
639
544#: qml/Tutorial/TutorialLeft.qml:47
640#: qml/Tutorial/TutorialLeft.qml:47
545msgid "Short swipe from the left edge to open the launcher"
641msgid "Short swipe from the left edge to open the launcher"
546msgstr ""
642msgstr ""
547
643
548−#: qml/Tutorial/TutorialRight.qml:54
644+#: qml/Tutorial/TutorialRight.qml:55
549msgid "Push your mouse against the right edge to view your open apps"
645msgid "Push your mouse against the right edge to view your open apps"
550msgstr ""
646msgstr ""
551
647
552−#: qml/Tutorial/TutorialRight.qml:55
648+#: qml/Tutorial/TutorialRight.qml:56
553msgid "Swipe from the right edge to view your open apps"
649msgid "Swipe from the right edge to view your open apps"
554msgstr ""
650msgstr ""
555
651
@@ -557,42 +653,25 @@ msgstr ""
557msgid "Swipe from the top edge to access notifications and quick settings"
653msgid "Swipe from the top edge to access notifications and quick settings"
558msgstr ""
654msgstr ""
559
655
560−#: qml/Wizard/Page.qml:59
656+#: qml/Wizard/Page.qml:54
561msgctxt "Button: Go back one page in the Wizard"
657msgctxt "Button: Go back one page in the Wizard"
562msgid "Back"
658msgid "Back"
563msgstr ""
659msgstr ""
564
660
565−#: qml/Wizard/Pages/10-welcome.qml:29
661+#: qml/Wizard/Pages/10-welcome.qml:28
566msgid "Language"
662msgid "Language"
567msgstr ""
663msgstr ""
568
664
569−#: qml/Wizard/Pages/10-welcome.qml:176
665+#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
570−#: qml/Wizard/Pages/10-welcome-update.qml:126
666+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
571−#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
572−#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
667+#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
573−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
668+#: qml/Wizard/Pages/70-passwd-type.qml:145
669+#: qml/Wizard/Pages/75-report-check.qml:84
574−#: qml/Wizard/Pages/passcode-desktop.qml:154
670+#: qml/Wizard/Pages/passcode-desktop.qml:142
575−#: qml/Wizard/Pages/password-set.qml:153
671+#: qml/Wizard/Pages/password-set.qml:142
576msgid "Next"
672msgid "Next"
577msgstr ""
673msgstr ""
578
674
579−#: qml/Wizard/Pages/10-welcome-update.qml:91
580−msgid "Welcome to "
581−msgstr ""
582−
583−#: qml/Wizard/Pages/10-welcome-update.qml:106
584−msgid "We will make sure your device is ready to use "
585−msgstr ""
586−
587−#: qml/Wizard/Pages/11-changelog.qml:28
588−msgid "What's new"
589−msgstr ""
590−
591−#: qml/Wizard/Pages/11-changelog.qml:74
592−#, fuzzy
593−msgid "Loading..."
594−msgstr "Danışır..."
595−
596#: qml/Wizard/Pages/20-keyboard.qml:31
675#: qml/Wizard/Pages/20-keyboard.qml:31
597msgid "Select Keyboard"
676msgid "Select Keyboard"
598msgstr ""
677msgstr ""
@@ -605,33 +684,64 @@ msgstr ""
605msgid "Keyboard layout"
684msgid "Keyboard layout"
606msgstr ""
685msgstr ""
607
686
608−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
687+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
609−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
610−#: qml/Wizard/Pages/sim.qml:101
688+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
611msgid "Skip"
689msgid "Skip"
612msgstr ""
690msgstr ""
613
691
614−#: qml/Wizard/Pages/30-wifi.qml:31
692+#: qml/Wizard/Pages/30-wifi.qml:30
615msgid "Connect to Wi‑Fi"
693msgid "Connect to Wi‑Fi"
616msgstr ""
694msgstr ""
617
695
618−#: qml/Wizard/Pages/30-wifi.qml:139
696+#: qml/Wizard/Pages/30-wifi.qml:131
619msgid "Connected"
697msgid "Connected"
620msgstr ""
698msgstr ""
621
699
622−#: qml/Wizard/Pages/30-wifi.qml:172
700+#: qml/Wizard/Pages/30-wifi.qml:164
623msgid "Available Wi-Fi networks"
701msgid "Available Wi-Fi networks"
624msgstr ""
702msgstr ""
625
703
626−#: qml/Wizard/Pages/30-wifi.qml:173
704+#: qml/Wizard/Pages/30-wifi.qml:165
627msgid "No available Wi-Fi networks"
705msgid "No available Wi-Fi networks"
628msgstr ""
706msgstr ""
629
707
708+#: qml/Wizard/Pages/40-location.qml:27
709+msgid "Location Services"
710+msgstr ""
711+
712+#: qml/Wizard/Pages/40-location.qml:83
713+msgid ""
714+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
715+"(recommended)"
716+msgstr ""
717+
718+#: qml/Wizard/Pages/40-location.qml:105
719+#, qt-format
720+msgid "By selecting this option you agree to the Nokia HERE %1."
721+msgstr ""
722+
723+#: qml/Wizard/Pages/40-location.qml:106
724+msgctxt "part of: Nokia HERE terms and conditions"
725+msgid "terms and conditions"
726+msgstr ""
727+
728+#: qml/Wizard/Pages/40-location.qml:160
729+msgid "GPS only"
730+msgstr ""
731+
732+#: qml/Wizard/Pages/40-location.qml:214
733+msgid "Don't use my location"
734+msgstr ""
735+
736+#: qml/Wizard/Pages/40-location.qml:260
737+msgid "You can change it later in System Settings."
738+msgstr ""
739+
630#: qml/Wizard/Pages/50-timezone.qml:30
740#: qml/Wizard/Pages/50-timezone.qml:30
631msgid "Time Zone"
741msgid "Time Zone"
632msgstr ""
742msgstr ""
633
743
634−#: qml/Wizard/Pages/50-timezone.qml:183
744+#: qml/Wizard/Pages/50-timezone.qml:182
635msgid "Enter your city"
745msgid "Enter your city"
636msgstr ""
746msgstr ""
637
747
@@ -639,7 +749,7 @@ msgstr ""
639msgid "Personalize Your Device"
749msgid "Personalize Your Device"
640msgstr ""
750msgstr ""
641
751
642−#: qml/Wizard/Pages/60-account.qml:54
752+#: qml/Wizard/Pages/60-account.qml:48
643msgid "Preferred Name"
753msgid "Preferred Name"
644msgstr ""
754msgstr ""
645
755
@@ -647,72 +757,81 @@ msgstr ""
647msgid "Lock Screen"
757msgid "Lock Screen"
648msgstr ""
758msgstr ""
649
759
650−#: qml/Wizard/Pages/70-passwd-type.qml:103
760+#: qml/Wizard/Pages/70-passwd-type.qml:102
651msgctxt "Label: Type of security method"
761msgctxt "Label: Type of security method"
652msgid "Create new password"
762msgid "Create new password"
653msgstr ""
763msgstr ""
654
764
655−#: qml/Wizard/Pages/70-passwd-type.qml:105
765+#: qml/Wizard/Pages/70-passwd-type.qml:104
656msgctxt "Label: Type of security method"
766msgctxt "Label: Type of security method"
657msgid "Create passcode (numbers only)"
767msgid "Create passcode (numbers only)"
658msgstr ""
768msgstr ""
659
769
660−#: qml/Wizard/Pages/70-passwd-type.qml:107
770+#: qml/Wizard/Pages/70-passwd-type.qml:106
661msgctxt "Label: Type of security method"
771msgctxt "Label: Type of security method"
662msgid "No lock code"
772msgid "No lock code"
663msgstr ""
773msgstr ""
664
774
665−#: qml/Wizard/Pages/79-system-update.qml:28
775+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
666−msgid "Update Device"
776+msgid "Privacy Policy"
667msgstr ""
777msgstr ""
668
778
669−#: qml/Wizard/Pages/79-system-update.qml:55
779+#: qml/Wizard/Pages/75-report-check.qml:26
670−msgid ""
780+msgid "Help Us Improve"
671−"There is a system update available and ready to install. Afterwards, the "
672−"device will automatically restart."
673msgstr ""
781msgstr ""
674
782
675−#: qml/Wizard/Pages/79-system-update.qml:76
783+#: qml/Wizard/Pages/75-report-check.qml:59
676−msgctxt "string identifying name of the update"
784+msgid "Improve system performance by sending us crashes and error reports."
677−msgid "Ubuntu Touch system"
678msgstr ""
785msgstr ""
679
786
680−#: qml/Wizard/Pages/79-system-update.qml:83
787+#: qml/Wizard/Pages/75-report-check.qml:60
681−#, qt-format
788+msgid "Privacy policy"
682−msgctxt "version of the system update"
683−msgid "Version %1"
684msgstr ""
789msgstr ""
685
790
686−#: qml/Wizard/Pages/79-system-update.qml:95
791+#: qml/Wizard/Pages/80-finished.qml:89
687−msgid "This could take a few minutes..."
792+msgid "Welcome to Ubuntu"
688msgstr ""
793msgstr ""
689
794
690−#: qml/Wizard/Pages/79-system-update.qml:109
795+#: qml/Wizard/Pages/80-finished.qml:104
691−msgid "Install and restart now"
796+msgid "You are ready to use your device now"
692msgstr ""
797msgstr ""
693
798
694−#: qml/Wizard/Pages/80-finished.qml:91
799+#: qml/Wizard/Pages/80-finished.qml:124
695−msgid "Welcome Back"
800+msgid "Get Started"
696msgstr ""
801msgstr ""
697
802
698−#: qml/Wizard/Pages/80-finished.qml:91
803+#: qml/Wizard/Pages/here-terms.qml:25
699−msgid "Welcome to Ubuntu"
804+msgid "Terms & Conditions"
700msgstr ""
805msgstr ""
701
806
702−#: qml/Wizard/Pages/80-finished.qml:106
807+#: qml/Wizard/Pages/here-terms.qml:69
703−msgid "You are ready to use your device now"
808+msgid "Your device uses positioning technologies provided by HERE."
704msgstr ""
809msgstr ""
705
810
706−#: qml/Wizard/Pages/80-finished.qml:126
811+#: qml/Wizard/Pages/here-terms.qml:81
707−msgid "Continue"
812+msgid ""
813+"To provide you with positioning services and to improve their quality, HERE "
814+"collects information about nearby cell towers and Wi-Fi hotspots around your "
815+"current location whenever your position is being found."
708msgstr ""
816msgstr ""
709
817
710−#: qml/Wizard/Pages/80-finished.qml:126
818+#: qml/Wizard/Pages/here-terms.qml:93
711−msgid "Get Started"
819+msgid ""
820+"The information collected is used to analyze the service and to improve the "
821+"use of service, but not to identify you personally."
822+msgstr ""
823+
824+#: qml/Wizard/Pages/here-terms.qml:106
825+#, qt-format
826+msgid "By continuing, you agree to the HERE platform %1 and %2."
827+msgstr ""
828+
829+#: qml/Wizard/Pages/here-terms.qml:107
830+msgid "Service Terms"
712msgstr ""
831msgstr ""
713
832
714#: qml/Wizard/Pages/passcode-confirm.qml:43
833#: qml/Wizard/Pages/passcode-confirm.qml:43
715−#: qml/Wizard/Pages/passcode-desktop.qml:104
834+#: qml/Wizard/Pages/passcode-desktop.qml:97
716msgid "Confirm passcode"
835msgid "Confirm passcode"
717msgstr ""
836msgstr ""
718
837
@@ -729,24 +848,24 @@ msgstr ""
729msgid "Lock Screen Passcode"
848msgid "Lock Screen Passcode"
730msgstr ""
849msgstr ""
731
850
732−#: qml/Wizard/Pages/passcode-desktop.qml:68
851+#: qml/Wizard/Pages/passcode-desktop.qml:61
733msgid "Enter 4 numbers to setup your passcode"
852msgid "Enter 4 numbers to setup your passcode"
734msgstr ""
853msgstr ""
735
854
736−#: qml/Wizard/Pages/passcode-desktop.qml:84
855+#: qml/Wizard/Pages/passcode-desktop.qml:77
737#: qml/Wizard/Pages/passcode-set.qml:54
856#: qml/Wizard/Pages/passcode-set.qml:54
738msgid "Choose passcode"
857msgid "Choose passcode"
739msgstr ""
858msgstr ""
740
859
741−#: qml/Wizard/Pages/passcode-desktop.qml:139
860+#: qml/Wizard/Pages/passcode-desktop.qml:127
742msgid "Passcode too short"
861msgid "Passcode too short"
743msgstr ""
862msgstr ""
744
863
745−#: qml/Wizard/Pages/passcode-desktop.qml:141
864+#: qml/Wizard/Pages/passcode-desktop.qml:129
746msgid "Passcodes match"
865msgid "Passcodes match"
747msgstr ""
866msgstr ""
748
867
749−#: qml/Wizard/Pages/passcode-desktop.qml:143
868+#: qml/Wizard/Pages/passcode-desktop.qml:131
750msgid "Passcodes do not match"
869msgid "Passcodes do not match"
751msgstr ""
870msgstr ""
752
871
@@ -758,15 +877,15 @@ msgstr ""
758msgid "Lock Screen Password"
877msgid "Lock Screen Password"
759msgstr ""
878msgstr ""
760
879
761−#: qml/Wizard/Pages/password-set.qml:68
880+#: qml/Wizard/Pages/password-set.qml:62
762msgid "Enter at least 8 characters"
881msgid "Enter at least 8 characters"
763msgstr ""
882msgstr ""
764
883
765−#: qml/Wizard/Pages/password-set.qml:80
884+#: qml/Wizard/Pages/password-set.qml:74
766msgid "Choose password"
885msgid "Choose password"
767msgstr ""
886msgstr ""
768
887
769−#: qml/Wizard/Pages/password-set.qml:110
888+#: qml/Wizard/Pages/password-set.qml:104
770msgid "Confirm password"
889msgid "Confirm password"
771msgstr ""
890msgstr ""
772
891
@@ -822,42 +941,12 @@ msgstr ""
822msgid "Very weak password"
941msgid "Very weak password"
823msgstr ""
942msgstr ""
824
943
825−#~ msgid "Remove from Favorites"
826−#~ msgstr "Seçilmişlәrdәn çıxart"
827−
828−#~ msgid "Add to Favorites"
829−#~ msgstr "Seçilmişlәrә әlavә et"
830−
831−#~ msgid "More..."
832−#~ msgstr "Daha çox..."
833−
834−#~ msgid "Less..."
835−#~ msgstr "Az..."
836−
837−#~ msgid "Send"
838−#~ msgstr "Göndər"
839−
840−#~ msgid "Rate this"
841−#~ msgstr "Qiymәtlәndir"
842−
843−#~ msgid "Add a review"
844−#~ msgstr "Rəy yaz"
845−
846−#, fuzzy
847−#~ msgid "Please wait..."
848−#~ msgstr "Yüklənir. Zəhmət olmasa, gözləyin..."
849−
850−#, fuzzy
851−#~ msgid "Download"
852−#~ msgstr "Endirilir"
853−
854−#, fuzzy
855−#~ msgid "Downloaded"
856−#~ msgstr "Endirilir"
857−
858#~ msgid "Confirm"
944#~ msgid "Confirm"
859#~ msgstr "Təsdiqlə"
945#~ msgstr "Təsdiqlə"
860
946
947+#~ msgid "Search"
948+#~ msgstr "Axtar"
949+
861#~ msgid "Top edge"
950#~ msgid "Top edge"
862#~ msgstr "Yuxarı künc"
951#~ msgstr "Yuxarı künc"
863
952
@@ -873,6 +962,12 @@ msgstr ""
873#~ msgid "Right edge"
962#~ msgid "Right edge"
874#~ msgstr "Sağ Künc"
963#~ msgstr "Sağ Künc"
875
964
965+#~ msgid "Speaking..."
966+#~ msgstr "Danışır..."
967+
968+#~ msgid "Loading. Please Wait..."
969+#~ msgstr "Yüklənir. Zəhmət olmasa, gözləyin..."
970+
876#~ msgid "Speak Now..."
971#~ msgid "Speak Now..."
877#~ msgstr "Danışın..."
972#~ msgstr "Danışın..."
878
973
@@ -908,18 +1003,18 @@ msgstr ""
908#~ msgstr "Bu sizin son cəhdiniz olacaq."
1003#~ msgstr "Bu sizin son cəhdiniz olacaq."
909
1004
910#~ msgid ""
1005#~ msgid ""
911−#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1006+#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
912−#~ "reset and all personal data will be deleted."
1007+#~ "and all personal data will be deleted."
913#~ msgstr ""
1008#~ msgstr ""
914−#~ "Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika "
1009+#~ "Əgər açar kod yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
915−#~ "parametrlərinə geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
1010+#~ "geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
916
1011
917#~ msgid ""
1012#~ msgid ""
918#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1013#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
919#~ "reset and all personal data will be deleted."
1014#~ "reset and all personal data will be deleted."
920#~ msgstr ""
1015#~ msgstr ""
921−#~ "Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika "
1016+#~ "Əgər açar söz yanlış daxil edilibsə, onda telefonunuz fabrika parametrlərinə "
922−#~ "parametrlərinə geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
1017+#~ "geri qayıdacaq və bütün şəxsi məlumatlarınız silinəcək."
923
1018
924#~ msgid "Log out"
1019#~ msgid "Log out"
925#~ msgstr "Çıxış"
1020#~ msgstr "Çıxış"
@@ -933,6 +1028,9 @@ msgstr ""
933#~ msgid "Reboot"
1028#~ msgid "Reboot"
934#~ msgstr "Yenidən yüklə"
1029#~ msgstr "Yenidən yüklə"
935
1030
1031+#~ msgid "Try swiping from the top edge to access the indicators"
1032+#~ msgstr "Göstəriciləri görmәk üçün yuxarı küncdən sürüşdürün"
1033+
936#~ msgid "Skip intro"
1034#~ msgid "Skip intro"
937#~ msgstr "Tәqdimatı keç"
1035#~ msgstr "Tәqdimatı keç"
938
1036
@@ -961,6 +1059,7 @@ msgstr ""
961#~ msgid "Sorry, incorrect passphrase"
1059#~ msgid "Sorry, incorrect passphrase"
962#~ msgstr "Bağışlayın, açar söz yanlışdır"
1060#~ msgstr "Bağışlayın, açar söz yanlışdır"
963
1061
1062+#, qt-format
964#~ msgid "Sorry, incorrect %1"
1063#~ msgid "Sorry, incorrect %1"
965#~ msgstr "Bağışlayın, %1 yanlışdır"
1064#~ msgstr "Bağışlayın, %1 yanlışdır"
966
1065
po/be.po+433−374
@@ -6,74 +6,72 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: \n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2021-01-29 11:42-0600\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2021-03-07 20:28+0000\n"
11+"PO-Revision-Date: 2015-12-13 13:12+0000\n"
12−"Last-Translator: Zmicer <nashtlumach@gmail.com>\n"
12+"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
13−"Language-Team: Belarusian <https://translate.ubports.com/projects/ubports/"
13+"Language-Team: Belarusian <be@li.org>\n"
14−"lomiri/be/>\n"
15−"Language: be\n"
16"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
19−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
17+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
20−"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21−"X-Generator: Weblate 3.11.3\n"
22−"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
19+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20+"X-Generator: Launchpad (build 18343)\n"
23
21
24−#: plugins/LightDM/Greeter.cpp:199
22+#: plugins/LightDM/Greeter.cpp:188
25msgid "Password: "
23msgid "Password: "
26msgstr "Пароль: "
24msgstr "Пароль: "
27
25
28−#: plugins/LightDM/Greeter.cpp:214
26+#: plugins/LightDM/Greeter.cpp:203
29msgid "Username"
27msgid "Username"
30−msgstr "Імя карыстальніка"
28+msgstr ""
31
29
32−#: plugins/LightDM/Greeter.cpp:258
30+#: plugins/LightDM/Greeter.cpp:242
33msgid "Failed to authenticate"
31msgid "Failed to authenticate"
34−msgstr "Не атрымалася выканаць аўтэнтыфікацыю"
32+msgstr ""
35
33
36−#: plugins/LightDM/Greeter.cpp:260
34+#: plugins/LightDM/Greeter.cpp:244
37msgid "Invalid password, please try again"
35msgid "Invalid password, please try again"
38−msgstr "Хібны пароль, паспрабуйце яшчэ раз"
36+msgstr ""
39
37
40−#: plugins/LightDM/Greeter.cpp:270
38+#: plugins/LightDM/Greeter.cpp:254
41msgid "Log In"
39msgid "Log In"
42−msgstr "Увайсці"
40+msgstr ""
43
41
44−#: plugins/LightDM/Greeter.cpp:270
42+#: plugins/LightDM/Greeter.cpp:254
45msgid "Retry"
43msgid "Retry"
46msgstr "Паспрабаваць зноў"
44msgstr "Паспрабаваць зноў"
47
45
48#: plugins/LightDM/UsersModel.cpp:157
46#: plugins/LightDM/UsersModel.cpp:157
49msgid "Login"
47msgid "Login"
50−msgstr "Увайсці"
48+msgstr ""
51
49
52#: plugins/LightDM/UsersModel.cpp:165
50#: plugins/LightDM/UsersModel.cpp:165
53msgid "Guest Session"
51msgid "Guest Session"
54−msgstr "Гасцявы сеанс"
52+msgstr ""
55
53
56−#: plugins/Unity/Launcher/launcheritem.cpp:48
54+#: plugins/Unity/Launcher/launcheritem.cpp:49
57−#: plugins/Unity/Launcher/launcheritem.cpp:122
55+#: plugins/Unity/Launcher/launcheritem.cpp:123
58msgid "Pin shortcut"
56msgid "Pin shortcut"
59−msgstr "Замацаваць цэтлік"
57+msgstr "Замацаваць кнопку"
60
58
61−#: plugins/Unity/Launcher/launcheritem.cpp:54
59+#: plugins/Unity/Launcher/launcheritem.cpp:55
62msgid "Quit"
60msgid "Quit"
63msgstr "Выйсці"
61msgstr "Выйсці"
64
62
65−#: plugins/Unity/Launcher/launcheritem.cpp:122
63+#: plugins/Unity/Launcher/launcheritem.cpp:123
66msgid "Unpin shortcut"
64msgid "Unpin shortcut"
67−msgstr "Адмацаваць цэтлік"
65+msgstr "Адмацаваць кнопку"
68
66
69#: qml/Components/Dialogs.qml:176
67#: qml/Components/Dialogs.qml:176
70msgctxt "Title: Lock/Log out dialog"
68msgctxt "Title: Lock/Log out dialog"
71msgid "Log out"
69msgid "Log out"
72−msgstr "Завяршыць сеанс"
70+msgstr "Выйсці"
73
71
74#: qml/Components/Dialogs.qml:177
72#: qml/Components/Dialogs.qml:177
75msgid "Are you sure you want to log out?"
73msgid "Are you sure you want to log out?"
76−msgstr "Сапраўды завяршыць сеанс?"
74+msgstr "Вы ўпэўненыя, што хочаце выйсці?"
77
75
78#: qml/Components/Dialogs.qml:180
76#: qml/Components/Dialogs.qml:180
79msgctxt "Button: Lock the system"
77msgctxt "Button: Lock the system"
@@ -85,8 +83,9 @@ msgctxt "Button: Log out from the system"
85msgid "Log Out"
83msgid "Log Out"
86msgstr "Выйсці"
84msgstr "Выйсці"
87
85
88−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
86+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
87+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
89−#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
88+#: qml/Wizard/Pages/passcode-confirm.qml:32
90#: qml/Wizard/Pages/passcode-set.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
91msgid "Cancel"
90msgid "Cancel"
92msgstr "Скасаваць"
91msgstr "Скасаваць"
@@ -98,7 +97,7 @@ msgstr "Перазагрузіць"
98
97
99#: qml/Components/Dialogs.qml:212
98#: qml/Components/Dialogs.qml:212
100msgid "Are you sure you want to reboot?"
99msgid "Are you sure you want to reboot?"
101−msgstr "Сапраўды хочаце перазагрузіць сістэму?"
100+msgstr "Вы ўпэўнены, што жадаеце перазагрузіць?"
102
101
103#: qml/Components/Dialogs.qml:215
102#: qml/Components/Dialogs.qml:215
104msgid "No"
103msgid "No"
@@ -108,206 +107,212 @@ msgstr "Не"
108msgid "Yes"
107msgid "Yes"
109msgstr "Так"
108msgstr "Так"
110
109
111−#: qml/Components/Dialogs.qml:243
110+#: qml/Components/Dialogs.qml:239
112msgctxt "Title: Power off/Restart dialog"
111msgctxt "Title: Power off/Restart dialog"
113msgid "Power"
112msgid "Power"
114msgstr "Сілкаванне"
113msgstr "Сілкаванне"
115
114
116−#: qml/Components/Dialogs.qml:244
115+#: qml/Components/Dialogs.qml:240
117msgid ""
116msgid ""
118"Are you sure you would like\n"
117"Are you sure you would like\n"
119"to power off?"
118"to power off?"
120msgstr ""
119msgstr ""
121−"Сапраўды хочаце\n"
120+"Вы ўпэўнены, што хочаце\n"
122−"выключыць?"
121+"выключыць камп'ютэр?"
123
122
124−#: qml/Components/Dialogs.qml:248
123+#: qml/Components/Dialogs.qml:244
125msgctxt "Button: Power off the system"
124msgctxt "Button: Power off the system"
126msgid "Power off"
125msgid "Power off"
127msgstr "Выключыць"
126msgstr "Выключыць"
128
127
129−#: qml/Components/Dialogs.qml:263
128+#: qml/Components/Dialogs.qml:255
130msgctxt "Button: Restart the system"
129msgctxt "Button: Restart the system"
131msgid "Restart"
130msgid "Restart"
132−msgstr "Перазапусціць"
131+msgstr "Перазапуск"
133−
134−#: qml/Components/Dialogs.qml:276
135−#, fuzzy
136−#| msgid "Takes a screenshot."
137−msgid "Screenshot"
138−msgstr "Здымак экрана."
139
132
140#: qml/Components/KeyboardShortcutsOverlay.qml:41
133#: qml/Components/KeyboardShortcutsOverlay.qml:41
141msgid "Keyboard Shortcuts"
134msgid "Keyboard Shortcuts"
142−msgstr "Спалучэнні клавіш"
135+msgstr ""
143
136
144#: qml/Components/KeyboardShortcutsOverlay.qml:55
137#: qml/Components/KeyboardShortcutsOverlay.qml:55
145−msgid "Lomiri"
138+msgid "Unity 8"
146msgstr ""
139msgstr ""
147
140
148#: qml/Components/KeyboardShortcutsOverlay.qml:62
141#: qml/Components/KeyboardShortcutsOverlay.qml:62
149msgid "PrtScr"
142msgid "PrtScr"
150−msgstr "PrtScr"
143+msgstr ""
151
144
152#: qml/Components/KeyboardShortcutsOverlay.qml:67
145#: qml/Components/KeyboardShortcutsOverlay.qml:67
153msgid "Takes a screenshot."
146msgid "Takes a screenshot."
154−msgstr "Здымак экрана."
147+msgstr ""
155
148
156#: qml/Components/KeyboardShortcutsOverlay.qml:75
149#: qml/Components/KeyboardShortcutsOverlay.qml:75
157msgid "Alt + PrtScr"
150msgid "Alt + PrtScr"
158−msgstr "Alt + PrtScr"
151+msgstr ""
159
152
160#: qml/Components/KeyboardShortcutsOverlay.qml:80
153#: qml/Components/KeyboardShortcutsOverlay.qml:80
161msgid "Takes a screenshot of the current window."
154msgid "Takes a screenshot of the current window."
162−msgstr "Робіць здымак экрана бягучага акна."
155+msgstr ""
163
156
164#: qml/Components/KeyboardShortcutsOverlay.qml:88
157#: qml/Components/KeyboardShortcutsOverlay.qml:88
165msgid "Super + Space"
158msgid "Super + Space"
166−msgstr "Super + Прагал"
159+msgstr ""
167
160
168#: qml/Components/KeyboardShortcutsOverlay.qml:93
161#: qml/Components/KeyboardShortcutsOverlay.qml:93
169msgid "Switches to next keyboard layout."
162msgid "Switches to next keyboard layout."
170−msgstr "Пераключыцца на наступную раскладку клавіятуры."
163+msgstr ""
171
164
172#: qml/Components/KeyboardShortcutsOverlay.qml:101
165#: qml/Components/KeyboardShortcutsOverlay.qml:101
173msgid "Super + Shift + Space"
166msgid "Super + Shift + Space"
174−msgstr "Super + Shift + Прагал"
167+msgstr ""
175
168
176#: qml/Components/KeyboardShortcutsOverlay.qml:106
169#: qml/Components/KeyboardShortcutsOverlay.qml:106
177msgid "Switches to previous keyboard layout."
170msgid "Switches to previous keyboard layout."
178−msgstr "Пераключыцца на папярэднюю раскладку клавіятуры."
171+msgstr ""
179
172
180#: qml/Components/KeyboardShortcutsOverlay.qml:114
173#: qml/Components/KeyboardShortcutsOverlay.qml:114
181msgid "Ctrl + Alt + T"
174msgid "Ctrl + Alt + T"
182−msgstr "Ctrl + Alt + T"
175+msgstr ""
183
176
184#: qml/Components/KeyboardShortcutsOverlay.qml:119
177#: qml/Components/KeyboardShortcutsOverlay.qml:119
185msgid "Starts the Terminal application."
178msgid "Starts the Terminal application."
186−msgstr "Запускае тэрмінал."
179+msgstr ""
187
180
188#: qml/Components/KeyboardShortcutsOverlay.qml:131
181#: qml/Components/KeyboardShortcutsOverlay.qml:131
189msgid "Launcher"
182msgid "Launcher"
190−msgstr "Панэль запуску"
183+msgstr ""
191
184
192#: qml/Components/KeyboardShortcutsOverlay.qml:138
185#: qml/Components/KeyboardShortcutsOverlay.qml:138
193msgid "Super (Hold)"
186msgid "Super (Hold)"
194−msgstr "Super (утрыманне)"
187+msgstr ""
195
188
196#: qml/Components/KeyboardShortcutsOverlay.qml:143
189#: qml/Components/KeyboardShortcutsOverlay.qml:143
197msgid "Opens the launcher, displays shortcuts."
190msgid "Opens the launcher, displays shortcuts."
198−msgstr "Адкрывае панэль запуску, паказвае спалучэнні клавіш."
191+msgstr ""
199
192
200#: qml/Components/KeyboardShortcutsOverlay.qml:151
193#: qml/Components/KeyboardShortcutsOverlay.qml:151
201msgid "Alt + F1"
194msgid "Alt + F1"
202−msgstr "Alt + F1"
195+msgstr ""
203
196
204#: qml/Components/KeyboardShortcutsOverlay.qml:156
197#: qml/Components/KeyboardShortcutsOverlay.qml:156
205msgid "Opens launcher keyboard navigation mode."
198msgid "Opens launcher keyboard navigation mode."
206−msgstr "Актывуе рэжым навігацыі па панэлі запуску з клавіятуры."
199+msgstr ""
207
200
208#: qml/Components/KeyboardShortcutsOverlay.qml:164
201#: qml/Components/KeyboardShortcutsOverlay.qml:164
209msgid "Super + Tab"
202msgid "Super + Tab"
210−msgstr "Super + Tab"
203+msgstr ""
211
204
212#: qml/Components/KeyboardShortcutsOverlay.qml:169
205#: qml/Components/KeyboardShortcutsOverlay.qml:169
213msgid "Switches applications via the launcher."
206msgid "Switches applications via the launcher."
214−msgstr "Пераключае праграмы праз панэль запуску."
207+msgstr ""
215
208
216#: qml/Components/KeyboardShortcutsOverlay.qml:177
209#: qml/Components/KeyboardShortcutsOverlay.qml:177
217msgid "Super + 1 to 0"
210msgid "Super + 1 to 0"
218−msgstr "Super + лічба ад 1 да 0"
211+msgstr ""
219
212
220#: qml/Components/KeyboardShortcutsOverlay.qml:182
213#: qml/Components/KeyboardShortcutsOverlay.qml:182
221msgid "Same as clicking on a launcher icon."
214msgid "Same as clicking on a launcher icon."
222−msgstr "Адпаведнік націскання на значок запуску."
215+msgstr ""
223
216
224#: qml/Components/KeyboardShortcutsOverlay.qml:190
217#: qml/Components/KeyboardShortcutsOverlay.qml:190
225msgid "Super + A"
218msgid "Super + A"
226−msgstr "Super + A"
219+msgstr ""
227
220
228#: qml/Components/KeyboardShortcutsOverlay.qml:195
221#: qml/Components/KeyboardShortcutsOverlay.qml:195
229msgid "Opens the Application Drawer."
222msgid "Opens the Application Drawer."
230−msgstr "Адкрывае спіс усталяваных праграм."
223+msgstr ""
224+
225+#: qml/Components/KeyboardShortcutsOverlay.qml:207
226+msgid "Scopes"
227+msgstr ""
228+
229+#: qml/Components/KeyboardShortcutsOverlay.qml:214
230+msgid "Super (Tap)"
231+msgstr ""
232+
233+#: qml/Components/KeyboardShortcutsOverlay.qml:219
234+msgid "Opens the Scopes home."
235+msgstr ""
231
236
232#: qml/Components/KeyboardShortcutsOverlay.qml:235
237#: qml/Components/KeyboardShortcutsOverlay.qml:235
233msgid "Switching"
238msgid "Switching"
234−msgstr "Пераключэнне"
239+msgstr ""
235
240
236#: qml/Components/KeyboardShortcutsOverlay.qml:242
241#: qml/Components/KeyboardShortcutsOverlay.qml:242
237msgid "Alt + Tab"
242msgid "Alt + Tab"
238−msgstr "Alt + Tab"
243+msgstr ""
239
244
240#: qml/Components/KeyboardShortcutsOverlay.qml:247
245#: qml/Components/KeyboardShortcutsOverlay.qml:247
241msgid "Switches between applications."
246msgid "Switches between applications."
242−msgstr "Пераключэнне паміж праграмамі."
247+msgstr ""
243
248
244#: qml/Components/KeyboardShortcutsOverlay.qml:255
249#: qml/Components/KeyboardShortcutsOverlay.qml:255
245msgid "Super + W"
250msgid "Super + W"
246−msgstr "Super + W"
251+msgstr ""
247
252
248#: qml/Components/KeyboardShortcutsOverlay.qml:260
253#: qml/Components/KeyboardShortcutsOverlay.qml:260
249msgid "Opens the desktop spread."
254msgid "Opens the desktop spread."
250−msgstr "Адкрывае працоўны стол."
255+msgstr ""
251
256
252#: qml/Components/KeyboardShortcutsOverlay.qml:268
257#: qml/Components/KeyboardShortcutsOverlay.qml:268
253msgid "Cursor Left or Right"
258msgid "Cursor Left or Right"
254−msgstr "Улева ці ўправа"
259+msgstr ""
255
260
256#: qml/Components/KeyboardShortcutsOverlay.qml:273
261#: qml/Components/KeyboardShortcutsOverlay.qml:273
257msgid "Moves the focus."
262msgid "Moves the focus."
258−msgstr "Перамяшчае фокус."
263+msgstr ""
259
264
260#: qml/Components/KeyboardShortcutsOverlay.qml:285
265#: qml/Components/KeyboardShortcutsOverlay.qml:285
261msgid "Windows"
266msgid "Windows"
262−msgstr "Вокны"
267+msgstr ""
263
268
264#: qml/Components/KeyboardShortcutsOverlay.qml:292
269#: qml/Components/KeyboardShortcutsOverlay.qml:292
265msgid "Ctrl + Super + D"
270msgid "Ctrl + Super + D"
266−msgstr "Ctrl + Super + D"
271+msgstr ""
267
272
268#: qml/Components/KeyboardShortcutsOverlay.qml:297
273#: qml/Components/KeyboardShortcutsOverlay.qml:297
269msgid "Minimizes all windows."
274msgid "Minimizes all windows."
270−msgstr "Згарнуць усе вокны."
275+msgstr ""
271
276
272#: qml/Components/KeyboardShortcutsOverlay.qml:305
277#: qml/Components/KeyboardShortcutsOverlay.qml:305
273msgid "Ctrl + Super + Up"
278msgid "Ctrl + Super + Up"
274−msgstr "Ctrl + Super + уверх"
279+msgstr ""
275
280
276#: qml/Components/KeyboardShortcutsOverlay.qml:310
281#: qml/Components/KeyboardShortcutsOverlay.qml:310
277msgid "Maximizes the current window."
282msgid "Maximizes the current window."
278−msgstr "Разгарнуць бягучае акно."
283+msgstr ""
279
284
280#: qml/Components/KeyboardShortcutsOverlay.qml:318
285#: qml/Components/KeyboardShortcutsOverlay.qml:318
281msgid "Ctrl + Super + Down"
286msgid "Ctrl + Super + Down"
282−msgstr "Ctrl + Super + уніз"
287+msgstr ""
283
288
284#: qml/Components/KeyboardShortcutsOverlay.qml:323
289#: qml/Components/KeyboardShortcutsOverlay.qml:323
285msgid "Minimizes or restores the current window."
290msgid "Minimizes or restores the current window."
286−msgstr "Згарнуць альбо аднавіць бягучае акно."
291+msgstr ""
287
292
288#: qml/Components/KeyboardShortcutsOverlay.qml:331
293#: qml/Components/KeyboardShortcutsOverlay.qml:331
289msgid "Ctrl + Super + Left or Right"
294msgid "Ctrl + Super + Left or Right"
290−msgstr "Ctrl + Super + улева ці ўправа"
295+msgstr ""
291
296
292#: qml/Components/KeyboardShortcutsOverlay.qml:336
297#: qml/Components/KeyboardShortcutsOverlay.qml:336
293msgid "Semi-maximizes the current window."
298msgid "Semi-maximizes the current window."
294−msgstr "Разгортвае бягучае акно напалову."
299+msgstr ""
295
300
296#: qml/Components/KeyboardShortcutsOverlay.qml:344
301#: qml/Components/KeyboardShortcutsOverlay.qml:344
297msgid "Alt + F4"
302msgid "Alt + F4"
298−msgstr "Alt + F4"
303+msgstr ""
299
304
300#: qml/Components/KeyboardShortcutsOverlay.qml:349
305#: qml/Components/KeyboardShortcutsOverlay.qml:349
301msgid "Closes the current window."
306msgid "Closes the current window."
302−msgstr "Закрывае бягучае акно."
307+msgstr ""
303
308
304−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
309+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
305msgid "Return to Call"
310msgid "Return to Call"
306msgstr "Вярнуцца да выкліку"
311msgstr "Вярнуцца да выкліку"
307
312
308#: qml/Components/Lockscreen.qml:212
313#: qml/Components/Lockscreen.qml:212
309msgid "Emergency Call"
314msgid "Emergency Call"
310−msgstr "Экстраны выклік"
315+msgstr "Терміновы выклік"
311
316
312#: qml/Components/Lockscreen.qml:245
317#: qml/Components/Lockscreen.qml:245
313msgid "OK"
318msgid "OK"
@@ -316,28 +321,26 @@ msgstr "Добра"
316#: qml/Components/MediaServices/VideoPlayerControls.qml:44
321#: qml/Components/MediaServices/VideoPlayerControls.qml:44
317#, qt-format
322#, qt-format
318msgid "%1:%2:%3"
323msgid "%1:%2:%3"
319−msgstr "%1:%2:%3"
324+msgstr ""
320
325
321#: qml/Components/MediaServices/VideoPlayerControls.qml:49
326#: qml/Components/MediaServices/VideoPlayerControls.qml:49
322#, qt-format
327#, qt-format
323msgid "%1:%2"
328msgid "%1:%2"
324−msgstr "%1:%2"
329+msgstr ""
325
330
326#: qml/Components/ModeSwitchWarningDialog.qml:33
331#: qml/Components/ModeSwitchWarningDialog.qml:33
327msgid "Apps may have unsaved data:"
332msgid "Apps may have unsaved data:"
328−msgstr "У праграм могуць быць незахаваныя даныя:"
333+msgstr "Прылады могуць мець незахованыя дадзеныя:"
329
334
330#: qml/Components/ModeSwitchWarningDialog.qml:60
335#: qml/Components/ModeSwitchWarningDialog.qml:60
331msgctxt ""
336msgctxt ""
332"Re-dock means connect the device again to an external screen/mouse/keyboard"
337"Re-dock means connect the device again to an external screen/mouse/keyboard"
333msgid "Re-dock, save your work and close these apps to continue."
338msgid "Re-dock, save your work and close these apps to continue."
334msgstr ""
339msgstr ""
335−"Перападлучыцеся, захавайце вынікі працы і закрыйце вокны праграм, каб "
336−"працягнуць."
337
340
338#: qml/Components/ModeSwitchWarningDialog.qml:67
341#: qml/Components/ModeSwitchWarningDialog.qml:67
339msgid "Or force close now (unsaved data will be lost)."
342msgid "Or force close now (unsaved data will be lost)."
340−msgstr "Альбо закрыйце прымусова (незахаваныя даныя страцяцца)."
343+msgstr "Прымусіць зачыніць (незахаваныя дадзеныя будуць страчаны)."
341
344
342#: qml/Components/ModeSwitchWarningDialog.qml:80
345#: qml/Components/ModeSwitchWarningDialog.qml:80
343msgid "OK, I will reconnect"
346msgid "OK, I will reconnect"
@@ -349,35 +352,130 @@ msgstr "Перападлучыцца зараз!"
349
352
350#: qml/Components/ModeSwitchWarningDialog.qml:94
353#: qml/Components/ModeSwitchWarningDialog.qml:94
351msgid "Close all"
354msgid "Close all"
352−msgstr "Закрыць усе"
355+msgstr "Зачыніць усё"
353
356
354#: qml/Components/SharingPicker.qml:54
357#: qml/Components/SharingPicker.qml:54
355msgid "Preview Share Item"
358msgid "Preview Share Item"
356−msgstr "Папярэдні прагляд"
359+msgstr "Праглядзець элемент"
357
360
358#: qml/Components/VirtualTouchPad.qml:317
361#: qml/Components/VirtualTouchPad.qml:317
359msgid ""
362msgid ""
360"Your device is now connected to an external display. Use this screen as a "
363"Your device is now connected to an external display. Use this screen as a "
361"touch pad to interact with the pointer."
364"touch pad to interact with the pointer."
362msgstr ""
365msgstr ""
363−"Ваша прылада падлучаная да вонкавага дысплея. Выкарыстоўвайце гэты экран як "
364−"сэнсарную панэль для кіравання курсорам."
365
366
366#: qml/Components/VirtualTouchPad.qml:327
367#: qml/Components/VirtualTouchPad.qml:327
367msgid "Tap left button to click."
368msgid "Tap left button to click."
368−msgstr "Націсніце левую кнопку, каб пстрыкнуць."
369+msgstr ""
369
370
370#: qml/Components/VirtualTouchPad.qml:339
371#: qml/Components/VirtualTouchPad.qml:339
371msgid "Tap right button to right click."
372msgid "Tap right button to right click."
372−msgstr "Націсніце правую кнопку, каб пстрыкнуць правай клавішай мышы."
373+msgstr ""
373
374
374#: qml/Components/VirtualTouchPad.qml:351
375#: qml/Components/VirtualTouchPad.qml:351
375msgid "Swipe with two fingers to scroll."
376msgid "Swipe with two fingers to scroll."
376−msgstr "Правядзіце двума пальцамі, каб пракруціць."
377+msgstr ""
377
378
378#: qml/Components/VirtualTouchPad.qml:396
379#: qml/Components/VirtualTouchPad.qml:396
379msgid "Find more settings in the system settings."
380msgid "Find more settings in the system settings."
380−msgstr "Больш налад можна знайсці ў сістэмных наладах."
381+msgstr ""
382+
383+#: qml/Dash/DashPageHeader.qml:361
384+msgctxt "Button: Open the Ubuntu Store"
385+msgid "Store"
386+msgstr "Крама"
387+
388+#: qml/Dash/DashPageHeader.qml:368
389+msgctxt "Button: Start a search in the current dash scope"
390+msgid "Search"
391+msgstr "Пошук"
392+
393+#: qml/Dash/DashPageHeader.qml:378
394+msgctxt "Button: Show the current dash scope settings"
395+msgid "Settings"
396+msgstr "Налады"
397+
398+#: qml/Dash/DashPageHeader.qml:385
399+msgid "Remove from Favorites"
400+msgstr "Выдаліць з абранага"
401+
402+#: qml/Dash/DashPageHeader.qml:385
403+msgid "Add to Favorites"
404+msgstr "Дадаць да абранага"
405+
406+#: qml/Dash/FiltersPopover.qml:61
407+msgid "Refine your results"
408+msgstr ""
409+
410+#: qml/Dash/FiltersPopover.qml:70
411+msgid "Reset"
412+msgstr ""
413+
414+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
415+msgid "Show less"
416+msgstr ""
417+
418+#: qml/Dash/GenericScopeView.qml:547
419+msgid "Show all"
420+msgstr ""
421+
422+#: qml/Dash/GenericScopeView.qml:578
423+msgctxt "Label: Hint for dash search line edit"
424+msgid "Search"
425+msgstr "Пошук"
426+
427+#: qml/Dash/PageHeaderExtraPanel.qml:67
428+msgid "Recent Searches"
429+msgstr ""
430+
431+#: qml/Dash/PageHeaderExtraPanel.qml:78
432+msgid "Clear All"
433+msgstr ""
434+
435+#: qml/Dash/Previews/PreviewActionCombo.qml:36
436+msgid "More..."
437+msgstr "Болей…"
438+
439+#: qml/Dash/Previews/PreviewActionCombo.qml:36
440+msgid "Less..."
441+msgstr "Менш..."
442+
443+#: qml/Dash/Previews/PreviewCommentInput.qml:83
444+#: qml/Dash/Previews/PreviewRatingInput.qml:202
445+msgid "Send"
446+msgstr "Адправіць"
447+
448+#: qml/Dash/Previews/PreviewRatingInput.qml:109
449+msgid "Rate this"
450+msgstr "Ацаніць"
451+
452+#: qml/Dash/Previews/PreviewRatingInput.qml:184
453+msgid "Add a review"
454+msgstr "Дадаць рэцэнзію"
455+
456+#: qml/Dash/PullToRefreshScopeStyle.qml:56
457+msgid "Pull to refresh…"
458+msgstr "Пацягніце для абнаўлення..."
459+
460+#: qml/Dash/PullToRefreshScopeStyle.qml:61
461+msgid "Release to refresh…"
462+msgstr "Адпусціце для абнаўлення..."
463+
464+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
465+msgid "Enable location data"
466+msgstr "Уключыць дадзеныя аб месцазнаходжанні"
467+
468+#: qml/Dash/ScopesList.qml:146
469+msgid "Manage"
470+msgstr "Кіраванне"
471+
472+#: qml/Dash/ScopesList.qml:187
473+msgid "Home"
474+msgstr "Хатняя папка"
475+
476+#: qml/Dash/ScopesList.qml:188
477+msgid "Also installed"
478+msgstr "Таксама ўсталявана"
381
479
382#: qml/Greeter/CoverPage.qml:127
480#: qml/Greeter/CoverPage.qml:127
383msgid "Unlock"
481msgid "Unlock"
@@ -390,13 +488,12 @@ msgstr "Прылада заблакаваная"
390#: qml/Greeter/DelayedLockscreen.qml:58
488#: qml/Greeter/DelayedLockscreen.qml:58
391msgid "You have been locked out due to too many failed passphrase attempts."
489msgid "You have been locked out due to too many failed passphrase attempts."
392msgstr ""
490msgstr ""
393−"Вы былі заблакаваныя праз занадта вялікую колькасць няўдалых спробаў уводу "
491+"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў."
394−"пароля."
395
492
396#: qml/Greeter/DelayedLockscreen.qml:59
493#: qml/Greeter/DelayedLockscreen.qml:59
397msgid "You have been locked out due to too many failed passcode attempts."
494msgid "You have been locked out due to too many failed passcode attempts."
398msgstr ""
495msgstr ""
399−"Вы былі заблакаваныя праз занадта вялікую колькасць няўдалых спробаў уводу "
496+"Вы былі заблакаваныя з-за занадта вялікай колькасці няўдалых спробаў уводу "
400"кода доступу."
497"кода доступу."
401
498
402#: qml/Greeter/DelayedLockscreen.qml:68
499#: qml/Greeter/DelayedLockscreen.qml:68
@@ -409,43 +506,44 @@ msgstr[2] "Пачакайце %1 хвілін і паўтарыце спробу
409
506
410#: qml/Greeter/Greeter.qml:550
507#: qml/Greeter/Greeter.qml:550
411msgid "Try again"
508msgid "Try again"
412−msgstr "Паспрабаваць зноў"
509+msgstr ""
413
510
414#: qml/Greeter/Greeter.qml:551
511#: qml/Greeter/Greeter.qml:551
415msgid "Enter passphrase to unlock"
512msgid "Enter passphrase to unlock"
416−msgstr "Увядзіце парольную фразу, каб разблакаваць"
513+msgstr ""
417
514
418#: qml/Greeter/Greeter.qml:552
515#: qml/Greeter/Greeter.qml:552
419msgid "Enter passcode to unlock"
516msgid "Enter passcode to unlock"
420−msgstr "Увядзіце код доступу, каб разблакаваць"
517+msgstr ""
421
518
422−#: qml/Greeter/NarrowView.qml:235
519+#: qml/Greeter/NarrowView.qml:228
423msgid "Emergency"
520msgid "Emergency"
424−msgstr "Экстраны выклік"
521+msgstr ""
425
522
426#: qml/Greeter/PromptList.qml:126
523#: qml/Greeter/PromptList.qml:126
427msgid "Passphrase"
524msgid "Passphrase"
428−msgstr "Парольная фраза"
525+msgstr ""
429
526
430#: qml/Greeter/PromptList.qml:126
527#: qml/Greeter/PromptList.qml:126
431msgid "Passcode"
528msgid "Passcode"
432−msgstr "Код доступу"
529+msgstr ""
433
530
434#: qml/Greeter/SessionsList.qml:124
531#: qml/Greeter/SessionsList.qml:124
435msgid "Select desktop environment"
532msgid "Select desktop environment"
436−msgstr "Абраць працоўнае асяроддзе"
533+msgstr ""
437
534
438−#: qml/Launcher/Drawer.qml:250
535+#: qml/Launcher/Drawer.qml:94
439msgid "Search…"
536msgid "Search…"
440−msgstr "Пошук…"
537+msgstr ""
441
538
442−#: qml/Launcher/PullToRefreshScopeStyle.qml:56
539+#: qml/Launcher/Drawer.qml:129
540+msgctxt "Apps sorted alphabetically"
443−msgid "Pull to refresh…"
541+msgid "A-Z"
444−msgstr "Пацягніце для абнаўлення..."
542+msgstr ""
445
543
446−#: qml/Launcher/PullToRefreshScopeStyle.qml:61
544+#: qml/Launcher/MoreAppsHeader.qml:55
447−msgid "Release to refresh…"
545+msgid "More apps in the store"
448−msgstr "Адпусціце для абнаўлення..."
546+msgstr ""
449
547
450#: qml/Notifications/NotificationMenuItemFactory.qml:124
548#: qml/Notifications/NotificationMenuItemFactory.qml:124
451msgid "Show password"
549msgid "Show password"
@@ -461,7 +559,7 @@ msgstr "Канферэнцыя"
461
559
462#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
560#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
463msgid "Nothing is playing"
561msgid "Nothing is playing"
464−msgstr "Нічога не прайграецца"
562+msgstr "Нічога не грае"
465
563
466#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
564#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
467#, qt-format
565#, qt-format
@@ -469,7 +567,7 @@ msgid "%1 hour"
469msgid_plural "%1 hours"
567msgid_plural "%1 hours"
470msgstr[0] "%1 гадзіна"
568msgstr[0] "%1 гадзіна"
471msgstr[1] "%1 гадзіны"
569msgstr[1] "%1 гадзіны"
472−msgstr[2] "%1 гадзін"
570+msgstr[2] "%1 гадзінаў"
473
571
474#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
572#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
475#, qt-format
573#, qt-format
@@ -477,7 +575,7 @@ msgid "%1 minute"
477msgid_plural "%1 minutes"
575msgid_plural "%1 minutes"
478msgstr[0] "%1 хвіліна"
576msgstr[0] "%1 хвіліна"
479msgstr[1] "%1 хвіліны"
577msgstr[1] "%1 хвіліны"
480−msgstr[2] "%1 хвілін"
578+msgstr[2] "%1 хвілінаў"
481
579
482#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
580#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
483#, qt-format
581#, qt-format
@@ -485,7 +583,7 @@ msgid "%1 second"
485msgid_plural "%1 seconds"
583msgid_plural "%1 seconds"
486msgstr[0] "%1 секунда"
584msgstr[0] "%1 секунда"
487msgstr[1] "%1 секунды"
585msgstr[1] "%1 секунды"
488−msgstr[2] "%1 секунд"
586+msgstr[2] "%1 секундаў"
489
587
490#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
588#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
491msgid "0 seconds"
589msgid "0 seconds"
@@ -495,15 +593,15 @@ msgstr "0 секунд"
495#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
593#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1011
496#, qt-format
594#, qt-format
497msgid "%1 remaining"
595msgid "%1 remaining"
498−msgstr "Засталося %1"
596+msgstr "%1 засталося"
499
597
500#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
598#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
501msgid "In queue…"
599msgid "In queue…"
502−msgstr "У чарзе…"
600+msgstr "У чарзе..."
503
601
504#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
602#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
505msgid "Downloading"
603msgid "Downloading"
506−msgstr "Запампоўванне"
604+msgstr "Запампоўка"
507
605
508#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
606#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
509msgid "Paused, tap to resume"
607msgid "Paused, tap to resume"
@@ -515,7 +613,7 @@ msgstr "Скасавана"
515
613
516#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
614#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1027
517msgid "Finished"
615msgid "Finished"
518−msgstr "Завершана"
616+msgstr "Скончана"
519
617
520#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
618#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1029
521msgid "Failed, tap to retry"
619msgid "Failed, tap to retry"
@@ -525,7 +623,7 @@ msgstr "Не атрымалася, націсніце, каб паўтарыць
525#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
623#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
526msgctxt "Button: Send a reply message"
624msgctxt "Button: Send a reply message"
527msgid "Send"
625msgid "Send"
528−msgstr "Адправіць"
626+msgstr "Даслаць"
529
627
530#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
628#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
531msgctxt "Label: Hint in message indicator line edit"
629msgctxt "Label: Hint in message indicator line edit"
@@ -539,265 +637,279 @@ msgstr "Патэлефанаваць"
539
637
540#: qml/Panel/PanelMenuPage.qml:92
638#: qml/Panel/PanelMenuPage.qml:92
541msgid "Back"
639msgid "Back"
542−msgstr "Назад"
640+msgstr ""
543
641
544#: qml/Stage/SideStage.qml:76
642#: qml/Stage/SideStage.qml:76
545msgid "Drag using 3 fingers any application from one window to the other"
643msgid "Drag using 3 fingers any application from one window to the other"
546−msgstr "Перацягвайце любую праграму пры дапамозе трох пальцаў"
644+msgstr ""
547−
548−#: qml/Stage/Stage.qml:671
549−msgid "No running apps"
550−msgstr "Няма запушчаных праграм"
551
645
552#: qml/Tutorial/TutorialLeftLong.qml:49
646#: qml/Tutorial/TutorialLeftLong.qml:49
553msgid "Long swipe from the left edge to open the Application Drawer"
647msgid "Long swipe from the left edge to open the Application Drawer"
554−msgstr "Правядзіце ад левага краю, каб адкрыць панэль праграм"
648+msgstr ""
555
649
556#: qml/Tutorial/TutorialLeft.qml:47
650#: qml/Tutorial/TutorialLeft.qml:47
557msgid "Short swipe from the left edge to open the launcher"
651msgid "Short swipe from the left edge to open the launcher"
558−msgstr "Коратка правядзіце ад левага краю, каб адкрыць панэль запуску"
652+msgstr ""
559
653
560−#: qml/Tutorial/TutorialRight.qml:54
654+#: qml/Tutorial/TutorialRight.qml:55
561msgid "Push your mouse against the right edge to view your open apps"
655msgid "Push your mouse against the right edge to view your open apps"
562msgstr ""
656msgstr ""
563−"Навядзіце курсор мышы на правы край экрана, каб праглядзець спіс адкрытых "
564−"акон праграм"
565
657
566−#: qml/Tutorial/TutorialRight.qml:55
658+#: qml/Tutorial/TutorialRight.qml:56
567msgid "Swipe from the right edge to view your open apps"
659msgid "Swipe from the right edge to view your open apps"
568−msgstr "Правядзіце ад правага краю, каб праглядзець спіс адкрытых акон праграм"
660+msgstr ""
569
661
570#: qml/Tutorial/TutorialTop.qml:53
662#: qml/Tutorial/TutorialTop.qml:53
571msgid "Swipe from the top edge to access notifications and quick settings"
663msgid "Swipe from the top edge to access notifications and quick settings"
572msgstr ""
664msgstr ""
573−"Правядзіце ад верхняга краю, каб атрымаць доступ да апавяшчэнняў і хуткіх "
574−"налад"
575
665
576−#: qml/Wizard/Page.qml:59
666+#: qml/Wizard/Page.qml:54
577msgctxt "Button: Go back one page in the Wizard"
667msgctxt "Button: Go back one page in the Wizard"
578msgid "Back"
668msgid "Back"
579−msgstr "Назад"
669+msgstr "Вярнуцца"
580
670
581−#: qml/Wizard/Pages/10-welcome.qml:29
671+#: qml/Wizard/Pages/10-welcome.qml:28
582msgid "Language"
672msgid "Language"
583−msgstr "Мова"
673+msgstr ""
584−
585−#: qml/Wizard/Pages/10-welcome.qml:176
586−#: qml/Wizard/Pages/10-welcome-update.qml:126
587−#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
588−#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
589−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
590−#: qml/Wizard/Pages/passcode-desktop.qml:154
591−#: qml/Wizard/Pages/password-set.qml:153
592−msgid "Next"
593−msgstr "Далей"
594−
595−#: qml/Wizard/Pages/10-welcome-update.qml:91
596−msgid "Welcome to "
597−msgstr "Вітаем у "
598−
599−#: qml/Wizard/Pages/10-welcome-update.qml:106
600−msgid "We will make sure your device is ready to use "
601−msgstr "Мы праверым, ці гатовая да выкарыстання вашая прылада "
602−
603−#: qml/Wizard/Pages/11-changelog.qml:28
604−msgid "What's new"
605−msgstr "Што новага"
606
674
607−#: qml/Wizard/Pages/11-changelog.qml:74
675+#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
676+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
677+#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
678+#: qml/Wizard/Pages/70-passwd-type.qml:145
679+#: qml/Wizard/Pages/75-report-check.qml:84
680+#: qml/Wizard/Pages/passcode-desktop.qml:142
681+#: qml/Wizard/Pages/password-set.qml:142
608−msgid "Loading..."
682+msgid "Next"
609−msgstr "Загрузка..."
683+msgstr ""
610
684
611#: qml/Wizard/Pages/20-keyboard.qml:31
685#: qml/Wizard/Pages/20-keyboard.qml:31
612msgid "Select Keyboard"
686msgid "Select Keyboard"
613−msgstr "Абярыце клавіятуру"
687+msgstr ""
614
688
615#: qml/Wizard/Pages/20-keyboard.qml:71
689#: qml/Wizard/Pages/20-keyboard.qml:71
616msgid "Keyboard language"
690msgid "Keyboard language"
617−msgstr "Мова клавіятуры"
691+msgstr ""
618
692
619#: qml/Wizard/Pages/20-keyboard.qml:93
693#: qml/Wizard/Pages/20-keyboard.qml:93
620msgid "Keyboard layout"
694msgid "Keyboard layout"
621−msgstr "Раскладка клавіятуры"
695+msgstr ""
622
696
623−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
697+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
624−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
625−#: qml/Wizard/Pages/sim.qml:101
698+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
626msgid "Skip"
699msgid "Skip"
627−msgstr "Мінуць"
700+msgstr "Прапусціць"
628
701
629−#: qml/Wizard/Pages/30-wifi.qml:31
702+#: qml/Wizard/Pages/30-wifi.qml:30
630msgid "Connect to Wi‑Fi"
703msgid "Connect to Wi‑Fi"
631−msgstr "Злучэнне з Wi-Fi"
704+msgstr "Злучыцца з Wi-Fi"
632
705
633−#: qml/Wizard/Pages/30-wifi.qml:139
706+#: qml/Wizard/Pages/30-wifi.qml:131
634msgid "Connected"
707msgid "Connected"
635−msgstr "Падлучана"
708+msgstr ""
636
709
637−#: qml/Wizard/Pages/30-wifi.qml:172
710+#: qml/Wizard/Pages/30-wifi.qml:164
638msgid "Available Wi-Fi networks"
711msgid "Available Wi-Fi networks"
639−msgstr "Даступныя сеткі Wi-Fi"
712+msgstr ""
640
713
641−#: qml/Wizard/Pages/30-wifi.qml:173
714+#: qml/Wizard/Pages/30-wifi.qml:165
642msgid "No available Wi-Fi networks"
715msgid "No available Wi-Fi networks"
643−msgstr "Няма даступных сетак Wi-Fi"
716+msgstr ""
717+
718+#: qml/Wizard/Pages/40-location.qml:27
719+msgid "Location Services"
720+msgstr ""
721+
722+#: qml/Wizard/Pages/40-location.qml:83
723+msgid ""
724+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
725+"(recommended)"
726+msgstr ""
727+
728+#: qml/Wizard/Pages/40-location.qml:105
729+#, qt-format
730+msgid "By selecting this option you agree to the Nokia HERE %1."
731+msgstr ""
732+
733+#: qml/Wizard/Pages/40-location.qml:106
734+msgctxt "part of: Nokia HERE terms and conditions"
735+msgid "terms and conditions"
736+msgstr ""
737+
738+#: qml/Wizard/Pages/40-location.qml:160
739+msgid "GPS only"
740+msgstr ""
741+
742+#: qml/Wizard/Pages/40-location.qml:214
743+msgid "Don't use my location"
744+msgstr ""
745+
746+#: qml/Wizard/Pages/40-location.qml:260
747+msgid "You can change it later in System Settings."
748+msgstr ""
644
749
645#: qml/Wizard/Pages/50-timezone.qml:30
750#: qml/Wizard/Pages/50-timezone.qml:30
646msgid "Time Zone"
751msgid "Time Zone"
647−msgstr "Часавы пояс"
752+msgstr ""
648
753
649−#: qml/Wizard/Pages/50-timezone.qml:183
754+#: qml/Wizard/Pages/50-timezone.qml:182
650msgid "Enter your city"
755msgid "Enter your city"
651−msgstr "Увядзіце ваш горад"
756+msgstr ""
652
757
653#: qml/Wizard/Pages/60-account.qml:24
758#: qml/Wizard/Pages/60-account.qml:24
654msgid "Personalize Your Device"
759msgid "Personalize Your Device"
655−msgstr "Персаналізацыя прылады"
760+msgstr ""
656
761
657−#: qml/Wizard/Pages/60-account.qml:54
762+#: qml/Wizard/Pages/60-account.qml:48
658msgid "Preferred Name"
763msgid "Preferred Name"
659−msgstr "Пераважнае імя"
764+msgstr ""
660
765
661#: qml/Wizard/Pages/70-passwd-type.qml:40
766#: qml/Wizard/Pages/70-passwd-type.qml:40
662msgid "Lock Screen"
767msgid "Lock Screen"
663−msgstr "Заблакаваць экран"
768+msgstr ""
664
769
665−#: qml/Wizard/Pages/70-passwd-type.qml:103
770+#: qml/Wizard/Pages/70-passwd-type.qml:102
666msgctxt "Label: Type of security method"
771msgctxt "Label: Type of security method"
667msgid "Create new password"
772msgid "Create new password"
668−msgstr "Стварыць новы пароль"
773+msgstr ""
669
774
670−#: qml/Wizard/Pages/70-passwd-type.qml:105
775+#: qml/Wizard/Pages/70-passwd-type.qml:104
671msgctxt "Label: Type of security method"
776msgctxt "Label: Type of security method"
672msgid "Create passcode (numbers only)"
777msgid "Create passcode (numbers only)"
673−msgstr "Стварыць код доступу (толькі лічбы)"
778+msgstr ""
674
779
675−#: qml/Wizard/Pages/70-passwd-type.qml:107
780+#: qml/Wizard/Pages/70-passwd-type.qml:106
676msgctxt "Label: Type of security method"
781msgctxt "Label: Type of security method"
677msgid "No lock code"
782msgid "No lock code"
678−msgstr "Без кода блакавання"
783+msgstr ""
679
784
680−#: qml/Wizard/Pages/79-system-update.qml:28
785+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
681−msgid "Update Device"
786+msgid "Privacy Policy"
682−msgstr "Абнавіць прыладу"
787+msgstr ""
683
788
684−#: qml/Wizard/Pages/79-system-update.qml:55
789+#: qml/Wizard/Pages/75-report-check.qml:26
685−msgid ""
790+msgid "Help Us Improve"
686−"There is a system update available and ready to install. Afterwards, the "
687−"device will automatically restart."
688msgstr ""
791msgstr ""
689−"Ёсць даступнае абнаўленне сістэмы, якое можна ўсталяваць. Пасля ўсталёўкі "
690−"сістэма аўтаматычна перазапусціцца."
691
792
692−#: qml/Wizard/Pages/79-system-update.qml:76
793+#: qml/Wizard/Pages/75-report-check.qml:59
693−msgctxt "string identifying name of the update"
794+msgid "Improve system performance by sending us crashes and error reports."
694−msgid "Ubuntu Touch system"
795+msgstr ""
695−msgstr "Сістэма Ubuntu Touch"
696
796
697−#: qml/Wizard/Pages/79-system-update.qml:83
797+#: qml/Wizard/Pages/75-report-check.qml:60
698−#, qt-format
798+msgid "Privacy policy"
699−msgctxt "version of the system update"
799+msgstr ""
700−msgid "Version %1"
800+
801+#: qml/Wizard/Pages/80-finished.qml:89
802+msgid "Welcome to Ubuntu"
701−msgstr "Версія %1"
803+msgstr ""
702
804
703−#: qml/Wizard/Pages/79-system-update.qml:95
805+#: qml/Wizard/Pages/80-finished.qml:104
704−msgid "This could take a few minutes..."
806+msgid "You are ready to use your device now"
705−msgstr "Аперацыя можа заняць некалькі хвілін…"
807+msgstr ""
706
808
707−#: qml/Wizard/Pages/79-system-update.qml:109
809+#: qml/Wizard/Pages/80-finished.qml:124
708−msgid "Install and restart now"
810+msgid "Get Started"
709−msgstr "Усталяваць і перазапусціць"
811+msgstr ""
710
812
711−#: qml/Wizard/Pages/80-finished.qml:91
813+#: qml/Wizard/Pages/here-terms.qml:25
712−msgid "Welcome Back"
814+msgid "Terms & Conditions"
713−msgstr "Сардэчна запрашаем назад"
815+msgstr "Умовы карыстання"
714
816
715−#: qml/Wizard/Pages/80-finished.qml:91
817+#: qml/Wizard/Pages/here-terms.qml:69
716−msgid "Welcome to Ubuntu"
818+msgid "Your device uses positioning technologies provided by HERE."
717−msgstr "Вітаем ва Ubuntu"
819+msgstr ""
718
820
719−#: qml/Wizard/Pages/80-finished.qml:106
821+#: qml/Wizard/Pages/here-terms.qml:81
720−msgid "You are ready to use your device now"
822+msgid ""
721−msgstr "Цяпер прылада гатовая да выкарыстання"
823+"To provide you with positioning services and to improve their quality, HERE "
824+"collects information about nearby cell towers and Wi-Fi hotspots around your "
825+"current location whenever your position is being found."
826+msgstr ""
722
827
723−#: qml/Wizard/Pages/80-finished.qml:126
828+#: qml/Wizard/Pages/here-terms.qml:93
724−msgid "Continue"
829+msgid ""
725−msgstr "Працягнуць"
830+"The information collected is used to analyze the service and to improve the "
831+"use of service, but not to identify you personally."
832+msgstr ""
726
833
727−#: qml/Wizard/Pages/80-finished.qml:126
834+#: qml/Wizard/Pages/here-terms.qml:106
728−msgid "Get Started"
835+#, qt-format
836+msgid "By continuing, you agree to the HERE platform %1 and %2."
729−msgstr "Пачаць"
837+msgstr ""
838+
839+#: qml/Wizard/Pages/here-terms.qml:107
840+msgid "Service Terms"
841+msgstr ""
730
842
731#: qml/Wizard/Pages/passcode-confirm.qml:43
843#: qml/Wizard/Pages/passcode-confirm.qml:43
732−#: qml/Wizard/Pages/passcode-desktop.qml:104
844+#: qml/Wizard/Pages/passcode-desktop.qml:97
733msgid "Confirm passcode"
845msgid "Confirm passcode"
734−msgstr "Пацвердзіце код доступу"
846+msgstr "Пацвердзіце код-пароль"
735
847
736#: qml/Wizard/Pages/passcode-confirm.qml:45
848#: qml/Wizard/Pages/passcode-confirm.qml:45
737msgid "Incorrect passcode."
849msgid "Incorrect passcode."
738−msgstr "Няправільны код доступу."
850+msgstr ""
739
851
740#: qml/Wizard/Pages/passcode-confirm.qml:45
852#: qml/Wizard/Pages/passcode-confirm.qml:45
741msgctxt "Enter the passcode again"
853msgctxt "Enter the passcode again"
742msgid "Please re-enter."
854msgid "Please re-enter."
743−msgstr "Увядзіце нанова."
855+msgstr ""
744
856
745#: qml/Wizard/Pages/passcode-desktop.qml:31
857#: qml/Wizard/Pages/passcode-desktop.qml:31
746msgid "Lock Screen Passcode"
858msgid "Lock Screen Passcode"
747−msgstr "Код блакавання экрана"
859+msgstr ""
748
860
749−#: qml/Wizard/Pages/passcode-desktop.qml:68
861+#: qml/Wizard/Pages/passcode-desktop.qml:61
750msgid "Enter 4 numbers to setup your passcode"
862msgid "Enter 4 numbers to setup your passcode"
751−msgstr "Увядзіце код блакавання з чаторых лічбаў"
863+msgstr ""
752
864
753−#: qml/Wizard/Pages/passcode-desktop.qml:84
865+#: qml/Wizard/Pages/passcode-desktop.qml:77
754#: qml/Wizard/Pages/passcode-set.qml:54
866#: qml/Wizard/Pages/passcode-set.qml:54
755msgid "Choose passcode"
867msgid "Choose passcode"
756−msgstr "Абраць код доступу"
868+msgstr ""
757
869
758−#: qml/Wizard/Pages/passcode-desktop.qml:139
870+#: qml/Wizard/Pages/passcode-desktop.qml:127
759msgid "Passcode too short"
871msgid "Passcode too short"
760−msgstr "Код доступу занадта кароткі"
872+msgstr ""
761
873
762−#: qml/Wizard/Pages/passcode-desktop.qml:141
874+#: qml/Wizard/Pages/passcode-desktop.qml:129
763msgid "Passcodes match"
875msgid "Passcodes match"
764−msgstr "Коды доступу супадаюць"
876+msgstr ""
765
877
766−#: qml/Wizard/Pages/passcode-desktop.qml:143
878+#: qml/Wizard/Pages/passcode-desktop.qml:131
767msgid "Passcodes do not match"
879msgid "Passcodes do not match"
768−msgstr "Коды доступу не супадаюць"
880+msgstr ""
769
881
770#: qml/Wizard/Pages/passcode-set.qml:62
882#: qml/Wizard/Pages/passcode-set.qml:62
771msgid "Passcode must be 4 characters long"
883msgid "Passcode must be 4 characters long"
772−msgstr "Код доступу павінен складацца з чатырох лічбаў"
884+msgstr ""
773
885
774#: qml/Wizard/Pages/password-set.qml:31
886#: qml/Wizard/Pages/password-set.qml:31
775msgid "Lock Screen Password"
887msgid "Lock Screen Password"
776−msgstr "Пароль блакавання экрана"
888+msgstr ""
777
889
778−#: qml/Wizard/Pages/password-set.qml:68
890+#: qml/Wizard/Pages/password-set.qml:62
779msgid "Enter at least 8 characters"
891msgid "Enter at least 8 characters"
780−msgstr "Увядзіце прынамсі 8 сімвалаў"
892+msgstr ""
781
893
782−#: qml/Wizard/Pages/password-set.qml:80
894+#: qml/Wizard/Pages/password-set.qml:74
783msgid "Choose password"
895msgid "Choose password"
784−msgstr "Абярыце пароль"
896+msgstr ""
785
897
786−#: qml/Wizard/Pages/password-set.qml:110
898+#: qml/Wizard/Pages/password-set.qml:104
787msgid "Confirm password"
899msgid "Confirm password"
788−msgstr "Пацвердзіце пароль"
900+msgstr ""
789
901
790#: qml/Wizard/Pages/sim.qml:27
902#: qml/Wizard/Pages/sim.qml:27
791msgid "No SIM card installed"
903msgid "No SIM card installed"
792−msgstr "SIM-картка не ўстаўленая"
904+msgstr ""
793
905
794#: qml/Wizard/Pages/sim.qml:54
906#: qml/Wizard/Pages/sim.qml:54
795msgid "SIM card added"
907msgid "SIM card added"
796−msgstr "Дададзена SIM-картка"
908+msgstr ""
797
909
798#: qml/Wizard/Pages/sim.qml:55
910#: qml/Wizard/Pages/sim.qml:55
799msgid "You must restart the device to access the mobile network."
911msgid "You must restart the device to access the mobile network."
800−msgstr "Для доступу да мабільнай сеткі неабходна перазапусціць прыладу."
912+msgstr ""
801
913
802#: qml/Wizard/Pages/sim.qml:59
914#: qml/Wizard/Pages/sim.qml:59
803msgid "Restart"
915msgid "Restart"
@@ -805,123 +917,39 @@ msgstr "Перазапусціць"
805
917
806#: qml/Wizard/Pages/sim.qml:78
918#: qml/Wizard/Pages/sim.qml:78
807msgid "You won’t be able to make calls or use text messaging without a SIM."
919msgid "You won’t be able to make calls or use text messaging without a SIM."
808−msgstr "Без SIM-карткі немагчыма тэлефанаваць і адпраўляць SMS."
920+msgstr ""
809
921
810#: qml/Wizard/Pages/sim.qml:90
922#: qml/Wizard/Pages/sim.qml:90
811msgid "To proceed with no SIM tap Skip."
923msgid "To proceed with no SIM tap Skip."
812−msgstr "Каб працягнуць працу без SIM-карткі, націсніце \"Прамінуць\"."
924+msgstr ""
813
925
814#: qml/Wizard/PasswordMeter.qml:87
926#: qml/Wizard/PasswordMeter.qml:87
815msgid "Password too short"
927msgid "Password too short"
816−msgstr "Пароль занадта кароткі"
928+msgstr ""
817
929
818#: qml/Wizard/PasswordMeter.qml:89
930#: qml/Wizard/PasswordMeter.qml:89
819msgid "Passwords match"
931msgid "Passwords match"
820−msgstr "Паролі супадаюць"
932+msgstr ""
821
933
822#: qml/Wizard/PasswordMeter.qml:91
934#: qml/Wizard/PasswordMeter.qml:91
823msgid "Passwords do not match"
935msgid "Passwords do not match"
824−msgstr "Паролі не супадаюць"
936+msgstr ""
825
937
826#: qml/Wizard/PasswordMeter.qml:95
938#: qml/Wizard/PasswordMeter.qml:95
827msgid "Strong password"
939msgid "Strong password"
828−msgstr "Надзейны пароль"
940+msgstr ""
829
941
830#: qml/Wizard/PasswordMeter.qml:97
942#: qml/Wizard/PasswordMeter.qml:97
831msgid "Fair password"
943msgid "Fair password"
832−msgstr "Неблагі пароль"
944+msgstr ""
833
945
834#: qml/Wizard/PasswordMeter.qml:99
946#: qml/Wizard/PasswordMeter.qml:99
835msgid "Weak password"
947msgid "Weak password"
836−msgstr "Слабы пароль"
948+msgstr ""
837
949
838#: qml/Wizard/PasswordMeter.qml:101
950#: qml/Wizard/PasswordMeter.qml:101
839msgid "Very weak password"
951msgid "Very weak password"
840−msgstr "Вельмы слабы пароль"
952+msgstr ""
841−
842−#~ msgid "Unity 8"
843−#~ msgstr "Unity 8"
844−
845−#~ msgid "Scopes"
846−#~ msgstr "Лінзы"
847−
848−#~ msgid "Super (Tap)"
849−#~ msgstr "Super (націск)"
850−
851−#~ msgid "Opens the Scopes home."
852−#~ msgstr "Адкрывае старонку лінзаў."
853−
854−#~ msgctxt "Button: Open the Ubuntu Store"
855−#~ msgid "Store"
856−#~ msgstr "Крама"
857−
858−#~ msgctxt "Button: Start a search in the current dash scope"
859−#~ msgid "Search"
860−#~ msgstr "Пошук"
861−
862−#~ msgctxt "Button: Show the current dash scope settings"
863−#~ msgid "Settings"
864−#~ msgstr "Налады"
865−
866−#~ msgid "Remove from Favorites"
867−#~ msgstr "Выдаліць з абранага"
868−
869−#~ msgid "Add to Favorites"
870−#~ msgstr "Дадаць да абранага"
871−
872−#~ msgctxt "Label: Hint for dash search line edit"
873−#~ msgid "Search"
874−#~ msgstr "Пошук"
875−
876−#~ msgid "More..."
877−#~ msgstr "Болей…"
878−
879−#~ msgid "Less..."
880−#~ msgstr "Менш..."
881−
882−#~ msgid "Send"
883−#~ msgstr "Адправіць"
884−
885−#~ msgid "Rate this"
886−#~ msgstr "Ацаніць"
887−
888−#~ msgid "Add a review"
889−#~ msgstr "Дадаць рэцэнзію"
890−
891−#~ msgid "Enable location data"
892−#~ msgstr "Уключыць дадзеныя аб месцазнаходжанні"
893−
894−#~ msgid "Manage"
895−#~ msgstr "Кіраванне"
896−
897−#~ msgid "Home"
898−#~ msgstr "Хатняя папка"
899−
900−#~ msgid "Also installed"
901−#~ msgstr "Таксама ўсталявана"
902−
903−#, fuzzy
904−#~ msgid "Please wait..."
905−#~ msgstr "Загрузка. Чакайце..."
906−
907−#, fuzzy
908−#~ msgid "Update all"
909−#~ msgstr "Не дазваляць"
910−
911−#, fuzzy
912−#~ msgid "Download"
913−#~ msgstr "Запампоўка"
914−
915−#, fuzzy
916−#~ msgid "Downloaded"
917−#~ msgstr "Запампоўка"
918−
919−#, fuzzy
920−#~ msgid "Installed"
921−#~ msgstr "Таксама ўсталявана"
922−
923−#~ msgid "Terms & Conditions"
924−#~ msgstr "Умовы карыстання"
925
953
926#~ msgid "Reboot"
954#~ msgid "Reboot"
927#~ msgstr "Перазагрузіць"
955#~ msgstr "Перазагрузіць"
@@ -938,6 +966,9 @@ msgstr "Вельмы слабы пароль"
938#~ msgid "Left edge"
966#~ msgid "Left edge"
939#~ msgstr "Левы край"
967#~ msgstr "Левы край"
940
968
969+#~ msgid "Search"
970+#~ msgstr "Пошук"
971+
941#~ msgid "Confirm"
972#~ msgid "Confirm"
942#~ msgstr "Пацвердзіць"
973#~ msgstr "Пацвердзіць"
943
974
@@ -950,18 +981,29 @@ msgstr "Вельмы слабы пароль"
950#~ msgid "Try swiping from the right edge to unlock the phone"
981#~ msgid "Try swiping from the right edge to unlock the phone"
951#~ msgstr "Правядзіце пальцам з правага краю, каб разблакаваць тэлефон"
982#~ msgstr "Правядзіце пальцам з правага краю, каб разблакаваць тэлефон"
952
983
984+#~ msgid "Loading. Please Wait..."
985+#~ msgstr "Загрузка. Чакайце..."
986+
987+#~ msgid "Speaking..."
988+#~ msgstr "Кажа..."
989+
953#~ msgid "Speak Now..."
990#~ msgid "Speak Now..."
954#~ msgstr "Кажыце..."
991#~ msgstr "Кажыце..."
955
992
956#~ msgid "Type or say a command"
993#~ msgid "Type or say a command"
957#~ msgstr "Напішыце або вымавіце каманду"
994#~ msgstr "Напішыце або вымавіце каманду"
958
995
996+#, qt-format
959#~ msgid "Enter %1"
997#~ msgid "Enter %1"
960#~ msgstr "Увядзіце %1"
998#~ msgstr "Увядзіце %1"
961
999
1000+#, qt-format
962#~ msgid "Sorry, incorrect %1"
1001#~ msgid "Sorry, incorrect %1"
963#~ msgstr "Даруйце, некарэктны %1"
1002#~ msgstr "Даруйце, некарэктны %1"
964
1003
1004+#~ msgid "Enter passcode"
1005+#~ msgstr "Увядзіце код"
1006+
965#~ msgid "This will be your last attempt."
1007#~ msgid "This will be your last attempt."
966#~ msgstr "Апошняя спроба."
1008#~ msgstr "Апошняя спроба."
967
1009
@@ -985,8 +1027,8 @@ msgstr "Вельмы слабы пароль"
985
1027
986#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
1028#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
987#~ msgstr ""
1029#~ msgstr ""
988−#~ "Правядзіце пальцам ад левага краю, каб адкрыць панэль запуску для "
1030+#~ "Правядзіце пальцам ад левага краю, каб адкрыць панэль запуску для паскарэння "
989−#~ "паскарэння доступу да праграм"
1031+#~ "доступу да праграм"
990
1032
991#~ msgid "Skip intro"
1033#~ msgid "Skip intro"
992#~ msgstr "Прапусціць уводзіны"
1034#~ msgstr "Прапусціць уводзіны"
@@ -1012,6 +1054,9 @@ msgstr "Вельмы слабы пароль"
1012#~ msgid "Let’s get started."
1054#~ msgid "Let’s get started."
1013#~ msgstr "Пачнем."
1055#~ msgstr "Пачнем."
1014
1056
1057+#~ msgid "Continue"
1058+#~ msgstr "Працягнуць"
1059+
1015#~ msgid "Please select how you’d like to unlock your phone."
1060#~ msgid "Please select how you’d like to unlock your phone."
1016#~ msgstr "Калі ласка, абярыце спосаб разблакавання тэлефона."
1061#~ msgstr "Калі ласка, абярыце спосаб разблакавання тэлефона."
1017
1062
@@ -1032,8 +1077,7 @@ msgstr "Вельмы слабы пароль"
1032
1077
1033#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1078#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
1034#~ msgstr ""
1079#~ msgstr ""
1035−#~ "На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі "
1080+#~ "На аснове GPS, ананімізаванага Wi-Fi і дадзеных сотавай сеткі (рэкамендуецца)"
1036−#~ "(рэкамендуецца)"
1037
1081
1038#~ msgid "Improving your experience"
1082#~ msgid "Improving your experience"
1039#~ msgstr "Спрашчэнне вашай працы"
1083#~ msgstr "Спрашчэнне вашай працы"
@@ -1058,18 +1102,23 @@ msgstr "Вельмы слабы пароль"
1058#~ msgstr "Цяпер Вашым тэлефонам можна карыстацца."
1102#~ msgstr "Цяпер Вашым тэлефонам можна карыстацца."
1059
1103
1060#~ msgid ""
1104#~ msgid ""
1061−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1105+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1062−#~ "and conditions</a>."
1106+#~ "conditions</a>."
1063#~ msgstr ""
1107#~ msgstr ""
1064#~ "Выбарам гэтага варыянту дзеянняў вы згаджаецеся з <a href='#'> умовамі "
1108#~ "Выбарам гэтага варыянту дзеянняў вы згаджаецеся з <a href='#'> умовамі "
1065#~ "прадстаўлення паслуг Nokia HERE</a>."
1109#~ "прадстаўлення паслуг Nokia HERE</a>."
1066
1110
1111+#~ msgid "Not at all"
1112+#~ msgstr "Не дазваляць"
1113+
1114+#, qt-format
1067#~ msgid "〈 %1"
1115#~ msgid "〈 %1"
1068#~ msgstr "〈 %1"
1116#~ msgstr "〈 %1"
1069
1117
1070#~ msgid "Confirm passphrase"
1118#~ msgid "Confirm passphrase"
1071#~ msgstr "Пацвердзіце пароль"
1119#~ msgstr "Пацвердзіце пароль"
1072
1120
1121+#, qt-format
1073#~ msgid "%1 〉"
1122#~ msgid "%1 〉"
1074#~ msgstr "%1 〉"
1123#~ msgstr "%1 〉"
1075
1124
@@ -1079,6 +1128,10 @@ msgstr "Вельмы слабы пароль"
1079#~ msgid "Close"
1128#~ msgid "Close"
1080#~ msgstr "Закрыць"
1129#~ msgstr "Закрыць"
1081
1130
1131+#~ msgid "Try swiping from the top edge to access the indicators"
1132+#~ msgstr ""
1133+#~ "Паспрабуйце правесці пальцам ад верхняга краю для доступу да індыкатараў"
1134+
1082#~ msgid "Settings"
1135#~ msgid "Settings"
1083#~ msgstr "Наладкі"
1136#~ msgstr "Наладкі"
1084
1137
@@ -1089,6 +1142,9 @@ msgstr "Вельмы слабы пароль"
1089#~ "Вы толькі што асвоілі асноўная жэсты і можаце пачаць выкарыстоўваць "
1142#~ "Вы толькі што асвоілі асноўная жэсты і можаце пачаць выкарыстоўваць "
1090#~ "тэлефон<br><br>Дакраніцеся да экрана, каб пачаць"
1143#~ "тэлефон<br><br>Дакраніцеся да экрана, каб пачаць"
1091
1144
1145+#~ msgid "Enter passphrase"
1146+#~ msgstr "Увядзіце пароль"
1147+
1092#~ msgid "Sorry, incorrect passcode."
1148#~ msgid "Sorry, incorrect passcode."
1093#~ msgstr "Даруйце, няслушны код."
1149#~ msgstr "Даруйце, няслушны код."
1094
1150
@@ -1156,6 +1212,9 @@ msgstr "Вельмы слабы пароль"
1156#~ msgid "Try again."
1212#~ msgid "Try again."
1157#~ msgstr "Паспрабуйце яшчэ."
1213#~ msgstr "Паспрабуйце яшчэ."
1158
1214
1215+#~ msgid "Open the launcher"
1216+#~ msgstr "Адкрыць панэль запуску"
1217+
1159#~ msgid "Tap here to continue."
1218#~ msgid "Tap here to continue."
1160#~ msgstr "Націсніце тут, каб працягнуць."
1219#~ msgstr "Націсніце тут, каб працягнуць."
1161
1220
@@ -1239,15 +1298,15 @@ msgstr "Вельмы слабы пароль"
1239#~ msgstr "Даруйце, некарэктны код"
1298#~ msgstr "Даруйце, некарэктны код"
1240
1299
1241#~ msgid ""
1300#~ msgid ""
1242−#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1301+#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1243−#~ "reset and all personal data will be deleted."
1302+#~ "and all personal data will be deleted."
1244#~ msgstr ""
1303#~ msgstr ""
1245−#~ "Калі ўведзены код неправільны, Ваш тэлефон зробіць агульны скід налад і "
1304+#~ "Калі ўведзены код неправільны, Ваш тэлефон зробіць агульны скід налад і ўсе "
1246−#~ "ўсе асабістыя дадзеныя будуць выдалены."
1305+#~ "асабістыя дадзеныя будуць выдалены."
1247
1306
1248#~ msgid ""
1307#~ msgid ""
1249#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1308#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1250#~ "reset and all personal data will be deleted."
1309#~ "reset and all personal data will be deleted."
1251#~ msgstr ""
1310#~ msgstr ""
1252−#~ "Калі ўведзены пароль неправільны, Ваш тэлефон зробіць агульны скід налад "
1311+#~ "Калі ўведзены пароль неправільны, Ваш тэлефон зробіць агульны скід налад і "
1253−#~ "і ўсе асабістыя дадзеныя будуць выдалены."
1312+#~ "ўсе асабістыя дадзеныя будуць выдалены."
po/bg.po+255−138
@@ -6,40 +6,39 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9−"Report-Msgid-Bugs-To: \n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2021-01-29 11:42-0600\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
14−"Language: bg\n"
15"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20−"X-Generator: Launchpad (build 18269)\n"
19+"X-Generator: Launchpad (build 18343)\n"
21
20
22−#: plugins/LightDM/Greeter.cpp:199
21+#: plugins/LightDM/Greeter.cpp:188
23msgid "Password: "
22msgid "Password: "
24msgstr ""
23msgstr ""
25
24
26−#: plugins/LightDM/Greeter.cpp:214
25+#: plugins/LightDM/Greeter.cpp:203
27msgid "Username"
26msgid "Username"
28msgstr ""
27msgstr ""
29
28
30−#: plugins/LightDM/Greeter.cpp:258
29+#: plugins/LightDM/Greeter.cpp:242
31msgid "Failed to authenticate"
30msgid "Failed to authenticate"
32msgstr ""
31msgstr ""
33
32
34−#: plugins/LightDM/Greeter.cpp:260
33+#: plugins/LightDM/Greeter.cpp:244
35msgid "Invalid password, please try again"
34msgid "Invalid password, please try again"
36msgstr ""
35msgstr ""
37
36
38−#: plugins/LightDM/Greeter.cpp:270
37+#: plugins/LightDM/Greeter.cpp:254
39msgid "Log In"
38msgid "Log In"
40msgstr ""
39msgstr ""
41
40
42−#: plugins/LightDM/Greeter.cpp:270
41+#: plugins/LightDM/Greeter.cpp:254
43msgid "Retry"
42msgid "Retry"
44msgstr ""
43msgstr ""
45
44
@@ -51,16 +50,16 @@ msgstr ""
51msgid "Guest Session"
50msgid "Guest Session"
52msgstr ""
51msgstr ""
53
52
54−#: plugins/Unity/Launcher/launcheritem.cpp:48
53+#: plugins/Unity/Launcher/launcheritem.cpp:49
55−#: plugins/Unity/Launcher/launcheritem.cpp:122
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
56msgid "Pin shortcut"
55msgid "Pin shortcut"
57msgstr ""
56msgstr ""
58
57
59−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
60msgid "Quit"
59msgid "Quit"
61msgstr ""
60msgstr ""
62
61
63−#: plugins/Unity/Launcher/launcheritem.cpp:122
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
64msgid "Unpin shortcut"
63msgid "Unpin shortcut"
65msgstr ""
64msgstr ""
66
65
@@ -83,8 +82,9 @@ msgctxt "Button: Log out from the system"
83msgid "Log Out"
82msgid "Log Out"
84msgstr ""
83msgstr ""
85
84
86−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Wizard/Pages/passcode-confirm.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
89msgid "Cancel"
89msgid "Cancel"
90msgstr ""
90msgstr ""
@@ -106,12 +106,12 @@ msgstr ""
106msgid "Yes"
106msgid "Yes"
107msgstr ""
107msgstr ""
108
108
109−#: qml/Components/Dialogs.qml:243
109+#: qml/Components/Dialogs.qml:239
110msgctxt "Title: Power off/Restart dialog"
110msgctxt "Title: Power off/Restart dialog"
111msgid "Power"
111msgid "Power"
112msgstr ""
112msgstr ""
113
113
114−#: qml/Components/Dialogs.qml:244
114+#: qml/Components/Dialogs.qml:240
115msgid ""
115msgid ""
116"Are you sure you would like\n"
116"Are you sure you would like\n"
117"to power off?"
117"to power off?"
@@ -119,26 +119,22 @@ msgstr ""
119"Искате ли да \n"
119"Искате ли да \n"
120"изключите захранването на устройството?"
120"изключите захранването на устройството?"
121
121
122−#: qml/Components/Dialogs.qml:248
122+#: qml/Components/Dialogs.qml:244
123msgctxt "Button: Power off the system"
123msgctxt "Button: Power off the system"
124msgid "Power off"
124msgid "Power off"
125msgstr ""
125msgstr ""
126
126
127−#: qml/Components/Dialogs.qml:263
127+#: qml/Components/Dialogs.qml:255
128msgctxt "Button: Restart the system"
128msgctxt "Button: Restart the system"
129msgid "Restart"
129msgid "Restart"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Components/Dialogs.qml:276
133−msgid "Screenshot"
134−msgstr ""
135−
136#: qml/Components/KeyboardShortcutsOverlay.qml:41
132#: qml/Components/KeyboardShortcutsOverlay.qml:41
137msgid "Keyboard Shortcuts"
133msgid "Keyboard Shortcuts"
138msgstr ""
134msgstr ""
139
135
140#: qml/Components/KeyboardShortcutsOverlay.qml:55
136#: qml/Components/KeyboardShortcutsOverlay.qml:55
141−msgid "Lomiri"
137+msgid "Unity 8"
142msgstr ""
138msgstr ""
143
139
144#: qml/Components/KeyboardShortcutsOverlay.qml:62
140#: qml/Components/KeyboardShortcutsOverlay.qml:62
@@ -225,6 +221,18 @@ msgstr ""
225msgid "Opens the Application Drawer."
221msgid "Opens the Application Drawer."
226msgstr ""
222msgstr ""
227
223
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
225+msgid "Scopes"
226+msgstr ""
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
229+msgid "Super (Tap)"
230+msgstr ""
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
233+msgid "Opens the Scopes home."
234+msgstr ""
235+
228#: qml/Components/KeyboardShortcutsOverlay.qml:235
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
229msgid "Switching"
237msgid "Switching"
230msgstr ""
238msgstr ""
@@ -297,7 +305,7 @@ msgstr ""
297msgid "Closes the current window."
305msgid "Closes the current window."
298msgstr ""
306msgstr ""
299
307
300−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
301msgid "Return to Call"
309msgid "Return to Call"
302msgstr ""
310msgstr ""
303
311
@@ -371,6 +379,103 @@ msgstr ""
371msgid "Find more settings in the system settings."
379msgid "Find more settings in the system settings."
372msgstr ""
380msgstr ""
373
381
382+#: qml/Dash/DashPageHeader.qml:361
383+msgctxt "Button: Open the Ubuntu Store"
384+msgid "Store"
385+msgstr ""
386+
387+#: qml/Dash/DashPageHeader.qml:368
388+msgctxt "Button: Start a search in the current dash scope"
389+msgid "Search"
390+msgstr ""
391+
392+#: qml/Dash/DashPageHeader.qml:378
393+msgctxt "Button: Show the current dash scope settings"
394+msgid "Settings"
395+msgstr ""
396+
397+#: qml/Dash/DashPageHeader.qml:385
398+msgid "Remove from Favorites"
399+msgstr ""
400+
401+#: qml/Dash/DashPageHeader.qml:385
402+msgid "Add to Favorites"
403+msgstr ""
404+
405+#: qml/Dash/FiltersPopover.qml:61
406+msgid "Refine your results"
407+msgstr ""
408+
409+#: qml/Dash/FiltersPopover.qml:70
410+msgid "Reset"
411+msgstr ""
412+
413+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
414+msgid "Show less"
415+msgstr ""
416+
417+#: qml/Dash/GenericScopeView.qml:547
418+msgid "Show all"
419+msgstr ""
420+
421+#: qml/Dash/GenericScopeView.qml:578
422+msgctxt "Label: Hint for dash search line edit"
423+msgid "Search"
424+msgstr ""
425+
426+#: qml/Dash/PageHeaderExtraPanel.qml:67
427+msgid "Recent Searches"
428+msgstr ""
429+
430+#: qml/Dash/PageHeaderExtraPanel.qml:78
431+msgid "Clear All"
432+msgstr ""
433+
434+#: qml/Dash/Previews/PreviewActionCombo.qml:36
435+msgid "More..."
436+msgstr ""
437+
438+#: qml/Dash/Previews/PreviewActionCombo.qml:36
439+msgid "Less..."
440+msgstr "По-малко..."
441+
442+#: qml/Dash/Previews/PreviewCommentInput.qml:83
443+#: qml/Dash/Previews/PreviewRatingInput.qml:202
444+msgid "Send"
445+msgstr "Изпрати"
446+
447+#: qml/Dash/Previews/PreviewRatingInput.qml:109
448+msgid "Rate this"
449+msgstr "Оценете това"
450+
451+#: qml/Dash/Previews/PreviewRatingInput.qml:184
452+msgid "Add a review"
453+msgstr "Добави отзив"
454+
455+#: qml/Dash/PullToRefreshScopeStyle.qml:56
456+msgid "Pull to refresh…"
457+msgstr ""
458+
459+#: qml/Dash/PullToRefreshScopeStyle.qml:61
460+msgid "Release to refresh…"
461+msgstr ""
462+
463+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
464+msgid "Enable location data"
465+msgstr ""
466+
467+#: qml/Dash/ScopesList.qml:146
468+msgid "Manage"
469+msgstr ""
470+
471+#: qml/Dash/ScopesList.qml:187
472+msgid "Home"
473+msgstr ""
474+
475+#: qml/Dash/ScopesList.qml:188
476+msgid "Also installed"
477+msgstr ""
478+
374#: qml/Greeter/CoverPage.qml:127
479#: qml/Greeter/CoverPage.qml:127
375msgid "Unlock"
480msgid "Unlock"
376msgstr ""
481msgstr ""
@@ -406,7 +511,7 @@ msgstr ""
406msgid "Enter passcode to unlock"
511msgid "Enter passcode to unlock"
407msgstr ""
512msgstr ""
408
513
409−#: qml/Greeter/NarrowView.qml:235
514+#: qml/Greeter/NarrowView.qml:228
410msgid "Emergency"
515msgid "Emergency"
411msgstr ""
516msgstr ""
412
517
@@ -422,18 +527,17 @@ msgstr ""
422msgid "Select desktop environment"
527msgid "Select desktop environment"
423msgstr ""
528msgstr ""
424
529
425−#: qml/Launcher/Drawer.qml:250
530+#: qml/Launcher/Drawer.qml:94
426−#, fuzzy
427−#| msgid "Search"
428msgid "Search…"
531msgid "Search…"
429−msgstr "Търсене"
532+msgstr ""
430
533
431−#: qml/Launcher/PullToRefreshScopeStyle.qml:56
534+#: qml/Launcher/Drawer.qml:129
535+msgctxt "Apps sorted alphabetically"
432−msgid "Pull to refresh…"
536+msgid "A-Z"
433msgstr ""
537msgstr ""
434
538
435−#: qml/Launcher/PullToRefreshScopeStyle.qml:61
539+#: qml/Launcher/MoreAppsHeader.qml:55
436−msgid "Release to refresh…"
540+msgid "More apps in the store"
437msgstr ""
541msgstr ""
438
542
439#: qml/Notifications/NotificationMenuItemFactory.qml:124
543#: qml/Notifications/NotificationMenuItemFactory.qml:124
@@ -531,27 +635,19 @@ msgstr ""
531msgid "Drag using 3 fingers any application from one window to the other"
635msgid "Drag using 3 fingers any application from one window to the other"
532msgstr ""
636msgstr ""
533
637
534−#: qml/Stage/Stage.qml:671
535−msgid "No running apps"
536−msgstr ""
537−
538#: qml/Tutorial/TutorialLeftLong.qml:49
638#: qml/Tutorial/TutorialLeftLong.qml:49
539−#, fuzzy
540−#| msgid "Try swiping from the top edge to access the indicators"
541msgid "Long swipe from the left edge to open the Application Drawer"
639msgid "Long swipe from the left edge to open the Application Drawer"
542msgstr ""
640msgstr ""
543−"Опитайте се да приплъзнете пръста си от горния край към долния, за да "
544−"получите достъп до индикаторите"
545
641
546#: qml/Tutorial/TutorialLeft.qml:47
642#: qml/Tutorial/TutorialLeft.qml:47
547msgid "Short swipe from the left edge to open the launcher"
643msgid "Short swipe from the left edge to open the launcher"
548msgstr ""
644msgstr ""
549
645
550−#: qml/Tutorial/TutorialRight.qml:54
646+#: qml/Tutorial/TutorialRight.qml:55
551msgid "Push your mouse against the right edge to view your open apps"
647msgid "Push your mouse against the right edge to view your open apps"
552msgstr ""
648msgstr ""
553
649
554−#: qml/Tutorial/TutorialRight.qml:55
650+#: qml/Tutorial/TutorialRight.qml:56
555msgid "Swipe from the right edge to view your open apps"
651msgid "Swipe from the right edge to view your open apps"
556msgstr ""
652msgstr ""
557
653
@@ -559,42 +655,25 @@ msgstr ""
559msgid "Swipe from the top edge to access notifications and quick settings"
655msgid "Swipe from the top edge to access notifications and quick settings"
560msgstr ""
656msgstr ""
561
657
562−#: qml/Wizard/Page.qml:59
658+#: qml/Wizard/Page.qml:54
563msgctxt "Button: Go back one page in the Wizard"
659msgctxt "Button: Go back one page in the Wizard"
564msgid "Back"
660msgid "Back"
565msgstr ""
661msgstr ""
566
662
567−#: qml/Wizard/Pages/10-welcome.qml:29
663+#: qml/Wizard/Pages/10-welcome.qml:28
568msgid "Language"
664msgid "Language"
569msgstr ""
665msgstr ""
570
666
571−#: qml/Wizard/Pages/10-welcome.qml:176
667+#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
572−#: qml/Wizard/Pages/10-welcome-update.qml:126
668+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
573−#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
574−#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
669+#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
575−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
670+#: qml/Wizard/Pages/70-passwd-type.qml:145
671+#: qml/Wizard/Pages/75-report-check.qml:84
576−#: qml/Wizard/Pages/passcode-desktop.qml:154
672+#: qml/Wizard/Pages/passcode-desktop.qml:142
577−#: qml/Wizard/Pages/password-set.qml:153
673+#: qml/Wizard/Pages/password-set.qml:142
578msgid "Next"
674msgid "Next"
579msgstr ""
675msgstr ""
580
676
581−#: qml/Wizard/Pages/10-welcome-update.qml:91
582−msgid "Welcome to "
583−msgstr ""
584−
585−#: qml/Wizard/Pages/10-welcome-update.qml:106
586−msgid "We will make sure your device is ready to use "
587−msgstr ""
588−
589−#: qml/Wizard/Pages/11-changelog.qml:28
590−msgid "What's new"
591−msgstr ""
592−
593−#: qml/Wizard/Pages/11-changelog.qml:74
594−#, fuzzy
595−msgid "Loading..."
596−msgstr "Говорете..."
597−
598#: qml/Wizard/Pages/20-keyboard.qml:31
677#: qml/Wizard/Pages/20-keyboard.qml:31
599msgid "Select Keyboard"
678msgid "Select Keyboard"
600msgstr ""
679msgstr ""
@@ -607,33 +686,64 @@ msgstr ""
607msgid "Keyboard layout"
686msgid "Keyboard layout"
608msgstr ""
687msgstr ""
609
688
610−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
689+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
611−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
612−#: qml/Wizard/Pages/sim.qml:101
690+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
613msgid "Skip"
691msgid "Skip"
614msgstr ""
692msgstr ""
615
693
616−#: qml/Wizard/Pages/30-wifi.qml:31
694+#: qml/Wizard/Pages/30-wifi.qml:30
617msgid "Connect to Wi‑Fi"
695msgid "Connect to Wi‑Fi"
618msgstr ""
696msgstr ""
619
697
620−#: qml/Wizard/Pages/30-wifi.qml:139
698+#: qml/Wizard/Pages/30-wifi.qml:131
621msgid "Connected"
699msgid "Connected"
622msgstr ""
700msgstr ""
623
701
624−#: qml/Wizard/Pages/30-wifi.qml:172
702+#: qml/Wizard/Pages/30-wifi.qml:164
625msgid "Available Wi-Fi networks"
703msgid "Available Wi-Fi networks"
626msgstr ""
704msgstr ""
627
705
628−#: qml/Wizard/Pages/30-wifi.qml:173
706+#: qml/Wizard/Pages/30-wifi.qml:165
629msgid "No available Wi-Fi networks"
707msgid "No available Wi-Fi networks"
630msgstr ""
708msgstr ""
631
709
710+#: qml/Wizard/Pages/40-location.qml:27
711+msgid "Location Services"
712+msgstr ""
713+
714+#: qml/Wizard/Pages/40-location.qml:83
715+msgid ""
716+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
717+"(recommended)"
718+msgstr ""
719+
720+#: qml/Wizard/Pages/40-location.qml:105
721+#, qt-format
722+msgid "By selecting this option you agree to the Nokia HERE %1."
723+msgstr ""
724+
725+#: qml/Wizard/Pages/40-location.qml:106
726+msgctxt "part of: Nokia HERE terms and conditions"
727+msgid "terms and conditions"
728+msgstr ""
729+
730+#: qml/Wizard/Pages/40-location.qml:160
731+msgid "GPS only"
732+msgstr ""
733+
734+#: qml/Wizard/Pages/40-location.qml:214
735+msgid "Don't use my location"
736+msgstr ""
737+
738+#: qml/Wizard/Pages/40-location.qml:260
739+msgid "You can change it later in System Settings."
740+msgstr ""
741+
632#: qml/Wizard/Pages/50-timezone.qml:30
742#: qml/Wizard/Pages/50-timezone.qml:30
633msgid "Time Zone"
743msgid "Time Zone"
634msgstr ""
744msgstr ""
635
745
636−#: qml/Wizard/Pages/50-timezone.qml:183
746+#: qml/Wizard/Pages/50-timezone.qml:182
637msgid "Enter your city"
747msgid "Enter your city"
638msgstr ""
748msgstr ""
639
749
@@ -641,7 +751,7 @@ msgstr ""
641msgid "Personalize Your Device"
751msgid "Personalize Your Device"
642msgstr ""
752msgstr ""
643
753
644−#: qml/Wizard/Pages/60-account.qml:54
754+#: qml/Wizard/Pages/60-account.qml:48
645msgid "Preferred Name"
755msgid "Preferred Name"
646msgstr ""
756msgstr ""
647
757
@@ -649,72 +759,81 @@ msgstr ""
649msgid "Lock Screen"
759msgid "Lock Screen"
650msgstr ""
760msgstr ""
651
761
652−#: qml/Wizard/Pages/70-passwd-type.qml:103
762+#: qml/Wizard/Pages/70-passwd-type.qml:102
653msgctxt "Label: Type of security method"
763msgctxt "Label: Type of security method"
654msgid "Create new password"
764msgid "Create new password"
655msgstr ""
765msgstr ""
656
766
657−#: qml/Wizard/Pages/70-passwd-type.qml:105
767+#: qml/Wizard/Pages/70-passwd-type.qml:104
658msgctxt "Label: Type of security method"
768msgctxt "Label: Type of security method"
659msgid "Create passcode (numbers only)"
769msgid "Create passcode (numbers only)"
660msgstr ""
770msgstr ""
661
771
662−#: qml/Wizard/Pages/70-passwd-type.qml:107
772+#: qml/Wizard/Pages/70-passwd-type.qml:106
663msgctxt "Label: Type of security method"
773msgctxt "Label: Type of security method"
664msgid "No lock code"
774msgid "No lock code"
665msgstr ""
775msgstr ""
666
776
667−#: qml/Wizard/Pages/79-system-update.qml:28
777+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
668−msgid "Update Device"
778+msgid "Privacy Policy"
669msgstr ""
779msgstr ""
670
780
671−#: qml/Wizard/Pages/79-system-update.qml:55
781+#: qml/Wizard/Pages/75-report-check.qml:26
672−msgid ""
782+msgid "Help Us Improve"
673−"There is a system update available and ready to install. Afterwards, the "
674−"device will automatically restart."
675msgstr ""
783msgstr ""
676
784
677−#: qml/Wizard/Pages/79-system-update.qml:76
785+#: qml/Wizard/Pages/75-report-check.qml:59
678−msgctxt "string identifying name of the update"
786+msgid "Improve system performance by sending us crashes and error reports."
679−msgid "Ubuntu Touch system"
680msgstr ""
787msgstr ""
681
788
682−#: qml/Wizard/Pages/79-system-update.qml:83
789+#: qml/Wizard/Pages/75-report-check.qml:60
683−#, qt-format
790+msgid "Privacy policy"
684−msgctxt "version of the system update"
685−msgid "Version %1"
686msgstr ""
791msgstr ""
687
792
688−#: qml/Wizard/Pages/79-system-update.qml:95
793+#: qml/Wizard/Pages/80-finished.qml:89
689−msgid "This could take a few minutes..."
794+msgid "Welcome to Ubuntu"
690msgstr ""
795msgstr ""
691
796
692−#: qml/Wizard/Pages/79-system-update.qml:109
797+#: qml/Wizard/Pages/80-finished.qml:104
693−msgid "Install and restart now"
798+msgid "You are ready to use your device now"
694msgstr ""
799msgstr ""
695
800
696−#: qml/Wizard/Pages/80-finished.qml:91
801+#: qml/Wizard/Pages/80-finished.qml:124
697−msgid "Welcome Back"
802+msgid "Get Started"
698msgstr ""
803msgstr ""
699
804
700−#: qml/Wizard/Pages/80-finished.qml:91
805+#: qml/Wizard/Pages/here-terms.qml:25
701−msgid "Welcome to Ubuntu"
806+msgid "Terms & Conditions"
702msgstr ""
807msgstr ""
703
808
704−#: qml/Wizard/Pages/80-finished.qml:106
809+#: qml/Wizard/Pages/here-terms.qml:69
705−msgid "You are ready to use your device now"
810+msgid "Your device uses positioning technologies provided by HERE."
706msgstr ""
811msgstr ""
707
812
708−#: qml/Wizard/Pages/80-finished.qml:126
813+#: qml/Wizard/Pages/here-terms.qml:81
709−msgid "Continue"
814+msgid ""
815+"To provide you with positioning services and to improve their quality, HERE "
816+"collects information about nearby cell towers and Wi-Fi hotspots around your "
817+"current location whenever your position is being found."
710msgstr ""
818msgstr ""
711
819
712−#: qml/Wizard/Pages/80-finished.qml:126
820+#: qml/Wizard/Pages/here-terms.qml:93
713−msgid "Get Started"
821+msgid ""
822+"The information collected is used to analyze the service and to improve the "
823+"use of service, but not to identify you personally."
824+msgstr ""
825+
826+#: qml/Wizard/Pages/here-terms.qml:106
827+#, qt-format
828+msgid "By continuing, you agree to the HERE platform %1 and %2."
829+msgstr ""
830+
831+#: qml/Wizard/Pages/here-terms.qml:107
832+msgid "Service Terms"
714msgstr ""
833msgstr ""
715
834
716#: qml/Wizard/Pages/passcode-confirm.qml:43
835#: qml/Wizard/Pages/passcode-confirm.qml:43
717−#: qml/Wizard/Pages/passcode-desktop.qml:104
836+#: qml/Wizard/Pages/passcode-desktop.qml:97
718msgid "Confirm passcode"
837msgid "Confirm passcode"
719msgstr ""
838msgstr ""
720
839
@@ -731,24 +850,24 @@ msgstr ""
731msgid "Lock Screen Passcode"
850msgid "Lock Screen Passcode"
732msgstr ""
851msgstr ""
733
852
734−#: qml/Wizard/Pages/passcode-desktop.qml:68
853+#: qml/Wizard/Pages/passcode-desktop.qml:61
735msgid "Enter 4 numbers to setup your passcode"
854msgid "Enter 4 numbers to setup your passcode"
736msgstr ""
855msgstr ""
737
856
738−#: qml/Wizard/Pages/passcode-desktop.qml:84
857+#: qml/Wizard/Pages/passcode-desktop.qml:77
739#: qml/Wizard/Pages/passcode-set.qml:54
858#: qml/Wizard/Pages/passcode-set.qml:54
740msgid "Choose passcode"
859msgid "Choose passcode"
741msgstr ""
860msgstr ""
742
861
743−#: qml/Wizard/Pages/passcode-desktop.qml:139
862+#: qml/Wizard/Pages/passcode-desktop.qml:127
744msgid "Passcode too short"
863msgid "Passcode too short"
745msgstr ""
864msgstr ""
746
865
747−#: qml/Wizard/Pages/passcode-desktop.qml:141
866+#: qml/Wizard/Pages/passcode-desktop.qml:129
748msgid "Passcodes match"
867msgid "Passcodes match"
749msgstr ""
868msgstr ""
750
869
751−#: qml/Wizard/Pages/passcode-desktop.qml:143
870+#: qml/Wizard/Pages/passcode-desktop.qml:131
752msgid "Passcodes do not match"
871msgid "Passcodes do not match"
753msgstr ""
872msgstr ""
754
873
@@ -760,15 +879,15 @@ msgstr ""
760msgid "Lock Screen Password"
879msgid "Lock Screen Password"
761msgstr ""
880msgstr ""
762
881
763−#: qml/Wizard/Pages/password-set.qml:68
882+#: qml/Wizard/Pages/password-set.qml:62
764msgid "Enter at least 8 characters"
883msgid "Enter at least 8 characters"
765msgstr ""
884msgstr ""
766
885
767−#: qml/Wizard/Pages/password-set.qml:80
886+#: qml/Wizard/Pages/password-set.qml:74
768msgid "Choose password"
887msgid "Choose password"
769msgstr ""
888msgstr ""
770
889
771−#: qml/Wizard/Pages/password-set.qml:110
890+#: qml/Wizard/Pages/password-set.qml:104
772msgid "Confirm password"
891msgid "Confirm password"
773msgstr ""
892msgstr ""
774
893
@@ -824,25 +943,12 @@ msgstr ""
824msgid "Very weak password"
943msgid "Very weak password"
825msgstr ""
944msgstr ""
826
945
827−#~ msgid "Less..."
828−#~ msgstr "По-малко..."
829−
830−#~ msgid "Send"
831−#~ msgstr "Изпрати"
832−
833−#~ msgid "Rate this"
834−#~ msgstr "Оценете това"
835−
836−#~ msgid "Add a review"
837−#~ msgstr "Добави отзив"
838−
839−#, fuzzy
840−#~ msgid "Please wait..."
841−#~ msgstr "Зарежда се. Моля, почакайте..."
842−
843#~ msgid "Confirm"
946#~ msgid "Confirm"
844#~ msgstr "Потвърди"
947#~ msgstr "Потвърди"
845
948
949+#~ msgid "Search"
950+#~ msgstr "Търсене"
951+
846#~ msgid "Top edge"
952#~ msgid "Top edge"
847#~ msgstr "Горен край"
953#~ msgstr "Горен край"
848
954
@@ -858,6 +964,9 @@ msgstr ""
858#~ msgid "Type or say a command"
964#~ msgid "Type or say a command"
859#~ msgstr "Въведете или кажете команда"
965#~ msgstr "Въведете или кажете команда"
860
966
967+#~ msgid "Speaking..."
968+#~ msgstr "Говорете..."
969+
861#~ msgid "Speak Now..."
970#~ msgid "Speak Now..."
862#~ msgstr "Говорете сега..."
971#~ msgstr "Говорете сега..."
863
972
@@ -867,14 +976,22 @@ msgstr ""
867#~ msgid "Skip intro"
976#~ msgid "Skip intro"
868#~ msgstr "Пропусни интрото"
977#~ msgstr "Пропусни интрото"
869
978
979+#~ msgid "Loading. Please Wait..."
980+#~ msgstr "Зарежда се. Моля, почакайте..."
981+
982+#~ msgid "Try swiping from the top edge to access the indicators"
983+#~ msgstr ""
984+#~ "Опитайте се да приплъзнете пръста си от горния край към долния, за да "
985+#~ "получите достъп до индикаторите"
986+
870#~ msgid "Swipe up again to close the settings screen"
987#~ msgid "Swipe up again to close the settings screen"
871#~ msgstr ""
988#~ msgstr ""
872#~ "Отново приплъзнете пръста си нагоре за да затворите екрана с настройките"
989#~ "Отново приплъзнете пръста си нагоре за да затворите екрана с настройките"
873
990
874#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
991#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
875#~ msgstr ""
992#~ msgstr ""
876−#~ "Приплъзнете пръста си от левия край към десния, за да отворите стартера "
993+#~ "Приплъзнете пръста си от левия край към десния, за да отворите стартера за "
877−#~ "за бърз достъп до приложенията"
994+#~ "бърз достъп до приложенията"
878
995
879#~ msgid "Try swiping from the right edge to unlock the phone"
996#~ msgid "Try swiping from the right edge to unlock the phone"
880#~ msgstr ""
997#~ msgstr ""
po/bn.po+420−350
@@ -6,69 +6,67 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: \n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2021-01-29 11:42-0600\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11−"PO-Revision-Date: 2021-02-01 21:06+0000\n"
11+"PO-Revision-Date: 2015-11-27 19:38+0000\n"
12−"Last-Translator: imrufbd <imrufbd@gmail.com>\n"
12+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13−"Language-Team: Bengali <https://translate.ubports.com/projects/ubports/"
13+"Language-Team: Bengali <bn@li.org>\n"
14−"lomiri/bn/>\n"
15−"Language: bn\n"
16"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Generator: Weblate 3.11.3\n"
21−"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
19+"X-Generator: Launchpad (build 18343)\n"
22
20
23−#: plugins/LightDM/Greeter.cpp:199
21+#: plugins/LightDM/Greeter.cpp:188
24msgid "Password: "
22msgid "Password: "
25msgstr "পাসওয়ার্ড: "
23msgstr "পাসওয়ার্ড: "
26
24
27−#: plugins/LightDM/Greeter.cpp:214
25+#: plugins/LightDM/Greeter.cpp:203
28msgid "Username"
26msgid "Username"
29−msgstr "ইউজারনেম"
27+msgstr ""
30
28
31−#: plugins/LightDM/Greeter.cpp:258
29+#: plugins/LightDM/Greeter.cpp:242
32msgid "Failed to authenticate"
30msgid "Failed to authenticate"
33−msgstr "যাচাই করা যায়নি"
31+msgstr ""
34
32
35−#: plugins/LightDM/Greeter.cpp:260
33+#: plugins/LightDM/Greeter.cpp:244
36msgid "Invalid password, please try again"
34msgid "Invalid password, please try again"
37−msgstr "ভুল পাসওয়ার্ড, আবার চেষ্টা করুন"
35+msgstr ""
38
36
39−#: plugins/LightDM/Greeter.cpp:270
37+#: plugins/LightDM/Greeter.cpp:254
40msgid "Log In"
38msgid "Log In"
41−msgstr "লগইন করুন"
39+msgstr ""
42
40
43−#: plugins/LightDM/Greeter.cpp:270
41+#: plugins/LightDM/Greeter.cpp:254
44msgid "Retry"
42msgid "Retry"
45−msgstr "আবার চেষ্টা করুন"
43+msgstr ""
46
44
47#: plugins/LightDM/UsersModel.cpp:157
45#: plugins/LightDM/UsersModel.cpp:157
48msgid "Login"
46msgid "Login"
49−msgstr "লগইন করুন"
47+msgstr ""
50
48
51#: plugins/LightDM/UsersModel.cpp:165
49#: plugins/LightDM/UsersModel.cpp:165
52msgid "Guest Session"
50msgid "Guest Session"
53−msgstr "গেস্ট সেশন"
51+msgstr ""
54
52
55−#: plugins/Unity/Launcher/launcheritem.cpp:48
53+#: plugins/Unity/Launcher/launcheritem.cpp:49
56−#: plugins/Unity/Launcher/launcheritem.cpp:122
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
57msgid "Pin shortcut"
55msgid "Pin shortcut"
58−msgstr "শর্টকাট যোগ করুন"
56+msgstr "পিন"
59
57
60−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
61msgid "Quit"
59msgid "Quit"
62−msgstr "বাহির"
60+msgstr ""
63
61
64−#: plugins/Unity/Launcher/launcheritem.cpp:122
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
65msgid "Unpin shortcut"
63msgid "Unpin shortcut"
66−msgstr "শর্টকাট সরান"
64+msgstr "আনপিন"
67
65
68#: qml/Components/Dialogs.qml:176
66#: qml/Components/Dialogs.qml:176
69msgctxt "Title: Lock/Log out dialog"
67msgctxt "Title: Lock/Log out dialog"
70msgid "Log out"
68msgid "Log out"
71−msgstr "লগআউট করুন"
69+msgstr ""
72
70
73#: qml/Components/Dialogs.qml:177
71#: qml/Components/Dialogs.qml:177
74msgid "Are you sure you want to log out?"
72msgid "Are you sure you want to log out?"
@@ -82,10 +80,11 @@ msgstr "লক করুন"
82#: qml/Components/Dialogs.qml:191
80#: qml/Components/Dialogs.qml:191
83msgctxt "Button: Log out from the system"
81msgctxt "Button: Log out from the system"
84msgid "Log Out"
82msgid "Log Out"
85−msgstr "লগআউট করুন"
83+msgstr ""
86
84
87−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
88−#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Wizard/Pages/passcode-confirm.qml:32
89#: qml/Wizard/Pages/passcode-set.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
90msgid "Cancel"
89msgid "Cancel"
91msgstr "বাতিল"
90msgstr "বাতিল"
@@ -107,12 +106,12 @@ msgstr "না"
107msgid "Yes"
106msgid "Yes"
108msgstr "হ্যাঁ"
107msgstr "হ্যাঁ"
109
108
110−#: qml/Components/Dialogs.qml:243
109+#: qml/Components/Dialogs.qml:239
111msgctxt "Title: Power off/Restart dialog"
110msgctxt "Title: Power off/Restart dialog"
112msgid "Power"
111msgid "Power"
113−msgstr "বন্ধ/চালু"
112+msgstr ""
114
113
115−#: qml/Components/Dialogs.qml:244
114+#: qml/Components/Dialogs.qml:240
116msgid ""
115msgid ""
117"Are you sure you would like\n"
116"Are you sure you would like\n"
118"to power off?"
117"to power off?"
@@ -120,187 +119,193 @@ msgstr ""
120"আপনি নিশ্চিত যে আপনি\n"
119"আপনি নিশ্চিত যে আপনি\n"
121"বন্ধ করতে চান?"
120"বন্ধ করতে চান?"
122
121
123−#: qml/Components/Dialogs.qml:248
122+#: qml/Components/Dialogs.qml:244
124msgctxt "Button: Power off the system"
123msgctxt "Button: Power off the system"
125msgid "Power off"
124msgid "Power off"
126msgstr "বন্ধ করুন"
125msgstr "বন্ধ করুন"
127
126
128−#: qml/Components/Dialogs.qml:263
127+#: qml/Components/Dialogs.qml:255
129msgctxt "Button: Restart the system"
128msgctxt "Button: Restart the system"
130msgid "Restart"
129msgid "Restart"
131msgstr "পুনরায় চালু"
130msgstr "পুনরায় চালু"
132
131
133−#: qml/Components/Dialogs.qml:276
134−#, fuzzy
135−#| msgid "Takes a screenshot."
136−msgid "Screenshot"
137−msgstr "স্ক্রীনশট নেওয়া।"
138−
139#: qml/Components/KeyboardShortcutsOverlay.qml:41
132#: qml/Components/KeyboardShortcutsOverlay.qml:41
140msgid "Keyboard Shortcuts"
133msgid "Keyboard Shortcuts"
141−msgstr "কিবোর্ড শর্টকাট"
134+msgstr ""
142
135
143#: qml/Components/KeyboardShortcutsOverlay.qml:55
136#: qml/Components/KeyboardShortcutsOverlay.qml:55
144−msgid "Lomiri"
137+msgid "Unity 8"
145msgstr ""
138msgstr ""
146
139
147#: qml/Components/KeyboardShortcutsOverlay.qml:62
140#: qml/Components/KeyboardShortcutsOverlay.qml:62
148msgid "PrtScr"
141msgid "PrtScr"
149−msgstr "প্রিন্টস্ক্রিন"
142+msgstr ""
150
143
151#: qml/Components/KeyboardShortcutsOverlay.qml:67
144#: qml/Components/KeyboardShortcutsOverlay.qml:67
152msgid "Takes a screenshot."
145msgid "Takes a screenshot."
153−msgstr "স্ক্রীনশট নেওয়া।"
146+msgstr ""
154
147
155#: qml/Components/KeyboardShortcutsOverlay.qml:75
148#: qml/Components/KeyboardShortcutsOverlay.qml:75
156msgid "Alt + PrtScr"
149msgid "Alt + PrtScr"
157−msgstr "অল্টার কী + প্রিন্টস্ক্রীন কী"
150+msgstr ""
158
151
159#: qml/Components/KeyboardShortcutsOverlay.qml:80
152#: qml/Components/KeyboardShortcutsOverlay.qml:80
160msgid "Takes a screenshot of the current window."
153msgid "Takes a screenshot of the current window."
161−msgstr "দৃশ্যমান উইন্ডো এর স্ক্রীনশট।"
154+msgstr ""
162
155
163#: qml/Components/KeyboardShortcutsOverlay.qml:88
156#: qml/Components/KeyboardShortcutsOverlay.qml:88
164msgid "Super + Space"
157msgid "Super + Space"
165−msgstr "সুপার কী + স্পেস কী"
158+msgstr ""
166
159
167#: qml/Components/KeyboardShortcutsOverlay.qml:93
160#: qml/Components/KeyboardShortcutsOverlay.qml:93
168msgid "Switches to next keyboard layout."
161msgid "Switches to next keyboard layout."
169−msgstr "পরবর্তী কিবোর্ড নকশা নির্বাচন।"
162+msgstr ""
170
163
171#: qml/Components/KeyboardShortcutsOverlay.qml:101
164#: qml/Components/KeyboardShortcutsOverlay.qml:101
172msgid "Super + Shift + Space"
165msgid "Super + Shift + Space"
173−msgstr "সুপার কী + শিফট্ কী + স্পেস কী"
166+msgstr ""
174
167
175#: qml/Components/KeyboardShortcutsOverlay.qml:106
168#: qml/Components/KeyboardShortcutsOverlay.qml:106
176msgid "Switches to previous keyboard layout."
169msgid "Switches to previous keyboard layout."
177−msgstr "পূর্ববর্তী কিবোর্ড নকশা নির্বাচন।"
170+msgstr ""
178
171
179#: qml/Components/KeyboardShortcutsOverlay.qml:114
172#: qml/Components/KeyboardShortcutsOverlay.qml:114
180msgid "Ctrl + Alt + T"
173msgid "Ctrl + Alt + T"
181−msgstr "কন্ট্রোল কী + অল্টার কী + T"
174+msgstr ""
182
175
183#: qml/Components/KeyboardShortcutsOverlay.qml:119
176#: qml/Components/KeyboardShortcutsOverlay.qml:119
184msgid "Starts the Terminal application."
177msgid "Starts the Terminal application."
185−msgstr "টার্মিনাল এপ্লিকেশন চালু।"
178+msgstr ""
186
179
187#: qml/Components/KeyboardShortcutsOverlay.qml:131
180#: qml/Components/KeyboardShortcutsOverlay.qml:131
188msgid "Launcher"
181msgid "Launcher"
189−msgstr "লঞ্চার"
182+msgstr ""
190
183
191#: qml/Components/KeyboardShortcutsOverlay.qml:138
184#: qml/Components/KeyboardShortcutsOverlay.qml:138
192msgid "Super (Hold)"
185msgid "Super (Hold)"
193−msgstr "সুপার কী (কিছুক্ষণ চেপে ধরে রাখুন)"
186+msgstr ""
194
187
195#: qml/Components/KeyboardShortcutsOverlay.qml:143
188#: qml/Components/KeyboardShortcutsOverlay.qml:143
196msgid "Opens the launcher, displays shortcuts."
189msgid "Opens the launcher, displays shortcuts."
197−msgstr "লঞ্চারে প্রবেশ, শর্টকাট প্রদর্শন।"
190+msgstr ""
198
191
199#: qml/Components/KeyboardShortcutsOverlay.qml:151
192#: qml/Components/KeyboardShortcutsOverlay.qml:151
200msgid "Alt + F1"
193msgid "Alt + F1"
201−msgstr "অল্টার কী + F1 কী"
194+msgstr ""
202
195
203#: qml/Components/KeyboardShortcutsOverlay.qml:156
196#: qml/Components/KeyboardShortcutsOverlay.qml:156
204msgid "Opens launcher keyboard navigation mode."
197msgid "Opens launcher keyboard navigation mode."
205−msgstr "লঞ্চার কিবোর্ড নেভিগেশন মোড চালু ।"
198+msgstr ""
206
199
207#: qml/Components/KeyboardShortcutsOverlay.qml:164
200#: qml/Components/KeyboardShortcutsOverlay.qml:164
208msgid "Super + Tab"
201msgid "Super + Tab"
209−msgstr "সুপার কী + ট্যাব কী"
202+msgstr ""
210
203
211#: qml/Components/KeyboardShortcutsOverlay.qml:169
204#: qml/Components/KeyboardShortcutsOverlay.qml:169
212msgid "Switches applications via the launcher."
205msgid "Switches applications via the launcher."
213−msgstr "লঞ্চারের মাধ্যমে এপ্লিকেশন পরিবর্তন।"
206+msgstr ""
214
207
215#: qml/Components/KeyboardShortcutsOverlay.qml:177
208#: qml/Components/KeyboardShortcutsOverlay.qml:177
216msgid "Super + 1 to 0"
209msgid "Super + 1 to 0"
217−msgstr "সুপার কী + ১ থেকে ০"
210+msgstr ""
218
211
219#: qml/Components/KeyboardShortcutsOverlay.qml:182
212#: qml/Components/KeyboardShortcutsOverlay.qml:182
220msgid "Same as clicking on a launcher icon."
213msgid "Same as clicking on a launcher icon."
221−msgstr "লঞ্চার আইকনে ক্লিক করার মতই কাজ করে।"
214+msgstr ""
222
215
223#: qml/Components/KeyboardShortcutsOverlay.qml:190
216#: qml/Components/KeyboardShortcutsOverlay.qml:190
224msgid "Super + A"
217msgid "Super + A"
225−msgstr "সুপার কী + A"
218+msgstr ""
226
219
227#: qml/Components/KeyboardShortcutsOverlay.qml:195
220#: qml/Components/KeyboardShortcutsOverlay.qml:195
228msgid "Opens the Application Drawer."
221msgid "Opens the Application Drawer."
229−msgstr "এপ্লিকেশন ড্রয়ারে প্রবেশ।"
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
225+msgid "Scopes"
226+msgstr ""
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
229+msgid "Super (Tap)"
230+msgstr ""
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
233+msgid "Opens the Scopes home."
234+msgstr ""
230
235
231#: qml/Components/KeyboardShortcutsOverlay.qml:235
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
232msgid "Switching"
237msgid "Switching"
233−msgstr "পরিবর্তন"
238+msgstr ""
234
239
235#: qml/Components/KeyboardShortcutsOverlay.qml:242
240#: qml/Components/KeyboardShortcutsOverlay.qml:242
236msgid "Alt + Tab"
241msgid "Alt + Tab"
237−msgstr "অল্টার কী + ট্যাব কী"
242+msgstr ""
238
243
239#: qml/Components/KeyboardShortcutsOverlay.qml:247
244#: qml/Components/KeyboardShortcutsOverlay.qml:247
240msgid "Switches between applications."
245msgid "Switches between applications."
241−msgstr "একাধিক চালু এপ্লিকেশনের মধ্যে একটি নির্বাচন করে।"
246+msgstr ""
242
247
243#: qml/Components/KeyboardShortcutsOverlay.qml:255
248#: qml/Components/KeyboardShortcutsOverlay.qml:255
244msgid "Super + W"
249msgid "Super + W"
245−msgstr "সুপার কী + W"
250+msgstr ""
246
251
247#: qml/Components/KeyboardShortcutsOverlay.qml:260
252#: qml/Components/KeyboardShortcutsOverlay.qml:260
248msgid "Opens the desktop spread."
253msgid "Opens the desktop spread."
249−msgstr "ডেস্কটপের প্রসারণে প্রবেশ।"
254+msgstr ""
250
255
251#: qml/Components/KeyboardShortcutsOverlay.qml:268
256#: qml/Components/KeyboardShortcutsOverlay.qml:268
252msgid "Cursor Left or Right"
257msgid "Cursor Left or Right"
253−msgstr "কার্সর বাম থেকে ডানে"
258+msgstr ""
254
259
255#: qml/Components/KeyboardShortcutsOverlay.qml:273
260#: qml/Components/KeyboardShortcutsOverlay.qml:273
256msgid "Moves the focus."
261msgid "Moves the focus."
257−msgstr "ফোকাস সরায়।"
262+msgstr ""
258
263
259#: qml/Components/KeyboardShortcutsOverlay.qml:285
264#: qml/Components/KeyboardShortcutsOverlay.qml:285
260msgid "Windows"
265msgid "Windows"
261−msgstr "উইন্ডো সমূহ"
266+msgstr ""
262
267
263#: qml/Components/KeyboardShortcutsOverlay.qml:292
268#: qml/Components/KeyboardShortcutsOverlay.qml:292
264msgid "Ctrl + Super + D"
269msgid "Ctrl + Super + D"
265−msgstr "কন্ট্রোল কী + সুপার কী + D"
270+msgstr ""
266
271
267#: qml/Components/KeyboardShortcutsOverlay.qml:297
272#: qml/Components/KeyboardShortcutsOverlay.qml:297
268msgid "Minimizes all windows."
273msgid "Minimizes all windows."
269−msgstr "সব উইন্ডোকে লঘু করে।"
274+msgstr ""
270
275
271#: qml/Components/KeyboardShortcutsOverlay.qml:305
276#: qml/Components/KeyboardShortcutsOverlay.qml:305
272msgid "Ctrl + Super + Up"
277msgid "Ctrl + Super + Up"
273−msgstr "কন্ট্রোল কী + সুপার কী + আপ এ্যরো কী"
278+msgstr ""
274
279
275#: qml/Components/KeyboardShortcutsOverlay.qml:310
280#: qml/Components/KeyboardShortcutsOverlay.qml:310
276msgid "Maximizes the current window."
281msgid "Maximizes the current window."
277−msgstr "দৃশ্যমান উইন্ডোটিকে বর্ধিত করে।"
282+msgstr ""
278
283
279#: qml/Components/KeyboardShortcutsOverlay.qml:318
284#: qml/Components/KeyboardShortcutsOverlay.qml:318
280msgid "Ctrl + Super + Down"
285msgid "Ctrl + Super + Down"
281−msgstr "কন্ট্রোল কী + সুপার কী + ডাউন এ্যরো কী"
286+msgstr ""
282
287
283#: qml/Components/KeyboardShortcutsOverlay.qml:323
288#: qml/Components/KeyboardShortcutsOverlay.qml:323
284msgid "Minimizes or restores the current window."
289msgid "Minimizes or restores the current window."
285−msgstr "বর্তমান উইন্ডোটিকে লঘু করে অথবা পূ্র্বাবস্থায় ফিরিয়ে নিয়ে যায়।"
290+msgstr ""
286
291
287#: qml/Components/KeyboardShortcutsOverlay.qml:331
292#: qml/Components/KeyboardShortcutsOverlay.qml:331
288msgid "Ctrl + Super + Left or Right"
293msgid "Ctrl + Super + Left or Right"
289−msgstr "কন্ট্রোল কী + সুপার কী + বাম এ্যরো কী"
294+msgstr ""
290
295
291#: qml/Components/KeyboardShortcutsOverlay.qml:336
296#: qml/Components/KeyboardShortcutsOverlay.qml:336
292msgid "Semi-maximizes the current window."
297msgid "Semi-maximizes the current window."
293−msgstr "বর্তমান উইন্ডোটিকে অর্ধ-বর্ধিত করে।"
298+msgstr ""
294
299
295#: qml/Components/KeyboardShortcutsOverlay.qml:344
300#: qml/Components/KeyboardShortcutsOverlay.qml:344
296msgid "Alt + F4"
301msgid "Alt + F4"
297−msgstr "অল্টার কী + F4 কী"
302+msgstr ""
298
303
299#: qml/Components/KeyboardShortcutsOverlay.qml:349
304#: qml/Components/KeyboardShortcutsOverlay.qml:349
300msgid "Closes the current window."
305msgid "Closes the current window."
301−msgstr "বর্তমান উইন্ডোটি বন্ধ করে।"
306+msgstr ""
302
307
303−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
304msgid "Return to Call"
309msgid "Return to Call"
305msgstr "কল এ ফিরে যান"
310msgstr "কল এ ফিরে যান"
306
311
@@ -315,130 +320,225 @@ msgstr "ঠিক আছে"
315#: qml/Components/MediaServices/VideoPlayerControls.qml:44
320#: qml/Components/MediaServices/VideoPlayerControls.qml:44
316#, qt-format
321#, qt-format
317msgid "%1:%2:%3"
322msgid "%1:%2:%3"
318−msgstr "%1:%2:%3"
323+msgstr ""
319
324
320#: qml/Components/MediaServices/VideoPlayerControls.qml:49
325#: qml/Components/MediaServices/VideoPlayerControls.qml:49
321#, qt-format
326#, qt-format
322msgid "%1:%2"
327msgid "%1:%2"
323−msgstr "%1:%2"
328+msgstr ""
324
329
325#: qml/Components/ModeSwitchWarningDialog.qml:33
330#: qml/Components/ModeSwitchWarningDialog.qml:33
326msgid "Apps may have unsaved data:"
331msgid "Apps may have unsaved data:"
327−msgstr "এ্যাপ সমূহে কিছু অসংরক্ষিত ডেটা থাকতে পারে:"
332+msgstr ""
328
333
329#: qml/Components/ModeSwitchWarningDialog.qml:60
334#: qml/Components/ModeSwitchWarningDialog.qml:60
330msgctxt ""
335msgctxt ""
331"Re-dock means connect the device again to an external screen/mouse/keyboard"
336"Re-dock means connect the device again to an external screen/mouse/keyboard"
332msgid "Re-dock, save your work and close these apps to continue."
337msgid "Re-dock, save your work and close these apps to continue."
333msgstr ""
338msgstr ""
334−"পূনসংযুক্ত করুন, প্রক্রিয়া চলমান রাখার জন্য কাজগুলি সংরক্ষণ করে অ্যাপগুলি বন্ধ করুন।"
335
339
336#: qml/Components/ModeSwitchWarningDialog.qml:67
340#: qml/Components/ModeSwitchWarningDialog.qml:67
337msgid "Or force close now (unsaved data will be lost)."
341msgid "Or force close now (unsaved data will be lost)."
338−msgstr "অথবা জোরপূর্বক এখনি বন্ধ করুন (আপনার অসংরক্ষিত তথ্য হারিয়ে যাবে)।"
342+msgstr ""
339
343
340#: qml/Components/ModeSwitchWarningDialog.qml:80
344#: qml/Components/ModeSwitchWarningDialog.qml:80
341msgid "OK, I will reconnect"
345msgid "OK, I will reconnect"
342−msgstr "ঠিক আছে, আমি পূনঃসংযুক্ত করব"
346+msgstr ""
343
347
344#: qml/Components/ModeSwitchWarningDialog.qml:81
348#: qml/Components/ModeSwitchWarningDialog.qml:81
345msgid "Reconnect now!"
349msgid "Reconnect now!"
346−msgstr "এখনি পূনসংযুক্ত করুন!"
350+msgstr ""
347
351
348#: qml/Components/ModeSwitchWarningDialog.qml:94
352#: qml/Components/ModeSwitchWarningDialog.qml:94
349msgid "Close all"
353msgid "Close all"
350−msgstr "সবগুলো বন্ধ করুন"
354+msgstr ""
351
355
352#: qml/Components/SharingPicker.qml:54
356#: qml/Components/SharingPicker.qml:54
353msgid "Preview Share Item"
357msgid "Preview Share Item"
354−msgstr "বিনিময় তালিকা অবলোকন"
358+msgstr ""
355
359
356#: qml/Components/VirtualTouchPad.qml:317
360#: qml/Components/VirtualTouchPad.qml:317
357msgid ""
361msgid ""
358"Your device is now connected to an external display. Use this screen as a "
362"Your device is now connected to an external display. Use this screen as a "
359"touch pad to interact with the pointer."
363"touch pad to interact with the pointer."
360msgstr ""
364msgstr ""
361−"আপনার ডিভাইস অন্য পর্দার সাথে সংযুক্ত হয়েছে। মাউসের জন্য এই পর্দাটি টাচপ্যাড হিসেবে "
362−"ব্যবহার করুন।"
363
365
364#: qml/Components/VirtualTouchPad.qml:327
366#: qml/Components/VirtualTouchPad.qml:327
365msgid "Tap left button to click."
367msgid "Tap left button to click."
366−msgstr "ক্লিক করার জন্য বাম বোতাম চাপুন..."
368+msgstr ""
367
369
368#: qml/Components/VirtualTouchPad.qml:339
370#: qml/Components/VirtualTouchPad.qml:339
369msgid "Tap right button to right click."
371msgid "Tap right button to right click."
370−msgstr "ডান ক্লিকের জন্য ডান বোতাম চাপুন।"
372+msgstr ""
371
373
372#: qml/Components/VirtualTouchPad.qml:351
374#: qml/Components/VirtualTouchPad.qml:351
373msgid "Swipe with two fingers to scroll."
375msgid "Swipe with two fingers to scroll."
374−msgstr "স্ক্রলের জন্য আঙুল চালান।"
376+msgstr ""
375
377
376#: qml/Components/VirtualTouchPad.qml:396
378#: qml/Components/VirtualTouchPad.qml:396
377msgid "Find more settings in the system settings."
379msgid "Find more settings in the system settings."
378−msgstr "সিস্টেম সেটিংসে আরও সেটিংস খুজুন।"
380+msgstr ""
381+
382+#: qml/Dash/DashPageHeader.qml:361
383+msgctxt "Button: Open the Ubuntu Store"
384+msgid "Store"
385+msgstr "স্টোর"
386+
387+#: qml/Dash/DashPageHeader.qml:368
388+msgctxt "Button: Start a search in the current dash scope"
389+msgid "Search"
390+msgstr "খুঁজুন"
391+
392+#: qml/Dash/DashPageHeader.qml:378
393+msgctxt "Button: Show the current dash scope settings"
394+msgid "Settings"
395+msgstr "সেটিংস"
396+
397+#: qml/Dash/DashPageHeader.qml:385
398+msgid "Remove from Favorites"
399+msgstr "পছন্দ থেকে মুছে ফেলুন"
400+
401+#: qml/Dash/DashPageHeader.qml:385
402+msgid "Add to Favorites"
403+msgstr "পছন্দতে যোগ করুন"
404+
405+#: qml/Dash/FiltersPopover.qml:61
406+msgid "Refine your results"
407+msgstr ""
408+
409+#: qml/Dash/FiltersPopover.qml:70
410+msgid "Reset"
411+msgstr ""
412+
413+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
414+msgid "Show less"
415+msgstr ""
416+
417+#: qml/Dash/GenericScopeView.qml:547
418+msgid "Show all"
419+msgstr ""
420+
421+#: qml/Dash/GenericScopeView.qml:578
422+msgctxt "Label: Hint for dash search line edit"
423+msgid "Search"
424+msgstr "খুঁজুন"
425+
426+#: qml/Dash/PageHeaderExtraPanel.qml:67
427+msgid "Recent Searches"
428+msgstr ""
429+
430+#: qml/Dash/PageHeaderExtraPanel.qml:78
431+msgid "Clear All"
432+msgstr ""
433+
434+#: qml/Dash/Previews/PreviewActionCombo.qml:36
435+msgid "More..."
436+msgstr "আরো..."
437+
438+#: qml/Dash/Previews/PreviewActionCombo.qml:36
439+msgid "Less..."
440+msgstr "কম..."
441+
442+#: qml/Dash/Previews/PreviewCommentInput.qml:83
443+#: qml/Dash/Previews/PreviewRatingInput.qml:202
444+msgid "Send"
445+msgstr "পাঠান"
446+
447+#: qml/Dash/Previews/PreviewRatingInput.qml:109
448+msgid "Rate this"
449+msgstr "রেটিং দিন"
450+
451+#: qml/Dash/Previews/PreviewRatingInput.qml:184
452+msgid "Add a review"
453+msgstr "আপনার মতামত দিন"
454+
455+#: qml/Dash/PullToRefreshScopeStyle.qml:56
456+msgid "Pull to refresh…"
457+msgstr "রিফ্রেশ করার জন্য টানুন"
458+
459+#: qml/Dash/PullToRefreshScopeStyle.qml:61
460+msgid "Release to refresh…"
461+msgstr "রিফ্রেশ করার জন্য ছেড়ে দিন"
462+
463+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
464+msgid "Enable location data"
465+msgstr "অবস্থান নির্ণয় চালু করুন"
466+
467+#: qml/Dash/ScopesList.qml:146
468+msgid "Manage"
469+msgstr "ব্যবস্থাপনা"
470+
471+#: qml/Dash/ScopesList.qml:187
472+msgid "Home"
473+msgstr ""
474+
475+#: qml/Dash/ScopesList.qml:188
476+msgid "Also installed"
477+msgstr "আরও ইন্সটল করা রয়েছে..."
379
478
380#: qml/Greeter/CoverPage.qml:127
479#: qml/Greeter/CoverPage.qml:127
381msgid "Unlock"
480msgid "Unlock"
382−msgstr "তালা খুলুন"
481+msgstr "লক খুলুন"
383
482
384#: qml/Greeter/DelayedLockscreen.qml:43
483#: qml/Greeter/DelayedLockscreen.qml:43
385msgid "Device Locked"
484msgid "Device Locked"
386−msgstr "ডিভাইসটি তালা দেওয়া"
485+msgstr "ডিভাইসটি লক করা"
387
486
388#: qml/Greeter/DelayedLockscreen.qml:58
487#: qml/Greeter/DelayedLockscreen.qml:58
389msgid "You have been locked out due to too many failed passphrase attempts."
488msgid "You have been locked out due to too many failed passphrase attempts."
390−msgstr "অনেকবেশিবার ভুল পাসফ্রেজ চেষ্টা করায় আপনাকে প্রবেশ হতে বিরত রাখা হল।"
489+msgstr "অধিকবার পাসফ্রেজ ভুল দেওয়ার কারনে আপনার আইডি লক করা হয়েছে"
391
490
392#: qml/Greeter/DelayedLockscreen.qml:59
491#: qml/Greeter/DelayedLockscreen.qml:59
393msgid "You have been locked out due to too many failed passcode attempts."
492msgid "You have been locked out due to too many failed passcode attempts."
394−msgstr "অনেকবেশিবার ভুল পাসকোড চেষ্টা করায় আপনাকে প্রবেশ হতে বিরত রাখা হল।"
493+msgstr "অধিকবার পাসকোড ভুল করার কারনে আপনার আইডি লক করা হয়েছে"
395
494
396#: qml/Greeter/DelayedLockscreen.qml:68
495#: qml/Greeter/DelayedLockscreen.qml:68
397#, qt-format
496#, qt-format
398msgid "Please wait %1 minute and then try again…"
497msgid "Please wait %1 minute and then try again…"
399msgid_plural "Please wait %1 minutes and then try again…"
498msgid_plural "Please wait %1 minutes and then try again…"
400−msgstr[0] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে আবার চেষ্টা করুন …"
499+msgstr[0] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
401−msgstr[1] "অনুগ্রহ করে %1 মিনিটের মত অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন …"
500+msgstr[1] "অনুগ্রহ করে %1 মিনিট অপেক্ষা করুন এবং পরবর্তীতে চেষ্টা করুন..."
402
501
403#: qml/Greeter/Greeter.qml:550
502#: qml/Greeter/Greeter.qml:550
404msgid "Try again"
503msgid "Try again"
405−msgstr "আবার চেষ্টা করুন"
504+msgstr ""
406
505
407#: qml/Greeter/Greeter.qml:551
506#: qml/Greeter/Greeter.qml:551
408msgid "Enter passphrase to unlock"
507msgid "Enter passphrase to unlock"
409−msgstr "তালা খোলার জন্য পাসফ্রেজ লিখুন"
508+msgstr ""
410
509
411#: qml/Greeter/Greeter.qml:552
510#: qml/Greeter/Greeter.qml:552
412msgid "Enter passcode to unlock"
511msgid "Enter passcode to unlock"
413−msgstr "তালা খোলার জন্য পাসকোড লিখুন"
512+msgstr ""
414
513
415−#: qml/Greeter/NarrowView.qml:235
514+#: qml/Greeter/NarrowView.qml:228
416msgid "Emergency"
515msgid "Emergency"
417−msgstr "জরুরী"
516+msgstr ""
418
517
419#: qml/Greeter/PromptList.qml:126
518#: qml/Greeter/PromptList.qml:126
420msgid "Passphrase"
519msgid "Passphrase"
421−msgstr "পাসফ্রেজ"
520+msgstr ""
422
521
423#: qml/Greeter/PromptList.qml:126
522#: qml/Greeter/PromptList.qml:126
424msgid "Passcode"
523msgid "Passcode"
425−msgstr "পাসকোড"
524+msgstr ""
426
525
427#: qml/Greeter/SessionsList.qml:124
526#: qml/Greeter/SessionsList.qml:124
428msgid "Select desktop environment"
527msgid "Select desktop environment"
429−msgstr "ডেস্কটপ বাতাবরণ নির্বাচন করুন"
528+msgstr ""
430
529
431−#: qml/Launcher/Drawer.qml:250
530+#: qml/Launcher/Drawer.qml:94
432msgid "Search…"
531msgid "Search…"
433−msgstr "অনুসন্ধান …"
532+msgstr ""
434
533
435−#: qml/Launcher/PullToRefreshScopeStyle.qml:56
534+#: qml/Launcher/Drawer.qml:129
535+msgctxt "Apps sorted alphabetically"
436−msgid "Pull to refresh…"
536+msgid "A-Z"
437−msgstr "রিফ্রেশ করার জন্য টানুন"
537+msgstr ""
438
538
439−#: qml/Launcher/PullToRefreshScopeStyle.qml:61
539+#: qml/Launcher/MoreAppsHeader.qml:55
440−msgid "Release to refresh…"
540+msgid "More apps in the store"
441−msgstr "রিফ্রেশ করার জন্য ছেড়ে দিন"
541+msgstr ""
442
542
443#: qml/Notifications/NotificationMenuItemFactory.qml:124
543#: qml/Notifications/NotificationMenuItemFactory.qml:124
444msgid "Show password"
544msgid "Show password"
@@ -454,28 +554,28 @@ msgstr "কনফারেন্স"
454
554
455#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
555#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:869
456msgid "Nothing is playing"
556msgid "Nothing is playing"
457−msgstr "কোনকিছু প্লে হচ্ছেনা"
557+msgstr "কোন কিছু বাজছে না।"
458
558
459#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
559#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:997
460#, qt-format
560#, qt-format
461msgid "%1 hour"
561msgid "%1 hour"
462msgid_plural "%1 hours"
562msgid_plural "%1 hours"
463−msgstr[0] "%1 ঘন্টা"
563+msgstr[0] "%1 ঘণ্টা"
464−msgstr[1] "%1 ঘন্টায়"
564+msgstr[1] "%1 ঘণ্টা"
465
565
466#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
566#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1001
467#, qt-format
567#, qt-format
468msgid "%1 minute"
568msgid "%1 minute"
469msgid_plural "%1 minutes"
569msgid_plural "%1 minutes"
470msgstr[0] "%1 মিনিট"
570msgstr[0] "%1 মিনিট"
471−msgstr[1] "%1 মিনিটে"
571+msgstr[1] "%1 মিনিট"
472
572
473#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
573#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1006
474#, qt-format
574#, qt-format
475msgid "%1 second"
575msgid "%1 second"
476msgid_plural "%1 seconds"
576msgid_plural "%1 seconds"
477msgstr[0] "%1 সেকেন্ড"
577msgstr[0] "%1 সেকেন্ড"
478−msgstr[1] "%1 সেকেন্ডে"
578+msgstr[1] "%1 সেকেন্ড"
479
579
480#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
580#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1009
481msgid "0 seconds"
581msgid "0 seconds"
@@ -489,7 +589,7 @@ msgstr "%1 বাকি"
489
589
490#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
590#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1017
491msgid "In queue…"
591msgid "In queue…"
492−msgstr "অপেক্ষমান…"
592+msgstr "অপেক্ষায় রয়েছে..."
493
593
494#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
594#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1021
495msgid "Downloading"
595msgid "Downloading"
@@ -497,7 +597,7 @@ msgstr "ডাউনলোড হচ্ছে"
497
597
498#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
598#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1023
499msgid "Paused, tap to resume"
599msgid "Paused, tap to resume"
500−msgstr "থেমে আছে, শুরু করতে চাপ দিন"
600+msgstr "থামানো, শুরু করতে চাপ দিন"
501
601
502#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
602#: qml/Panel/Indicators/IndicatorMenuItemFactory.qml:1025
503msgid "Canceled"
603msgid "Canceled"
@@ -515,7 +615,7 @@ msgstr "ব্যার্থ হয়েছে, পুনরায় চেষ্
515#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
615#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
516msgctxt "Button: Send a reply message"
616msgctxt "Button: Send a reply message"
517msgid "Send"
617msgid "Send"
518−msgstr "পাঠান"
618+msgstr ""
519
619
520#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
620#: qml/Panel/Indicators/MessageMenuItemFactory.qml:152
521msgctxt "Label: Hint in message indicator line edit"
621msgctxt "Label: Hint in message indicator line edit"
@@ -529,261 +629,279 @@ msgstr "কল ব্যাক"
529
629
530#: qml/Panel/PanelMenuPage.qml:92
630#: qml/Panel/PanelMenuPage.qml:92
531msgid "Back"
631msgid "Back"
532−msgstr "পূর্বপাতা"
632+msgstr ""
533
633
534#: qml/Stage/SideStage.qml:76
634#: qml/Stage/SideStage.qml:76
535msgid "Drag using 3 fingers any application from one window to the other"
635msgid "Drag using 3 fingers any application from one window to the other"
536−msgstr "তিন আঙুল দিয়ে ধরে যেকোন অ্যাপ্লিকেেশন এক উইন্ডো থেকে অন্যটিতে নিয়ে আসুন"
636+msgstr ""
537−
538−#: qml/Stage/Stage.qml:671
539−msgid "No running apps"
540−msgstr "কোন অ্যাপ চলমান নেই"
541
637
542#: qml/Tutorial/TutorialLeftLong.qml:49
638#: qml/Tutorial/TutorialLeftLong.qml:49
543msgid "Long swipe from the left edge to open the Application Drawer"
639msgid "Long swipe from the left edge to open the Application Drawer"
544−msgstr "অ্যাপ্লিকেশন দেরাজ খুলতে বামদিক হতে সজোরে আঙুল চালান"
640+msgstr ""
545
641
546#: qml/Tutorial/TutorialLeft.qml:47
642#: qml/Tutorial/TutorialLeft.qml:47
547msgid "Short swipe from the left edge to open the launcher"
643msgid "Short swipe from the left edge to open the launcher"
548−msgstr "লঞ্চার খুলতে বামদিক হতে আঙুল চালান"
644+msgstr ""
549
645
550−#: qml/Tutorial/TutorialRight.qml:54
646+#: qml/Tutorial/TutorialRight.qml:55
551msgid "Push your mouse against the right edge to view your open apps"
647msgid "Push your mouse against the right edge to view your open apps"
552−msgstr "চলমান অ্যাপগুলি দেখতে ডানপান্তের দিকে মাউস চাপুন"
648+msgstr ""
553
649
554−#: qml/Tutorial/TutorialRight.qml:55
650+#: qml/Tutorial/TutorialRight.qml:56
555msgid "Swipe from the right edge to view your open apps"
651msgid "Swipe from the right edge to view your open apps"
556−msgstr "চলমান অ্যাপগুলি দেখতে ডানপ্রান্ত হতে আঙুল চালান"
652+msgstr ""
557
653
558#: qml/Tutorial/TutorialTop.qml:53
654#: qml/Tutorial/TutorialTop.qml:53
559msgid "Swipe from the top edge to access notifications and quick settings"
655msgid "Swipe from the top edge to access notifications and quick settings"
560−msgstr "বার্তাসমূহ এবং তড়িৎ সেটিংস দেখতে উপরের প্রান্ত হতে আঙুল চালান"
656+msgstr ""
561
657
562−#: qml/Wizard/Page.qml:59
658+#: qml/Wizard/Page.qml:54
563msgctxt "Button: Go back one page in the Wizard"
659msgctxt "Button: Go back one page in the Wizard"
564msgid "Back"
660msgid "Back"
565−msgstr "পূর্বপাতা"
661+msgstr ""
566
662
567−#: qml/Wizard/Pages/10-welcome.qml:29
663+#: qml/Wizard/Pages/10-welcome.qml:28
568msgid "Language"
664msgid "Language"
569−msgstr "ভাষা"
665+msgstr ""
570−
571−#: qml/Wizard/Pages/10-welcome.qml:176
572−#: qml/Wizard/Pages/10-welcome-update.qml:126
573−#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
574−#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
575−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
576−#: qml/Wizard/Pages/passcode-desktop.qml:154
577−#: qml/Wizard/Pages/password-set.qml:153
578−msgid "Next"
579−msgstr "পরবর্তী"
580−
581−#: qml/Wizard/Pages/10-welcome-update.qml:91
582−msgid "Welcome to "
583−msgstr "স্বাগতম "
584−
585−#: qml/Wizard/Pages/10-welcome-update.qml:106
586−msgid "We will make sure your device is ready to use "
587−msgstr "আপনার ডিভাইসটির ব্যবহার উপযোগিতা আমরা নিশ্চিত করব "
588−
589−#: qml/Wizard/Pages/11-changelog.qml:28
590−msgid "What's new"
591−msgstr "যা কিছু নতুন"
592
666
593−#: qml/Wizard/Pages/11-changelog.qml:74
667+#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
668+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
669+#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
670+#: qml/Wizard/Pages/70-passwd-type.qml:145
671+#: qml/Wizard/Pages/75-report-check.qml:84
672+#: qml/Wizard/Pages/passcode-desktop.qml:142
673+#: qml/Wizard/Pages/password-set.qml:142
594−msgid "Loading..."
674+msgid "Next"
595−msgstr "লোড হচ্ছে..."
675+msgstr ""
596
676
597#: qml/Wizard/Pages/20-keyboard.qml:31
677#: qml/Wizard/Pages/20-keyboard.qml:31
598msgid "Select Keyboard"
678msgid "Select Keyboard"
599−msgstr "কিবোর্ড নির্বাচন করুন"
679+msgstr ""
600
680
601#: qml/Wizard/Pages/20-keyboard.qml:71
681#: qml/Wizard/Pages/20-keyboard.qml:71
602msgid "Keyboard language"
682msgid "Keyboard language"
603−msgstr "কিবোর্ডের ভাষা"
683+msgstr ""
604
684
605#: qml/Wizard/Pages/20-keyboard.qml:93
685#: qml/Wizard/Pages/20-keyboard.qml:93
606msgid "Keyboard layout"
686msgid "Keyboard layout"
607−msgstr "কিবোর্ডের নকশা"
687+msgstr ""
608
688
609−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
689+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
610−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
611−#: qml/Wizard/Pages/sim.qml:101
690+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
612msgid "Skip"
691msgid "Skip"
613msgstr "এড়িয়ে যান"
692msgstr "এড়িয়ে যান"
614
693
615−#: qml/Wizard/Pages/30-wifi.qml:31
694+#: qml/Wizard/Pages/30-wifi.qml:30
616msgid "Connect to Wi‑Fi"
695msgid "Connect to Wi‑Fi"
617−msgstr "ওযাই-ফাইতে সংযুক্ত হোন"
696+msgstr ""
618
697
619−#: qml/Wizard/Pages/30-wifi.qml:139
698+#: qml/Wizard/Pages/30-wifi.qml:131
620msgid "Connected"
699msgid "Connected"
621−msgstr "সংযুক্ত"
700+msgstr ""
622
701
623−#: qml/Wizard/Pages/30-wifi.qml:172
702+#: qml/Wizard/Pages/30-wifi.qml:164
624msgid "Available Wi-Fi networks"
703msgid "Available Wi-Fi networks"
625−msgstr "লব্দ ওয়াই-ফাই নেটওয়ার্ক"
704+msgstr ""
626
705
627−#: qml/Wizard/Pages/30-wifi.qml:173
706+#: qml/Wizard/Pages/30-wifi.qml:165
628msgid "No available Wi-Fi networks"
707msgid "No available Wi-Fi networks"
629−msgstr "কোন ওয়াই-ফাই নেটওয়ার্ক পাওয়া যায়নি"
708+msgstr ""
709+
710+#: qml/Wizard/Pages/40-location.qml:27
711+msgid "Location Services"
712+msgstr ""
713+
714+#: qml/Wizard/Pages/40-location.qml:83
715+msgid ""
716+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
717+"(recommended)"
718+msgstr ""
719+
720+#: qml/Wizard/Pages/40-location.qml:105
721+#, qt-format
722+msgid "By selecting this option you agree to the Nokia HERE %1."
723+msgstr ""
724+
725+#: qml/Wizard/Pages/40-location.qml:106
726+msgctxt "part of: Nokia HERE terms and conditions"
727+msgid "terms and conditions"
728+msgstr ""
729+
730+#: qml/Wizard/Pages/40-location.qml:160
731+msgid "GPS only"
732+msgstr ""
733+
734+#: qml/Wizard/Pages/40-location.qml:214
735+msgid "Don't use my location"
736+msgstr ""
737+
738+#: qml/Wizard/Pages/40-location.qml:260
739+msgid "You can change it later in System Settings."
740+msgstr ""
630
741
631#: qml/Wizard/Pages/50-timezone.qml:30
742#: qml/Wizard/Pages/50-timezone.qml:30
632msgid "Time Zone"
743msgid "Time Zone"
633−msgstr "সময় অঞ্চল"
744+msgstr ""
634
745
635−#: qml/Wizard/Pages/50-timezone.qml:183
746+#: qml/Wizard/Pages/50-timezone.qml:182
636msgid "Enter your city"
747msgid "Enter your city"
637−msgstr "আপনার শহরের নাম লিখুন"
748+msgstr ""
638
749
639#: qml/Wizard/Pages/60-account.qml:24
750#: qml/Wizard/Pages/60-account.qml:24
640msgid "Personalize Your Device"
751msgid "Personalize Your Device"
641−msgstr "আপনার ডিভাইসে নিজস্বতা আনুন"
752+msgstr ""
642
753
643−#: qml/Wizard/Pages/60-account.qml:54
754+#: qml/Wizard/Pages/60-account.qml:48
644msgid "Preferred Name"
755msgid "Preferred Name"
645−msgstr "পছন্দসই নাম"
756+msgstr ""
646
757
647#: qml/Wizard/Pages/70-passwd-type.qml:40
758#: qml/Wizard/Pages/70-passwd-type.qml:40
648msgid "Lock Screen"
759msgid "Lock Screen"
649−msgstr "তালাপর্দা"
760+msgstr ""
650
761
651−#: qml/Wizard/Pages/70-passwd-type.qml:103
762+#: qml/Wizard/Pages/70-passwd-type.qml:102
652msgctxt "Label: Type of security method"
763msgctxt "Label: Type of security method"
653msgid "Create new password"
764msgid "Create new password"
654−msgstr "নতুন পাসওয়ার্ড"
765+msgstr ""
655
766
656−#: qml/Wizard/Pages/70-passwd-type.qml:105
767+#: qml/Wizard/Pages/70-passwd-type.qml:104
657msgctxt "Label: Type of security method"
768msgctxt "Label: Type of security method"
658msgid "Create passcode (numbers only)"
769msgid "Create passcode (numbers only)"
659−msgstr "নতুন পাসকোড (শুধুমাত্র সংখ্যা)"
770+msgstr ""
660
771
661−#: qml/Wizard/Pages/70-passwd-type.qml:107
772+#: qml/Wizard/Pages/70-passwd-type.qml:106
662msgctxt "Label: Type of security method"
773msgctxt "Label: Type of security method"
663msgid "No lock code"
774msgid "No lock code"
664−msgstr "কোডবিহীন তালা"
775+msgstr ""
665
776
666−#: qml/Wizard/Pages/79-system-update.qml:28
777+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
667−msgid "Update Device"
778+msgid "Privacy Policy"
668−msgstr "ডিভাইসের আধুনিকায়ন"
779+msgstr ""
669
780
670−#: qml/Wizard/Pages/79-system-update.qml:55
781+#: qml/Wizard/Pages/75-report-check.qml:26
671−msgid ""
782+msgid "Help Us Improve"
672−"There is a system update available and ready to install. Afterwards, the "
673−"device will automatically restart."
674msgstr ""
783msgstr ""
675−"একটি সিস্টেম সংযোজন ইন্সটলের জন্য প্রস্তুত। ইন্সটল শেষে ডিভাইসটি নিজেই পুনরায় চালু "
676−"হবে।"
677
784
678−#: qml/Wizard/Pages/79-system-update.qml:76
785+#: qml/Wizard/Pages/75-report-check.qml:59
679−msgctxt "string identifying name of the update"
786+msgid "Improve system performance by sending us crashes and error reports."
680−msgid "Ubuntu Touch system"
787+msgstr ""
681−msgstr "উবুন্টু টাচ সিস্টেম"
682
788
683−#: qml/Wizard/Pages/79-system-update.qml:83
789+#: qml/Wizard/Pages/75-report-check.qml:60
684−#, qt-format
790+msgid "Privacy policy"
685−msgctxt "version of the system update"
791+msgstr ""
686−msgid "Version %1"
687−msgstr "সংস্করণ %1"
688
792
689−#: qml/Wizard/Pages/79-system-update.qml:95
793+#: qml/Wizard/Pages/80-finished.qml:89
690−msgid "This could take a few minutes..."
794+msgid "Welcome to Ubuntu"
691−msgstr "সম্পন্ন হতে কিছু সময় লাগতে পারে ..."
795+msgstr ""
692
796
693−#: qml/Wizard/Pages/79-system-update.qml:109
797+#: qml/Wizard/Pages/80-finished.qml:104
694−msgid "Install and restart now"
798+msgid "You are ready to use your device now"
695−msgstr "এখনি ইন্সটল এবং পুনরায় চালু করুন"
799+msgstr ""
696
800
697−#: qml/Wizard/Pages/80-finished.qml:91
801+#: qml/Wizard/Pages/80-finished.qml:124
698−msgid "Welcome Back"
802+msgid "Get Started"
699−msgstr "ফিরে আসায় স্বাগতম"
803+msgstr ""
700
804
701−#: qml/Wizard/Pages/80-finished.qml:91
805+#: qml/Wizard/Pages/here-terms.qml:25
702−msgid "Welcome to Ubuntu"
806+msgid "Terms & Conditions"
703−msgstr "উবুন্টুতে স্বাগতম"
807+msgstr ""
704
808
705−#: qml/Wizard/Pages/80-finished.qml:106
809+#: qml/Wizard/Pages/here-terms.qml:69
706−msgid "You are ready to use your device now"
810+msgid "Your device uses positioning technologies provided by HERE."
707−msgstr "আপনার ডিভাইসটি এখন ব্যবহারের জন্য প্রস্তুত"
811+msgstr ""
812+
813+#: qml/Wizard/Pages/here-terms.qml:81
814+msgid ""
815+"To provide you with positioning services and to improve their quality, HERE "
816+"collects information about nearby cell towers and Wi-Fi hotspots around your "
817+"current location whenever your position is being found."
818+msgstr ""
708
819
709−#: qml/Wizard/Pages/80-finished.qml:126
820+#: qml/Wizard/Pages/here-terms.qml:93
710−msgid "Continue"
821+msgid ""
711−msgstr "এগিয়ে যান"
822+"The information collected is used to analyze the service and to improve the "
823+"use of service, but not to identify you personally."
824+msgstr ""
712
825
713−#: qml/Wizard/Pages/80-finished.qml:126
826+#: qml/Wizard/Pages/here-terms.qml:106
714−msgid "Get Started"
827+#, qt-format
715−msgstr "চলুন শুরু করি"
828+msgid "By continuing, you agree to the HERE platform %1 and %2."
829+msgstr ""
830+
831+#: qml/Wizard/Pages/here-terms.qml:107
832+msgid "Service Terms"
833+msgstr ""
716
834
717#: qml/Wizard/Pages/passcode-confirm.qml:43
835#: qml/Wizard/Pages/passcode-confirm.qml:43
718−#: qml/Wizard/Pages/passcode-desktop.qml:104
836+#: qml/Wizard/Pages/passcode-desktop.qml:97
719msgid "Confirm passcode"
837msgid "Confirm passcode"
720−msgstr "পাসকোড নিশ্চিত করুন"
838+msgstr ""
721
839
722#: qml/Wizard/Pages/passcode-confirm.qml:45
840#: qml/Wizard/Pages/passcode-confirm.qml:45
723msgid "Incorrect passcode."
841msgid "Incorrect passcode."
724−msgstr "ভুল পাসকোড।"
842+msgstr ""
725
843
726#: qml/Wizard/Pages/passcode-confirm.qml:45
844#: qml/Wizard/Pages/passcode-confirm.qml:45
727msgctxt "Enter the passcode again"
845msgctxt "Enter the passcode again"
728msgid "Please re-enter."
846msgid "Please re-enter."
729−msgstr "পুনরায় লিখুন।"
847+msgstr ""
730
848
731#: qml/Wizard/Pages/passcode-desktop.qml:31
849#: qml/Wizard/Pages/passcode-desktop.qml:31
732msgid "Lock Screen Passcode"
850msgid "Lock Screen Passcode"
733−msgstr "তালাপর্দার পাসকোড"
851+msgstr ""
734
852
735−#: qml/Wizard/Pages/passcode-desktop.qml:68
853+#: qml/Wizard/Pages/passcode-desktop.qml:61
736msgid "Enter 4 numbers to setup your passcode"
854msgid "Enter 4 numbers to setup your passcode"
737−msgstr "পাসকোডের জন্য ৪ টি সংখ্যা লিখুন"
855+msgstr ""
738
856
739−#: qml/Wizard/Pages/passcode-desktop.qml:84
857+#: qml/Wizard/Pages/passcode-desktop.qml:77
740#: qml/Wizard/Pages/passcode-set.qml:54
858#: qml/Wizard/Pages/passcode-set.qml:54
741msgid "Choose passcode"
859msgid "Choose passcode"
742−msgstr "পাসকোড নির্বাচন করুন"
860+msgstr ""
743
861
744−#: qml/Wizard/Pages/passcode-desktop.qml:139
862+#: qml/Wizard/Pages/passcode-desktop.qml:127
745msgid "Passcode too short"
863msgid "Passcode too short"
746−msgstr "পাসকোড নির্ধারিত সংখ্যার চেয়ে কম"
864+msgstr ""
747
865
748−#: qml/Wizard/Pages/passcode-desktop.qml:141
866+#: qml/Wizard/Pages/passcode-desktop.qml:129
749msgid "Passcodes match"
867msgid "Passcodes match"
750−msgstr "অনুরূপ পাসকোড"
868+msgstr ""
751
869
752−#: qml/Wizard/Pages/passcode-desktop.qml:143
870+#: qml/Wizard/Pages/passcode-desktop.qml:131
753msgid "Passcodes do not match"
871msgid "Passcodes do not match"
754−msgstr "পাসকোড মিলেনি"
872+msgstr ""
755
873
756#: qml/Wizard/Pages/passcode-set.qml:62
874#: qml/Wizard/Pages/passcode-set.qml:62
757msgid "Passcode must be 4 characters long"
875msgid "Passcode must be 4 characters long"
758−msgstr "পাসকোড কমপক্ষে ৪ সংখ্যার হতে হবে"
876+msgstr ""
759
877
760#: qml/Wizard/Pages/password-set.qml:31
878#: qml/Wizard/Pages/password-set.qml:31
761msgid "Lock Screen Password"
879msgid "Lock Screen Password"
762−msgstr "তালাপর্দার পাসওয়ার্ড"
880+msgstr ""
763
881
764−#: qml/Wizard/Pages/password-set.qml:68
882+#: qml/Wizard/Pages/password-set.qml:62
765msgid "Enter at least 8 characters"
883msgid "Enter at least 8 characters"
766−msgstr "কমপক্ষে ৮ টি বর্ণ লিখুন"
884+msgstr ""
767
885
768−#: qml/Wizard/Pages/password-set.qml:80
886+#: qml/Wizard/Pages/password-set.qml:74
769msgid "Choose password"
887msgid "Choose password"
770−msgstr "পাসওয়ার্ড নির্বাচন করুন"
888+msgstr ""
771
889
772−#: qml/Wizard/Pages/password-set.qml:110
890+#: qml/Wizard/Pages/password-set.qml:104
773msgid "Confirm password"
891msgid "Confirm password"
774−msgstr "পাসওয়ার্ড নিশ্চিত করুন"
892+msgstr ""
775
893
776#: qml/Wizard/Pages/sim.qml:27
894#: qml/Wizard/Pages/sim.qml:27
777msgid "No SIM card installed"
895msgid "No SIM card installed"
778−msgstr "কোন সিমকার্ড প্রবেশ করানো হয়নি"
896+msgstr ""
779
897
780#: qml/Wizard/Pages/sim.qml:54
898#: qml/Wizard/Pages/sim.qml:54
781msgid "SIM card added"
899msgid "SIM card added"
782−msgstr "সিমকার্ড যুক্ত করা হয়েছে"
900+msgstr ""
783
901
784#: qml/Wizard/Pages/sim.qml:55
902#: qml/Wizard/Pages/sim.qml:55
785msgid "You must restart the device to access the mobile network."
903msgid "You must restart the device to access the mobile network."
786−msgstr "মোবাইল নেটওয়ার্কে সংযুক্তির জন্য ডিভাইসটি পুনারায় চালু করুন।"
904+msgstr ""
787
905
788#: qml/Wizard/Pages/sim.qml:59
906#: qml/Wizard/Pages/sim.qml:59
789msgid "Restart"
907msgid "Restart"
@@ -791,113 +909,39 @@ msgstr "পুনরায় চালু"
791
909
792#: qml/Wizard/Pages/sim.qml:78
910#: qml/Wizard/Pages/sim.qml:78
793msgid "You won’t be able to make calls or use text messaging without a SIM."
911msgid "You won’t be able to make calls or use text messaging without a SIM."
794−msgstr "সিম কার্ড ছাড়া আপনি কল করা বা টেক্সট মেসেজ পাঠাতে পারবেন না।"
912+msgstr ""
795
913
796#: qml/Wizard/Pages/sim.qml:90
914#: qml/Wizard/Pages/sim.qml:90
797msgid "To proceed with no SIM tap Skip."
915msgid "To proceed with no SIM tap Skip."
798−msgstr "সিমবিহীন ব্যবহারের জন্য এড়িয়ে যান চাপুন।"
916+msgstr ""
799
917
800#: qml/Wizard/PasswordMeter.qml:87
918#: qml/Wizard/PasswordMeter.qml:87
801msgid "Password too short"
919msgid "Password too short"
802−msgstr "পাসওয়ার্ড নির্ধারিত বর্ণসংখ্যার চেয়ে কম"
920+msgstr ""
803
921
804#: qml/Wizard/PasswordMeter.qml:89
922#: qml/Wizard/PasswordMeter.qml:89
805msgid "Passwords match"
923msgid "Passwords match"
806−msgstr "অনুরূপ পাসওয়ার্ড"
924+msgstr ""
807
925
808#: qml/Wizard/PasswordMeter.qml:91
926#: qml/Wizard/PasswordMeter.qml:91
809msgid "Passwords do not match"
927msgid "Passwords do not match"
810−msgstr "পাসওয়ার্ড মিলেনি"
928+msgstr ""
811
929
812#: qml/Wizard/PasswordMeter.qml:95
930#: qml/Wizard/PasswordMeter.qml:95
813msgid "Strong password"
931msgid "Strong password"
814−msgstr "জটিল পাসওয়ার্ড"
932+msgstr ""
815
933
816#: qml/Wizard/PasswordMeter.qml:97
934#: qml/Wizard/PasswordMeter.qml:97
817msgid "Fair password"
935msgid "Fair password"
818−msgstr "মাঝারি পাসওয়ার্ড"
936+msgstr ""
819
937
820#: qml/Wizard/PasswordMeter.qml:99
938#: qml/Wizard/PasswordMeter.qml:99
821msgid "Weak password"
939msgid "Weak password"
822−msgstr "দুর্বল পাসওয়ার্ড"
940+msgstr ""
823
941
824#: qml/Wizard/PasswordMeter.qml:101
942#: qml/Wizard/PasswordMeter.qml:101
825msgid "Very weak password"
943msgid "Very weak password"
826−msgstr "অত্যন্ত দুর্বল পাসওয়ার্ড"
944+msgstr ""
827−
828−#~ msgid "Unity 8"
829−#~ msgstr "ইউনিটি ৮"
830−
831−#~ msgid "Scopes"
832−#~ msgstr "প্রাচুর্য"
833−
834−#~ msgid "Super (Tap)"
835−#~ msgstr "সুপার কী (ট্যাপ করুন)"
836−
837−#~ msgid "Opens the Scopes home."
838−#~ msgstr "প্রাচুর্য নীড়পাতায় প্রবেশ।"
839−
840−#~ msgctxt "Button: Open the Ubuntu Store"
841−#~ msgid "Store"
842−#~ msgstr "স্টোর"
843−
844−#~ msgctxt "Button: Start a search in the current dash scope"
845−#~ msgid "Search"
846−#~ msgstr "খুঁজুন"
847−
848−#~ msgctxt "Button: Show the current dash scope settings"
849−#~ msgid "Settings"
850−#~ msgstr "সেটিংস"
851−
852−#~ msgid "Remove from Favorites"
853−#~ msgstr "পছন্দ থেকে মুছে ফেলুন"
854−
855−#~ msgid "Add to Favorites"
856−#~ msgstr "পছন্দতে যোগ করুন"
857−
858−#~ msgctxt "Label: Hint for dash search line edit"
859−#~ msgid "Search"
860−#~ msgstr "খুঁজুন"
861−
862−#~ msgid "More..."
863−#~ msgstr "আরো..."
864−
865−#~ msgid "Less..."
866−#~ msgstr "কম..."
867−
868−#~ msgid "Send"
869−#~ msgstr "পাঠান"
870−
871−#~ msgid "Rate this"
872−#~ msgstr "রেটিং দিন"
873−
874−#~ msgid "Add a review"
875−#~ msgstr "আপনার মতামত দিন"
876−
877−#~ msgid "Enable location data"
878−#~ msgstr "অবস্থান নির্ণয় চালু করুন"
879−
880−#~ msgid "Manage"
881−#~ msgstr "ব্যবস্থাপনা"
882−
883−#~ msgid "Also installed"
884−#~ msgstr "আরও ইন্সটল করা রয়েছে..."
885−
886−#, fuzzy
887−#~ msgid "Please wait..."
888−#~ msgstr "অপেক্ষা করুন..."
889−
890−#, fuzzy
891−#~ msgid "Download"
892−#~ msgstr "ডাউনলোড হচ্ছে"
893−
894−#, fuzzy
895−#~ msgid "Downloaded"
896−#~ msgstr "ডাউনলোড হচ্ছে"
897−
898−#, fuzzy
899−#~ msgid "Installed"
900−#~ msgstr "আরও ইন্সটল করা রয়েছে..."
901
945
902#~ msgctxt "Button: Reboot the system"
946#~ msgctxt "Button: Reboot the system"
903#~ msgid "Reboot"
947#~ msgid "Reboot"
@@ -915,6 +959,7 @@ msgstr "অত্যন্ত দুর্বল পাসওয়ার্ড"
915#~ msgid "This will be your last attempt."
959#~ msgid "This will be your last attempt."
916#~ msgstr "এটিই আপনার সর্বশেষ সুযোগ।"
960#~ msgstr "এটিই আপনার সর্বশেষ সুযোগ।"
917
961
962+#, qt-format
918#~ msgid "Sorry, incorrect %1"
963#~ msgid "Sorry, incorrect %1"
919#~ msgstr "দুঃখিত, %1 ভুল হয়েছে"
964#~ msgstr "দুঃখিত, %1 ভুল হয়েছে"
920
965
@@ -936,6 +981,9 @@ msgstr "অত্যন্ত দুর্বল পাসওয়ার্ড"
936#~ msgid "You almost got it!"
981#~ msgid "You almost got it!"
937#~ msgstr "আপনি প্রায় পেরে গেছেন!"
982#~ msgstr "আপনি প্রায় পেরে গেছেন!"
938
983
984+#~ msgid "Open the launcher"
985+#~ msgstr "লঞ্চার খুলুন"
986+
939#~ msgctxt "Label: Type of security method"
987#~ msgctxt "Label: Type of security method"
940#~ msgid "Passcode"
988#~ msgid "Passcode"
941#~ msgstr "পাসকোড"
989#~ msgstr "পাসকোড"
@@ -986,6 +1034,9 @@ msgstr "অত্যন্ত দুর্বল পাসওয়ার্ড"
986#~ msgid "Well done"
1034#~ msgid "Well done"
987#~ msgstr "অস্থির!"
1035#~ msgstr "অস্থির!"
988
1036
1037+#~ msgid "Try swiping from the right edge to unlock the phone"
1038+#~ msgstr "ফোনটির লক খুলতে ডান প্রান্ত থেকে সোয়াইপ করুন"
1039+
989#~ msgid "Right edge"
1040#~ msgid "Right edge"
990#~ msgstr "ডান প্রান্ত"
1041#~ msgstr "ডান প্রান্ত"
991
1042
@@ -995,9 +1046,18 @@ msgstr "অত্যন্ত দুর্বল পাসওয়ার্ড"
995#~ msgid "Store"
1046#~ msgid "Store"
996#~ msgstr "স্টোর"
1047#~ msgstr "স্টোর"
997
1048
1049+#~ msgid "Search"
1050+#~ msgstr "খুঁজুন"
1051+
998#~ msgid "Type or say a command"
1052#~ msgid "Type or say a command"
999#~ msgstr "কমান্ড লিখুন বা বলুন"
1053#~ msgstr "কমান্ড লিখুন বা বলুন"
1000
1054
1055+#~ msgid "Loading. Please Wait..."
1056+#~ msgstr "অপেক্ষা করুন..."
1057+
1058+#~ msgid "Speaking..."
1059+#~ msgstr "বলা হচ্ছে..."
1060+
1001#~ msgid "Speak Now..."
1061#~ msgid "Speak Now..."
1002#~ msgstr "এখন বলুন..."
1062#~ msgstr "এখন বলুন..."
1003
1063
@@ -1007,9 +1067,13 @@ msgstr "অত্যন্ত দুর্বল পাসওয়ার্ড"
1007#~ msgid "Roaming"
1067#~ msgid "Roaming"
1008#~ msgstr "রোমিং"
1068#~ msgstr "রোমিং"
1009
1069
1070+#~ msgid "Enter passphrase"
1071+#~ msgstr "পাসওয়ার্ড লিখুন"
1072+
1010#~ msgid "Sorry, incorrect passphrase"
1073#~ msgid "Sorry, incorrect passphrase"
1011#~ msgstr "দুঃখিত, পাসওয়ার্ড ভুল হয়েছে"
1074#~ msgstr "দুঃখিত, পাসওয়ার্ড ভুল হয়েছে"
1012
1075
1076+#, qt-format
1013#~ msgid "Enter %1"
1077#~ msgid "Enter %1"
1014#~ msgstr "%1 লিখুন"
1078#~ msgstr "%1 লিখুন"
1015
1079
@@ -1019,9 +1083,12 @@ msgstr "অত্যন্ত দুর্বল পাসওয়ার্ড"
1019#~ msgid "Please re-enter"
1083#~ msgid "Please re-enter"
1020#~ msgstr "অনুগ্রহ করে আবার লিখুন"
1084#~ msgstr "অনুগ্রহ করে আবার লিখুন"
1021
1085
1086+#~ msgid "Enter passcode"
1087+#~ msgstr "পাসকোড লিখুন"
1088+
1022#~ msgid ""
1089#~ msgid ""
1023−#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1090+#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1024−#~ "reset and all personal data will be deleted."
1091+#~ "and all personal data will be deleted."
1025#~ msgstr "ভুল পাসকোড প্রদান করলে, আপনার ফোনটির সকল ব্যক্তিগত তথ্য মুছে যাবে।"
1092#~ msgstr "ভুল পাসকোড প্রদান করলে, আপনার ফোনটির সকল ব্যক্তিগত তথ্য মুছে যাবে।"
1026
1093
1027#~ msgid ""
1094#~ msgid ""
@@ -1060,3 +1127,6 @@ msgstr "অত্যন্ত দুর্বল পাসওয়ার্ড"
1060#~ msgctxt "Label: Description of security method"
1127#~ msgctxt "Label: Description of security method"
1061#~ msgid "4 digits only"
1128#~ msgid "4 digits only"
1062#~ msgstr "কেবল মাত্র ৪টি সংখ্যা"
1129#~ msgstr "কেবল মাত্র ৪টি সংখ্যা"
1130+
1131+#~ msgid "Continue"
1132+#~ msgstr "পরবর্তী"
po/br.po+349−327
@@ -6,40 +6,39 @@
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9−"Report-Msgid-Bugs-To: \n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2021-01-29 11:42-0600\n"
10+"POT-Creation-Date: 2017-04-04 22:56+0000\n"
11"PO-Revision-Date: 2016-08-29 11:37+0000\n"
11"PO-Revision-Date: 2016-08-29 11:37+0000\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
13"Language-Team: Breton <br@li.org>\n"
13"Language-Team: Breton <br@li.org>\n"
14−"Language: br\n"
15"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
19−"X-Launchpad-Export-Date: 2016-11-23 06:34+0000\n"
18+"X-Launchpad-Export-Date: 2017-04-07 06:29+0000\n"
20−"X-Generator: Launchpad (build 18269)\n"
19+"X-Generator: Launchpad (build 18343)\n"
21
20
22−#: plugins/LightDM/Greeter.cpp:199
21+#: plugins/LightDM/Greeter.cpp:188
23msgid "Password: "
22msgid "Password: "
24msgstr "Ger-tremen : "
23msgstr "Ger-tremen : "
25
24
26−#: plugins/LightDM/Greeter.cpp:214
25+#: plugins/LightDM/Greeter.cpp:203
27msgid "Username"
26msgid "Username"
28msgstr ""
27msgstr ""
29
28
30−#: plugins/LightDM/Greeter.cpp:258
29+#: plugins/LightDM/Greeter.cpp:242
31msgid "Failed to authenticate"
30msgid "Failed to authenticate"
32msgstr ""
31msgstr ""
33
32
34−#: plugins/LightDM/Greeter.cpp:260
33+#: plugins/LightDM/Greeter.cpp:244
35msgid "Invalid password, please try again"
34msgid "Invalid password, please try again"
36msgstr ""
35msgstr ""
37
36
38−#: plugins/LightDM/Greeter.cpp:270
37+#: plugins/LightDM/Greeter.cpp:254
39msgid "Log In"
38msgid "Log In"
40msgstr "Kevreañ"
39msgstr "Kevreañ"
41
40
42−#: plugins/LightDM/Greeter.cpp:270
41+#: plugins/LightDM/Greeter.cpp:254
43msgid "Retry"
42msgid "Retry"
44msgstr "Esaeañ en-dro"
43msgstr "Esaeañ en-dro"
45
44
@@ -51,16 +50,16 @@ msgstr ""
51msgid "Guest Session"
50msgid "Guest Session"
52msgstr ""
51msgstr ""
53
52
54−#: plugins/Unity/Launcher/launcheritem.cpp:48
53+#: plugins/Unity/Launcher/launcheritem.cpp:49
55−#: plugins/Unity/Launcher/launcheritem.cpp:122
54+#: plugins/Unity/Launcher/launcheritem.cpp:123
56msgid "Pin shortcut"
55msgid "Pin shortcut"
57msgstr "Spilhennañ ar verradenn"
56msgstr "Spilhennañ ar verradenn"
58
57
59−#: plugins/Unity/Launcher/launcheritem.cpp:54
58+#: plugins/Unity/Launcher/launcheritem.cpp:55
60msgid "Quit"
59msgid "Quit"
61msgstr "Mont kuit"
60msgstr "Mont kuit"
62
61
63−#: plugins/Unity/Launcher/launcheritem.cpp:122
62+#: plugins/Unity/Launcher/launcheritem.cpp:123
64msgid "Unpin shortcut"
63msgid "Unpin shortcut"
65msgstr "Dispilhennañ ar verradenn"
64msgstr "Dispilhennañ ar verradenn"
66
65
@@ -83,8 +82,9 @@ msgctxt "Button: Log out from the system"
83msgid "Log Out"
82msgid "Log Out"
84msgstr "Digevreañ"
83msgstr "Digevreañ"
85
84
86−#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:284
85+#: qml/Components/Dialogs.qml:199 qml/Components/Dialogs.qml:264
86+#: qml/Dash/DashPageHeader.qml:324 qml/Greeter/NarrowView.qml:208
87−#: qml/Greeter/NarrowView.qml:215 qml/Wizard/Pages/passcode-confirm.qml:32
87+#: qml/Wizard/Pages/passcode-confirm.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
88#: qml/Wizard/Pages/passcode-set.qml:32
89msgid "Cancel"
89msgid "Cancel"
90msgstr "Nullañ"
90msgstr "Nullañ"
@@ -106,12 +106,12 @@ msgstr "N'on ket"
106msgid "Yes"
106msgid "Yes"
107msgstr "Ya"
107msgstr "Ya"
108
108
109−#: qml/Components/Dialogs.qml:243
109+#: qml/Components/Dialogs.qml:239
110msgctxt "Title: Power off/Restart dialog"
110msgctxt "Title: Power off/Restart dialog"
111msgid "Power"
111msgid "Power"
112msgstr "Enaouiñ"
112msgstr "Enaouiñ"
113
113
114−#: qml/Components/Dialogs.qml:244
114+#: qml/Components/Dialogs.qml:240
115msgid ""
115msgid ""
116"Are you sure you would like\n"
116"Are you sure you would like\n"
117"to power off?"
117"to power off?"
@@ -119,29 +119,23 @@ msgstr ""
119"Ha sur oc'h e fell deoc'h\n"
119"Ha sur oc'h e fell deoc'h\n"
120"troc'hañ an tredan ?"
120"troc'hañ an tredan ?"
121
121
122−#: qml/Components/Dialogs.qml:248
122+#: qml/Components/Dialogs.qml:244
123msgctxt "Button: Power off the system"
123msgctxt "Button: Power off the system"
124msgid "Power off"
124msgid "Power off"
125msgstr "Lazhañ"
125msgstr "Lazhañ"
126
126
127−#: qml/Components/Dialogs.qml:263
127+#: qml/Components/Dialogs.qml:255
128msgctxt "Button: Restart the system"
128msgctxt "Button: Restart the system"
129msgid "Restart"
129msgid "Restart"
130msgstr "Adloc'hañ"
130msgstr "Adloc'hañ"
131
131
132−#: qml/Components/Dialogs.qml:276
133−#, fuzzy
134−#| msgid "Takes a screenshot."
135−msgid "Screenshot"
136−msgstr "Tapout ur skeudenn eus ar skramm"
137−
138#: qml/Components/KeyboardShortcutsOverlay.qml:41
132#: qml/Components/KeyboardShortcutsOverlay.qml:41
139msgid "Keyboard Shortcuts"
133msgid "Keyboard Shortcuts"
140msgstr "Berradennoù klavier"
134msgstr "Berradennoù klavier"
141
135
142#: qml/Components/KeyboardShortcutsOverlay.qml:55
136#: qml/Components/KeyboardShortcutsOverlay.qml:55
143−msgid "Lomiri"
137+msgid "Unity 8"
144−msgstr ""
138+msgstr "Unity 8"
145
139
146#: qml/Components/KeyboardShortcutsOverlay.qml:62
140#: qml/Components/KeyboardShortcutsOverlay.qml:62
147msgid "PrtScr"
141msgid "PrtScr"
@@ -156,10 +150,8 @@ msgid "Alt + PrtScr"
156msgstr ""
150msgstr ""
157
151
158#: qml/Components/KeyboardShortcutsOverlay.qml:80
152#: qml/Components/KeyboardShortcutsOverlay.qml:80
159−#, fuzzy
160−#| msgid "Takes a screenshot of a window."
161msgid "Takes a screenshot of the current window."
153msgid "Takes a screenshot of the current window."
162−msgstr "Tapout ur skeudenn eus ur prenestr"
154+msgstr ""
163
155
164#: qml/Components/KeyboardShortcutsOverlay.qml:88
156#: qml/Components/KeyboardShortcutsOverlay.qml:88
165msgid "Super + Space"
157msgid "Super + Space"
@@ -167,7 +159,7 @@ msgstr ""
167
159
168#: qml/Components/KeyboardShortcutsOverlay.qml:93
160#: qml/Components/KeyboardShortcutsOverlay.qml:93
169msgid "Switches to next keyboard layout."
161msgid "Switches to next keyboard layout."
170−msgstr ""
162+msgstr "Mont d'ar fichadur klavir war-lerc'h"
171
163
172#: qml/Components/KeyboardShortcutsOverlay.qml:101
164#: qml/Components/KeyboardShortcutsOverlay.qml:101
173msgid "Super + Shift + Space"
165msgid "Super + Shift + Space"
@@ -175,13 +167,11 @@ msgstr ""
175
167
176#: qml/Components/KeyboardShortcutsOverlay.qml:106
168#: qml/Components/KeyboardShortcutsOverlay.qml:106
177msgid "Switches to previous keyboard layout."
169msgid "Switches to previous keyboard layout."
178−msgstr ""
170+msgstr "Mont d'ar fichadur klavier kent"
179
171
180#: qml/Components/KeyboardShortcutsOverlay.qml:114
172#: qml/Components/KeyboardShortcutsOverlay.qml:114
181−#, fuzzy
182−#| msgid "Alt + Tab"
183msgid "Ctrl + Alt + T"
173msgid "Ctrl + Alt + T"
184−msgstr "Erl + Taolenn"
174+msgstr ""
185
175
186#: qml/Components/KeyboardShortcutsOverlay.qml:119
176#: qml/Components/KeyboardShortcutsOverlay.qml:119
187msgid "Starts the Terminal application."
177msgid "Starts the Terminal application."
@@ -205,7 +195,7 @@ msgstr "Erl + F1"
205
195
206#: qml/Components/KeyboardShortcutsOverlay.qml:156
196#: qml/Components/KeyboardShortcutsOverlay.qml:156
207msgid "Opens launcher keyboard navigation mode."
197msgid "Opens launcher keyboard navigation mode."
208−msgstr ""
198+msgstr "Digeriñ ar mod merdeiñ gant lañser ar c'hlavier"
209
199
210#: qml/Components/KeyboardShortcutsOverlay.qml:164
200#: qml/Components/KeyboardShortcutsOverlay.qml:164
211msgid "Super + Tab"
201msgid "Super + Tab"
@@ -213,7 +203,7 @@ msgstr ""
213
203
214#: qml/Components/KeyboardShortcutsOverlay.qml:169
204#: qml/Components/KeyboardShortcutsOverlay.qml:169
215msgid "Switches applications via the launcher."
205msgid "Switches applications via the launcher."
216−msgstr ""
206+msgstr "Mont d'un arload all dre al lañser."
217
207
218#: qml/Components/KeyboardShortcutsOverlay.qml:177
208#: qml/Components/KeyboardShortcutsOverlay.qml:177
219msgid "Super + 1 to 0"
209msgid "Super + 1 to 0"
@@ -228,10 +218,20 @@ msgid "Super + A"
228msgstr ""
218msgstr ""
229
219
230#: qml/Components/KeyboardShortcutsOverlay.qml:195
220#: qml/Components/KeyboardShortcutsOverlay.qml:195
231−#, fuzzy
232−#| msgid "Open the launcher"
233msgid "Opens the Application Drawer."
221msgid "Opens the Application Drawer."
234−msgstr "Digeriñ al lañser"
222+msgstr ""
223+
224+#: qml/Components/KeyboardShortcutsOverlay.qml:207
225+msgid "Scopes"
226+msgstr "Kefluskerioù enklask"
227+
228+#: qml/Components/KeyboardShortcutsOverlay.qml:214
229+msgid "Super (Tap)"
230+msgstr ""
231+
232+#: qml/Components/KeyboardShortcutsOverlay.qml:219
233+msgid "Opens the Scopes home."
234+msgstr "Digeriñ pajenn degemer ar c'hefluskerioù enklask."
235
235
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
236#: qml/Components/KeyboardShortcutsOverlay.qml:235
237msgid "Switching"
237msgid "Switching"
@@ -243,7 +243,7 @@ msgstr "Erl + Taolenn"
243
243
244#: qml/Components/KeyboardShortcutsOverlay.qml:247
244#: qml/Components/KeyboardShortcutsOverlay.qml:247
245msgid "Switches between applications."
245msgid "Switches between applications."
246−msgstr ""
246+msgstr "Mont da arloadoù all."
247
247
248#: qml/Components/KeyboardShortcutsOverlay.qml:255
248#: qml/Components/KeyboardShortcutsOverlay.qml:255
249msgid "Super + W"
249msgid "Super + W"
@@ -251,15 +251,15 @@ msgstr ""
251
251
252#: qml/Components/KeyboardShortcutsOverlay.qml:260
252#: qml/Components/KeyboardShortcutsOverlay.qml:260
253msgid "Opens the desktop spread."
253msgid "Opens the desktop spread."
254−msgstr ""
254+msgstr "Digeriñ ar burev astennet"
255
255
256#: qml/Components/KeyboardShortcutsOverlay.qml:268
256#: qml/Components/KeyboardShortcutsOverlay.qml:268
257msgid "Cursor Left or Right"
257msgid "Cursor Left or Right"
258−msgstr ""
258+msgstr "Reti kleiz pe dehoù"
259
259
260#: qml/Components/KeyboardShortcutsOverlay.qml:273
260#: qml/Components/KeyboardShortcutsOverlay.qml:273
261msgid "Moves the focus."
261msgid "Moves the focus."
262−msgstr ""
262+msgstr "Cheñch an dibab."
263
263
264#: qml/Components/KeyboardShortcutsOverlay.qml:285
264#: qml/Components/KeyboardShortcutsOverlay.qml:285
265msgid "Windows"
265msgid "Windows"
@@ -303,9 +303,9 @@ msgstr "Erl + F4"
303
303
304#: qml/Components/KeyboardShortcutsOverlay.qml:349
304#: qml/Components/KeyboardShortcutsOverlay.qml:349
305msgid "Closes the current window."
305msgid "Closes the current window."
306−msgstr ""
306+msgstr "Serriñ ar prenestr a vremañ"
307
307
308−#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:235
308+#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:228
309msgid "Return to Call"
309msgid "Return to Call"
310msgstr "Distreiñ d'ar bellgomzadenn"
310msgstr "Distreiñ d'ar bellgomzadenn"
311
311
@@ -365,12 +365,12 @@ msgid ""
365"Your device is now connected to an external display. Use this screen as a "
365"Your device is now connected to an external display. Use this screen as a "
366"touch pad to interact with the pointer."
366"touch pad to interact with the pointer."
367msgstr ""
367msgstr ""
368+"Kevreet eo ho penveg ouzh ur skramm diavaez bremañ. Implijit ar skramm-mañ "
369+"da bavez-touch evit ober gant ar reti."
368
370
369#: qml/Components/VirtualTouchPad.qml:327
371#: qml/Components/VirtualTouchPad.qml:327
370−#, fuzzy
371−#| msgid "Tap to return to call..."
372msgid "Tap left button to click."
372msgid "Tap left button to click."
373−msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
373+msgstr ""
374
374
375#: qml/Components/VirtualTouchPad.qml:339
375#: qml/Components/VirtualTouchPad.qml:339
376msgid "Tap right button to right click."
376msgid "Tap right button to right click."
@@ -384,6 +384,103 @@ msgstr ""
384msgid "Find more settings in the system settings."
384msgid "Find more settings in the system settings."
385msgstr ""
385msgstr ""
386
386
387+#: qml/Dash/DashPageHeader.qml:361
388+msgctxt "Button: Open the Ubuntu Store"
389+msgid "Store"
390+msgstr "Stal"
391+
392+#: qml/Dash/DashPageHeader.qml:368
393+msgctxt "Button: Start a search in the current dash scope"
394+msgid "Search"
395+msgstr "Klask"
396+
397+#: qml/Dash/DashPageHeader.qml:378
398+msgctxt "Button: Show the current dash scope settings"
399+msgid "Settings"
400+msgstr "Arventennoù"
401+
402+#: qml/Dash/DashPageHeader.qml:385
403+msgid "Remove from Favorites"
404+msgstr "Lemel eus ar sinedoù"
405+
406+#: qml/Dash/DashPageHeader.qml:385
407+msgid "Add to Favorites"
408+msgstr "Ouzhpennañ d'ar sinedoù"
409+
410+#: qml/Dash/FiltersPopover.qml:61
411+msgid "Refine your results"
412+msgstr "Purañ ho tisoc'hoù"
413+
414+#: qml/Dash/FiltersPopover.qml:70
415+msgid "Reset"
416+msgstr "Adderaouekaat"
417+
418+#: qml/Dash/GenericScopeView.qml:547 qml/Dash/GenericScopeView.qml:718
419+msgid "Show less"
420+msgstr "Diskouez nebeutoc'h"
421+
422+#: qml/Dash/GenericScopeView.qml:547
423+msgid "Show all"
424+msgstr "Diskouez pep tra"
425+
426+#: qml/Dash/GenericScopeView.qml:578
427+msgctxt "Label: Hint for dash search line edit"
428+msgid "Search"
429+msgstr "Klask"
430+
431+#: qml/Dash/PageHeaderExtraPanel.qml:67
432+msgid "Recent Searches"
433+msgstr "Enklaskoù graet nevez zo"
434+
435+#: qml/Dash/PageHeaderExtraPanel.qml:78
436+msgid "Clear All"
437+msgstr "Diverkañ pep tra"
438+
439+#: qml/Dash/Previews/PreviewActionCombo.qml:36
440+msgid "More..."
441+msgstr "Muioc'h..."
442+
443+#: qml/Dash/Previews/PreviewActionCombo.qml:36
444+msgid "Less..."
445+msgstr "Nebeutoc'h..."
446+
447+#: qml/Dash/Previews/PreviewCommentInput.qml:83
448+#: qml/Dash/Previews/PreviewRatingInput.qml:202
449+msgid "Send"
450+msgstr "Kas"
451+
452+#: qml/Dash/Previews/PreviewRatingInput.qml:109
453+msgid "Rate this"
454+msgstr "Priziit an dra-mañ"
455+
456+#: qml/Dash/Previews/PreviewRatingInput.qml:184
457+msgid "Add a review"
458+msgstr "Ouzhpennañ un ali"
459+
460+#: qml/Dash/PullToRefreshScopeStyle.qml:56
461+msgid "Pull to refresh…"
462+msgstr "Tennañ evit freskaat..."
463+
464+#: qml/Dash/PullToRefreshScopeStyle.qml:61
465+msgid "Release to refresh…"
466+msgstr "Lezel da vont evit freskaat..."
467+
468+#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
469+msgid "Enable location data"
470+msgstr "Gweredekaat ar roadennoù lec'hiañ"
471+
472+#: qml/Dash/ScopesList.qml:146
473+msgid "Manage"
474+msgstr "Merañ"
475+
476+#: qml/Dash/ScopesList.qml:187
477+msgid "Home"
478+msgstr "Er gêr"
479+
480+#: qml/Dash/ScopesList.qml:188
481+msgid "Also installed"
482+msgstr "Staliet ivez"
483+
387#: qml/Greeter/CoverPage.qml:127
484#: qml/Greeter/CoverPage.qml:127
388msgid "Unlock"
485msgid "Unlock"
389msgstr "Dibrennañ"
486msgstr "Dibrennañ"
@@ -416,20 +513,16 @@ msgid "Try again"
416msgstr "Esaeañ adarre"
513msgstr "Esaeañ adarre"
417
514
418#: qml/Greeter/Greeter.qml:551
515#: qml/Greeter/Greeter.qml:551
419−#, fuzzy
420−#| msgid "Enter passphrase"
421msgid "Enter passphrase to unlock"
516msgid "Enter passphrase to unlock"
422−msgstr "Merkañ ar frazenn-dremen"
517+msgstr ""
423
518
424#: qml/Greeter/Greeter.qml:552
519#: qml/Greeter/Greeter.qml:552
425−#, fuzzy
426−#| msgid "Enter passcode"
427msgid "Enter passcode to unlock"
520msgid "Enter passcode to unlock"
428−msgstr "Merkañ ar c'hod-tremen"
521+msgstr ""
429
522
430−#: qml/Greeter/NarrowView.qml:235
523+#: qml/Greeter/NarrowView.qml:228
431msgid "Emergency"
524msgid "Emergency"
432−msgstr ""
525+msgstr "Mall"
433
526
434#: qml/Greeter/PromptList.qml:126
527#: qml/Greeter/PromptList.qml:126
435msgid "Passphrase"
528msgid "Passphrase"
@@ -441,21 +534,20 @@ msgstr "Kod-tremen"
441
534
442#: qml/Greeter/SessionsList.qml:124
535#: qml/Greeter/SessionsList.qml:124
443msgid "Select desktop environment"
536msgid "Select desktop environment"
444−msgstr ""
537+msgstr "Diuzañ endro ar burev"
445
538
446−#: qml/Launcher/Drawer.qml:250
539+#: qml/Launcher/Drawer.qml:94
447−#, fuzzy
448−#| msgid "Search"
449msgid "Search…"
540msgid "Search…"
450−msgstr "Klask"
541+msgstr ""
451
542
452−#: qml/Launcher/PullToRefreshScopeStyle.qml:56
543+#: qml/Launcher/Drawer.qml:129
544+msgctxt "Apps sorted alphabetically"
453−msgid "Pull to refresh…"
545+msgid "A-Z"
454−msgstr "Tennañ evit freskaat..."
546+msgstr ""
455
547
456−#: qml/Launcher/PullToRefreshScopeStyle.qml:61
548+#: qml/Launcher/MoreAppsHeader.qml:55
457−msgid "Release to refresh…"
549+msgid "More apps in the store"
458−msgstr "Lezel da vont evit freskaat..."
550+msgstr ""
459
551
460#: qml/Notifications/NotificationMenuItemFactory.qml:124
552#: qml/Notifications/NotificationMenuItemFactory.qml:124
461msgid "Show password"
553msgid "Show password"
@@ -545,81 +637,54 @@ msgid "Call back"
545msgstr "Gervel en-dro"
637msgstr "Gervel en-dro"
546
638
547#: qml/Panel/PanelMenuPage.qml:92
639#: qml/Panel/PanelMenuPage.qml:92
548−#, fuzzy
549−#| msgctxt "Button: Go back one page in the Wizard"
550−#| msgid "Back"
551msgid "Back"
640msgid "Back"
552−msgstr "Distreiñ"
641+msgstr ""
553
642
554#: qml/Stage/SideStage.qml:76
643#: qml/Stage/SideStage.qml:76
555msgid "Drag using 3 fingers any application from one window to the other"
644msgid "Drag using 3 fingers any application from one window to the other"
556−msgstr ""
645+msgstr "Riklit forzh peseurt arload gant tri biz eus an eil prenestr d'egile"
557−
558−#: qml/Stage/Stage.qml:671
559−msgid "No running apps"
560−msgstr ""
561
646
562#: qml/Tutorial/TutorialLeftLong.qml:49
647#: qml/Tutorial/TutorialLeftLong.qml:49
563−#, fuzzy
564−#| msgid "Try swiping from the top edge to access the indicators"
565msgid "Long swipe from the left edge to open the Application Drawer"
648msgid "Long swipe from the left edge to open the Application Drawer"
566msgstr ""
649msgstr ""
567−"Lakait ho piz da riklañ adalek ar bord uhelañ da lakaat ar merkerioù war wel."
568
650
569#: qml/Tutorial/TutorialLeft.qml:47
651#: qml/Tutorial/TutorialLeft.qml:47
570msgid "Short swipe from the left edge to open the launcher"
652msgid "Short swipe from the left edge to open the launcher"
571−msgstr ""
653+msgstr "Rikladenn verr adalek ar bord kleiz evit digeriñ al lañser"
572
654
573−#: qml/Tutorial/TutorialRight.qml:54
655+#: qml/Tutorial/TutorialRight.qml:55
574msgid "Push your mouse against the right edge to view your open apps"
656msgid "Push your mouse against the right edge to view your open apps"
575msgstr ""
657msgstr ""
576"Dilec'hiit ho logodenn betek ar bord dehoù evit gwelet hoc'h arloadoù digor"
658"Dilec'hiit ho logodenn betek ar bord dehoù evit gwelet hoc'h arloadoù digor"
577
659
578−#: qml/Tutorial/TutorialRight.qml:55
660+#: qml/Tutorial/TutorialRight.qml:56
579msgid "Swipe from the right edge to view your open apps"
661msgid "Swipe from the right edge to view your open apps"
580−msgstr ""
662+msgstr "Riklañ adalek ar bord dehoù evit gwelet hoc'h arloadoù digor"
581
663
582#: qml/Tutorial/TutorialTop.qml:53
664#: qml/Tutorial/TutorialTop.qml:53
583msgid "Swipe from the top edge to access notifications and quick settings"
665msgid "Swipe from the top edge to access notifications and quick settings"
584msgstr ""
666msgstr ""
667+"Riklañ adalek an nec'h evit gwelet ar c'hemennoù hag an arventennoù prim"
585
668
586−#: qml/Wizard/Page.qml:59
669+#: qml/Wizard/Page.qml:54
587msgctxt "Button: Go back one page in the Wizard"
670msgctxt "Button: Go back one page in the Wizard"
588msgid "Back"
671msgid "Back"
589msgstr "Distreiñ"
672msgstr "Distreiñ"
590
673
591−#: qml/Wizard/Pages/10-welcome.qml:29
674+#: qml/Wizard/Pages/10-welcome.qml:28
592msgid "Language"
675msgid "Language"
593msgstr "Yezh"
676msgstr "Yezh"
594
677
595−#: qml/Wizard/Pages/10-welcome.qml:176
678+#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
596−#: qml/Wizard/Pages/10-welcome-update.qml:126
679+#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/40-location.qml:271
597−#: qml/Wizard/Pages/11-changelog.qml:74 qml/Wizard/Pages/20-keyboard.qml:152
598−#: qml/Wizard/Pages/30-wifi.qml:214 qml/Wizard/Pages/50-timezone.qml:272
680+#: qml/Wizard/Pages/50-timezone.qml:271 qml/Wizard/Pages/60-account.qml:65
599−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/70-passwd-type.qml:146
681+#: qml/Wizard/Pages/70-passwd-type.qml:145
682+#: qml/Wizard/Pages/75-report-check.qml:84
600−#: qml/Wizard/Pages/passcode-desktop.qml:154
683+#: qml/Wizard/Pages/passcode-desktop.qml:142
601−#: qml/Wizard/Pages/password-set.qml:153
684+#: qml/Wizard/Pages/password-set.qml:142
602msgid "Next"
685msgid "Next"
603msgstr "War-lerc'h"
686msgstr "War-lerc'h"
604
687
605−#: qml/Wizard/Pages/10-welcome-update.qml:91
606−#, fuzzy
607−msgid "Welcome to "
608−msgstr "Donemat en Ubuntu"
609−
610−#: qml/Wizard/Pages/10-welcome-update.qml:106
611−msgid "We will make sure your device is ready to use "
612−msgstr ""
613−
614−#: qml/Wizard/Pages/11-changelog.qml:28
615−msgid "What's new"
616−msgstr ""
617−
618−#: qml/Wizard/Pages/11-changelog.qml:74
619−#, fuzzy
620−msgid "Loading..."
621−msgstr "O komz..."
622−
623#: qml/Wizard/Pages/20-keyboard.qml:31
688#: qml/Wizard/Pages/20-keyboard.qml:31
624msgid "Select Keyboard"
689msgid "Select Keyboard"
625msgstr "Diuzañ ar c'hlavier"
690msgstr "Diuzañ ar c'hlavier"
@@ -632,33 +697,64 @@ msgstr "Yezh ar c'hlavier"
632msgid "Keyboard layout"
697msgid "Keyboard layout"
633msgstr "Aozadur ar c'hlavier"
698msgstr "Aozadur ar c'hlavier"
634
699
635−#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:214
700+#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:206
636−#: qml/Wizard/Pages/60-account.qml:72 qml/Wizard/Pages/79-system-update.qml:144
637−#: qml/Wizard/Pages/sim.qml:101
701+#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/sim.qml:101
638msgid "Skip"
702msgid "Skip"
639msgstr "Tremen hebiou"
703msgstr "Tremen hebiou"
640
704
641−#: qml/Wizard/Pages/30-wifi.qml:31
705+#: qml/Wizard/Pages/30-wifi.qml:30
642msgid "Connect to Wi‑Fi"
706msgid "Connect to Wi‑Fi"
643msgstr "Kevreañ ouzh ar Wi-Fi"
707msgstr "Kevreañ ouzh ar Wi-Fi"
644
708
645−#: qml/Wizard/Pages/30-wifi.qml:139
709+#: qml/Wizard/Pages/30-wifi.qml:131
646msgid "Connected"
710msgid "Connected"
647msgstr "Kevreet"
711msgstr "Kevreet"
648
712
649−#: qml/Wizard/Pages/30-wifi.qml:172
713+#: qml/Wizard/Pages/30-wifi.qml:164
650msgid "Available Wi-Fi networks"
714msgid "Available Wi-Fi networks"
651msgstr "Rouedadoù Wi-Fi da gaout"
715msgstr "Rouedadoù Wi-Fi da gaout"
652
716
653−#: qml/Wizard/Pages/30-wifi.qml:173
717+#: qml/Wizard/Pages/30-wifi.qml:165
654msgid "No available Wi-Fi networks"
718msgid "No available Wi-Fi networks"
655msgstr "N'eus ket rouedadoù Wi-Fi da gaout"
719msgstr "N'eus ket rouedadoù Wi-Fi da gaout"
656
720
721+#: qml/Wizard/Pages/40-location.qml:27
722+msgid "Location Services"
723+msgstr "Servijoù lec'hiañ"
724+
725+#: qml/Wizard/Pages/40-location.qml:83
726+msgid ""
727+"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
728+"(recommended)"
729+msgstr ""
730+
731+#: qml/Wizard/Pages/40-location.qml:105
732+#, qt-format
733+msgid "By selecting this option you agree to the Nokia HERE %1."
734+msgstr ""
735+
736+#: qml/Wizard/Pages/40-location.qml:106
737+msgctxt "part of: Nokia HERE terms and conditions"
738+msgid "terms and conditions"
739+msgstr "penndivizoù implij"
740+
741+#: qml/Wizard/Pages/40-location.qml:160
742+msgid "GPS only"
743+msgstr "GPS hepken"
744+
745+#: qml/Wizard/Pages/40-location.qml:214
746+msgid "Don't use my location"
747+msgstr "Arabat implijout ma lec'h"
748+
749+#: qml/Wizard/Pages/40-location.qml:260
750+msgid "You can change it later in System Settings."
751+msgstr "Gallout a rit cheñch se diwezhatoc'h en arventennoù ar reizhiad."
752+
657#: qml/Wizard/Pages/50-timezone.qml:30
753#: qml/Wizard/Pages/50-timezone.qml:30
658msgid "Time Zone"
754msgid "Time Zone"
659msgstr "Gwerzhid-eur"
755msgstr "Gwerzhid-eur"
660
756
661−#: qml/Wizard/Pages/50-timezone.qml:183
757+#: qml/Wizard/Pages/50-timezone.qml:182
662msgid "Enter your city"
758msgid "Enter your city"
663msgstr "Skrivit ho kêr"
759msgstr "Skrivit ho kêr"
664
760
@@ -666,7 +762,7 @@ msgstr "Skrivit ho kêr"
666msgid "Personalize Your Device"
762msgid "Personalize Your Device"
667msgstr "Personelaat ho penveg"
763msgstr "Personelaat ho penveg"
668
764
669−#: qml/Wizard/Pages/60-account.qml:54
765+#: qml/Wizard/Pages/60-account.qml:48
670msgid "Preferred Name"
766msgid "Preferred Name"
671msgstr ""
767msgstr ""
672
768
@@ -674,75 +770,83 @@ msgstr ""
674msgid "Lock Screen"
770msgid "Lock Screen"
675msgstr "Prennañ ar skramm"
771msgstr "Prennañ ar skramm"
676
772
677−#: qml/Wizard/Pages/70-passwd-type.qml:103
773+#: qml/Wizard/Pages/70-passwd-type.qml:102
678msgctxt "Label: Type of security method"
774msgctxt "Label: Type of security method"
679msgid "Create new password"
775msgid "Create new password"
680msgstr "Krouiñ ur ger-tremen nevez"
776msgstr "Krouiñ ur ger-tremen nevez"
681
777
682−#: qml/Wizard/Pages/70-passwd-type.qml:105
778+#: qml/Wizard/Pages/70-passwd-type.qml:104
683msgctxt "Label: Type of security method"
779msgctxt "Label: Type of security method"
684msgid "Create passcode (numbers only)"
780msgid "Create passcode (numbers only)"
685msgstr "Krouiñ ur c'hod (difroù hepken)"
781msgstr "Krouiñ ur c'hod (difroù hepken)"
686
782
687−#: qml/Wizard/Pages/70-passwd-type.qml:107
783+#: qml/Wizard/Pages/70-passwd-type.qml:106
688msgctxt "Label: Type of security method"
784msgctxt "Label: Type of security method"
689msgid "No lock code"
785msgid "No lock code"
690msgstr "N'eus kod prennañ ebet"
786msgstr "N'eus kod prennañ ebet"
691
787
692−#: qml/Wizard/Pages/79-system-update.qml:28
788+#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
693−msgid "Update Device"
694−msgstr "Hizivaat ar benveg"
695−
696−#: qml/Wizard/Pages/79-system-update.qml:55
697−msgid ""
789+msgid "Privacy Policy"
698−"There is a system update available and ready to install. Afterwards, the "
790+msgstr "Reolennoù prevezded"
699−"device will automatically restart."
700−msgstr ""
701−
702−#: qml/Wizard/Pages/79-system-update.qml:76
703−#, fuzzy
704−#| msgctxt "string identifying name of the update"
705−#| msgid "Ubuntu system"
706−msgctxt "string identifying name of the update"
707−msgid "Ubuntu Touch system"
708−msgstr "Reizhiad Ubuntu"
709−
710−#: qml/Wizard/Pages/79-system-update.qml:83
711−#, qt-format
712−msgctxt "version of the system update"
713−msgid "Version %1"
714−msgstr "Stumm %1"
715
791
716−#: qml/Wizard/Pages/79-system-update.qml:95
792+#: qml/Wizard/Pages/75-report-check.qml:26
717−msgid "This could take a few minutes..."
793+msgid "Help Us Improve"
718−msgstr "Gallout a ra padout un nebeud munutennoù..."
794+msgstr "Sikourit ac'hanomp da wellaat"
719
795
720−#: qml/Wizard/Pages/79-system-update.qml:109
796+#: qml/Wizard/Pages/75-report-check.qml:59
721−msgid "Install and restart now"
797+msgid "Improve system performance by sending us crashes and error reports."
722−msgstr "Staliañ hag adloc'hañ bremañ"
798+msgstr "Gwellait ar reizhiad en ur gas deomp an danevelloù fazi."
723
799
724−#: qml/Wizard/Pages/80-finished.qml:91
800+#: qml/Wizard/Pages/75-report-check.qml:60
725−msgid "Welcome Back"
801+msgid "Privacy policy"
726−msgstr ""
802+msgstr "Reolennoù buhez prevez"
727
803
728−#: qml/Wizard/Pages/80-finished.qml:91
804+#: qml/Wizard/Pages/80-finished.qml:89
729msgid "Welcome to Ubuntu"
805msgid "Welcome to Ubuntu"
730msgstr "Donemat en Ubuntu"
806msgstr "Donemat en Ubuntu"
731
807
732−#: qml/Wizard/Pages/80-finished.qml:106
808+#: qml/Wizard/Pages/80-finished.qml:104
733msgid "You are ready to use your device now"
809msgid "You are ready to use your device now"
734msgstr "Bremañ oc'h prest da implijout ho penveg"
810msgstr "Bremañ oc'h prest da implijout ho penveg"
735
811
736−#: qml/Wizard/Pages/80-finished.qml:126
812+#: qml/Wizard/Pages/80-finished.qml:124
737−msgid "Continue"
738−msgstr "Kenderc'hel"
739−
740−#: qml/Wizard/Pages/80-finished.qml:126
741msgid "Get Started"
813msgid "Get Started"
742msgstr "Kregiñ ganti"
814msgstr "Kregiñ ganti"
743
815
816+#: qml/Wizard/Pages/here-terms.qml:25
817+msgid "Terms & Conditions"
818+msgstr "Penndivizoù implij"
819+
820+#: qml/Wizard/Pages/here-terms.qml:69
821+msgid "Your device uses positioning technologies provided by HERE."
822+msgstr "Ho penveg a implij teknologiezhoù lec'hiañ pourchaset gant HERE."
823+
824+#: qml/Wizard/Pages/here-terms.qml:81
825+msgid ""
826+"To provide you with positioning services and to improve their quality, HERE "
827+"collects information about nearby cell towers and Wi-Fi hotspots around your "
828+"current location whenever your position is being found."
829+msgstr ""
830+
831+#: qml/Wizard/Pages/here-terms.qml:93
832+msgid ""
833+"The information collected is used to analyze the service and to improve the "
834+"use of service, but not to identify you personally."
835+msgstr ""
836+"Implijet e vez an titouroù dastumet evit dielfennañ ar servij ha gwellaat an "
837+"implij anezhañ, ha neket evit anavezout ac'hanoc'h."
838+
839+#: qml/Wizard/Pages/here-terms.qml:106
840+#, qt-format
841+msgid "By continuing, you agree to the HERE platform %1 and %2."
842+msgstr ""
843+
844+#: qml/Wizard/Pages/here-terms.qml:107
845+msgid "Service Terms"
846+msgstr "Divizoù servij"
847+
744#: qml/Wizard/Pages/passcode-confirm.qml:43
848#: qml/Wizard/Pages/passcode-confirm.qml:43
745−#: qml/Wizard/Pages/passcode-desktop.qml:104
849+#: qml/Wizard/Pages/passcode-desktop.qml:97
746msgid "Confirm passcode"
850msgid "Confirm passcode"
747msgstr "Kadarnaat ar c'hod-tremen"
851msgstr "Kadarnaat ar c'hod-tremen"
748
852
@@ -759,24 +863,24 @@ msgstr "Skrivit adarre, mar plij."
759msgid "Lock Screen Passcode"
863msgid "Lock Screen Passcode"
760msgstr "Kod da brennañ ar skramm"
864msgstr "Kod da brennañ ar skramm"
761
865
762−#: qml/Wizard/Pages/passcode-desktop.qml:68
866+#: qml/Wizard/Pages/passcode-desktop.qml:61
763msgid "Enter 4 numbers to setup your passcode"
867msgid "Enter 4 numbers to setup your passcode"
764msgstr "Skrivit 4 sifr evit lakaat ho kod"
868msgstr "Skrivit 4 sifr evit lakaat ho kod"
765
869
766−#: qml/Wizard/Pages/passcode-desktop.qml:84
870+#: qml/Wizard/Pages/passcode-desktop.qml:77
767#: qml/Wizard/Pages/passcode-set.qml:54
871#: qml/Wizard/Pages/passcode-set.qml:54
768msgid "Choose passcode"
872msgid "Choose passcode"
769msgstr "Choaz ur c'hod"
873msgstr "Choaz ur c'hod"
770
874
771−#: qml/Wizard/Pages/passcode-desktop.qml:139
875+#: qml/Wizard/Pages/passcode-desktop.qml:127
772msgid "Passcode too short"
876msgid "Passcode too short"
773msgstr "Kod re verr"
877msgstr "Kod re verr"
774
878
775−#: qml/Wizard/Pages/passcode-desktop.qml:141
879+#: qml/Wizard/Pages/passcode-desktop.qml:129
776msgid "Passcodes match"
880msgid "Passcodes match"
777msgstr "klotañ a ra ar c'hodoù an eil gant egile"
881msgstr "klotañ a ra ar c'hodoù an eil gant egile"
778
882
779−#: qml/Wizard/Pages/passcode-desktop.qml:143
883+#: qml/Wizard/Pages/passcode-desktop.qml:131
780msgid "Passcodes do not match"
884msgid "Passcodes do not match"
781msgstr "Ne glot ket ar c'hodoù an eil gant egile"
885msgstr "Ne glot ket ar c'hodoù an eil gant egile"
782
886
@@ -788,15 +892,15 @@ msgstr "4 arouezenn a rank bezañ ar c'hod"
788msgid "Lock Screen Password"
892msgid "Lock Screen Password"
789msgstr "Ger-tremen da brennañ ar skramm"
893msgstr "Ger-tremen da brennañ ar skramm"
790
894
791−#: qml/Wizard/Pages/password-set.qml:68
895+#: qml/Wizard/Pages/password-set.qml:62
792msgid "Enter at least 8 characters"
896msgid "Enter at least 8 characters"
793msgstr "Skrivit 8 arouezenn da vihanañ"
897msgstr "Skrivit 8 arouezenn da vihanañ"
794
898
795−#: qml/Wizard/Pages/password-set.qml:80
899+#: qml/Wizard/Pages/password-set.qml:74
796msgid "Choose password"
900msgid "Choose password"
797msgstr "Choaz ur ger-tremen"
901msgstr "Choaz ur ger-tremen"
798
902
799−#: qml/Wizard/Pages/password-set.qml:110
903+#: qml/Wizard/Pages/password-set.qml:104
800msgid "Confirm password"
904msgid "Confirm password"
801msgstr "Kadarnaat ar ger-tremen"
905msgstr "Kadarnaat ar ger-tremen"
802
906
@@ -852,145 +956,6 @@ msgstr "Ger-tremen diasur"
852msgid "Very weak password"
956msgid "Very weak password"
853msgstr "Ger-tremen diasur-kenañ"
957msgstr "Ger-tremen diasur-kenañ"
854
958
855−#~ msgid "Unity 8"
856−#~ msgstr "Unity 8"
857−
858−#~ msgid "Scopes"
859−#~ msgstr "Kefluskerioù enklask"
860−
861−#~ msgid "Opens the Scopes home."
862−#~ msgstr "Digeriñ pajenn degemer ar c'hefluskerioù enklask."
863−
864−#~ msgctxt "Button: Open the Ubuntu Store"
865−#~ msgid "Store"
866−#~ msgstr "Stal"
867−
868−#~ msgctxt "Button: Start a search in the current dash scope"
869−#~ msgid "Search"
870−#~ msgstr "Klask"
871−
872−#~ msgctxt "Button: Show the current dash scope settings"
873−#~ msgid "Settings"
874−#~ msgstr "Arventennoù"
875−
876−#~ msgid "Remove from Favorites"
877−#~ msgstr "Lemel eus ar sinedoù"
878−
879−#~ msgid "Add to Favorites"
880−#~ msgstr "Ouzhpennañ d'ar sinedoù"
881−
882−#~ msgid "Refine your results"
883−#~ msgstr "Purañ ho tisoc'hoù"
884−
885−#~ msgid "Reset"
886−#~ msgstr "Adderaouekaat"
887−
888−#~ msgid "Show less"
889−#~ msgstr "Diskouez nebeutoc'h"
890−
891−#~ msgid "Show all"
892−#~ msgstr "Diskouez pep tra"
893−
894−#~ msgctxt "Label: Hint for dash search line edit"
895−#~ msgid "Search"
896−#~ msgstr "Klask"
897−
898−#~ msgid "Recent Searches"
899−#~ msgstr "Enklaskoù graet nevez zo"
900−
901−#~ msgid "Clear All"
902−#~ msgstr "Diverkañ pep tra"
903−
904−#~ msgid "More..."
905−#~ msgstr "Muioc'h..."
906−
907−#~ msgid "Less..."
908−#~ msgstr "Nebeutoc'h..."
909−
910−#~ msgid "Send"
911−#~ msgstr "Kas"
912−
913−#~ msgid "Rate this"
914−#~ msgstr "Priziit an dra-mañ"
915−
916−#~ msgid "Add a review"
917−#~ msgstr "Ouzhpennañ un ali"
918−
919−#~ msgid "Enable location data"
920−#~ msgstr "Gweredekaat ar roadennoù lec'hiañ"
921−
922−#~ msgid "Manage"
923−#~ msgstr "Merañ"
924−
925−#~ msgid "Home"
926−#~ msgstr "Er gêr"
927−
928−#~ msgid "Also installed"
929−#~ msgstr "Staliet ivez"
930−
931−#~ msgid "Privacy Policy"
932−#~ msgstr "Reolennoù prevezded"
933−
934−#~ msgid "Help Us Improve"
935−#~ msgstr "Sikourit ac'hanomp da wellaat"
936−
937−#~ msgid "Privacy policy"
938−#~ msgstr "Reolennoù buhez prevez"
939−
940−#, fuzzy
941−#~ msgid "Please wait..."
942−#~ msgstr "O kargañ. Gortozit, mar plij..."
943−
944−#, fuzzy
945−#~ msgid "Update all"
946−#~ msgstr "Hizivaat ar benveg"
947−
948−#, fuzzy
949−#~ msgid "Update"
950−#~ msgstr "Hizivaat ar benveg"
951−
952−#, fuzzy
953−#~ msgid "Download"
954−#~ msgstr "O pellgargañ"
955−
956−#, fuzzy
957−#~ msgid "Downloaded"
958−#~ msgstr "O pellgargañ"
959−
960−#, fuzzy
961−#~ msgid "Installed"
962−#~ msgstr "Staliet ivez"
963−
964−#, fuzzy
965−#~ msgid "Updated %1"
966−#~ msgstr "Hizivaat ar benveg"
967−
968−#, fuzzy
969−#~ msgid "Update failed"
970−#~ msgstr "Hizivaat ar benveg"
971−
972−#~ msgid "Location Services"
973−#~ msgstr "Servijoù lec'hiañ"
974−
975−#~ msgctxt "part of: Nokia HERE terms and conditions"
976−#~ msgid "terms and conditions"
977−#~ msgstr "penndivizoù implij"
978−
979−#~ msgid "GPS only"
980−#~ msgstr "GPS hepken"
981−
982−#~ msgid "Don't use my location"
983−#~ msgstr "Arabat implijout ma lec'h"
984−
985−#~ msgid "You can change it later in System Settings."
986−#~ msgstr "Gallout a rit cheñch se diwezhatoc'h en arventennoù ar reizhiad."
987−
988−#~ msgid "Terms & Conditions"
989−#~ msgstr "Penndivizoù implij"
990−
991−#~ msgid "Service Terms"
992−#~ msgstr "Divizoù servij"
993−
994#~ msgid "Close"
959#~ msgid "Close"
995#~ msgstr "Serriñ"
960#~ msgstr "Serriñ"
996
961
@@ -1016,16 +981,28 @@ msgstr "Ger-tremen diasur-kenañ"
1016#~ "Mestroniañ a rit ar jestroù ha gallout a rit kregiñ da implijout ar "
981#~ "Mestroniañ a rit ar jestroù ha gallout a rit kregiñ da implijout ar "
1017#~ "pellgomzer<br><br>Touchit d'ar skramm evit kregiñ ganti"
982#~ "pellgomzer<br><br>Touchit d'ar skramm evit kregiñ ganti"
1018
983
984+#~ msgid "Loading. Please Wait..."
985+#~ msgstr "O kargañ. Gortozit, mar plij..."
986+
987+#~ msgid "Speaking..."
988+#~ msgstr "O komz..."
989+
1019#~ msgid "Speak Now..."
990#~ msgid "Speak Now..."
1020#~ msgstr "Komzit bremañ..."
991#~ msgstr "Komzit bremañ..."
1021
992
1022#~ msgid "Confirm"
993#~ msgid "Confirm"
1023#~ msgstr "Kadarnaat"
994#~ msgstr "Kadarnaat"
1024
995
996+#~ msgid "Search"
997+#~ msgstr "Klask"
998+
999+#~ msgid "Try swiping from the top edge to access the indicators"
1000+#~ msgstr ""
1001+#~ "Lakait ho piz da riklañ adalek ar bord uhelañ da lakaat ar merkerioù war wel."
1002+
1025#~ msgid "Swipe up again to close the settings screen"
1003#~ msgid "Swipe up again to close the settings screen"
1026#~ msgstr ""
1004#~ msgstr ""
1027−#~ "Lakait ho piz da riklañ war-du ar bord uhelañ da serriñ skramm an "
1005+#~ "Lakait ho piz da riklañ war-du ar bord uhelañ da serriñ skramm an arventennoù"
1028−#~ "arventennoù"
1029
1006
1030#~ msgid "Try swiping from the right edge to unlock the phone"
1007#~ msgid "Try swiping from the right edge to unlock the phone"
1031#~ msgstr ""
1008#~ msgstr ""
@@ -1033,8 +1010,8 @@ msgstr "Ger-tremen diasur-kenañ"
1033
1010
1034#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
1011#~ msgid "Swipe from the left to reveal the launcher for quick access to apps"
1035#~ msgstr ""
1012#~ msgstr ""
1036−#~ "Lakait ho piz da riklañ adalek ar bord kleiz da ziskouez al lañser "
1013+#~ "Lakait ho piz da riklañ adalek ar bord kleiz da ziskouez al lañser arloadoù "
1037−#~ "arloadoù prim."
1014+#~ "prim."
1038
1015
1039#~ msgid "Well done"
1016#~ msgid "Well done"
1040#~ msgstr "Gourc'hemennoù !"
1017#~ msgstr "Gourc'hemennoù !"
@@ -1069,6 +1046,7 @@ msgstr "Ger-tremen diasur-kenañ"
1069#~ msgid "Favorites"
1046#~ msgid "Favorites"
1070#~ msgstr "Gwellañ deuet"
1047#~ msgstr "Gwellañ deuet"
1071
1048
1049+#, qt-format
1072#~ msgid "Sorry, incorrect %1"
1050#~ msgid "Sorry, incorrect %1"
1073#~ msgstr "Siwazh, %1 direizh"
1051#~ msgstr "Siwazh, %1 direizh"
1074
1052
@@ -1079,20 +1057,18 @@ msgstr "Ger-tremen diasur-kenañ"
1079#~ msgstr "Siwazh, kod-tremen direizh"
1057#~ msgstr "Siwazh, kod-tremen direizh"
1080
1058
1081#~ msgid ""
1059#~ msgid ""
1082−#~ "If passcode is entered incorrectly, your phone will conduct a factory "
1060+#~ "If passcode is entered incorrectly, your phone will conduct a factory reset "
1083−#~ "reset and all personal data will be deleted."
1061+#~ "and all personal data will be deleted."
1084#~ msgstr ""
1062#~ msgstr ""
1085#~ "Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
1063#~ "Ma vez ebarzhet ur c'hod-tremen direizh, e vo adderaouekaet ho pellgomzer "
1086−#~ "gant arventennoù al labouradeg hag e vo diverket an holl roadennoù "
1064+#~ "gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel."
1087−#~ "personel."
1088
1065
1089#~ msgid ""
1066#~ msgid ""
1090#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1067#~ "If passphrase is entered incorrectly, your phone will conduct a factory "
1091#~ "reset and all personal data will be deleted."
1068#~ "reset and all personal data will be deleted."
1092#~ msgstr ""
1069#~ msgstr ""
1093−#~ "Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho "
1070+#~ "Ma vez ebarzhet ur frazenn-dremen direizh, e vo adderaouekaet ho pellgomzer "
1094−#~ "pellgomzer gant arventennoù al labouradeg hag e vo diverket an holl "
1071+#~ "gant arventennoù al labouradeg hag e vo diverket an holl roadennoù personel"
1095−#~ "roadennoù personel"
1096
1072
1097#~ msgid "This will be your last attempt."
1073#~ msgid "This will be your last attempt."
1098#~ msgstr "Ho taol-esae diwezhañ e vo."
1074#~ msgstr "Ho taol-esae diwezhañ e vo."
@@ -1121,12 +1097,19 @@ msgstr "Ger-tremen diasur-kenañ"
1121#~ msgid "Manage Scopes"
1097#~ msgid "Manage Scopes"
1122#~ msgstr "Merañ ar c'hefluskerioù enklask"
1098#~ msgstr "Merañ ar c'hefluskerioù enklask"
1123
1099
1100+#, qt-format
1124#~ msgid "Enter %1"
1101#~ msgid "Enter %1"
1125#~ msgstr "Merkañ %1"
1102#~ msgstr "Merkañ %1"
1126
1103
1104+#~ msgid "Enter passphrase"
1105+#~ msgstr "Merkañ ar frazenn-dremen"
1106+
1127#~ msgid "Please re-enter"
1107#~ msgid "Please re-enter"
1128#~ msgstr "Adverkañ, mar plij"
1108#~ msgstr "Adverkañ, mar plij"
1129
1109
1110+#~ msgid "Enter passcode"
1111+#~ msgstr "Merkañ ar c'hod-tremen"
1112+
1130#~ msgid "Lock security"
1113#~ msgid "Lock security"
1131#~ msgstr "Surentez ar prennañ"
1114#~ msgstr "Surentez ar prennañ"
1132
1115
@@ -1146,6 +1129,9 @@ msgstr "Ger-tremen diasur-kenañ"
1146#~ msgid "Let’s get started."
1129#~ msgid "Let’s get started."
1147#~ msgstr "Krogomp ganti."
1130#~ msgstr "Krogomp ganti."
1148
1131
1132+#~ msgid "Continue"
1133+#~ msgstr "Kenderc'hel"
1134+
1149#~ msgid "Welcome to your Ubuntu phone."
1135#~ msgid "Welcome to your Ubuntu phone."
1150#~ msgstr "Deuet-mat oc'h en ho pellgomzer Ubuntu."
1136#~ msgstr "Deuet-mat oc'h en ho pellgomzer Ubuntu."
1151
1137
@@ -1183,11 +1169,10 @@ msgstr "Ger-tremen diasur-kenañ"
1183#~ msgstr "Gwellaat ho skiant-prenet"
1169#~ msgstr "Gwellaat ho skiant-prenet"
1184
1170
1185#~ msgid ""
1171#~ msgid ""
1186−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms "
1172+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1187−#~ "and conditions</a>."
1173+#~ "conditions</a>."
1188#~ msgstr ""
1174#~ msgstr ""
1189−#~ "Pa ziuzit an dibarzh-mañ ez asantit da <a href='#'>zivizoù implij</a> "
1175+#~ "Pa ziuzit an dibarzh-mañ ez asantit da <a href='#'>zivizoù implij</a> Nokia."
1190−#~ "Nokia."
1191
1176
1192#~ msgid "Not at all"
1177#~ msgid "Not at all"
1193#~ msgstr "Tamm ebet"
1178#~ msgstr "Tamm ebet"
@@ -1211,6 +1196,7 @@ msgstr "Ger-tremen diasur-kenañ"
1211#~ msgid "Confirm passphrase"
1196#~ msgid "Confirm passphrase"
1212#~ msgstr "Kadarnaat ar frazenn-dremen"
1197#~ msgstr "Kadarnaat ar frazenn-dremen"
1213
1198
1199+#, qt-format
1214#~ msgid "〈 %1"
1200#~ msgid "〈 %1"
1215#~ msgstr "〈 %1"
1201#~ msgstr "〈 %1"
1216
1202
@@ -1226,6 +1212,7 @@ msgstr "Ger-tremen diasur-kenañ"
1226#~ msgid "Your phone is now ready to use."
1212#~ msgid "Your phone is now ready to use."
1227#~ msgstr "Prest eo ho pellgomzer da vezañ implijet bremañ."
1213#~ msgstr "Prest eo ho pellgomzer da vezañ implijet bremañ."
1228
1214
1215+#, qt-format
1229#~ msgid "%1 〉"
1216#~ msgid "%1 〉"
1230#~ msgstr "%1 〉"
1217#~ msgstr "%1 〉"
1231
1218
@@ -1259,6 +1246,9 @@ msgstr "Ger-tremen diasur-kenañ"
1259#~ msgid "Short swipe from the left edge."
1246#~ msgid "Short swipe from the left edge."
1260#~ msgstr "Riklik dousik adalek ar bord kleiz."
1247#~ msgstr "Riklik dousik adalek ar bord kleiz."
1261
1248
1249+#~ msgid "Open the launcher"
1250+#~ msgstr "Digeriñ al lañser"
1251+
1262#~ msgid "Tap here to continue."
1252#~ msgid "Tap here to continue."
1263#~ msgstr "Pouzañ amañ evit kenderc'hel"
1253#~ msgstr "Pouzañ amañ evit kenderc'hel"
1264
1254
@@ -1346,3 +1336,35 @@ msgstr "Ger-tremen diasur-kenañ"
1346
1336
1347#~ msgid "Swipe up to create a message"
1337#~ msgid "Swipe up to create a message"
1348#~ msgstr "Riklit d'an nec'h evit krouiñ ur gemennadenn"
1338#~ msgstr "Riklit d'an nec'h evit krouiñ ur gemennadenn"
1339+
1340+#~ msgid "Takes a screenshot of a window."
1341+#~ msgstr "Tapout ur skeudenn eus ur prenestr"
1342+
1343+#~ msgid "This could take a few minutes..."
1344+#~ msgstr "Gallout a ra padout un nebeud munutennoù..."
1345+
1346+#, qt-format
1347+#~ msgctxt "version of the system update"
1348+#~ msgid "Version %1"
1349+#~ msgstr "Stumm %1"
1350+
1351+#~ msgctxt "string identifying name of the update"
1352+#~ msgid "Ubuntu system"
1353+#~ msgstr "Reizhiad Ubuntu"
1354+
1355+#~ msgid "Update Device"
1356+#~ msgstr "Hizivaat ar benveg"
1357+
1358+#~ msgid "Install and restart now"
1359+#~ msgstr "Staliañ hag adloc'hañ bremañ"
1360+
1361+#~ msgid ""
1362+#~ "There is a system update available and ready to install. Afterwards, the "
1363+#~ "device will automatically restart."
1364+#~ msgstr ""
1365+#~ "Un hizivadenn eus ar reizhiad zo da gaout. Prest eo da vezañ staliet. Goude-"
1366+#~ "se e adloc'ho ho penveg e-unan."
1367+
1368+#~ msgid "Long swipe from the left edge to open the Today scope"
1369+#~ msgstr ""
1370+#~ "Rikladenn hir adalek ar bord kleiz evit digeriñ ar c'heflusker enklask Hiziv"
po/bs.po+277−211

This diff is too big to show here.

po/ca.po+358−397

This diff is too big to show here.

po/ca@valencia.po+282−195

This diff is too big to show here.

po/ce.po+238−112

This diff is too big to show here.

po/ckb.po+252−132

This diff is too big to show here.

po/co.po+279−286

This diff is too big to show here.

po/cs.po+435−469

This diff is too big to show here.

po/cy.po+276−211

This diff is too big to show here.

po/da.po+358−294

This diff is too big to show here.

po/de.po+364−404

This diff is too big to show here.

po/el.po+420−379

This diff is too big to show here.

po/en_AU.po+362−454

This diff is too big to show here.

po/en_GB.po+343−362

This diff is too big to show here.

po/en_US.podeleted−814

This diff is too big to show here.

po/eo.po+264−176

This diff is too big to show here.

po/es.po+366−403

This diff is too big to show here.

po/et.po+236−110

This diff is too big to show here.

po/eu.po+285−216

This diff is too big to show here.

po/fa.po+358−422

This diff is too big to show here.

po/fi.po+341−381

This diff is too big to show here.

po/fo.po+261−187

This diff is too big to show here.

po/fr.po+403−442

This diff is too big to show here.

po/ga.po+275−204

This diff is too big to show here.

po/gd.po+353−372

This diff is too big to show here.

po/gl.po+361−401

This diff is too big to show here.

po/gu.podeleted−814

This diff is too big to show here.

po/gv.po+252−152

This diff is too big to show here.

po/he.po+414−345

This diff is too big to show here.

po/hi.po+248−126

This diff is too big to show here.

po/hr.po+370−361

This diff is too big to show here.

po/hu.po+380−416

This diff is too big to show here.

po/hy.po+355−250

This diff is too big to show here.

po/ia.po+341−362

This diff is too big to show here.

po/id.po+288−202

This diff is too big to show here.

po/is.po+275−173

This diff is too big to show here.

po/it.po+372−410

This diff is too big to show here.

po/ja.po+338−253

This diff is too big to show here.

po/kk.podeleted−841

This diff is too big to show here.

po/km.po+283−212

This diff is too big to show here.

po/kn.po+248−120

This diff is too big to show here.

po/ko.po+408−358

This diff is too big to show here.

po/ku.po+285−187

This diff is too big to show here.

po/ky.po+248−120

This diff is too big to show here.

po/lo.po+245−119

This diff is too big to show here.

po/lt.po+364−404

This diff is too big to show here.

po/lv.po+292−224

This diff is too big to show here.

po/ml.po+254−133

This diff is too big to show here.

po/mr.po+243−135

This diff is too big to show here.

po/ms.po+399−372

This diff is too big to show here.

po/my.po+253−170

This diff is too big to show here.

po/nb.po+350−388

This diff is too big to show here.

po/ne.po+238−115

This diff is too big to show here.

po/nl.po+440−477

This diff is too big to show here.

po/nn.po+238−112

This diff is too big to show here.

po/oc.po+316−314

This diff is too big to show here.

po/or.po+238−112

This diff is too big to show here.

po/pa.po+288−220

This diff is too big to show here.

po/pl.po+381−420

This diff is too big to show here.

po/pt.po+362−400

This diff is too big to show here.

po/pt_BR.po+393−339

This diff is too big to show here.

po/ro.po+296−226

This diff is too big to show here.

po/ru.po+359−408

This diff is too big to show here.

po/sc.podeleted−904

This diff is too big to show here.

po/shn.po+238−112

This diff is too big to show here.

po/si.po+258−139

This diff is too big to show here.

po/sk.po+362−403

This diff is too big to show here.

po/sl.po+335−351

This diff is too big to show here.

po/sq.po+265−205

This diff is too big to show here.

po/sr.po+344−363

This diff is too big to show here.

po/sv.po+349−387

This diff is too big to show here.

po/sw.po+269−189

This diff is too big to show here.

po/ta.po+270−147

This diff is too big to show here.

po/te.po+252−140

This diff is too big to show here.

po/th.po+267−140

This diff is too big to show here.

po/tr.po+349−420

This diff is too big to show here.

po/ug.po+299−267

This diff is too big to show here.

po/uk.po+356−372

This diff is too big to show here.

po/unity8.pot+235−108

This diff is too big to show here.

po/ur.po+264−141

This diff is too big to show here.

po/uz.po+238−112

This diff is too big to show here.

po/vi.po+238−112

This diff is too big to show here.

po/wo.po+289−220

This diff is too big to show here.

po/xh.po+238−112

This diff is too big to show here.

po/zh_CN.po+334−397

This diff is too big to show here.

po/zh_HK.po+253−149

This diff is too big to show here.

po/zh_TW.po+381−400

This diff is too big to show here.

qml/ApplicationMenus/ApplicationMenuItemFactory.qml+7−7

This diff is too big to show here.

qml/ApplicationMenus/MenuItem.qml+3−3

This diff is too big to show here.

qml/ApplicationMenus/RegisteredApplicationMenuModel.qml+1−1

This diff is too big to show here.

qml/CMakeLists.txt+1

This diff is too big to show here.

qml/Components/Background.qml+1−1

This diff is too big to show here.

qml/Components/BaseCarouselDelegate.qmlnew file+42

This diff is too big to show here.

qml/Components/Carousel.qmlnew file+335

This diff is too big to show here.

qml/Components/Dialogs.qml+20−44

This diff is too big to show here.

qml/Components/InputMethod.qml+1−2

This diff is too big to show here.

qml/Components/ItemGrabber.qml+1−1

This diff is too big to show here.

qml/Components/KeyboardShortcutsOverlay.qml+26−2

This diff is too big to show here.

qml/Components/Lockscreen.qml−2

This diff is too big to show here.

qml/Components/PhysicalKeysMapper.qml+4−4

This diff is too big to show here.

qml/Components/ResponsiveGridView.qmlnew file+98

This diff is too big to show here.

qml/Components/ResponsiveVerticalJournal.qmlnew file+81

This diff is too big to show here.

qml/Components/ShellDialog.qml+10−7

This diff is too big to show here.

qml/Components/Showable.qml+12−15

This diff is too big to show here.

qml/Components/Wallpaper.qml+16−68

This diff is too big to show here.

qml/Components/WallpaperResolver.qml+6−17

This diff is too big to show here.

qml/Dash/CardCarousel.qmlnew file+74

This diff is too big to show here.

qml/Dash/CardGrid.qmlnew file+83

This diff is too big to show here.

qml/Dash/CardHorizontalList.qmlnew file+66

This diff is too big to show here.

qml/Dash/CardTool.qmlnew file+274

This diff is too big to show here.

qml/Dash/CardVerticalJournal.qmlnew file+85

This diff is too big to show here.

qml/Dash/Dash.qmlnew file+381

This diff is too big to show here.

qml/Dash/DashApplication.qmlnew file+39

This diff is too big to show here.

qml/Dash/DashBackground.qmlnew file+36

This diff is too big to show here.

qml/Dash/DashCategoryBase.qmlnew file+54

This diff is too big to show here.

qml/Dash/DashContent.qmlnew file+211

This diff is too big to show here.

qml/Dash/DashContentTabBarStyle.qmlnew file+24

This diff is too big to show here.

qml/Dash/DashNavigation.qmlnew file+199

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.qmlnew file+118

This diff is too big to show here.

qml/Dash/DashPageHeader.qmlnew file+448

This diff is too big to show here.

qml/Dash/DashRenderer.qmlnew file+66

This diff is too big to show here.

qml/Dash/DashSectionHeader.qmlnew file+64

This diff is too big to show here.

qml/Dash/Filters/FilterExpandableWidget.qmlnew file+97

This diff is too big to show here.

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

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.

tests/plugins/Unity/Launcher/xdgwatcher.cpp → qml/Dash/Filters/FilterWidget.qmlrenamed+11−24

This diff is too big to show here.

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

This diff is too big to show here.

qml/Dash/FiltersPopover.qmlnew file+106

This diff is too big to show here.

qml/Dash/GenericScopeView.qmlnew file+797

This diff is too big to show here.

qml/Dash/PageHeaderExtraPanel.qmlnew file+201

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.qmlnew file+145

This diff is too big to show here.

qml/Dash/Previews/PreviewActionButton.qmlnew file+27

This diff is too big to show here.

qml/Dash/Previews/PreviewActionCombo.qmlnew file+79

This diff is too big to show here.

qml/Dash/Previews/PreviewActions.qmlnew file+73

This diff is too big to show here.

qml/Dash/Previews/PreviewAudioPlayback.qmlnew file+152

This diff is too big to show here.

qml/Dash/Previews/PreviewComment.qmlnew file+86

This diff is too big to show here.

qml/Dash/Previews/PreviewCommentInput.qmlnew file+88

This diff is too big to show here.

qml/Dash/Previews/PreviewExpandable.qmlnew file+104

This diff is too big to show here.

qml/Dash/Previews/PreviewHeader.qmlnew file+170

This diff is too big to show here.

qml/Dash/Previews/PreviewIconActions.qmlnew file+88

This diff is too big to show here.

qml/Dash/Previews/PreviewImageGallery.qmlnew file+150

This diff is too big to show here.

qml/Dash/Previews/PreviewInlineVideo.qmlnew file+112

This diff is too big to show here.

qml/Dash/Previews/PreviewMediaToolbar.qmlnew file+57

This diff is too big to show here.

qml/Dash/Previews/PreviewOverlay.qmlnew file+166

This diff is too big to show here.

qml/Dash/Previews/PreviewProgress.qmlnew file+74

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingDisplay.qmlnew file+117

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingEdit.qmlnew file+83

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingInput.qmlnew file+207

This diff is too big to show here.

qml/Dash/Previews/PreviewRatingSingleDisplay.qmlnew file+73

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Update/MockSystemImage.qml → qml/Dash/Previews/PreviewSingleton/PreviewSingleton.qmlrenamed+5−13

This diff is too big to show here.

qml/Dash/Previews/PreviewSingleton/qmldirnew file+1

This diff is too big to show here.

qml/Dash/Previews/PreviewTable.qmlnew file+91

This diff is too big to show here.

qml/Dash/Previews/PreviewTextSummary.qmlnew file+78

This diff is too big to show here.

qml/Dash/Previews/PreviewVideoPlayback.qmlnew file+87

This diff is too big to show here.

qml/Dash/Previews/PreviewWidget.qmlnew file+60

This diff is too big to show here.

qml/Dash/Previews/PreviewWidgetFactory.qmlnew file+101

This diff is too big to show here.

qml/Dash/Previews/PreviewZoomableImage.qmlnew file+103

This diff is too big to show here.

qml/Launcher/PullToRefreshScopeStyle.qml → qml/Dash/PullToRefreshScopeStyle.qmlrenamed

The content is the same.

qml/Dash/ScopeListView.qmlnew file+28

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSetting.qmlnew file+46

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingBoolean.qmlnew file+63

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingList.qmlnew file+50

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingNumber.qmlnew file+21

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingString.qmlnew file+89

This diff is too big to show here.

qml/Dash/ScopeSettings/ScopeSettingsWidgetFactory.qmlnew file+61

This diff is too big to show here.

qml/Dash/ScopeSettingsPage.qmlnew file+72

This diff is too big to show here.

qml/Dash/ScopesList.qmlnew file+206

This diff is too big to show here.

qml/Dash/ScopesListCategory.qmlnew file+184

This diff is too big to show here.

qml/Dash/ScopesListCategoryItem.qmlnew file+115

This diff is too big to show here.

qml/Dash/graphics/dark_background.jpgnew file

Binary file not shown.

qml/Dash/graphics/header_handlearrow2@27.pngnew file

Binary file not shown.

qml/Dash/graphics/header_handlearrow@27.pngnew file

Binary file not shown.

qml/Dash/graphics/icon_clear@20.pngnew file

Binary file not shown.

qml/Dash/graphics/icon_search_active@20.pngnew file

Binary file not shown.

qml/Dash/graphics/icon_search_inactive@20.pngnew file

Binary file not shown.

qml/Dash/graphics/overview_hint@30.pngnew file

Binary file not shown.

qml/Dash/graphics/pixel.pngnew file

Binary file not shown.

qml/Dash/graphics/play_button@18.pngnew file

Binary file not shown.

qml/Dash/graphics/play_button_active@18.pngnew file

Binary file not shown.

qml/Dash/graphics/play_button_active_big@20.pngnew file

Binary file not shown.

qml/Dash/graphics/play_button_big@20.pngnew file

Binary file not shown.

qml/Dash/graphics/rectangular_dropshadow@30.pngnew file

Binary file not shown.

qml/Dash/graphics/rectangular_dropshadow@30.scinew file+5

This diff is too big to show here.

qml/Dash/graphics/tabbarchevron@27.pngnew file

Binary file not shown.

qml/Dash/graphics/tablet/icon_close_preview@20.pngnew file

Binary file not shown.

qml/Dash/graphics/tooltip_arrow@27.pngnew file

Binary file not shown.

qml/DeviceConfiguration.qml−12

This diff is too big to show here.

qml/Greeter/ButtonPrompt.qmldeleted−51

This diff is too big to show here.

qml/Greeter/CoverPage.qml+11−32

This diff is too big to show here.

qml/Greeter/Greeter.qml+4−50

This diff is too big to show here.

qml/Greeter/GreeterPrompt.qml+185−64

This diff is too big to show here.

qml/Greeter/GreeterView.qmldeleted−534

This diff is too big to show here.

qml/Greeter/LoginAreaContainer.qml+3−3

This diff is too big to show here.

qml/Greeter/LoginList.qml+83−72

This diff is too big to show here.

qml/Greeter/NarrowView.qmlnew file+263

This diff is too big to show here.

qml/Greeter/PinPrompt.qmldeleted−184

This diff is too big to show here.

qml/Greeter/PromptList.qml+18−21

This diff is too big to show here.

qml/Greeter/SessionsList.qml+2−3

This diff is too big to show here.

qml/Greeter/ShimGreeter.qml−2

This diff is too big to show here.

qml/Greeter/TextPrompt.qmldeleted−198

This diff is too big to show here.

qml/Greeter/WideView.qmlnew file+207

This diff is too big to show here.

qml/Launcher/BackgroundBlur.qmldeleted−81

This diff is too big to show here.

qml/Launcher/Drawer.qml+245−226

This diff is too big to show here.

qml/Launcher/DrawerGridView.qml+5−41

This diff is too big to show here.

qml/Launcher/DrawerListView.qmlnew file+38

This diff is too big to show here.

qml/Launcher/Launcher.qml+63−81

This diff is too big to show here.

qml/Launcher/LauncherDelegate.qml+3−1

This diff is too big to show here.

qml/Launcher/LauncherPanel.qml+11−15

This diff is too big to show here.

qml/Launcher/MoreAppsHeader.qmlnew file+69

This diff is too big to show here.

qml/Notifications/Notification.qml+3−8

This diff is too big to show here.

qml/Notifications/NotificationButton.qml+1−2

This diff is too big to show here.

qml/Notifications/SwipeToAct.qml−4

This diff is too big to show here.

qml/OrientedShell.qml+1−11

This diff is too big to show here.

qml/Panel/ActiveCallHint.qml−3

This diff is too big to show here.

qml/Components/Handle.qml → qml/Panel/Handle.qmlrenamed−1

This diff is too big to show here.

qml/Panel/Indicators/IndicatorItem.qml+2−14

This diff is too big to show here.

qml/Panel/Indicators/IndicatorMenuItemFactory.qml+3−3

This diff is too big to show here.

qml/Panel/Indicators/IndicatorsLight.qml+12−185

This diff is too big to show here.

qml/Panel/MenuContent.qml+1−4

This diff is too big to show here.

qml/Panel/Panel.qml+22−60

This diff is too big to show here.

qml/Panel/PanelBar.qml+8−10

This diff is too big to show here.

qml/Panel/PanelItemRow.qml+4−6

This diff is too big to show here.

qml/Panel/PanelMenu.qml+9−15

This diff is too big to show here.

qml/Panel/PanelMenuPage.qml+1−1

This diff is too big to show here.

qml/Rotation/RotationStates.qml+3

This diff is too big to show here.

qml/ScopeTool.qmlnew file+165

This diff is too big to show here.

qml/Shell.qml+65−120

This diff is too big to show here.

qml/Stage/AbstractStage.qmlnew file+93

This diff is too big to show here.

qml/Stage/ApplicationWindow.qml+4−15

This diff is too big to show here.

qml/Stage/DesktopSpread.qmlnew file+576

This diff is too big to show here.

qml/Stage/DesktopSpreadDelegate.qmlnew file+126

This diff is too big to show here.

qml/Stage/MoveHandler.qml+7−7

This diff is too big to show here.

qml/Stage/PhoneStage.qmlnew file+806

This diff is too big to show here.

qml/Stage/SideStage.qml+6−10

This diff is too big to show here.

qml/Stage/Splash.qml+4−4

This diff is too big to show here.

qml/Stage/SpreadDelegate.qmlnew file+424

This diff is too big to show here.

qml/Stage/SpreadMaths.qmlnew file+164

This diff is too big to show here.

qml/Stage/Stage.qml+31−144

This diff is too big to show here.

qml/Stage/StageMaths.qml+2−5

This diff is too big to show here.

qml/Stage/TabletStage.qmlnew file+1201

This diff is too big to show here.

qml/Stage/TransformedSpreadDelegate.qmlnew file+391

This diff is too big to show here.

qml/Stage/TransformedTabletSpreadDelegate.qmlnew file+437

This diff is too big to show here.

qml/Stage/WindowDecoration.qml+6−5

This diff is too big to show here.

qml/Stage/WindowedFullscreenPolicy.qml+1−1

This diff is too big to show here.

qml/Tutorial/Tutorial.qml−1

This diff is too big to show here.

qml/Tutorial/TutorialContent.qml+42−61

This diff is too big to show here.

qml/Tutorial/TutorialLeft.qml+1−1

This diff is too big to show here.

qml/Tutorial/TutorialLeftLong.qml+1−1

This diff is too big to show here.

qml/Tutorial/TutorialRight.qml+3−2

This diff is too big to show here.

qml/Tutorial/TutorialTop.qml+2−2

This diff is too big to show here.

qml/Wizard/Pages/10-welcome.qml−1

This diff is too big to show here.

qml/Wizard/Pages/30-wifi.qml+6−12

This diff is too big to show here.

qml/Wizard/Pages/50-timezone.qml+11−9

This diff is too big to show here.

qml/Wizard/Pages/76-app-update.qmlnew file+241

This diff is too big to show here.

qml/Wizard/Pages/ClickUpdateDelegate.qmlnew file+26

This diff is too big to show here.

qml/Wizard/Pages/DownloadHandler.qmlnew file+204

This diff is too big to show here.

qml/Wizard/Pages/GlobalUpdateControls.qmlnew file+138

This diff is too big to show here.

qml/Wizard/Pages/UpdateDelegate.qmlnew file+389

This diff is too big to show here.

qml/Wizard/Pages/here-terms.qmlnew file+126

This diff is too big to show here.

src/ApplicationArguments.h−5

This diff is too big to show here.

src/CMakeLists.txt+4−5

This diff is too big to show here.

src/Dash/CMakeLists.txtnew file+29

This diff is too big to show here.

src/Dash/main.cppnew file+146

This diff is too big to show here.

src/ShellApplication.cpp+4−14

This diff is too big to show here.

src/ShellApplication.h+3−1

This diff is too big to show here.

src/libunity8-private/CMakeLists.txt+1−1

This diff is too big to show here.

src/main.cpp+1−9

This diff is too big to show here.

tests/CMakeLists.txt+2−9

This diff is too big to show here.

tests/autopilot/unity8/dash.pynew file+247

This diff is too big to show here.

tests/autopilot/unity8/shell/fixture_setup.py+27−1

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_helpers.py+74

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_rotation.py+3−3

This diff is too big to show here.

tests/copyright/check_copyright.sh−2

This diff is too big to show here.

tests/data/unity/backgrounds/20x30.pngdeleted

Binary file not shown.

tests/data/unity/backgrounds/black.pngdeleted

Binary file not shown.

tests/mocks/AccountsService/AccountsService.cpp+36

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.h+20

This diff is too big to show here.

tests/mocks/AccountsService/CMakeLists.txt+2−1

This diff is too big to show here.

tests/mocks/Biometryd/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/GSettings.1.0/CMakeLists.txt+2−1

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.cpp+35−19

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.h+15−8

This diff is too big to show here.

tests/mocks/LightDMController/CMakeLists.txt+2−1

This diff is too big to show here.

tests/mocks/Lights/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Powerd/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/QMenuModel/CMakeLists.txt+2−1

This diff is too big to show here.

tests/mocks/QtMultimedia/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/SessionBroadcast/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/UInput/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/networking-status.cpp+1−7

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/networking-status.h+3−5

This diff is too big to show here.

tests/mocks/Ubuntu/DownloadDaemonListener/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/CMakeLists.txt−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/Update/CMakeLists.txtdeleted−1

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Update/qmldirdeleted−2

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.cpp+4−7

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.h+6−2

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.cpp+1−14

This diff is too big to show here.

tests/mocks/Unity/Application/CMakeLists.txt+2−2

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurface.h−1

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.cpp+2−2

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.h+1−1

This diff is too big to show here.

tests/mocks/Unity/CMakeLists.txt+72

This diff is too big to show here.

tests/mocks/Unity/Connectivity/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/CMakeLists.txtnew file+18

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/dashcommunicator.cppnew file+42

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/dashcommunicator.hnew file+39

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/dashcommunicatorservice.cppnew file+46

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/dashcommunicatorservice.hnew file+41

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/plugin.cppnew file+31

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/plugin.hnew file+34

This diff is too big to show here.

tests/mocks/Unity/DashCommunicator/qmldirnew file+3

This diff is too big to show here.

tests/mocks/Unity/Indicators/CMakeLists.txt+2−1

This diff is too big to show here.

tests/mocks/Unity/Indicators/IndicatorsModel.qml+12−30

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeindicatorsmodeldata.js+5−6

This diff is too big to show here.

tests/mocks/Unity/InputInfo/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Unity/Launcher/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockAppDrawerModel.cpp+2−26

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockAppDrawerModel.h−11

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherModel.cpp+1−1

This diff is too big to show here.

tests/mocks/Unity/Notifications/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Unity/Screens/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/Unity/fake_categories.cppnew file+165

This diff is too big to show here.

tests/mocks/Unity/fake_categories.hnew file+54

This diff is too big to show here.

tests/mocks/Unity/fake_expandablefilterwidget.cppnew file+53

This diff is too big to show here.

tests/mocks/Unity/fake_expandablefilterwidget.hnew file+48

This diff is too big to show here.

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

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.cppnew file+123

This diff is too big to show here.

tests/mocks/Unity/fake_navigation.hnew file+61

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/fake_previewmodel.cppnew file+103

This diff is too big to show here.

tests/mocks/Unity/fake_previewmodel.hnew file+58

This diff is too big to show here.

tests/mocks/Unity/fake_previewwidgetmodel.cppnew file+97

This diff is too big to show here.

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

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_resultsmodel.cppnew file+92

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Unity/fake_scope.cppnew file+372

This diff is too big to show here.

tests/mocks/Unity/fake_scope.hnew file+128

This diff is too big to show here.

tests/mocks/Unity/fake_scopes.cppnew file+286

This diff is too big to show here.

tests/mocks/Unity/fake_scopes.hnew file+83

This diff is too big to show here.

tests/mocks/Unity/fake_scopesoverview.cppnew file+340

This diff is too big to show here.

tests/mocks/Unity/fake_scopesoverview.hnew file+119

This diff is too big to show here.

tests/mocks/Unity/fake_settingsmodel.cppnew file+95

This diff is too big to show here.

tests/mocks/Unity/fake_settingsmodel.hnew file+54

This diff is too big to show here.

tests/mocks/Unity/fake_unity_plugin.cppnew file+62

This diff is too big to show here.

tests/mocks/Unity/fake_unity_plugin.hnew file+34

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/plugins/Unity/Launcher/xdgwatcher.h → tests/mocks/Unity/fake_valueslidervalues.hrenamed+13−16

This diff is too big to show here.

tests/mocks/Unity/qmldirnew file+3

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Wizard/CMakeLists.txt+2−2

This diff is too big to show here.

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

This diff is too big to show here.

tests/mocks/Wizard/MockSystem.h+1−11

This diff is too big to show here.

tests/mocks/Wizard/mockplugin.cpp−2

This diff is too big to show here.

tests/mocks/liblightdm/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/liblightdm/demo/CMakeLists.txt+1−1

This diff is too big to show here.

tests/mocks/libusermetrics/CMakeLists.txt+1−1

This diff is too big to show here.

tests/plugins/AccountsService/CMakeLists.txt+2−2

This diff is too big to show here.

tests/plugins/AccountsService/PropertiesServer.cpp+1−1

This diff is too big to show here.

tests/plugins/AccountsService/client.cpp+34−6

This diff is too big to show here.

tests/plugins/CMakeLists.txt+3−1

This diff is too big to show here.

tests/plugins/Dash/CMakeLists.txtnew file+104

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.resnew file+82

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreator/1.tstnew file+4

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreator/12.resnew file+108

This diff is too big to show here.

tests/plugins/Dash/cardcreator/12.res.cardcreatornew file+95

This diff is too big to show here.

tests/plugins/Dash/cardcreator/12.tstnew file+4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.resnew file+128

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreator/2.tstnew file+4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.resnew file+90

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.resnew file+111

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.tstnew file+4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.resnew file+102

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.tstnew file+4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.resnew file+127

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.tstnew file+4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.resnew file+141

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.tstnew file+4

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.resnew file+109

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreator/8.tstnew file+4

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+109

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.cppnew file+126

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.qmlnew file+29

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltest.cppnew file+490

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltest.qmlnew file+44

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltry.cppnew file+91

This diff is too big to show here.

tests/plugins/Dash/horizontaljournaltry.qmlnew file+120

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadersectionexternalmodeltest.cppnew file+246

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadersectiontest.cppnew file+2212

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertest.cppnew file+2038

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertest.qmlnew file+96

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertestsection.qmlnew file+119

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadertestsectionexternalmodel.qmlnew file+76

This diff is too big to show here.

tests/plugins/Dash/organicgridtest.cppnew file+533

This diff is too big to show here.

tests/plugins/Dash/organicgridtest.qmlnew file+44

This diff is too big to show here.

tests/plugins/Dash/organicgridtry.cppnew file+99

This diff is too big to show here.

tests/plugins/Dash/organicgridtry.qmlnew file+114

This diff is too big to show here.

tests/plugins/Dash/tst_CardAttributes.qmlnew file+57

This diff is too big to show here.

tests/plugins/Dash/tst_CroppedImageMinimumSourceSize.qmlnew file+56

This diff is too big to show here.

tests/plugins/Dash/tst_ListViewWithPageHeaderQML.qmlnew file+140

This diff is too big to show here.

tests/plugins/Dash/tst_ScopeStyle.qmlnew file+188

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltest.cppnew file+564

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltest.qmlnew file+45

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltry.cppnew file+91

This diff is too big to show here.

tests/plugins/Dash/verticaljournaltry.qmlnew file+121

This diff is too big to show here.

tests/plugins/GlobalShortcut/CMakeLists.txt+2−1

This diff is too big to show here.

tests/plugins/Greeter/Unity/Launcher/CMakeLists.txt+1−1

This diff is too big to show here.

tests/plugins/ImageCache/CMakeLists.txtnew file+30

This diff is too big to show here.

tests/plugins/ImageCache/graphics/wide.jpgnew file

Binary file not shown.

tests/plugins/ImageCache/test.cppnew file+216

This diff is too big to show here.

tests/plugins/ImageCache/test.qmlnew file+23

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/CMakeLists.txt+6−6

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/dbus.cpp+5−18

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/sessionsmodel.cpp−4

This diff is too big to show here.

tests/plugins/SessionBroadcast/CMakeLists.txt+2−2

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/CMakeLists.txt+2−4

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/GestureTest.cpp+1−10

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+2−11

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.cpp−30

This diff is too big to show here.

tests/plugins/Unity/Indicators/CMakeLists.txt+1−1

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Unity/Launcher/appdrawermodeltest.cpp−15

This diff is too big to show here.

tests/plugins/Unity/Launcher/launchermodeltest.cpp−1

This diff is too big to show here.

tests/plugins/Unity/Launcher/ualwrapper.cpp+2

This diff is too big to show here.

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

This diff is too big to show here.

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

This diff is too big to show here.

tests/plugins/Utils/DeviceConfigParserTest.cpp−3

This diff is too big to show here.

tests/plugins/Utils/ModelTest.cpp+1−2

This diff is too big to show here.

tests/plugins/Utils/WindowStateStorageTest.cpp+1−49

This diff is too big to show here.

tests/plugins/WindowManager/CMakeLists.txt+2−4

This diff is too big to show here.

tests/plugins/WindowManager/UnityApplicationMocks.h−1

This diff is too big to show here.

tests/plugins/WindowManager/tst_TopLevelWindowModel.cpp−63

This diff is too big to show here.

tests/plugins/Wizard/CMakeLists.txt+2−2

This diff is too big to show here.

tests/qmltests/ApplicationMenuDataLoader.qml+1−1

This diff is too big to show here.

tests/qmltests/ApplicationMenus/tst_MenuBar.qml+18−46

This diff is too big to show here.

tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+9−10

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+51−5

This diff is too big to show here.

tests/qmltests/Components/CMakeLists.txt+4−8

This diff is too big to show here.

tests/qmltests/Components/tst_Carousel.qmlnew file+292

This diff is too big to show here.

tests/qmltests/Components/tst_Dialogs.qml+1

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle.cpp+2−19

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Components/tst_Lockscreen.qml+9−11

This diff is too big to show here.

tests/qmltests/Components/tst_MediaServices.qml+4−5

This diff is too big to show here.

tests/qmltests/Components/tst_PhysicalKeysMapper.qml+6−7

This diff is too big to show here.

tests/qmltests/Components/tst_Rating.qml+1−1

This diff is too big to show here.

tests/qmltests/Components/tst_ResponsiveGridView.qmlnew file+157

This diff is too big to show here.

tests/qmltests/Components/tst_ResponsiveVerticalJournal.qmlnew file+183

This diff is too big to show here.

tests/qmltests/Components/tst_SharingPicker.qml+3−3

This diff is too big to show here.

tests/qmltests/Components/tst_Showable.qml−13

This diff is too big to show here.

tests/qmltests/Components/tst_Wallpaper.qmldeleted−118

This diff is too big to show here.

tests/qmltests/Components/tst_WallpaperResolver.qml+18−104

This diff is too big to show here.

tests/qmltests/Dash/CardHelpers.jsnew file+115

This diff is too big to show here.

tests/qmltests/Dash/Filters/tst_FilterExpandableWidget.qmlnew file+99

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+59

This diff is too big to show here.

tests/qmltests/Dash/Previews/MockPreviewWidget.qmlnew file+27

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_Preview.qmlnew file+214

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewActions.qmlnew file+262

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qmlnew file+182

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewComment.qmlnew file+84

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewCommentInput.qmlnew file+113

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewExpandable.qmlnew file+353

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewHeader.qmlnew file+183

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewIconActions.qmlnew file+136

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qmlnew file+147

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewInlineVideo.qmlnew file+155

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_PreviewProgress.qmlnew file+100

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingDisplay.qmlnew file+123

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingDisplayCreationRanges.qmlnew file+131

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingEdit.qmlnew file+87

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qmlnew file+246

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewTable.qmlnew file+147

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewTextSummary.qmlnew file+87

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qmlnew file+61

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qmlnew file+104

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qmlnew file+138

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingBoolean.qmlnew file+62

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingList.qmlnew file+84

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingNumber.qmlnew file+98

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingString.qmlnew file+88

This diff is too big to show here.

tests/qmltests/Dash/ScopeSettings/tst_ScopeSettingsWidgetFactory.qmlnew file+65

This diff is too big to show here.

tests/qmltests/Dash/artwork/avatar@12.pngnew file

Binary file not shown.

tests/qmltests/Dash/artwork/background.pngnew file

Binary file not shown.

tests/qmltests/Dash/artwork/checkers.pngnew file

Binary file not shown.

tests/qmltests/Dash/artwork/emblem.pngnew file

Binary file not shown.

tests/qmltests/Dash/artwork/music-player-design.pngnew file

Binary file not shown.

tests/qmltests/Dash/tst_Card.qmlnew file+682

This diff is too big to show here.

tests/qmltests/Dash/tst_CardBenchmark.qmlnew file+95

This diff is too big to show here.

tests/qmltests/Dash/tst_CardCarousel.qmlnew file+111

This diff is too big to show here.

tests/qmltests/Dash/tst_CardTool.qmlnew file+379

This diff is too big to show here.

tests/qmltests/Dash/tst_Dash.qmlnew file+648

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qmlnew file+730

This diff is too big to show here.

tests/qmltests/Dash/tst_DashPageHeader.qmlnew file+357

This diff is too big to show here.

tests/qmltests/Dash/tst_DashShell.qmlnew file+84

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qmlnew file+706

This diff is too big to show here.

tests/qmltests/Dash/tst_PageHeader/logo-ubuntu-orange.svgnew file+60

This diff is too big to show here.

tests/qmltests/Dash/tst_PreviewView.qmlnew file+122

This diff is too big to show here.

tests/qmltests/Greeter/TestView.qml+1−9

This diff is too big to show here.

tests/qmltests/Greeter/tst_Greeter.qml+24−19

This diff is too big to show here.

tests/qmltests/Greeter/tst_GreeterView.qmldeleted−1366

This diff is too big to show here.

tests/qmltests/Greeter/tst_NarrowView.qmlnew file+566

This diff is too big to show here.

tests/qmltests/Greeter/tst_WideView.qmlnew file+780

This diff is too big to show here.

tests/qmltests/Launcher/tst_Drawer.qml+58−193

This diff is too big to show here.

tests/qmltests/Launcher/tst_Launcher.qml+83−155

This diff is too big to show here.

tests/qmltests/Notifications/tst_Notifications.qml+10−16

This diff is too big to show here.

tests/qmltests/Notifications/tst_OptionToggle.qml+6−12

This diff is too big to show here.

tests/qmltests/Notifications/tst_SwipeToAct.qml+3−10

This diff is too big to show here.

tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+3−3

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_IndicatorMenuItemFactory.qml+79−33

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_IndicatorsLight.qml+8−168

This diff is too big to show here.

tests/qmltests/Panel/PanelUI.qmldeleted−286

This diff is too big to show here.

tests/qmltests/Panel/tst_ActiveCallHint.qml+9−14

This diff is too big to show here.

tests/qmltests/Panel/tst_MenuContent.qml+2−2

This diff is too big to show here.

tests/qmltests/Panel/tst_Panel.qml+240−58

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelItemRow.qml+2−2

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelMenu.qml+22−61

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelMenuPage.qml+1−1

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelSmallScreen.qmldeleted−133

This diff is too big to show here.

tests/qmltests/Stage/ApplicationCheckBox.qml+6−6

This diff is too big to show here.

tests/qmltests/Stage/tst_ApplicationWindow.qml+2−3

This diff is too big to show here.

tests/qmltests/Stage/tst_DesktopStage.qml+4−22

This diff is too big to show here.

tests/qmltests/Stage/tst_PhoneStage.qml+60−87

This diff is too big to show here.

tests/qmltests/Stage/tst_QMLTopLevelWindowModel.qmldeleted−191

This diff is too big to show here.

tests/qmltests/Stage/tst_SpreadDelegate.qmlnew file+423

This diff is too big to show here.

tests/qmltests/Stage/tst_SurfaceContainer.qml+8−9

This diff is too big to show here.

tests/qmltests/Stage/tst_TabletStage.qml+151−112

This diff is too big to show here.

tests/qmltests/Stage/tst_WindowDecoration.qml+3−3

This diff is too big to show here.

tests/qmltests/Stage/tst_WindowResizeArea.qml+3−4

This diff is too big to show here.

tests/qmltests/Tutorial/tst_Tutorial.qml+189−187

This diff is too big to show here.

tests/qmltests/Wizard/tst_Wizard.qml+128−101

This diff is too big to show here.

tests/qmltests/tst_OrientedShell.qml+266−312

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+546−606

This diff is too big to show here.

tests/qmltests/tst_ShellWithPin.qml+79−96

This diff is too big to show here.

tests/uqmlscene/CMakeLists.txt+1−1

This diff is too big to show here.

tests/utils/CMakeLists.txt+1−1

This diff is too big to show here.

tests/utils/modules/Unity/Test/CMakeLists.txt+4−2

This diff is too big to show here.

tests/utils/modules/Unity/Test/MouseTouchEmulationCheckbox.qml+1−1

This diff is too big to show here.

tests/utils/modules/Unity/Test/StageTestCase.qml+18−14

This diff is too big to show here.

tests/utils/modules/Unity/Test/TouchEventSequenceWrapper.cpp+1−10

This diff is too big to show here.

tests/utils/modules/Unity/Test/UnityTestCase.qml+2−2

This diff is too big to show here.

tools/CMakeLists.txt+1

This diff is too big to show here.

tools/indicatorsclient/CMakeLists.txt+1−1

This diff is too big to show here.

tools/menutool/CMakeLists.txt+1−1

This diff is too big to show here.

tools/scopetool/CMakeLists.txtnew file+12

This diff is too big to show here.

tools/scopetool/registry-tracker.cppnew file+146

This diff is too big to show here.

tools/scopetool/registry-tracker.hnew file+49

This diff is too big to show here.

tools/scopetool/scopetool.cppnew file+116

This diff is too big to show here.