diff --git a/appinfo/app.php b/appinfo/app.php
index 86a3245..7c48ca1 100644
--- a/appinfo/app.php
+++ b/appinfo/app.php
@@ -1,71 +1,10 @@
.
- */
+use OCA\SideMenu\AppInfo\Application;
-namespace OCA\SideMenu\Appinfo;
+$app = new Application();
-use OC\Security\CSP\ContentSecurityPolicy;
-use OCP\Util;
-use OCP\IUserSession;
-
-$config = \OC::$server->getConfig();
-$cspnm = \OC::$server->getContentSecurityPolicyNonceManager();
-$user = \OC::$server[IUserSession::class]->getUser();
-
-$enabled = true;
-
-if ($user !== null) {
- $enabled = (bool) $config->getUserValue($user->getUid(), 'side_menu', 'enabled', '1');
-}
-
-if ($enabled) {
- Util::addScript('side_menu', 'sideMenu');
- Util::addStyle('side_menu', 'sideMenu');
-
- $stylesheet = \OC::$server->getURLGenerator()->linkToRoute(
- 'side_menu.Css.stylesheet',
- [
- 'v' => $config->getAppValue('side_menu', 'cache', '0'),
- ]
- );
-
- $script = \OC::$server->getURLGenerator()->linkToRoute(
- 'side_menu.Js.script',
- [
- 'v' => $config->getAppValue('side_menu', 'cache', '0'),
- ]
- );
-
- Util::addHeader(
- 'link',
- [
- 'href' => $stylesheet,
- 'rel' => 'stylesheet'
- ],
- ''
- );
-
- Util::addHeader(
- 'script',
- [
- 'src' => $script,
- 'nonce' => $cspnm->getNonce(),
- ],
- ''
- );
+if ($app->isEnabled()) {
+ $app->registerAssets();
+ $app->registerServices();
}
diff --git a/appinfo/info.xml b/appinfo/info.xml
index cdb3422..2541f1f 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -15,7 +15,7 @@ You can report a bug or request a feature by opening an issue.
]]>
agpl
Simon Vieille
- 1.7.0
+ 1.8.0-rc1
SideMenu
customization
https://gitnet.fr/deblan/side_menu
diff --git a/appinfo/routes.php b/appinfo/routes.php
index dc82109..be3ae60 100644
--- a/appinfo/routes.php
+++ b/appinfo/routes.php
@@ -21,6 +21,7 @@ return [
'routes' => [
['name' => 'Css#stylesheet', 'url' => '/css/stylesheet', 'verb' => 'GET'],
['name' => 'Js#script', 'url' => '/js/script', 'verb' => 'GET'],
+ ['name' => 'Nav#items', 'url' => '/nav/items', 'verb' => 'GET'],
['name' => 'PersonalSetting#valueSet', 'url' => '/personalSetting/valueSet', 'verb' => 'POST'],
],
];
diff --git a/css/admin.css b/css/admin.css
index 8c59876..6532ea0 100644
--- a/css/admin.css
+++ b/css/admin.css
@@ -20,6 +20,11 @@
margin: 10px 0 10px 0;
}
+#side-menu-section input[type="checkbox"] {
+ vertical-align: middle;
+}
+
+
#side-menu-section select {
margin: 10px 0 10px 0;
}
@@ -32,3 +37,5 @@
color: #555;
border-radius: 3px;
}
+
+
diff --git a/css/sideMenu.css b/css/sideMenu.css
index b4c41c1..df705a4 100644
--- a/css/sideMenu.css
+++ b/css/sideMenu.css
@@ -122,3 +122,68 @@
width: 0;
transition-property: width;
}
+
+#side-menu.side-menu-big {
+ max-width: 100%;
+ height: auto;
+}
+
+.side-menu-big .side-menu-header {
+ height: auto;
+}
+
+.side-menu-big .side-menu-apps-list {
+ height: auto;
+ position: static;
+ max-width: 100vw;
+ overflow: auto;
+}
+
+.side-menu-big .side-menu-app a {
+ padding: 7px 0 7px 7px;
+}
+
+.side-menu-categories-wrapper {
+ padding-bottom: 70px;
+}
+
+.side-menu-categories {
+ max-height: calc(100vh - 50px);
+ overflow: auto;
+ position: relative;
+ top: 50px;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ padding: 0 10% 0 10%;
+}
+
+.side-menu-category {
+ padding: 10px 20px;
+ flex: 1 1 auto;
+}
+
+.side-menu-category-title {
+ padding-left: 10px;
+ color: var(--side-menu-text-color, #fff);
+}
+
+.side-menu-big .side-menu-app-icon {
+ vertical-align: middle;
+ margin-top: -2px;
+}
+
+@media screen and (max-width: 1024px) {
+ .side-menu-categories {
+ display: block;
+ padding: 0;
+ }
+
+ .side-menu-category {
+ padding: 10px 0;
+ }
+
+ #side-menu.side-menu-big {
+ height: 100vh;
+ }
+}
diff --git a/l10n/ar.js b/l10n/ar.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/ar.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/ar.json b/l10n/ar.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/ar.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/ast.js b/l10n/ast.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/ast.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/ast.json b/l10n/ast.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/ast.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/bg.js b/l10n/bg.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/bg.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/bg.json b/l10n/bg.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/bg.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/ca.js b/l10n/ca.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/ca.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/ca.json b/l10n/ca.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/ca.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/cs.js b/l10n/cs.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/cs.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/cs.json b/l10n/cs.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/cs.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/da.js b/l10n/da.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/da.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/da.json b/l10n/da.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/da.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/de.js b/l10n/de.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/de.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/de.json b/l10n/de.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/de.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/de_DE.js b/l10n/de_DE.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/de_DE.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/de_DE.json b/l10n/de_DE.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/de_DE.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/el.js b/l10n/el.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/el.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/el.json b/l10n/el.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/el.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/en_GB.js b/l10n/en_GB.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/en_GB.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/en_GB.json b/l10n/en_GB.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/en_GB.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/eo.js b/l10n/eo.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/eo.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/eo.json b/l10n/eo.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/eo.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es.js b/l10n/es.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es.json b/l10n/es.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_419.js b/l10n/es_419.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_419.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_419.json b/l10n/es_419.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_419.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_CL.js b/l10n/es_CL.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_CL.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_CL.json b/l10n/es_CL.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_CL.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_CO.js b/l10n/es_CO.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_CO.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_CO.json b/l10n/es_CO.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_CO.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_CR.js b/l10n/es_CR.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_CR.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_CR.json b/l10n/es_CR.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_CR.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_DO.js b/l10n/es_DO.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_DO.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_DO.json b/l10n/es_DO.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_DO.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_EC.js b/l10n/es_EC.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_EC.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_EC.json b/l10n/es_EC.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_EC.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_GT.js b/l10n/es_GT.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_GT.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_GT.json b/l10n/es_GT.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_GT.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_HN.js b/l10n/es_HN.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_HN.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_HN.json b/l10n/es_HN.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_HN.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_MX.js b/l10n/es_MX.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_MX.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_MX.json b/l10n/es_MX.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_MX.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_NI.js b/l10n/es_NI.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_NI.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_NI.json b/l10n/es_NI.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_NI.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_PA.js b/l10n/es_PA.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_PA.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_PA.json b/l10n/es_PA.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_PA.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_PE.js b/l10n/es_PE.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_PE.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_PE.json b/l10n/es_PE.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_PE.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_PR.js b/l10n/es_PR.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_PR.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_PR.json b/l10n/es_PR.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_PR.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_PY.js b/l10n/es_PY.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_PY.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_PY.json b/l10n/es_PY.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_PY.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_SV.js b/l10n/es_SV.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_SV.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_SV.json b/l10n/es_SV.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_SV.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/es_UY.js b/l10n/es_UY.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/es_UY.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/es_UY.json b/l10n/es_UY.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/es_UY.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/et_EE.js b/l10n/et_EE.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/et_EE.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/et_EE.json b/l10n/et_EE.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/et_EE.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/eu.js b/l10n/eu.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/eu.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/eu.json b/l10n/eu.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/eu.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/fa.js b/l10n/fa.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/fa.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/fa.json b/l10n/fa.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/fa.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/fi.js b/l10n/fi.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/fi.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/fi.json b/l10n/fi.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/fi.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/fr.js b/l10n/fr.js
new file mode 100644
index 0000000..6c21d05
--- /dev/null
+++ b/l10n/fr.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Menu latéral",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
diff --git a/l10n/fr.json b/l10n/fr.json
new file mode 100644
index 0000000..6b18273
--- /dev/null
+++ b/l10n/fr.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Menu latéral"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
diff --git a/l10n/gl.js b/l10n/gl.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/gl.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/gl.json b/l10n/gl.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/gl.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/he.js b/l10n/he.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/he.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/he.json b/l10n/he.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/he.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/hr.js b/l10n/hr.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/hr.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/hr.json b/l10n/hr.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/hr.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/hu.js b/l10n/hu.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/hu.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/hu.json b/l10n/hu.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/hu.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/is.js b/l10n/is.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/is.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/is.json b/l10n/is.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/is.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/it.js b/l10n/it.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/it.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/it.json b/l10n/it.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/it.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/ja.js b/l10n/ja.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/ja.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/ja.json b/l10n/ja.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/ja.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/ka_GE.js b/l10n/ka_GE.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/ka_GE.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/ka_GE.json b/l10n/ka_GE.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/ka_GE.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/ko.js b/l10n/ko.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/ko.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/ko.json b/l10n/ko.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/ko.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/lt_LT.js b/l10n/lt_LT.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/lt_LT.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/lt_LT.json b/l10n/lt_LT.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/lt_LT.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/lv.js b/l10n/lv.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/lv.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/lv.json b/l10n/lv.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/lv.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/nb.js b/l10n/nb.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/nb.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/nb.json b/l10n/nb.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/nb.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/nl.js b/l10n/nl.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/nl.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/nl.json b/l10n/nl.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/nl.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/nn_NO.js b/l10n/nn_NO.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/nn_NO.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/nn_NO.json b/l10n/nn_NO.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/nn_NO.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/pl.js b/l10n/pl.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/pl.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/pl.json b/l10n/pl.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/pl.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/pt_BR.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/pt_BR.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/pt_PT.js b/l10n/pt_PT.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/pt_PT.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/pt_PT.json b/l10n/pt_PT.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/pt_PT.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/ro.js b/l10n/ro.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/ro.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/ro.json b/l10n/ro.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/ro.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/ru.js b/l10n/ru.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/ru.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/ru.json b/l10n/ru.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/ru.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/sk.js b/l10n/sk.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/sk.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/sk.json b/l10n/sk.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/sk.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/sl.js b/l10n/sl.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/sl.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/sl.json b/l10n/sl.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/sl.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/sr.js b/l10n/sr.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/sr.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/sr.json b/l10n/sr.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/sr.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/sv.js b/l10n/sv.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/sv.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/sv.json b/l10n/sv.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/sv.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/tr.js b/l10n/tr.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/tr.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/tr.json b/l10n/tr.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/tr.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/uk.js b/l10n/uk.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/uk.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/uk.json b/l10n/uk.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/uk.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/vi.js b/l10n/vi.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/vi.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/vi.json b/l10n/vi.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/vi.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/zh_CN.js b/l10n/zh_CN.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/zh_CN.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/zh_CN.json b/l10n/zh_CN.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/zh_CN.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/l10n/zh_TW.js b/l10n/zh_TW.js
new file mode 100644
index 0000000..ade1ef4
--- /dev/null
+++ b/l10n/zh_TW.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "side_menu",
+ {
+ "Side menu": "Side menu",
+ },
+ "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+);
\ No newline at end of file
diff --git a/l10n/zh_TW.json b/l10n/zh_TW.json
new file mode 100644
index 0000000..a091038
--- /dev/null
+++ b/l10n/zh_TW.json
@@ -0,0 +1,6 @@
+{
+ "translations": {
+ "Side menu": "Side menu"
+ },
+ "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+}
\ No newline at end of file
diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php
new file mode 100644
index 0000000..35671c1
--- /dev/null
+++ b/lib/AppInfo/Application.php
@@ -0,0 +1,114 @@
+
+ */
+class Application extends App
+{
+ /**
+ * @var OC\AllConfig
+ */
+ protected $config;
+
+ /**
+ * @var ContentSecurityPolicyNonceManager
+ */
+ protected $cspnm;
+
+ /**
+ * @var User
+ */
+ protected $user;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct(array $urlParams = [])
+ {
+ parent::__construct('side_menu', $urlParams);
+
+ $this->config = OC::$server->getConfig();
+ $this->cspnm = OC::$server->getContentSecurityPolicyNonceManager();
+ $this->user = OC::$server[IUserSession::class]->getUser();
+ }
+
+ /**
+ * Checks if this app is enabled.
+ */
+ public function isEnabled(): bool
+ {
+ $enabled = true;
+
+ if (null !== $this->user) {
+ $enabled = (bool) $this->config->getUserValue($this->user->getUid(), 'side_menu', 'enabled', '1');
+ }
+
+ return $enabled;
+ }
+
+ /**
+ * Registes services.
+ */
+ public function registerServices()
+ {
+ $container = $this->getContainer();
+
+ $container->registerService('AppRepository', function (ContainerInterface $c) {
+ return new AppRepository(new OC_App());
+ });
+ }
+
+ /**
+ * Registers assets.
+ */
+ public function registerAssets()
+ {
+ Util::addScript('side_menu', 'sideMenu');
+ Util::addStyle('side_menu', 'sideMenu');
+
+ $stylesheet = OC::$server->getURLGenerator()->linkToRoute(
+ 'side_menu.Css.stylesheet',
+ [
+ 'v' => $this->config->getAppValue('side_menu', 'cache', '0'),
+ ]
+ );
+
+ $script = OC::$server->getURLGenerator()->linkToRoute(
+ 'side_menu.Js.script',
+ [
+ 'v' => $this->config->getAppValue('side_menu', 'cache', '0'),
+ ]
+ );
+
+ Util::addHeader(
+ 'link',
+ [
+ 'href' => $stylesheet,
+ 'rel' => 'stylesheet',
+ ],
+ ''
+ );
+
+ Util::addHeader(
+ 'script',
+ [
+ 'src' => $script,
+ 'nonce' => $this->cspnm->getNonce(),
+ ],
+ ''
+ );
+ }
+}
diff --git a/lib/Controller/CssController.php b/lib/Controller/CssController.php
index b950115..b06ff49 100644
--- a/lib/Controller/CssController.php
+++ b/lib/Controller/CssController.php
@@ -18,15 +18,16 @@
namespace OCA\SideMenu\Controller;
+use OC;
use OCP\AppFramework\Controller;
-use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\Response;
+use OCP\AppFramework\Http\TemplateResponse;
use OCP\IConfig;
use OCP\IRequest;
+use OCP\IUserSession;
class CssController extends Controller
{
-
/**
* @var \OCP\IConfig
*/
@@ -34,8 +35,6 @@ class CssController extends Controller
/**
* @param string $appName
- * @param IRequest $request
- * @param IConfig $config
*/
public function __construct($appName, IRequest $request, IConfig $config)
{
@@ -56,6 +55,17 @@ class CssController extends Controller
$backgroundColor = $this->config->getAppValue('side_menu', 'background-color', '#333333');
$backgroundColorTo = $this->config->getAppValue('side_menu', 'background-color-to', $backgroundColor);
+ $user = OC::$server[IUserSession::class]->getUser();
+ $topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true);
+
+ if ($user) {
+ $userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true);
+
+ if (!empty($userTopMenuApps)) {
+ $topMenuApps = $userTopMenuApps;
+ }
+ }
+
$parameters = [
'vars' => [
'background-color' => $backgroundColor,
@@ -70,6 +80,8 @@ class CssController extends Controller
'external-sites-in-top-menu' => (bool) $this->config->getAppValue('side_menu', 'external-sites-in-top-menu', 0),
'size-icon' => $this->config->getAppValue('side_menu', 'size-icon', 'normal'),
'size-text' => $this->config->getAppValue('side_menu', 'size-text', 'normal'),
+ 'big-menu' => (bool) $this->config->getAppValue('side_menu', 'big-menu', '0'),
+ 'top-menu-apps' => $topMenuApps,
];
$response = new TemplateResponse('side_menu', 'css/stylesheet', $parameters, 'blank');
diff --git a/lib/Controller/JsController.php b/lib/Controller/JsController.php
index 49eee72..71667b8 100644
--- a/lib/Controller/JsController.php
+++ b/lib/Controller/JsController.php
@@ -18,15 +18,16 @@
namespace OCA\SideMenu\Controller;
+use OC;
use OCP\AppFramework\Controller;
-use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\Response;
+use OCP\AppFramework\Http\TemplateResponse;
use OCP\IConfig;
use OCP\IRequest;
+use OCP\IUserSession;
class JsController extends Controller
{
-
/**
* @var \OCP\IConfig
*/
@@ -34,8 +35,6 @@ class JsController extends Controller
/**
* @param string $appName
- * @param IRequest $request
- * @param IConfig $config
*/
public function __construct($appName, IRequest $request, IConfig $config)
{
@@ -53,6 +52,17 @@ class JsController extends Controller
*/
public function script()
{
+ $user = OC::$server[IUserSession::class]->getUser();
+ $topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true);
+
+ if ($user) {
+ $userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true);
+
+ if (!empty($userTopMenuApps)) {
+ $topMenuApps = $userTopMenuApps;
+ }
+ }
+
$parameters = [
'opener-position' => $this->config->getAppValue('side_menu', 'opener-position', 'before'),
'opener-hover' => (bool) $this->config->getAppValue('side_menu', 'opener-hover', '0'),
@@ -60,6 +70,8 @@ class JsController extends Controller
'force-light-icon' => (bool) $this->config->getAppValue('side_menu', 'force-light-icon', '0'),
'hide-when-no-apps' => (bool) $this->config->getAppValue('side_menu', 'hide-when-no-apps', '0'),
'loader-enabled' => (bool) $this->config->getAppValue('side_menu', 'loader-enabled', '1'),
+ 'big-menu' => (bool) $this->config->getAppValue('side_menu', 'big-menu', '0'),
+ 'top-menu-apps' => $topMenuApps,
];
$response = new TemplateResponse('side_menu', 'js/script', $parameters, 'blank');
diff --git a/lib/Controller/NavController.php b/lib/Controller/NavController.php
new file mode 100644
index 0000000..4e0751c
--- /dev/null
+++ b/lib/Controller/NavController.php
@@ -0,0 +1,202 @@
+.
+ */
+
+namespace OCA\SideMenu\Controller;
+
+use OC;
+use OC\App\AppStore\Fetcher\CategoryFetcher;
+use OC\URLGenerator;
+use OCA\SideMenu\Service\AppRepository;
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http\JSONResponse;
+use OCP\IConfig;
+use OCP\IL10N;
+use OCP\IRequest;
+use OCP\IUserSession;
+use OCP\L10N\IFactory;
+
+class NavController extends Controller
+{
+ /**
+ * @var IConfig
+ */
+ protected $config;
+
+ /**
+ * @var AppRepository
+ */
+ protected $appRepository;
+
+ /**
+ * @var IFactory
+ */
+ protected $l10nFactory;
+
+ /**
+ * @var CategoryFetcher
+ */
+ protected $categoryFetcher;
+
+ /**
+ * @var URLGenerator
+ */
+ protected $router;
+
+ /**
+ * @param string $appName
+ */
+ public function __construct(
+ $appName,
+ IRequest $request,
+ IConfig $config,
+ AppRepository $appRepository,
+ CategoryFetcher $categoryFetcher,
+ URLGenerator $router,
+ IL10N $trans,
+ IFactory $l10nFactory)
+ {
+ parent::__construct($appName, $request);
+
+ $this->config = $config;
+ $this->appRepository = $appRepository;
+ $this->categoryFetcher = $categoryFetcher;
+ $this->l10nFactory = $l10nFactory;
+ $this->router = $router;
+ }
+
+ /**
+ * @NoAdminRequired
+ * @NoCSRFRequired
+ * @PublicPage
+ *
+ * @return JSONResponse
+ */
+ public function items()
+ {
+ $apps = $this->appRepository->getVisibleApps();
+ $currentLanguage = substr($this->l10nFactory->findLanguage(), 0, 2);
+ $categoriesLabels = $this->categoryFetcher->get();
+ $externalSitesInTopMenu = (bool) $this->config->getAppValue('side_menu', 'external-sites-in-top-menu', 0);
+ $user = OC::$server[IUserSession::class]->getUser();
+ $appsCategories = [];
+ $categoriesAppsCount = [];
+ $items = [];
+
+ if (!$user) {
+ return new JSONResponse([
+ 'items' => $items,
+ ]);
+ }
+
+ $topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true);
+ $userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true);
+
+ if (!empty($userTopMenuApps)) {
+ $topMenuApps = $userTopMenuApps;
+ }
+
+ foreach ($categoriesLabels as $k => $category) {
+ $categoriesLabels[$category['id']] = $category['translations'][$currentLanguage]['name'] ?? $category['translations']['en']['name'];
+
+ unset($categoriesLabels[$k]);
+ }
+
+ $categoriesLabels['external_links'] = $this->l10nFactory->get('external')->t('External sites');
+
+ $items['other'] = [
+ 'name' => '',
+ 'apps' => [],
+ ];
+
+ foreach ($apps as $app) {
+ if (in_array($app['id'], $topMenuApps)) {
+ continue;
+ }
+
+ $categories = (array) $app['category'];
+ $appsCategories[$app['id']] = [];
+
+ if (empty($categories)) {
+ $categories = ['other'];
+ }
+
+ foreach ($categories as $category) {
+ if (!isset($items[$category])) {
+ $items[$category] = [
+ 'name' => $categoriesLabels[$category],
+ 'apps' => [],
+ ];
+ }
+
+ if (!isset($categoriesAppsCount[$category])) {
+ $categoriesAppsCount[$category] = 0;
+ }
+
+ ++$categoriesAppsCount[$category];
+
+ $appsCategories[$app['id']][] = $category;
+
+ $items[$category]['apps'][$app['id']] = [
+ 'name' => $app['name'],
+ 'href' => $this->router->linkTo($app['id'], ''),
+ 'icon' => $app['previewAsIcon'] ? $app['preview'] : null,
+ ];
+ }
+ }
+
+ arsort($categoriesAppsCount);
+
+ $keys = array_keys($categoriesAppsCount);
+
+ foreach ($appsCategories as $app => $appCategories) {
+ $smallerIndex = count($categoriesAppsCount) - 1;
+
+ foreach ($appCategories as $appCategory) {
+ $appKey = array_keys($keys, $appCategory)[0];
+
+ if ($appKey < $smallerIndex) {
+ $smallerIndex = $appKey;
+ }
+ }
+
+ $category = $keys[$smallerIndex];
+
+ foreach ($items as $itemCategory => $value) {
+ if ($itemCategory !== $category && isset($value['apps'][$app])) {
+ unset($items[$itemCategory]['apps'][$app]);
+
+ if (empty($items[$itemCategory]['apps'])) {
+ unset($items[$itemCategory]);
+ }
+ }
+ }
+ }
+
+ foreach ($items as $category => $value) {
+ ksort($items[$category]['apps']);
+ }
+
+ usort($items, function ($a, $b) {
+ return ($a['name'] < $b['name']) ? -1 : 1;
+ });
+
+ return new JSONResponse([
+ 'items' => $items,
+ ]);
+ }
+}
diff --git a/lib/Controller/PersonalSettingController.php b/lib/Controller/PersonalSettingController.php
index 2beba19..5674175 100644
--- a/lib/Controller/PersonalSettingController.php
+++ b/lib/Controller/PersonalSettingController.php
@@ -19,7 +19,6 @@
namespace OCA\SideMenu\Controller;
use OCP\AppFramework\Controller;
-use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\Response;
use OCP\IConfig;
use OCP\IRequest;
@@ -48,6 +47,9 @@ class PersonalSettingController extends Controller
/**
* @NoAdminRequired
*
+ * @param mixed $name
+ * @param mixed $value
+ *
* @return Response
*/
public function valueSet($name, $value)
@@ -55,7 +57,7 @@ class PersonalSettingController extends Controller
$doSave = false;
$user = $this->userSession->getUser();
- if ($name === 'enabled') {
+ if ('enabled' === $name) {
$doSave = true;
if (!in_array($value, ['0', '1'])) {
@@ -63,8 +65,28 @@ class PersonalSettingController extends Controller
}
}
+ if ('top-menu-apps' === $name) {
+ $doSave = true;
+ $data = json_decode($value, true);
+
+ if (!is_array($data)) {
+ $doSave = false;
+ } else {
+ foreach ($data as $v) {
+ if (!is_string($v)) {
+ $doSave = false;
+ }
+ }
+ }
+ }
+
if ($doSave) {
- $this->config->setUserValue($user->getUid(), 'side_menu', 'enabled', $value);
+ $this->config->setUserValue($user->getUid(), 'side_menu', $name, $value);
+
+ return [
+ 'name' => $name,
+ 'value' => $value,
+ ];
}
return [];
diff --git a/lib/Service/AppRepository.php b/lib/Service/AppRepository.php
new file mode 100644
index 0000000..d2dd024
--- /dev/null
+++ b/lib/Service/AppRepository.php
@@ -0,0 +1,80 @@
+
+ */
+class AppRepository
+{
+ /**
+ * @var OC_App
+ */
+ protected $ocApp;
+
+ /**
+ * @var IFactory
+ */
+ protected $l10nFactory;
+
+ public function __construct(OC_App $ocApp, IFactory $l10nFactory)
+ {
+ $this->ocApp = $ocApp;
+ $this->l10nFactory = $l10nFactory;
+ }
+
+ /**
+ * Retrieves visibles apps.
+ *
+ * @return array
+ */
+ public function getVisibleApps()
+ {
+ $navigation = $this->ocApp->getNavigation();
+ $apps = $this->ocApp->listAllApps();
+ $visibleApps = [];
+
+ foreach ($apps as $app) {
+ $id = $app['id'];
+
+ if (isset($navigation[$id])) {
+ $app['name'] = $this->l10nFactory->get($app['id'])->t($app['name']);
+
+ $visibleApps[$id] = $app;
+ }
+ }
+
+ foreach ($navigation as $app) {
+ if ('external_index' === substr($app['id'], 0, 14)) {
+ $visibleApps[$app['id']] = [
+ 'id' => $app['id'],
+ 'name' => $this->l10nFactory->get($app['id'])->t($app['name']),
+ 'preview' => $app['icon'],
+ 'previewAsIcon' => true,
+ 'category' => [
+ 'external_links',
+ ],
+ ];
+ } elseif ('files' === $app['id']) {
+ $visibleApps[$app['id']] = [
+ 'id' => $app['id'],
+ 'name' => $this->l10nFactory->get($app['id'])->t($app['name']),
+ 'preview' => $app['icon'],
+ 'previewAsIcon' => true,
+ 'category' => [],
+ ];
+ }
+ }
+
+ usort($visibleApps, function ($a, $b) {
+ return ($a['name'] < $b['name']) ? -1 : 1;
+ });
+
+ return $visibleApps;
+ }
+}
diff --git a/lib/Settings/Admin.php b/lib/Settings/Admin.php
index f368bfa..0131a50 100644
--- a/lib/Settings/Admin.php
+++ b/lib/Settings/Admin.php
@@ -23,6 +23,7 @@ use OCP\IL10N;
use OCP\ILogger;
use OCP\Settings\ISettings;
use OCP\IConfig;
+use OCA\SideMenu\Service\AppRepository;
class Admin implements ISettings
{
@@ -41,11 +42,17 @@ class Admin implements ISettings
*/
private $config;
- public function __construct(IL10N $l, ILogger $logger, IConfig $config)
+ /**
+ * @var AppRepository
+ */
+ private $appRepository;
+
+ public function __construct(IL10N $l, ILogger $logger, IConfig $config, AppRepository $appRepository)
{
$this->l = $l;
$this->logger = $logger;
$this->config = $config;
+ $this->appRepository = $appRepository;
}
/**
@@ -66,6 +73,7 @@ class Admin implements ISettings
'force-light-icon' => $this->config->getAppValue('side_menu', 'force-light-icon', '0'),
'cache' => $this->config->getAppValue('side_menu', 'cache', '0'),
'opener' => $this->config->getAppValue('side_menu', 'opener', 'side-menu-opener'),
+ 'big-menu' => $this->config->getAppValue('side_menu', 'big-menu', '0'),
'display-logo' => $this->config->getAppValue('side_menu', 'display-logo', '1'),
'opener-position' => $this->config->getAppValue('side_menu', 'opener-position', 'before'),
'opener-hover' => $this->config->getAppValue('side_menu', 'opener-hover', '0'),
@@ -73,7 +81,8 @@ class Admin implements ISettings
'hide-when-no-apps' => $this->config->getAppValue('side_menu', 'hide-when-no-apps', '0'),
'size-icon' => $this->config->getAppValue('side_menu', 'size-icon', 'normal'),
'size-text' => $this->config->getAppValue('side_menu', 'size-text', 'normal'),
- 'external-sites-in-top-menu' => $this->config->getAppValue('side_menu', 'external-sites-in-top-menu', '0'),
+ 'top-menu-apps' => (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true),
+ 'apps' => $this->appRepository->getVisibleApps(),
];
return new TemplateResponse('side_menu', 'settings/admin-form', $parameters, '');
diff --git a/lib/Settings/Personal.php b/lib/Settings/Personal.php
index beef491..4a80bfb 100644
--- a/lib/Settings/Personal.php
+++ b/lib/Settings/Personal.php
@@ -24,6 +24,7 @@ use OCP\ILogger;
use OCP\Settings\ISettings;
use OCP\IConfig;
use OCP\IUserSession;
+use OCA\SideMenu\Service\AppRepository;
class Personal implements ISettings
{
@@ -47,12 +48,18 @@ class Personal implements ISettings
*/
private $userSession;
- public function __construct(IL10N $l, ILogger $logger, IConfig $config, IUserSession $userSession)
+ /**
+ * @var AppRepository
+ */
+ private $appRepository;
+
+ public function __construct(IL10N $l, ILogger $logger, IConfig $config, IUserSession $userSession, AppRepository $appRepository)
{
$this->l = $l;
$this->logger = $logger;
$this->config = $config;
$this->userSession = $userSession;
+ $this->appRepository = $appRepository;
}
/**
@@ -64,6 +71,8 @@ class Personal implements ISettings
$parameters = [
'enabled' => $this->config->getUserValue($user->getUid(), 'side_menu', 'enabled', '1'),
+ 'top-menu-apps' => (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true),
+ 'apps' => $this->appRepository->getVisibleApps(),
];
return new TemplateResponse('side_menu', 'settings/personal-form', $parameters, '');
diff --git a/package.json b/package.json
index 3837c1b..38edace 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"dependencies": {
"@nextcloud/axios": "^1.3.2",
"@nextcloud/vue": "^1.4.0",
+ "axios": "^0.19.2",
"trim": "0.0.1",
"vue": "^2.6.11"
},
diff --git a/src/SideMenu.js b/src/SideMenu.js
index dd7d323..05d5e17 100644
--- a/src/SideMenu.js
+++ b/src/SideMenu.js
@@ -17,18 +17,28 @@
import Vue from 'vue'
import SideMenu from './SideMenu.vue'
+import SideMenuBig from './SideMenuBig.vue'
// Vue.prototype.t = t
-// Vue.prototype.OC = OC
+Vue.prototype.OC = OC
// Vue.prototype.OC = OCP
-const View = Vue.extend(SideMenu)
-const sideMenu = new View({})
const mountSideMenuComponent = () => {
const sideMenuContainer = document.querySelector('#side-menu')
if (sideMenuContainer) {
+ let component
+
+ if (sideMenuContainer.getAttribute('data-bigmenu')) {
+ component = SideMenuBig
+ } else {
+ component = SideMenu
+ }
+
+ const View = Vue.extend(component)
+ const sideMenu = new View({})
+
sideMenu.$mount('#side-menu')
$('body').trigger('side-menu.ready')
diff --git a/src/SideMenu.vue b/src/SideMenu.vue
index b715f42..97ab13a 100644
--- a/src/SideMenu.vue
+++ b/src/SideMenu.vue
@@ -63,7 +63,7 @@ export default {
var dataId = parent.getAttribute('data-id')
dataId = dataId !== null ? dataId : ''
- if (this.ignoreExternalSites && dataId.indexOf('external_index') !== -1) {
+ if (!parent.classList.contains('app-hidden')) {
continue
}
@@ -113,7 +113,6 @@ export default {
this.retrieveApps()
this.retrieveLogo()
this.forceLightIcon = document.querySelector('#side-menu-container').getAttribute('data-forcelighticon') == 1;
- this.ignoreExternalSites = document.querySelector('#side-menu-container').getAttribute('data-externalsitesintopmenu') == 1;
const menu = document.querySelector('#appmenu')
diff --git a/src/SideMenuBig.vue b/src/SideMenuBig.vue
new file mode 100644
index 0000000..67b4787
--- /dev/null
+++ b/src/SideMenuBig.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
diff --git a/src/admin.js b/src/admin.js
index 38c675a..74f6001 100644
--- a/src/admin.js
+++ b/src/admin.js
@@ -32,8 +32,24 @@ const appConfig = (name, value, callbacks) => {
const saveSettings = (key) => {
const element = elements.get(key)
- const name = $(element).attr('name')
- let value = $(element).val()
+ let value
+ let name
+
+ if ($(element).is('[data-checkbox]')) {
+ name = $(element).attr('data-name')
+ const inputs = $('input[name="' + name + '[]"]:checked')
+ value = []
+
+ inputs.each((i, v) => {
+ value.push(v.value)
+ })
+
+ value = JSON.stringify(value)
+ } else {
+ name = $(element).attr('name')
+ value = $(element).val()
+ }
+
const size = elements.length
if (element === 'side-menu-cache') {
diff --git a/templates/css/stylesheet.php b/templates/css/stylesheet.php
index adae8c3..1f0ce32 100644
--- a/templates/css/stylesheet.php
+++ b/templates/css/stylesheet.php
@@ -8,7 +8,7 @@
}
-
+
#appmenu {
display: none;
}
@@ -74,16 +74,31 @@
width: 15px;
height: 15px;
}
+
+ img.side-menu-app-icon {
+ width: 15px;
+ height: 15px;
+ }
.side-menu-app-icon svg {
width: 20px;
height: 20px;
}
+
+ img.side-menu-app-icon {
+ width: 20px;
+ height: 20px;
+ }
.side-menu-app-icon svg {
width: 23px;
height: 23px;
}
+
+ img.side-menu-app-icon {
+ width: 23px;
+ height: 23px;
+ }
diff --git a/templates/js/_externalSitesInTopMenu.js b/templates/js/_topMenuApps.js
similarity index 96%
rename from templates/js/_externalSitesInTopMenu.js
rename to templates/js/_topMenuApps.js
index c2b7224..b6fe1c1 100644
--- a/templates/js/_externalSitesInTopMenu.js
+++ b/templates/js/_topMenuApps.js
@@ -1,5 +1,3 @@
-sideMenuContainer.attr('data-externalsitesintopmenu', '1')
-
var menuCache = null
var updateTopMenu = function() {
@@ -31,7 +29,7 @@ var updateTopMenu = function() {
return
}
- if (dataId.indexOf('external_index') === -1) {
+ if (topMenuApps.indexOf(dataId) === -1) {
app.classList.add('hidden')
app.classList.add('app-hidden')
} else {
diff --git a/templates/js/script.php b/templates/js/script.php
index acc730d..660666b 100644
--- a/templates/js/script.php
+++ b/templates/js/script.php
@@ -5,6 +5,10 @@
var body = $('body')
var isTouchDevice = window.matchMedia("(pointer: coarse)").matches
+
+ sideMenu.attr('data-bigmenu', '1')
+
+
sideMenuContainer.attr('data-forcelighticon', '1')
@@ -100,7 +104,9 @@
sideMenuOpener.insertAfter('#nextcloud')
-
-
+
+ var topMenuApps = ;
+
+
})();
diff --git a/templates/settings/admin-form.php b/templates/settings/admin-form.php
index a5dc23a..64e8c62 100644
--- a/templates/settings/admin-form.php
+++ b/templates/settings/admin-form.php
@@ -40,7 +40,7 @@ $choicesSizes = [
-
@@ -60,7 +60,7 @@ $choicesSizes = [
-
+
t('Background color of current app')); ?>
@@ -74,7 +74,7 @@ $choicesSizes = [
-
+
t('Text color')); ?>
@@ -88,11 +88,13 @@ $choicesSizes = [
-
+
t('Force light icons')); ?>
+ This feature is not compatible with the big menu
display.
+
-
+
t('Loader')); ?>
@@ -135,7 +137,7 @@ $choicesSizes = [
?>
-
+
t('Icon')); ?>
@@ -158,7 +160,7 @@ $choicesSizes = [
?>
-
+
t('Position')); ?>
@@ -174,7 +176,7 @@ $choicesSizes = [
-
+
t('Show only the opener (hidden logo)')); ?>
@@ -190,7 +192,7 @@ $choicesSizes = [
-
+
t('Do not display the side menu and the opener if there is no application (eg: public pages).')); ?>
@@ -212,11 +214,14 @@ $choicesSizes = [
-
+
t('Open the menu when the mouse is hover the opener (automatically disabled on touch screens)')); ?>
+ 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.
+
+
+ t('Display the big menu')); ?>
+
+ Experimental
+
+
+
+ The big menu is not compatible with AppOrder.
-
+
+
+
+
+
t('Display the logo')); ?>
+ This feature is not compatible with the big menu
display.
+
-
+
t('Icons and texts')); ?>
@@ -271,7 +295,7 @@ $choicesSizes = [
-
+
t('Loader enabled')); ?>
@@ -285,22 +309,35 @@ $choicesSizes = [
+
+
+
+ t('Top menu')); ?>
+
-
- t('Do not move external sites in the side menu')); ?>
+
+ t('Apps that not must be moved in the side menu')); ?>
Experimental
-
-
+
@@ -309,7 +346,7 @@ $choicesSizes = [
t('Tips')); ?>
-
Use the shortcut Ctrl+o
+
Use the shortcut Ctrl+o
to open and to hide the side menu. Use tab to navigate.
@@ -323,7 +360,7 @@ $choicesSizes = [
- Use the shortcut Ctrl+o
- to open and to hide the side menu. Use tab to navigate.
+
+
+ t('Top menu')); ?>
+
+
+
+ t('Apps that not must be moved in the side menu')); ?>
+ Experimental
+
+
+
+
+
+ If there is no selection then the global configuration is applied.
+
+
+
+
@@ -61,7 +97,7 @@ $choicesYesNo = [
-
+
t('You like this app and you want to support me?')); ?>