🔀 Merge pull request #234 from Lissy93/FEATURE/more-languages

[FEATURE] Additional languages, bug fix, and quick refactor
Fixes #232
This commit is contained in:
Alicia Sykes 2021-09-18 19:18:33 +01:00 committed by GitHub
commit c1a18ab9c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 1293 additions and 136 deletions

View File

@ -1,5 +1,12 @@
# Changelog
## 🩹 1.8.1 - Additional Languages, Bug Fix, and more [PR #234](https://github.com/Lissy93/dashy/pull/234)
- Merges 5 additional languages
- Adds RickyCZ's dashboard to showcase
- Fixes #323, and improves status indicator tooltip
- Define constants for endpoints
- Updates management, translations and readme docs
## ⚡️ 1.7.7 - Improved Error Handling [PR #226](https://github.com/Lissy93/dashy/pull/226)
- Errors can be viewed via the UI (Config menu --> App Info)
- Service workers should be disabled by default

View File

@ -443,6 +443,12 @@ Dashy supports multiple languages and locales. When available, you're language s
- 🇩🇪 **German**: `de` - Contributed by **[@Niklashere](https://github.com/Niklashere)**
- 🇪🇸 **Spanish**: `es` - Contributed by **[@lu4t](https://github.com/lu4t)**
- 🇸🇮 **Slovenian**: `sl` - Contributed by **[@UrekD](https://github.com/UrekD)**
- 🇮🇹 **Italian**: `it` - Machine Translated *(awaiting human review)*
- 🇵🇹 **Portuguese**: `pt` - Machine Translated *(awaiting human review)*
- 🇷🇺 **Russian**: `ru` - Contributed by Anon
- 🇦🇪 **Arabic**: `ar` - Contributed by Anon
- 🇮🇳 **Hindi**: `hi` - Contributed by Anon
- 🇯🇵 **Japanese**: `ja` - Contributed by Anon
#### Add your Language
I would love for Dashy 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.

View File

@ -37,25 +37,28 @@ Dashy should now be being served on http://localhost:8080/. Hot reload is enable
### Project Commands
- `yarn dev` - Starts the development server with hot reloading
- `yarn build` - Builds the project for production, and outputs it into `./dist`
- `yarn start` - Starts a web server, and serves up the production site from `./dist`
- `yarn validate-config` - Parses and validates your `conf.yml` against Dashy's schema
- `yarn lint` - Lints code to ensure it follows a consistent, neat style
- `yarn test` - Runs tests, and outputs results
#### Basics
- **`yarn build`** - In the interest of speed, the application is pre-compiled, this means that the config file is read during build-time, and therefore the app needs to rebuilt for any new changes to take effect. Luckily this is very straight forward. Just run `yarn build` or `docker exec -it [container-id] yarn build`
- **`yarn start`** - Starts a web server, and serves up the production site from `./dist` (must run build command first)
There is also:
- `yarn build-and-start` will run `yarn build` and `yarn start`
- `yarn build-watch` will output contents to `./dist` and recompile when anything in `./src` is modified, you can then use either `yarn start` or your own server, to have a production environment that watches for changes.
#### Development
- **`yarn dev`** - Starts the development server with hot reloading
- **`yarn lint`** - Lints code to ensure it follows a consistent, neat style
- **`yarn test`** - Runs tests, and outputs results
Using the Vue CLI:
- The app is build with Vue, and uses the [Vue-CLI Service](https://cli.vuejs.org/guide/cli-service.html) for basic commands.
- If you have [NPX](https://github.com/npm/npx) installed, then you can invoke the Vue CLI binary using `npx vue-cli-service [command]`
- Vue also has a GUI environment that can be used for basic project management, and may be useful for beginners, this can be started by running `npx vue ui`, and opening up `http://localhost:8000`
#### Utils and Checks
- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/public/conf.yml` (or within your Docker container at `/app/public/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js).
- **`yarn health-check`** - Checks that the application is up and running on it's specified port, and outputs current status and response times. Useful for integrating into your monitoring service, if you need to maintain high system availability
Note:
#### Alternate Start Commands
- **`yarn build-and-start`** - Builds the app, runs checks and starts the production server. Commands are run in parallel, and so is faster than running them in independently. Uses the `yarn build` and `yarn start` commands
- **`yarn build-watch`** - If you find yourself making frequent changes to your configuration, and do not want to have to keep manually rebuilding, then this option is for you. It will watch for changes to any files within the projects root, and then trigger a rebuild. Note that if you are developing new features, then `yarn dev` would be more appropriate, as it's significantly faster at recompiling (under 1 second), and has hot reloading, linting and testing integrated
- **`yarn pm2-start`** - Starts the Node server using [PM2](https://pm2.keymetrics.io/), a process manager for Node.js applications, that helps them stay alive. PM2 has some built-in basic monitoring features, and an optional [management solution](https://pm2.io/). If you are running the app on bare metal, it is recommended to use this start command
#### Notes
- If you are using NPM, replace `yarn` with `npm run`
- If you are using Docker, precede each command with `docker exec -it [container-id]`. Container ID can be found by running `docker ps`
- You can manage the app using the [Vue-CLI Service](https://cli.vuejs.org/guide/cli-service.html), with `npx vue-cli-service [command]`. Or to start the Vue Management UI, run `npx vue ui`, and open `http://localhost:8000`
### Environmental Variables
All environmental variables are optional. Currently there are not many environmental variables used, as most of the user preferences are stored under `appConfig` in the `conf.yml` file.

View File

@ -3,22 +3,18 @@
## Providing Assets
Although not essential, you will most likely want to provide several assets to Dashy. All web assets can be found in the `/public` directory.
For example:
- `./public/conf.yml` - As mentioned, this is your main application config file
- `./public/item-icons` - If you're using your own icons, you can choose to store them locally for better load time, and this is the directory to put them in. You can also use sub-folders here to keep things organized. You then reference these assets relative this the direcroties path, for example: to use `./public/item-icons/networking/netdata.png` as an icon for one of your links, you would set `icon: networking/netdata.png`
- Also within `./public` you'll find standard website assets, including `favicon.ico`, `manifest.json`, `robots.txt`, etc. There's no need to modify these, but you can do so if you wish.
- `./public/item-icons` - If you're using your own icons, you can choose to store them locally for better load time, and this is the directory to put them in. You can also use sub-folders here to keep things organized
- Also within `./public` you'll find standard website assets, including `favicon.ico`, `manifest.json`, `robots.txt`, etc. There's no need to pass these in, but you can do so if you wish
## Basic Commands
This is easy to do using [Docker Volumes](https://docs.docker.com/storage/volumes/), which lets you share a file or directory between your host system, and the container. Volumes are specified in the Docker run command, or Docker compose file, using the `--volume` or `-v` flags. The value of which consists of the path to the file / directory on your host system, followed by the destination path within the container. Fields are separated by a colon (`:`), and must be in the correct order. For example: `-v ~/alicia/my-local-conf.yml:/app/public/conf.yml`
Now that you've got Dashy running, there are a few commands that you need to know.
## Running Commands
The following commands are defined in the [`package.json`](https://github.com/Lissy93/dashy/blob/master/package.json#L5) file, and are run with `yarn`. If you prefer, you can use NPM, just replace instances of `yarn` with `npm run`. If you are using Docker, then you will need to precede each command with `docker exec -it [container-id]`, where container ID can be found by running `docker ps`. For example `docker exec -it 26c156c467b4 yarn build`.
The project has a few commands that can be used for various tasks, you can find a list of these either in the [Developing Docs](/docs/developing.md#project-commands), or by looking at the [`package.json`](https://github.com/Lissy93/dashy/blob/master/package.json#L5). These can be used by running `yarn [command-name]`.
- **`yarn build`** - In the interest of speed, the application is pre-compiled, this means that the config file is read during build-time, and therefore the app needs to rebuilt for any new changes to take effect. Luckily this is very straight forward. Just run `yarn build` or `docker exec -it [container-id] yarn build`
- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/public/conf.yml` (or within your Docker container at `/app/public/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js).
- **`yarn health-check`** - Checks that the application is up and running on it's specified port, and outputs current status and response times. Useful for integrating into your monitoring service, if you need to maintain high system availability
- **`yarn build-watch`** - If you find yourself making frequent changes to your configuration, and do not want to have to keep manually rebuilding, then this option is for you. It will watch for changes to any files within the projects root, and then trigger a rebuild. Note that if you are developing new features, then `yarn dev` would be more appropriate, as it's significantly faster at recompiling (under 1 second), and has hot reloading, linting and testing integrated
- **`yarn build-and-start`** - Builds the app, runs checks and starts the production server. Commands are run in parallel, and so is faster than running them in independently
- **`yarn pm2-start`** - Starts the Node server using [PM2](https://pm2.keymetrics.io/), a process manager for Node.js applications, that helps them stay alive. PM2 has some built-in basic monitoring features, and an optional [management solution](https://pm2.io/). If you are running the app on bare metal, it is recommended to use this start command
But if you're using Docker, then you'll need to execute them within the container. This can be done by preceding each command with `docker exec -it [container-id]`, where container ID can be found by running `docker ps`. For example `docker exec -it 26c156c467b4 yarn build`. You can also enter the container, with `docker exec -it [container-id] /bin/ash`, and navigate around it with normal Linux commands.
## Healthchecks

View File

@ -1,23 +1,32 @@
# Internationalization
Internationalization is the process of making an application available in other languages. This is important, as not everyone is a native English speaker.
Internationalization is the process of making an application available in other languages. This is important, as not everyone is a native English speaker. This page explains how you can switch languages, how to add a new language, and how to make text translatable when writing a new component.
## Available Languages
An up-to-date list of all currently supported languages can be found in [`./src/utils/languages.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/languages.js). Languages are specified by their 2-digit [ISO-639 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`, `fr`, `de`, `es`, etc)
- [Setting your Language](#setting-language)
- [Adding a new Language](#adding-a-new-language)
- [Adding New Text to a Component](#adding-new-text-to-a-component)
---
## How to change Language
## Setting Language
By default, Dashy will attempt to use the language of your browser or system. If a translation for your language does not yet exist, it will fallback to English.
You can also manually select your language. This can be done, either through the UI (Config --> Language), or by setting it in your config file:
#### In the UI
You can manually select your language in the UI. Under the Config Menu, click the Language button, and select your language from the dropdown menu. Your preference will be saved in local storage.
#### Config File
You can also set your language in the config file. Specify the ISO code of one of the supported languages, under `appConfig.lang`. For example:
```yaml
appConfig:
lang: de
lang: de
```
#### Available Languages
At the time of writing the following languages are supported: `en`, `zh-CN`, `nl`, `fr`, `de`, `es`, `sl`, `it`, `pt`, `ru`, `ar`, `hi`, `ja`, but an up-to-date list of all implemented translations can be found in [`./src/utils/languages.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/languages.js). Languages are specified by their 2-digit [ISO-639 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes), or sometimes a 4-digit code if it's a regional dialect.
---
## Adding a new Language
@ -27,9 +36,10 @@ Dashy is using [vue-i18n](https://vue-i18n.intlify.dev/guide/) to manage multi-l
Adding a new language is pretty straightforward, with just three steps:
##### 1. Create a new Language File
Create a new JSON file in `./src/assets/locales` name is a 2-digit [ISO-639 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language, E.g. for German `de.json`, French `fr.json` or Spanish `es.json` - You can find a list of all ISO codes at [iso.org](https://www.iso.org/obp/ui).
If your language is a specific dialect or regional language, then use the Posfix [CLDR](http://cldr.unicode.org/) format, where, e.g. `en-GB.json` (British), `es-MX.json` (Spanish, in Mexico) or `zh-CN.json` (Chinese, simplified) - A list of which can be found [here](https://github.com/unicode-org/cldr-json/blob/master/cldr-json/cldr-core/availableLocales.json)
Create a new JSON file in `./src/assets/locales` for your language.
You should name it with the 2-digit [ISO-639 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your locale (e.g. for German `de.json`, French `fr.json` or Spanish `es.json`) - You can find a list of all ISO codes at [iso.org](https://www.iso.org/obp/ui).
If your language is a specific dialect or regional translation, then use the Posfix [CLDR](http://cldr.unicode.org/) format, where, e.g. `en-GB.json` (British English), `es-MX.json` (Spanish, in Mexico) or `zh-CN.json` (Chinese, simplified) - A list of which can be found [here](https://github.com/unicode-org/cldr-json/blob/master/cldr-json/cldr-core/availableLocales.json)
##### 2. Translate!
Using [`en.json`](https://github.com/Lissy93/dashy/tree/master/src/assets/locales/en.json) as an example, translate the JSON values to your language, while leaving the keys as they are. It's fine to leave out certain items, as if they're missing they will fall-back to English. If you see any attribute which include curly braces (`{xxx}`), then leave the inner value of these braces as is, as this is for variables.
@ -78,12 +88,9 @@ If you are not comfortable with making pull requests, or do not want to modify t
---
## Adding Text
If you're working on a new component, then any text that is displayed to the user should be extracted out of the component, and stored in the file. This also applies to any existing components, that might have been forgotten to be translated.
Thankfully, everything is already setup, and so is as easy as adding text to the JSON file, and pasting the key to that text in your component.
## Adding New Text to a Component
If you're working on a new component, then any text that is displayed to the user should be extracted out of the component, and stored in the file. This also applies to any existing components, that might have been forgotten to be translated. Thankfully, everything is already setup, so this is a pretty easy job.
#### 1. Add Translated Text
@ -95,8 +102,7 @@ Firstly, go to [`./src/assets/locales/en.json`](https://github.com/Lissy93/dashy
}
```
Note that you **must** add English translations for all text. Missing languages are not a problem, as they will always fallback to Enslish, but if the English is missing, then nothing can be displayed.
Note that you **must** add English translations for all text. Missing languages are not a problem, as they will always fallback to English, but if the English is missing, then nothing can be displayed.
#### 2. Use Text within Component
@ -143,10 +149,9 @@ In [`./src/components/Settings/SearchBar.vue`](https://github.com/Lissy93/dashy/
<form>
<label for="search-input">{{ $t('search.search-label') }}</label>
<input
id="search-input"
v-model="searchValue"
:placeholder="$t('search.search-placeholder')"
/>
/>
</form>
</template>
```
@ -159,6 +164,6 @@ Then in [`./src/assets/locales/en.json`](https://github.com/Lissy93/dashy/blob/m
"search-label": "Search",
"search-placeholder": "Start typing to filter",
},
...
...
}
```

View File

@ -54,6 +54,13 @@
---
### First Week of Self-Hosting
> By [u//RickyCZ](https://www.reddit.com/user/RickyCZ)
![screenshot-week-of-self-hosting](https://raw.githubusercontent.com/Lissy93/dashy/master/docs/showcase/11-ricky-cz.png)
---
### Ground Control
> By [@dtctek](https://github.com/dtctek)

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

View File

@ -1,6 +1,6 @@
{
"name": "Dashy",
"version": "1.8.0",
"version": "1.8.1",
"license": "MIT",
"main": "server",
"scripts": {
@ -92,4 +92,4 @@
"> 1%",
"last 2 versions"
]
}
}

View File

@ -17,12 +17,15 @@ const bodyParser = require('body-parser');
require('./services/update-checker'); // Checks if there are any updates available, prints message
require('./services/config-validator'); // Include and kicks off the config file validation script
/* Include helper functions and route handlers */
const pingUrl = require('./services/ping'); // Used by the status check feature, to ping services
/* Include route handlers for API endpoints */
const statusCheck = require('./services/status-check'); // Used by the status check feature, uses GET
const saveConfig = require('./services/save-config'); // Saves users new conf.yml to file-system
const printMessage = require('./services/print-message'); // Function to print welcome msg on start
const rebuild = require('./services/rebuild-app'); // A script to programmatically trigger a build
/* Helper functions, and default config */
const printMessage = require('./services/print-message'); // Function to print welcome msg on start
const ENDPOINTS = require('./src/utils/defaults').serviceEndpoints; // API endpoint URL paths
/* Checks if app is running within a container, from env var */
const isDocker = !!process.env.IS_DOCKER;
@ -58,28 +61,26 @@ try {
.use(serveStatic(`${__dirname}/dist`))
// During build, a custom page will be served before the app is available
.use(serveStatic(`${__dirname}/public`, { index: 'default.html' }))
// This root returns the status of a given service - used for uptime monitoring
.use('/ping', (req, res) => {
// GET endpoint to run status of a given URL with GET request
.use(ENDPOINTS.statusCheck, (req, res) => {
try {
pingUrl(req.url, async (results) => {
statusCheck(req.url, async (results) => {
await res.end(results);
});
} catch (e) {
printWarning(`Error running ping check for ${req.url}\n`, e);
printWarning(`Error running status check for ${req.url}\n`, e);
}
})
// POST Endpoint used to save config, by writing conf.yml to disk
.use('/config-manager/save', method('POST', (req, res) => {
.use(ENDPOINTS.save, method('POST', (req, res) => {
try {
saveConfig(req.body, (results) => {
res.end(results);
});
saveConfig(req.body, (results) => { res.end(results); });
} catch (e) {
res.end(JSON.stringify({ success: false, message: e }));
}
}))
// GET endpoint to trigger a build, and respond with success status and output
.use('/config-manager/rebuild', (req, res) => {
.use(ENDPOINTS.rebuild, (req, res) => {
rebuild().then((response) => {
res.end(JSON.stringify(response));
}).catch((response) => {

172
src/assets/locales/ar.json Normal file
View File

@ -0,0 +1,172 @@
{
"home": {
"no-results": "لا نتائج للبحث",
"no-data": "لم يتم تكوين بيانات"
},
"search": {
"search-label": "بحث",
"search-placeholder": "ابدأ الكتابة للتصفية",
"clear-search-tooltip": "مسح البحث",
"enter-to-search-web": "اضغط على Enter للبحث في الويب"
},
"login": {
"title": "داشي",
"username-label": "اسم المستخدم",
"password-label": "كلمه السر",
"login-button": "تسجيل الدخول",
"remember-me-label": "تذكرني ل",
"remember-me-never": "أبدا",
"remember-me-hour": "4 ساعات",
"remember-me-day": "يوم 1",
"remember-me-week": "أسبوع 1",
"error-missing-username": "اسم المستخدم مفقود",
"error-missing-password": "كلمة المرور مفقودة",
"error-incorrect-username": "لم يتم العثور على المستخدم",
"error-incorrect-password": "كلمة سر خاطئة",
"success-message": "تسجيل الدخول...",
"logout-message": "تسجيل الخروج",
"already-logged-in-title": "تم تسجيل الدخول بالفعل",
"already-logged-in-text": "لقد قمت بتسجيل الدخول باعتبارك",
"proceed-to-dashboard": "انتقل إلى لوحة القيادة",
"log-out-button": "تسجيل خروج",
"proceed-guest-button": "المضي قدما كضيف"
},
"config": {
"main-tab": "القائمة الرئيسية",
"view-config-tab": "مشاهدة ملف Config",
"edit-config-tab": "تحرير التكوين",
"custom-css-tab": "الأنماط المخصصة",
"heading": "خيارات الإعداد",
"download-config-button": "تنزيل Config",
"edit-config-button": "تحرير التكوين",
"edit-css-button": "تحرير CSS مخصص",
"cloud-sync-button": "قم بتمكين Cloud Sync",
"edit-cloud-sync-button": "تحرير Cloud Sync",
"rebuild-app-button": "إعادة إنشاء التطبيق",
"change-language-button": "تغيير لغة التطبيق",
"reset-settings-button": "إعادة ضبط الإعدادات المحلية",
"app-info-button": "معلومات التطبيق",
"backup-note": "يوصى بعمل نسخة احتياطية من التكوين الخاص بك قبل إجراء التغييرات.",
"reset-config-msg-l1": "سيؤدي هذا إلى إزالة جميع إعدادات المستخدم من التخزين المحلي ، لكنه لن يؤثر على ملف \"conf.yml\" الخاص بك.",
"reset-config-msg-l2": "يجب عليك أولاً الاحتفاظ بنسخة احتياطية من أي تغييرات أجريتها محليًا ، إذا كنت ترغب في استخدامها في المستقبل.",
"reset-config-msg-l3": "هل انت متأكد انك تريد المتابعة؟",
"data-cleared-msg": "تم مسح البيانات بنجاح",
"actions-label": "أجراءات",
"copy-config-label": "نسخ التكوين",
"data-copied-msg": "تم نسخ التكوين إلى الحافظة",
"reset-config-label": "إعادة التهيئة",
"css-save-btn": "حفظ التغييرات",
"css-note-label": "ملحوظة",
"css-note-l1": "ستحتاج إلى تحديث الصفحة حتى تصبح التغييرات سارية المفعول.",
"css-note-l2": "يتم تخزين تجاوزات الأنماط محليًا فقط ، لذا يوصى بعمل نسخة من CSS الخاص بك.",
"css-note-l3": "لإزالة جميع الأنماط المخصصة ، احذف المحتويات واضغط على حفظ التغييرات"
},
"alternate-views": {
"alternate-view-heading": "عرض التبديل",
"default": "تقصير",
"workspace": "مساحة العمل",
"minimal": "الحد الأدنى"
},
"settings": {
"theme-label": "سمة",
"layout-label": "تخطيط",
"layout-auto": "آلي",
"layout-horizontal": "أفقي",
"layout-vertical": "عمودي",
"item-size-label": "حجم الصنف",
"item-size-small": "صغير",
"item-size-medium": "واسطة",
"item-size-large": "كبير",
"config-launcher-label": "التكوين",
"config-launcher-tooltip": "تحديث التكوين",
"sign-out-tooltip": "خروج",
"sign-in-tooltip": "تسجيل دخول",
"sign-in-welcome": "مرحبًا {username}!"
},
"updates": {
"app-version-note": "نسخة متهورة",
"up-to-date": "حتى الآن",
"out-of-date": "التحديث متاح",
"unsupported-version-l1": "أنت تستخدم إصدارًا غير مدعوم من Dashy",
"unsupported-version-l2": "للحصول على أفضل تجربة وأحدث تصحيحات الأمان ، يرجى التحديث إلى"
},
"language-switcher": {
"title": "تغيير لغة التطبيق",
"dropdown-label": "اختر لغة",
"save-button": "يحفظ",
"success-msg": "تم تحديث اللغة إلى"
},
"theme-maker": {
"title": "مكون الموضوع",
"export-button": "تصدير المتغيرات المخصصة",
"reset-button": "إعادة تعيين الأنماط لـ",
"show-all-button": "إظهار كافة المتغيرات",
"save-button": "يحفظ",
"cancel-button": "يلغي",
"saved-toast": "{theme} تم التحديث بنجاح",
"copied-toast": "تم نسخ بيانات السمة لـ {theme} إلى الحافظة",
"reset-toast": "تمت إزالة الألوان المخصصة لـ {theme}"
},
"config-editor": {
"save-location-label": "حفظ الموقع",
"location-local-label": "تطبيق محليا",
"location-disk-label": "اكتب التغييرات في ملف التكوين",
"save-button": "حفظ التغييرات",
"valid-label": "التكوين صالح",
"status-success-msg": "اكتملت المهمة",
"status-fail-msg": "فشلت المهمة",
"success-msg-disk": "تمت كتابة ملف التكوين على القرص بنجاح",
"success-msg-local": "تم حفظ التغييرات المحلية بنجاح",
"success-note-l1": "يجب إعادة إنشاء التطبيق تلقائيًا.",
"success-note-l2": "قد يستغرق هذا ما يصل إلى دقيقة.",
"success-note-l3": "ستحتاج إلى تحديث الصفحة لتصبح التغييرات سارية المفعول.",
"error-msg-save-mode": "الرجاء تحديد \"وضع الحفظ\": محلي أو ملف",
"error-msg-cannot-save": "حدث خطأ أثناء حفظ التكوين",
"error-msg-bad-json": "خطأ في JSON ، ربما يكون غير صحيح",
"warning-msg-validation": "تحذير التحقق",
"not-admin-note": "لا يمكنك الكتابة التغيير إلى القرص ، لأنك لم تقم بتسجيل الدخول كمسؤول"
},
"app-rebuild": {
"title": "إعادة إنشاء التطبيق",
"rebuild-note-l1": "إعادة بناء مطلوب حتى تصبح التغييرات المكتوبة في ملف conf.yml سارية المفعول.",
"rebuild-note-l2": "يجب أن يحدث هذا تلقائيًا ، ولكن إذا لم يحدث ذلك ، فيمكنك تشغيله يدويًا هنا.",
"rebuild-note-l3": "هذا ليس مطلوبًا للتعديلات المخزنة محليًا.",
"rebuild-button": "ابدأ البناء",
"rebuilding-status-1": "بناء...",
"rebuilding-status-2": "قد يستغرق هذا بضع دقائق",
"error-permission": "ليس لديك إذن لبدء هذا الإجراء",
"success-msg": "اكتمل البناء بنجاح",
"fail-msg": "فشلت عملية البناء",
"reload-note": "يلزم الآن إعادة تحميل الصفحة حتى تدخل التغييرات حيز التنفيذ",
"reload-button": "إعادة تحميل الصفحة"
},
"cloud-sync": {
"title": "النسخ الاحتياطي والاستعادة السحابية",
"intro-l1": "تعد ميزة النسخ الاحتياطي والاستعادة السحابية ميزة اختيارية ، تتيح لك تحميل التهيئة الخاصة بك على الإنترنت ، ثم استعادتها على أي جهاز أو مثيل آخر لـ Dashy.",
"intro-l2": "جميع البيانات مشفرة بالكامل من طرف إلى طرف باستخدام AES ، باستخدام كلمة مرورك كمفتاح.",
"intro-l3": "لمزيد من المعلومات ، يرجى الاطلاع على",
"backup-title-setup": "أصنع نسخة إحتياطية",
"backup-title-update": "تحديث النسخ الاحتياطي",
"password-label-setup": "اختر كلمة مرور",
"password-label-update": "ادخل رقمك السري",
"backup-button-setup": "دعم",
"backup-button-update": "تحديث النسخ الاحتياطي",
"backup-id-label": "معرف النسخ الاحتياطي الخاص بك",
"backup-id-note": "يستخدم هذا للاستعادة من النسخ الاحتياطية لاحقًا. لذا احتفظ بها ، جنبًا إلى جنب مع كلمة مرورك في مكان آمن.",
"restore-title": "استعادة نسخة احتياطية",
"restore-id-label": "استعادة الهوية",
"restore-password-label": "كلمه السر",
"restore-button": "يعيد",
"backup-missing-password": "كلمة المرور مفقودة",
"backup-error-unknown": "غير قادر على معالجة الطلب",
"backup-error-password": "كلمة سر خاطئة. الرجاء إدخال كلمة المرور الحالية الخاصة بك.",
"backup-success-msg": "تم بنجاح",
"restore-success-msg": "تمت استعادة التكوين بنجاح"
},
"menu": {
"sametab": "فتح في علامة التبويب الحالية",
"newtab": "فتح في علامة تبويب جديدة",
"modal": "فتح في Pop-Up Modal",
"workspace": "فتح في عرض مساحة العمل"
}
}

172
src/assets/locales/hi.json Normal file
View File

@ -0,0 +1,172 @@
{
"home": {
"no-results": "खोजने पर कोई परिणाम नहीं मिला",
"no-data": "कोई डेटा कॉन्फ़िगर नहीं किया गया"
},
"search": {
"search-label": "खोज",
"search-placeholder": "फ़िल्टर करने के लिए टाइप करना प्रारंभ करें",
"clear-search-tooltip": "स्पष्ट खोज",
"enter-to-search-web": "वेब खोजने के लिए एंटर दबाएं"
},
"login": {
"title": "दशी",
"username-label": "उपयोगकर्ता नाम",
"password-label": "पासवर्ड",
"login-button": "लॉग इन करें",
"remember-me-label": "मुझे याद रखें",
"remember-me-never": "कभी नहीँ",
"remember-me-hour": "चार घंटे",
"remember-me-day": "1 दिन",
"remember-me-week": "1 सप्ताह",
"error-missing-username": "गुम उपयोगकर्ता नाम",
"error-missing-password": "पासवर्ड गुम है",
"error-incorrect-username": "उपयोगकर्ता नहीं मिला",
"error-incorrect-password": "गलत पासवर्ड",
"success-message": "प्रवेश किया...",
"logout-message": "बाहर आ गये",
"already-logged-in-title": "पहले से ही लॉगिन है",
"already-logged-in-text": "आप इस रूप में लॉग इन हैं",
"proceed-to-dashboard": "डैशबोर्ड पर आगे बढ़ें",
"log-out-button": "लॉग आउट",
"proceed-guest-button": "अतिथि के रूप में आगे बढ़ें"
},
"config": {
"main-tab": "मुख्य मेनू",
"view-config-tab": "कॉन्फिग देखें",
"edit-config-tab": "कॉन्फ़िगरेशन संपादित करें",
"custom-css-tab": "कस्टम शैलियाँ",
"heading": "विन्यास विकल्प",
"download-config-button": "कॉन्फिग डाउनलोड करें",
"edit-config-button": "कॉन्फ़िगरेशन संपादित करें",
"edit-css-button": "कस्टम सीएसएस संपादित करें",
"cloud-sync-button": "क्लाउड सिंक सक्षम करें",
"edit-cloud-sync-button": "क्लाउड सिंक संपादित करें",
"rebuild-app-button": "एप्लिकेशन का पुनर्निर्माण करें",
"change-language-button": "ऐप की भाषा बदलें",
"reset-settings-button": "स्थानीय सेटिंग्स रीसेट करें",
"app-info-button": "अनुप्रयोग की जानकारी",
"backup-note": "परिवर्तन करने से पहले अपने कॉन्फ़िगरेशन का बैकअप लेने की अनुशंसा की जाती है।",
"reset-config-msg-l1": "यह स्थानीय संग्रहण से सभी उपयोगकर्ता सेटिंग्स को हटा देगा, लेकिन आपकी 'conf.yml' फ़ाइल को प्रभावित नहीं करेगा।",
"reset-config-msg-l2": "यदि आप भविष्य में उनका उपयोग करना चाहते हैं, तो आपको पहले स्थानीय रूप से किए गए किसी भी परिवर्तन का बैकअप लेना चाहिए।",
"reset-config-msg-l3": "क्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं?",
"data-cleared-msg": "डेटा सफलतापूर्वक साफ़ किया गया",
"actions-label": "कार्रवाई",
"copy-config-label": "कॉन्फिग कॉपी करें",
"data-copied-msg": "कॉन्फिग को क्लिपबोर्ड पर कॉपी कर दिया गया है",
"reset-config-label": "कॉन्फ़िगर रीसेट करें",
"css-save-btn": "परिवर्तनों को सुरक्षित करें",
"css-note-label": "ध्यान दें",
"css-note-l1": "अपने परिवर्तनों को प्रभावी करने के लिए आपको पृष्ठ को रीफ़्रेश करना होगा।",
"css-note-l2": "शैलियाँ ओवरराइड केवल स्थानीय रूप से संग्रहीत की जाती हैं, इसलिए यह अनुशंसा की जाती है कि आप अपने CSS की एक प्रति बनाएँ।",
"css-note-l3": "सभी कस्टम शैलियों को हटाने के लिए, सामग्री हटाएं और परिवर्तन सहेजें दबाएं"
},
"alternate-views": {
"alternate-view-heading": "दृश्य स्विच करें",
"default": "चूक जाना",
"workspace": "कार्यस्थान",
"minimal": "कम से कम"
},
"settings": {
"theme-label": "विषय",
"layout-label": "ख़ाका",
"layout-auto": "ऑटो",
"layout-horizontal": "क्षैतिज",
"layout-vertical": "खड़ा",
"item-size-label": "आइटम का आकार",
"item-size-small": "छोटा",
"item-size-medium": "मध्यम",
"item-size-large": "बड़ा",
"config-launcher-label": "कॉन्फ़िग",
"config-launcher-tooltip": "कॉन्फ़िगरेशन अपडेट करें",
"sign-out-tooltip": "साइन आउट",
"sign-in-tooltip": "लॉग इन करें",
"sign-in-welcome": "नमस्ते {उपयोगकर्ता नाम}!"
},
"updates": {
"app-version-note": "डैशी संस्करण",
"up-to-date": "आधुनिक",
"out-of-date": "उपलब्ध अद्यतन",
"unsupported-version-l1": "आप डैशी के एक असमर्थित संस्करण का उपयोग कर रहे हैं",
"unsupported-version-l2": "सर्वोत्तम अनुभव और हाल के सुरक्षा पैच के लिए, कृपया अपडेट करें"
},
"language-switcher": {
"title": "एप्लिकेशन भाषा बदलें",
"dropdown-label": "भाषा चुनें",
"save-button": "सहेजें",
"success-msg": "भाषा अपडेट की गई"
},
"theme-maker": {
"title": "थीम विन्यासकर्ता",
"export-button": "कस्टम चर निर्यात करें",
"reset-button": "के लिए शैलियाँ रीसेट करें",
"show-all-button": "सभी चर दिखाएं",
"save-button": "सहेजें",
"cancel-button": "रद्द करें",
"saved-toast": "{थीम} सफलतापूर्वक अपडेट किया गया",
"copied-toast": "{theme} का थीम डेटा क्लिपबोर्ड पर कॉपी किया गया",
"reset-toast": "{थीम} के लिए कस्टम रंग निकाले गए"
},
"config-editor": {
"save-location-label": "स्थान सहेजें",
"location-local-label": "स्थानीय रूप से आवेदन करें",
"location-disk-label": "कॉन्फ़िग फ़ाइल में परिवर्तन लिखें",
"save-button": "परिवर्तनों को सुरक्षित करें",
"valid-label": "कॉन्फिग मान्य है",
"status-success-msg": "कार्य पूर्ण",
"status-fail-msg": "कार्य विफल",
"success-msg-disk": "डिस्क पर सफलतापूर्वक लिखी गई कॉन्फ़िग फ़ाइल",
"success-msg-local": "स्थानीय परिवर्तन सफलतापूर्वक सहेजे गए",
"success-note-l1": "ऐप को स्वचालित रूप से पुनर्निर्माण करना चाहिए।",
"success-note-l2": "इसमें एक मिनट तक का समय लग सकता है।",
"success-note-l3": "परिवर्तनों को प्रभावी करने के लिए आपको पृष्ठ को रीफ्रेश करना होगा।",
"error-msg-save-mode": "कृपया एक सहेजें मोड चुनें: स्थानीय या फ़ाइल",
"error-msg-cannot-save": "कॉन्फ़िगरेशन सहेजने में त्रुटि हुई",
"error-msg-bad-json": "JSON में त्रुटि, संभवतः विकृत",
"warning-msg-validation": "सत्यापन चेतावनी",
"not-admin-note": "आप डिस्क में बदला हुआ नहीं लिख सकते, क्योंकि आप एक व्यवस्थापक के रूप में लॉग इन नहीं हैं"
},
"app-rebuild": {
"title": "एप्लिकेशन का पुनर्निर्माण करें",
"rebuild-note-l1": "प्रभावी होने के लिए conf.yml फ़ाइल में लिखे गए परिवर्तनों के लिए एक पुनर्निर्माण आवश्यक है।",
"rebuild-note-l2": "यह स्वचालित रूप से होना चाहिए, लेकिन अगर ऐसा नहीं हुआ है, तो आप इसे यहां मैन्युअल रूप से ट्रिगर कर सकते हैं।",
"rebuild-note-l3": "स्थानीय रूप से संग्रहीत संशोधनों के लिए यह आवश्यक नहीं है।",
"rebuild-button": "निर्माण शुरू करें",
"rebuilding-status-1": "इमारत...",
"rebuilding-status-2": "इसमें कुछ मिनट लग सकते हैं",
"error-permission": "आपको इस क्रिया को ट्रिगर करने की अनुमति नहीं है",
"success-msg": "निर्माण सफलतापूर्वक पूरा हुआ",
"fail-msg": "निर्माण कार्य विफल",
"reload-note": "परिवर्तनों को प्रभावी होने के लिए अब एक पृष्ठ पुनः लोड करना आवश्यक है",
"reload-button": "पृष्ठ पुनः लोड करें"
},
"cloud-sync": {
"title": "क्लाउड बैकअप और पुनर्स्थापना",
"intro-l1": "क्लाउड बैकअप और पुनर्स्थापना एक वैकल्पिक सुविधा है, जो आपको इंटरनेट पर अपना कॉन्फ़िग अपलोड करने में सक्षम बनाती है, और फिर इसे डैशी के किसी अन्य डिवाइस या इंस्टेंस पर पुनर्स्थापित करने में सक्षम बनाती है।",
"intro-l2": "कुंजी के रूप में आपके पासवर्ड का उपयोग करते हुए, सभी डेटा एईएस के साथ पूरी तरह से एंड-टू-एंड एन्क्रिप्टेड है।",
"intro-l3": "अधिक जानकारी के लिए, कृपया देखें",
"backup-title-setup": "एक बैकअप बनाओ",
"backup-title-update": "बैकअप अपडेट करें",
"password-label-setup": "एक पासवर्ड चुनें",
"password-label-update": "अपना कूटशब्द भरें",
"backup-button-setup": "बैकअप",
"backup-button-update": "बैकअप अपडेट करें",
"backup-id-label": "आपकी बैकअप आईडी",
"backup-id-note": "इसका उपयोग बाद में बैकअप से पुनर्स्थापित करने के लिए किया जाता है। इसलिए इसे अपने पासवर्ड के साथ कहीं सुरक्षित रख लें।",
"restore-title": "एक बैकअप पुनर्स्थापित करें",
"restore-id-label": "आईडी पुनर्स्थापित करें",
"restore-password-label": "पासवर्ड",
"restore-button": "पुनर्स्थापित",
"backup-missing-password": "पासवर्ड गुम है",
"backup-error-unknown": "अनुरोध संसाधित करने में असमर्थ",
"backup-error-password": "गलत पासवर्ड। कृपया अपना वर्तमान पासवर्ड दर्ज करें।",
"backup-success-msg": "सफलतापुर्वक पूरा",
"restore-success-msg": "कॉन्फ़िगरेशन सफलतापूर्वक पुनर्स्थापित किया गया"
},
"menu": {
"sametab": "वर्तमान टैब में खोलें",
"newtab": "वेब टेब में खोलें",
"modal": "पॉप-अप मोडल में खोलें",
"workspace": "कार्यक्षेत्र दृश्य में खोलें"
}
}

172
src/assets/locales/it.json Normal file
View File

@ -0,0 +1,172 @@
{
"home": {
"no-results": "nessun risultato trovato",
"no-data": "Nessun dato configurato"
},
"search": {
"search-label": "Ricerca",
"search-placeholder": "Inizia a digitare per filtrare",
"clear-search-tooltip": "Cancella ricerca",
"enter-to-search-web": "Premi invio per cercare nel web"
},
"login": {
"title": "Dashy",
"username-label": "Nome utente",
"password-label": "Parola d'ordine",
"login-button": "Login",
"remember-me-label": "Ricordami per",
"remember-me-never": "Mai",
"remember-me-hour": "4 ore",
"remember-me-day": "1 giorno",
"remember-me-week": "1 settimana",
"error-missing-username": "Nome utente mancante",
"error-missing-password": "Password mancante",
"error-incorrect-username": "Utente non trovato",
"error-incorrect-password": "Password errata",
"success-message": "Entrando...",
"logout-message": "Disconnesso",
"already-logged-in-title": "Ha già effettuato il login",
"already-logged-in-text": "Hai effettuato l'accesso come",
"proceed-to-dashboard": "Procedi alla dashboard",
"log-out-button": "Disconnettersi",
"proceed-guest-button": "Procedi come ospite"
},
"config": {
"main-tab": "Menu principale",
"view-config-tab": "Visualizza configurazione",
"edit-config-tab": "Modifica configurazione",
"custom-css-tab": "Stili personalizzati",
"heading": "Opzioni di configurazione",
"download-config-button": "Scarica configurazione",
"edit-config-button": "Modifica configurazione",
"edit-css-button": "Modifica CSS personalizzato",
"cloud-sync-button": "Abilita sincronizzazione cloud",
"edit-cloud-sync-button": "Modifica sincronizzazione cloud",
"rebuild-app-button": "Ricostruisci applicazione",
"change-language-button": "Cambia la lingua dell'app",
"reset-settings-button": "Ripristina impostazioni locali",
"app-info-button": "Informazioni sull'app",
"backup-note": "Si consiglia di eseguire un backup della configurazione prima di apportare modifiche.",
"reset-config-msg-l1": "Questo rimuoverà tutte le impostazioni utente dalla memoria locale, ma non influenzerà il tuo file 'conf.yml'.",
"reset-config-msg-l2": "Dovresti prima eseguire il backup di tutte le modifiche apportate localmente, se desideri utilizzarle in futuro.",
"reset-config-msg-l3": "Sei sicuro di voler procedere?",
"data-cleared-msg": "Dati cancellati con successo",
"actions-label": "Azioni",
"copy-config-label": "Copia configurazione",
"data-copied-msg": "La configurazione è stata copiata negli appunti",
"reset-config-label": "Ripristina configurazione",
"css-save-btn": "Salvare le modifiche",
"css-note-label": "Nota",
"css-note-l1": "Sarà necessario aggiornare la pagina affinché le modifiche abbiano effetto.",
"css-note-l2": "Le sostituzioni di stili sono memorizzate solo localmente, quindi si consiglia di fare una copia del proprio CSS.",
"css-note-l3": "Per rimuovere tutti gli stili personalizzati, elimina i contenuti e premi Salva modifiche"
},
"alternate-views": {
"alternate-view-heading": "Cambia vista",
"default": "Predefinito",
"workspace": "Area di lavoro",
"minimal": "Minimo"
},
"settings": {
"theme-label": "Tema",
"layout-label": "Disposizione",
"layout-auto": "Auto",
"layout-horizontal": "Orizzontale",
"layout-vertical": "Verticale",
"item-size-label": "Dimensione articolo",
"item-size-small": "Piccolo",
"item-size-medium": "medio",
"item-size-large": "Grande",
"config-launcher-label": "config",
"config-launcher-tooltip": "Aggiorna configurazione",
"sign-out-tooltip": "Disconnessione",
"sign-in-tooltip": "Accesso",
"sign-in-welcome": "Ciao {nome utente}!"
},
"updates": {
"app-version-note": "Versione Dash",
"up-to-date": "Aggiornato",
"out-of-date": "Aggiornamento disponibile",
"unsupported-version-l1": "Stai utilizzando una versione non supportata di Dashy",
"unsupported-version-l2": "Per la migliore esperienza e le patch di sicurezza recenti, aggiorna a"
},
"language-switcher": {
"title": "Cambia lingua applicazione",
"dropdown-label": "Seleziona una lingua",
"save-button": "Salva",
"success-msg": "Lingua aggiornata a"
},
"theme-maker": {
"title": "Configuratore di temi",
"export-button": "Esporta variabili personalizzate",
"reset-button": "Ripristina stili per",
"show-all-button": "Mostra tutte le variabili",
"save-button": "Salva",
"cancel-button": "Annulla",
"saved-toast": "{theme} aggiornato con successo",
"copied-toast": "Dati del tema per {theme} copiati negli appunti",
"reset-toast": "Colori personalizzati per {theme} rimossi"
},
"config-editor": {
"save-location-label": "Salva l'indirizzo",
"location-local-label": "Applicare localmente",
"location-disk-label": "Scrivi modifiche al file di configurazione",
"save-button": "Salvare le modifiche",
"valid-label": "La configurazione è valida",
"status-success-msg": "Compito completato",
"status-fail-msg": "Attività fallita",
"success-msg-disk": "File di configurazione scritto su disco con successo",
"success-msg-local": "Modifiche locali salvate con successo",
"success-note-l1": "L'app dovrebbe ricostruirsi automaticamente.",
"success-note-l2": "Questa operazione potrebbe richiedere fino a un minuto.",
"success-note-l3": "Sarà necessario aggiornare la pagina affinché le modifiche abbiano effetto.",
"error-msg-save-mode": "Seleziona una modalità di salvataggio: Locale o File",
"error-msg-cannot-save": "Si è verificato un errore durante il salvataggio della configurazione",
"error-msg-bad-json": "Errore in JSON, probabilmente non valido",
"warning-msg-validation": "Avviso di convalida",
"not-admin-note": "Non puoi scrivere le modifiche su disco, perché non sei loggato come amministratore"
},
"app-rebuild": {
"title": "Ricostruisci applicazione",
"rebuild-note-l1": "È necessaria una ricostruzione affinché le modifiche scritte nel file conf.yml abbiano effetto.",
"rebuild-note-l2": "Questo dovrebbe accadere automaticamente, ma in caso contrario, puoi attivarlo manualmente qui.",
"rebuild-note-l3": "Questo non è richiesto per le modifiche memorizzate localmente.",
"rebuild-button": "Inizia a costruire",
"rebuilding-status-1": "Costruzione...",
"rebuilding-status-2": "Questo potrebbe richiedere alcuni minuti",
"error-permission": "Non hai l'autorizzazione per attivare questa azione",
"success-msg": "Build completata con successo",
"fail-msg": "Operazione di compilazione non riuscita",
"reload-note": "È ora necessario ricaricare la pagina affinché le modifiche abbiano effetto",
"reload-button": "Ricarica la pagina"
},
"cloud-sync": {
"title": "Backup e ripristino su cloud",
"intro-l1": "Il backup e il ripristino su cloud sono una funzionalità opzionale che ti consente di caricare la tua configurazione su Internet e quindi ripristinarla su qualsiasi altro dispositivo o istanza di Dashy.",
"intro-l2": "Tutti i dati sono completamente crittografati end-to-end con AES, utilizzando la tua password come chiave.",
"intro-l3": "Per maggiori informazioni, vedere il",
"backup-title-setup": "Fai un backup",
"backup-title-update": "Aggiorna backup",
"password-label-setup": "Scegli una password",
"password-label-update": "Inserisci la tua password",
"backup-button-setup": "Backup",
"backup-button-update": "Aggiorna backup",
"backup-id-label": "Il tuo ID di backup",
"backup-id-note": "Questo viene utilizzato per ripristinare dai backup in un secondo momento. Quindi tienilo, insieme alla tua password, in un posto sicuro.",
"restore-title": "Ripristina un backup",
"restore-id-label": "Ripristina ID",
"restore-password-label": "Parola d'ordine",
"restore-button": "Ristabilire",
"backup-missing-password": "Password mancante",
"backup-error-unknown": "Impossibile elaborare la richiesta",
"backup-error-password": "Password errata. Inserisci la tua password attuale.",
"backup-success-msg": "Completato con successo",
"restore-success-msg": "Configurazione ripristinata con successo"
},
"menu": {
"sametab": "Apri nella scheda corrente",
"newtab": "Apri in una nuova scheda",
"modal": "Apri in modalità pop-up",
"workspace": "Apri nella vista dell'area di lavoro"
}
}

172
src/assets/locales/ja.json Normal file
View File

@ -0,0 +1,172 @@
{
"home": {
"no-results": "検索結果がありません",
"no-data": "データが構成されていません"
},
"search": {
"search-label": "検索",
"search-placeholder": "フィルタリングするために入力を開始します",
"clear-search-tooltip": "クリア検索",
"enter-to-search-web": "Enterキーを押して、Webを検索します"
},
"login": {
"title": "ダシー",
"username-label": "ユーザー名",
"password-label": "パスワード",
"login-button": "ログイン",
"remember-me-label": "私を覚えておいてください",
"remember-me-never": "一度もない",
"remember-me-hour": "4時間",
"remember-me-day": "1日",
"remember-me-week": "1週間",
"error-missing-username": "ユーザー名がありません",
"error-missing-password": "パスワードがありません",
"error-incorrect-username": "ユーザーが見つかりません",
"error-incorrect-password": "パスワードが正しくありません",
"success-message": "ログインしています...",
"logout-message": "ログアウトしました",
"already-logged-in-title": "ログイン済み",
"already-logged-in-text": "としてログインしています",
"proceed-to-dashboard": "ダッシュボードに進みます",
"log-out-button": "ログアウト",
"proceed-guest-button": "ゲストとして続行"
},
"config": {
"main-tab": "メインメニュー",
"view-config-tab": "構成の表示",
"edit-config-tab": "構成の編集",
"custom-css-tab": "カスタムスタイル",
"heading": "構成オプション",
"download-config-button": "構成のダウンロード",
"edit-config-button": "構成の編集",
"edit-css-button": "カスタムCSSを編集する",
"cloud-sync-button": "クラウド同期を有効にする",
"edit-cloud-sync-button": "CloudSyncを編集する",
"rebuild-app-button": "アプリケーションを再構築する",
"change-language-button": "アプリの言語を変更する",
"reset-settings-button": "ローカル設定をリセット",
"app-info-button": "アプリ情報",
"backup-note": "変更を加える前に、構成のバックアップを作成することをお勧めします。",
"reset-config-msg-l1": "これにより、ローカルストレージからすべてのユーザー設定が削除されますが、「conf.yml」ファイルには影響しません。",
"reset-config-msg-l2": "将来使用する場合は、最初にローカルで行った変更をバックアップする必要があります。",
"reset-config-msg-l3": "続行してもよろしいですか?",
"data-cleared-msg": "データは正常にクリアされました",
"actions-label": "行動",
"copy-config-label": "構成のコピー",
"data-copied-msg": "構成がクリップボードにコピーされました",
"reset-config-label": "構成のリセット",
"css-save-btn": "変更内容を保存",
"css-note-label": "ノート",
"css-note-l1": "変更を有効にするには、ページを更新する必要があります。",
"css-note-l2": "スタイルのオーバーライドはローカルにのみ保存されるため、CSSのコピーを作成することをお勧めします。",
"css-note-l3": "すべてのカスタムスタイルを削除するには、コンテンツを削除して[変更を保存]をクリックします"
},
"alternate-views": {
"alternate-view-heading": "ビューの切り替え",
"default": "ディフォルト",
"workspace": "ワークスペース",
"minimal": "最小限"
},
"settings": {
"theme-label": "テーマ",
"layout-label": "レイアウト",
"layout-auto": "自動",
"layout-horizontal": "水平",
"layout-vertical": "垂直",
"item-size-label": "アイテムサイズ",
"item-size-small": "小さな",
"item-size-medium": "中くらい",
"item-size-large": "大きい",
"config-launcher-label": "構成",
"config-launcher-tooltip": "構成の更新",
"sign-out-tooltip": "サインアウト",
"sign-in-tooltip": "ログインする",
"sign-in-welcome": "こんにちは{ユーザー名}"
},
"updates": {
"app-version-note": "Dashyバージョン",
"up-to-date": "最新の",
"out-of-date": "利用可能なアップデート",
"unsupported-version-l1": "サポートされていないバージョンのDashyを使用しています",
"unsupported-version-l2": "最高のエクスペリエンスと最近のセキュリティパッチについては、に更新してください。"
},
"language-switcher": {
"title": "アプリケーション言語の変更",
"dropdown-label": "言語を選択してください",
"save-button": "保存する",
"success-msg": "言語が更新されました"
},
"theme-maker": {
"title": "テーマコンフィギュレーター",
"export-button": "カスタム変数のエクスポート",
"reset-button": "のスタイルをリセット",
"show-all-button": "すべての変数を表示",
"save-button": "保存する",
"cancel-button": "キャンセル",
"saved-toast": "{テーマ}正常に更新されました",
"copied-toast": "クリップボードにコピーされた{theme}のテーマデータ",
"reset-toast": "{theme}のカスタムカラーが削除されました"
},
"config-editor": {
"save-location-label": "位置を保存",
"location-local-label": "ローカルで適用",
"location-disk-label": "構成ファイルへの変更の書き込み",
"save-button": "変更内容を保存",
"valid-label": "構成は有効です",
"status-success-msg": "タスク完了",
"status-fail-msg": "タスクが失敗しました",
"success-msg-disk": "構成ファイルがディスクに正常に書き込まれました",
"success-msg-local": "ローカルの変更が正常に保存されました",
"success-note-l1": "アプリは自動的に再構築されます。",
"success-note-l2": "これには最大1分かかる場合があります。",
"success-note-l3": "変更を有効にするには、ページを更新する必要があります。",
"error-msg-save-mode": "保存モードを選択してください:ローカルまたはファイル",
"error-msg-cannot-save": "設定の保存中にエラーが発生しました",
"error-msg-bad-json": "JSONのエラー、おそらく不正な形式",
"warning-msg-validation": "検証の警告",
"not-admin-note": "管理者としてログインしていないため、変更をディスクに書き込むことはできません"
},
"app-rebuild": {
"title": "アプリケーションを再構築する",
"rebuild-note-l1": "conf.ymlファイルに書き込まれた変更を有効にするには、再構築が必要です。",
"rebuild-note-l2": "これは自動的に発生するはずですが、発生していない場合は、ここで手動でトリガーできます。",
"rebuild-note-l3": "これは、ローカルに保存された変更には必要ありません。",
"rebuild-button": "ビルドを開始します",
"rebuilding-status-1": "建物...",
"rebuilding-status-2": "これには数分かかる場合があります",
"error-permission": "このアクションをトリガーする権限がありません",
"success-msg": "ビルドが正常に完了しました",
"fail-msg": "ビルド操作に失敗しました",
"reload-note": "変更を有効にするには、ページの再読み込みが必要になりました",
"reload-button": "ページをリロード"
},
"cloud-sync": {
"title": "クラウドのバックアップと復元",
"intro-l1": "クラウドのバックアップと復元はオプションの機能であり、構成をインターネットにアップロードしてから、他のデバイスまたはDashyのインスタンスに復元することができます。",
"intro-l2": "すべてのデータは、パスワードをキーとして使用して、AESで完全にエンドツーエンドで暗号化されます。",
"intro-l3": "詳細については、",
"backup-title-setup": "バックアップを作成する",
"backup-title-update": "バックアップの更新",
"password-label-setup": "パスワードを決めて下さい",
"password-label-update": "パスワードを入力してください",
"backup-button-setup": "バックアップ",
"backup-button-update": "バックアップの更新",
"backup-id-label": "バックアップID",
"backup-id-note": "これは、後でバックアップから復元するために使用されます。したがって、パスワードと一緒に安全な場所に保管してください。",
"restore-title": "バックアップを復元する",
"restore-id-label": "IDを復元",
"restore-password-label": "パスワード",
"restore-button": "戻す",
"backup-missing-password": "パスワードがありません",
"backup-error-unknown": "リクエストを処理できません",
"backup-error-password": "パスワードが正しくありません。現在のパスワードを入力してください。",
"backup-success-msg": "正常に完了しました",
"restore-success-msg": "構成が正常に復元されました"
},
"menu": {
"sametab": "現在のタブで開く",
"newtab": "新しいタブで開く",
"modal": "ポップアップモーダルで開く",
"workspace": "ワークスペースビューで開く"
}
}

172
src/assets/locales/pt.json Normal file
View File

@ -0,0 +1,172 @@
{
"home": {
"no-results": "Sem resultados de pesquisa",
"no-data": "Nenhum dado configurado"
},
"search": {
"search-label": "Procurar",
"search-placeholder": "Comece a digitar para filtrar",
"clear-search-tooltip": "Limpar pesquisa",
"enter-to-search-web": "Pressione Enter para pesquisar na web"
},
"login": {
"title": "Dashy",
"username-label": "Nome do usuário",
"password-label": "Senha",
"login-button": "Conecte-se",
"remember-me-label": "Lembre-se de mim para",
"remember-me-never": "Nunca",
"remember-me-hour": "4 horas",
"remember-me-day": "1 dia",
"remember-me-week": "1 semana",
"error-missing-username": "Nome de usuário ausente",
"error-missing-password": "Senha ausente",
"error-incorrect-username": "Usuário não encontrado",
"error-incorrect-password": "Senha incorreta",
"success-message": "Fazendo login ...",
"logout-message": "Desconectado",
"already-logged-in-title": "Já logado",
"already-logged-in-text": "Você está logado como",
"proceed-to-dashboard": "Prossiga para o painel",
"log-out-button": "Sair",
"proceed-guest-button": "Prossiga como Convidado"
},
"config": {
"main-tab": "Menu principal",
"view-config-tab": "Ver config",
"edit-config-tab": "Editar configuração",
"custom-css-tab": "Estilos Personalizados",
"heading": "Opções de configuração",
"download-config-button": "Baixar configuração",
"edit-config-button": "Editar configuração",
"edit-css-button": "Editar CSS personalizado",
"cloud-sync-button": "Habilitar sincronização em nuvem",
"edit-cloud-sync-button": "Editar sincronização na nuvem",
"rebuild-app-button": "Recriar aplicativo",
"change-language-button": "Alterar o idioma do aplicativo",
"reset-settings-button": "Redefinir as configurações locais",
"app-info-button": "Informações do aplicativo",
"backup-note": "É recomendável fazer um backup de sua configuração antes de fazer alterações.",
"reset-config-msg-l1": "Isso removerá todas as configurações do usuário do armazenamento local, mas não afetará o arquivo 'conf.yml'.",
"reset-config-msg-l2": "Você deve primeiro fazer backup de todas as alterações feitas localmente, se quiser usá-las no futuro.",
"reset-config-msg-l3": "Tem certeza de que deseja continuar?",
"data-cleared-msg": "Dados apagados com sucesso",
"actions-label": "Ações",
"copy-config-label": "Copiar configuração",
"data-copied-msg": "A configuração foi copiada para a área de transferência",
"reset-config-label": "Redefinir configuração",
"css-save-btn": "Salvar alterações",
"css-note-label": "Observação",
"css-note-l1": "Você precisará atualizar a página para que as alterações tenham efeito.",
"css-note-l2": "As substituições de estilos são armazenadas apenas localmente, portanto, é recomendável fazer uma cópia do seu CSS.",
"css-note-l3": "Para remover todos os estilos personalizados, exclua o conteúdo e clique em Salvar alterações"
},
"alternate-views": {
"alternate-view-heading": "Mudar de vista",
"default": "Predefinição",
"workspace": "Área de trabalho",
"minimal": "Mínimo"
},
"settings": {
"theme-label": "Tema",
"layout-label": "Layout",
"layout-auto": "Auto",
"layout-horizontal": "Horizontal",
"layout-vertical": "Vertical",
"item-size-label": "Tamanho do item",
"item-size-small": "Pequena",
"item-size-medium": "Médio",
"item-size-large": "Grande",
"config-launcher-label": "Config",
"config-launcher-tooltip": "Atualizar configuração",
"sign-out-tooltip": "Sair",
"sign-in-tooltip": "Conecte-se",
"sign-in-welcome": "Olá {nome de usuário}!"
},
"updates": {
"app-version-note": "Versão Dashy",
"up-to-date": "Atualizado",
"out-of-date": "Atualização disponível",
"unsupported-version-l1": "Você está usando uma versão não suportada do Dashy",
"unsupported-version-l2": "Para obter a melhor experiência e patches de segurança recentes, atualize para"
},
"language-switcher": {
"title": "Alterar o idioma do aplicativo",
"dropdown-label": "Selecione um idioma",
"save-button": "Salve ",
"success-msg": "Idioma atualizado para"
},
"theme-maker": {
"title": "Configurador de Tema",
"export-button": "Exportar Variáveis Personalizadas",
"reset-button": "Redefinir estilos para",
"show-all-button": "Mostrar todas as variáveis",
"save-button": "Salve ",
"cancel-button": "Cancelar",
"saved-toast": "{theme} atualizado com sucesso",
"copied-toast": "Dados do tema para {theme} copiados para a área de transferência",
"reset-toast": "Cores personalizadas para {theme} removidas"
},
"config-editor": {
"save-location-label": "Salvar localização",
"location-local-label": "Aplicar localmente",
"location-disk-label": "Gravar alterações no arquivo de configuração",
"save-button": "Salvar alterações",
"valid-label": "A configuração é válida",
"status-success-msg": "Tarefa Concluída",
"status-fail-msg": "Falha na Tarefa",
"success-msg-disk": "Arquivo de configuração gravado no disco com sucesso",
"success-msg-local": "Alterações locais salvas com sucesso",
"success-note-l1": "O aplicativo deve ser reconstruído automaticamente.",
"success-note-l2": "Isso pode levar até um minuto.",
"success-note-l3": "Você precisará atualizar a página para que as alterações tenham efeito.",
"error-msg-save-mode": "Selecione um Modo de Salvar: Local ou Arquivo",
"error-msg-cannot-save": "Ocorreu um erro ao salvar a configuração",
"error-msg-bad-json": "Erro em JSON, possivelmente malformado",
"warning-msg-validation": "Aviso de Validação",
"not-admin-note": "Você não pode gravar alterações no disco, porque você não está conectado como administrador"
},
"app-rebuild": {
"title": "Recriar aplicativo",
"rebuild-note-l1": "Uma reconstrução é necessária para que as alterações gravadas no arquivo conf.yml tenham efeito.",
"rebuild-note-l2": "Isso deve acontecer automaticamente, mas se não aconteceu, você pode acioná-lo manualmente aqui.",
"rebuild-note-l3": "Isso não é necessário para modificações armazenadas localmente.",
"rebuild-button": "Começar a construir",
"rebuilding-status-1": "Construção...",
"rebuilding-status-2": "Isso pode levar alguns minutos",
"error-permission": "Você não tem permissão para acionar esta ação",
"success-msg": "Construção concluída com sucesso",
"fail-msg": "A operação de construção falhou",
"reload-note": "Agora é necessário recarregar a página para que as alterações tenham efeito",
"reload-button": "Recarregar página"
},
"cloud-sync": {
"title": "Backup e restauração em nuvem",
"intro-l1": "O backup e restauração em nuvem é um recurso opcional que permite fazer upload de sua configuração para a Internet e, em seguida, restaurá-la em qualquer outro dispositivo ou instância do Dashy.",
"intro-l2": "Todos os dados são totalmente criptografados de ponta a ponta com AES, usando sua senha como chave.",
"intro-l3": "Para obter mais informações, consulte o",
"backup-title-setup": "Faça um backup",
"backup-title-update": "Atualizar backup",
"password-label-setup": "Escolha uma senha",
"password-label-update": "Coloque sua senha",
"backup-button-setup": "Cópia de segurança",
"backup-button-update": "Atualizar backup",
"backup-id-label": "Seu ID de backup",
"backup-id-note": "Isso é usado para restaurar a partir de backups posteriormente. Portanto, guarde-o junto com sua senha em um local seguro.",
"restore-title": "Restaurar um backup",
"restore-id-label": "ID de restauração",
"restore-password-label": "Senha",
"restore-button": "Restaurar",
"backup-missing-password": "Senha ausente",
"backup-error-unknown": "Incapaz de processar o pedido",
"backup-error-password": "Senha incorreta. Por favor, digite sua senha atual.",
"backup-success-msg": "Completado com sucesso",
"restore-success-msg": "Configuração restaurada com sucesso"
},
"menu": {
"sametab": "Abrir na guia atual",
"newtab": "Abrir em nova aba",
"modal": "Abrir em pop-up modal",
"workspace": "Abrir na visualização do espaço de trabalho"
}
}

172
src/assets/locales/ru.json Normal file
View File

@ -0,0 +1,172 @@
{
"home": {
"no-results": "Нет Результатов Поиска",
"no-data": "Данные не настроены"
},
"search": {
"search-label": "Поиск",
"search-placeholder": "Начните вводить, чтобы отфильтровать",
"clear-search-tooltip": "Очистить поиск",
"enter-to-search-web": "Нажмите \"Ввод\" для поиска в Интернете"
},
"login": {
"title": "Даши",
"username-label": "Имя пользователя",
"password-label": "Пароль",
"login-button": "Авторизоваться",
"remember-me-label": "Помни меня за",
"remember-me-never": "Никогда",
"remember-me-hour": "4 часа",
"remember-me-day": "1 день",
"remember-me-week": "1 неделя",
"error-missing-username": "Отсутствует имя пользователя",
"error-missing-password": "Отсутствует пароль",
"error-incorrect-username": "Пользователь не найден",
"error-incorrect-password": "Неверный пароль",
"success-message": "Вход в систему...",
"logout-message": "Вышли из",
"already-logged-in-title": "Уже вошли в систему",
"already-logged-in-text": "Вы вошли как",
"proceed-to-dashboard": "Перейти на панель управления",
"log-out-button": "Выйти",
"proceed-guest-button": "Продолжить как гость"
},
"config": {
"main-tab": "Главное меню",
"view-config-tab": "Просмотр конфигурации",
"edit-config-tab": "Изменить конфигурацию",
"custom-css-tab": "Пользовательские стили",
"heading": "Варианты конфигурации",
"download-config-button": "Скачать конфигурацию",
"edit-config-button": "Изменить конфигурацию",
"edit-css-button": "Редактировать собственный CSS",
"cloud-sync-button": "Включить облачную синхронизацию",
"edit-cloud-sync-button": "Изменить Cloud Sync",
"rebuild-app-button": "Восстановить приложение",
"change-language-button": "Изменить язык приложения",
"reset-settings-button": "Сбросить локальные настройки",
"app-info-button": "Информация о приложении",
"backup-note": "Перед внесением изменений рекомендуется сделать резервную копию вашей конфигурации.",
"reset-config-msg-l1": "Это удалит все пользовательские настройки из локального хранилища, но не повлияет на ваш файл conf.yml.",
"reset-config-msg-l2": "Вы должны сначала сделать резервную копию любых изменений, которые вы внесли локально, если вы хотите использовать их в будущем.",
"reset-config-msg-l3": "Вы уверены, что хотите продолжить?",
"data-cleared-msg": "Данные успешно очищены",
"actions-label": "Действия",
"copy-config-label": "Копировать конфигурацию",
"data-copied-msg": "Конфиг скопирован в буфер обмена",
"reset-config-label": "Сбросить конфигурацию",
"css-save-btn": "Сохранить изменения",
"css-note-label": "Примечание",
"css-note-l1": "Вам нужно будет обновить страницу, чтобы изменения вступили в силу.",
"css-note-l2": "Переопределения стилей хранятся только локально, поэтому рекомендуется сделать копию вашего CSS.",
"css-note-l3": "Чтобы удалить все пользовательские стили, удалите содержимое и нажмите «Сохранить изменения»."
},
"alternate-views": {
"alternate-view-heading": "Переключить вид",
"default": "Дефолт",
"workspace": "Рабочая среда",
"minimal": "Минимальный"
},
"settings": {
"theme-label": "Тема",
"layout-label": "Макет",
"layout-auto": "Авто",
"layout-horizontal": "По горизонтали",
"layout-vertical": "Вертикальный",
"item-size-label": "Размер элемента",
"item-size-small": "Небольшой",
"item-size-medium": "Середина",
"item-size-large": "Большой",
"config-launcher-label": "Конфиг",
"config-launcher-tooltip": "Обновить конфигурацию",
"sign-out-tooltip": "Выход",
"sign-in-tooltip": "Авторизоваться",
"sign-in-welcome": "Здравствуйте, {username}!"
},
"updates": {
"app-version-note": "Даши версия",
"up-to-date": "Своевременно",
"out-of-date": "Доступно обновление",
"unsupported-version-l1": "Вы используете неподдерживаемую версию Dashy",
"unsupported-version-l2": "Для оптимальной работы и получения последних исправлений безопасности, пожалуйста, обновите до"
},
"language-switcher": {
"title": "Изменить язык приложения",
"dropdown-label": "Выберите язык",
"save-button": "Сохранить",
"success-msg": "Язык обновлен до"
},
"theme-maker": {
"title": "Конфигуратор темы",
"export-button": "Экспорт пользовательских переменных",
"reset-button": "Сбросить стили для",
"show-all-button": "Показать все переменные",
"save-button": "Сохранить",
"cancel-button": "Отмена",
"saved-toast": "{theme} Обновлено успешно",
"copied-toast": "Данные темы для {theme} скопированы в буфер обмена",
"reset-toast": "Пользовательские цвета для {theme} удалены"
},
"config-editor": {
"save-location-label": "Сохранить местоположение",
"location-local-label": "Применять локально",
"location-disk-label": "Запись изменений в файл конфигурации",
"save-button": "Сохранить изменения",
"valid-label": "Конфигурация действительна",
"status-success-msg": "Задача завершена",
"status-fail-msg": "Сбой задачи",
"success-msg-disk": "Файл конфигурации успешно записан на диск",
"success-msg-local": "Локальные изменения успешно сохранены",
"success-note-l1": "Приложение должно перестроиться автоматически.",
"success-note-l2": "Это может занять до минуты.",
"success-note-l3": "Вам нужно будет обновить страницу, чтобы изменения вступили в силу.",
"error-msg-save-mode": "Пожалуйста, выберите режим сохранения: локальный или файл",
"error-msg-cannot-save": "Произошла ошибка при сохранении конфигурации",
"error-msg-bad-json": "Ошибка в JSON, возможно, неверный формат",
"warning-msg-validation": "Предупреждение о проверке",
"not-admin-note": "Вы не можете записать измененные на диск, потому что вы не вошли в систему как администратор"
},
"app-rebuild": {
"title": "Восстановить приложение",
"rebuild-note-l1": "Чтобы изменения, записанные в файл conf.yml, вступили в силу, требуется перестройка.",
"rebuild-note-l2": "Это должно произойти автоматически, но если этого не произошло, вы можете запустить это вручную здесь.",
"rebuild-note-l3": "Это не требуется для изменений, хранящихся локально.",
"rebuild-button": "Начать сборку",
"rebuilding-status-1": "Строительство...",
"rebuilding-status-2": "Это может занять несколько минут",
"error-permission": "У вас нет разрешения запускать это действие",
"success-msg": "Сборка успешно завершена",
"fail-msg": "Не удалось выполнить операцию сборки",
"reload-note": "Теперь требуется перезагрузка страницы, чтобы изменения вступили в силу.",
"reload-button": "Перезагрузить страницу"
},
"cloud-sync": {
"title": "Резервное копирование и восстановление в облаке",
"intro-l1": "Резервное копирование и восстановление в облако - это дополнительная функция, которая позволяет вам загрузить свою конфигурацию в Интернет, а затем восстановить ее на любом другом устройстве или экземпляре Dashy.",
"intro-l2": "Все данные полностью зашифрованы с помощью AES с использованием вашего пароля в качестве ключа.",
"intro-l3": "Для получения дополнительной информации см.",
"backup-title-setup": "Сделать резервную копию",
"backup-title-update": "Обновить резервную копию",
"password-label-setup": "Выберите пароль",
"password-label-update": "Введите ваш пароль",
"backup-button-setup": "Резервное копирование",
"backup-button-update": "Обновить резервную копию",
"backup-id-label": "Ваш резервный идентификатор",
"backup-id-note": "Это используется для восстановления из резервных копий позже. Так что храните его вместе со своим паролем в надежном месте.",
"restore-title": "Восстановить резервную копию",
"restore-id-label": "Восстановить ID",
"restore-password-label": "Пароль",
"restore-button": "Восстановить",
"backup-missing-password": "Отсутствует пароль",
"backup-error-unknown": "Невозможно обработать запрос",
"backup-error-password": "Неверный пароль. Пожалуйста, введите ваш текущий пароль.",
"backup-success-msg": "Успешно завершено",
"restore-success-msg": "Конфигурация успешно восстановлена"
},
"menu": {
"sametab": "Открыть в текущей вкладке",
"newtab": "Открыть в новой вкладке",
"modal": "Открыть в модальном всплывающем окне",
"workspace": "Открыть в представлении рабочей области"
}
}

View File

@ -64,7 +64,7 @@ import VJsoneditor from 'v-jsoneditor';
import ErrorHandler, { InfoHandler } from '@/utils/ErrorHandler';
import configSchema from '@/utils/ConfigSchema.json';
import JsonToYaml from '@/utils/JsonToYaml';
import { localStorageKeys } from '@/utils/defaults';
import { localStorageKeys, serviceEndpoints } from '@/utils/defaults';
import { isUserAdmin } from '@/utils/Auth';
export default {
@ -121,7 +121,7 @@ export default {
const yaml = this.jsonParser(this.jsonData);
// 2. Prepare the request
const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;
const endpoint = `${baseUrl}/config-manager/save`;
const endpoint = `${baseUrl}${serviceEndpoints.save}`;
const headers = { 'Content-Type': 'text/plain' };
const body = { config: yaml, timestamp: new Date() };
const request = axios.post(endpoint, body, headers);

View File

@ -48,10 +48,10 @@
import axios from 'axios';
import ProgressBar from 'rsup-progress';
import Button from '@/components/FormElements/Button';
import { modalNames } from '@/utils/defaults';
import RebuildIcon from '@/assets/interface-icons/application-rebuild.svg';
import ReloadIcon from '@/assets/interface-icons/application-reload.svg';
import LoadingAnimation from '@/assets/interface-icons/loader.svg';
import { modalNames, serviceEndpoints } from '@/utils/defaults';
export default {
name: 'RebuildApp',
@ -76,7 +76,7 @@ export default {
/* Calls to the rebuild endpoint, to kickoff the app build */
startBuild() {
const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;
const endpoint = `${baseUrl}/config-manager/rebuild`;
const endpoint = `${baseUrl}${serviceEndpoints.rebuild}`;
this.loading = true;
this.progress.start();
axios.get(endpoint)

View File

@ -21,7 +21,7 @@
v-bind:style="customStyles" class="bounce" />
<!-- Small icon, showing opening method on hover -->
<ItemOpenMethodIcon class="opening-method-icon" :isSmall="!icon || itemSize === 'small'"
:openingMethod="target" :position="itemSize === 'medium'? 'bottom right' : 'top right'"
:openingMethod="target" position="bottom right"
:hotkey="hotkey" />
<!-- Status indicator dot (if enabled) showing weather srevice is availible -->
<StatusIndicator
@ -49,7 +49,7 @@ import Icon from '@/components/LinkItems/ItemIcon.vue';
import ItemOpenMethodIcon from '@/components/LinkItems/ItemOpenMethodIcon';
import StatusIndicator from '@/components/LinkItems/StatusIndicator';
import ContextMenu from '@/components/LinkItems/ContextMenu';
import { localStorageKeys } from '@/utils/defaults';
import { localStorageKeys, serviceEndpoints } from '@/utils/defaults';
export default {
name: 'Item',
@ -173,7 +173,7 @@ export default {
// Deterimine if user disabled security
const enableInsecure = statusCheckAllowInsecure ? '&enableInsecure=true' : '';
// Construct the full API endpoint's URL with GET params
return `${baseUrl}/ping/${urlToCheck}${headers}${enableInsecure}`;
return `${baseUrl}${serviceEndpoints.statusCheck}/${urlToCheck}${headers}${enableInsecure}`;
},
/* Checks if a given service is currently online */
checkWebsiteStatus() {
@ -414,30 +414,6 @@ export default {
<!-- An un-scoped style tag, since tooltip is outside this DOM tree -->
<style lang="scss">
.tooltip.item-description-tooltip {
background: var(--description-tooltip-background);
border: 1px solid var(--description-tooltip-color);
border-radius: var(--curve-factor-small);
color: var(--description-tooltip-color);
padding: 0.2rem 0.5rem;
max-width: 250px;
z-index: 5;
}
.tooltip-arrow {
border-width: 5px 5px 0 5px;
border-color: var(--description-tooltip-color);
border-left-color: transparent!important;
border-right-color: transparent!important;
border-bottom-color: transparent!important;
bottom: -11px;
left: calc(50% - 5px);
width: 0;
height: 0;
border-style: solid;
position: absolute;
margin: 5px;
z-index: 3;
}
.disabled-link {
pointer-events: none;

View File

@ -1,9 +1,10 @@
<template>
<div
<div class="indicator"
v-tooltip="{
content: statusText || otherStatusText, classes: ['status-tooltip', `tip-${color()}`] }"
class="indicator"
@click="showToast()">
content: statusText || otherStatusText,
classes: ['status-tooltip', `tip-${color()}`],
delay: { show: 0, hide: 150 }
}">
<div :class="`dot dot-${color()}`">
<span><span></span></span>
</div>
@ -114,11 +115,19 @@ export default {
<style lang="scss">
.status-tooltip {
background: var(--status-check-tooltip-background) !important;
color: var(--status-check-tooltip-color) !important;
color: var(--status-check-tooltip-color);
font-size: 1rem;
z-index: 10;
&.tip-green { border: 1px solid var(--success); }
&.tip-yellow { border: 1px solid var(--warning); }
&.tip-red { border: 1px solid var(--danger); }
&.tip-grey { --status-color: var(--medium-grey); }
&.tip-green { --status-color: var(--success); }
&.tip-yellow { --status-color: var(--warning); }
&.tip-red { --status-color: var(--danger); }
.tooltip-inner {
border: 1px solid var(--status-color);
// color: var(--status-color);
}
.tooltip-arrow {
--description-tooltip-color: var(--status-color);
}
}
</style>

View File

@ -17,7 +17,7 @@
<!-- Modal for manually changing locale -->
<modal :name="modalNames.LANG_SWITCHER" classes="dashy-modal"
:resizable="true" width="35%" height="50%">
:resizable="true" width="35%" height="60%">
<LanguageSwitcher />
</modal>

View File

@ -129,9 +129,13 @@ export default {
</style>
<style lang="scss">
@import '@/styles/style-helpers.scss';
.language-dropdown {
margin: 1rem auto;
ul.vs__dropdown-menu {
max-height: 14rem;
@extend .scroll-bar;
}
div.vs__dropdown-toggle {
padding: 0.2rem 0;
}

View File

@ -148,7 +148,7 @@ export default {
}
ul.vs__dropdown-menu {
width: auto;
z-index: 5;
z-index: 12;
max-width: 13rem;
overflow-x: hidden;
@extend .scroll-bar;

View File

@ -33,10 +33,7 @@ export default {
disabled: !this.title,
content: this.title,
trigger: 'hover focus',
hideOnTargetClick: true,
html: false,
placement: 'right-start',
delay: { show: 800, hide: 1000 },
placement: 'bottom-end',
},
};
},

View File

@ -18,12 +18,12 @@ import serviceWorker from '@/utils/InitServiceWorker'; // Service worker initial
import clickOutside from '@/utils/ClickOutside'; // Directive for closing popups, modals, etc
import { messages } from '@/utils/languages'; // Language texts
import ErrorReporting from '@/utils/ErrorReporting'; // Error reporting initializer (off)
import { toastedOptions, language as defaultLanguage } from '@/utils/defaults'; // Defaults
import { toastedOptions, tooltipOptions, language as defaultLanguage } from '@/utils/defaults';
import { isKeycloakEnabled, getKeycloakConfig } from '@/utils/Auth'; // Keycloak auth config
// Initialize global Vue components
Vue.use(VueI18n);
Vue.use(VTooltip);
Vue.use(VTooltip, tooltipOptions);
Vue.use(VModal);
Vue.use(VTabs);
Vue.use(Toasted, toastedOptions);

View File

@ -26,4 +26,8 @@
/* Workspace View */
--side-bar-width: 3.5rem; // The width of the sidebar
--tooltip-arrow-size: 6px;
--tooltip-width: 250px;
--tooltip-padding: 0.2rem;
}

View File

@ -92,26 +92,77 @@ html {
/* Overriding styles for tooltip component */
.tooltip {
background: var(--description-tooltip-background);
border: 1px solid var(--description-tooltip-color);
border-radius: var(--curve-factor-small);
color: var(--description-tooltip-color);
padding: 0.2rem 0.5rem;
max-width: 250px;
display: block;
z-index: 5;
max-width: var(--tooltip-width);
border: none;
padding: 0;
.tooltip-inner {
background: var(--description-tooltip-background);
border: 1px solid var(--description-tooltip-color);
border-radius: var(--curve-factor-small);
color: var(--description-tooltip-color);
padding: var(--tooltip-padding);
}
.tooltip-arrow {
width: 0;
height: 0;
border-style: solid;
position: absolute;
margin: var(--tooltip-arrow-size);
border-color: transparent;
border-width: var(--tooltip-arrow-size);
z-index: 1;
}
&[x-placement^="top"] {
margin-bottom: var(--tooltip-arrow-size);
.tooltip-arrow {
border-bottom-width: 0;
border-top-color: var(--description-tooltip-color);
bottom: calc(-1 * var(--tooltip-arrow-size));
left: calc(50% - var(--tooltip-arrow-size));
margin: 0 var(--tooltip-arrow-size);
}
}
&[x-placement^="bottom"] {
margin-top: var(--tooltip-arrow-size);
.tooltip-arrow {
border-top-width: 0;
border-bottom-color: var(--description-tooltip-color);
top: calc(-1 * var(--tooltip-arrow-size));
left: calc(50% - var(--tooltip-arrow-size));
margin: 0 var(--tooltip-arrow-size);
}
}
&[x-placement^="right"] {
margin-left: var(--tooltip-arrow-size);
.tooltip-arrow {
border-left-width: 0;
border-right-color: var(--description-tooltip-color);
left: calc(-1 * var(--tooltip-arrow-size));
top: calc(50% - var(--tooltip-arrow-size));
margin: var(--tooltip-arrow-size) 0;
}
}
&[x-placement^="left"] {
margin-right: var(--tooltip-arrow-size);
.tooltip-arrow {
border-right-width: 0;
border-left-color: var(--description-tooltip-color);
right: calc(-1 * var(--tooltip-arrow-size));
top: calc(50% - var(--tooltip-arrow-size));
margin: var(--tooltip-arrow-size) 0;
}
}
&[aria-hidden='true'] {
visibility: hidden;
opacity: 0;
transition: opacity .15s, visibility .15s;
}
&[aria-hidden='false'] {
visibility: visible;
opacity: 1;
transition: opacity .15s;
}
}
.tooltip-arrow {
border-width: 5px 5px 0 5px;
border-color: var(--description-tooltip-color);
border-left-color: transparent!important;
border-right-color: transparent!important;
border-bottom-color: transparent!important;
bottom: -11px;
left: calc(50% - 5px);
margin: 5px;
width: 0;
height: 0;
border-style: solid;
position: absolute;
z-index: 3;
}

View File

@ -36,10 +36,16 @@ module.exports = {
login: '/login',
download: '/download',
},
/* Server Endpoints */
serviceEndpoints: {
statusPing: '/status-ping',
statusCheck: '/status-check',
save: '/config-manager/save',
rebuild: '/config-manager/rebuild',
},
/* List of built-in themes, to be displayed within the theme-switcher dropdown */
builtInThemes: [
'callisto',
'thebe',
'oblivion',
'material',
'material-dark',
@ -50,6 +56,7 @@ module.exports = {
'minimal-light',
'nord',
'nord-frost',
'thebe',
'cyberpunk',
'matrix',
'matrix-red',
@ -136,6 +143,17 @@ module.exports = {
className: 'toast-message',
iconPack: 'fontawesome',
},
/* Default tooltip options */
tooltipOptions: {
defaultTrigger: 'hover focus',
defaultHideOnTargetClick: true,
autoHide: true,
defaultHtml: false,
defaultPlacement: 'auto',
defaultLoadingContent: 'Loading...',
defaultDelay: { show: 380, hide: 0 },
// delay: { show: 380, hide: 0 },
},
/* Server location of the Backup & Sync cloud function */
backupEndpoint: 'https://dashy-sync-service.as93.net',
/* Available services for fetching favicon icon for user apps */
@ -143,7 +161,6 @@ module.exports = {
mcapi: 'https://eu.mc-api.net/v3/server/favicon/$URL',
clearbit: 'https://logo.clearbit.com/$URL',
faviconkit: 'https://api.faviconkit.com/$URL/64',
// favicongrabber: 'https://favicongrabber.com//api/grab/$URL',
google: 'https://www.google.com/s2/favicons?sz=128&domain_url=$URL',
allesedv: 'https://f1.allesedv.com/128/$URL',
webmasterapi: 'https://api.webmasterapi.com/v1/favicon/yEwx0ZFs0CSPshHq/$URL',

View File

@ -5,7 +5,13 @@ import nl from '@/assets/locales/nl.json';
import fr from '@/assets/locales/fr.json';
import sl from '@/assets/locales/sl.json';
import es from '@/assets/locales/es.json';
import it from '@/assets/locales/it.json';
import zhCN from '@/assets/locales/zh-CN.json';
import ar from '@/assets/locales/ar.json';
import hi from '@/assets/locales/hi.json';
import ja from '@/assets/locales/ja.json';
import pt from '@/assets/locales/pt.json';
import ru from '@/assets/locales/ru.json';
// Language data - Next register your language by adding it to this list
export const languages = [
@ -15,8 +21,8 @@ export const languages = [
locale: en,
flag: '🇬🇧',
},
{
name: 'German',
{ // German
name: 'Deutsch',
code: 'de',
locale: de,
flag: '🇩🇪',
@ -28,29 +34,65 @@ export const languages = [
flag: '🇳🇱',
},
{
name: 'French',
name: 'Français',
code: 'fr',
locale: fr,
flag: '🇲🇫',
},
{
name: 'Slovenian',
name: 'Slovenščina',
code: 'sl',
locale: sl,
flag: '🇸🇮',
},
{
name: 'Spanish',
{ // Spanish
name: 'Español',
code: 'es',
locale: es,
flag: '🇪🇸',
},
{
{ // Italian
name: 'Italiano',
code: 'it',
locale: it,
flag: '🇮🇹',
},
{ // Chinese
name: '简体中文',
code: 'cn',
locale: zhCN,
flag: '🇨🇳',
},
{ // Arabic
name: 'العربية',
code: 'ar',
locale: ar,
flag: '🇦🇪',
},
{ // Hindi
name: 'नहीं',
code: 'hi',
locale: hi,
flag: '🇮🇳',
},
{ // Japanese
name: '日本語',
code: 'ja',
locale: ja,
flag: '🇯🇵',
},
{ // Portuguese
name: 'Português',
code: 'pt',
locale: pt,
flag: '🇵🇹',
},
{ // Russian
name: 'Русский',
code: 'ru',
locale: ru,
flag: '🇷🇺',
},
];
/**