diff --git a/.github/workflows/attach-artifact.yml b/.github/workflows/attach-artifact.yml
index e4668e30b..651547c01 100644
--- a/.github/workflows/attach-artifact.yml
+++ b/.github/workflows/attach-artifact.yml
@@ -13,7 +13,7 @@ jobs:
- name: Setup node
uses: actions/setup-node@v1
with:
- node-version: 16.x
+ node-version: 20.x
# Sanity check to ensure that release tags don't start with a 'v' version prefix but adhere to the X.Y.Z format
- name: Check for Tag name Format
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 31a73476a..739692878 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -15,7 +15,9 @@ jobs:
uses: homebridge/.github/.github/workflows/nodejs-build-and-test.yml@main
with:
- enable_coverage: true
+ enable_coverage: false
+ ## Code Coverage can only be used in a single run, not in a parallel run - Error: Bad response: 422 {"message":"Can't add a job to a build that is already closed. Build 6224987022 is closed. See docs.coveralls.io/parallel-builds","error":true}
+ ## Coveralls only expects to create a report once per build
runs_on: ${{ matrix.os }}
install_cmd: npm ci && cd ui && npm ci
secrets:
@@ -27,18 +29,12 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest]
- node-version: [16.x, 17.x, 18.x]
+ node-version: [18.x]
include:
- - os: macos-latest
- node-version: 16.x
- os: macos-latest
node-version: 18.x
- - os: windows-2019
- node-version: 16.x
- os: windows-2019
node-version: 18.x
- - os: windows-latest
- node-version: 16.x
- os: windows-latest
node-version: 18.x
@@ -90,6 +86,6 @@ jobs:
lint:
needs: build_and_test
- uses: homebridge/.github/.github/workflows/eslint.yml@main
+ uses: homebridge/.github/.github/workflows/eslint.yml@latest
with:
install_cmd: npm ci && cd ui && npm ci
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index a7af70ba6..a3faf80d9 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -2,12 +2,12 @@ name: "CodeQL"
on:
push:
- branches: [ main, beta* ]
+ branches: [ latest, beta* ]
pull_request:
- branches: [ main, beta* ]
+ branches: [ latest, beta* ]
schedule:
- cron: '17 9 * * 2'
jobs:
analyze:
- uses: homebridge/.github/.github/workflows/codeql-analysis.yml@main
+ uses: homebridge/.github/.github/workflows/codeql-analysis.yml@latest
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 31a8972a5..d8a03a820 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -7,25 +7,19 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
- node-version: [16.x, 17.x, 18.x]
+ node-version: [18.x]
include:
- - os: macos-latest
- node-version: 16.x
- os: macos-latest
node-version: 18.x
- - os: windows-2019
- node-version: 16.x
- os: windows-2019
node-version: 18.x
- - os: windows-latest
- node-version: 16.x
- os: windows-latest
node-version: 18.x
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v1
+ - uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5f3eb2885..53cced042 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 4.50.6 (2023-09-27)
+
+### Bug Fixes
+
+- **System:** Update comparison to timing safe ([1535](https://github.com/homebridge/homebridge-config-ui-x/pull/1535))
+
+### Other Changes
+
+- **i18n:** Update pt.json ([1503](https://github.com/homebridge/homebridge-config-ui-x/pull/1520))
+- **i18n:** Use verb form for buttons and menu items ([1533](https://github.com/homebridge/homebridge-config-ui-x/pull/1533))
+- **i18n:** Wait for custom UI ([1526](https://github.com/homebridge/homebridge-config-ui-x/pull/1526))
+- Updated npm dependencies
+
## 4.50.5 (2023-08-19)
### Notable Changes
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8601e6e22..5fc4d4168 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -72,4 +72,4 @@ npm run test
Additional language translations, or improvements to existing translations are most welcome. Translations can be found here:
-https://github.com/homebridge/homebridge-config-ui-x/tree/main/ui/src/i18n
+https://github.com/homebridge/homebridge-config-ui-x/tree/latest/ui/src/i18n
diff --git a/README.md b/README.md
index 9d9d858ce..dcd01c0eb 100755
--- a/README.md
+++ b/README.md
@@ -17,15 +17,16 @@ Supported Languages: :gb: :de: :fr: :poland: :czech_republic: :ru: :cn: :hungary
* View and control Homebridge accessories
* Restart Homebridge
* Backup and Restore your Homebridge instance
+* Set up and manage your Homebridge plugins as [child bridges](https://github.com/homebridge/homebridge/wiki/Child-Bridges)
* and more...
-Homebridge Config UI X also provides a tool called [`hb-service`](https://github.com/oznu/homebridge-config-ui-x/wiki/Homebridge-Service-Command) which makes it easy to setup Homebridge as a service on Linux/Raspbian, macOS and Windows 10.
+Homebridge Config UI X also provides a tool called [`hb-service`](https://github.com/homebridge/homebridge-config-ui-x/wiki/Homebridge-Service-Command) which makes it easy to set up Homebridge as a service on Linux/Raspbian, macOS and Windows 10.
[![Status](screenshots/homebridge-config-ui-x-darkmode-status.png?2020-01-07)](#usage)
# Installation Instructions
-For detailed instructions on how to setup Node.js and Homebridge with Homebridge Config UI X as a service see the guides on the wiki:
+For detailed instructions on how to set up Node.js and Homebridge with Homebridge Config UI X as a service, see the guides on the wiki:
* [Setup Homebridge using the official Homebridge Raspberry Pi Image](https://github.com/homebridge/homebridge-raspbian-image/wiki/Getting-Started)
* [Setup Homebridge on a Raspberry Pi (Raspbian)](https://github.com/homebridge/homebridge/wiki/Install-Homebridge-on-Raspbian)
@@ -39,13 +40,13 @@ If your platform is not listed above, or you want to use your own service manage
The default username is `admin` and the default password is `admin`.
-The UI can be accessed via web browser by default on port `8581` (eg. `http://localhost:8581`).
+The UI can be accessed via web browser by default on port `8581` (e.g. `http://localhost:8581`).
# Usage
### Status Screen
-This shows an overview of your Homebridge system. The dashboard is widget based and completely customisable with a number of themes available.
+This shows an overview of your Homebridge system. The dashboard is widget-based and completely customisable with a number of themes available.
![Status](screenshots/homebridge-config-ui-x-status.png?2020-01-07)
@@ -61,7 +62,7 @@ You can configure supported plugins using the graphical settings editor, removin
### Configuration Screen
-The configuration screen allows you to modify your Homebridge `config.json`. The built in editor automatically syntax-checks your JSON and makes a backup of your config every time you make a change.
+The configuration screen allows you to modify your Homebridge `config.json`. The built-in editor automatically syntax-checks your JSON and makes a backup of your config every time you make a change.
![Config](screenshots/homebridge-config-ui-x-config.png?2020-01-07)
@@ -91,10 +92,7 @@ MS Internet Explorer (any version) is not supported!
# Supported Node.js and Npm Versions
-While the Homebridge UI should work on Node.js 14+, only the following versions of Node.js are officially supported:
-
-* node v14.15.0 or higher
-* npm v6.4.1 or higher
+The Homebridge UI follows the same Node support schedule as Homebridge. See the [How-To-Update-Node.js](https://github.com/homebridge/homebridge/wiki/How-To-Update-Node.js) page in the Homebridge wiki for currently supported versions.
You can check your current versions using these commands:
@@ -136,7 +134,7 @@ The Homebridge UI supports the [homebridge/homebridge](https://github.com/homebr
#### 4. Ask on Discord
-Join the [Official Homebridge Discord](https://discord.gg/C87Pvq3) community and ask in the [#ui](https://discord.gg/C87Pvq3) channel.
+Join the [Official Homebridge Discord](https://discord.gg/C87Pvq3) community and ask in the [#ui-general](https://discord.gg/C87Pvq3) or [#ui-issues](https://discord.gg/C87Pvq3) channel.
# Credit
diff --git a/package-lock.json b/package-lock.json
index 6f6ad801d..0499a1923 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,7 +50,7 @@
"reflect-metadata": "0.1.13",
"rxjs": "7.5.6",
"semver": "7.3.7",
- "systeminformation": "5.12.3",
+ "systeminformation": "5.16.9",
"tail": "2.2.4",
"tar": "6.1.11",
"tcp-port-used": "1.0.2",
@@ -8720,9 +8720,9 @@
"integrity": "sha512-jHL6UyIYpvEI7NsuWd0R3hJaPQTg6Oo4qSBo+oVfOEkv6rrQm/475RGSMmZgV6ajp+Sgrp9CqrDjQYAgQqiv1A=="
},
"node_modules/systeminformation": {
- "version": "5.12.3",
- "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.12.3.tgz",
- "integrity": "sha512-aPyTDzK/VjEheGEODprxFTMahIWTHGyWXxTsh9EOHjeekVltrIWrle4dOZouOlOYgtKM1pDoHkrR+IssgYCK/A==",
+ "version": "5.16.9",
+ "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.16.9.tgz",
+ "integrity": "sha512-QTlv3GGSromPeLVW3pzM6uxU8RbkacW9e0+ZX23GAXaX+XE0UToSygAxCJDHSty6RB9lAFHCHg+FfiXFChi/+w==",
"os": [
"darwin",
"linux",
@@ -16295,9 +16295,9 @@
"integrity": "sha512-jHL6UyIYpvEI7NsuWd0R3hJaPQTg6Oo4qSBo+oVfOEkv6rrQm/475RGSMmZgV6ajp+Sgrp9CqrDjQYAgQqiv1A=="
},
"systeminformation": {
- "version": "5.12.3",
- "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.12.3.tgz",
- "integrity": "sha512-aPyTDzK/VjEheGEODprxFTMahIWTHGyWXxTsh9EOHjeekVltrIWrle4dOZouOlOYgtKM1pDoHkrR+IssgYCK/A=="
+ "version": "5.16.9",
+ "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.16.9.tgz",
+ "integrity": "sha512-QTlv3GGSromPeLVW3pzM6uxU8RbkacW9e0+ZX23GAXaX+XE0UToSygAxCJDHSty6RB9lAFHCHg+FfiXFChi/+w=="
},
"tail": {
"version": "2.2.4",
diff --git a/package.json b/package.json
index 508189c64..088d59e87 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,7 @@
"homebridge": ">=1.6.0"
},
"scripts": {
+ "check": "npm install && npm outdated",
"watch": "concurrently \"npm run watch:ui\" \"npm run watch:server\"",
"watch:server": "nodemon",
"watch:ui": "npm run start --prefix ui",
@@ -82,7 +83,7 @@
"reflect-metadata": "0.1.13",
"rxjs": "7.5.6",
"semver": "7.3.7",
- "systeminformation": "5.12.3",
+ "systeminformation": "5.16.9",
"tail": "2.2.4",
"tar": "6.1.11",
"tcp-port-used": "1.0.2",
diff --git a/src/core/auth/auth.service.ts b/src/core/auth/auth.service.ts
index 635a8c22c..e33ef90cd 100644
--- a/src/core/auth/auth.service.ts
+++ b/src/core/auth/auth.service.ts
@@ -95,9 +95,11 @@ export class AuthService {
* This will throw an error if the credentials are incorrect.
*/
private async checkPassword(user: UserDto, password: string) {
- const hashedPassword = await this.hashPassword(password, user.salt);
+ const passwordAttemptHash = await this.hashPassword(password, user.salt);
+ const passwordAttemptHashBuff = Buffer.from(passwordAttemptHash, 'hex');
+ const knownPasswordHashBuff = Buffer.from(user.hashedPassword, 'hex');
- if (hashedPassword === user.hashedPassword) {
+ if (crypto.timingSafeEqual(passwordAttemptHashBuff, knownPasswordHashBuff)) {
return user;
} else {
throw new ForbiddenException();
diff --git a/src/modules/plugins/plugins.service.ts b/src/modules/plugins/plugins.service.ts
index fe4ee5777..510e81b7f 100755
--- a/src/modules/plugins/plugins.service.ts
+++ b/src/modules/plugins/plugins.service.ts
@@ -1404,7 +1404,7 @@ export class PluginsService {
clearTimeout(this.verifiedPluginsRetryTimeout);
try {
this.verifiedPlugins = (
- await this.httpService.get('https://raw.githubusercontent.com/homebridge/verified/main/verified-plugins.json', {
+ await this.httpService.get('https://raw.githubusercontent.com/homebridge/verified/latest/verified-plugins.json', {
httpsAgent: null,
}).toPromise()
).data;
diff --git a/ui/package-lock.json b/ui/package-lock.json
index eecce593d..9b25a1210 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -8594,15 +8594,15 @@
"dev": true
},
"node_modules/hosted-git-info": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz",
- "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz",
+ "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==",
"dev": true,
"dependencies": {
"lru-cache": "^7.5.1"
},
"engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16"
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/hpack.js": {
@@ -8648,9 +8648,9 @@
"dev": true
},
"node_modules/http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"dev": true
},
"node_modules/http-deceiver": {
@@ -9662,9 +9662,9 @@
"dev": true
},
"node_modules/json5": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
- "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"bin": {
"json5": "lib/cli.js"
},
@@ -21303,9 +21303,9 @@
"dev": true
},
"hosted-git-info": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz",
- "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz",
+ "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==",
"dev": true,
"requires": {
"lru-cache": "^7.5.1"
@@ -21356,9 +21356,9 @@
"dev": true
},
"http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"dev": true
},
"http-deceiver": {
@@ -22096,9 +22096,9 @@
"dev": true
},
"json5": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
- "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
},
"jsonc-parser": {
"version": "3.0.0",
diff --git a/ui/package.json b/ui/package.json
index e9bcd2bb0..516bc52b3 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -3,6 +3,7 @@
"version": "0.0.0",
"license": "MIT",
"scripts": {
+ "check": "npm install && npm outdated",
"ng": "ng",
"start": "ng serve",
"build": "ng build --configuration production --output-path=../public --source-map=false --aot=true",
@@ -91,4 +92,4 @@
"rxjs": "^7.4.0",
"marked": "^4.0.13"
}
-}
\ No newline at end of file
+}
diff --git a/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.ts b/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.ts
index 071c99dda..18ca7c191 100644
--- a/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.ts
+++ b/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.ts
@@ -131,7 +131,6 @@ export class CustomPluginsComponent implements OnInit, OnDestroy {
case 'loaded':
this.injectDefaultStyles(e);
this.confirmReady(e);
- this.uiLoaded = true;
break;
case 'request': {
this.handleRequest(e);
@@ -139,6 +138,7 @@ export class CustomPluginsComponent implements OnInit, OnDestroy {
}
case 'scrollHeight':
this.setiFrameHeight(e);
+ this.uiLoaded = true;
break;
case 'config.get': {
this.requestResponse(e, this.getConfigBlocks());
diff --git a/ui/src/i18n/en.json b/ui/src/i18n/en.json
index 986c9e4c8..83842797c 100644
--- a/ui/src/i18n/en.json
+++ b/ui/src/i18n/en.json
@@ -113,7 +113,7 @@
"form.button_delete": "Delete",
"form.button_edit": "Edit",
"form.button_save": "Save",
- "login.button_login": "Login",
+ "login.button_login": "Log in",
"login.label_2fa_code": "Two Factor Authentication Code",
"login.label_password": "Password",
"login.label_username": "Username",
@@ -138,7 +138,7 @@
"menu.linux.label_restart_server": "Restart Server",
"menu.linux.label_shutdown_server": "Shutdown Server",
"menu.linux.label_terminal": "Terminal",
- "menu.tooltip_logout": "Logout",
+ "menu.tooltip_logout": "Log out",
"menu.tooltip_restart": "Restart",
"menu.tooltip_user_accounts": "User Accounts",
"menu.tooltip_view_logs": "View Logs",
diff --git a/ui/src/i18n/pt.json b/ui/src/i18n/pt.json
index 376634469..2cdc24bdb 100644
--- a/ui/src/i18n/pt.json
+++ b/ui/src/i18n/pt.json
@@ -75,9 +75,9 @@
"backup.title_backup_restore": "Backup / Restauro",
"backup.title_restore": "Restauro",
"backup.title_scheduled_backups": "Backups Agendados",
- "child_bridge.label_bridge_connect_to_homekit": "Connect to HomeKit",
+ "child_bridge.label_bridge_connect_to_homekit": "Conectar ao Homekit",
"child_bridge.label_bridge_paired": "Ponte Emparelhada",
- "child_bridge.label_bridge_restart_child_bridges": "Restart Child Bridges",
+ "child_bridge.label_bridge_restart_child_bridges": "Reiniciar Pontes Secundárias",
"child_bridge.label_bridge_settings": "Definições da Ponte",
"child_bridge.label_child_bridges": "Pontes Secundárias",
"child_bridge.message_about": "O Homebridge permite que possa executar uma plataforma de um plugin ou um acessório como uma ponte secundária isolada. Isto pode melhorar a fiabilidade e o tempo de resposta do Homebridge.",
@@ -113,7 +113,7 @@
"form.button_delete": "Apagar",
"form.button_edit": "Editar",
"form.button_save": "Gravar",
- "login.button_login": "Login",
+ "login.button_login": "Entrar",
"login.label_2fa_code": "Código de Autenticação de Dois Fatores",
"login.label_password": "Palavra-passe",
"login.label_username": "Utilizador",
@@ -143,22 +143,22 @@
"menu.tooltip_user_accounts": "Contas de Utilizador",
"menu.tooltip_view_logs": "Ver Registos",
"platform.docker.restart_container.message_run_with_restart_always": "Verifique se está a executar o container do Docker com --restart=always",
- "platform.docker.restart_container.message_server_taking_long_time_to_restart": "O reinício do servidor está a demorar muito tempo. Poderá ser necessário intervir manualmente no container do Docker para voltar a estar online.",
+ "platform.docker.restart_container.message_server_taking_long_time_to_restart": "A inicialização do servidor está a demorar muito tempo. Poderá ser necessário intervir manualmente no container do Docker para voltar a estar online.",
"platform.docker.restart_container.title_restarting": "A Reiniciar o Container do Docker",
"platform.docker.restart_container.toast_container_restarted": "Container do Docker Reiniciado",
"platform.docker.settings.button_restart_required": "Reinício Necessário",
- "platform.docker.startup_script.message_script_help": "Este script vai ser executado todas as vezes que o container do docker iniciar. Poderá utilizar isto para instalar qualquer pacote extra que os plugins poderão requerer como por exemplo o ffmpeg ou o libpcap-dev.",
+ "platform.docker.startup_script.message_script_help": "Este script vai ser executado todas as vezes que o container do docker iniciar. Isto poderá ser utilizado para instalar qualquer pacote extra que os plugins possam requerer como por exemplo o ffmpeg ou o libpcap-dev.",
"platform.docker.startup_script.toast_restart_required": "Vai ser necessário reiniciar este container do docker para que as mudanças surtam efeito.",
"platform.docker.startup_script.toast_script_must_use_hashbang": "É necessário usar a hashbang #!/bin/sh no script.",
"platform.docker.startup_script.toast_title_script_error": "Erro de Script",
"platform.docker.startup_script.toast_title_script_saved": "Script de Inicialização Gravado",
"platform.linux.restart.confirmation": "Tem a certeza que deseja reiniciar o sistema operativo?",
"platform.linux.restart.message_please_wait_while_server_restarts": "Por favor aguarde, esta pagina irá automaticamente atualizar quando o Homebridge estiver de novo online.",
- "platform.linux.restart.message_server_taking_long_time_to_restart": "O reinício do servidor está a demorar demasiado tempo. Poderá ser necessário intervir manualmente no servidor para voltar a estar online.",
+ "platform.linux.restart.message_server_taking_long_time_to_restart": "A inicialização do servidor está a demorar demasiado tempo. Poderá ser necessário intervir manualmente no servidor para voltar a estar online.",
"platform.linux.restart.title_restarting_server": "A reiniciar o servidor",
"platform.linux.restart.toast_server_restart_error": "Ocorreu um erro ao enviar o comando de reinício para o servidor",
"platform.linux.restart.toast_server_restarted": "O Servidor foi Reiniciado",
- "platform.linux.restart.toast_server_taking_long_time_to_come_online": "O servidor está a demorar demasiado tempo para voltar a estar online",
+ "platform.linux.restart.toast_server_taking_long_time_to_come_online": "O servidor está a demorar demasiado tempo a inicializar",
"platform.linux.shutdown.confirmation": "Tem a certeza que deseja desligar o sistema operativo?",
"platform.linux.shutdown.message_server_will_power_down": "O servidor irá desligar brevemente.",
"platform.linux.shutdown.title_shutting_down_server": "A Desligar o Servidor",
@@ -217,7 +217,7 @@
"plugins.status_update_available": "Atualização Disponível",
"plugins.toast_failed_to_load_plugins": "Falha ao carregar os plugins",
"plugins.tooltip_update_plugin_to": "Atualizar o plugin para a versão v{{latestVersion}}",
- "reset.accessories_will_may_need_to_be_reconfigured": "Após executar esta ação alguns acessórios poderão ter que ser repostos no HomeKit ou readicionados nas automações.",
+ "reset.accessories_will_may_need_to_be_reconfigured": "Após executar a reposição alguns acessórios poderão ter que ser repostos no HomeKit ou readicionados nas automações.",
"reset.button_reset_homebridge_now": "Repor o Homebridge Agora",
"reset.message_accessory_config_will_not_be_changed": "O resto da configuração não vai ser alterada. Se o Homebridge não iniciar devido a uma má configuração, uma reposição não irá consertar o problema.",
"reset.message_action_is_irreversible": "Está ação é irreversível. Por favor leia com cuidado antes de proceder.",
@@ -237,25 +237,25 @@
"reset.title_reset_homebridge_accessory": "Repor o Acessório da Homebridge",
"reset.title_unpair_bridges_cameras_tv_external_accessories": "Desemparelhar Pontes / Câmeras / Televisões / Acessórios Externos",
"reset.title_warning": "Alerta",
- "reset.toast_accessory_reset": "Redefinir Acessório do Homebridge",
+ "reset.toast_accessory_reset": "Repor Acessório do Homebridge",
"reset.toast_cached_accessory_removed": "Acessório em cache removido.",
"reset.toast_clear_cached_accessories_success": "A reiniciar o Homebridge e a apagar a cache do acessório.",
"reset.toast_failed_to_delete_cached_accessory": "Falha ao eliminar o acessório.",
- "reset.toast_failed_to_reset": "Falha ao redefinir o Homebridge. Ver registo.",
- "reset.toast_removing_cached_accessory_please_wait": "A remover o acessório da cache, por favor aguarde…",
+ "reset.toast_failed_to_reset": "Falha ao repor o Homebridge. Ver registo.",
+ "reset.toast_removing_cached_accessory_please_wait": "A remover o acessório da cache, por favor aguarde...",
"restart.label_restart_command_executed": "Comando de Reinício Executado",
"restart.message_homebridge_service_ready": "Servidor do Homebridge Pronto",
"restart.message_homebridge_ui_online": "Homebridge UI Online",
"restart.message_please_wait_while_server_restarts": "Por favor aguarde, esta pagina irá atualizar automaticamente quando o servidor estiver online.",
- "restart.message_server_is_taking_long_time_to_restart": "O reinício do servidor está a demorar demasiado tempo. Poderá ser necessário intervir manualmente no servidor para voltar a estar online.",
+ "restart.message_server_is_taking_long_time_to_restart": "A inicialização do servidor está a demorar demasiado tempo. Poderá ser necessário intervir manualmente no servidor para voltar a estar online.",
"restart.title_restart": "A Reiniciar o Homebridge",
"restart.toast_server_restart_error": "Ocorreu um erro ao enviar o comando de reinício para o servidor",
"restart.toast_server_restarted": "O Servidor foi Reiniciado",
- "restart.toast_sever_restart_timeout": "O servidor está a demorar demasiado tempo para voltar a estar online",
- "rpi.throttled.currently_undervoltage_message": "This Raspberry Pi is reporting it is currently under-voltage; please check it is connected to an appropriate power supply. Under-voltage can result in system instability and SD card corruption.",
- "rpi.throttled.currently_undervoltage_title": "Under-voltage detected",
- "rpi.throttled.previously_undervoltage_message": "This Raspberry Pi has reported an under-voltage event since it was last rebooted; please check it is connected to an appropriate power supply.",
- "rpi.throttled.previously_undervoltage_title": "Under-voltage has occurred",
+ "restart.toast_sever_restart_timeout": "O servidor está a demorar demasiado tempo a inicializar",
+ "rpi.throttled.currently_undervoltage_message": "Este Raspberry Pi está a reportar que se encontra atualmente em subtensão; por favor verifique se está conectado a uma fonte de alimentação apropriada. Subtensão poderá provocar instabilidade de sistema e corromper o cartão SD.",
+ "rpi.throttled.currently_undervoltage_title": "Subtensão detetada",
+ "rpi.throttled.previously_undervoltage_message": "Este Raspberry Pi reportou um evento de subtensão desde a ultima inicialização; por favor verifique se está conectado a uma fonte de alimentação apropriada.",
+ "rpi.throttled.previously_undervoltage_title": "Ocorreu um evento de subtensão",
"settings.manage_cache.help": "Se um acessório que já não possui continuar a ser mostrado no HomeKit, poderá ser necessário remove-lo da cache. Pode escolher remover apenas um acessório, ou remover todos os acessórios em cache.",
"settings.mdns_advertiser": "Encaminhamento mDNS",
"settings.mdns_advertiser_help": "Se estiver a ter problemas a conectar ao Homebridge, tente um dos encaminhamentos mDNS alternativos.",
@@ -265,18 +265,18 @@
"settings.network.message_network_interface_two": "Se nenhuma interface de rede estiver selecionada, o Homebridge irá tentar determinar automaticamente qual interface a utilizar.",
"settings.network.title_network": "Rede",
"settings.network.title_network_interfaces": "Interfaces de Rede",
- "settings.reset.help": "Se estiver a ter problemas a emparelhar o Homebridge ou um acessório externo como uma Câmara ou uma Televisão com o HomeKit, poderá ser necessário desemparelhar o acessório ou redefinir a instância do Homebridge.",
+ "settings.reset.help": "Se estiver a ter problemas a emparelhar o Homebridge ou um acessório externo como uma Câmara ou uma Televisão com o HomeKit, poderá ser necessário desemparelhar o acessório ou repor a instância do Homebridge.",
"settings.title_actions": "Ações",
"settings.title_environment_variables": "Variáveis do Ambiente",
"settings.title_manage_cached_accessories": "Gerir Acessórios em Cache",
"settings.title_startup_options": "Opções de Inicio",
- "setup_wizard.button_get_started": "Get Started",
- "setup_wizard.label_create_account": "Create Account",
- "setup_wizard.label_open_dashboard": "Open Dashboard",
- "setup_wizard.message_create_account_reason": "Password authentication to your Homebridge admin web interface must be configured. Even if Homebridge is accessible only in your local network, it is still important to protect it from unrestricted access.",
- "setup_wizard.message_welcome_to_homebridge": "Welcome to Homebridge",
- "setup_wizard_message_complete_message": "The setup procedure is complete and you're now ready to start using Homebridge.",
- "setup_wizard_message_complete_title": "Congratulations!",
+ "setup_wizard.button_get_started": "Começar",
+ "setup_wizard.label_create_account": "Criar Conta",
+ "setup_wizard.label_open_dashboard": "Abrir Dashboard",
+ "setup_wizard.message_create_account_reason": "A autenticação por palavra-passe deverá de ser configurada para a página de administração do Homebridge. Mesmo que o Homebridge seja acessível apenas na rede local, é importante protege-lo de acessos não autorizados.",
+ "setup_wizard.message_welcome_to_homebridge": "Bem-vindo ao Homebridge",
+ "setup_wizard_message_complete_message": "O processo de configuração está concluído e está pronto para utilizar o Homebridge.",
+ "setup_wizard_message_complete_title": "Parabéns!",
"status.cpu.label_load": "Utilização",
"status.cpu.label_temp": "Temperatura",
"status.cpu.title_cpu": "CPU",
@@ -287,9 +287,9 @@
"status.memory.label_total": "Total",
"status.memory.title_memory": "Memória",
"status.message_code_scan_instructions": "Leia este código com a câmara do seu dispositivo iOS para adicionar ao Apple Home.",
- "status.network.label_received_per_second": "Received",
- "status.network.label_sent_per_second": "Sent",
- "status.network.title_network": "Network Activity",
+ "status.network.label_received_per_second": "Recebido",
+ "status.network.label_sent_per_second": "Enviado",
+ "status.network.title_network": "Atividade da Rede",
"status.plugin_out_of_date": "Plugin Desatualizado",
"status.plugins_out_of_date": "Plugins Desatualizados",
"status.services.label_not_running": "Parado",
@@ -307,7 +307,7 @@
"status.widget.label_clock_timeformat": "Formato da Hora",
"status.widget.label_font_size": "Tamanho da Fonte",
"status.widget.label_font_weight": "Espessura da Fonte",
- "status.widget.label_hide_on_mobile": "Esconder em modo compacto (ecrãs moveis)",
+ "status.widget.label_hide_on_mobile": "Esconder em modo compacto (ecrãs móveis)",
"status.widget.label_homebridge_logs": "Registos do Homebridge",
"status.widget.label_layout_locked": "Layout Bloqueado",
"status.widget.label_lock_layout": "Bloquear Layout",