diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 12cc322a..53d16209 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -1,8 +1,15 @@ # Changelog +## 🌐 1.5.5 - Adds Missing Translations + Small UI Issues [PR #129](https://github.com/Lissy93/dashy/pull/129) +- Adds missing translations to several UI elements, Re: #126 +- Fixes login translations not being picked up on page load, Re: #127 +- Fixes small text overflow glitch in config icon, Re: #123 +- Several small UI improvements: height of config editor, scrollbar on theme dropdown, page height, white-on-white on material theme, etc +- Adds an action to auto-assign reviewer based on ./.github/CODEOWNERS file + ## 🐳 1.5.4 - Docker ARM Support [PR #122](https://github.com/Lissy93/dashy/pull/122) -- Adds Docker files for `arm64v8` and `arm32v7` in order to support Raspberry Pi and other modern ARM-based devices -- Publishes these images on DockerHub and sets up a workflow to submit a new container every time a release is made +- Adds a Dockerfile for `arm64v8` and `arm32v7`, to support Raspberry Pi and other modern ARM-based devices +- Sets up automated workflow to publish ARM containers to DockerHub after every new release - Adds documentation for running Dashy on RPi/ ARM-based devices, Re: #117 ## 🩹 1.5.3 - UI Quick Fix [PR #121](https://github.com/Lissy93/dashy/pull/121) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..e653ca6a --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,16 @@ +# Code Owners helps give greater control to those who developed a feature +# PR's which modify files that you own will be marked as trusted +# After developing a feature, you can add yourself as it's owner +# Each line starts with file pattern, followed by one or more owners +# Codeowners Docs: https://github.blog/2017-07-06-introducing-code-owners/ + +# Repo Owner +* @lissy93 + +# Translations +src/assets/locales/de.json @niklashere +src/assets/locales/nl.json @evroon + +# Bot PR Permissions +docs/assets/CONTRIBUTORS.svg @liss-bot +docs/*.md @liss-bot diff --git a/Dockerfile b/Dockerfile index 034d3a49..5814f880 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ FROM node:lts-alpine # Define some ENV Vars -ENV PORT 80 -ENV DIRECTORY /app -ENV IS_DOCKER true +ENV PORT=80 \ + DIRECTORY=/app \ + IS_DOCKER=true # Create and set the working directory WORKDIR ${DIRECTORY} diff --git a/Dockerfile-arm32v7 b/Dockerfile-arm32v7 index 437d1ebf..cb50da2b 100644 --- a/Dockerfile-arm32v7 +++ b/Dockerfile-arm32v7 @@ -1,31 +1,43 @@ -FROM arm32v7/node:latest - -# Define some ENV Vars -ENV PORT 80 -ENV DIRECTORY /app -ENV IS_DOCKER true - -# Create and set the working directory -WORKDIR ${DIRECTORY} - -# Copy over both 'package.json' and 'yarn.lock' -COPY package.json ./ -COPY yarn.lock ./ - -# Install dependencies -RUN yarn - -# Copy over all project files and folders to the working directory -COPY . . - -# Build Dashy for production -RUN yarn build - -# Expose users port -EXPOSE ${PORT} - -# Finally, run start command to serve up the built application -CMD [ "yarn", "build-and-start"] - -# Enable Docker healthcecks, to ensure Dashy is running correctly -HEALTHCHECK --interval=5m --timeout=2s --start-period=30s CMD yarn health-check +FROM alpine:3.12 AS builder + +# Download QEMU, see https://github.com/docker/hub-feedback/issues/1261 +RUN QEMU_URL=https://github.com/balena-io/qemu/releases/download/v5.2.0%2Bbalena4/qemu-5.2.0.balena4-arm.tar.gz \ + && apk add curl && curl -L $QEMU_URL | tar zxvf - -C . --strip-components 1 + +# Start second (arm32v7) stage +FROM arm32v7/alpine:3.12 + +# Add QEMU from build stage +COPY --from=builder qemu-arm-static /usr/bin + +# Install Node and Yarn +RUN apk add --update --no-cache nodejs npm yarn + +# Define some ENV Vars +ENV PORT=80 \ + DIRECTORY=/app \ + IS_DOCKER=true + +# Create and set the working directory +WORKDIR ${DIRECTORY} + +# Copy over both 'package.json' and 'package-lock.json' (if available) +COPY package*.json ./ + +# Install project dependencies +RUN yarn + +# Copy over all project files and folders to the working directory +COPY . . + +# Build initial app for production +RUN yarn build + +# Expose given port +EXPOSE ${PORT} + +# Finally, run start command to serve up the built application +CMD [ "yarn", "build-and-start"] + +# Run simple healthchecks every 5 mins, to check the Dashy's everythings great +HEALTHCHECK --interval=5m --timeout=2s --start-period=30s CMD yarn health-check diff --git a/Dockerfile-arm64v8 b/Dockerfile-arm64v8 index c5fd92f6..1d85444b 100644 --- a/Dockerfile-arm64v8 +++ b/Dockerfile-arm64v8 @@ -1,16 +1,28 @@ -FROM arm64v8/node:latest +FROM alpine:3.12 AS builder + +# Download QEMU, see https://github.com/docker/hub-feedback/issues/1261 +RUN QEMU_URL=https://github.com/balena-io/qemu/releases/download/v5.2.0%2Bbalena4/qemu-5.2.0.balena4-aarch64.tar.gz \ + && apk add curl && curl -L $QEMU_URL | tar zxvf - -C . --strip-components 1 + +# Start second (arm64v8) stage +FROM arm64v8/alpine:3.12 + +# Add QEMU from build stage +COPY --from=builder qemu-aarch64-static /usr/bin + +# Install Node and Yarn +RUN apk add --update --no-cache nodejs npm yarn # Define some ENV Vars -ENV PORT 80 -ENV DIRECTORY /app -ENV IS_DOCKER true +ENV PORT=80 \ + DIRECTORY=/app \ + IS_DOCKER=true # Create and set the working directory WORKDIR ${DIRECTORY} # Copy over both 'package.json' and 'package-lock.json' (if available) -COPY package.json ./ -COPY yarn.lock ./ +COPY package*.json ./ # Install project dependencies RUN yarn diff --git a/README.md b/README.md index 548fe21c..67b6d267 100644 --- a/README.md +++ b/README.md @@ -350,6 +350,7 @@ Dashy has the ability to support multiple languages and locales. When available, - 🇬🇧 **English**: `en` - 🇩🇪 **German**: `de` - 🇳🇱 **Dutch**: `nl` +- 🇲🇫 **French**: `fr` #### Add your Language It would be awesome for open source projects to be available to everyone, without language being a barrier to entry for non-native English speakers. If you have a few minutes to sapir, you're help with translating it would be very much appreciated. diff --git a/docs/credits.md b/docs/credits.md index e2e90904..9571e785 100644 --- a/docs/credits.md +++ b/docs/credits.md @@ -13,7 +13,7 @@
@@ -152,7 +152,7 @@
This app definitely wouldn't have been quite so possible without the making use of the following package and components. Full credit and big kudos to their respective authors, who've done an amazing job in building and maintaining them. For a full breakdown of dependency licenses, please see [Legal](https://github.com/Lissy93/dashy/blob/master/.github/LEGAL.md)
##### Core
-At it's core, the application uses [Vue.js](https://github.com/vuejs/vue), as well as it's services. Styling is done with [SCSS](https://github.com/sass/sass), JavaScript is currently [Babel](https://github.com/babel/babel), (but I am in the process of converting to [TypeScript](https://github.com/Microsoft/TypeScript)), linting is done with [ESLint](https://github.com/eslint/eslint), the config is defined in [YAML](https://github.com/yaml/yaml), and there is a simple [Node.js](https://github.com/nodejs/node) server to serve up the static app.
+At it's core, the application uses [Vue.js](https://github.com/vuejs/vue), as well as it's services. Styling is done with [SCSS](https://github.com/sass/sass), JavaScript is currently [Babel](https://github.com/babel/babel), (but I am in the process of converting to [TypeScript](https://github.com/Microsoft/TypeScript)). Linting is done with [ESLint](https://github.com/eslint/eslint) and [Prettier](https://prettier.io/), both following the [AirBnB Styleguide](https://github.com/airbnb/javascript). The config is defined in [YAML](https://github.com/yaml/yaml), and there is a simple [Node.js](https://github.com/nodejs/node) server to serve up the static app and the optional API endpoints.
##### Utilities
- [`crypto-js`](https://github.com/brix/crypto-js) - Encryption implementations by @evanvosberg and community `MIT`
@@ -176,7 +176,7 @@ At it's core, the application uses [Vue.js](https://github.com/vuejs/vue), as we
Although the app is purely frontend, there is an optional cloud backup and restore feature. This is built as a serverless function on [Cloudflare workers](https://workers.cloudflare.com/) using [KV](https://developers.cloudflare.com/workers/runtime-apis/kv) and [web crypto](https://developers.cloudflare.com/workers/runtime-apis/web-crypto)
##### External Services
-The 1-Click deploy demo uses [Play-with-Docker Labs](https://play-with-docker.com/). Code is hosted on [GitHub](https://github.com), Docker image is hosted on [DockerHub](https://hub.docker.com/), and the demos are hosted on [Netlify](https://www.netlify.com/).
+The 1-Click deploy demo uses [Play-with-Docker Labs](https://play-with-docker.com/). Code is hosted on [GitHub](https://github.com), Docker images are hosted on [DockerHub](https://hub.docker.com/), and the demos are hosted on [Netlify](https://www.netlify.com/).
---
diff --git a/hooks/pre_build b/hooks/pre_build
new file mode 100644
index 00000000..b0621283
--- /dev/null
+++ b/hooks/pre_build
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# Source: https://github.com/ckulka/docker-multi-arch-example/blob/master/hooks/pre_build
+# Used to setup QEMU to build arm images on amd64 processors.
+
+# Register qemu-*-static for all supported processors except the
+# current one, but also remove all registered binfmt_misc before
+docker run --rm --privileged multiarch/qemu-user-static:register --reset
diff --git a/package.json b/package.json
index e40fc224..3985e7a2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "Dashy",
- "version": "1.5.4",
+ "version": "1.5.5",
"license": "MIT",
"main": "server",
"scripts": {
@@ -22,7 +22,6 @@
"body-parser": "^1.19.0",
"connect": "^3.7.0",
"crypto-js": "^4.0.0",
- "highlight.js": "^11.0.0",
"js-yaml": "^4.1.0",
"npm-run-all": "^4.1.5",
"prismjs": "^1.24.1",
diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json
index b0ae0e40..6a3a6175 100644
--- a/src/assets/locales/en.json
+++ b/src/assets/locales/en.json
@@ -17,7 +17,13 @@
"remember-me-never": "Never",
"remember-me-hour": "4 Hours",
"remember-me-day": "1 Day",
- "remember-me-week": "1 Week"
+ "remember-me-week": "1 Week",
+ "error-missing-username": "Missing Username",
+ "error-missing-password": "Missing Password",
+ "error-incorrect-username": "User not found",
+ "error-incorrect-password": "Incorrect Password",
+ "success-message": "Logging in...",
+ "logout-message": "Logged Out"
},
"config": {
"main-tab": "Config",
@@ -59,7 +65,9 @@
"item-size-small": "Small",
"item-size-medium": "Medium",
"item-size-large": "Large",
- "config-launcher-label": "Config"
+ "config-launcher-label": "Config",
+ "config-launcher-tooltip": "Update Configuration",
+ "sign-out-tooltip": "Sign Out"
},
"updates": {
"app-version-note": "Dashy version",
diff --git a/src/assets/locales/fr.json b/src/assets/locales/fr.json
new file mode 100644
index 00000000..66ad6037
--- /dev/null
+++ b/src/assets/locales/fr.json
@@ -0,0 +1,150 @@
+{
+ "home": {
+ "no-results": "Aucun résultat",
+ "no-data": "Aucune donnée configurée"
+ },
+ "search": {
+ "search-label": "Recherche",
+ "search-placeholder": "Commencez à taper pour filtrer",
+ "clear-search-tooltip": "Effacer la recherche"
+ },
+ "login": {
+ "title": "Dashy",
+ "username-label": "Nom d'utilisateur",
+ "password-label": "Mot de passe",
+ "login-button": "Connexion",
+ "remember-me-label": "Se souvenir de moi",
+ "remember-me-never": "Jamais",
+ "remember-me-hour": "4 Heures",
+ "remember-me-day": "1 Jour",
+ "remember-me-week": "1 Semaine",
+ "error-missing-username": "Nom d'utilisateur manquant",
+ "error-missing-password": "Mot de passe manquant",
+ "error-incorrect-username": "Utilisateur inexistant",
+ "error-incorrect-password": "Mot de passe incorrect",
+ "success-message": "Connexion ...",
+ "logout-message": "Déconnexion"
+ },
+ "config": {
+ "main-tab": "Configuration",
+ "view-config-tab": "Afficher la configuration",
+ "edit-config-tab": "Modifier la configuration",
+ "custom-css-tab": "Styles personnalisés",
+ "heading": "Options de Configuration",
+ "download-config-button": "Télécharger la configuration",
+ "edit-config-button": "Modifier la configuration",
+ "edit-css-button": "Styles personnalisés",
+ "cloud-sync-button": "Activer la synchro. dans le cloud",
+ "edit-cloud-sync-button": "Modifier la synchro. dans le cloud",
+ "rebuild-app-button": "Reconstruire l'application",
+ "change-language-button": "Changer la langue",
+ "reset-settings-button": "Réinitialiser les paramètres locaux",
+ "app-info-button": "Informations sur l'application",
+ "backup-note": "Il est recommandé de faire une sauvegarde de votre configuration avant d'apporter des modifications.",
+ "reset-config-msg-l1": "Cela supprimera tous les paramètres utilisateur du stockage local, mais n'affectera pas votre fichier 'conf.yml'.",
+ "reset-config-msg-l2": "Vous devez d'abord sauvegarder toutes les modifications locales si vous souhaitez les utiliser à l'avenir.",
+ "reset-config-msg-l3": "Êtes-vous sur de vouloir continuer ?",
+ "data-cleared-msg": "Données effacées avec succès",
+ "actions-label": "Actions",
+ "copy-config-label": "Copier la configuration",
+ "data-copied-msg": "La configuration a été copiée dans le presse-papiers",
+ "reset-config-label": "Réinitialiser la configuration",
+ "css-save-btn": "Enregistrer",
+ "css-note-label": "Note",
+ "css-note-l1": "Vous devrez actualiser la page pour que les modifications prennent effet.",
+ "css-note-l2": "Les modifications ne sont stockés que localement, il est donc recommandé de faire une copie de votre CSS.",
+ "css-note-l3": "Pour supprimer tous les styles personnalisés, supprimez le contenu et appuyez sur Enregistrer."
+ },
+ "settings": {
+ "theme-label": "Thème",
+ "layout-label": "Disposition",
+ "layout-auto": "Auto",
+ "layout-horizontal": "Horizontal",
+ "layout-vertical": "Vertical",
+ "item-size-label": "Taille",
+ "item-size-small": "Petite",
+ "item-size-medium": "Moyenne",
+ "item-size-large": "Grande",
+ "config-launcher-label": "Config.",
+ "config-launcher-tooltip": "Modifier la configuration",
+ "sign-out-tooltip": "Déconnexion"
+ },
+ "updates": {
+ "app-version-note": "Version de Dashy",
+ "up-to-date": "À jour",
+ "out-of-date": "Mise à jour disponible !",
+ "unsupported-version-l1": "Vous utilisez une version non prise en charge de Dashy",
+ "unsupported-version-l2": "Pour une meilleure expérience et des correctifs de sécurité récents, veuillez mettre à jour vers"
+ },
+ "language-switcher": {
+ "title": "Changer la langue",
+ "dropdown-label": "Sélectionnez une langue",
+ "save-button": "Enregistrer",
+ "success-msg": "Langue mise à jour vers"
+ },
+ "theme-maker": {
+ "title": "Configurateur de Thèmes",
+ "export-button": "Exporter des variables personnalisées",
+ "reset-button": "Réinitialiser les styles pour",
+ "show-all-button": "Afficher toutes les variables",
+ "save-button": "Enregistrer",
+ "cancel-button": "Annuler",
+ "saved-toast": "{theme} mis à jour avec succès",
+ "copied-toast": "Données du thème {theme} copiées dans le presse-papiers",
+ "reset-toast": "Couleurs personnalisées pour {theme} supprimées"
+ },
+ "config-editor": {
+ "save-location-label": "Enregistrer localement",
+ "location-local-label": "Appliquer localement",
+ "location-disk-label": "Appliquer dans le fichier de configuration",
+ "save-button": "Enregistrer",
+ "valid-label": "La configuration est valide",
+ "status-success-msg": "Tâche terminée",
+ "status-fail-msg": "Échec de la tâche",
+ "success-msg-disk": "Le fichier de configuration est écrit avec succès sur le disque",
+ "success-msg-local": "Les modifications locales ont bien été enregistrées",
+ "success-note-l1": "L'application devrait se reconstruire automatiquement.",
+ "success-note-l2": "Cela peut prendre une minute.",
+ "success-note-l3": "Vous devrez actualiser la page pour que les modifications prennent effet.",
+ "error-msg-save-mode": "Veuillez sélectionner un mode d'enregistrement : Local ou Fichier",
+ "error-msg-cannot-save": "Une erreur s'est produite lors de l'enregistrement de la configuration",
+ "error-msg-bad-json": "Erreur dans le fichier JSON, il est peut-être mal formé",
+ "warning-msg-validation": "Attention"
+ },
+ "app-rebuild": {
+ "title": "Reconstruire l'application",
+ "rebuild-note-l1": "Une reconstruction est requise pour que les modifications écrites dans le fichier conf.yml prennent effet.",
+ "rebuild-note-l2": "Cela devrait se produire automatiquement, mais si ce n'est pas le cas, vous pouvez le déclencher manuellement ici.",
+ "rebuild-note-l3": "Ceci n'est pas nécessaire pour les modifications stockées localement.",
+ "rebuild-button": "Démarrer la reconstruction",
+ "rebuilding-status-1": "Reconstruction ...",
+ "rebuilding-status-2": "Cela peut prendre quelques minutes",
+ "error-permission": "Vous n'êtes pas autorisé à executer cette action",
+ "success-msg": "Construction terminée avec succès",
+ "fail-msg": "Échec de la construction",
+ "reload-note": "Un rechargement de la page est maintenant requis pour que les modifications prennent effet",
+ "reload-button": "Rafraîchir la page"
+ },
+ "cloud-sync": {
+ "title": "Sauvegarde Cloud & Restauration",
+ "intro-l1": "Ce service de sauvegarde et de restauration depuis le cloud est une fonctionnalité facultative qui vous permet de télécharger votre configuration sur Internet, puis de la restaurer sur n'importe quel autre appareil ou instance de Dashy.",
+ "intro-l2": "Toutes les données sont entièrement chiffrées de bout en bout avec le protocole AES, en utilisant votre mot de passe comme clé.",
+ "intro-l3": "Pour plus d'informations, veuillez consulter la",
+ "backup-title-setup": "Sauvegarder",
+ "backup-title-update": "Mettre à jour la sauvegarde",
+ "password-label-setup": "Choisissez un mot de passe",
+ "password-label-update": "Entrer votre mot de passe",
+ "backup-button-setup": "Sauvegarde",
+ "backup-button-update": "Mettre à jour la sauvegarde",
+ "backup-id-label": "Votre identifiant de sauvegarde",
+ "backup-id-note": "Il vous sera demandé par la suite pour restaurer à partir de votre sauvegarde. Alors gardez-le, avec votre mot de passe dans un endroit sûr.",
+ "restore-title": "Restauration",
+ "restore-id-label": "Identifiant de sauvegarde",
+ "restore-password-label": "Mot de passe",
+ "restore-button": "Restaurer",
+ "backup-error-unknown": "Impossible de traiter la demande",
+ "backup-error-password": "Mot de passe incorrect. Veuillez saisir votre mot de passe actuel.",
+ "backup-success-msg": "Sauvegarde effectuée avec succès",
+ "restore-success-msg": "Configuration restaurée avec succès"
+ }
+}
diff --git a/src/components/Configuration/ConfigContainer.vue b/src/components/Configuration/ConfigContainer.vue
index 29b70467..37cc397c 100644
--- a/src/components/Configuration/ConfigContainer.vue
+++ b/src/components/Configuration/ConfigContainer.vue
@@ -79,9 +79,6 @@
diff --git a/src/components/Configuration/JsonEditor.vue b/src/components/Configuration/JsonEditor.vue
index 99f0cffe..a9ae07f5 100644
--- a/src/components/Configuration/JsonEditor.vue
+++ b/src/components/Configuration/JsonEditor.vue
@@ -4,7 +4,6 @@
|