Compare commits

..

No commits in common. "master" and "v3.3.2" have entirely different histories.

52 changed files with 459 additions and 1740 deletions

View file

@ -0,0 +1,16 @@
---
name: "New feature"
about: "Use this template if you want to request a feature"
title: "[FEATURE] "
labels:
- enhancement
---
## Feature
### Description
...
### Benefits
...

View file

@ -1,34 +0,0 @@
name: New feature
about: Use this template if you want to request a feature
title: "[FEATURE] "
labels:
- enhancement
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this feature request!
- type: textarea
id: description
attributes:
label: Description
description: Describe the feature.
validations:
required: true
- type: textarea
id: benefits
attributes:
label: Benefits
description: Describe the benefits of this feature.
validations:
required: true
- type: textarea
id: extra
attributes:
label: More informations
description: If you want to share more things, this is here!
validations:
required: false

View file

@ -0,0 +1,32 @@
---
name: "New issue"
about: "Use this template if you have a bug"
title: "[BUG] "
labels:
- bug
---
## Issue
### Environment
* Custom menu version:
* Nextcloud version:
* PHP version:
* Web server (Nginx, Apache2):
* Web browser and version (Firefox 80, Google Chrome 74, etc):
```
Insert your configuration here. You can export the configuration using the admin page.
```
### Steps to reproduce
...
### Observed Results
...
### Expected Results
...

View file

@ -1,69 +0,0 @@
name: New issue
about: Use this template if you have a bug
title: "[Bug] "
labels:
- bug
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: textarea
id: environment
attributes:
label: Environment
value: |
* Custom menu version:
* Nextcloud version:
* PHP version:
* Web server (Nginx, Apache2):
* Web browser and version (Firefox 80, Google Chrome 74, etc):
validations:
required: true
- type: textarea
id: configuration
attributes:
label: Configuration
description: Export the configuration using the admin page and copy/paste here ([documentation](https://deblan.gitnet.page/side_menu_doc/tips/#export-the-configuration)).
value: |
```
{
...
}
```
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to reproduce
description: How reproduce the bug?
validations:
required: false
- type: textarea
id: resuts
attributes:
label: Observed Results
description: What happened?
validations:
required: false
- type: textarea
id: expected
attributes:
label: Expected Results
description: What should happen?
validations:
required: false
- type: textarea
id: extra
attributes:
label: More informations
description: If you want to share more things, this is here!
validations:
required: false

View file

@ -1,30 +0,0 @@
name: New question
about: Use this template when you don't know how to do something
title: "[Question] "
labels:
- question
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill information.
- type: textarea
id: environment
attributes:
label: Environment
value: |
* Custom menu version:
* Nextcloud version:
* PHP version:
* Web server (Nginx, Apache2):
* Web browser and version (Firefox 80, Google Chrome 74, etc):
validations:
required: true
- type: textarea
id: question
attributes:
label: Question
validations:
required: true

View file

@ -1,8 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: Documentation
url: https://deblan.gitnet.page/side_menu_doc/
about: Official documentation web site
- name: Ask a question in our Matrix room
about: If you prefer a chat-like conversation or in need for quick help, this might be an alternative to opening an issue.
url: https://matrix.to/#/#custommenu:neutralnetwork.org

42
.woodpecker.yml Normal file
View file

@ -0,0 +1,42 @@
pipeline:
dependencies:
image: gitnet.fr/deblan/devenv
commands:
- make dep
when:
event: [tag, push, pull_request]
branch: [master, develop, feature/*]
build:
image: gitnet.fr/deblan/devenv
commands:
- make build
when:
event: [push, pull_request]
package:
image: gitnet.fr/deblan/devenv
volumes:
- /var/www/html/artifacts:/var/www/html/artifacts
secrets: [app_certificate]
commands:
- mkdir -p "$HOME/.nextcloud/certificates"
- echo "$APP_CERTIFICATE" > "$HOME/.nextcloud/certificates/side_menu.key"
- export VERSION=$(grep "<version>" appinfo/info.xml | grep -o "[0-9]*\.[0-9]*\.[0-9]*" --color=never)
- export RELEASE_DIRECTORY="/var/www/html/artifacts/deblan/side_menu"
- make release
when:
event: [tag]
release:
image: plugins/gitea-release
volumes:
- /var/www/html/artifacts:/var/www/html/artifacts
settings:
api_key:
from_secret: gitnet_api_key
base_url: https://gitnet.fr
note: ${CI_COMMIT_MESSAGE}
files: /var/www/html/artifacts/deblan/side_menu/${CI_COMMIT_TAG/v//}/*
when:
event: [tag]

View file

@ -1,28 +0,0 @@
variables:
volumes: &volumes
- /data/${CI_REPO}:/builds
when:
event: [tag, push, pull_request, manual]
branch: [master, develop, feature/*, fix/*, bugfix/*, translations]
steps:
"Install dependencies":
image: node:16
pull: true
commands:
- npm i
"Build JS":
image: node:16
commands:
- npm run build
"Build translations":
image: deblan/php:8.3
commands:
- php bin/generate_l10n.php
"Build cache":
image: gitnet.fr/deblan/woodpecker-cache
volumes: *volumes

View file

@ -1,61 +0,0 @@
variables:
volumes: &volumes
- /data/${CI_REPO}:/builds
- /var/www/html/artifacts:/var/www/html/artifacts
depends_on:
- build
when:
event: [tag]
steps:
"Verify tag and app version":
image: alpine
commands:
- TAG=${CI_COMMIT_TAG/v//}
- grep "<version>$TAG</version>" appinfo/info.xml
"Create signature":
image: nextcloud:25
secrets: [app_certificate, app_public_certificate]
volumes: *volumes
environment:
SQLITE_DATABASE: /var/www/data/data.db
NEXTCLOUD_ADMIN_USER: admin
NEXTCLOUD_ADMIN_PASSWORD: admin
commands:
- cd "/builds/$CI_COMMIT_SHA"
- echo "$APP_CERTIFICATE" > "/tmp/side_menu.key"
- echo "$APP_PUBLIC_CERTIFICATE" > "/tmp/side_menu.crt"
- mkdir /tmp/app
- cp -r README.md CHANGELOG.md appinfo css lib img l10n js src templates screenshots vendor /tmp/app
- /usr/src/nextcloud/occ integrity:sign-app
--privateKey=/tmp/side_menu.key
--certificate=/tmp/side_menu.crt
--path=/tmp/app
- mv /tmp/app/appinfo/signature.json appinfo/
"Create package":
image: deblan/php:8.3
volumes: *volumes
secrets: [app_certificate]
commands:
- cd "/builds/$CI_COMMIT_SHA"
- apt-get update
- apt-get install -y zip make
- mkdir -p "$HOME/.nextcloud/certificates"
- echo "$APP_CERTIFICATE" > "$HOME/.nextcloud/certificates/side_menu.key"
- export VERSION=$(grep "<version>" appinfo/info.xml | grep -o "[0-9]*\.[0-9]*\.[0-9]*" --color=never)
- export RELEASE_DIRECTORY="/var/www/html/artifacts/deblan/side_menu"
- make release
"Push release":
image: plugins/gitea-release
volumes: *volumes
settings:
api_key:
from_secret: gitnet_api_key
base_url: https://gitnet.fr
note: ${CI_COMMIT_MESSAGE}
files: /var/www/html/artifacts/deblan/side_menu/${CI_COMMIT_TAG/v//}/*

View file

@ -1,17 +0,0 @@
variables:
volumes: &volumes
- /data/${CI_REPO}:/builds
depends_on:
- build
skip_clone: true
steps:
"Check dependencies":
image: gitnet.fr/deblan/osv-detector:v0.10
volumes: *volumes
commands:
- cd "/builds/$CI_COMMIT_SHA"
- osv-detector package-lock.json
failure: ignore

View file

@ -1,150 +1,5 @@
## [Unreleased] ## [Unreleased]
## 3.12.0
### Added
* add compatibility with NC29
## 3.11.8
### Fixed
* move the logo inside #nextcloud element (fix #278 #239) [NC26]
## 3.11.7
### Added
* update translations
* update ci steps names
### Fixed
* add accessibility to open and close buttons (#311)
* fully apply Nextcloud AppMenu.vue updated (#326)
* add missing label on the 'save' button in personal settings (fix #318)
### Changed
* upgrade axios
* upgrade css-loader
## 3.11.6
### Fixed
* add --background-invert-if-bright in top menu (fix #326)
## 3.11.5
### Fixed
* add missing label on buttons for accessiblity (fix #311)
## 3.11.4
### Fixed
* add label on buttons for accessiblity (fix #311)
## 3.11.3
### Fixed
* fix menu icon in decks, collectives and other apps (#302)
## 3.11.2
### Fixed
* add default translations for Slovak - fix #298
## 3.11.1
### Added
* add Portuguese (Brazil) translations - Thanks to igorfreire
### Fixed
* add width to .side-menu-categories for side menu with categories display - fix #294
## 3.11.0
### Added
* add a search component in menus - fix #282
### Fixed
* remove the label of the link to personal settings - fix #283
## 3.10.3
### Fixed
* change the way to load nextcloud components (NcActionLink/NcActions) - fix #274
* update @nexcloud/* packages
## 3.10.2
### Fixed
* add missing properties
## 3.10.1
### Fixed
* fix #269: use php7 syntax
## 3.10.0
### Added
* add compatibility with NC28
### Fixed
* fix NC28 error: remove deprecated method `OC_App::getNavigation()`
## 3.9.1
### Fixed
* fix fixed menu on dashboard (#262)
## 3.9.0
### Added
* add compatibility with NC27
### Fixed
* fix app redirect (#261)
## 3.8.0
### Added
* add option to show hovered label only on top menu (fix #253)
## 3.7.4
### Fixed
* fix Integrity failed (#247)
## 3.7.3
### Fixed
* fix #244: use app href for redirection
### Added
* add signature on build
## 3.7.2
### Added
* update pipeline conditions allowing `fix/*`
### Fixed
* fix #233: load configuration and then retrieve apps in default side menu display
## 3.7.1
### Fixed
* fix build process (#230)
## 3.7.0
### Added
* add translations (thanks to AHOHNMYC)
* add compatibility with NC26
## 3.6.0
### Added
* add hidden apps compatible with default menu (#219)
## 3.5.2
### Fixed
* add check if menu exists before adding event listeners (#210)
## 3.5.1
### Added
* add translations (thanks to p-bo adn gallegonovato)
### Fixed
* fix #189: sorting not applied on mobile
## 3.5.0
### Added
* add dependency check (ci)
* add code quality check (ci)
* add translations (thanks to gallegonovato)
* add option to disable the display labels in the top menu (#194)
### Fixed
* fix missing img alt (settings image)
* fix code quality alerts
## 3.4.1
### Added
* add translations (thanks to zonorti, jorisvandijk, jak2k)
### Fixed
* fix #183: hide custom categories list when empty (admin page)
## 3.4.0
### Added
* add translations (thanks to Pavelb, nier, Timur, p-bo)
* add possibility to define Custom Menu as default app and redirect to the first top menu app (#177)
## 3.3.2 ## 3.3.2
### Fixed ### Fixed
* fix #173: reduce the height of categories list * fix #173: reduce the height of categories list

View file

@ -9,7 +9,7 @@ dep:
npm link @nextcloud/vue || sudo npm link @nextcloud/vue npm link @nextcloud/vue || sudo npm link @nextcloud/vue
.ONESHELL: .ONESHELL:
release: release: build translations
if [ -z "$$VERSION" ]; then if [ -z "$$VERSION" ]; then
echo "VERSION required" echo "VERSION required"
exit 1 exit 1
@ -34,4 +34,4 @@ translations:
.ONESHELL: .ONESHELL:
run-code-quality-analysis: run-code-quality-analysis:
export SONAR_TOKEN="$$SONAR_TOKEN_DEBLAN_SIDE_MENU" export SONAR_TOKEN="$$SONAR_TOKEN_DEBLAN_SIDE_MENU"
sonar-scanner -Dsonar.projectKey=deblan-side_menu -Dsonar.sources=. -Dsonar.host.url=$$SONAR_SERVER -Dsonar.branch.name=$$(git branch --show-current) sonar-scanner -Dsonar.projectKey=deblan-side_menu -Dsonar.sources=. -Dsonar.host.url=https://cq.gitnet.fr

View file

@ -3,7 +3,6 @@
[![Build Status](https://ci.gitnet.fr/api/badges/deblan/side_menu/status.svg)](https://ci.gitnet.fr/deblan/side_menu) [![Build Status](https://ci.gitnet.fr/api/badges/deblan/side_menu/status.svg)](https://ci.gitnet.fr/deblan/side_menu)
[![Translations](https://translate.codeberg.org/widgets/custom-menu/-/application/svg-badge.svg)](https://translate.codeberg.org/engage/custom-menu/) [![Translations](https://translate.codeberg.org/widgets/custom-menu/-/application/svg-badge.svg)](https://translate.codeberg.org/engage/custom-menu/)
![Downloads](https://img.shields.io/badge/dynamic/json?color=brightgreen&label=downloads&query=%24.K_downloads&suffix=K&url=https%3A%2F%2Fapi-side-menu.deblan.org%2Fdownloads.php)
Allows you to modify the position of the main menu by creating a panel on the left of the interface or with a big menu on the top. Allows you to modify the position of the main menu by creating a panel on the left of the interface or with a big menu on the top.
You can also add and sort custom categories, define apps that must be displayed in the top menu, etc. Fully customisable. You can also add and sort custom categories, define apps that must be displayed in the top menu, etc. Fully customisable.
@ -19,12 +18,10 @@ You can customize colors depending of the theme (Dark theme and Breeze Dark).
You like this app and you want to support me? ☕ [Buy me a coffee](https://www.buymeacoffee.com/deblan) or [Donate with liberapay](https://liberapay.com/deblan) You like this app and you want to support me? ☕ [Buy me a coffee](https://www.buymeacoffee.com/deblan) or [Donate with liberapay](https://liberapay.com/deblan)
## [📘 Read the documentation](https://deblan.gitnet.page/side_menu_doc/)
Requirements Requirements
------------ ------------
* PHP >= 8.0 * PHP >= 7.4
* App `theming` enabled * App `theming` enabled
Installation and upgrade Installation and upgrade
@ -50,16 +47,6 @@ Users can disable the menu using the page of personal settings.
Use the shortcut `Ctrl`+`o` to open and to hide the side menu. Use `tab` to navigate. Use the shortcut `Ctrl`+`o` to open and to hide the side menu. Use `tab` to navigate.
### Use first top menu app as default app
You can easily let Custom Menu redirect to the first app in the top menu by changing the following parameter in your `config/config.php`:
```
'defaultapp' => 'side_menu',
```
If the top menu is empty then it redirects to files.
How to contribute? How to contribute?
------------------ ------------------

View file

@ -17,7 +17,7 @@ You can report a bug or request a feature by opening an issue.
Requirements: Requirements:
* PHP >= 8.0 * PHP >= 7.4
* App `theming` enabled * App `theming` enabled
If you like this application and if you want to support the development: If you like this application and if you want to support the development:
@ -32,12 +32,12 @@ Notice
Because I believe in a free and decentralized Internet, [Gitnet](https://gitnet.fr) is **self-hosted at home**. Because I believe in a free and decentralized Internet, [Gitnet](https://gitnet.fr) is **self-hosted at home**.
In case of downtime, you can download **Custom Menu** from [here](https://kim.deblan.fr/~side_menu/). In case of downtime, you can download **Custom Menu** from [here](https://kim.deblan.fr/~side_menu/).
]]></description> ]]></description>
<version>3.11.8</version> <version>3.3.2</version>
<licence>agpl</licence> <licence>agpl</licence>
<author mail="contact@deblan.fr" homepage="https://www.deblan.io/">Simon Vieille</author> <author mail="contact@deblan.fr" homepage="https://www.deblan.io/">Simon Vieille</author>
<namespace>SideMenu</namespace> <namespace>SideMenu</namespace>
<documentation> <documentation>
<admin>https://deblan.gitnet.page/side_menu_doc/</admin> <admin>https://gitnet.fr/deblan/side_menu/src/branch/master/README.md</admin>
<developer>https://gitnet.fr/deblan/side_menu/src/branch/master/README.md</developer> <developer>https://gitnet.fr/deblan/side_menu/src/branch/master/README.md</developer>
</documentation> </documentation>
<category>customization</category> <category>customization</category>
@ -54,7 +54,7 @@ In case of downtime, you can download **Custom Menu** from [here](https://kim.de
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_big_menu.png</screenshot> <screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_big_menu.png</screenshot>
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_default_menu.png</screenshot> <screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_default_menu.png</screenshot>
<dependencies> <dependencies>
<nextcloud min-version="25" max-version="29"/> <nextcloud min-version="25" max-version="25"/>
<php min-version="7.4"/> <php min-version="7.4"/>
</dependencies> </dependencies>
<settings> <settings>

View file

@ -19,7 +19,6 @@
return [ return [
'routes' => [ 'routes' => [
['name' => 'App#index', 'url' => '/', 'verb' => 'GET'],
['name' => 'Css#stylesheet', 'url' => '/css/stylesheet', 'verb' => 'GET'], ['name' => 'Css#stylesheet', 'url' => '/css/stylesheet', 'verb' => 'GET'],
['name' => 'Js#script', 'url' => '/js/script', 'verb' => 'GET'], ['name' => 'Js#script', 'url' => '/js/script', 'verb' => 'GET'],
['name' => 'Js#config', 'url' => '/js/config', 'verb' => 'GET'], ['name' => 'Js#config', 'url' => '/js/config', 'verb' => 'GET'],

View file

@ -137,10 +137,6 @@
padding-right: 20px; padding-right: 20px;
} }
.side-menu-setting-label--top {
vertical-align: top;
}
.side-menu-setting-form { .side-menu-setting-form {
display: table-cell; display: table-cell;
min-width: 300px; min-width: 300px;
@ -186,7 +182,7 @@
} }
.badge { .badge {
border-width: 1px; border-size: 1px;
padding: 2px 8px; padding: 2px 8px;
margin-right: 2px; margin-right: 2px;
margin-bottom: 5px; margin-bottom: 5px;

View file

@ -47,7 +47,7 @@
margin-top: 2px; margin-top: 2px;
float: right; float: right;
line-height: 34px; line-height: 34px;
height: 42px; height: 28px;
display: none; display: none;
} }
@ -83,12 +83,6 @@
padding-left: 12px !important; padding-left: 12px !important;
margin-left: 5px !important; margin-left: 5px !important;
margin-left: 3px !important; margin-left: 3px !important;
overflow: hidden;
}
.side-menu-opener span {
position: relative;
left: 50px;
} }
.side-menu-opener:active, .side-menu-opener:focus { .side-menu-opener:active, .side-menu-opener:focus {
@ -161,7 +155,7 @@
} }
#side-menu.hide-opener .side-menu-logo { #side-menu.hide-opener .side-menu-logo {
margin-top: 10px; margin-top: 20px;
} }
#side-menu-loader { #side-menu-loader {
@ -207,6 +201,7 @@
max-height: calc(100vh - 55px); max-height: calc(100vh - 55px);
overflow: auto; overflow: auto;
position: relative; position: relative;
top: 5px;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
@ -228,7 +223,7 @@
} }
.side-menu-loader svg { .side-menu-loader svg {
width: 45px; width: 38px;
margin: auto; margin: auto;
stroke: var(--side-menu-text-color, #fff); stroke: var(--side-menu-text-color, #fff);
} }
@ -240,12 +235,11 @@
.side-menu-always-displayed body { .side-menu-always-displayed body {
width: calc(100% - 50px) !important; width: calc(100% - 50px) !important;
position: absolute;
left: 50px;
} }
.side-menu-always-displayed #header { .side-menu-always-displayed body {
position: absolute !important; position: absolute;
left: 50px;
} }
.side-menu-always-displayed #side-menu { .side-menu-always-displayed #side-menu {
@ -253,14 +247,9 @@
} }
.side-menu-always-displayed .side-menu-apps-list { .side-menu-always-displayed .side-menu-apps-list {
height: 100vh;
top: 0;
overflow: hidden;
}
.side-menu-always-displayed .side-menu-apps-list--with-settings {
height: calc(100vh - 49px); height: calc(100vh - 49px);
top: 49px; top: 49px;
overflow: hidden;
} }
.side-menu-always-displayed .side-menu-apps-list:hover { .side-menu-always-displayed .side-menu-apps-list:hover {
@ -294,7 +283,7 @@
} }
.side-menu-always-displayed .app-navigation--close { .side-menu-always-displayed .app-navigation--close {
transform: translateX(calc(-100% + 50px)); transform: translateX(calc(-100% + 50px)) !important;
} }
#side-menu.side-menu-with-categories { #side-menu.side-menu-with-categories {
@ -305,7 +294,6 @@
.side-menu-with-categories .side-menu-categories { .side-menu-with-categories .side-menu-categories {
display: block; display: block;
padding: 0; padding: 0;
width: 100%;
} }
.side-menu-with-categories .side-menu-category { .side-menu-with-categories .side-menu-category {
@ -324,35 +312,12 @@
visibility: visible; visibility: visible;
} }
.side-menu-search {
float: right;
}
.side-menu-search input {
background: none;
border: 0;
border-radius: 0;
color: var(--side-menu-text-color);
}
.side-menu-search input::placeholder {
color: var(--side-menu-text-color);
}
.side-menu-always-displayed .side-menu-search {
display: none;
}
@media screen and (max-width: 1024px) { @media screen and (max-width: 1024px) {
#side-menu.side-menu-big { #side-menu.side-menu-big {
max-width: 290px; max-width: 290px;
height: 100vh; height: 100vh;
} }
#side-menu.hide-opener.side-menu-big .side-menu-search {
float: none;
}
.side-menu-categories { .side-menu-categories {
display: block; display: block;
padding: 0; padding: 0;

View file

@ -1,110 +0,0 @@
<?php
/**
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCA\SideMenu\Controller;
use OC;
use OCA\SideMenu\Service\AppRepository;
use OCA\SideMenu\Service\ConfigProxy;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUserSession;
class AppController extends Controller
{
/**
* @var ConfigProxy
*/
protected $config;
/**
* @var AppRepository
*/
protected $appRepository;
public function __construct(
string $appName,
IRequest $request,
AppRepository $appRepository,
IURLGenerator $urlGenerator,
ConfigProxy $config
) {
parent::__construct($appName, $request);
$this->appRepository = $appRepository;
$this->urlGenerator = $urlGenerator;
$this->config = $config;
}
/**
* @NoAdminRequired
* @NoCSRFRequired
*/
public function index(): RedirectResponse
{
$user = OC::$server[IUserSession::class]->getUser();
$topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]');
$hiddenApps = $this->config->getAppValueArray('big-menu-hidden-apps', '[]');
$isForced = $this->config->getAppValueBool('force', '0');
$userTopMenuApps = $this->config->getUserValueArray($user, 'top-menu-apps', '[]');
$apps = $this->appRepository->getOrderedApps($user);
if (!$isForced && !empty($userTopMenuApps)) {
$topMenuApps = $userTopMenuApps;
}
foreach ($apps as $app) {
$inTopMenuApps = in_array($app['id'], $topMenuApps);
$inHiddenApps = in_array($app['id'], $hiddenApps);
if (!$inTopMenuApps && $inHiddenApps) {
continue;
}
return $this->redirectToApp($app, true);
}
return $this->redirectToApp('files');
}
protected function redirectToApp($app, bool $isHref = false): RedirectResponse
{
if (!$isHref) {
$isIgnoreFrontController = true === OC::$server->getConfig()->getSystemValue(
'htaccess.IgnoreFrontController',
false
);
$isFrontControllerActive = 'true' === getenv('front_controller_active');
if ($isIgnoreFrontController || $isFrontControllerActive) {
$path = '/apps/%s/';
} else {
$path = '/index.php/apps/%s/';
}
$url = $this->urlGenerator->getAbsoluteURL(sprintf($path, $app));
} else {
$url = $app['href'];
}
return new RedirectResponse($url);
}
}

View file

@ -21,14 +21,14 @@ namespace OCA\SideMenu\Controller;
use OC; use OC;
use OC\User\User; use OC\User\User;
use OCA\SideMenu\AppInfo\Application; use OCA\SideMenu\AppInfo\Application;
use OCA\SideMenu\Service\Color;
use OCA\SideMenu\Service\ConfigProxy; use OCA\SideMenu\Service\ConfigProxy;
use OCA\Theming\ThemingDefaults;
use OCP\AppFramework\Controller; use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\TemplateResponse;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession; use OCP\IUserSession;
use OCA\Theming\ThemingDefaults;
use OCA\SideMenu\Service\Color;
class CssController extends Controller class CssController extends Controller
{ {
@ -58,7 +58,8 @@ class CssController extends Controller
ConfigProxy $config, ConfigProxy $config,
ThemingDefaults $theming, ThemingDefaults $theming,
Color $color Color $color
) { )
{
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->user = OC::$server[IUserSession::class]->getUser(); $this->user = OC::$server[IUserSession::class]->getUser();
@ -104,18 +105,16 @@ class CssController extends Controller
$topSideMenuApps = $userTopSideMenuApps; $topSideMenuApps = $userTopSideMenuApps;
} }
$isDarkThemeUserEnabled = 'dark' === $this->config->getUserValue($this->user, 'theme', '', 'accessibility'); $isDarkThemeUserEnabled = $this->config->getUserValue($this->user, 'theme', '', 'accessibility') === 'dark';
$isBreezeDarkUserEnabled = $this->config->getUserValue($this->user, 'theme_enabled', '', 'breezedark'); $isBreezeDarkUserEnabled = $this->config->getUserValue($this->user, 'theme_enabled', '', 'breezedark');
$isBreezeDarkUserEnabled = '1' === $isBreezeDarkUserEnabled || $isBreezeDarkUserEnabled = $isBreezeDarkUserEnabled === '1' || ($isBreezeDarkGlobalEnabled && $isBreezeDarkUserEnabled === '');
($isBreezeDarkGlobalEnabled && '' === $isBreezeDarkUserEnabled);
} else { } else {
$isDarkThemeUserEnabled = false; $isDarkThemeUserEnabled = false;
$isBreezeDarkUserEnabled = false; $isBreezeDarkUserEnabled = false;
} }
$isDarkMode = ($isAccessibilityAppEnabled && $isDarkThemeUserEnabled) || $isDarkMode = ($isAccessibilityAppEnabled && $isDarkThemeUserEnabled) || ($isBreezeDarkAppEnabled && $isBreezeDarkUserEnabled);
($isBreezeDarkAppEnabled && $isBreezeDarkUserEnabled);
$primaryColor = $this->theming->getColorPrimary(); $primaryColor = $this->theming->getColorPrimary();
$lightenPrimaryColor = $this->color->adjustBrightness($primaryColor, 0.2); $lightenPrimaryColor = $this->color->adjustBrightness($primaryColor, 0.2);
@ -126,33 +125,25 @@ class CssController extends Controller
if ($isDarkMode) { if ($isDarkMode) {
$backgroundColor = $this->config->getAppValue('dark-mode-background-color', $darkenPrimaryColor); $backgroundColor = $this->config->getAppValue('dark-mode-background-color', $darkenPrimaryColor);
$backgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkenPrimaryColor); $backgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkenPrimaryColor);
$currentAppBackgroundColor = $this->config->getAppValue( $currentAppBackgroundColor = $this->config->getAppValue('dark-mode-current-app-background-color', $darkenPrimaryColor2);
'dark-mode-current-app-background-color',
$darkenPrimaryColor2
);
$loaderColor = $this->config->getAppValue('dark-mode-loader-color', $lightenPrimaryColor); $loaderColor = $this->config->getAppValue('dark-mode-loader-color', $lightenPrimaryColor);
$textColor = $this->config->getAppValue('dark-mode-text-color', $textColor); $textColor = $this->config->getAppValue('dark-mode-text-color', $textColor);
$iconInvertFilter = abs($this->config->getAppValueInt('dark-mode-icon-invert-filter', '0')).'%'; $iconInvertFilter = abs($this->config->getAppValueInt('dark-mode-icon-invert-filter', '0')).'%';
$iconOpacity = abs($this->config->getAppValueInt('dark-mode-icon-opacity', '100') / 100); $iconOpacity = abs($this->config->getAppValueInt('dark-mode-icon-opacity', '100') / 100);
$opener = $this->config->getAppValue('dark-mode-opener', 'side-menu-opener'); $opener = $this->config->getAppValue('dark-mode-opener', 'side-menu-opener');
$opacity = $this->config->getAppValueInt('dark-mode-background-color-opacity', '100'); $backgroundOpacity = dechex($this->config->getAppValueInt('dark-mode-background-color-opacity', '100') * 255 / 100);
$backgroundOpacity = dechex($opacity * 255 / 100);
} else { } else {
$backgroundColor = $this->config->getAppValue('background-color', $darkenPrimaryColor); $backgroundColor = $this->config->getAppValue('background-color', $darkenPrimaryColor);
$backgroundColorTo = $this->config->getAppValue('background-color-to', $darkenPrimaryColor); $backgroundColorTo = $this->config->getAppValue('background-color-to', $darkenPrimaryColor);
$currentAppBackgroundColor = $this->config->getAppValue( $currentAppBackgroundColor = $this->config->getAppValue('current-app-background-color', $darkenPrimaryColor2);
'current-app-background-color',
$darkenPrimaryColor2
);
$loaderColor = $this->config->getAppValue('loader-color', $lightenPrimaryColor); $loaderColor = $this->config->getAppValue('loader-color', $lightenPrimaryColor);
$textColor = $this->config->getAppValue('text-color', $textColor); $textColor = $this->config->getAppValue('text-color', $textColor);
$iconInvertFilter = abs($this->config->getAppValueInt('icon-invert-filter', '0')).'%'; $iconInvertFilter = abs($this->config->getAppValueInt('icon-invert-filter', '0')).'%';
$iconOpacity = abs($this->config->getAppValueInt('icon-opacity', '100') / 100); $iconOpacity = abs($this->config->getAppValueInt('icon-opacity', '100') / 100);
$opener = $this->config->getAppValue('opener', 'side-menu-opener'); $opener = $this->config->getAppValue('opener', 'side-menu-opener');
$opacity = $this->config->getAppValueInt('background-color-opacity', '100'); $backgroundOpacity = dechex($this->config->getAppValueInt('background-color-opacity', '100') * 255 / 100);
$backgroundOpacity = dechex($opacity * 255 / 100);
} }
$backgroundColor .= $backgroundOpacity; $backgroundColor .= $backgroundOpacity;

View file

@ -95,6 +95,7 @@ class JsController extends Controller
{ {
$topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]'); $topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]');
$topSideMenuApps = $this->config->getAppValueArray('top-side-menu-apps', '[]'); $topSideMenuApps = $this->config->getAppValueArray('top-side-menu-apps', '[]');
$topMenuAppsOrder = $this->config->getAppValueArray('top-menu-apps-order', '[]');
$targetBlankApps = $this->config->getAppValueArray('target-blank-apps', '[]'); $targetBlankApps = $this->config->getAppValueArray('target-blank-apps', '[]');
$useAvatar = $this->config->getAppValueBool('use-avatar', '0'); $useAvatar = $this->config->getAppValueBool('use-avatar', '0');
$isForced = $this->config->getAppValueBool('force', '0'); $isForced = $this->config->getAppValueBool('force', '0');
@ -171,10 +172,6 @@ class JsController extends Controller
'avatar' => $avatar, 'avatar' => $avatar,
'top-menu-apps' => $topMenuApps, 'top-menu-apps' => $topMenuApps,
'top-side-menu-apps' => $topSideMenuApps, 'top-side-menu-apps' => $topSideMenuApps,
'top-menu-mouse-over-hidden-label' => $this->config->getAppValueInt(
'top-menu-mouse-over-hidden-label',
'0'
),
'target-blank-apps' => $targetBlankApps, 'target-blank-apps' => $targetBlankApps,
'settings' => $settings, 'settings' => $settings,
'logo' => $this->themingDefaults->getLogo(), 'logo' => $this->themingDefaults->getLogo(),

View file

@ -43,13 +43,8 @@ class PersonalSettingController extends Controller
*/ */
protected $userSession; protected $userSession;
public function __construct( public function __construct($appName, IRequest $request, IConfig $config, ConfigProxy $configProxy, IUserSession $userSession)
$appName, {
IRequest $request,
IConfig $config,
ConfigProxy $configProxy,
IUserSession $userSession
) {
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->config = $config; $this->config = $config;

View file

@ -3,7 +3,6 @@
namespace OCA\SideMenu\Service; namespace OCA\SideMenu\Service;
use OC\User\User; use OC\User\User;
use OCP\INavigationManager;
use OCP\L10N\IFactory; use OCP\L10N\IFactory;
/** /**
@ -33,14 +32,8 @@ class AppRepository
*/ */
protected $categoryRepository; protected $categoryRepository;
/**
* @var INavigationManager
*/
protected $navigationManager;
public function __construct( public function __construct(
\OC_App $ocApp, \OC_App $ocApp,
INavigationManager $navigationManager,
IFactory $l10nFactory, IFactory $l10nFactory,
ConfigProxy $config, ConfigProxy $config,
CategoryRepository $categoryRepository CategoryRepository $categoryRepository
@ -48,7 +41,6 @@ class AppRepository
$this->ocApp = $ocApp; $this->ocApp = $ocApp;
$this->l10nFactory = $l10nFactory; $this->l10nFactory = $l10nFactory;
$this->config = $config; $this->config = $config;
$this->navigationManager = $navigationManager;
$this->categoryRepository = $categoryRepository; $this->categoryRepository = $categoryRepository;
} }
@ -59,7 +51,7 @@ class AppRepository
*/ */
public function getVisibleApps() public function getVisibleApps()
{ {
$navigation = $this->navigationManager->getAll(); $navigation = $this->ocApp->getNavigation();
$appCategoriesCustom = $this->config->getAppValueArray('apps-categories-custom', '[]'); $appCategoriesCustom = $this->config->getAppValueArray('apps-categories-custom', '[]');
$categories = $this->categoryRepository->getOrderedCategories(); $categories = $this->categoryRepository->getOrderedCategories();
$apps = $this->ocApp->listAllApps(); $apps = $this->ocApp->listAllApps();

View file

@ -74,8 +74,7 @@ class CategoryRepository
} }
foreach ($categoriesLabels as $k => $category) { foreach ($categoriesLabels as $k => $category) {
$categoriesLabels[$category['id']] = $category['translations'][$currentLanguage]['name'] ?? $categoriesLabels[$category['id']] = $category['translations'][$currentLanguage]['name'] ?? $category['translations']['en']['name'];
$category['translations']['en']['name'];
unset($categoriesLabels[$k]); unset($categoriesLabels[$k]);
} }

View file

@ -125,24 +125,15 @@ class Admin implements ISettings
'background-color' => $backgroundColor, 'background-color' => $backgroundColor,
'background-color-to' => $backgroundColorTo, 'background-color-to' => $backgroundColorTo,
'background-color-opacity' => $this->config->getAppValueInt('background-color-opacity', '100'), 'background-color-opacity' => $this->config->getAppValueInt('background-color-opacity', '100'),
'current-app-background-color' => $this->config->getAppValue( 'current-app-background-color' => $this->config->getAppValue('current-app-background-color', $darkenPrimaryColor2),
'current-app-background-color',
$darkenPrimaryColor2
),
'loader-color' => $this->config->getAppValue('loader-color', $lightenPrimaryColor), 'loader-color' => $this->config->getAppValue('loader-color', $lightenPrimaryColor),
'icon-invert-filter' => $this->config->getAppValueInt('icon-invert-filter', '0'), 'icon-invert-filter' => $this->config->getAppValueInt('icon-invert-filter', '0'),
'icon-opacity' => $this->config->getAppValueInt('icon-opacity', '100'), 'icon-opacity' => $this->config->getAppValueInt('icon-opacity', '100'),
'text-color' => $this->config->getAppValue('text-color', $textColor), 'text-color' => $this->config->getAppValue('text-color', $textColor),
'dark-mode-background-color' => $darkModeBackgroundColor, 'dark-mode-background-color' => $darkModeBackgroundColor,
'dark-mode-background-color-to' => $darkModeBackgroundColorTo, 'dark-mode-background-color-to' => $darkModeBackgroundColorTo,
'dark-mode-background-color-opacity' => $this->config->getAppValueInt( 'dark-mode-background-color-opacity' => $this->config->getAppValueInt('dark-mode-background-color-opacity', '100'),
'dark-mode-background-color-opacity', 'dark-mode-current-app-background-color' => $this->config->getAppValue('dark-mode-current-app-background-color', $darkenPrimaryColor2),
'100'
),
'dark-mode-current-app-background-color' => $this->config->getAppValue(
'dark-mode-current-app-background-color',
$darkenPrimaryColor2
),
'dark-mode-loader-color' => $this->config->getAppValue('dark-mode-loader-color', $textColor), 'dark-mode-loader-color' => $this->config->getAppValue('dark-mode-loader-color', $textColor),
'dark-mode-icon-invert-filter' => $this->config->getAppValueInt('dark-mode-icon-invert-filter', '0'), 'dark-mode-icon-invert-filter' => $this->config->getAppValueInt('dark-mode-icon-invert-filter', '0'),
'dark-mode-icon-opacity' => $this->config->getAppValueInt('dark-mode-icon-opacity', '100'), 'dark-mode-icon-opacity' => $this->config->getAppValueInt('dark-mode-icon-opacity', '100'),
@ -168,10 +159,6 @@ class Admin implements ISettings
'force' => $this->config->getAppValue('force', '0'), 'force' => $this->config->getAppValue('force', '0'),
'target-blank-apps' => $this->config->getAppValueArray('target-blank-apps', '[]'), 'target-blank-apps' => $this->config->getAppValueArray('target-blank-apps', '[]'),
'top-menu-apps' => $this->config->getAppValueArray('top-menu-apps', '[]'), 'top-menu-apps' => $this->config->getAppValueArray('top-menu-apps', '[]'),
'top-menu-mouse-over-hidden-label' => $this->config->getAppValue(
'top-menu-mouse-over-hidden-label',
'0'
),
'apps-order' => $this->config->getAppValueArray('apps-order', '[]'), 'apps-order' => $this->config->getAppValueArray('apps-order', '[]'),
'ordered-apps' => $this->appRepository->getOrderedApps(), 'ordered-apps' => $this->appRepository->getOrderedApps(),
'top-side-menu-apps' => $this->config->getAppValueArray('top-side-menu-apps', '[]'), 'top-side-menu-apps' => $this->config->getAppValueArray('top-side-menu-apps', '[]'),

View file

@ -54,13 +54,8 @@ class Personal implements ISettings
*/ */
private $appRepository; private $appRepository;
public function __construct( public function __construct(IL10N $l, ILogger $logger, ConfigProxy $config, IUserSession $userSession, AppRepository $appRepository)
IL10N $l, {
ILogger $logger,
ConfigProxy $config,
IUserSession $userSession,
AppRepository $appRepository
) {
$this->l = $l; $this->l = $l;
$this->logger = $logger; $this->logger = $logger;
$this->config = $config; $this->config = $config;

View file

@ -11,7 +11,7 @@
"stylelint:fix": "./node_modules/.bin/stylelint src --fix" "stylelint:fix": "./node_modules/.bin/stylelint src --fix"
}, },
"dependencies": { "dependencies": {
"axios": "^1.6.7", "axios": "^0.24.0",
"trim": "^1.0.1", "trim": "^1.0.1",
"vue": "^2.6.11" "vue": "^2.6.11"
}, },
@ -25,15 +25,15 @@
"@babel/core": "^7.9.0", "@babel/core": "^7.9.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-env": "^7.9.0", "@babel/preset-env": "^7.9.0",
"@nextcloud/axios": "^2.3.0", "@nextcloud/axios": "^1.8.0",
"@nextcloud/browserslist-config": "^2.3.0", "@nextcloud/browserslist-config": "^1.0.0",
"@nextcloud/eslint-config": "^8.1.2", "@nextcloud/eslint-config": "^8.1.2",
"@nextcloud/initial-state": "^2.0.0", "@nextcloud/initial-state": "^2.0.0",
"@nextcloud/l10n": "^2.1.0", "@nextcloud/l10n": "^1.6.0",
"@nextcloud/vue": "^7.12.1", "@nextcloud/vue": "^7.0.0",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"babel-loader": "^8.1.0", "babel-loader": "^8.1.0",
"css-loader": "^6.10.0", "css-loader": "^3.4.2",
"eslint": "^8.0.0", "eslint": "^8.0.0",
"eslint-config-standard": "^17.0.0", "eslint-config-standard": "^17.0.0",
"eslint-import-resolver-webpack": "^0.12.1", "eslint-import-resolver-webpack": "^0.12.1",

View file

@ -1,3 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
}

View file

@ -16,7 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<template> <template>
<div> <div>
<ul class="side-menu-setting-list" :class="{hide: values.length === 0}"> <ul class="side-menu-setting-list">
<li v-for="item in values" class="side-menu-setting-list-item" v-on:click="showEditForm(item)"> <li v-for="item in values" class="side-menu-setting-list-item" v-on:click="showEditForm(item)">
<span v-text="item.en"></span> <span v-text="item.en"></span>
</li> </li>
@ -77,12 +77,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
} }
</style> </style>
<style scoped>
.hide {
display: none;
}
</style>
<script> <script>
import NcModal from '@nextcloud/vue/dist/Components/NcModal' import NcModal from '@nextcloud/vue/dist/Components/NcModal'
import NcActions from '@nextcloud/vue/dist/Components/NcActions' import NcActions from '@nextcloud/vue/dist/Components/NcActions'

View file

@ -21,20 +21,13 @@
--> -->
<template> <template>
<nav <nav class="app-menu show">
class="app-menu show" <ul class="app-menu-main" v-if="apps !== null">
:aria-label="t('core', 'Applications menu')"
>
<ul
class="app-menu-main"
:class="{ 'app-menu-main__hidden-label': hiddenLabels === 1, 'app-menu-main__show-hovered': hiddenLabels === 2 }"
v-if="apps !== null"
>
<li v-for="app in mainAppList()" <li v-for="app in mainAppList()"
:key="app.id" :key="app.id"
:data-app-id="app.id" :data-app-id="app.id"
class="app-menu-entry" class="app-menu-entry"
:class="{ 'app-menu-entry__active': app.active, 'app-menu-entry__hidden-label': hiddenLabels === 1, 'app-menu-main__show-hovered': hiddenLabels === 2 }" :class="{ 'app-menu-entry__active': app.active }"
:style="makeStyle(app)" :style="makeStyle(app)"
> >
<a :href="app.href" <a :href="app.href"
@ -56,7 +49,6 @@
:aria-label="appLabel(app)" :aria-label="appLabel(app)"
:aria-current="app.active ? 'page' : false" :aria-current="app.active ? 'page' : false"
:href="app.href" :href="app.href"
:style="makeStyle(app)"
class="app-menu-popover-entry"> class="app-menu-popover-entry">
<template #icon> <template #icon>
<div class="app-icon" :class="{ 'has-unread': app.unread > 0 }"> <div class="app-icon" :class="{ 'has-unread': app.unread > 0 }">
@ -72,8 +64,7 @@
<script> <script>
import { loadState } from '@nextcloud/initial-state' import { loadState } from '@nextcloud/initial-state'
import NcActions from '@nextcloud/vue/dist/Components/NcActions.js' import { NcActions, NcActionLink } from '@nextcloud/vue'
import NcActionLink from '@nextcloud/vue/dist/Components/NcActionLink.js'
export default { export default {
name: 'AppMenu', name: 'AppMenu',
@ -86,7 +77,6 @@ export default {
appLimit: 0, appLimit: 0,
observer: null, observer: null,
targetBlankApps: [], targetBlankApps: [],
hiddenLabels: true
} }
}, },
mounted() { mounted() {
@ -106,7 +96,6 @@ export default {
}) })
this.targetBlankApps = window.targetBlankApps this.targetBlankApps = window.targetBlankApps
this.hiddenLabels = window.topMenuAppsMouseOverHiddenLabel
this.observer = new ResizeObserver(this.resize) this.observer = new ResizeObserver(this.resize)
this.observer.observe(this.$el) this.observer.observe(this.$el)
this.resize() this.resize()
@ -115,19 +104,13 @@ export default {
this.observer.disconnect() this.observer.disconnect()
}, },
methods: { methods: {
appLabel(app) { appLabel() {
return app.name return (app) => app.name
+ (app.active ? ' (' + t('core', 'Currently open') + ')' : '') + (app.active ? ' (' + t('core', 'Currently open') + ')' : '')
+ (app.unread > 0 ? ' (' + n('core', '{count} notification', '{count} notifications', app.unread, { count: app.unread }) + ')' : '') + (app.unread > 0 ? ' (' + n('core', '{count} notification', '{count} notifications', app.unread, { count: app.unread }) + ')' : '')
}, },
appList() { appList() {
let items = Object.values(this.apps) return Object.values(this.apps)
items.sort((a, b) => {
return a.order < b.order ? -1 : 1;
})
return items
}, },
mainAppList() { mainAppList() {
return this.appList().slice(0, this.appLimit) return this.appList().slice(0, this.appLimit)
@ -168,7 +151,6 @@ $header-icon-size: 20px;
flex-shrink: 1; flex-shrink: 1;
flex-wrap: wrap; flex-wrap: wrap;
} }
.app-menu-main { .app-menu-main {
display: flex; display: flex;
flex-wrap: nowrap; flex-wrap: nowrap;
@ -178,6 +160,7 @@ $header-icon-size: 20px;
height: 50px; height: 50px;
position: relative; position: relative;
display: flex; display: flex;
opacity: .7;
&.app-menu-entry__active { &.app-menu-entry__active {
opacity: 1; opacity: 1;
@ -217,8 +200,7 @@ $header-icon-size: 20px;
width: $header-icon-size; width: $header-icon-size;
height: $header-icon-size; height: $header-icon-size;
padding: calc((100% - $header-icon-size) / 2); padding: calc((100% - $header-icon-size) / 2);
box-sizing: content-box; filter: var(--primary-invert-if-bright);
filter: var(--background-image-invert-if-bright, var(--primary-invert-if-bright));
} }
.app-menu-entry--label { .app-menu-entry--label {
@ -227,8 +209,8 @@ $header-icon-size: 20px;
font-size: 12px; font-size: 12px;
color: var(--color-primary-text); color: var(--color-primary-text);
text-align: center; text-align: center;
bottom: -5px;
left: 50%; left: 50%;
top: 45%;
display: block; display: block;
min-width: 100%; min-width: 100%;
transform: translateX(-50%); transform: translateX(-50%);
@ -236,21 +218,21 @@ $header-icon-size: 20px;
width: 100%; width: 100%;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
letter-spacing: -0.5px;
} }
&:not(.app-menu-entry__hidden-label):not(.app-menu-entry__show-hovered):hover, &:hover,
&:not(.app-menu-entry__hidden-label):not(.app-menu-entry__show-hovered):focus-within { &:focus-within {
opacity: 1; opacity: 1;
.app-menu-entry--label { .app-menu-entry--label {
opacity: 1; opacity: 1;
font-weight: bolder; font-weight: bold;
font-size: 14px;
bottom: 0; bottom: 0;
width: 100%; width: auto;
text-overflow: ellipsis; overflow: visible;
overflow: hidden;
} }
} }
} }
// Show labels // Show labels
@ -259,32 +241,9 @@ $header-icon-size: 20px;
.app-menu-entry:hover, .app-menu-entry:hover,
.app-menu-entry:focus { .app-menu-entry:focus {
opacity: 1; opacity: 1;
}
&:not(.app-menu-main__hidden-label):not(.app-menu-main__show-hovered):hover,
&:not(.app-menu-main__hidden-label):not(.app-menu-main__show-hovered):focus-within,
.app-menu-entry:not(.app-menu-entry__hidden-label):hover,
.app-menu-entry:not(.app-menu-entry__hidden-label):focus {
opacity: 1;
img { img {
margin-top: -8px; margin-top: -6px;
}
.app-menu-entry--label {
opacity: 1;
bottom: 0;
}
&::before, .app-menu-entry::before {
opacity: 0;
}
}
&.app-menu-main__show-hovered .app-menu-entry:hover,
&.app-menu-main__show-hovered .app-menu-entry:focus {
img {
margin-top: -8px;
} }
.app-menu-entry--label { .app-menu-entry--label {
@ -299,42 +258,38 @@ $header-icon-size: 20px;
} }
::v-deep .app-menu-more .button-vue--vue-tertiary { ::v-deep .app-menu-more .button-vue--vue-tertiary {
color: var(--color-primary-text);
opacity: .7; opacity: .7;
margin: 3px; margin: 3px;
filter: var(--background-image-invert-if-bright, var(--primary-invert-if-bright));
&:not([aria-expanded="true"]) { &:hover {
color: var(--color-primary-element-text); opacity: 1;
background-color: transparent !important;
&:hover {
opacity: 1;
background-color: transparent !important;
}
} }
&:focus-visible { &:focus-visible {
opacity: 1; opacity: 1;
outline: none !important; background-color: transparent !important;
} border-radius: var(--border-radius);
outline: none;
box-shadow: 0 0 0 2px var(--color-primary-text);
}
} }
.app-menu-popover-entry { .app-menu-popover-entry {
.app-icon { .app-icon {
position: relative; position: relative;
height: 44px; height: 44px;
width: 48px;
display: flex;
align-items: center;
justify-content: center;
filter: var(--background-invert-if-bright, var(--primary-invert-if-bright));
&.has-unread::after { &.has-unread::after {
background-color: var(--color-main-text); background-color: var(--color-main-text);
} }
img { img {
filter: var(--background-invert-if-bright);
width: $header-icon-size; width: $header-icon-size;
height: $header-icon-size; height: $header-icon-size;
padding: calc((50px - $header-icon-size) / 2);
} }
} }
} }
@ -343,7 +298,7 @@ $header-icon-size: 20px;
content: ""; content: "";
width: 8px; width: 8px;
height: 8px; height: 8px;
background-color: var(--color-primary-element-text); background-color: var(--color-primary-text);
border-radius: 50%; border-radius: 50%;
position: absolute; position: absolute;
display: block; display: block;

View file

@ -1,32 +0,0 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="side-menu-search">
<input type="text" :value="value" :placeholder="t('side_menu', 'Search')" @input="$emit('input', $event.target.value)">
</div>
</template>
<script>
export default {
name: 'AppSearch',
props: {
value: {
required: true
},
},
}
</script>

View file

@ -15,18 +15,11 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<template> <template>
<button class="side-menu-opener side-menu-closer" :arial-label="label"> <button class="side-menu-opener side-menu-closer"></button>
<span v-text="label"></span>
</button>
</template> </template>
<script> <script>
export default { export default {
name: 'CloserButton', name: 'CloserButton',
data() {
return {
label: t('side_menu', 'Close the menu'),
}
}
} }
</script> </script>

View file

@ -15,18 +15,11 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<template> <template>
<button class="side-menu-opener" :arial-label="label"> <button class="side-menu-opener"></button>
<span v-text="label"></span>
</button>
</template> </template>
<script> <script>
export default { export default {
name: 'OpenerButton', name: 'OpenerButton',
data() {
return {
label: t('side_menu', 'Toggle the menu'),
}
}
} }
</script> </script>

View file

@ -17,12 +17,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<template> <template>
<div class="side-menu-settings"> <div class="side-menu-settings">
<a v-bind:href="href"> <a v-bind:href="href">
<!--
{{ label }} {{ label }}
-->
<span class="avatardiv avatardiv-shown"> <span class="avatardiv avatardiv-shown">
<img v-bind:src="avatar" :alt="label"> <img v-bind:src="avatar">
</span> </span>
</a> </a>
</div> </div>

View file

@ -16,19 +16,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<template> <template>
<div id="side-menu"> <div id="side-menu">
<div class="side-menu-header" v-if="settings || !openerHover || (!avatar && !alwaysDisplayed && logo) || avatar"> <div class="side-menu-header">
<SettingsButton <SettingsButton
v-if="settings" v-if="settings"
v-bind:href="settings.href" v-bind:href="settings.href"
v-bind:label="settings.name" v-bind:label="settings.name"
v-bind:avatar="settings.avatar" /> v-bind:avatar="settings.avatar" />
<AppSearch v-model:search="search" />
<OpenerButton /> <OpenerButton />
<Logo <Logo
v-if="!avatar && !alwaysDisplayed && logo" v-bind:classes="{'side-menu-logo': true, 'avatardiv': false}" v-if="!avatar && logo" v-bind:classes="{'side-menu-logo': true, 'avatardiv': false}"
v-bind:image="logo" v-bind:image="logo"
v-bind:link="logoLink" v-bind:link="logoLink"
/> />
<Logo <Logo
v-if="avatar" v-bind:classes="{'side-menu-logo': true, 'avatardiv': true}" v-if="avatar" v-bind:classes="{'side-menu-logo': true, 'avatardiv': true}"
v-bind:image="avatar" v-bind:image="avatar"
@ -36,10 +38,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/> />
</div> </div>
<ul class="side-menu-apps-list" :class="{'side-menu-apps-list--with-settings': !!settings}"> <ul class="side-menu-apps-list">
<SideMenuApp <SideMenuApp
v-for="(app, key) in apps" v-for="(app, key) in apps"
v-if="!hiddenApps.includes(app.id) && searchMatch(app.name)"
v-bind:classes="{'side-menu-app': true, 'active': app.active}" v-bind:classes="{'side-menu-app': true, 'active': app.active}"
v-bind:key="key" v-bind:key="key"
v-bind:icon="app.icon" v-bind:icon="app.icon"
@ -52,11 +53,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</template> </template>
<script> <script>
import trim from 'trim'
import axios from 'axios' import axios from 'axios'
import OpenerButton from './OpenerButton' import OpenerButton from './OpenerButton'
import SettingsButton from './SettingsButton' import SettingsButton from './SettingsButton'
import SideMenuApp from './SideMenuApp' import SideMenuApp from './SideMenuApp'
import AppSearch from './AppSearch'
import Logo from './Logo' import Logo from './Logo'
import { loadState } from '@nextcloud/initial-state' import { loadState } from '@nextcloud/initial-state'
@ -67,7 +68,6 @@ export default {
OpenerButton, OpenerButton,
SideMenuApp, SideMenuApp,
Logo, Logo,
AppSearch,
}, },
data() { data() {
return { return {
@ -77,11 +77,7 @@ export default {
avatar: null, avatar: null,
forceLightIcon: false, forceLightIcon: false,
targetBlankApps: [], targetBlankApps: [],
hiddenApps: [],
settings: null, settings: null,
openerHover: false,
alwaysDisplayed: false,
search: '',
} }
}, },
methods: { methods: {
@ -96,11 +92,7 @@ export default {
for (let id in ncApps) { for (let id in ncApps) {
if (window.topMenuApps.includes(id) && !window.topSideMenuApps.includes(id)) { if (window.topMenuApps.includes(id) && !window.topSideMenuApps.includes(id)) {
continue continue;
}
if (this.hiddenApps.includes(id)) {
continue
} }
let app = ncApps[id] let app = ncApps[id]
@ -111,10 +103,10 @@ export default {
finalApps.sort((a, b) => { finalApps.sort((a, b) => {
if (a.order === null || b.order === null) { if (a.order === null || b.order === null) {
return a.name < b.name ? -1 : 1 return a.name < b.name ? -1 : 1;
} }
return a.order < b.order ? -1 : 1 return a.order < b.order ? -1 : 1;
}) })
this.apps = finalApps this.apps = finalApps
@ -125,47 +117,23 @@ export default {
}, },
retrieveConfig() { retrieveConfig() {
}, axios
.get(OC.generateUrl('/apps/side_menu/js/config'))
.then((response) => {
const config = response.data
hasSearchMatch(apps) { this.targetBlankApps = config['target-blank-apps']
if (this.search.trim() === '') { this.forceLightIcon = config['force-light-icon']
return true this.avatar = config['avatar']
} this.logo = config['logo']
this.logoLink = config['logo-link']
for (let key in apps) { this.settings = config['settings']
if (this.searchMatch(apps[key].name)) { })
return true
}
}
return false
},
searchMatch(name) {
if (this.search.trim() === '') {
return true
}
return name.toLowerCase().includes(this.search.toLowerCase())
}, },
}, },
mounted() { mounted() {
axios this.retrieveConfig()
.get(OC.generateUrl('/apps/side_menu/js/config')) this.retrieveApps()
.then((response) => {
const config = response.data
this.targetBlankApps = config['target-blank-apps']
this.forceLightIcon = config['force-light-icon']
this.avatar = config['avatar']
this.logo = config['logo']
this.logoLink = config['logo-link']
this.settings = config['settings']
this.openerHover = config['opener-hover']
this.alwaysDisplayed = config['always-displayed']
this.hiddenApps = config['big-menu-hidden-apps']
this.retrieveApps()
})
} }
} }
</script> </script>

View file

@ -18,13 +18,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div id="side-menu" class="side-menu-big"> <div id="side-menu" class="side-menu-big">
<div class="side-menu-header"> <div class="side-menu-header">
<CloserButton /> <CloserButton />
<SettingsButton <SettingsButton
v-if="settings" v-if="settings"
v-bind:href="settings.href" v-bind:href="settings.href"
v-bind:label="settings.name" v-bind:label="settings.name"
v-bind:avatar="settings.avatar" v-bind:avatar="settings.avatar"
/> />
<AppSearch v-model:search="search" />
<OpenerButton /> <OpenerButton />
</div> </div>
@ -32,13 +33,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div class="side-menu-categories"> <div class="side-menu-categories">
<Loader v-if="!items.length" /> <Loader v-if="!items.length" />
<div class="side-menu-category" v-for="(category, key) in items" v-if="hasSearchMatch(category.apps)" v-bind:key="key"> <div class="side-menu-category" v-for="(category, key) in items" v-bind:key="key">
<h2 class="side-menu-category-title" v-if="category.name != ''" v-text="category.name"></h2> <h2 class="side-menu-category-title" v-if="category.name != ''" v-text="category.name"></h2>
<ul class="side-menu-apps-list"> <ul class="side-menu-apps-list">
<SideMenuBigApp <SideMenuBigApp
v-for="(app, appId) in category.apps" v-for="(app, appId) in category.apps"
v-if="searchMatch(app.name)"
v-bind:key="appId" v-bind:key="appId"
v-bind:classes="{'side-menu-app': true, 'active': activeApp === appId}" v-bind:classes="{'side-menu-app': true, 'active': activeApp === appId}"
v-bind:icon="app.icon" v-bind:icon="app.icon"
@ -59,7 +59,6 @@ import OpenerButton from './OpenerButton'
import CloserButton from './CloserButton' import CloserButton from './CloserButton'
import SettingsButton from './SettingsButton' import SettingsButton from './SettingsButton'
import Loader from './Loader' import Loader from './Loader'
import AppSearch from './AppSearch'
import SideMenuBigApp from './SideMenuBigApp' import SideMenuBigApp from './SideMenuBigApp'
import { loadState } from '@nextcloud/initial-state' import { loadState } from '@nextcloud/initial-state'
@ -71,7 +70,6 @@ export default {
CloserButton, CloserButton,
Loader, Loader,
SideMenuBigApp, SideMenuBigApp,
AppSearch,
}, },
data() { data() {
return { return {
@ -80,7 +78,6 @@ export default {
targetBlank: false, targetBlank: false,
targetBlankApps: [], targetBlankApps: [],
settings: null, settings: null,
search: '',
} }
}, },
methods: { methods: {
@ -123,28 +120,6 @@ export default {
this.settings = config['settings'] this.settings = config['settings']
}) })
}, },
hasSearchMatch(apps) {
if (this.search.trim() === '') {
return true
}
for (let key in apps) {
if (this.searchMatch(apps[key].name)) {
return true
}
}
return false
},
searchMatch(name) {
if (this.search.trim() === '') {
return true
}
return name.toLowerCase().includes(this.search.toLowerCase())
},
}, },
mounted() { mounted() {
this.retrieveConfig() this.retrieveConfig()

View file

@ -23,7 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
v-bind:label="settings.name" v-bind:label="settings.name"
v-bind:avatar="settings.avatar" v-bind:avatar="settings.avatar"
/> />
<AppSearch v-model:search="search" />
<OpenerButton /> <OpenerButton />
</div> </div>
@ -31,13 +31,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div class="side-menu-categories"> <div class="side-menu-categories">
<Loader v-if="!items.length" /> <Loader v-if="!items.length" />
<div class="side-menu-category" v-for="(category, key) in items" v-if="hasSearchMatch(category.apps)" v-bind:key="key"> <div class="side-menu-category" v-for="(category, key) in items" v-bind:key="key">
<h2 class="side-menu-category-title" v-if="category.name != ''" v-text="category.name"></h2> <h2 class="side-menu-category-title" v-if="category.name != ''" v-text="category.name"></h2>
<ul class="side-menu-apps-list"> <ul class="side-menu-apps-list">
<SideMenuBigApp <SideMenuBigApp
v-for="(app, appId) in category.apps" v-for="(app, appId) in category.apps"
v-if="searchMatch(app.name)"
v-bind:key="appId" v-bind:key="appId"
v-bind:classes="{'side-menu-app': true, 'active': activeApp === appId}" v-bind:classes="{'side-menu-app': true, 'active': activeApp === appId}"
v-bind:icon="app.icon" v-bind:icon="app.icon"
@ -57,7 +56,6 @@ import axios from 'axios'
import OpenerButton from './OpenerButton' import OpenerButton from './OpenerButton'
import SettingsButton from './SettingsButton' import SettingsButton from './SettingsButton'
import Loader from './Loader' import Loader from './Loader'
import AppSearch from './AppSearch'
import SideMenuBigApp from './SideMenuBigApp' import SideMenuBigApp from './SideMenuBigApp'
import { loadState } from '@nextcloud/initial-state' import { loadState } from '@nextcloud/initial-state'
@ -68,7 +66,6 @@ export default {
OpenerButton, OpenerButton,
Loader, Loader,
SideMenuBigApp, SideMenuBigApp,
AppSearch,
}, },
data() { data() {
return { return {
@ -77,7 +74,6 @@ export default {
targetBlank: false, targetBlank: false,
targetBlankApps: [], targetBlankApps: [],
settings: null, settings: null,
search: '',
} }
}, },
methods: { methods: {
@ -120,28 +116,6 @@ export default {
this.settings = config['settings'] this.settings = config['settings']
}) })
}, },
hasSearchMatch(apps) {
if (this.search.trim() === '') {
return true
}
for (let key in apps) {
if (this.searchMatch(apps[key].name)) {
return true
}
}
return false
},
searchMatch(name) {
if (this.search.trim() === '') {
return true
}
return name.toLowerCase().includes(this.search.toLowerCase())
},
}, },
mounted() { mounted() {
this.retrieveConfig() this.retrieveConfig()

View file

@ -3,14 +3,21 @@
"No": "Ne" "No": "Ne"
"Yes": "Ano" "Yes": "Ano"
"Menu": "Nabídka" "Menu": "Nabídka"
? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.' ? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span>
: 'Pro otevření/skrytí postranní nabídky použijte zkratku <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">O</span> („O“ jako otevřít). Pro pohyb po použijte klávesu <span class="keyboard-key">Tab</span>.' to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to
navigate.'
: 'Pro otevření/skrytí postranní nabídky použijte zkratku <span class="keyboard-key">Ctrl</span>+<span
class="keyboard-key">O</span> („O“ jako otevřít). Pro pohyb po použijte klávesu
<span class="keyboard-key">Tab</span>.'
"Top menu": "Horní nabídka" "Top menu": "Horní nabídka"
"Apps that not must be moved in the side menu": "Aplikace, které nepřesouvat do postranní nabídky" "Apps that not must be moved in the side menu": "Aplikace, které nepřesouvat do postranní\
"If there is no selection then the global configuration is applied.": "Pokud neexistuje žádný výběr, je uplatněno globální nastavení." \ nabídky"
"If there is no selection then the global configuration is applied.": "Pokud neexistuje\
\ žádný výběr, je uplatněno globální nastavení."
"Experimental": "Experimentální" "Experimental": "Experimentální"
"Save": "Uložit" "Save": "Uložit"
"You like this app and you want to support me?": "Líbí se vám tato aplikace a chcete podpořit její vývoj?" "You like this app and you want to support me?": "Líbí se vám tato aplikace a chcete\
\ podpořit její vývoj?"
"Buy me a coffee ☕": "Kupte mi kafe ☕" "Buy me a coffee ☕": "Kupte mi kafe ☕"
"Hidden": "Skryté" "Hidden": "Skryté"
"Small": "Malé" "Small": "Malé"
@ -37,16 +44,21 @@
"After the logo": "Za logem" "After the logo": "Za logem"
"Position": "Pozice" "Position": "Pozice"
"Show only the opener (hidden logo)": "Zobrazovat pouze otevírací tlačítko (logo skryto)" "Show only the opener (hidden logo)": "Zobrazovat pouze otevírací tlačítko (logo skryto)"
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Nezobrazovat postranní nabídku a její otevírací tlačítko pokud nejsou dostupné žádné aplikace (např. na veřejných stránkách)." "Do not display the side menu and the opener if there is no application (eg: public pages).": "Nezobrazovat\
\ postranní nabídku a její otevírací tlačítko pokud nejsou dostupné žádné aplikace\
\ (např. na veřejných stránkách)."
"Panel": "Panel" "Panel": "Panel"
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Otevřít nabídku při najetím ukazatelem na tlačítko nabídky (automaticky vypnuto pro dotykové obrazovky)" "Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Otevřít\
\ nabídku při najetím ukazatelem na tlačítko nabídky (automaticky vypnuto pro dotykové\
\ obrazovky)"
"Display the big menu": "Zobrazit velkou nabídku" "Display the big menu": "Zobrazit velkou nabídku"
"Display the logo": "Zobrazit logo" "Display the logo": "Zobrazit logo"
"Icons and texts": "Ikony a texty" "Icons and texts": "Ikony a texty"
"Loader enabled": "Načítání zapnuto" "Loader enabled": "Načítání zapnuto"
"Tips": "Tipy" "Tips": "Tipy"
"Always displayed": "Vždy zobrazeno" "Always displayed": "Vždy zobrazeno"
"This is the automatic behavior when the menu is always displayed.": "Toto je automatické chování, kdy je nabídka vždy zobrazena." "This is the automatic behavior when the menu is always displayed.": "Toto je automatické\
\ chování, kdy je nabídka vždy zobrazena."
"Not compatible with touch screens.": "Nekompatibilní s dotykovými obrazovkami." "Not compatible with touch screens.": "Nekompatibilní s dotykovými obrazovkami."
"Big menu": "Velká nabídka" "Big menu": "Velká nabídka"
"Live preview": "Živý náhled" "Live preview": "Živý náhled"
@ -60,10 +72,13 @@
"Export the configuration": "Exportovat nastavení" "Export the configuration": "Exportovat nastavení"
"Purge the cache": "Vyprázdnit mezipaměť" "Purge the cache": "Vyprázdnit mezipaměť"
"Show the link to settings": "Zobrazit odkaz na nastavení" "Show the link to settings": "Zobrazit odkaz na nastavení"
"The menu is enabled by default for users": "Nabídka je ve výchozím stavu pro uživatele zapnutá" "The menu is enabled by default for users": "Nabídka je ve výchozím stavu pro uživatele\
\ zapnutá"
"Except when the configuration is forced.": "S výjimkou, kdy je nastavení vynuceno." "Except when the configuration is forced.": "S výjimkou, kdy je nastavení vynuceno."
"Apps that should not be displayed in the menu": "Aplikace, které by neměly být v nabídce zobrazeny" "Apps that should not be displayed in the menu": "Aplikace, které by neměly být v\
"This feature is only compatible with the <code>big menu</code> display.": "Tato funkce je kompatibilní pouze s <code>velkou nabídkou</code>." \ nabídce zobrazeny"
"This feature is only compatible with the <code>big menu</code> display.": "Tato funkce\
\ je kompatibilní pouze s <code>velkou nabídkou</code>."
"The logo is a link to the default app": "Logo je odkaz na výchozí aplikaci" "The logo is a link to the default app": "Logo je odkaz na výchozí aplikaci"
"Others": "Ostatní" "Others": "Ostatní"
"Categories": "Kategorie" "Categories": "Kategorie"
@ -72,7 +87,8 @@
"Name": "Název" "Name": "Název"
"Customed": "Přizpůsobeno" "Customed": "Přizpůsobeno"
"Show and hide the list of categories": "Zobrazit/skrýt seznam kategorií" "Show and hide the list of categories": "Zobrazit/skrýt seznam kategorií"
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Tyto parametry jsou použity v případě, že je zapnutý (Breeze) tmavý motiv vzhledu." "This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Tyto\
\ parametry jsou použity v případě, že je zapnutý (Breeze) tmavý motiv vzhledu."
"Dark mode colors": "Barvy tmavého režimu" "Dark mode colors": "Barvy tmavého režimu"
"With categories": "S kategoriemi" "With categories": "S kategoriemi"
"Custom categories": "Vlastní kategorie" "Custom categories": "Vlastní kategorie"
@ -86,11 +102,9 @@
"Small text": "Malý text" "Small text": "Malý text"
"Normal text": "Normální text" "Normal text": "Normální text"
"Big text": "Velký text" "Big text": "Velký text"
"Applications": "Aplikace" "Applications": "Applications"
"Applications kept in the top menu": "Aplikace ponechané v horní nabídce" "Applications kept in the top menu": "Applications kept in the top menu"
"Applications kept in the top menu but also shown in side menu": "Aplikace ponechané v horní nabídce ale také zobrazené v té boční" "Applications kept in the top menu but also shown in side menu": "Applications kept\
"These applications must be selected in the previous option.": "Tyto aplikace je třeba vybrat v předchozí volbě." \ in the top menu but also shown in side menu"
"Hide labels on mouse over": "Skrýt popisky při najetím ukazatele myši" "These applications must be selected in the previous option.": "These applications\
"Except the hovered app": "Except the hovered app" \ must be selected in the previous option."
"Search": "Search"
"Toggle the menu": "Toggle the menu"

View file

@ -3,14 +3,21 @@
"No": "Nein" "No": "Nein"
"Yes": "Ja" "Yes": "Ja"
"Menu": "Menü" "Menu": "Menü"
? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.' ? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span>
: 'Verwende die Tastenkombination <span class="keyboard-key">Strg</span>+<span class="keyboard-key">o</span>, um das Seitenmenü ein- und auszublenden. Verwende <span class="keyboard-key">tab</span> zum Navigieren.' to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to
navigate.'
: 'Verwende die Tastenkombination <span class="keyboard-key">Strg</span>+<span class="keyboard-key">o</span>,
um das Seitenmenü ein- und auszublenden. Verwende <span class="keyboard-key">tab</span>
zum Navigieren.'
"Top menu": "Obere Navigationsleiste" "Top menu": "Obere Navigationsleiste"
"Apps that not must be moved in the side menu": "Apps, die nicht ins Seitenmenü verschoben werden sollen" "Apps that not must be moved in the side menu": "Anwendungen, die nicht ins Seitenmenü\
"If there is no selection then the global configuration is applied.": "Wenn keine Auswahl vorhanden ist, wird die globale Konfiguration angewendet." \ verschoben werden sollen"
"If there is no selection then the global configuration is applied.": "Wenn keine\
\ Auswahl vorhanden ist, wird die globale Konfiguration angewendet."
"Experimental": "Experimentell" "Experimental": "Experimentell"
"Save": "Speichern" "Save": "Speichern"
"You like this app and you want to support me?": "Du magst diese App und möchtest mich unterstützen?" "You like this app and you want to support me?": "Du magst diese Anwendung und möchtest\
\ mich unterstützen?"
"Buy me a coffee ☕": "Gib mir einen Kaffee aus ☕" "Buy me a coffee ☕": "Gib mir einen Kaffee aus ☕"
"Hidden": "Ausblenden" "Hidden": "Ausblenden"
"Small": "Klein" "Small": "Klein"
@ -18,9 +25,9 @@
"Big": "Groß" "Big": "Groß"
"Colors": "Farben" "Colors": "Farben"
"Background color": "Hintergrundfarbe" "Background color": "Hintergrundfarbe"
"Background color of current app": "Hintergrundfarbe der aktuellen App" "Background color of current app": "Hintergrundfarbe der aktuellen Anwendung"
"Text color": "Textfarbe" "Text color": "Textfarbe"
"Loader": "Fortschrittsbalken" "Loader": "Ladestandanzeige"
"Icon": "Symbol" "Icon": "Symbol"
"Same color": "Selbe Farbe" "Same color": "Selbe Farbe"
"Opposite color": "Gegenfarbe" "Opposite color": "Gegenfarbe"
@ -37,33 +44,43 @@
"After the logo": "Nach dem Logo" "After the logo": "Nach dem Logo"
"Position": "Position" "Position": "Position"
"Show only the opener (hidden logo)": "Nur das Menü-Symbol anzeigen (Logo wird ausgeblendet)" "Show only the opener (hidden logo)": "Nur das Menü-Symbol anzeigen (Logo wird ausgeblendet)"
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Zeige das Seitenmenü und das Menü-Symbol nicht an, wenn keine App vorhanden ist (z.B. bei öffentlichen Seiten)." "Do not display the side menu and the opener if there is no application (eg: public pages).": "Zeige\
\ das Seitenmenü und das Menü-Symbol nicht an, wenn keine Anwendung vorhanden ist\
\ (z.B. bei öffentlichen Seiten)."
"Panel": "Panel" "Panel": "Panel"
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Öffne das Menü, wenn die Maus über das Menü-Symbol bewegt wird (auf Touchscreens automatisch deaktiviert)" "Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Öffne\
\ das Menü, wenn die Maus über das Menü-Symbol bewegt wird (auf Touchscreens automatisch\
\ deaktiviert)"
"Display the big menu": "Großes Menü anzeigen" "Display the big menu": "Großes Menü anzeigen"
"Display the logo": "Logo anzeigen" "Display the logo": "Logo anzeigen"
"Icons and texts": "Symbole und Texte" "Icons and texts": "Symbole und Texte"
"Loader enabled": "Fortschrittsbalken anzeigen" "Loader enabled": "Ladestandanzeige aktiviert"
"Tips": "Tipps" "Tips": "Tipps"
"Always displayed": "Immer anzeigen" "Always displayed": "Immer anzeigen"
"This is the automatic behavior when the menu is always displayed.": "Dies ist das automatische Verhalten, wenn das Menü immer angezeigt wird." "This is the automatic behavior when the menu is always displayed.": "Dies ist das\
\ automatische Verhalten, wenn das Menü immer angezeigt wird."
"Not compatible with touch screens.": "Nicht kompatibel mit Touchscreens." "Not compatible with touch screens.": "Nicht kompatibel mit Touchscreens."
"Big menu": "Großes Menü" "Big menu": "Großes Menü"
"Live preview": "Live-Vorschau" "Live preview": "Live-Vorschau"
"Open apps in new tab": "Öffne Apps in einem neuen Tab" "Open apps in new tab": "Öffne Anwendungen in einem neuen Tab"
"Use the global setting": "Verwende die globale Einstellung" "Use the global setting": "Verwende die globale Einstellung"
"Use my selection": "Verwende meine Auswahl" "Use my selection": "Verwende meine Auswahl"
"Show and hide the list of applications": "Ein- und Ausblenden der Appliste" "Show and hide the list of applications": "Ein- und Ausblenden der Anwendungsliste"
"Use the avatar instead of the logo": "Avatar anstelle des Logos anzeigen" "Use the avatar instead of the logo": "Avatar anstelle des Logos anzeigen"
"You do not have permission to change the settings.": "Du hast keine Berechtigung, die Einstellungen dieser App zu ändern." "You do not have permission to change the settings.": "Du hast keine Berechtigung,\
\ die Einstellungen dieser Anwendung zu ändern."
"Force this configuration to users": "Konfiguration für alle Benutzer erzwingen" "Force this configuration to users": "Konfiguration für alle Benutzer erzwingen"
"Export the configuration": "Konfiguration exportieren" "Export the configuration": "Konfiguration exportieren"
"Purge the cache": "Cache leeren" "Purge the cache": "Cache leeren"
"Show the link to settings": "Link zu den Einstellungen anzeigen" "Show the link to settings": "Link zu den Einstellungen anzeigen"
"The menu is enabled by default for users": "Das Menü ist standardmäßig für alle Benutzer aktiviert" "The menu is enabled by default for users": "Das Menü ist standardmäßig für alle Benutzer\
"Except when the configuration is forced.": "Gilt nicht, wenn die Konfiguration erzwungen wird." \ aktiviert"
"Apps that should not be displayed in the menu": "Apps, die nicht im Menü angezeigt werden sollen" "Except when the configuration is forced.": "Gilt nicht, wenn die Konfiguration erzwungen\
"This feature is only compatible with the <code>big menu</code> display.": "Kompatibel mit dem <code>großen Menü</code>." \ wird."
"Apps that should not be displayed in the menu": "Anwendungen, die nicht im Menü angezeigt\
\ werden sollen"
"This feature is only compatible with the <code>big menu</code> display.": "Kompatibel\
\ mit dem <code>großen Menü</code>."
"The logo is a link to the default app": "Das Logo ist ein Link zur Standard-App" "The logo is a link to the default app": "Das Logo ist ein Link zur Standard-App"
"Others": "Andere" "Others": "Andere"
"Categories": "Kategorien" "Categories": "Kategorien"
@ -72,25 +89,25 @@
"Name": "Name" "Name": "Name"
"Customed": "Benutzerdefiniert" "Customed": "Benutzerdefiniert"
"Show and hide the list of categories": "Liste der Kategorien ein- und ausblenden" "Show and hide the list of categories": "Liste der Kategorien ein- und ausblenden"
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Diese Optionen werden auf <code>Dark Theme</code> oder <code>Breeze Dark Theme</code> angewendet." "This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Diese\
\ Optionen werden auf <code>Dark Theme</code> oder <code>Breeze Dark Theme</code>\
\ angewendet."
"Dark mode colors": "Farben für den dunklen Modus" "Dark mode colors": "Farben für den dunklen Modus"
"With categories": "Mit Kategorien" "With categories": "Mit Kategorien"
"Custom categories": "Benutzerdefinierte Kategorien" "Custom categories": "Benutzerdefinierte Kategorien"
"Customize application categories": "App-Kategorien anpassen" "Customize application categories": "Anwendungskategorien anpassen"
"Reset to default": "Auf Standard zurücksetzen" "Reset to default": "Auf Standard zurücksetzen"
"Hidden icon": "Verstecktes Symbol" "Hidden icon": "Verstecktes Symbol"
"Small icon": "Kleines Symbol" "Small icon": "Kleines Symbol"
"Normal icon": "Normales Symbol" "Normal icon": "Normales Symbol"
"Big icon": "Großes Icon" "Big icon": "Große Ikone"
"Hidden text": "Versteckter Text" "Hidden text": "Versteckter Text"
"Small text": "Kleiner Text" "Small text": "Kleiner Text"
"Normal text": "Normaler Text" "Normal text": "Normaler Text"
"Big text": "Großer Text" "Big text": "Großer Text"
"Applications": "Apps" "Applications": "Applications"
"Applications kept in the top menu": "Apps in der oberen Navigationsleiste" "Applications kept in the top menu": "Applications kept in the top menu"
"Applications kept in the top menu but also shown in side menu": "Apps in der oberen Navigationsleiste, die auch im Seitenmenü angezeigt werden sollen" "Applications kept in the top menu but also shown in side menu": "Applications kept\
"These applications must be selected in the previous option.": "Diese Apps müssen auch in der vorherigen Einstellung ausgewählt werden." \ in the top menu but also shown in side menu"
"Hide labels on mouse over": "Labels ausblenden, wenn sich die Maus darüber befindet (Hover)" "These applications must be selected in the previous option.": "These applications\
"Except the hovered app": "Except the hovered app" \ must be selected in the previous option."
"Search": "Search"
"Toggle the menu": "Toggle the menu"

View file

@ -1,96 +0,0 @@
"Custom menu": "Menú personalizado"
"Enable the custom menu": "Habilitar el menú personalizado"
"No": "No"
"Yes": "Sí"
"Menu": "Menú"
? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.'
: 'Usa la combinación de teclas <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> para activar y desactivar el menú lateral. Use <span class="keyboard-key">tab</span> para navegar.'
"Top menu": "Menu principal"
"Apps that not must be moved in the side menu": "Aplicaciones que no se deben mover al menú lateral"
"If there is no selection then the global configuration is applied.": "Si no hay selección, se aplica la configuración global."
"Experimental": "En pruebas"
"Save": "Guardar"
"You like this app and you want to support me?": "¿Te gusta esta aplicación y quieres apoyarme?"
"Buy me a coffee ☕": "Cómprame un café ☕"
"Hidden": "Oculto"
"Small": "Pequeño"
"Normal": "Normal"
"Big": "Grande"
"Hidden icon": "Ocultar Icono"
"Small icon": "Icono pequeño"
"Normal icon": "Icono normal"
"Big icon": "Icono grande"
"Hidden text": "Texto oculto"
"Small text": "Texto pequeño"
"Normal text": "Texto normal"
"Big text": "Texto grande"
"Colors": "Colores"
"Background color": "Color de fondo"
"Background color of current app": "Color de fondo de la aplicación actual"
"Text color": "Color del texto"
"Loader": "Cargador"
"Icon": "Icono"
"Same color": "El mismo color"
"Opposite color": "Color opuesto"
"Transparent": "Transparente"
"Opaque": "Opaco"
"Opener": "Abrir"
"Default": "Por defecto"
"Default (dark)": "Por defecto (oscuro)"
"Hamburger": "Hamburguesa"
"Hamburger (dark)": "Hamburger (negro)"
"Hamburger 2": "Hamburguesa 2"
"Hamburger 2 (dark)": "Hamburger 2 (negro)"
"Before the logo": "Antes del logotipo"
"After the logo": "Después del logotipo"
"Position": "Posición"
"Show only the opener (hidden logo)": "Mostrar solo abrir (ocultar logotipo)"
"Do not display the side menu and the opener if there is no application (eg: public pages).": "No mostrar el menú lateral y el abridor si no hay aplicación (por ejemplo: páginas públicas)."
"Panel": "Panel"
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Abra el menú cuando el ratón esté sobre el icono (se desactiva automáticamente en las pantallas táctiles)"
"Display the big menu": "Mostrar el menú grande"
"Display the logo": "Mostrar el logotipo"
"Icons and texts": "Iconos y textos"
"Loader enabled": "Cargador activado"
"Tips": "Consejos"
"Always displayed": "Siempre se muestra"
"This is the automatic behavior when the menu is always displayed.": "Este es el comportamiento automático cuando aún se muestra el menú."
"Not compatible with touch screens.": "No es compatible con las pantallas táctiles."
"Big menu": "Menú grande"
"Live preview": "Previsualización en directo"
"Open apps in new tab": "Abrir las aplicaciones en una nueva pestaña"
"Use the global setting": "Utilizar la configuración global"
"Use my selection": "Utilizar mi selección"
"Show and hide the list of applications": "Mostrar y ocultar la lista de aplicaciones"
"Use the avatar instead of the logo": "Utilizar un avatar en lugar de un logotipo"
"You do not have permission to change the settings.": "No tienes permiso para cambiar la configuración."
"Force this configuration to users": "Forzar esta configuración a todos los usuarios"
"Export the configuration": "Exportar la configuración"
"Purge the cache": "Vaciar la caché"
"Show the link to settings": "Mostrar un enlace a la configuración"
"The menu is enabled by default for users": "El menú está activado por defecto para los usuarios"
"Except when the configuration is forced.": "Excepto cuando la configuración es forzada."
"Apps that should not be displayed in the menu": "Aplicaciones que no deben aparecer en el menú"
"This feature is only compatible with the <code>big menu</code> display.": "Esta función sólo es compatible con la pantalla del <code>menú grande</code>."
"The logo is a link to the default app": "El logotipo es un enlace a la aplicación por defecto"
"Others": "Otros"
"Categories": "Categorías"
"Customize sorting": "Personalizar la clasificación"
"Order by": "Ordenar por"
"Name": "Nombre"
"Customed": "Personalizado"
"Show and hide the list of categories": "Mostrar y ocultar la lista de categorías"
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Estos parámetros se utilizan cuando el tema oscuro o el tema oscuro de Breeze están activados."
"Dark mode colors": "Colores del modo oscuro"
"With categories": "Con categorías"
"Custom categories": "Categorías personalizadas"
"Customize application categories": "Personalizar las categorías de las aplicaciones"
"Reset to default": "Restablecer los valores por defecto"
"Applications": "Aplicaciones"
"Applications kept in the top menu": "Aplicaciones guardadas en el menú superior"
"Applications kept in the top menu but also shown in side menu": "Las aplicaciones se mantienen en el menú superior pero también se muestran en el menú lateral"
"These applications must be selected in the previous option.": "Estas aplicaciones deben ser seleccionadas en las opciones anteriores."
"Hide labels on mouse over": "Ocultar las etiquetas al pasar el ratón"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
"Toggle the menu": "Toggle the menu"

View file

@ -90,7 +90,3 @@
"Applications kept in the top menu": "Applications conservées dans le menu supérieur" "Applications kept in the top menu": "Applications conservées dans le menu supérieur"
"Applications kept in the top menu but also shown in side menu": "Applications conservées dans le menu supérieur mais également affichées dans le menu latéral" "Applications kept in the top menu but also shown in side menu": "Applications conservées dans le menu supérieur mais également affichées dans le menu latéral"
"These applications must be selected in the previous option.": "Ces applications doivent également être sélectionnées dans l'option précédente." "These applications must be selected in the previous option.": "Ces applications doivent également être sélectionnées dans l'option précédente."
"Hide labels on mouse over": "Masquer le libellé des applications au passage de la souris"
"Except the hovered app": "À l'exception de l'application survolée"
"Search": "Rechercher"
"Toggle the menu": "Basculer le menu"

View file

@ -1,96 +0,0 @@
"Custom menu": "Custom menu"
"Enable the custom menu": "Enable the custom menu"
"No": "No"
"Yes": "Yes"
"Menu": "Menu"
? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.'
: 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.'
"Top menu": "Top menu"
"Apps that not must be moved in the side menu": "Apps that not must be moved in the side menu"
"If there is no selection then the global configuration is applied.": "If there is no selection then the global configuration is applied."
"Experimental": "Experimental"
"Save": "Save"
"You like this app and you want to support me?": "You like this app and you want to support me?"
"Buy me a coffee ☕": "Buy me a coffee ☕"
"Hidden": "Hidden"
"Small": "Small"
"Normal": "Normal"
"Big": "Big"
"Hidden icon": "Hidden icon"
"Small icon": "Small icon"
"Normal icon": "Normal icon"
"Big icon": "Big icon"
"Hidden text": "Hidden text"
"Small text": "Small text"
"Normal text": "Normal text"
"Big text": "Big text"
"Colors": "Colors"
"Background color": "Background color"
"Background color of current app": "Background color of current app"
"Text color": "Text color"
"Loader": "Loader"
"Icon": "Icon"
"Same color": "Same color"
"Opposite color": "Opposite color"
"Transparent": "Transparent"
"Opaque": "Opaque"
"Opener": "Opener"
"Default": "Default"
"Default (dark)": "Default (dark)"
"Hamburger": "Hamburger"
"Hamburger (dark)": "Hamburger (dark)"
"Hamburger 2": "Hamburger 2"
"Hamburger 2 (dark)": "Hamburger 2 (dark)"
"Before the logo": "Before the logo"
"After the logo": "After the logo"
"Position": "Position"
"Show only the opener (hidden logo)": "Show only the opener (hidden logo)"
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Do not display the side menu and the opener if there is no application (eg: public pages)."
"Panel": "Panel"
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Open the menu when the mouse is hover the opener (automatically disabled on touch screens)"
"Display the big menu": "Display the big menu"
"Display the logo": "Display the logo"
"Icons and texts": "Icons and texts"
"Loader enabled": "Loader enabled"
"Tips": "Tips"
"Always displayed": "Always displayed"
"This is the automatic behavior when the menu is always displayed.": "This is the automatic behavior when the menu is always displayed."
"Not compatible with touch screens.": "Not compatible with touch screens."
"Big menu": "Big menu"
"Live preview": "Live preview"
"Open apps in new tab": "Open apps in new tab"
"Use the global setting": "Use the global setting"
"Use my selection": "Use my selection"
"Show and hide the list of applications": "Show and hide the list of applications"
"Use the avatar instead of the logo": "Use the avatar instead of the logo"
"You do not have permission to change the settings.": "You do not have permission to change the settings."
"Force this configuration to users": "Force this configuration to users"
"Export the configuration": "Export the configuration"
"Purge the cache": "Purge the cache"
"Show the link to settings": "Show the link to settings"
"The menu is enabled by default for users": "The menu is enabled by default for users"
"Except when the configuration is forced.": "Except when the configuration is forced."
"Apps that should not be displayed in the menu": "Apps that should not be displayed in the menu"
"This feature is only compatible with the <code>big menu</code> display.": "This feature is only compatible with the <code>big menu</code> display."
"The logo is a link to the default app": "The logo is a link to the default app"
"Others": "Others"
"Categories": "Categories"
"Customize sorting": "Customize sorting"
"Order by": "Order by"
"Name": "Name"
"Customed": "Customed"
"Show and hide the list of categories": "Show and hide the list of categories"
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "This parameters are used when Dark theme or Breeze Dark Theme are enabled."
"Dark mode colors": "Dark mode colors"
"With categories": "With categories"
"Custom categories": "Custom categories"
"Customize application categories": "Customize application categories"
"Reset to default": "Reset to default"
"Applications": "Applications"
"Applications kept in the top menu": "Applications kept in the top menu"
"Applications kept in the top menu but also shown in side menu": "Applications kept in the top menu but also shown in side menu"
"These applications must be selected in the previous option.": "These applications must be selected in the previous option."
"Hide labels on mouse over": "Hide labels on mouse over"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
"Toggle the menu": "Toggle the menu"

View file

@ -1,96 +0,0 @@
"Custom menu": "Aangepast menu"
"Enable the custom menu": "Het aangepaste menu inschakelen"
"No": "Nee"
"Yes": "Ja"
"Menu": "Menu"
? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.'
: 'Gebruik de snelkoppeling <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> om het zijmenu te openen en te verbergen. Gebruik <span class="keyboard-key">tab</span> om te navigeren.'
"Top menu": "Bovenste menu"
"Apps that not must be moved in the side menu": "Apps die niet moeten worden verplaatst in het zijmenu"
"If there is no selection then the global configuration is applied.": "Als er geen keuze is, wordt de globale configuratie toegepast."
"Experimental": "Experimenteel"
"Save": "Opslaan"
"You like this app and you want to support me?": "Vind je deze app leuk en wil je me steunen?"
"Buy me a coffee ☕": "Koop een koffie voor me ☕"
"Hidden": "Verborgen"
"Small": "Klein"
"Normal": "Normaal"
"Big": "Groot"
"Hidden icon": "Verborgen icoon"
"Small icon": "Klein icoon"
"Normal icon": "Normaal icoon"
"Big icon": "Groot icoon"
"Hidden text": "Verborgen tekst"
"Small text": "Kleine tekst"
"Normal text": "Normale tekst"
"Big text": "Grote tekst"
"Colors": "Kleuren"
"Background color": "Achtergrond kleur"
"Background color of current app": "Achtergrondkleur van huidige app"
"Text color": "Tekst kleur"
"Loader": "Lader"
"Icon": "Icoon"
"Same color": "Zelfde kleur"
"Opposite color": "Tegenovergestelde kleur"
"Transparent": "Transparant"
"Opaque": "Ondoorzichtig"
"Opener": "Opener"
"Default": "Standaard"
"Default (dark)": "Standaard (donker)"
"Hamburger": "Hamburger"
"Hamburger (dark)": "Hamburger (donker)"
"Hamburger 2": "Hamburger 2"
"Hamburger 2 (dark)": "Hamburger 2 (donker)"
"Before the logo": "Voor het logo"
"After the logo": "Na het logo"
"Position": "Positie"
"Show only the opener (hidden logo)": "Toon alleen de opener (verborgen logo)"
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Geef het zijmenu en de opener niet weer als er geen toepassing is (bijv. openbare pagina's)."
"Panel": "Paneel"
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Open het menu wanneer de muis over de opener gaat (automatisch uitgeschakeld op aanraakschermen)"
"Display the big menu": "Toon het grote menu"
"Display the logo": "Toon het logo"
"Icons and texts": "Iconen en teksten"
"Loader enabled": "Lader ingeschakeld"
"Tips": "Tips"
"Always displayed": "Altijd weergegeven"
"This is the automatic behavior when the menu is always displayed.": "Dit is het automatische gedrag wanneer het menu altijd wordt weergegeven."
"Not compatible with touch screens.": "Niet compatibel met aanraakschermen."
"Big menu": "Groot menu"
"Live preview": "Live voorbeeld"
"Open apps in new tab": "Open apps in nieuwe tab"
"Use the global setting": "Gebruik de globale instellingen"
"Use my selection": "Gebruik mijn selectie"
"Show and hide the list of applications": "De lijst met toepassingen tonen en verbergen"
"Use the avatar instead of the logo": "Gebruik avatar in plaats van het logo"
"You do not have permission to change the settings.": "Je hebt geen toestemming om de instellingen te veranderen."
"Force this configuration to users": "Forceer deze configuratie aan gebruikers"
"Export the configuration": "Exporteer de configuratie"
"Purge the cache": "De cache wissen"
"Show the link to settings": "Toon de link naar de instellingen"
"The menu is enabled by default for users": "Het menu is standaard ingeschakeld voor gebruikers"
"Except when the configuration is forced.": "Behalve als de configuratie geforceerd is."
"Apps that should not be displayed in the menu": "Apps die niet in het menu weergegeven mogen worden"
"This feature is only compatible with the <code>big menu</code> display.": "Deze functie is alleen compatibel met het <code>grote menu</code> scherm."
"The logo is a link to the default app": "Het logo is een link naar de standaard app"
"Others": "Overige"
"Categories": "Categorieën"
"Customize sorting": "Sortering aanpassen"
"Order by": "Sorteer op"
"Name": "Naam"
"Customed": "Aangepast"
"Show and hide the list of categories": "De lijst met categorieën tonen en verbergen"
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Deze parameters worden gebruikt wanneer Dark theme of Breeze Dark Theme zijn ingeschakeld."
"Dark mode colors": "Donkere modus kleuren"
"With categories": "Met categorieën"
"Custom categories": "Aangepaste categorieën"
"Customize application categories": "Toepassingscategorieën aanpassen"
"Reset to default": "Terugzetten naar standaard"
"Applications": "Applicaties"
"Applications kept in the top menu": "Applicaties bewaard in het bovenste menu"
"Applications kept in the top menu but also shown in side menu": "Applicaties blijven in het topmenu maar worden ook in het zijmenu getoond"
"These applications must be selected in the previous option.": "Deze toepassingen moeten bij de vorige optie zijn geselecteerd."
"Hide labels on mouse over": "Hide labels on mouse over"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
"Toggle the menu": "Toggle the menu"

View file

@ -1,94 +0,0 @@
"Custom menu": "Menu personalizado"
"Enable the custom menu": "Habilitar o menu personalizado"
"No": "Não"
"Yes": "Sim"
"Menu": "Menu"
? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.'
: 'Use o atalho <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> para exibir e para esconder o menu lateral. Use <span class="keyboard-key">tab</span> para navegar.'
"Top menu": "Menu superior"
"Apps that not must be moved in the side menu": "Apps que não devem ser movidos para o menu lateral"
"If there is no selection then the global configuration is applied.": "Se não houver seleção, a configuração global será aplicada."
"Experimental": "Experimental"
"Save": "Salvar"
"You like this app and you want to support me?": "Você gosta deste aplicativo e quer me apoiar?"
"Buy me a coffee ☕": "Me pague um café ☕"
"Hidden": "Oculto"
"Small": "Pequeno"
"Normal": "Normal"
"Big": "Grande"
"Hidden icon": "Ícone oculto"
"Small icon": "Ícone pequeno"
"Normal icon": "Ícone normal"
"Big icon": "Ícone grance"
"Hidden text": "Texto oculto"
"Small text": "Texto pequeno"
"Normal text": "Texto normal"
"Big text": "Texto grande"
"Colors": "Cores"
"Background color": "Cor de fundo"
"Background color of current app": "Cor de fundo do app atual"
"Text color": "Cor do texto"
"Loader": "Progresso"
"Icon": "Ícone"
"Same color": "Mesma cor"
"Opposite color": "Cor oposta"
"Transparent": "Transparente"
"Opaque": "Opaco"
"Opener": "Abrir"
"Default": "Padrão"
"Default (dark)": "Padrão (escuro)"
"Hamburger": "Hamburger"
"Hamburger (dark)": "Hamburger (escuro)"
"Hamburger 2": "Hamburger 2"
"Hamburger 2 (dark)": "Hamburger 2 (escuro)"
"Before the logo": "Antes da logo"
"After the logo": "Depois da logo"
"Position": "Posição"
"Show only the opener (hidden logo)": "Mostrar apenas o Abrir (ocultar logo)"
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Não mostrar o menu lateral e o Abrir se não houver aplicação (p.ex. páginas públicas)."
"Panel": "Painel"
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Abrir o menu quando o mouse passar sobre o Abrir (desativado automaticamente em telas de toque)"
"Display the big menu": "Mostrar o menu grande"
"Display the logo": "Mostrar a logo"
"Icons and texts": "Ícones e textos"
"Loader enabled": "Progresso ativado"
"Tips": "Dicas"
"Always displayed": "Sempre visível"
"This is the automatic behavior when the menu is always displayed.": "Este é o comportamento automático quando o menu está sempre visível."
"Not compatible with touch screens.": "Não compatível com telas de toque."
"Big menu": "Menu grande"
"Live preview": "Visualização ao vivo"
"Open apps in new tab": "Abrir apps em nova aba"
"Use the global setting": "Usar configurações globais"
"Use my selection": "Usar minha seleção"
"Show and hide the list of applications": "Mostrar e ocultar a lista de aplicativos"
"Use the avatar instead of the logo": "Use o avatar ao invés da logo"
"You do not have permission to change the settings.": "Você não tem permissão para alterar as configurações."
"Force this configuration to users": "Forçar esta configuração para os usuários"
"Export the configuration": "Exportar a configuração"
"Purge the cache": "Limpar o cache"
"Show the link to settings": "Mostrar o link para configurações"
"The menu is enabled by default for users": "O menu é habilitado por padrão para os usuários"
"Except when the configuration is forced.": "Exceto quando a configuração é forçada."
"Apps that should not be displayed in the menu": "Apps que não devem ser mostrados no menu"
"This feature is only compatible with the <code>big menu</code> display.": "Este recurso só é compatível com a exibição do <code>menu grande</code>."
"The logo is a link to the default app": "A logo é um link para o app padrão"
"Others": "Outros"
"Categories": "Categorias"
"Customize sorting": "Personalizar classificação"
"Order by": "Ordenar por"
"Name": "Nome"
"Customed": "Personalizado"
"Show and hide the list of categories": "Mostrar e esconder a lista de categorias"
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Estes parâmetros são usados quando o tema escuro ou o tema Dark Breeze está ativo."
"Dark mode colors": "Cores do modo escuro"
"With categories": "Com categorias"
"Custom categories": "Categorias personalizadas"
"Customize application categories": "Personalizar categorias de apps"
"Reset to default": "Restaurar padrão"
"Applications": "Aplicativos"
"Applications kept in the top menu": "Aplicativos mantidos no menu superior"
"Applications kept in the top menu but also shown in side menu": "Aplicativos mantidos no menu superior, mas também mostrados no menu lateral"
"These applications must be selected in the previous option.": "Estes aplicativos devem ser selecionados na opção anterior."
"Hide labels on mouse over": "Ocultar descrição ao passar o mouse"
"Toggle the menu": "Toggle the menu"

View file

@ -1,96 +0,0 @@
"Custom menu": "Custom menu"
"Enable the custom menu": "Включить пользовательское меню"
"No": "Нет"
"Yes": "Да"
"Menu": "Меню"
? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.'
: 'Используйте сочетание клавиш <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span>, чтобы открыть или скрыть боковое меню. Используйте <span class="keyboard-key">Tab</span> для навигации.'
"Top menu": "Верхнее меню"
"Apps that not must be moved in the side menu": "Приложения не перемещаемые в боковое меню"
"If there is no selection then the global configuration is applied.": "Если тут ничего не отмечено, применяются глобальные настройки."
"Experimental": "Экспериментальный"
"Save": "Сохранить"
"You like this app and you want to support me?": "Вам нравится приложение или вы хотите поддержать меня?"
"Buy me a coffee ☕": "Купить мне чашку кофе ☕"
"Hidden": "Скрыто"
"Small": "Маленький"
"Normal": "Средний"
"Big": "Большой"
"Hidden icon": "Без иконки"
"Small icon": "Маленькая иконка"
"Normal icon": "Средняя иконка"
"Big icon": "Большая иконка"
"Hidden text": "Без текста"
"Small text": "Маленький текст"
"Normal text": "Средний текст"
"Big text": "Большой текст"
"Colors": "Цвета"
"Background color": "Цвет фона"
"Background color of current app": "Цвет фона выбранного приложения"
"Text color": "Цвет текста"
"Loader": "Загрузчик"
"Icon": "Иконка"
"Same color": "Такой же цвет"
"Opposite color": "Противоположный цвет"
"Transparent": "Прозрачный"
"Opaque": "Непрозрачный"
"Opener": "Открывалка"
"Default": "По умолчанию"
"Default (dark)": "По умолчанию (тёмный)"
"Hamburger": "Гамбургер"
"Hamburger (dark)": "Гамбургер (тёмный)"
"Hamburger 2": "Гамбургер 2"
"Hamburger 2 (dark)": "Гамбургер 2 (тёмный)"
"Before the logo": "Перед логотипом"
"After the logo": "После логотипа"
"Position": "Положение"
"Show only the opener (hidden logo)": "Показать только открывающую часть (скрытый логотип)"
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Не отображать боковое меню и открывалку, если нет приложения (например, публичные страницы)."
"Panel": "Панель"
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Открывать меню при наведении мыши на экран (автоматически отключается на сенсорных экранах)"
"Display the big menu": "Отобразить большое меню"
"Display the logo": "Показать логотип"
"Icons and texts": "Иконки и текст"
"Loader enabled": "Загрузчик включен"
"Tips": "Советы"
"Always displayed": "Всегда отображается"
"This is the automatic behavior when the menu is always displayed.": "This is the automatic behavior when the menu is always displayed."
"Not compatible with touch screens.": "Не совместимо с сенсорными экранами."
"Big menu": "Большое меню"
"Live preview": "Live preview"
"Open apps in new tab": "Открывать приложения в новой вкладке"
"Use the global setting": "Использовать глобальные настройки"
"Use my selection": "Использовать мои настройки"
"Show and hide the list of applications": "Показать или скрыть список приложений"
"Use the avatar instead of the logo": "Использовать аватар вместо логотипа"
"You do not have permission to change the settings.": "У вас нет разрешения изменять настройки."
"Force this configuration to users": "Force this configuration to users"
"Export the configuration": "Экспортировать конфигурацию"
"Purge the cache": "Очистить кэш"
"Show the link to settings": "Показать ссылку на настройки"
"The menu is enabled by default for users": "Это меню включено по умолчанию для пользователей"
"Except when the configuration is forced.": "Except when the configuration is forced."
"Apps that should not be displayed in the menu": "Ппрограммы, скрытые из меню"
"This feature is only compatible with the <code>big menu</code> display.": "This feature is only compatible with the <code>big menu</code> display."
"The logo is a link to the default app": "Логотип открывает приложение по умолчанию"
"Others": "Прочие"
"Categories": "Категории"
"Customize sorting": "Настроить сортировку"
"Order by": "В порядке"
"Name": "Название"
"Customed": "Customed"
"Show and hide the list of categories": "Показать или скрыть список категорий"
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Эти настройки используются темами Тёмная и Тёмная Breeze."
"Dark mode colors": "Цвета тёмной темы"
"With categories": "С категориями"
"Custom categories": "Пользовательские категории"
"Customize application categories": "Изменить категории приложений"
"Reset to default": "Сбросить к значениям по умолчанию"
"Applications": "Приложения"
"Applications kept in the top menu": "Applications kept in the top menu"
"Applications kept in the top menu but also shown in side menu": "Applications kept in the top menu but also shown in side menu"
"These applications must be selected in the previous option.": "These applications must be selected in the previous option."
"Hide labels on mouse over": "Скрыть название при наведении мыши"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
"Toggle the menu": "Toggle the menu"

View file

@ -1,94 +0,0 @@
"Custom menu": "Custom menu"
"Enable the custom menu": "Enable the custom menu"
"No": "No"
"Yes": "Yes"
"Menu": "Menu"
? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.'
: 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.'
"Top menu": "Top menu"
"Apps that not must be moved in the side menu": "Apps that not must be moved in the side menu"
"If there is no selection then the global configuration is applied.": "If there is no selection then the global configuration is applied."
"Experimental": "Experimental"
"Save": "Save"
"You like this app and you want to support me?": "You like this app and you want to support me?"
"Buy me a coffee ☕": "Buy me a coffee ☕"
"Hidden": "Hidden"
"Small": "Small"
"Normal": "Normal"
"Big": "Big"
"Hidden icon": "Hidden icon"
"Small icon": "Small icon"
"Normal icon": "Normal icon"
"Big icon": "Big icon"
"Hidden text": "Hidden text"
"Small text": "Small text"
"Normal text": "Normal text"
"Big text": "Big text"
"Colors": "Colors"
"Background color": "Background color"
"Background color of current app": "Background color of current app"
"Text color": "Text color"
"Loader": "Loader"
"Icon": "Icon"
"Same color": "Same color"
"Opposite color": "Opposite color"
"Transparent": "Transparent"
"Opaque": "Opaque"
"Opener": "Opener"
"Default": "Default"
"Default (dark)": "Default (dark)"
"Hamburger": "Hamburger"
"Hamburger (dark)": "Hamburger (dark)"
"Hamburger 2": "Hamburger 2"
"Hamburger 2 (dark)": "Hamburger 2 (dark)"
"Before the logo": "Before the logo"
"After the logo": "After the logo"
"Position": "Position"
"Show only the opener (hidden logo)": "Show only the opener (hidden logo)"
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Do not display the side menu and the opener if there is no application (eg: public pages)."
"Panel": "Panel"
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Open the menu when the mouse is hover the opener (automatically disabled on touch screens)"
"Display the big menu": "Display the big menu"
"Display the logo": "Display the logo"
"Icons and texts": "Icons and texts"
"Loader enabled": "Loader enabled"
"Tips": "Tips"
"Always displayed": "Always displayed"
"This is the automatic behavior when the menu is always displayed.": "This is the automatic behavior when the menu is always displayed."
"Not compatible with touch screens.": "Not compatible with touch screens."
"Big menu": "Big menu"
"Live preview": "Live preview"
"Open apps in new tab": "Open apps in new tab"
"Use the global setting": "Use the global setting"
"Use my selection": "Use my selection"
"Show and hide the list of applications": "Show and hide the list of applications"
"Use the avatar instead of the logo": "Use the avatar instead of the logo"
"You do not have permission to change the settings.": "You do not have permission to change the settings."
"Force this configuration to users": "Force this configuration to users"
"Export the configuration": "Export the configuration"
"Purge the cache": "Purge the cache"
"Show the link to settings": "Show the link to settings"
"The menu is enabled by default for users": "The menu is enabled by default for users"
"Except when the configuration is forced.": "Except when the configuration is forced."
"Apps that should not be displayed in the menu": "Apps that should not be displayed in the menu"
"This feature is only compatible with the <code>big menu</code> display.": "This feature is only compatible with the <code>big menu</code> display."
"The logo is a link to the default app": "The logo is a link to the default app"
"Others": "Others"
"Categories": "Categories"
"Customize sorting": "Customize sorting"
"Order by": "Order by"
"Name": "Name"
"Customed": "Customed"
"Show and hide the list of categories": "Show and hide the list of categories"
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "This parameters are used when Dark theme or Breeze Dark Theme are enabled."
"Dark mode colors": "Dark mode colors"
"With categories": "With categories"
"Custom categories": "Custom categories"
"Customize application categories": "Customize application categories"
"Reset to default": "Reset to default"
"Applications": "Applications"
"Applications kept in the top menu": "Applications kept in the top menu"
"Applications kept in the top menu but also shown in side menu": "Applications kept in the top menu but also shown in side menu"
"These applications must be selected in the previous option.": "These applications must be selected in the previous option."
"Hide labels on mouse over": "Hide labels on mouse over"
"Toggle the menu": "Toggle the menu"

View file

@ -1,100 +1,94 @@
"Custom menu": "Custom menu" "Custom menu": ""
"Enable the custom menu": "Enable the custom menu" "Enable the custom menu": ""
"No": "No" "No": ""
"Yes": "Yes" "Yes": ""
"Menu": "Menu" "Menu": ""
? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> ? 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span>
to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to
navigate.' navigate.'
: 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> : ''
to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to "Top menu": ""
navigate.' "Apps that not must be moved in the side menu": ""
"Top menu": "Top menu" "If there is no selection then the global configuration is applied.": ""
"Apps that not must be moved in the side menu": "Apps that not must be moved in the side menu" "Experimental": ""
"If there is no selection then the global configuration is applied.": "If there is no selection then the global configuration is applied." "Save": ""
"Experimental": "Experimental" "You like this app and you want to support me?": ""
"Save": "Save" "Buy me a coffee ☕": ""
"You like this app and you want to support me?": "You like this app and you want to support me?" "Hidden": ""
"Buy me a coffee ☕": "Buy me a coffee ☕" "Small": ""
"Hidden": "Hidden" "Normal": ""
"Small": "Small" "Big": ""
"Normal": "Normal" "Hidden icon": ""
"Big": "Big" "Small icon": ""
"Hidden icon": "Hidden icon" "Normal icon": ""
"Small icon": "Small icon" "Big icon": ""
"Normal icon": "Normal icon" "Hidden text": ""
"Big icon": "Big icon" "Small text": ""
"Hidden text": "Hidden text" "Normal text": ""
"Small text": "Small text" "Big text": ""
"Normal text": "Normal text" "Colors": ""
"Big text": "Big text" "Background color": ""
"Colors": "Colors" "Background color of current app": ""
"Background color": "Background color" "Text color": ""
"Background color of current app": "Background color of current app" "Loader": ""
"Text color": "Text color" "Icon": ""
"Loader": "Loader" "Same color": ""
"Icon": "Icon" "Opposite color": ""
"Same color": "Same color" "Transparent": ""
"Opposite color": "Opposite color" "Opaque": ""
"Transparent": "Transparent" "Opener": ""
"Opaque": "Opaque" "Default": ""
"Opener": "Opener" "Default (dark)": ""
"Default": "Default" "Hamburger": ""
"Default (dark)": "Default (dark)" "Hamburger (dark)": ""
"Hamburger": "Hamburger" "Hamburger 2": ""
"Hamburger (dark)": "Hamburger (dark)" "Hamburger 2 (dark)": ""
"Hamburger 2": "Hamburger 2" "Before the logo": ""
"Hamburger 2 (dark)": "Hamburger 2 (dark)" "After the logo": ""
"Before the logo": "Before the logo" "Position": ""
"After the logo": "After the logo" "Show only the opener (hidden logo)": ""
"Position": "Position" "Do not display the side menu and the opener if there is no application (eg: public pages).": ""
"Show only the opener (hidden logo)": "Show only the opener (hidden logo)" "Panel": ""
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Do not display the side menu and the opener if there is no application (eg: public pages)." "Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": ""
"Panel": "Panel" "Display the big menu": ""
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Open the menu when the mouse is hover the opener (automatically disabled on touch screens)" "Display the logo": ""
"Display the big menu": "Display the big menu" "Icons and texts": ""
"Display the logo": "Display the logo" "Loader enabled": ""
"Icons and texts": "Icons and texts" "Tips": ""
"Loader enabled": "Loader enabled" "Always displayed": ""
"Tips": "Tips" "This is the automatic behavior when the menu is always displayed.": ""
"Always displayed": "Always displayed" "Not compatible with touch screens.": ""
"This is the automatic behavior when the menu is always displayed.": "This is the automatic behavior when the menu is always displayed." "Big menu": ""
"Not compatible with touch screens.": "Not compatible with touch screens." "Live preview": ""
"Big menu": "Big menu" "Open apps in new tab": ""
"Live preview": "Live preview" "Use the global setting": ""
"Open apps in new tab": "Open apps in new tab" "Use my selection": ""
"Use the global setting": "Use the global setting" "Show and hide the list of applications": ""
"Use my selection": "Use my selection" "Use the avatar instead of the logo": ""
"Show and hide the list of applications": "Show and hide the list of applications" "You do not have permission to change the settings.": ""
"Use the avatar instead of the logo": "Use the avatar instead of the logo" "Force this configuration to users": ""
"You do not have permission to change the settings.": "You do not have permission to change the settings." "Export the configuration": ""
"Force this configuration to users": "Force this configuration to users" "Purge the cache": ""
"Export the configuration": "Export the configuration" "Show the link to settings": ""
"Purge the cache": "Purge the cache" "The menu is enabled by default for users": ""
"Show the link to settings": "Show the link to settings" "Except when the configuration is forced.": ""
"The menu is enabled by default for users": "The menu is enabled by default for users" "Apps that should not be displayed in the menu": ""
"Except when the configuration is forced.": "Except when the configuration is forced." "This feature is only compatible with the <code>big menu</code> display.": ""
"Apps that should not be displayed in the menu": "Apps that should not be displayed in the menu" "The logo is a link to the default app": ""
"This feature is only compatible with the <code>big menu</code> display.": "This feature is only compatible with the <code>big menu</code> display." "Others": ""
"The logo is a link to the default app": "The logo is a link to the default app" "Categories": ""
"Others": "Others" "Customize sorting": ""
"Categories": "Categories" "Order by": ""
"Customize sorting": "Customize sorting" "Name": ""
"Order by": "Order by" "Customed": ""
"Name": "Name" "Show and hide the list of categories": ""
"Customed": "Customed" "This parameters are used when Dark theme or Breeze Dark Theme are enabled.": ""
"Show and hide the list of categories": "Show and hide the list of categories" "Dark mode colors": ""
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "This parameters are used when Dark theme or Breeze Dark Theme are enabled." "With categories": ""
"Dark mode colors": "Dark mode colors" "Custom categories": ""
"With categories": "With categories" "Customize application categories": ""
"Custom categories": "Custom categories" "Reset to default": ""
"Customize application categories": "Customize application categories" "Applications": ""
"Reset to default": "Reset to default" "Applications kept in the top menu": ""
"Applications": "Applications" "Applications kept in the top menu but also shown in side menu": ""
"Applications kept in the top menu": "Applications kept in the top menu" "These applications must be selected in the previous option.": ""
"Applications kept in the top menu but also shown in side menu": "Applications kept in the top menu but also shown in side menu"
"These applications must be selected in the previous option.": "These applications must be selected in the previous option."
"Hide labels on mouse over": "Hide labels on mouse over"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
"Toggle the menu": "Toggle the menu"

View file

@ -3,8 +3,11 @@
"No": "取消" "No": "取消"
"Yes": "确定" "Yes": "确定"
"Menu": "菜单" "Menu": "菜单"
? "Use the shortcut <span class=\"keyboard-key\">Ctrl</span>+<span class=\"keyboard-key\">o</span> to open and to hide the side menu. Use <span class=\"keyboard-key\">tab</span> to navigate." ? "Use the shortcut <span class=\"keyboard-key\">Ctrl</span>+<span class=\"keyboard-key\"\
: "使用快捷键 <span class=\"keyboard-key\">Ctrl</span>+<span class=\"keyboard-key\">o</span> 打开或隐藏侧边栏菜单。使用<span class=\"keyboard-key\">tab</span> 来导航。" >o</span> to open and to hide the side menu. Use <span class=\"keyboard-key\">tab</span>\
\ to navigate."
: "使用快捷键 <span class=\"keyboard-key\">Ctrl</span>+<span class=\"keyboard-key\">o</span>\
\ 打开或隐藏侧边栏菜单。使用<span class=\"keyboard-key\">tab</span> 来导航。"
"Top menu": "顶部菜单" "Top menu": "顶部菜单"
"Apps that not must be moved in the side menu": "禁止在侧边栏菜单移动的应用" "Apps that not must be moved in the side menu": "禁止在侧边栏菜单移动的应用"
"If there is no selection then the global configuration is applied.": "如不选择,将应用全局设定。" "If there is no selection then the global configuration is applied.": "如不选择,将应用全局设定。"
@ -37,9 +40,11 @@
"After the logo": "在logo后" "After the logo": "在logo后"
"Position": "位置" "Position": "位置"
"Show only the opener (hidden logo)": "只显示容器 (隐藏logo)" "Show only the opener (hidden logo)": "只显示容器 (隐藏logo)"
"Do not display the side menu and the opener if there is no application (eg: public pages).": "N如果没有应用不显示侧边栏菜单和容器 (例如 : 公共页面)。" "Do not display the side menu and the opener if there is no application (eg: public pages).": "N如果没有应用不显示侧边栏菜单和容器\
\ (例如 : 公共页面)。"
"Panel": "面板" "Panel": "面板"
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "鼠标悬停时打开菜单 (触摸屏时将自动禁用)" "Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "鼠标悬停时打开菜单\
\ (触摸屏时将自动禁用)"
"Display the big menu": "显示大型菜单" "Display the big menu": "显示大型菜单"
"Display the logo": "显示logo" "Display the logo": "显示logo"
"Icons and texts": "图标与文字" "Icons and texts": "图标与文字"
@ -88,9 +93,7 @@
"Big text": "大文本" "Big text": "大文本"
"Applications": "Applications" "Applications": "Applications"
"Applications kept in the top menu": "Applications kept in the top menu" "Applications kept in the top menu": "Applications kept in the top menu"
"Applications kept in the top menu but also shown in side menu": "Applications kept in the top menu but also shown in side menu" "Applications kept in the top menu but also shown in side menu": "Applications kept\
"These applications must be selected in the previous option.": "These applications must be selected in the previous option." \ in the top menu but also shown in side menu"
"Hide labels on mouse over": "Hide labels on mouse over" "These applications must be selected in the previous option.": "These applications\
"Except the hovered app": "Except the hovered app" \ must be selected in the previous option."
"Search": "Search"
"Toggle menu": "Toggle menu"

View file

@ -3,13 +3,7 @@ module.exports = (tagName, attributes) => {
if (typeof attributes === 'object') { if (typeof attributes === 'object') {
for (let i in attributes) { for (let i in attributes) {
if (i === 'text') { element.setAttribute(i, attributes[i])
element.textContent = attributes[i]
} else if (i === 'html') {
element.innerHTML = attributes[i]
} else {
element.setAttribute(i, attributes[i])
}
} }
} }

View file

@ -42,14 +42,10 @@
top: 49px; top: 49px;
} }
#side-menu.hide-opener .side-menu-header .side-menu-opener.side-menu-closer { #side-menu.hide-opener .side-menu-header {
visibility: hidden; visibility: hidden;
} }
#side-menu.hide-opener.side-menu-with-categories .side-menu-search {
float: none;
}
<?php if ($_['size-text'] === 'hidden'): ?> <?php if ($_['size-text'] === 'hidden'): ?>
#side-menu, .side-menu-apps-list { #side-menu, .side-menu-apps-list {
<?php if ($_['size-icon'] === 'big'): ?> <?php if ($_['size-icon'] === 'big'): ?>

View file

@ -14,17 +14,12 @@ if ($_['always-displayed']) {
(function() { (function() {
const sideMenuContainer = SMcreateElement('div', {id: 'side-menu-container'}) const sideMenuContainer = SMcreateElement('div', {id: 'side-menu-container'})
const sideMenuOpener = SMcreateElement('button', { const sideMenuOpener = SMcreateElement('button', {'class': 'side-menu-opener'})
'class': 'side-menu-opener',
'arial-label': t('side_menu', 'Toggle the menu'),
'html': `<span>${t('side_menu', 'Toggle the menu')}</span>`
})
const sideMenu = SMcreateElement('div', {id: 'side-menu'}) const sideMenu = SMcreateElement('div', {id: 'side-menu'})
const body = document.querySelector('body') const body = document.querySelector('body')
const html = document.querySelector('html') const html = document.querySelector('html')
const nextcloud = document.querySelector('#nextcloud') const nextcloud = document.querySelector('#nextcloud')
const logo = document.querySelector('.header-left .logo')
const isTouchDevice = window.matchMedia("(pointer: coarse)").matches const isTouchDevice = window.matchMedia("(pointer: coarse)").matches
@ -32,7 +27,6 @@ if ($_['always-displayed']) {
window.topMenuApps = <?php echo json_encode($_['top-menu-apps']), "\n"; ?> window.topMenuApps = <?php echo json_encode($_['top-menu-apps']), "\n"; ?>
window.topSideMenuApps = <?php echo json_encode($_['top-side-menu-apps']), "\n"; ?> window.topSideMenuApps = <?php echo json_encode($_['top-side-menu-apps']), "\n"; ?>
window.menuAppsOrder = <?php echo json_encode($_['apps-order']), "\n"; ?> window.menuAppsOrder = <?php echo json_encode($_['apps-order']), "\n"; ?>
window.topMenuAppsMouseOverHiddenLabel = <?php echo json_encode($_['top-menu-mouse-over-hidden-label']), "\n"; ?>
<?php if ($display === 'big-menu'): ?> <?php if ($display === 'big-menu'): ?>
sideMenu.setAttribute('data-bigmenu', '1') sideMenu.setAttribute('data-bigmenu', '1')
@ -40,15 +34,6 @@ if ($_['always-displayed']) {
sideMenu.setAttribute('data-sidewithcategories', '1') sideMenu.setAttribute('data-sidewithcategories', '1')
<?php endif; ?> <?php endif; ?>
const sideMenuFocus = () => {
let a = document.querySelector('#side-menu .side-menu-app.active a')
|| document.querySelector('#side-menu .side-menu-app a')
if (a) {
a.focus()
}
}
document.querySelector('body').addEventListener('side-menu.apps', (e) => { document.querySelector('body').addEventListener('side-menu.apps', (e) => {
const apps = e.detail.apps; const apps = e.detail.apps;
@ -87,8 +72,20 @@ if ($_['always-displayed']) {
const headerMenuOpener = document.querySelector('#header .side-menu-opener') const headerMenuOpener = document.querySelector('#header .side-menu-opener')
const sideMenuOpener = document.querySelectorAll('#side-menu .side-menu-opener') const sideMenuOpener = document.querySelectorAll('#side-menu .side-menu-opener')
if (!headerMenuOpener) { sideMenuFocus = () => {
return let a = document.querySelector('.side-menu-app.active a', sideMenu)
if (!a) {
return
}
if (a.length === 0) {
a = sideMenu.querySelector('.side-menu-app:first-child a')
}
if (a.length > 0) {
a.focus()
}
} }
<?php if ($_['opener-hover']): ?> <?php if ($_['opener-hover']): ?>
@ -122,8 +119,14 @@ if ($_['always-displayed']) {
headerMenuOpener.addEventListener('click', () => { headerMenuOpener.addEventListener('click', () => {
sideMenu.classList.add('open') sideMenu.classList.add('open')
const a = sideMenu.querySelector('.side-menu-app.active a')
if (a !== null) {
a.focus()
}
headerMenuOpener.blur() headerMenuOpener.blur()
sideMenuFocus()
}) })
for (let opener of sideMenuOpener) { for (let opener of sideMenuOpener) {
@ -170,15 +173,9 @@ if ($_['always-displayed']) {
PageLoader() PageLoader()
<?php endif; ?> <?php endif; ?>
if (nextcloud) { <?php if ($_['opener-position'] === 'before'): ?>
if (logo && logo.parentNode !== nextcloud) { nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud)
nextcloud.appendChild(logo) <?php else: ?>
} nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud.nextSibling)
<?php endif; ?>
<?php if ($_['opener-position'] === 'before'): ?>
nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud)
<?php else: ?>
nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud.nextSibling)
<?php endif; ?>
}
})(); })();

View file

@ -41,10 +41,6 @@ $choicesSizes = [
$labelShowHideApps = 'Show and hide the list of applications'; $labelShowHideApps = 'Show and hide the list of applications';
$labelReset = 'Reset to default'; $labelReset = 'Reset to default';
$labelDefault = 'Default';
$labelWithCategories = 'With categories';
$labelBigMenu = 'Big menu';
$labelAlwaysDisplayed = 'Always displayed';
?> ?>
<div id="side-menu-section"> <div id="side-menu-section">
@ -65,7 +61,7 @@ $labelAlwaysDisplayed = 'Always displayed';
<div> <div>
<label> <label>
<?php p($l->t($labelDefault)); ?> <?php p($l->t('Default')); ?>
</label> </label>
</div> </div>
<p> <p>
@ -74,12 +70,12 @@ $labelAlwaysDisplayed = 'Always displayed';
data-alwaysdiplayed="0" data-alwaysdiplayed="0"
data-bigmenu="0" data-bigmenu="0"
data-sidewithcategories="0" data-sidewithcategories="0"
src="<?php print_unescaped(image_path('side_menu', 'admin/layout-default.svg')); ?>" alt="<?php p($l->t($labelDefault)); ?>"> src="<?php print_unescaped(image_path('side_menu', 'admin/layout-default.svg')); ?>" alt="<?php p($l->t('Default')); ?>">
</p> </p>
<div> <div>
<label> <label>
<?php p($l->t($labelWithCategories)); ?> <?php p($l->t('With categories')); ?>
</label> </label>
</div> </div>
<p> <p>
@ -88,12 +84,12 @@ $labelAlwaysDisplayed = 'Always displayed';
data-alwaysdiplayed="0" data-alwaysdiplayed="0"
data-bigmenu="0" data-bigmenu="0"
data-sidewithcategories="1" data-sidewithcategories="1"
src="<?php print_unescaped(image_path('side_menu', 'admin/layout-side-with-categories.svg')); ?>" alt="<?php p($l->t($labelWithCategories)); ?>"> src="<?php print_unescaped(image_path('side_menu', 'admin/layout-side-with-categories.svg')); ?>" alt="<?php p($l->t('With categories')); ?>">
</p> </p>
<div> <div>
<label for="side-menu-opener"> <label for="side-menu-opener">
<?php p($l->t($labelBigMenu)); ?> <?php p($l->t('Big menu')); ?>
</label> </label>
</div> </div>
<p> <p>
@ -102,12 +98,12 @@ $labelAlwaysDisplayed = 'Always displayed';
data-alwaysdiplayed="0" data-alwaysdiplayed="0"
data-bigmenu="1" data-bigmenu="1"
data-sidewithcategories="0" data-sidewithcategories="0"
src="<?php print_unescaped(image_path('side_menu', 'admin/layout-big-menu.svg')); ?>" alt="<?php p($l->t($labelBigMenu)); ?>"> src="<?php print_unescaped(image_path('side_menu', 'admin/layout-big-menu.svg')); ?>" alt="<?php p($l->t('Big menu')); ?>">
</p> </p>
<div> <div>
<label for="side-menu-opener"> <label for="side-menu-opener">
<?php p($l->t($labelAlwaysDisplayed)); ?> <?php p($l->t('Always displayed')); ?>
</label> </label>
</div> </div>
<p><em><?php p($l->t('Not compatible with touch screens.')); ?></em></p> <p><em><?php p($l->t('Not compatible with touch screens.')); ?></em></p>
@ -117,7 +113,7 @@ $labelAlwaysDisplayed = 'Always displayed';
data-alwaysdiplayed="1" data-alwaysdiplayed="1"
data-bigmenu="0" data-bigmenu="0"
data-sidewithcategories="0" data-sidewithcategories="0"
src="<?php print_unescaped(image_path('side_menu', 'admin/layout-always-displayed.svg')); ?>" alt="<?php p($l->t($labelAlwaysDisplayed)); ?>"> src="<?php print_unescaped(image_path('side_menu', 'admin/layout-always-displayed.svg')); ?>" alt="<?php p($l->t('Always displayed')); ?>">
</p> </p>
<input <input
@ -151,10 +147,10 @@ $labelAlwaysDisplayed = 'Always displayed';
</h2> </h2>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-1"><?php p($l->t('Default')); ?></span>
<span class="badge badge-2"><?php p($l->t($labelWithCategories)); ?></span> <span class="badge badge-2"><?php p($l->t('With categories')); ?></span>
<span class="badge badge-3"><?php p($l->t($labelBigMenu)); ?></span> <span class="badge badge-3"><?php p($l->t('Big menu')); ?></span>
<span class="badge badge-4"><?php p($l->t($labelAlwaysDisplayed)); ?></span> <span class="badge badge-4"><?php p($l->t('Always displayed')); ?></span>
</div> </div>
<div class="side-menu-setting-table"> <div class="side-menu-setting-table">
@ -313,7 +309,7 @@ $labelAlwaysDisplayed = 'Always displayed';
<div class="side-menu-setting-table"> <div class="side-menu-setting-table">
<?php <?php
$choices = [ $choices = [
$labelDefault => 'side-menu-opener', 'Default' => 'side-menu-opener',
'Default (dark)' => 'side-menu-opener-dark', 'Default (dark)' => 'side-menu-opener-dark',
'Hamburger' => 'side-menu-opener-hamburger', 'Hamburger' => 'side-menu-opener-hamburger',
'Hamburger (dark)' => 'side-menu-opener-hamburger-dark', 'Hamburger (dark)' => 'side-menu-opener-hamburger-dark',
@ -342,10 +338,10 @@ $labelAlwaysDisplayed = 'Always displayed';
</h2> </h2>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-1"><?php p($l->t('Default')); ?></span>
<span class="badge badge-2"><?php p($l->t($labelWithCategories)); ?></span> <span class="badge badge-2"><?php p($l->t('With categories')); ?></span>
<span class="badge badge-3"><?php p($l->t($labelBigMenu)); ?></span> <span class="badge badge-3"><?php p($l->t('Big menu')); ?></span>
<span class="badge badge-4"><?php p($l->t($labelAlwaysDisplayed)); ?></span> <span class="badge badge-4"><?php p($l->t('Always displayed')); ?></span>
</div> </div>
<p> <p>
@ -506,7 +502,7 @@ $labelAlwaysDisplayed = 'Always displayed';
<div class="side-menu-setting-table"> <div class="side-menu-setting-table">
<?php <?php
$choices = [ $choices = [
$labelDefault => 'side-menu-opener', 'Default' => 'side-menu-opener',
'Default (dark)' => 'side-menu-opener-dark', 'Default (dark)' => 'side-menu-opener-dark',
'Hamburger' => 'side-menu-opener-hamburger', 'Hamburger' => 'side-menu-opener-hamburger',
'Hamburger (dark)' => 'side-menu-opener-hamburger-dark', 'Hamburger (dark)' => 'side-menu-opener-hamburger-dark',
@ -537,10 +533,10 @@ $labelAlwaysDisplayed = 'Always displayed';
</h2> </h2>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-1"><?php p($l->t('Default')); ?></span>
<span class="badge badge-2"><?php p($l->t($labelWithCategories)); ?></span> <span class="badge badge-2"><?php p($l->t('With categories')); ?></span>
<span class="badge badge-3"><?php p($l->t($labelBigMenu)); ?></span> <span class="badge badge-3"><?php p($l->t('Big menu')); ?></span>
<span class="badge badge-4"><?php p($l->t($labelAlwaysDisplayed)); ?></span> <span class="badge badge-4"><?php p($l->t('Always displayed')); ?></span>
</div> </div>
<div class="side-menu-setting-table"> <div class="side-menu-setting-table">
@ -622,7 +618,7 @@ $labelAlwaysDisplayed = 'Always displayed';
<?php p($l->t('Display the logo')); ?> <?php p($l->t('Display the logo')); ?>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-1"><?php p($l->t('Default')); ?></span>
</div> </div>
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
@ -641,7 +637,7 @@ $labelAlwaysDisplayed = 'Always displayed';
<?php p($l->t('Use the avatar instead of the logo')); ?> <?php p($l->t('Use the avatar instead of the logo')); ?>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-1"><?php p($l->t('Default')); ?></span>
</div> </div>
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
@ -660,7 +656,7 @@ $labelAlwaysDisplayed = 'Always displayed';
<?php p($l->t('The logo is a link to the default app')); ?> <?php p($l->t('The logo is a link to the default app')); ?>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-1"><?php p($l->t('Default')); ?></span>
</div> </div>
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
@ -679,10 +675,8 @@ $labelAlwaysDisplayed = 'Always displayed';
<?php p($l->t('Apps that should not be displayed in the menu')); ?> <?php p($l->t('Apps that should not be displayed in the menu')); ?>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-2"><?php p($l->t('With categories')); ?></span>
<span class="badge badge-2"><?php p($l->t($labelWithCategories)); ?></span> <span class="badge badge-3"><?php p($l->t('Big menu')); ?></span>
<span class="badge badge-3"><?php p($l->t($labelBigMenu)); ?></span>
<span class="badge badge-4"><?php p($l->t($labelAlwaysDisplayed)); ?></span>
</div> </div>
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
@ -804,10 +798,10 @@ $labelAlwaysDisplayed = 'Always displayed';
</h2> </h2>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-1"><?php p($l->t('Default')); ?></span>
<span class="badge badge-2"><?php p($l->t($labelWithCategories)); ?></span> <span class="badge badge-2"><?php p($l->t('With categories')); ?></span>
<span class="badge badge-3"><?php p($l->t($labelBigMenu)); ?></span> <span class="badge badge-3"><?php p($l->t('Big menu')); ?></span>
<span class="badge badge-4"><?php p($l->t($labelAlwaysDisplayed)); ?></span> <span class="badge badge-4"><?php p($l->t('Always displayed')); ?></span>
</div> </div>
<div class="side-menu-setting-table"> <div class="side-menu-setting-table">
@ -874,26 +868,6 @@ $labelAlwaysDisplayed = 'Always displayed';
</div> </div>
</div> </div>
</div> </div>
<div class="side-menu-setting-row">
<div class="side-menu-setting-label">
<?php p($l->t('Hide labels on mouse over')); ?>
</div>
<?php
$choices = array_merge(
$choicesYesNo,
['Except the hovered app' => '2']
);
?>
<div class="side-menu-setting-form">
<select id="side-menu-top-menu-mouse-over-hidden-label" name="top-menu-mouse-over-hidden-label" class="side-menu-setting">
<?php foreach ($choices as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['top-menu-mouse-over-hidden-label']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
</option>
<?php endforeach; ?>
</select>
</div>
</div>
</div> </div>
</div> </div>
@ -903,10 +877,10 @@ $labelAlwaysDisplayed = 'Always displayed';
</h2> </h2>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-1"><?php p($l->t('Default')); ?></span>
<span class="badge badge-2"><?php p($l->t($labelWithCategories)); ?></span> <span class="badge badge-2"><?php p($l->t('With categories')); ?></span>
<span class="badge badge-3"><?php p($l->t($labelBigMenu)); ?></span> <span class="badge badge-3"><?php p($l->t('Big menu')); ?></span>
<span class="badge badge-4"><?php p($l->t($labelAlwaysDisplayed)); ?></span> <span class="badge badge-4"><?php p($l->t('Always displayed')); ?></span>
</div> </div>
<div class="side-menu-setting-table"> <div class="side-menu-setting-table">
@ -950,8 +924,8 @@ $labelAlwaysDisplayed = 'Always displayed';
</h2> </h2>
<div class="badges"> <div class="badges">
<span class="badge badge-2"><?php p($l->t($labelWithCategories)); ?></span> <span class="badge badge-2"><?php p($l->t('With categories')); ?></span>
<span class="badge badge-3"><?php p($l->t($labelBigMenu)); ?></span> <span class="badge badge-3"><?php p($l->t('Big menu')); ?></span>
</div> </div>
<div class="side-menu-setting-table"> <div class="side-menu-setting-table">
@ -977,7 +951,7 @@ $labelAlwaysDisplayed = 'Always displayed';
</div> </div>
<div class="side-menu-setting-row"> <div class="side-menu-setting-row">
<div class="side-menu-setting-label side-menu-setting-label--top"> <div class="side-menu-setting-label">
<?php p($l->t('Custom categories')); ?> <?php p($l->t('Custom categories')); ?>
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
@ -1065,10 +1039,10 @@ $labelAlwaysDisplayed = 'Always displayed';
</h2> </h2>
<div class="badges"> <div class="badges">
<span class="badge badge-1"><?php p($l->t($labelDefault)); ?></span> <span class="badge badge-1"><?php p($l->t('Default')); ?></span>
<span class="badge badge-2"><?php p($l->t($labelWithCategories)); ?></span> <span class="badge badge-2"><?php p($l->t('With categories')); ?></span>
<span class="badge badge-3"><?php p($l->t($labelBigMenu)); ?></span> <span class="badge badge-3"><?php p($l->t('Big menu')); ?></span>
<span class="badge badge-4"><?php p($l->t($labelAlwaysDisplayed)); ?></span> <span class="badge badge-4"><?php p($l->t('Always displayed')); ?></span>
</div> </div>
<p> <p>
@ -1115,19 +1089,19 @@ $labelAlwaysDisplayed = 'Always displayed';
</div> </div>
<div class="section" id="more"> <div class="section" id="more">
<button id="side-menu-save" class="btn btn-info" arial-label="<?php p($l->t('Save')); ?>"> <button id="side-menu-save" class="btn btn-info">
<?php p($l->t('Save')); ?> <?php p($l->t('Save')); ?>
<progress max="100" value="0" id="side-menu-save-progress"></progress> <progress max="100" value="0" id="side-menu-save-progress"></progress>
</button> </button>
<a href="<?php echo $urlGenerator->linkToRoute('side_menu.AdminSetting.exportConfiguration') ?>" target="_blank" rel="noopener"> <a href="<?php echo $urlGenerator->linkToRoute('side_menu.AdminSetting.exportConfiguration') ?>" target="_blank" rel="noopener">
<button class="btn btn-primary" arial-label="<?php p($l->t('Export the configuration')); ?>"> <button class="btn btn-primary" >
<?php p($l->t('Export the configuration')); ?> <?php p($l->t('Export the configuration')); ?>
</button> </button>
</a> </a>
<a href="<?php echo $urlGenerator->linkToRoute('side_menu.AdminSetting.removeCache') ?>"> <a href="<?php echo $urlGenerator->linkToRoute('side_menu.AdminSetting.removeCache') ?>">
<button class="btn btn-primary" arial-label="<?php p($l->t('Purge the cache')); ?>"> <button class="btn btn-primary" >
<?php p($l->t('Purge the cache')); ?> (<?php echo $cacheSize ?> Kb) <?php p($l->t('Purge the cache')); ?> (<?php echo $cacheSize ?> Kb)
</button> </button>
</a> </a>
@ -1139,7 +1113,7 @@ $labelAlwaysDisplayed = 'Always displayed';
<?php p($l->t('You like this app and you want to support me?')); ?> <?php p($l->t('You like this app and you want to support me?')); ?>
<a style="margin-left: 10px" target="_blank" href="https://www.buymeacoffee.com/deblan" rel="noopener"> <a style="margin-left: 10px" target="_blank" href="https://www.buymeacoffee.com/deblan" rel="noopener">
<button arial-label="<?php p($l->t('Buy me a coffee ☕')); ?>"> <button>
<?php p($l->t('Buy me a coffee ☕')); ?> <?php p($l->t('Buy me a coffee ☕')); ?>
</button> </button>
</a> </a>

View file

@ -240,7 +240,7 @@ $labelReset = 'Reset to default';
<div class="section"> <div class="section">
<?php if (!$_['force']): ?> <?php if (!$_['force']): ?>
<button id="side-menu-save" class="btn btn-info" arial-label="<?php p($l->t('Save')); ?>"> <button id="side-menu-save" class="btn btn-info">
<?php p($l->t('Save')); ?> <?php p($l->t('Save')); ?>
<progress max="100" value="0" id="side-menu-save-progress"></progress> <progress max="100" value="0" id="side-menu-save-progress"></progress>
</button> </button>
@ -255,7 +255,7 @@ $labelReset = 'Reset to default';
<?php p($l->t('You like this app and you want to support me?')); ?> <?php p($l->t('You like this app and you want to support me?')); ?>
<a style="margin-left: 10px" target="_blank" href="https://www.buymeacoffee.com/deblan" rel="noopener"> <a style="margin-left: 10px" target="_blank" href="https://www.buymeacoffee.com/deblan" rel="noopener">
<button arial-label="<?php p($l->t('Buy me a coffee ☕')); ?>"> <button>
<?php p($l->t('Buy me a coffee ☕')); ?> <?php p($l->t('Buy me a coffee ☕')); ?>
</button> </button>
</a> </a>