diff --git a/package-lock.json b/package-lock.json index 9806dd1..99f4be5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "vite": "^4.2.0", "vite-plugin-vuetify": "^1.0.0", "vue": "^3.2.0", + "vue-i18n": "^9.8.0", "vue-router": "^4.0.0", "vue3-markdown": "^1.1.9", "vuetify": "^3.4.0" @@ -470,6 +471,47 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" }, + "node_modules/@intlify/core-base": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.8.0.tgz", + "integrity": "sha512-UxaSZVZ1DwqC/CltUZrWZNaWNhfmKtfyV4BJSt/Zt4Or/fZs1iFj0B+OekYk1+MRHfIOe3+x00uXGQI4PbO/9g==", + "dependencies": { + "@intlify/message-compiler": "9.8.0", + "@intlify/shared": "9.8.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.8.0.tgz", + "integrity": "sha512-McnYWhcoYmDJvssVu6QGR0shqlkJuL1HHdi5lK7fNqvQqRYaQ4lSLjYmZxwc8tRNMdIe9/KUKfyPxU9M6yCtNQ==", + "dependencies": { + "@intlify/shared": "9.8.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.8.0.tgz", + "integrity": "sha512-TmgR0RCLjzrSo+W3wT0ALf9851iFMlVI9EYNGeWvZFUQTAJx0bvfsMlPdgVtV1tDNRiAfhkFsMKu6jtUY1ZLKQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -4760,6 +4802,25 @@ "eslint": ">=6.0.0" } }, + "node_modules/vue-i18n": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.8.0.tgz", + "integrity": "sha512-Izho+6PYjejsTq2mzjcRdBZ5VLRQoSuuexvR8029h5CpN03FYqiqBrShMyf2I1DKkN6kw/xmujcbvC+4QybpsQ==", + "dependencies": { + "@intlify/core-base": "9.8.0", + "@intlify/shared": "9.8.0", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue-router": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", @@ -5169,6 +5230,29 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" }, + "@intlify/core-base": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.8.0.tgz", + "integrity": "sha512-UxaSZVZ1DwqC/CltUZrWZNaWNhfmKtfyV4BJSt/Zt4Or/fZs1iFj0B+OekYk1+MRHfIOe3+x00uXGQI4PbO/9g==", + "requires": { + "@intlify/message-compiler": "9.8.0", + "@intlify/shared": "9.8.0" + } + }, + "@intlify/message-compiler": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.8.0.tgz", + "integrity": "sha512-McnYWhcoYmDJvssVu6QGR0shqlkJuL1HHdi5lK7fNqvQqRYaQ4lSLjYmZxwc8tRNMdIe9/KUKfyPxU9M6yCtNQ==", + "requires": { + "@intlify/shared": "9.8.0", + "source-map-js": "^1.0.2" + } + }, + "@intlify/shared": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.8.0.tgz", + "integrity": "sha512-TmgR0RCLjzrSo+W3wT0ALf9851iFMlVI9EYNGeWvZFUQTAJx0bvfsMlPdgVtV1tDNRiAfhkFsMKu6jtUY1ZLKQ==" + }, "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -8161,6 +8245,16 @@ "semver": "^7.3.6" } }, + "vue-i18n": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.8.0.tgz", + "integrity": "sha512-Izho+6PYjejsTq2mzjcRdBZ5VLRQoSuuexvR8029h5CpN03FYqiqBrShMyf2I1DKkN6kw/xmujcbvC+4QybpsQ==", + "requires": { + "@intlify/core-base": "9.8.0", + "@intlify/shared": "9.8.0", + "@vue/devtools-api": "^6.5.0" + } + }, "vue-router": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", diff --git a/package.json b/package.json index 2e43a34..40eb406 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "vite": "^4.2.0", "vite-plugin-vuetify": "^1.0.0", "vue": "^3.2.0", + "vue-i18n": "^9.8.0", "vue-router": "^4.0.0", "vue3-markdown": "^1.1.9", "vuetify": "^3.4.0" diff --git a/src/components/instance/settings/Typebot.vue b/src/components/instance/settings/Typebot.vue index d694537..787613f 100644 --- a/src/components/instance/settings/Typebot.vue +++ b/src/components/instance/settings/Typebot.vue @@ -100,7 +100,8 @@ class="mb-3" :rules="[ (v) => { - if (!v) return 'Tempo de expiração é obrigatório'; + if (v === '' || v === undefined) + return 'Tempo de expiração é obrigatório'; return true; }, ]" diff --git a/src/components/modal/About.vue b/src/components/modal/About.vue index 81f337a..195a8be 100644 --- a/src/components/modal/About.vue +++ b/src/components/modal/About.vue @@ -50,15 +50,7 @@ necessário que o servidor da Evolution API seja acessado através de uma conexão segura (HTTPS). - -

Limitações do Projeto

-

- Como um projeto open-source mantido por voluntários, não há - garantias de atualizações futuras. A independência do Evolution - Manager em relação à Evolution API significa que alterações na API - podem afetar a funcionalidade do Manager. -

- + Versão: {{ version }} diff --git a/src/components/modal/Contribute.vue b/src/components/modal/Contribute.vue index 48efb9b..7e36de8 100644 --- a/src/components/modal/Contribute.vue +++ b/src/components/modal/Contribute.vue @@ -3,7 +3,7 @@
-

Contribua via PIX

+

{{$t('contribute.via')}} PIX

- Fechar + {{ $t('close') }} diff --git a/src/components/modal/Settings.vue b/src/components/modal/Settings.vue index b389e04..81fb967 100644 --- a/src/components/modal/Settings.vue +++ b/src/components/modal/Settings.vue @@ -7,7 +7,7 @@ -

Configurar conexão

+

{{ $t("connection.title") }}

- Sobre + {{ $t('about.title') }}
- Conectar - + {{ $t('connection.action') }} +
@@ -81,7 +81,7 @@ -

Conexões salvas

+

{{ $t('connection.saved') }}

- + {{ AppStore.version }} mdi-alert-circle + + + + + {{ lang }} + + + mdi-cog @@ -61,6 +74,10 @@ export default { SettingsModal, }, methods: { + changei18n(locale) { + this.$vuetify.locale.current = locale; + window.localStorage.setItem("locale", locale); + }, toggleTheme() { const theme = this.theme.global.current.dark ? "light" : "dark"; this.theme.global.name = theme; @@ -91,6 +108,12 @@ export default { dark() { return this.theme.global.current.dark; }, + availableLanguages() { + return this.$i18n.availableLocales; + }, + currentLanguage() { + return this.$i18n.locale; + }, }, async mounted() { try { diff --git a/src/layouts/default/AppFooter.vue b/src/layouts/default/AppFooter.vue index 163af93..3994381 100644 --- a/src/layouts/default/AppFooter.vue +++ b/src/layouts/default/AppFooter.vue @@ -9,7 +9,7 @@ color="blue" > mdi-information - Sobre + {{ $t("about.title") }} mdi-hand-coin - Contribua com o projeto + {{ $t("contribute.button") }}

v{{ version }}

diff --git a/src/plugins/index.js b/src/plugins/index.js index c71748d..5f9b86c 100644 --- a/src/plugins/index.js +++ b/src/plugins/index.js @@ -5,7 +5,7 @@ */ // Plugins -import vuetify from './vuetify' +import { vuetify,i18n } from './vuetify' import pinia from '../store' import router from '../router' @@ -13,6 +13,7 @@ import HelpTooltip from '@/components/global/HelpTooltip.vue' export function registerPlugins(app) { app + .use(i18n) .use(vuetify) .use(router) .use(pinia) diff --git a/src/plugins/vuetify.js b/src/plugins/vuetify.js index cca6b91..3d5f2d0 100644 --- a/src/plugins/vuetify.js +++ b/src/plugins/vuetify.js @@ -10,11 +10,35 @@ import 'vuetify/styles' // Composables import { createVuetify } from 'vuetify' +import { createVueI18nAdapter } from 'vuetify/locale/adapters/vue-i18n' +import { createI18n, useI18n } from 'vue-i18n' + + +// import all files from src/i18n +const messages = Object.fromEntries( + Object.entries( + import.meta.globEager('../i18n/*.js') + ).map(([key, value]) => { + const locale = key.match(/([A-Za-z0-9-_]+)\./i)[1] + return [locale, value.default] + }) +) + +const locale = window.localStorage.getItem('locale') || 'pt' +export const i18n = createI18n({ + legacy: false, // Vuetify does not support the legacy mode of vue-i18n + locale, + fallbackLocale: 'pt', + messages, +}) + + const defaultTheme = localStorage.getItem('theme') || 'light' - -// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides -export default createVuetify({ +export const vuetify = createVuetify({ + locale: { + adapter: createVueI18nAdapter({ i18n, useI18n }), + }, theme: { defaultTheme, themes: { @@ -27,3 +51,10 @@ export default createVuetify({ }, }, }) + + +export default { + vuetify, + i18n +} + diff --git a/src/views/Home.vue b/src/views/Home.vue index 9780b4c..394d295 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -1,7 +1,7 @@ - Nenhuma instância encontrada + {{ $t("noInstances") }}