Merge pull request #35 from house-of-abbey/34-compilation-of-widget-application-plus-additional-devices
34 compilation of widget application plus additional devices
1
.gitignore
vendored
@@ -2,4 +2,3 @@ bin/
|
|||||||
export/
|
export/
|
||||||
**/Thumbs.db
|
**/Thumbs.db
|
||||||
settings.txt
|
settings.txt
|
||||||
export.cmd
|
|
||||||
|
41
README.md
@@ -6,11 +6,20 @@ A Garmin application to provide a "dashboard" to control your devices via [Home
|
|||||||
|
|
||||||
The application is designed around a simple scrollable menu where menu items have been extended to interface with the [Home Assistant API](https://developers.home-assistant.io/docs/api/rest/), e.g. to get the status of switches or lights for display on the toggle menu item. It is possible to nest menus, so there is a menu item to open a sub-menu. This can be arbitrarily deep and nested in the format of a tree of items, although you need to consider if reaching for your phone becomes quicker to select the device what you want to control.
|
The application is designed around a simple scrollable menu where menu items have been extended to interface with the [Home Assistant API](https://developers.home-assistant.io/docs/api/rest/), e.g. to get the status of switches or lights for display on the toggle menu item. It is possible to nest menus, so there is a menu item to open a sub-menu. This can be arbitrarily deep and nested in the format of a tree of items, although you need to consider if reaching for your phone becomes quicker to select the device what you want to control.
|
||||||
|
|
||||||
It is important to note that your Home Assistant instance will need to be accessible via HTTPS with public SSL or all requests from the Garmin will not work. This cannot be a self-signed certificate, it must be a public certificate (You can get one for free from [Let's Encrypt](https://letsencrypt.org/) or you can pay for [Home Assistant cloud](https://www.nabucasa.com/)).
|
It is important to note that your Home Assistant instance will need to be accessible via HTTPS with public SSL or all requests from the Garmin will not work. This cannot be a self-signed certificate, it must be a public certificate. You can get one for free from [Let's Encrypt](https://letsencrypt.org/) or you can pay for [Home Assistant cloud](https://www.nabucasa.com/).
|
||||||
|
|
||||||
## Application Installation
|
**If you are struggling with getting the application to work, please consult the [trouble shooting](Troubleshooting.md) guide first.**
|
||||||
|
|
||||||
Head over to the [GarminHomeAssistant](https://apps.garmin.com/en-US/apps/61c91d28-ec5e-438d-9f83-39e9f45b199d) application page on the [Connect IQ application store](https://apps.garmin.com/en-US/) to download the application.
|
## Widget or Application?
|
||||||
|
|
||||||
|
As of version 2.0, there are now two installable versions. For older devices before applications supported 'glances', there is a now widget version. These two version must be downloaded separately due to the way the Connect IQ App Store requires them to have separate application IDs. Therefore you need to choose which you want up front. Here how they compare.
|
||||||
|
|
||||||
|
| Version | Explanation |
|
||||||
|
|------------------------|-------------|
|
||||||
|
| Application (original) | For newer devices that allow glance views in their applications (e.g. Venu2), the GarminHomeAssistant application can be started either from a glance (with only the application name presently, no status) or from the list of applications and activities. Head over to the [GarminHomeAssistant](https://apps.garmin.com/en-US/apps/61c91d28-ec5e-438d-9f83-39e9f45b199d) application page on the [Connect IQ application store](https://apps.garmin.com/en-US/) to download the application. The application can be started two different ways, either from the glance in the carousel, or as an application from the list of applications & activities. With the latter, it is worth marking the application as a favourite.<hr><br/><img src="images/Venu2_app_start.png" width="200" title="Venu 2" style="margin:5px"/><img src="images/Vivoactive3_app_start.jpg" width="200" title="Venu 2" style="margin:5px"/><br/>If you place the application on your list of favourites, and rearrange it to appear near the top, then the item is just one button press away from the watch face. This second picture here shows the application menu on a Vivoactive 3 watch.<br/><img src="images/Venu2_glance_start.png" width="200" title="Venu 2" style="margin:5px"/><br/>On newer watches, you can also start the application from the glance carousel. The glance view here typically displays some trackable status, so ours provides some early indication of availability. Older watches will still allow you to start this application from the list of applications and activities. |
|
||||||
|
| Widget | For older devices that use widgets (e.g. Venu1) as opposed to applications with "glances", the GarminHomeAssistant application can instead be started from the widget carousel. This is a separate item in the Connect IQ AppStore and with this installation, the application will no longer appear in the list of applications and activities. Head over to the [GarminHomeAssistant](https://apps.garmin.com/en-US/apps/) widget page on the [Connect IQ application store](https://apps.garmin.com/en-US/) to download the widget.<hr><br/><img src="images/Venu_Widget_sim.png" width="200" title="Venu 2" style="margin:5px"/><br/>Typically the widget view implements something similar to the glance view, e.g. status, and exists in a widget carousel to allow you to select an application to launch. |
|
||||||
|
|
||||||
|
As the source code base for both is the same, the version numbers of each will be kept in step. that means that the widget version starts version numbering at 2.0 too.
|
||||||
|
|
||||||
## Dashboard Definition
|
## Dashboard Definition
|
||||||
|
|
||||||
@@ -161,8 +170,8 @@ This allows the `confirm` field to be accommodated in the `tap_action` along sid
|
|||||||
|
|
||||||
You have options. The first is what we use.
|
You have options. The first is what we use.
|
||||||
1. **Best!** Use the [Studio Code Server](https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863) addon for Home Assistant. You can then edit your JSON file in place.
|
1. **Best!** Use the [Studio Code Server](https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863) addon for Home Assistant. You can then edit your JSON file in place.
|
||||||
2. Locally installed VSCode, or if not installed
|
2. Locally installed VSCode, or if not installed,
|
||||||
3. try the on-line version at https://vscode.dev/
|
3. try the on-line version at https://vscode.dev/.
|
||||||
|
|
||||||
Paste in your JSON (and change the file type to JSON if not saving), it will then verify your file format and schema for you, highlighting any errors for you to fix.
|
Paste in your JSON (and change the file type to JSON if not saving), it will then verify your file format and schema for you, highlighting any errors for you to fix.
|
||||||
|
|
||||||
@@ -184,12 +193,23 @@ Having created that token, before you dismiss the dialogue box with the value yo
|
|||||||
|
|
||||||
<img src="images/GarminHomeAssistantSettings.png" width="400" title="Application Settings"/>
|
<img src="images/GarminHomeAssistantSettings.png" width="400" title="Application Settings"/>
|
||||||
|
|
||||||
1. Paste your API key you've just created into the top field.
|
1. Copy and paste your API key you've just created into the top field.
|
||||||
2. Add the URL for your Home Assistant API, e.g. `https://<homeassistant>/api`. (No trailing slash `/`` character as one gets appended when creating the URL and you do not want two.)
|
2. Add the URL for your Home Assistant API, e.g. `https://<homeassistant>/api`. (No trailing slash `/`` character as one gets appended when creating the URL and you do not want two.)
|
||||||
3. Add the URL of your JSON file, e.g. `https://<homeassistant>/local/garmin/<something>.json`.
|
3. Add the URL of your JSON file, e.g. `https://<homeassistant>/local/garmin/<something>.json`.
|
||||||
|
|
||||||
You should now have a working application on your watch and be able to operate your Home Assistant devices for as long as your watch is within Bluetooth range of your phone.
|
You should now have a working application on your watch and be able to operate your Home Assistant devices for as long as your watch is within Bluetooth range of your phone.
|
||||||
|
|
||||||
|
The first toggle option selects between two menu presentations as follows:
|
||||||
|
|
||||||
|
| Menu Type | Image | Description |
|
||||||
|
|-----------------|------------------------------------------------------------------------|-------------|
|
||||||
|
| Icons (default) | <img src="images/Venu2_LeanUI.png" width="200" title="Venu 2"/> | "Lean User Interface" version removing the second row of text in favour of icons. Tap icons are blue with a pointing finger, menu items has three dots as favours by many graphical user interfaces. |
|
||||||
|
| Labels | <img src="images/Venu2_Original.png" width="200" title="Venu 2"/> | Initial version that had a second row of text. This extra text has yet to add much value. Menu and Tap actions are distinguished by text, and the toggle status is duplicated by text. A future version could possibly offer the means to customise the toggle menu item text, hence this option has not been deprecated yet. |
|
||||||
|
|
||||||
|
The second toggle setting is for "text alignment" and provides finer adjustment for right-to-left languages. Perhaps this could be made automatic based on device language.
|
||||||
|
|
||||||
|
The third toggle setting is for the Widget version of the application only. It allows the user to select a non-standard user interface behaviour. As soon as the menu is retrieved the widget view is replaced by the menu without waiting for a user selection. This has been included as requested by a user, but defaults to off which retains the expected user interactions.
|
||||||
|
|
||||||
## Tap Item Response
|
## Tap Item Response
|
||||||
|
|
||||||
Its obvious that a toggle menu item has been triggered as the visible switch changes position and colour. Less obvious is that you have successfully triggered a tap operation.
|
Its obvious that a toggle menu item has been triggered as the visible switch changes position and colour. Less obvious is that you have successfully triggered a tap operation.
|
||||||
@@ -202,7 +222,7 @@ The application will display a 'toast' showing Home Assistant's friendly name of
|
|||||||
|
|
||||||
Home Assistant will inevitably change the state of devices you are also controlling via your Garmin. The Garmin application does not maintain a web socket to listen for changes. Instead it must poll the Home Assistant API with your key. Therefore the application is not that responsive to changes. Instead there will be a delay of multiples of 100 ms per item whose status needs to be checked and amended.
|
Home Assistant will inevitably change the state of devices you are also controlling via your Garmin. The Garmin application does not maintain a web socket to listen for changes. Instead it must poll the Home Assistant API with your key. Therefore the application is not that responsive to changes. Instead there will be a delay of multiples of 100 ms per item whose status needs to be checked and amended.
|
||||||
|
|
||||||
The per toggle item delay is caused by a queue of responses to web requests filling up a queue and giving a [Communications](https://developer.garmin.com/connect-iq/api-docs/Toybox/Communications.html).`BLE_QUEUE_FULL` response code. For a Venu 2 Garmin watch an API call delay of 600 ms was found to be sustainable (500 ms was still too fast). The code now chains a sequence of updates, so as one finishes it invokes the next item's update. The more items requiring a status update that you pack into your dashboard, the slower each individual item will be updated!
|
The per toggle item delay is caused by a queue of responses to web requests filling up a queue and giving a [`Communications.BLE_QUEUE_FULL`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Communications.html). response code. For a Venu 2 Garmin watch an API call delay of 600 ms was found to be sustainable (500 ms was still too fast). The code now chains a sequence of updates, so as one finishes it invokes the next item's update. The more items requiring a status update that you pack into your dashboard, the slower each individual item will be updated!
|
||||||
|
|
||||||
The thinking here is that the watch application will only ever be open briefly not persistently, so the delay in picking up state changes won't be observed often for any race condition between two controllers.
|
The thinking here is that the watch application will only ever be open briefly not persistently, so the delay in picking up state changes won't be observed often for any race condition between two controllers.
|
||||||
|
|
||||||
@@ -240,6 +260,11 @@ The `id` attribute values are taken from the same names used in [`strings.xml`](
|
|||||||
| 1.2 | Do not crash on zero items to update. Report unreachable URLs. Verify API URL does not have a trailing slash '/'. Increased HTTP response diagnosis. Reduced minimum API Level required from 3.3.0 to 3.1.0 to allow more device "part numbers" to be satisfied. |
|
| 1.2 | Do not crash on zero items to update. Report unreachable URLs. Verify API URL does not have a trailing slash '/'. Increased HTTP response diagnosis. Reduced minimum API Level required from 3.3.0 to 3.1.0 to allow more device "part numbers" to be satisfied. |
|
||||||
| 1.3 | Tap for scripts was working in emulation but not on some phones. Decision is to make the 'service' field in the JSON compulsory for 'tap' menu items. This is a breaking change, but for many might be a fix for something not working correctly. Improve language support, we can now accept language corrections and prevent the automated translation of strings from clobbering manually refined entries. Thank you to two new contributors. |
|
| 1.3 | Tap for scripts was working in emulation but not on some phones. Decision is to make the 'service' field in the JSON compulsory for 'tap' menu items. This is a breaking change, but for many might be a fix for something not working correctly. Improve language support, we can now accept language corrections and prevent the automated translation of strings from clobbering manually refined entries. Thank you to two new contributors. |
|
||||||
| 1.4 | New lean user Interface with thanks to [Someone0nEarth](https://github.com/Someone0nEarth) for their contribution which is now the default. If you prefer the old style you can still select it in the settings. The provision of a 'service' tag is now not just heavily suggested by the JSON schema, it is enforced in code. With apologies to anyone suffering a breakage as a result. |
|
| 1.4 | New lean user Interface with thanks to [Someone0nEarth](https://github.com/Someone0nEarth) for their contribution which is now the default. If you prefer the old style you can still select it in the settings. The provision of a 'service' tag is now not just heavily suggested by the JSON schema, it is enforced in code. With apologies to anyone suffering a breakage as a result. |
|
||||||
| 1.5 | <img src="images/confirmation_view.jpg" width="200" title="Confirmation View" style="float:right"/> Added an optional confirmation dialogue view to prevent accidental execution of actions on mistaken tap. This also brings a change in the JSON schema to allow an optional field to specify that the confirmation should be used for a menu item. As we are now maturing and adding features we have decided to mitigate breaking changes to the JSON schema by being more careful to adopt the Home Assistant schema (noting there is a 1:1 mapping between YAML and JSON). This change does deprecate the top level `service` tag in favour of `tag_action` containing multiple fields including `service` & `confirm`. Users should migrate to the new format for the new functionality, but the timescale for actual deprecation are long and undecided. |
|
| 1.5 | <img src="images/confirmation_view.jpg" width="200" title="Confirmation View"/><br/>Added an optional confirmation dialogue view to prevent accidental execution of actions on mistaken tap. This also brings a change in the JSON schema to allow an optional field to specify that the confirmation should be used for a menu item. As we are now maturing and adding features we have decided to mitigate breaking changes to the JSON schema by being more careful to adopt the Home Assistant schema (noting there is a 1:1 mapping between YAML and JSON). This change does deprecate the top level `service` tag in favour of `tag_action` containing multiple fields including `service` & `confirm`. Users should migrate to the new format for the new functionality, but the timescale for actual deprecation are long and undecided. |
|
||||||
| 1.6 | Added a user configurable 'timeout' in seconds so that when no action is taken the application automatically closes, stopping the continuous polling for changes of status and hence saving the drain on the battery. This can be disabled with timeout=0. |
|
| 1.6 | Added a user configurable 'timeout' in seconds so that when no action is taken the application automatically closes, stopping the continuous polling for changes of status and hence saving the drain on the battery. This can be disabled with timeout=0. |
|
||||||
| 1.7 | Added timeout to confirmation views so that when used for security devices it does not linger when left unconfirmed. Thanks to [Jan Schneider](https://github.com/j-a-n) for the contribution. Known bug for devices not supporting [`WatchUi.getCurrentView()`](https://developer.garmin.com/connect-iq/api-docs/Toybox/WatchUi.html#getCurrentView-instance_function) API call which is only available on API Level 3.4.0, e.g. Vivoactive 4S. |
|
| 1.7 | Added timeout to confirmation views so that when used for security devices it does not linger when left unconfirmed. Thanks to [Jan Schneider](https://github.com/j-a-n) for the contribution. Known bug for devices not supporting [`WatchUi.getCurrentView()`](https://developer.garmin.com/connect-iq/api-docs/Toybox/WatchUi.html#getCurrentView-instance_function) API call which is only available on API Level 3.4.0, e.g. Vivoactive 4S. |
|
||||||
|
| 2.0 | A significant code base change to enable both a 'widget' version for older devices, e.g. Venu (1), and an application with a glance, e.g. Venu2. These two versions must now be distributed under separate application IDs, but they have the same code base. A further 20 more devices are now supported, the settings have been internationalised, and there's a bug fix for older devices when trying to display a helpful error message but instead the application crashed. This version has come from a significant collaboration with [Someone0nEarth](https://github.com/Someone0nEarth). |
|
||||||
|
|
||||||
|
## Known Issues
|
||||||
|
|
||||||
|
1. On some (old) devices (e.g. Vivoactive 3, Fexix 5s & Edge 520+), the menu does not update correctly to reflect changes in state effected by an external Home Assistant control. E.g. when the phone application changes the toggle status of a switch, the Garmin application does not reflect that change until the menu is touched or scrolled a little. This is a [known issue](https://forums.garmin.com/developer/connect-iq/i/bug-reports/menu2-doesn-t-allow-live-updates) already reported without a suggested software fix.
|
||||||
|
107
Troubleshooting.md
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
# Troubleshooting Guide
|
||||||
|
|
||||||
|
With either of the following setups, there are inevitably some problems along the way. GarminHomeAssistant is careful to rely only on having working URLs. Getting them working is the user's responsibility. However, we have developed some fault finding tools.
|
||||||
|
|
||||||
|
## Nabu Casa Setup
|
||||||
|
|
||||||
|
You can purchase cloud-based access to your Home Assistant from [Nabu Casa](https://www.nabucasa.com/), and then your setup will look something like this.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* Your API URL would be of the format `https://<id>.ui.nabu.casa/api`
|
||||||
|
* Your Garmin Watch Menu would be of the format Menu: `https://<id>.ui.nabu.casa/local/garmin/menu.json`
|
||||||
|
|
||||||
|
Where `<id>` is your personal Nabu Casa account ID.
|
||||||
|
|
||||||
|
## Do It Yourself Setup
|
||||||
|
|
||||||
|
Before Nabu Casa, or if you wanted to manage your own infrastructure, you might have something like the following:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Now you have to manage:
|
||||||
|
|
||||||
|
* Dynamic DNS
|
||||||
|
* Public access via router port forwarding
|
||||||
|
* Security via HTTPS and URL forwarding
|
||||||
|
* Certificates for HTTPS via say [Let's Encrypt](https://letsencrypt.org/) (Nginx web server helps here)
|
||||||
|
* Proxy allow list in `configuration.yaml` as follows:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
http:
|
||||||
|
use_x_forwarded_for: true
|
||||||
|
trusted_proxies:
|
||||||
|
- 127.0.0.1
|
||||||
|
- 192.168.xx.xx # Server IP - AMEND THIS
|
||||||
|
- 172.30.32.0/23 # Docker IPs for NGINX
|
||||||
|
- 172.30.33.0/24 # SSL proxy server
|
||||||
|
- 172.16.0.0/12 #
|
||||||
|
```
|
||||||
|
|
||||||
|
## Menu Configuration URL
|
||||||
|
|
||||||
|
This URL is very simple, you should be able to read the contents returned in a standard web browser.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
(Other browsers are available...)
|
||||||
|
|
||||||
|
The browser page should then display the JSON string you saved to the file on the web server. The point is this is a simple HTTP GET request with no bells and whistles.
|
||||||
|
|
||||||
|
The menu configuration can be hosted anywhere, it does not have to be on the Home Assistant web server. Just as long as it is reachable from your phone from which you Bluetooth connect to your watch, or you watch if it has direct Internet access.
|
||||||
|
|
||||||
|
## Home Assistant API URL
|
||||||
|
|
||||||
|
This is slightly trickier owning to the need to supply the API key. Here are three ways you can test your API URL is correctly configured. If successful, each of these should produce a JSON string output looking like:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{"message":"API running."}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linux, MacOS, UNIX, Cygwin etc
|
||||||
|
|
||||||
|
Save the following as a file called `api_test.sh`, edit to include your personal values for the variables, `chmod +x api_test.sh` and then execute with `./api_test.sh`.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
API_KEY="<Your API key>"
|
||||||
|
URL="https://<Your Domain>/api"
|
||||||
|
|
||||||
|
curl -s -X GET \
|
||||||
|
-H "Authorization: Bearer ${API_KEY}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
${URL}/
|
||||||
|
```
|
||||||
|
|
||||||
|
### MS Windows
|
||||||
|
|
||||||
|
Save the following as a file called `api_test.cmd`, edit to include your personal values for the variables and then double click.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
set API_KEY=<Your API key>
|
||||||
|
set URL=https://<Your Domain>/api
|
||||||
|
|
||||||
|
curl -s -X GET ^
|
||||||
|
-H "Authorization: Bearer %API_KEY%" ^
|
||||||
|
-H "Content-Type: application/json" ^
|
||||||
|
%URL%/
|
||||||
|
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### On-line
|
||||||
|
|
||||||
|
There's an online way of testing the API URL too, thanks to [REQBIN](https://reqbin.com/post-online). This has less setup and it can be saved if you log into the web site.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Top Problems
|
||||||
|
|
||||||
|
1. Failure to copy & paste keys and URLs leading to minor and hard to see errors in strings, even with protestations they are the same! (No they weren't...)
|
||||||
|
2. Accessibility of URLs, hence the above help guide.
|
133
export.cmd
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
@echo off
|
||||||
|
rem -----------------------------------------------------------------------------------
|
||||||
|
rem
|
||||||
|
rem Distributed under MIT Licence
|
||||||
|
rem See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
|
||||||
|
rem
|
||||||
|
rem -----------------------------------------------------------------------------------
|
||||||
|
rem
|
||||||
|
rem GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely
|
||||||
|
rem tested on a Venu 2 device. The source code is provided at:
|
||||||
|
rem https://github.com/house-of-abbey/GarminHomeAssistant.
|
||||||
|
rem
|
||||||
|
rem J D Abbey & P A Abbey, 28 December 2022
|
||||||
|
rem
|
||||||
|
rem Reference:
|
||||||
|
rem * Using Monkey C from the Command Line
|
||||||
|
rem * https://developer.garmin.com/connect-iq/reference-guides/monkey-c-command-line-setup/
|
||||||
|
rem
|
||||||
|
rem -----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
rem Check this path is correct for your Java installation
|
||||||
|
set JAVA_PATH=C:\Program Files (x86)\Common Files\Oracle\Java\javapath
|
||||||
|
rem SDK_PATH should work for all users
|
||||||
|
set /p SDK_PATH=<"%USERPROFILE%\AppData\Roaming\Garmin\ConnectIQ\current-sdk.cfg"
|
||||||
|
set SDK_PATH=%SDK_PATH:~0,-1%\bin
|
||||||
|
rem Assume we can create and use this directory
|
||||||
|
set DEST=export
|
||||||
|
|
||||||
|
rem C:\>java -jar %SDK_PATH%\monkeybrains.jar -h
|
||||||
|
rem usage: monkeyc [-a <arg>] [-b <arg>] [--build-stats <arg>] [-c <arg>] [-d <arg>]
|
||||||
|
rem [--debug-log-level <arg>] [--debug-log-output <arg>] [-e]
|
||||||
|
rem [--Eno-invalid-symbol] [-f <arg>] [-g] [-h] [-i <arg>] [-k] [-l <arg>]
|
||||||
|
rem [-m <arg>] [--no-gen-styles] [-o <arg>] [-O <arg>] [-p <arg>] [-r] [-s
|
||||||
|
rem <arg>] [-t] [-u <arg>] [-v] [-w] [-x <arg>] [-y <arg>] [-z <arg>]
|
||||||
|
rem -a,--apidb <arg> API import file
|
||||||
|
rem -b,--apimir <arg> API MIR file
|
||||||
|
rem --build-stats <arg> Print build stats [0=basic]
|
||||||
|
rem -c,--api-level <arg> API Level to target
|
||||||
|
rem -d,--device <arg> Target device
|
||||||
|
rem --debug-log-level <arg> Debug logging verbosity [0=errors, 1=basic,
|
||||||
|
rem 2=intermediate, 3=verbose]
|
||||||
|
rem --debug-log-output <arg>Output log zip file
|
||||||
|
rem -e,--package-app Create an application package.
|
||||||
|
rem --Eno-invalid-symbol Do not error when a symbol is found to be invalid
|
||||||
|
rem -f,--jungles <arg> Jungle files
|
||||||
|
rem -g,--debug Print debug output
|
||||||
|
rem -h,--help Prints help information
|
||||||
|
rem -i,--import-dbg <arg> Import api.debug.xml
|
||||||
|
rem -k,--profile Enable profiling support
|
||||||
|
rem -l,--typecheck <arg> Type check [0=off, 1=gradual, 2=informative,
|
||||||
|
rem 3=strict]
|
||||||
|
rem -m,--manifest <arg> Manifest file (deprecated)
|
||||||
|
rem --no-gen-styles Do not generate Rez.Styles module
|
||||||
|
rem -o,--output <arg> Output file to create
|
||||||
|
rem -O,--optimization <arg> Optimization level [0=none, 1=basic, 2=fast
|
||||||
|
rem optimizations, 3=slow optimizations] [p=optimize
|
||||||
|
rem performance, z=optimize code space]
|
||||||
|
rem -p,--project-info <arg> projectInfo.xml file to use when compiling
|
||||||
|
rem -r,--release Strip debug information
|
||||||
|
rem -s,--sdk-version <arg> SDK version to target (deprecated, use -c
|
||||||
|
rem -t,--unit-test Enables compilation of unit tests
|
||||||
|
rem -u,--devices <arg> devices.xml file to use when compiling (deprecated)
|
||||||
|
rem -v,--version Prints the compiler version
|
||||||
|
rem -w,--warn Show compiler warnings
|
||||||
|
rem -x,--excludes <arg> Add annotations to the exclude list (deprecated)
|
||||||
|
rem -y,--private-key <arg> Private key to sign builds with
|
||||||
|
rem -z,--rez <arg> Resource files (deprecated)
|
||||||
|
|
||||||
|
rem Batch file's directory where the source code is
|
||||||
|
set SRC=%~dp0
|
||||||
|
rem drop last character '\'
|
||||||
|
set SRC=%SRC:~0,-1%
|
||||||
|
|
||||||
|
if not exist %DEST% (
|
||||||
|
md %DEST%
|
||||||
|
)
|
||||||
|
|
||||||
|
if exist %SRC%\export\HomeAssistant*.iq (
|
||||||
|
del /f /q %SRC%\export\HomeAssistant*.iq
|
||||||
|
)
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Starting export of HomeAssistant Application
|
||||||
|
echo.
|
||||||
|
|
||||||
|
"%JAVA_PATH%\java.exe" ^
|
||||||
|
-Xms1g ^
|
||||||
|
-Dfile.encoding=UTF-8 ^
|
||||||
|
-Dapple.awt.UIElement=true ^
|
||||||
|
-jar %SDK_PATH%\monkeybrains.jar ^
|
||||||
|
--api-level 3.1.0 ^
|
||||||
|
--output %SRC%\export\HomeAssistant-app.iq ^
|
||||||
|
--jungles %SRC%\monkey.jungle ^
|
||||||
|
--private-key %SRC%\..\developer_key ^
|
||||||
|
--package-app ^
|
||||||
|
--release
|
||||||
|
rem --warn
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Starting export of HomeAssistant Widget
|
||||||
|
echo.
|
||||||
|
|
||||||
|
"%JAVA_PATH%\java.exe" ^
|
||||||
|
-Xms1g ^
|
||||||
|
-Dfile.encoding=UTF-8 ^
|
||||||
|
-Dapple.awt.UIElement=true ^
|
||||||
|
-jar %SDK_PATH%\monkeybrains.jar ^
|
||||||
|
--api-level 3.1.0 ^
|
||||||
|
--output %SRC%\export\HomeAssistant-widget.iq ^
|
||||||
|
--jungles %SRC%\monkey-widget.jungle ^
|
||||||
|
--private-key %SRC%\..\developer_key ^
|
||||||
|
--package-app ^
|
||||||
|
--release
|
||||||
|
rem --warn
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Finished exporting HomeAssistant
|
||||||
|
dir %SRC%\export\HomeAssistant*.iq
|
||||||
|
|
||||||
|
pause
|
||||||
|
exit /b
|
||||||
|
|
||||||
|
rem Compile PRG for a single device for side loading
|
||||||
|
"%JAVA_PATH%\java.exe" ^
|
||||||
|
-Xms1g ^
|
||||||
|
-Dfile.encoding=UTF-8 ^
|
||||||
|
-Dapple.awt.UIElement=true ^
|
||||||
|
-jar %SDK_PATH%\monkeybrains.jar ^
|
||||||
|
--output %SRC%\bin\HomeAssistant.prg ^
|
||||||
|
--jungles %SRC%\monkey.jungle ^
|
||||||
|
--private-key %SRC%\..\developer_key ^
|
||||||
|
--device venu2_sim ^
|
||||||
|
--warn
|
Before Width: | Height: | Size: 441 KiB After Width: | Height: | Size: 435 KiB |
BIN
images/Actual_Venu2_LeanUI.jpg
Normal file
After Width: | Height: | Size: 217 KiB |
BIN
images/Actual_Venu2_LeanUI_500.jpg
Normal file
After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 219 KiB |
BIN
images/Actual_Venu2_Theme_500.jpg
Normal file
After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 407 KiB |
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 105 KiB |
BIN
images/Venu2_LeanUI.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
images/Venu2_Original.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
images/Venu2_app_start.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
images/Venu2_glance_start.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
images/Venu_Widget_sim.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
BIN
images/Vivoactive3_app_start.jpg
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
images/api_test_dos_output.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
images/api_test_online.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
images/do_it_yourself_setup.png
Normal file
After Width: | Height: | Size: 812 KiB |
BIN
images/menu_url.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
images/nabu_casa_setup.png
Normal file
After Width: | Height: | Size: 764 KiB |
BIN
images/source/Network_Generic.pptx
Normal file
Before Width: | Height: | Size: 644 KiB After Width: | Height: | Size: 643 KiB |
Before Width: | Height: | Size: 317 KiB After Width: | Height: | Size: 293 KiB |
Before Width: | Height: | Size: 609 KiB After Width: | Height: | Size: 603 KiB |
Before Width: | Height: | Size: 604 KiB After Width: | Height: | Size: 600 KiB |
Before Width: | Height: | Size: 528 KiB After Width: | Height: | Size: 603 KiB |
Before Width: | Height: | Size: 537 KiB After Width: | Height: | Size: 608 KiB |
28
include/app/WidgetApp.mc
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Distributed under MIT Licence
|
||||||
|
// See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely
|
||||||
|
// tested on a Venu 2 device. The source code is provided at:
|
||||||
|
// https://github.com/house-of-abbey/GarminHomeAssistant.
|
||||||
|
//
|
||||||
|
// P A Abbey & J D Abbey & Someone0nEarth, 20 December 2023
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Description:
|
||||||
|
//
|
||||||
|
// A tedious diversion intended to make it possible to have the same source code for
|
||||||
|
// both a widget and an application. This file provides a single constant to
|
||||||
|
// determine which, and then the source file is conditionally included by the each
|
||||||
|
// .jungle file.
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using Toybox.Lang;
|
||||||
|
|
||||||
|
class WidgetApp {
|
||||||
|
static const isWidget = false;
|
||||||
|
}
|
28
include/widget/WidgetApp.mc
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Distributed under MIT Licence
|
||||||
|
// See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely
|
||||||
|
// tested on a Venu 2 device. The source code is provided at:
|
||||||
|
// https://github.com/house-of-abbey/GarminHomeAssistant.
|
||||||
|
//
|
||||||
|
// P A Abbey & J D Abbey & Someone0nEarth, 20 December 2023
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Description:
|
||||||
|
//
|
||||||
|
// A tedious diversion intended to make it possible to have the same source code for
|
||||||
|
// both a widget and an application. This file provides a single constant to
|
||||||
|
// determine which, and then the source file is conditionally included by the each
|
||||||
|
// .jungle file.
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using Toybox.Lang;
|
||||||
|
|
||||||
|
class WidgetApp {
|
||||||
|
static const isWidget = true;
|
||||||
|
}
|
194
manifest-widget.xml
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Distributed under MIT Licence
|
||||||
|
See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
|
||||||
|
|
||||||
|
|
||||||
|
GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely
|
||||||
|
tested on a Venu 2 device. The source code is provided at:
|
||||||
|
https://github.com/house-of-abbey/GarminHomeAssistant.
|
||||||
|
|
||||||
|
P A Abbey & J D Abbey & Someone0nEarth, 31 October 2023
|
||||||
|
|
||||||
|
Device Information & References:
|
||||||
|
* https://developer.garmin.com/connect-iq/compatible-devices/
|
||||||
|
* https://developer.garmin.com/connect-iq/reference-guides/devices-reference/
|
||||||
|
|
||||||
|
Someone0nEarth's Test Widget id="bf69be91-5833-4d96-92ea-c5f1a9db5dcc" type="widget"
|
||||||
|
philipabbey's Test Widget id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget"
|
||||||
|
Live Widget id="" type="widget"
|
||||||
|
|
||||||
|
-->
|
||||||
|
<iq:manifest version="3" xmlns:iq="http://www.garmin.com/xml/connectiq">
|
||||||
|
<!--
|
||||||
|
Use "Monkey C: Edit Application" from the Visual Studio Code command palette
|
||||||
|
to update the application attributes.
|
||||||
|
-->
|
||||||
|
<iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
|
||||||
|
<!--
|
||||||
|
Use the following from the Visual Studio Code comand palette to edit
|
||||||
|
the build targets:
|
||||||
|
"Monkey C: Set Products by Product Category" - Lets you add all products
|
||||||
|
that belong to the same product category
|
||||||
|
"Monkey C: Edit Products" - Lets you add or remove any product
|
||||||
|
-->
|
||||||
|
<iq:products>
|
||||||
|
<iq:product id="approachs7042mm"/>
|
||||||
|
<iq:product id="approachs7047mm"/>
|
||||||
|
<iq:product id="d2air"/>
|
||||||
|
<iq:product id="d2airx10"/>
|
||||||
|
<iq:product id="d2delta"/>
|
||||||
|
<iq:product id="d2deltapx"/>
|
||||||
|
<iq:product id="d2deltas"/>
|
||||||
|
<iq:product id="d2mach1"/>
|
||||||
|
<iq:product id="descentg1"/>
|
||||||
|
<iq:product id="descentmk2"/>
|
||||||
|
<iq:product id="descentmk2s"/>
|
||||||
|
<iq:product id="edge1030"/>
|
||||||
|
<iq:product id="edge1030bontrager"/>
|
||||||
|
<iq:product id="edge1030plus"/>
|
||||||
|
<iq:product id="edge1040"/>
|
||||||
|
<iq:product id="edge520plus"/>
|
||||||
|
<iq:product id="edge530"/>
|
||||||
|
<iq:product id="edge820"/>
|
||||||
|
<iq:product id="edge830"/>
|
||||||
|
<iq:product id="edgeexplore"/>
|
||||||
|
<iq:product id="edgeexplore2"/>
|
||||||
|
<iq:product id="enduro"/>
|
||||||
|
<iq:product id="epix2"/>
|
||||||
|
<iq:product id="epix2pro42mm"/>
|
||||||
|
<iq:product id="epix2pro47mm"/>
|
||||||
|
<iq:product id="epix2pro51mm"/>
|
||||||
|
<iq:product id="fenix5"/>
|
||||||
|
<iq:product id="fenix5plus"/>
|
||||||
|
<iq:product id="fenix5s"/>
|
||||||
|
<iq:product id="fenix5splus"/>
|
||||||
|
<iq:product id="fenix5x"/>
|
||||||
|
<iq:product id="fenix5xplus"/>
|
||||||
|
<iq:product id="fenix6"/>
|
||||||
|
<iq:product id="fenix6pro"/>
|
||||||
|
<iq:product id="fenix6s"/>
|
||||||
|
<iq:product id="fenix6spro"/>
|
||||||
|
<iq:product id="fenix6xpro"/>
|
||||||
|
<iq:product id="fenix7"/>
|
||||||
|
<iq:product id="fenix7pro"/>
|
||||||
|
<iq:product id="fenix7pronowifi"/>
|
||||||
|
<iq:product id="fenix7s"/>
|
||||||
|
<iq:product id="fenix7spro"/>
|
||||||
|
<iq:product id="fenix7x"/>
|
||||||
|
<iq:product id="fenix7xpro"/>
|
||||||
|
<iq:product id="fenix7xpronowifi"/>
|
||||||
|
<iq:product id="fenixchronos"/>
|
||||||
|
<iq:product id="fr245"/>
|
||||||
|
<iq:product id="fr245m"/>
|
||||||
|
<iq:product id="fr255"/>
|
||||||
|
<iq:product id="fr255m"/>
|
||||||
|
<iq:product id="fr255s"/>
|
||||||
|
<iq:product id="fr255sm"/>
|
||||||
|
<iq:product id="fr265"/>
|
||||||
|
<iq:product id="fr265s"/>
|
||||||
|
<iq:product id="fr55"/>
|
||||||
|
<iq:product id="fr645"/>
|
||||||
|
<iq:product id="fr645m"/>
|
||||||
|
<iq:product id="fr745"/>
|
||||||
|
<iq:product id="fr935"/>
|
||||||
|
<iq:product id="fr945"/>
|
||||||
|
<iq:product id="fr945lte"/>
|
||||||
|
<iq:product id="fr955"/>
|
||||||
|
<iq:product id="fr965"/>
|
||||||
|
<iq:product id="gpsmap67"/>
|
||||||
|
<iq:product id="instinct2"/>
|
||||||
|
<iq:product id="instinct2s"/>
|
||||||
|
<iq:product id="instinct2x"/>
|
||||||
|
<iq:product id="instinctcrossover"/>
|
||||||
|
<iq:product id="legacyherocaptainmarvel"/>
|
||||||
|
<iq:product id="legacyherofirstavenger"/>
|
||||||
|
<iq:product id="legacysagadarthvader"/>
|
||||||
|
<iq:product id="legacysagarey"/>
|
||||||
|
<iq:product id="marq2"/>
|
||||||
|
<iq:product id="marq2aviator"/>
|
||||||
|
<iq:product id="marqadventurer"/>
|
||||||
|
<iq:product id="marqathlete"/>
|
||||||
|
<iq:product id="marqaviator"/>
|
||||||
|
<iq:product id="marqcaptain"/>
|
||||||
|
<iq:product id="marqcommander"/>
|
||||||
|
<iq:product id="marqdriver"/>
|
||||||
|
<iq:product id="marqexpedition"/>
|
||||||
|
<iq:product id="marqgolfer"/>
|
||||||
|
<iq:product id="montana7xx"/>
|
||||||
|
<iq:product id="venu"/>
|
||||||
|
<iq:product id="venu2"/>
|
||||||
|
<iq:product id="venu2plus"/>
|
||||||
|
<iq:product id="venu2s"/>
|
||||||
|
<iq:product id="venu3"/>
|
||||||
|
<iq:product id="venu3s"/>
|
||||||
|
<iq:product id="venud"/>
|
||||||
|
<iq:product id="venusq"/>
|
||||||
|
<iq:product id="venusq2"/>
|
||||||
|
<iq:product id="venusq2m"/>
|
||||||
|
<iq:product id="venusqm"/>
|
||||||
|
<iq:product id="vivoactive3"/>
|
||||||
|
<iq:product id="vivoactive3m"/>
|
||||||
|
<iq:product id="vivoactive3mlte"/>
|
||||||
|
<iq:product id="vivoactive4"/>
|
||||||
|
<iq:product id="vivoactive4s"/>
|
||||||
|
<iq:product id="vivoactive5"/>
|
||||||
|
</iq:products>
|
||||||
|
<!--
|
||||||
|
Use "Monkey C: Edit Permissions" from the Visual Studio Code command
|
||||||
|
palette to update permissions.
|
||||||
|
-->
|
||||||
|
<iq:permissions>
|
||||||
|
<iq:uses-permission id="Communications"/>
|
||||||
|
<iq:uses-permission id="BluetoothLowEnergy"/>
|
||||||
|
</iq:permissions>
|
||||||
|
<!--
|
||||||
|
Use "Monkey C: Edit Languages" from the Visual Studio Code command
|
||||||
|
palette to edit your compatible language list.
|
||||||
|
-->
|
||||||
|
<iq:languages>
|
||||||
|
<iq:language>ara</iq:language>
|
||||||
|
<iq:language>bul</iq:language>
|
||||||
|
<iq:language>zhs</iq:language>
|
||||||
|
<iq:language>zht</iq:language>
|
||||||
|
<iq:language>hrv</iq:language>
|
||||||
|
<iq:language>ces</iq:language>
|
||||||
|
<iq:language>dan</iq:language>
|
||||||
|
<iq:language>dut</iq:language>
|
||||||
|
<iq:language>deu</iq:language>
|
||||||
|
<iq:language>gre</iq:language>
|
||||||
|
<iq:language>eng</iq:language>
|
||||||
|
<iq:language>est</iq:language>
|
||||||
|
<iq:language>fin</iq:language>
|
||||||
|
<iq:language>fre</iq:language>
|
||||||
|
<iq:language>heb</iq:language>
|
||||||
|
<iq:language>hun</iq:language>
|
||||||
|
<iq:language>ind</iq:language>
|
||||||
|
<iq:language>ita</iq:language>
|
||||||
|
<iq:language>jpn</iq:language>
|
||||||
|
<iq:language>kor</iq:language>
|
||||||
|
<iq:language>lav</iq:language>
|
||||||
|
<iq:language>lit</iq:language>
|
||||||
|
<iq:language>zsm</iq:language>
|
||||||
|
<iq:language>nob</iq:language>
|
||||||
|
<iq:language>pol</iq:language>
|
||||||
|
<iq:language>por</iq:language>
|
||||||
|
<iq:language>slo</iq:language>
|
||||||
|
<iq:language>ron</iq:language>
|
||||||
|
<!-- <iq:language>rus</iq:language> -->
|
||||||
|
<iq:language>slv</iq:language>
|
||||||
|
<iq:language>spa</iq:language>
|
||||||
|
<iq:language>swe</iq:language>
|
||||||
|
<iq:language>tha</iq:language>
|
||||||
|
<iq:language>tur</iq:language>
|
||||||
|
<iq:language>ukr</iq:language>
|
||||||
|
<iq:language>vie</iq:language>
|
||||||
|
</iq:languages>
|
||||||
|
<!--
|
||||||
|
Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code
|
||||||
|
command palette to edit the included barrels.
|
||||||
|
-->
|
||||||
|
<iq:barrels/>
|
||||||
|
</iq:application>
|
||||||
|
</iq:manifest>
|
108
manifest.xml
@@ -11,7 +11,10 @@
|
|||||||
|
|
||||||
P A Abbey & J D Abbey & Someone0nEarth, 31 October 2023
|
P A Abbey & J D Abbey & Someone0nEarth, 31 October 2023
|
||||||
|
|
||||||
Someone0nEarth's Test App id="bf69be91-5833-4d96-92ea-c5f1a9db5dcc" type="widget"
|
Device Information & References:
|
||||||
|
* https://developer.garmin.com/connect-iq/compatible-devices/
|
||||||
|
* https://developer.garmin.com/connect-iq/reference-guides/devices-reference/
|
||||||
|
|
||||||
philipabbey's Test App id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app"
|
philipabbey's Test App id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app"
|
||||||
Live Application id="40131e87-31ff-454b-a8e2-92276ee399d6" type="watch-app"
|
Live Application id="40131e87-31ff-454b-a8e2-92276ee399d6" type="watch-app"
|
||||||
|
|
||||||
@@ -21,7 +24,14 @@
|
|||||||
Use "Monkey C: Edit Application" from the Visual Studio Code command palette
|
Use "Monkey C: Edit Application" from the Visual Studio Code command palette
|
||||||
to update the application attributes.
|
to update the application attributes.
|
||||||
-->
|
-->
|
||||||
<iq:application id="98c36259-498a-4458-9cef-74a273ad2bc3" type="widget" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
|
<!--
|
||||||
|
Testing in VSCode requires monkey.jungle, so for convenience, swap between
|
||||||
|
watch-app and widget by changing which of the next two lines are commented out
|
||||||
|
-->
|
||||||
|
<iq:application id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
|
||||||
|
<!--
|
||||||
|
<iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
|
||||||
|
-->
|
||||||
<!--
|
<!--
|
||||||
Use the following from the Visual Studio Code comand palette to edit
|
Use the following from the Visual Studio Code comand palette to edit
|
||||||
the build targets:
|
the build targets:
|
||||||
@@ -30,110 +40,80 @@
|
|||||||
"Monkey C: Edit Products" - Lets you add or remove any product
|
"Monkey C: Edit Products" - Lets you add or remove any product
|
||||||
-->
|
-->
|
||||||
<iq:products>
|
<iq:products>
|
||||||
<!--
|
|
||||||
Device Information & References:
|
|
||||||
* https://developer.garmin.com/connect-iq/compatible-devices/
|
|
||||||
* https://developer.garmin.com/connect-iq/reference-guides/devices-reference/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Screen Size 390x390 launcher icon size 70x70 -->
|
|
||||||
<iq:product id="approachs7042mm"/>
|
<iq:product id="approachs7042mm"/>
|
||||||
<!-- Screen Size 454x454 launcher icon size 80x80 -->
|
|
||||||
<iq:product id="approachs7047mm"/>
|
<iq:product id="approachs7047mm"/>
|
||||||
<!-- Screen Size 176x176 launcher icon size 62x62 -->
|
<iq:product id="d2air"/>
|
||||||
<iq:product id="descentg1"/>
|
|
||||||
<!-- Screen Size 280x280 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="descentmk2"/>
|
|
||||||
<!-- Screen Size 240x240 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="descentmk2s"/>
|
|
||||||
<!-- Screen Size 416x416 launcher icon size 70x70 -->
|
|
||||||
<iq:product id="d2airx10"/>
|
<iq:product id="d2airx10"/>
|
||||||
<!-- Screen Size 416x416 launcher icon size 60x60 -->
|
<iq:product id="d2delta"/>
|
||||||
|
<iq:product id="d2deltapx"/>
|
||||||
|
<iq:product id="d2deltas"/>
|
||||||
<iq:product id="d2mach1"/>
|
<iq:product id="d2mach1"/>
|
||||||
<!-- Screen Size 282x470 launcher icon size 36x36 -->
|
<iq:product id="descentg1"/>
|
||||||
|
<iq:product id="descentmk2"/>
|
||||||
|
<iq:product id="descentmk2s"/>
|
||||||
<iq:product id="edge1030"/>
|
<iq:product id="edge1030"/>
|
||||||
<iq:product id="edge1030bontrager"/>
|
<iq:product id="edge1030bontrager"/>
|
||||||
<iq:product id="edge1030plus"/>
|
<iq:product id="edge1030plus"/>
|
||||||
<!-- Screen Size 282x470 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="edge1040"/>
|
<iq:product id="edge1040"/>
|
||||||
<!-- Screen Size 246x322 launcher icon size 35x35 -->
|
<iq:product id="edge520plus"/>
|
||||||
<iq:product id="edge530"/>
|
<iq:product id="edge530"/>
|
||||||
|
<iq:product id="edge820"/>
|
||||||
<iq:product id="edge830"/>
|
<iq:product id="edge830"/>
|
||||||
<!-- Screen Size 240x400 launcher icon size 36x36 -->
|
<iq:product id="edgeexplore"/>
|
||||||
<iq:product id="edgeexplore2"/>
|
<iq:product id="edgeexplore2"/>
|
||||||
<!-- Screen Size 280x280 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="enduro"/>
|
<iq:product id="enduro"/>
|
||||||
<!-- Screen Size 416x416 launcher icon size 60x60 -->
|
|
||||||
<iq:product id="epix2"/>
|
<iq:product id="epix2"/>
|
||||||
<!-- Screen Size 390x390 launcher icon size 60x60 -->
|
|
||||||
<iq:product id="epix2pro42mm"/>
|
<iq:product id="epix2pro42mm"/>
|
||||||
<iq:product id="epix2pro47mm"/>
|
<iq:product id="epix2pro47mm"/>
|
||||||
<!-- Screen Size 454x454 launcher icon size 60x60 -->
|
|
||||||
<iq:product id="epix2pro51mm"/>
|
<iq:product id="epix2pro51mm"/>
|
||||||
<!-- Screen Size 240x240 launcher icon size 40x40 -->
|
<iq:product id="fenix5"/>
|
||||||
<iq:product id="fenix5plus"/>
|
<iq:product id="fenix5plus"/>
|
||||||
|
<iq:product id="fenix5s"/>
|
||||||
<iq:product id="fenix5splus"/>
|
<iq:product id="fenix5splus"/>
|
||||||
|
<iq:product id="fenix5x"/>
|
||||||
<iq:product id="fenix5xplus"/>
|
<iq:product id="fenix5xplus"/>
|
||||||
<!-- Screen Size 260x260 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fenix6"/>
|
<iq:product id="fenix6"/>
|
||||||
<iq:product id="fenix6pro"/>
|
<iq:product id="fenix6pro"/>
|
||||||
<!-- Screen Size 240x240 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fenix6s"/>
|
<iq:product id="fenix6s"/>
|
||||||
<iq:product id="fenix6spro"/>
|
<iq:product id="fenix6spro"/>
|
||||||
<!-- Screen Size 280x280 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fenix6xpro"/>
|
<iq:product id="fenix6xpro"/>
|
||||||
<!-- Screen Size 260x260 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fenix7"/>
|
<iq:product id="fenix7"/>
|
||||||
<!-- Screen Size 260x260 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fenix7pro"/>
|
<iq:product id="fenix7pro"/>
|
||||||
<iq:product id="fenix7pronowifi"/>
|
<iq:product id="fenix7pronowifi"/>
|
||||||
<!-- Screen Size 240x240 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fenix7s"/>
|
<iq:product id="fenix7s"/>
|
||||||
<!-- Screen Size 240x240 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fenix7spro"/>
|
<iq:product id="fenix7spro"/>
|
||||||
<!-- Screen Size 280x280 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fenix7x"/>
|
<iq:product id="fenix7x"/>
|
||||||
<!-- Screen Size 280x280 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fenix7xpro"/>
|
<iq:product id="fenix7xpro"/>
|
||||||
<iq:product id="fenix7xpronowifi"/>
|
<iq:product id="fenix7xpronowifi"/>
|
||||||
<!-- Screen Size 240x240 launcher icon size 40x40 -->
|
<iq:product id="fenixchronos"/>
|
||||||
<iq:product id="fr245"/>
|
<iq:product id="fr245"/>
|
||||||
<iq:product id="fr245m"/>
|
<iq:product id="fr245m"/>
|
||||||
<!-- Screen Size 260x260 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fr255"/>
|
<iq:product id="fr255"/>
|
||||||
<iq:product id="fr255m"/>
|
<iq:product id="fr255m"/>
|
||||||
<!-- Screen Size 218x218 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fr255s"/>
|
<iq:product id="fr255s"/>
|
||||||
<iq:product id="fr255sm"/>
|
<iq:product id="fr255sm"/>
|
||||||
<!-- Screen Size 416x416 launcher icon size 60x60 -->
|
|
||||||
<iq:product id="fr265"/>
|
<iq:product id="fr265"/>
|
||||||
<iq:product id="fr265s"/>
|
<iq:product id="fr265s"/>
|
||||||
<!-- Screen Size 208x208 launcher icon size 35x35 -->
|
|
||||||
<iq:product id="fr55"/>
|
<iq:product id="fr55"/>
|
||||||
<!-- Screen Size 240x240 launcher icon size 40x40 -->
|
<iq:product id="fr645"/>
|
||||||
|
<iq:product id="fr645m"/>
|
||||||
<iq:product id="fr745"/>
|
<iq:product id="fr745"/>
|
||||||
|
<iq:product id="fr935"/>
|
||||||
<iq:product id="fr945"/>
|
<iq:product id="fr945"/>
|
||||||
<iq:product id="fr945lte"/>
|
<iq:product id="fr945lte"/>
|
||||||
<!-- Screen Size 260x260 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="fr955"/>
|
<iq:product id="fr955"/>
|
||||||
<!-- Screen Size 454x454 launcher icon size 65x65 -->
|
|
||||||
<iq:product id="fr965"/>
|
<iq:product id="fr965"/>
|
||||||
<!-- Screen Size 176x176 launcher icon size 62x62 -->
|
<iq:product id="gpsmap67"/>
|
||||||
<iq:product id="instinct2"/>
|
<iq:product id="instinct2"/>
|
||||||
<!-- Screen Size 163x156 launcher icon size 54x54 -->
|
|
||||||
<iq:product id="instinct2s"/>
|
<iq:product id="instinct2s"/>
|
||||||
<!-- Screen Size 176x176 launcher icon size 62x62 -->
|
|
||||||
<iq:product id="instinct2x"/>
|
<iq:product id="instinct2x"/>
|
||||||
<!-- Screen Size 176x176 launcher icon size 26x26 -->
|
|
||||||
<iq:product id="instinctcrossover"/>
|
<iq:product id="instinctcrossover"/>
|
||||||
<!-- Screen Size 218x218 launcher icon size 30x30 -->
|
|
||||||
<iq:product id="legacyherocaptainmarvel"/>
|
<iq:product id="legacyherocaptainmarvel"/>
|
||||||
<!-- Screen Size 260x260 launcher icon size 35x35 -->
|
|
||||||
<iq:product id="legacyherofirstavenger"/>
|
<iq:product id="legacyherofirstavenger"/>
|
||||||
<iq:product id="legacysagadarthvader"/>
|
<iq:product id="legacysagadarthvader"/>
|
||||||
<!-- Screen Size 218x218 launcher icon size 30x30 -->
|
|
||||||
<iq:product id="legacysagarey"/>
|
<iq:product id="legacysagarey"/>
|
||||||
<!-- Screen Size 240x240 launcher icon size 40x40 -->
|
<iq:product id="marq2"/>
|
||||||
|
<iq:product id="marq2aviator"/>
|
||||||
<iq:product id="marqadventurer"/>
|
<iq:product id="marqadventurer"/>
|
||||||
<iq:product id="marqathlete"/>
|
<iq:product id="marqathlete"/>
|
||||||
<iq:product id="marqaviator"/>
|
<iq:product id="marqaviator"/>
|
||||||
@@ -142,31 +122,23 @@
|
|||||||
<iq:product id="marqdriver"/>
|
<iq:product id="marqdriver"/>
|
||||||
<iq:product id="marqexpedition"/>
|
<iq:product id="marqexpedition"/>
|
||||||
<iq:product id="marqgolfer"/>
|
<iq:product id="marqgolfer"/>
|
||||||
<!-- Screen Size 390x390 launcher icon size 60x60 -->
|
<iq:product id="montana7xx"/>
|
||||||
<iq:product id="marq2"/>
|
|
||||||
<iq:product id="marq2aviator"/>
|
|
||||||
<!-- Screen Size 390x390 launcher icon size 60x60 -->
|
|
||||||
<iq:product id="venu"/>
|
<iq:product id="venu"/>
|
||||||
<!-- Screen Size 416x416 launcher icon size 70x70 -->
|
|
||||||
<iq:product id="venu2"/>
|
<iq:product id="venu2"/>
|
||||||
<iq:product id="venu2plus"/>
|
<iq:product id="venu2plus"/>
|
||||||
<!-- Screen Size 360x360 launcher icon size 61x61 -->
|
|
||||||
<iq:product id="venu2s"/>
|
<iq:product id="venu2s"/>
|
||||||
<!-- Screen Size 240x240 launcher icon size 36x36 -->
|
<iq:product id="venu3"/>
|
||||||
|
<iq:product id="venu3s"/>
|
||||||
|
<iq:product id="venud"/>
|
||||||
<iq:product id="venusq"/>
|
<iq:product id="venusq"/>
|
||||||
<iq:product id="venusqm"/>
|
|
||||||
<!-- Screen Size 320x360 launcher icon size 40x40 -->
|
|
||||||
<iq:product id="venusq2"/>
|
<iq:product id="venusq2"/>
|
||||||
<iq:product id="venusq2m"/>
|
<iq:product id="venusq2m"/>
|
||||||
<!-- Screen Size 454x454 launcher icon size 70x70 -->
|
<iq:product id="venusqm"/>
|
||||||
<iq:product id="venu3"/>
|
<iq:product id="vivoactive3"/>
|
||||||
<!-- Screen Size 390x390 launcher icon size 70x70 -->
|
<iq:product id="vivoactive3m"/>
|
||||||
<iq:product id="venu3s"/>
|
<iq:product id="vivoactive3mlte"/>
|
||||||
<!-- Screen Size 260x260 launcher icon size 35x35 -->
|
|
||||||
<iq:product id="vivoactive4"/>
|
<iq:product id="vivoactive4"/>
|
||||||
<!-- Screen Size 218x218 launcher icon size 30x30 -->
|
|
||||||
<iq:product id="vivoactive4s"/>
|
<iq:product id="vivoactive4s"/>
|
||||||
<!-- Screen Size 390x390 launcher icon size 70x70 -->
|
|
||||||
<iq:product id="vivoactive5"/>
|
<iq:product id="vivoactive5"/>
|
||||||
</iq:products>
|
</iq:products>
|
||||||
<!--
|
<!--
|
||||||
|
205
monkey-widget.jungle
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
#-----------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Distributed under MIT Licence
|
||||||
|
# See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
|
||||||
|
#
|
||||||
|
#-----------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely
|
||||||
|
# tested on a Venu 2 device. The source code is provided at:
|
||||||
|
# https://github.com/house-of-abbey/GarminHomeAssistant.
|
||||||
|
#
|
||||||
|
# J D Abbey & P A Abbey, 28 December 2022
|
||||||
|
#
|
||||||
|
# Reference:
|
||||||
|
# * https://developer.garmin.com/connect-iq/reference-guides/jungle-reference/
|
||||||
|
#
|
||||||
|
#-----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
project.manifest = manifest-widget.xml
|
||||||
|
|
||||||
|
base.sourcePath = source;include/widget
|
||||||
|
|
||||||
|
# Device References
|
||||||
|
# * https://developer.garmin.com/connect-iq/compatible-devices/
|
||||||
|
# * https://developer.garmin.com/connect-iq/reference-guides/devices-reference/
|
||||||
|
#
|
||||||
|
# Widget launcher icon, multiple resolutions
|
||||||
|
# https://forums.garmin.com/developer/connect-iq/f/discussion/255433/widget-launcher-icon-multiple-resolutions/1563305
|
||||||
|
#
|
||||||
|
# Use the online SVG converter to write out PNGs from "resources\drawables\launcher.svg" by changing
|
||||||
|
# the 'width' and 'height' attributes of the SVG.
|
||||||
|
# https://svgtopng.com/
|
||||||
|
#
|
||||||
|
# The icons need to scale as a ratio of screen size 48:416 pixels
|
||||||
|
#
|
||||||
|
# Icon 53 48 46 42 37 32 30 28 26 24 21 18
|
||||||
|
# Screen 454 416 390 360 320 280 260 240 218 208 176 156
|
||||||
|
|
||||||
|
# Screen Size 390x390 launcher icon size 70x70
|
||||||
|
approachs7042mm.resourcePath = $(approachs7042mm.resourcePath);resources-launcher-70-70;resources-icons-46
|
||||||
|
# Screen Size 454x454 launcher icon size 80x80
|
||||||
|
approachs7047mm.resourcePath = $(approachs7047mm.resourcePath);resources-launcher-80-80;resources-icons-53
|
||||||
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
|
d2air.resourcePath = $(d2air.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
# Screen Size 416x416 launcher icon size 70x70
|
||||||
|
d2airx10.resourcePath = $(d2airx10.resourcePath);resources-launcher-70-70;resources-icons-48
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
d2delta.resourcePath = $(d2delta.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
d2deltapx.resourcePath = $(d2deltapx.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
d2deltas.resourcePath = $(d2deltas.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 416x416 launcher icon size 60x60
|
||||||
|
d2mach1.resourcePath = $(d2mach1.resourcePath);resources-launcher-60-60;resources-icons-48
|
||||||
|
# Screen Size 176x176 launcher icon size 62x62
|
||||||
|
descentg1.resourcePath = $(descentg1.resourcePath);resources-launcher-62-62;resources-icons-21
|
||||||
|
# Screen Size 280x280 launcher icon size 40x40
|
||||||
|
descentmk2.resourcePath = $(descentmk2.resourcePath);resources-launcher-40-40;resources-icons-32
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
descentmk2s.resourcePath = $(descentmk2s.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 282x470 launcher icon size 36x36
|
||||||
|
edge1030.resourcePath = $(descentmk2s.resourcePath);resources-launcher-36-36;resources-icons-32
|
||||||
|
edge1030bontrager.resourcePath = $(edge1030bontrager.resourcePath);resources-launcher-36-36;resources-icons-32
|
||||||
|
edge1030plus.resourcePath = $(edge1030plus.resourcePath);resources-launcher-36-36;resources-icons-32
|
||||||
|
# Screen Size 282x470 launcher icon size 40x40
|
||||||
|
edge1040.resourcePath = $(edge1040.resourcePath);resources-launcher-40-40;resources-icons-32
|
||||||
|
# Screen Size 200x265 launcher icon size 35x35
|
||||||
|
edge520plus.resourcePath = $(edge520plus.resourcePath);resources-launcher-35-35;resources-icons-24
|
||||||
|
# Screen Size 246x322 launcher icon size 35x35
|
||||||
|
edge530.resourcePath = $(edge530.resourcePath);resources-launcher-35-35;resources-icons-28
|
||||||
|
# Screen Size 200x265 launcher icon size 35x35
|
||||||
|
edge820.resourcePath = $(edge820.resourcePath);resources-launcher-35-35;resources-icons-24
|
||||||
|
# Screen Size 246x322 launcher icon size 35x35
|
||||||
|
edge830.resourcePath = $(edge830.resourcePath);resources-launcher-35-35;resources-icons-28
|
||||||
|
# Screen Size 240x400 launcher icon size 36x36
|
||||||
|
edgeexplore.resourcePath = $(edgeexplore.resourcePath);resources-launcher-36-36;resources-icons-28
|
||||||
|
edgeexplore2.resourcePath = $(edgeexplore2.resourcePath);resources-launcher-36-36;resources-icons-28
|
||||||
|
# Screen Size 280x280 launcher icon size 40x40
|
||||||
|
enduro.resourcePath = $(enduro.resourcePath);resources-launcher-40-40;resources-icons-32
|
||||||
|
# Screen Size 416x416 launcher icon size 60x60
|
||||||
|
epix2.resourcePath = $(epix2.resourcePath);resources-launcher-60-60;resources-icons-48
|
||||||
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
|
epix2pro42mm.resourcePath = $(epix2pro42mm.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
epix2pro47mm.resourcePath = $(epix2pro47mm.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
# Screen Size 454x454 launcher icon size 60x60
|
||||||
|
epix2pro51mm.resourcePath = $(epix2pro51mm.resourcePath);resources-launcher-60-60;resources-icons-53
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fenix5.resourcePath = $(fenix5.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fenix5plus.resourcePath = $(fenix5plus.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 218x218 launcher icon size 36x36
|
||||||
|
fenix5s.resourcePath = $(fenix5s.resourcePath);resources-launcher-36-36;resources-icons-26
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fenix5splus.resourcePath = $(fenix5splus.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fenix5x.resourcePath = $(fenix5x.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fenix5xplus.resourcePath = $(fenix5xplus.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 260x260 launcher icon size 40x40
|
||||||
|
fenix6.resourcePath = $(fenix6.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
|
fenix6pro.resourcePath = $(fenix6pro.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fenix6s.resourcePath = $(fenix6s.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fenix6spro.resourcePath = $(fenix6spro.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 280x280 launcher icon size 40x40
|
||||||
|
fenix6xpro.resourcePath = $(fenix6xpro.resourcePath);resources-launcher-40-40;resources-icons-32
|
||||||
|
# Screen Size 260x260 launcher icon size 40x40
|
||||||
|
fenix7.resourcePath = $(fenix7.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
|
# Screen Size 260x260 launcher icon size 40x40
|
||||||
|
fenix7pro.resourcePath = $(fenix7pro.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
|
fenix7pronowifi.resourcePath = $(fenix7pronowifi.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
|
# Screen Size 218x218 launcher icon size 36x36
|
||||||
|
fenixchronos.resourcePath = $(fenixchronos.resourcePath);resources-launcher-36-36;resources-icons-26
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fenix7s.resourcePath = $(fenix7s.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fenix7spro.resourcePath = $(fenix7spro.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 280x280 launcher icon size 40x40
|
||||||
|
fenix7x.resourcePath = $(fenix7x.resourcePath);resources-launcher-40-40;resources-icons-32
|
||||||
|
# Screen Size 280x280 launcher icon size 40x40
|
||||||
|
fenix7xpro.resourcePath = $(fenix7xpro.resourcePath);resources-launcher-40-40;resources-icons-32
|
||||||
|
fenix7xpronowifi.resourcePath = $(fenix7xpronowifi.resourcePath);resources-launcher-40-40;resources-icons-32
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fr245.resourcePath = $(fr245.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fr245m.resourcePath = $(fr245m.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 260x260 launcher icon size 40x40
|
||||||
|
fr255.resourcePath = $(fr255.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
|
fr255m.resourcePath = $(fr255m.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
|
# Screen Size 218x218 launcher icon size 40x40
|
||||||
|
fr255s.resourcePath = $(fr255s.resourcePath);resources-launcher-40-40;resources-icons-26
|
||||||
|
fr255sm.resourcePath = $(fr255sm.resourcePath);resources-launcher-40-40;resources-icons-26
|
||||||
|
# Screen Size 416x416 launcher icon size 60x60
|
||||||
|
fr265.resourcePath = $(fr265.resourcePath);resources-launcher-60-60;resources-icons-48
|
||||||
|
fr265s.resourcePath = $(fr265s.resourcePath);resources-launcher-60-60;resources-icons-48
|
||||||
|
# Screen Size 208x208 launcher icon size 35x35
|
||||||
|
fr55.resourcePath = $(fr55.resourcePath);resources-launcher-35-35;resources-icons-24
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fr645.resourcePath = $(fr645.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fr645m.resourcePath = $(fr645m.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fr745.resourcePath = $(fr745.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fr935.resourcePath = $(fr935.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fr945.resourcePath = $(fr945.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fr945lte.resourcePath = $(fr945lte.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 260x260 launcher icon size 40x40
|
||||||
|
fr955.resourcePath = $(fr955.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
|
# Screen Size 454x454 launcher icon size 65x65
|
||||||
|
fr965.resourcePath = $(fr965.resourcePath);resources-launcher-65-65;resources-icons-53
|
||||||
|
# Screen Size 240x400 launcher icon size 38x33
|
||||||
|
gpsmap67.resourcePath = $(gpsmap67.resourcePath);resources-launcher-33-33;resources-icons-28
|
||||||
|
# Screen Size 176x176 launcher icon size 62x62
|
||||||
|
instinct2.resourcePath = $(instinct2.resourcePath);resources-launcher-62-62;resources-icons-21
|
||||||
|
# Screen Size 163x156 launcher icon size 54x54
|
||||||
|
instinct2s.resourcePath = $(instinct2s.resourcePath);resources-launcher-54-54;resources-icons-18
|
||||||
|
# Screen Size 176x176 launcher icon size 62x62
|
||||||
|
instinct2x.resourcePath = $(instinct2x.resourcePath);resources-launcher-62-62;resources-icons-21
|
||||||
|
# Screen Size 176x176 launcher icon size 26x26
|
||||||
|
instinctcrossover.resourcePath = $(instinctcrossover.resourcePath);resources-launcher-26-26;resources-icons-21
|
||||||
|
# Screen Size 218x218 launcher icon size 30x30
|
||||||
|
legacyherocaptainmarvel.resourcePath = $(legacyherocaptainmarvel.resourcePath);resources-launcher-30-30;resources-icons-26
|
||||||
|
# Screen Size 260x260 launcher icon size 35x35
|
||||||
|
legacyherofirstavenger.resourcePath = $(legacyherofirstavenger.resourcePath);resources-launcher-35-35;resources-icons-30
|
||||||
|
legacysagadarthvader.resourcePath = $(legacysagadarthvader.resourcePath);resources-launcher-35-35;resources-icons-30
|
||||||
|
# Screen Size 218x218 launcher icon size 30x30
|
||||||
|
legacysagarey.resourcePath = $(legacysagarey.resourcePath);resources-launcher-30-30;resources-icons-26
|
||||||
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
|
marq2.resourcePath = $(marq2.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
marq2aviator.resourcePath = $(marq2aviator.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
marqadventurer.resourcePath = $(marqadventurer.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
marqathlete.resourcePath = $(marqathlete.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
marqaviator.resourcePath = $(marqaviator.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
marqcaptain.resourcePath = $(marqcaptain.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
marqcommander.resourcePath = $(marqcommander.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
marqdriver.resourcePath = $(marqdriver.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
marqexpedition.resourcePath = $(marqexpedition.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
marqgolfer.resourcePath = $(marqgolfer.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 480x800 launcher icon size 60x60
|
||||||
|
montana7xx.resourcePath = $(montana7xx.resourcePath);resources-launcher-60-60;resources-icons-53
|
||||||
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
|
venu.resourcePath = $(venu.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
# Screen Size 416x416 launcher icon size 70x70
|
||||||
|
venu2.resourcePath = $(venu2.resourcePath);resources-launcher-70-70;resources-icons-48
|
||||||
|
venu2plus.resourcePath = $(venu2plus.resourcePath);resources-launcher-70-70;resources-icons-48
|
||||||
|
# Screen Size 360x360 launcher icon size 61x61
|
||||||
|
venu2s.resourcePath = $(venu2s.resourcePath);resources-launcher-61-61;resources-icons-42
|
||||||
|
# Screen Size 454x454 launcher icon size 70x70
|
||||||
|
venu3.resourcePath = $(venu3.resourcePath);resources-launcher-70-70;resources-icons-53
|
||||||
|
# Screen Size 390x390 launcher icon size 70x70
|
||||||
|
venu3s.resourcePath = $(venu3s.resourcePath);resources-launcher-70-70;resources-icons-46
|
||||||
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
|
venud.resourcePath = $(venud.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
# Screen Size 240x240 launcher icon size 36x36
|
||||||
|
venusq.resourcePath = $(venusq.resourcePath);resources-launcher-36-36;resources-icons-28
|
||||||
|
# Screen Size 320x360 launcher icon size 40x40
|
||||||
|
venusq2.resourcePath = $(venusq2.resourcePath);resources-launcher-40-40;resources-icons-38
|
||||||
|
# Screen Size 320x360 launcher icon size 40x40
|
||||||
|
venusq2m.resourcePath = $(venusq2m.resourcePath);resources-launcher-40-40;resources-icons-38
|
||||||
|
# Screen Size 240x240 launcher icon size 36x36
|
||||||
|
venusqm.resourcePath = $(venusqm.resourcePath);resources-launcher-36-36;resources-icons-28
|
||||||
|
# Screen Size 240x240 launcher icon size 40x33
|
||||||
|
vivoactive3.resourcePath = $(vivoactive3.resourcePath);resources-launcher-33-33;resources-icons-28
|
||||||
|
vivoactive3m.resourcePath = $(vivoactive3m.resourcePath);resources-launcher-33-33;resources-icons-28
|
||||||
|
vivoactive3mlte.resourcePath = $(vivoactive3mlte.resourcePath);resources-launcher-33-33;resources-icons-28
|
||||||
|
# Screen Size 260x260 launcher icon size 35x35
|
||||||
|
vivoactive4.resourcePath = $(vivoactive4.resourcePath);resources-launcher-35-35;resources-icons-30
|
||||||
|
# Screen Size 218x218 launcher icon size 30x30
|
||||||
|
vivoactive4s.resourcePath = $(vivoactive4s.resourcePath);resources-launcher-30-30;resources-icons-26
|
||||||
|
# Screen Size 390x390 launcher icon size 70x70
|
||||||
|
vivoactive5.resourcePath = $(vivoactive5.resourcePath);resources-launcher-70-70;resources-icons-46
|
@@ -18,6 +18,11 @@
|
|||||||
|
|
||||||
project.manifest = manifest.xml
|
project.manifest = manifest.xml
|
||||||
|
|
||||||
|
# Testing in VSCode requires monkey.jungle, so for convenience, swap between
|
||||||
|
# watch-app and widget by changing which of the next two lines are commented out
|
||||||
|
base.sourcePath = source;include/app
|
||||||
|
#base.sourcePath = source;include/widget
|
||||||
|
|
||||||
# Device References
|
# Device References
|
||||||
# * https://developer.garmin.com/connect-iq/compatible-devices/
|
# * https://developer.garmin.com/connect-iq/compatible-devices/
|
||||||
# * https://developer.garmin.com/connect-iq/reference-guides/devices-reference/
|
# * https://developer.garmin.com/connect-iq/reference-guides/devices-reference/
|
||||||
@@ -38,6 +43,16 @@ project.manifest = manifest.xml
|
|||||||
approachs7042mm.resourcePath = $(approachs7042mm.resourcePath);resources-launcher-70-70;resources-icons-46
|
approachs7042mm.resourcePath = $(approachs7042mm.resourcePath);resources-launcher-70-70;resources-icons-46
|
||||||
# Screen Size 454x454 launcher icon size 80x80
|
# Screen Size 454x454 launcher icon size 80x80
|
||||||
approachs7047mm.resourcePath = $(approachs7047mm.resourcePath);resources-launcher-80-80;resources-icons-53
|
approachs7047mm.resourcePath = $(approachs7047mm.resourcePath);resources-launcher-80-80;resources-icons-53
|
||||||
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
|
d2air.resourcePath = $(d2air.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
# Screen Size 416x416 launcher icon size 70x70
|
||||||
|
d2airx10.resourcePath = $(d2airx10.resourcePath);resources-launcher-70-70;resources-icons-48
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
d2delta.resourcePath = $(d2delta.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
d2deltapx.resourcePath = $(d2deltapx.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
d2deltas.resourcePath = $(d2deltas.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 416x416 launcher icon size 60x60
|
||||||
|
d2mach1.resourcePath = $(d2mach1.resourcePath);resources-launcher-60-60;resources-icons-48
|
||||||
# Screen Size 176x176 launcher icon size 62x62
|
# Screen Size 176x176 launcher icon size 62x62
|
||||||
descentg1.resourcePath = $(descentg1.resourcePath);resources-launcher-62-62;resources-icons-21
|
descentg1.resourcePath = $(descentg1.resourcePath);resources-launcher-62-62;resources-icons-21
|
||||||
# Screen Size 280x280 launcher icon size 40x40
|
# Screen Size 280x280 launcher icon size 40x40
|
||||||
@@ -50,17 +65,19 @@ edge1030bontrager.resourcePath = $(edge1030bontrager.resourcePath);resources-lau
|
|||||||
edge1030plus.resourcePath = $(edge1030plus.resourcePath);resources-launcher-36-36;resources-icons-32
|
edge1030plus.resourcePath = $(edge1030plus.resourcePath);resources-launcher-36-36;resources-icons-32
|
||||||
# Screen Size 282x470 launcher icon size 40x40
|
# Screen Size 282x470 launcher icon size 40x40
|
||||||
edge1040.resourcePath = $(edge1040.resourcePath);resources-launcher-40-40;resources-icons-32
|
edge1040.resourcePath = $(edge1040.resourcePath);resources-launcher-40-40;resources-icons-32
|
||||||
|
# Screen Size 200x265 launcher icon size 35x35
|
||||||
|
edge520plus.resourcePath = $(edge520plus.resourcePath);resources-launcher-35-35;resources-icons-24
|
||||||
# Screen Size 246x322 launcher icon size 35x35
|
# Screen Size 246x322 launcher icon size 35x35
|
||||||
edge530.resourcePath = $(edge530.resourcePath);resources-launcher-35-35;resources-icons-28
|
edge530.resourcePath = $(edge530.resourcePath);resources-launcher-35-35;resources-icons-28
|
||||||
|
# Screen Size 200x265 launcher icon size 35x35
|
||||||
|
edge820.resourcePath = $(edge820.resourcePath);resources-launcher-35-35;resources-icons-24
|
||||||
|
# Screen Size 246x322 launcher icon size 35x35
|
||||||
edge830.resourcePath = $(edge830.resourcePath);resources-launcher-35-35;resources-icons-28
|
edge830.resourcePath = $(edge830.resourcePath);resources-launcher-35-35;resources-icons-28
|
||||||
# Screen Size 240x400 launcher icon size 36x36
|
# Screen Size 240x400 launcher icon size 36x36
|
||||||
|
edgeexplore.resourcePath = $(edgeexplore.resourcePath);resources-launcher-36-36;resources-icons-28
|
||||||
edgeexplore2.resourcePath = $(edgeexplore2.resourcePath);resources-launcher-36-36;resources-icons-28
|
edgeexplore2.resourcePath = $(edgeexplore2.resourcePath);resources-launcher-36-36;resources-icons-28
|
||||||
# Screen Size 280x280 launcher icon size 40x40
|
# Screen Size 280x280 launcher icon size 40x40
|
||||||
enduro.resourcePath = $(enduro.resourcePath);resources-launcher-40-40;resources-icons-32
|
enduro.resourcePath = $(enduro.resourcePath);resources-launcher-40-40;resources-icons-32
|
||||||
# Screen Size 416x416 launcher icon size 70x70
|
|
||||||
d2airx10.resourcePath = $(d2airx10.resourcePath);resources-launcher-70-70;resources-icons-48
|
|
||||||
# Screen Size 416x416 launcher icon size 60x60
|
|
||||||
d2mach1.resourcePath = $(d2mach1.resourcePath);resources-launcher-60-60;resources-icons-48
|
|
||||||
# Screen Size 416x416 launcher icon size 60x60
|
# Screen Size 416x416 launcher icon size 60x60
|
||||||
epix2.resourcePath = $(epix2.resourcePath);resources-launcher-60-60;resources-icons-48
|
epix2.resourcePath = $(epix2.resourcePath);resources-launcher-60-60;resources-icons-48
|
||||||
# Screen Size 390x390 launcher icon size 60x60
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
@@ -69,8 +86,13 @@ epix2pro47mm.resourcePath = $(epix2pro47mm.resourcePath);resources-launcher-60-6
|
|||||||
# Screen Size 454x454 launcher icon size 60x60
|
# Screen Size 454x454 launcher icon size 60x60
|
||||||
epix2pro51mm.resourcePath = $(epix2pro51mm.resourcePath);resources-launcher-60-60;resources-icons-53
|
epix2pro51mm.resourcePath = $(epix2pro51mm.resourcePath);resources-launcher-60-60;resources-icons-53
|
||||||
# Screen Size 240x240 launcher icon size 40x40
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fenix5.resourcePath = $(fenix5.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
fenix5plus.resourcePath = $(fenix5plus.resourcePath);resources-launcher-40-40;resources-icons-28
|
fenix5plus.resourcePath = $(fenix5plus.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 218x218 launcher icon size 36x36
|
||||||
|
fenix5s.resourcePath = $(fenix5s.resourcePath);resources-launcher-36-36;resources-icons-26
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
fenix5splus.resourcePath = $(fenix5splus.resourcePath);resources-launcher-40-40;resources-icons-28
|
fenix5splus.resourcePath = $(fenix5splus.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fenix5x.resourcePath = $(fenix5x.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
fenix5xplus.resourcePath = $(fenix5xplus.resourcePath);resources-launcher-40-40;resources-icons-28
|
fenix5xplus.resourcePath = $(fenix5xplus.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
# Screen Size 260x260 launcher icon size 40x40
|
# Screen Size 260x260 launcher icon size 40x40
|
||||||
fenix6.resourcePath = $(fenix6.resourcePath);resources-launcher-40-40;resources-icons-30
|
fenix6.resourcePath = $(fenix6.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
@@ -85,6 +107,8 @@ fenix7.resourcePath = $(fenix7.resourcePath);resources-launcher-40-40;resources-
|
|||||||
# Screen Size 260x260 launcher icon size 40x40
|
# Screen Size 260x260 launcher icon size 40x40
|
||||||
fenix7pro.resourcePath = $(fenix7pro.resourcePath);resources-launcher-40-40;resources-icons-30
|
fenix7pro.resourcePath = $(fenix7pro.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
fenix7pronowifi.resourcePath = $(fenix7pronowifi.resourcePath);resources-launcher-40-40;resources-icons-30
|
fenix7pronowifi.resourcePath = $(fenix7pronowifi.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
|
# Screen Size 218x218 launcher icon size 36x36
|
||||||
|
fenixchronos.resourcePath = $(fenixchronos.resourcePath);resources-launcher-36-36;resources-icons-26
|
||||||
# Screen Size 240x240 launcher icon size 40x40
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
fenix7s.resourcePath = $(fenix7s.resourcePath);resources-launcher-40-40;resources-icons-28
|
fenix7s.resourcePath = $(fenix7s.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
# Screen Size 240x240 launcher icon size 40x40
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
@@ -109,13 +133,19 @@ fr265s.resourcePath = $(fr265s.resourcePath);resources-launcher-60-60;resources-
|
|||||||
# Screen Size 208x208 launcher icon size 35x35
|
# Screen Size 208x208 launcher icon size 35x35
|
||||||
fr55.resourcePath = $(fr55.resourcePath);resources-launcher-35-35;resources-icons-24
|
fr55.resourcePath = $(fr55.resourcePath);resources-launcher-35-35;resources-icons-24
|
||||||
# Screen Size 240x240 launcher icon size 40x40
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
|
fr645.resourcePath = $(fr645.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fr645m.resourcePath = $(fr645m.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
fr745.resourcePath = $(fr745.resourcePath);resources-launcher-40-40;resources-icons-28
|
fr745.resourcePath = $(fr745.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
|
fr935.resourcePath = $(fr935.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
fr945.resourcePath = $(fr945.resourcePath);resources-launcher-40-40;resources-icons-28
|
fr945.resourcePath = $(fr945.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
fr945lte.resourcePath = $(fr945lte.resourcePath);resources-launcher-40-40;resources-icons-28
|
fr945lte.resourcePath = $(fr945lte.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
# Screen Size 260x260 launcher icon size 40x40
|
# Screen Size 260x260 launcher icon size 40x40
|
||||||
fr955.resourcePath = $(fr955.resourcePath);resources-launcher-40-40;resources-icons-30
|
fr955.resourcePath = $(fr955.resourcePath);resources-launcher-40-40;resources-icons-30
|
||||||
# Screen Size 454x454 launcher icon size 65x65
|
# Screen Size 454x454 launcher icon size 65x65
|
||||||
fr965.resourcePath = $(fr965.resourcePath);resources-launcher-65-65;resources-icons-53
|
fr965.resourcePath = $(fr965.resourcePath);resources-launcher-65-65;resources-icons-53
|
||||||
|
# Screen Size 240x400 launcher icon size 38x33
|
||||||
|
gpsmap67.resourcePath = $(gpsmap67.resourcePath);resources-launcher-33-33;resources-icons-28
|
||||||
# Screen Size 176x176 launcher icon size 62x62
|
# Screen Size 176x176 launcher icon size 62x62
|
||||||
instinct2.resourcePath = $(instinct2.resourcePath);resources-launcher-62-62;resources-icons-21
|
instinct2.resourcePath = $(instinct2.resourcePath);resources-launcher-62-62;resources-icons-21
|
||||||
# Screen Size 163x156 launcher icon size 54x54
|
# Screen Size 163x156 launcher icon size 54x54
|
||||||
@@ -131,6 +161,9 @@ legacyherofirstavenger.resourcePath = $(legacyherofirstavenger.resourcePath);res
|
|||||||
legacysagadarthvader.resourcePath = $(legacysagadarthvader.resourcePath);resources-launcher-35-35;resources-icons-30
|
legacysagadarthvader.resourcePath = $(legacysagadarthvader.resourcePath);resources-launcher-35-35;resources-icons-30
|
||||||
# Screen Size 218x218 launcher icon size 30x30
|
# Screen Size 218x218 launcher icon size 30x30
|
||||||
legacysagarey.resourcePath = $(legacysagarey.resourcePath);resources-launcher-30-30;resources-icons-26
|
legacysagarey.resourcePath = $(legacysagarey.resourcePath);resources-launcher-30-30;resources-icons-26
|
||||||
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
|
marq2.resourcePath = $(marq2.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
marq2aviator.resourcePath = $(marq2aviator.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
# Screen Size 240x240 launcher icon size 40x40
|
# Screen Size 240x240 launcher icon size 40x40
|
||||||
marqadventurer.resourcePath = $(marqadventurer.resourcePath);resources-launcher-40-40;resources-icons-28
|
marqadventurer.resourcePath = $(marqadventurer.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
marqathlete.resourcePath = $(marqathlete.resourcePath);resources-launcher-40-40;resources-icons-28
|
marqathlete.resourcePath = $(marqathlete.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
@@ -140,9 +173,8 @@ marqcommander.resourcePath = $(marqcommander.resourcePath);resources-launcher-40
|
|||||||
marqdriver.resourcePath = $(marqdriver.resourcePath);resources-launcher-40-40;resources-icons-28
|
marqdriver.resourcePath = $(marqdriver.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
marqexpedition.resourcePath = $(marqexpedition.resourcePath);resources-launcher-40-40;resources-icons-28
|
marqexpedition.resourcePath = $(marqexpedition.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
marqgolfer.resourcePath = $(marqgolfer.resourcePath);resources-launcher-40-40;resources-icons-28
|
marqgolfer.resourcePath = $(marqgolfer.resourcePath);resources-launcher-40-40;resources-icons-28
|
||||||
# Screen Size 390x390 launcher icon size 60x60
|
# Screen Size 480x800 launcher icon size 60x60
|
||||||
marq2.resourcePath = $(marq2.resourcePath);resources-launcher-60-60;resources-icons-46
|
montana7xx.resourcePath = $(montana7xx.resourcePath);resources-launcher-60-60;resources-icons-53
|
||||||
marq2aviator.resourcePath = $(marq2aviator.resourcePath);resources-launcher-60-60;resources-icons-46
|
|
||||||
# Screen Size 390x390 launcher icon size 60x60
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
venu.resourcePath = $(venu.resourcePath);resources-launcher-60-60;resources-icons-46
|
venu.resourcePath = $(venu.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
# Screen Size 416x416 launcher icon size 70x70
|
# Screen Size 416x416 launcher icon size 70x70
|
||||||
@@ -150,16 +182,24 @@ venu2.resourcePath = $(venu2.resourcePath);resources-launcher-70-70;resources-ic
|
|||||||
venu2plus.resourcePath = $(venu2plus.resourcePath);resources-launcher-70-70;resources-icons-48
|
venu2plus.resourcePath = $(venu2plus.resourcePath);resources-launcher-70-70;resources-icons-48
|
||||||
# Screen Size 360x360 launcher icon size 61x61
|
# Screen Size 360x360 launcher icon size 61x61
|
||||||
venu2s.resourcePath = $(venu2s.resourcePath);resources-launcher-61-61;resources-icons-42
|
venu2s.resourcePath = $(venu2s.resourcePath);resources-launcher-61-61;resources-icons-42
|
||||||
# Screen Size 240x240 launcher icon size 36x36
|
|
||||||
venusq.resourcePath = $(venusq.resourcePath);resources-launcher-36-36;resources-icons-28
|
|
||||||
venusqm.resourcePath = $(venusqm.resourcePath);resources-launcher-36-36;resources-icons-28
|
|
||||||
# Screen Size 320x360 launcher icon size 40x40
|
|
||||||
venusq2.resourcePath = $(venusq2.resourcePath);resources-launcher-40-40;resources-icons-38
|
|
||||||
venusq2m.resourcePath = $(venusq2m.resourcePath);resources-launcher-40-40;resources-icons-38
|
|
||||||
# Screen Size 454x454 launcher icon size 70x70
|
# Screen Size 454x454 launcher icon size 70x70
|
||||||
venu3.resourcePath = $(venu3.resourcePath);resources-launcher-70-70;resources-icons-53
|
venu3.resourcePath = $(venu3.resourcePath);resources-launcher-70-70;resources-icons-53
|
||||||
# Screen Size 390x390 launcher icon size 70x70
|
# Screen Size 390x390 launcher icon size 70x70
|
||||||
venu3s.resourcePath = $(venu3s.resourcePath);resources-launcher-70-70;resources-icons-46
|
venu3s.resourcePath = $(venu3s.resourcePath);resources-launcher-70-70;resources-icons-46
|
||||||
|
# Screen Size 390x390 launcher icon size 60x60
|
||||||
|
venud.resourcePath = $(venud.resourcePath);resources-launcher-60-60;resources-icons-46
|
||||||
|
# Screen Size 240x240 launcher icon size 36x36
|
||||||
|
venusq.resourcePath = $(venusq.resourcePath);resources-launcher-36-36;resources-icons-28
|
||||||
|
# Screen Size 320x360 launcher icon size 40x40
|
||||||
|
venusq2.resourcePath = $(venusq2.resourcePath);resources-launcher-40-40;resources-icons-38
|
||||||
|
# Screen Size 320x360 launcher icon size 40x40
|
||||||
|
venusq2m.resourcePath = $(venusq2m.resourcePath);resources-launcher-40-40;resources-icons-38
|
||||||
|
# Screen Size 240x240 launcher icon size 36x36
|
||||||
|
venusqm.resourcePath = $(venusqm.resourcePath);resources-launcher-36-36;resources-icons-28
|
||||||
|
# Screen Size 240x240 launcher icon size 40x33
|
||||||
|
vivoactive3.resourcePath = $(vivoactive3.resourcePath);resources-launcher-33-33;resources-icons-28
|
||||||
|
vivoactive3m.resourcePath = $(vivoactive3m.resourcePath);resources-launcher-33-33;resources-icons-28
|
||||||
|
vivoactive3mlte.resourcePath = $(vivoactive3mlte.resourcePath);resources-launcher-33-33;resources-icons-28
|
||||||
# Screen Size 260x260 launcher icon size 35x35
|
# Screen Size 260x260 launcher icon size 35x35
|
||||||
vivoactive4.resourcePath = $(vivoactive4.resourcePath);resources-launcher-35-35;resources-icons-30
|
vivoactive4.resourcePath = $(vivoactive4.resourcePath);resources-launcher-35-35;resources-icons-30
|
||||||
# Screen Size 218x218 launcher icon size 30x30
|
# Screen Size 218x218 launcher icon size 30x30
|
||||||
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">مقبض</string>
|
<string id="MenuItemTap">مقبض</string>
|
||||||
<string id="MenuItemMenu">قائمة طعام</string>
|
<string id="MenuItemMenu">قائمة طعام</string>
|
||||||
<string id="Confirm">بالتأكيد؟</string>
|
<string id="Confirm">بالتأكيد؟</string>
|
||||||
<string id="NoPhone">لا يوجد اتصال الهاتف</string>
|
<string id="NoPhone" scope="glance">لا يوجد اتصال الهاتف</string>
|
||||||
<string id="NoInternet">لا يوجد اتصال بالإنترنت</string>
|
<string id="NoInternet">لا يوجد اتصال بالإنترنت</string>
|
||||||
<string id="NoResponse">لا توجد استجابة، تحقق من الاتصال بالإنترنت</string>
|
<string id="NoResponse">لا توجد استجابة، تحقق من الاتصال بالإنترنت</string>
|
||||||
<string id="NoMenu">خطأ في إحضار القائمة</string>
|
<string id="NoAPIKey" scope="glance">لا يوجد مفتاح API في إعدادات التطبيق</string>
|
||||||
<string id="NoAPIKey">لا يوجد مفتاح API في إعدادات التطبيق</string>
|
<string id="NoApiUrl" scope="glance">لا يوجد عنوان URL لواجهة برمجة التطبيقات في إعدادات التطبيق</string>
|
||||||
<string id="NoApiUrl">لا يوجد عنوان URL لواجهة برمجة التطبيقات في إعدادات التطبيق</string>
|
<string id="NoConfigUrl" scope="glance">لا يوجد عنوان URL للتكوين في إعدادات التطبيق</string>
|
||||||
<string id="NoConfigUrl">لا يوجد عنوان URL للتكوين في إعدادات التطبيق</string>
|
|
||||||
<string id="ApiFlood">مكالمات API سريعة جدًا. يرجى إبطاء طلباتك.</string>
|
<string id="ApiFlood">مكالمات API سريعة جدًا. يرجى إبطاء طلباتك.</string>
|
||||||
<string id="ApiUrlNotFound">لم يتم العثور على عنوان URL. خطأ محتمل في عنوان URL لواجهة برمجة التطبيقات في الإعدادات.</string>
|
<string id="ApiUrlNotFound">لم يتم العثور على عنوان URL. خطأ محتمل في عنوان URL لواجهة برمجة التطبيقات في الإعدادات.</string>
|
||||||
<string id="ConfigUrlNotFound">لم يتم العثور على عنوان URL. خطأ محتمل في عنوان URL للتكوين في الإعدادات.</string>
|
<string id="ConfigUrlNotFound">لم يتم العثور على عنوان URL. خطأ محتمل في عنوان URL للتكوين في الإعدادات.</string>
|
||||||
|
<string id="NoJson">لم يتم إرجاع JSON من طلب HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">قام طلب HTTP بإرجاع رمز الخطأ =</string>
|
<string id="UnhandledHttpErr">قام طلب HTTP بإرجاع رمز الخطأ =</string>
|
||||||
<string id="TrailingSlashErr">يجب ألا يحتوي عنوان URL لواجهة برمجة التطبيقات على شرطة مائلة لاحقة '/'</string>
|
<string id="TrailingSlashErr">يجب ألا يحتوي عنوان URL لواجهة برمجة التطبيقات على شرطة مائلة لاحقة '/'</string>
|
||||||
<string id="FetchingMenuConfig">جارٍ جلب تكوين القائمة..</string>
|
<string id="Available" scope="glance">متاح</string>
|
||||||
<string id="ExitViewTouch">مرّر سريعًا إلى اليمين للخروج\nانقر للبقاء</string>
|
<string id="Checking" scope="glance">تدقيق...</string>
|
||||||
<string id="ExitViewButtons">اضغط على "الرجوع للخروج"\nأدخل للبقاء</string>
|
<string id="Unavailable" scope="glance">غير متوفره</string>
|
||||||
|
<string id="Unconfigured" scope="glance">غير مهيأ</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">قائمة طعام</string>
|
||||||
<!-- لإعدادات واجهة المستخدم الرسومية -->
|
<!-- لإعدادات واجهة المستخدم الرسومية -->
|
||||||
<string id="SettingsApiKey">مفتاح API لـ HomeAssistant.</string>
|
<string id="SettingsApiKey">مفتاح API لـ HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">رمز الوصول طويل الأمد.</string>
|
<string id="SettingsApiKeyPrompt">رمز الوصول طويل الأمد.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">بعد هذا الوقت (بالثواني)، يتم إغلاق مربع حوار تأكيد الإجراء تلقائيًا ويتم إلغاء الإجراء. اضبط على 0 لتعطيل المهلة.</string>
|
<string id="SettingsConfirmTimeout">بعد هذا الوقت (بالثواني)، يتم إغلاق مربع حوار تأكيد الإجراء تلقائيًا ويتم إلغاء الإجراء. اضبط على 0 لتعطيل المهلة.</string>
|
||||||
<string id="SettingsUi">تمثيل الأنواع بأيقونات (إيقاف) أو بالتسميات (تشغيل).</string>
|
<string id="SettingsUi">تمثيل الأنواع بأيقونات (إيقاف) أو بالتسميات (تشغيل).</string>
|
||||||
<string id="SettingsTextAlign">محاذاة القائمة لليسار (إيقاف) أو لليمين (تشغيل).</string>
|
<string id="SettingsTextAlign">محاذاة القائمة لليسار (إيقاف) أو لليمين (تشغيل).</string>
|
||||||
|
<string id="SettingsWidgetStart">(القطعة فقط) قم بتشغيل التطبيق تلقائيًا من الأداة دون انتظار نقرة واحدة.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Докоснете</string>
|
<string id="MenuItemTap">Докоснете</string>
|
||||||
<string id="MenuItemMenu">Меню</string>
|
<string id="MenuItemMenu">Меню</string>
|
||||||
<string id="Confirm">Сигурен?</string>
|
<string id="Confirm">Сигурен?</string>
|
||||||
<string id="NoPhone">Няма телефонна връзка</string>
|
<string id="NoPhone" scope="glance">Няма телефонна връзка</string>
|
||||||
<string id="NoInternet">Няма интернет връзка</string>
|
<string id="NoInternet">Няма интернет връзка</string>
|
||||||
<string id="NoResponse">Няма отговор, проверете интернет връзката</string>
|
<string id="NoResponse">Няма отговор, проверете интернет връзката</string>
|
||||||
<string id="NoMenu">Грешка при извличане на менюто</string>
|
<string id="NoAPIKey" scope="glance">Няма API ключ в настройките на приложението</string>
|
||||||
<string id="NoAPIKey">Няма API ключ в настройките на приложението</string>
|
<string id="NoApiUrl" scope="glance">Няма URL адрес на API в настройките на приложението</string>
|
||||||
<string id="NoApiUrl">Няма URL адрес на API в настройките на приложението</string>
|
<string id="NoConfigUrl" scope="glance">Няма конфигурационен URL адрес в настройките на приложението</string>
|
||||||
<string id="NoConfigUrl">Няма конфигурационен URL адрес в настройките на приложението</string>
|
|
||||||
<string id="ApiFlood">Извикванията на API са твърде бързи. Моля, забавете вашите заявки.</string>
|
<string id="ApiFlood">Извикванията на API са твърде бързи. Моля, забавете вашите заявки.</string>
|
||||||
<string id="ApiUrlNotFound">URL не е намерен. Потенциална грешка в URL адреса на API в настройките.</string>
|
<string id="ApiUrlNotFound">URL не е намерен. Потенциална грешка в URL адреса на API в настройките.</string>
|
||||||
<string id="ConfigUrlNotFound">URL не е намерен. Потенциална грешка в URL адреса на конфигурацията в настройките.</string>
|
<string id="ConfigUrlNotFound">URL не е намерен. Потенциална грешка в URL адреса на конфигурацията в настройките.</string>
|
||||||
|
<string id="NoJson">Няма върнат JSON от HTTP заявка.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP заявката върна код на грешка =</string>
|
<string id="UnhandledHttpErr">HTTP заявката върна код на грешка =</string>
|
||||||
<string id="TrailingSlashErr">URL адресът на API не трябва да има наклонена черта '/' в края</string>
|
<string id="TrailingSlashErr">URL адресът на API не трябва да има наклонена черта '/' в края</string>
|
||||||
<string id="FetchingMenuConfig">Извличане на конфигурацията на менюто..</string>
|
<string id="Available" scope="glance">На разположение</string>
|
||||||
<string id="ExitViewTouch">Плъзнете надясно, за да излезете\nДокоснете, за да останете</string>
|
<string id="Checking" scope="glance">Проверка...</string>
|
||||||
<string id="ExitViewButtons">Натиснете Назад, за да излезете\nВлезте, за да останете</string>
|
<string id="Unavailable" scope="glance">Недостъпен</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Неконфигуриран</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Меню</string>
|
||||||
<!-- За GUI за настройки -->
|
<!-- За GUI за настройки -->
|
||||||
<string id="SettingsApiKey">API ключ за HomeAssistant.</string>
|
<string id="SettingsApiKey">API ключ за HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Токен за дълготраен достъп.</string>
|
<string id="SettingsApiKeyPrompt">Токен за дълготраен достъп.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">След това време (в секунди) диалоговият прозорец за потвърждение за действие се затваря автоматично и действието се отменя. Задайте 0, за да деактивирате изчакването.</string>
|
<string id="SettingsConfirmTimeout">След това време (в секунди) диалоговият прозорец за потвърждение за действие се затваря автоматично и действието се отменя. Задайте 0, за да деактивирате изчакването.</string>
|
||||||
<string id="SettingsUi">Представяне на типове с икони (изключено) или с етикети (включено).</string>
|
<string id="SettingsUi">Представяне на типове с икони (изключено) или с етикети (включено).</string>
|
||||||
<string id="SettingsTextAlign">Ляво (изключено) или дясно (включено) подравняване на менюто.</string>
|
<string id="SettingsTextAlign">Ляво (изключено) или дясно (включено) подравняване на менюто.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Само за джаджа) Автоматично стартирайте приложението от джаджата, без да чакате докосване.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Klepněte</string>
|
<string id="MenuItemTap">Klepněte</string>
|
||||||
<string id="MenuItemMenu">Jídelní lístek</string>
|
<string id="MenuItemMenu">Jídelní lístek</string>
|
||||||
<string id="Confirm">Tak určitě?</string>
|
<string id="Confirm">Tak určitě?</string>
|
||||||
<string id="NoPhone">Žádné telefonní spojení</string>
|
<string id="NoPhone" scope="glance">Žádné telefonní spojení</string>
|
||||||
<string id="NoInternet">Žádné internetové připojení</string>
|
<string id="NoInternet">Žádné internetové připojení</string>
|
||||||
<string id="NoResponse">Žádná odpověď, zkontrolujte připojení k internetu</string>
|
<string id="NoResponse">Žádná odpověď, zkontrolujte připojení k internetu</string>
|
||||||
<string id="NoMenu">Chyba načítání nabídky</string>
|
<string id="NoAPIKey" scope="glance">V nastavení aplikace není žádný klíč API</string>
|
||||||
<string id="NoAPIKey">V nastavení aplikace není žádný klíč API</string>
|
<string id="NoApiUrl" scope="glance">V nastavení aplikace není žádná adresa URL API</string>
|
||||||
<string id="NoApiUrl">V nastavení aplikace není žádná adresa URL API</string>
|
<string id="NoConfigUrl" scope="glance">V nastavení aplikace není žádná konfigurační URL</string>
|
||||||
<string id="NoConfigUrl">V nastavení aplikace není žádná konfigurační URL</string>
|
|
||||||
<string id="ApiFlood">Příliš rychlá volání API. Zpomalte prosím své požadavky.</string>
|
<string id="ApiFlood">Příliš rychlá volání API. Zpomalte prosím své požadavky.</string>
|
||||||
<string id="ApiUrlNotFound">Adresa URL nenalezena. Potenciální chyba adresy URL rozhraní API v nastavení.</string>
|
<string id="ApiUrlNotFound">Adresa URL nenalezena. Potenciální chyba URL API v nastavení.</string>
|
||||||
<string id="ConfigUrlNotFound">Adresa URL nenalezena. Potenciální chyba konfigurační adresy URL v nastavení.</string>
|
<string id="ConfigUrlNotFound">Adresa URL nenalezena. Potenciální chyba konfigurační adresy URL v nastavení.</string>
|
||||||
|
<string id="NoJson">Z požadavku HTTP se nevrátil žádný JSON.</string>
|
||||||
<string id="UnhandledHttpErr">Požadavek HTTP vrátil kód chyby =</string>
|
<string id="UnhandledHttpErr">Požadavek HTTP vrátil kód chyby =</string>
|
||||||
<string id="TrailingSlashErr">Adresa URL rozhraní API nesmí mít koncové lomítko „/“</string>
|
<string id="TrailingSlashErr">Adresa URL rozhraní API nesmí mít koncové lomítko „/“</string>
|
||||||
<string id="FetchingMenuConfig">Načítání konfigurace nabídky...</string>
|
<string id="Available" scope="glance">Dostupný</string>
|
||||||
<string id="ExitViewTouch">Přejetím prstem doprava ukončíte\nKlepnutím zůstanete</string>
|
<string id="Checking" scope="glance">Kontrola...</string>
|
||||||
<string id="ExitViewButtons">Stisknutím Zpět ukončíte\nVstupte a zůstanete</string>
|
<string id="Unavailable" scope="glance">Není k dispozici</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Nenakonfigurováno</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Jídelní lístek</string>
|
||||||
<!-- Pro nastavení GUI -->
|
<!-- Pro nastavení GUI -->
|
||||||
<string id="SettingsApiKey">Klíč API pro HomeAssistant.</string>
|
<string id="SettingsApiKey">Klíč API pro HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Přístupový token s dlouhou životností.</string>
|
<string id="SettingsApiKeyPrompt">Přístupový token s dlouhou životností.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Po uplynutí této doby (v sekundách) se dialog pro potvrzení akce automaticky zavře a akce se zruší. Nastavením na 0 deaktivujete časový limit.</string>
|
<string id="SettingsConfirmTimeout">Po uplynutí této doby (v sekundách) se dialog pro potvrzení akce automaticky zavře a akce se zruší. Nastavením na 0 deaktivujete časový limit.</string>
|
||||||
<string id="SettingsUi">Znázornění typů pomocí ikon (vypnuto) nebo pomocí štítků (zapnuto).</string>
|
<string id="SettingsUi">Znázornění typů pomocí ikon (vypnuto) nebo pomocí štítků (zapnuto).</string>
|
||||||
<string id="SettingsTextAlign">Zarovnání nabídky vlevo (vypnuto) nebo vpravo (zapnuto).</string>
|
<string id="SettingsTextAlign">Zarovnání nabídky vlevo (vypnuto) nebo vpravo (zapnuto).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Pouze widget) Automaticky spusťte aplikaci z widgetu bez čekání na klepnutí.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Tryk på</string>
|
<string id="MenuItemTap">Tryk på</string>
|
||||||
<string id="MenuItemMenu">Menu</string>
|
<string id="MenuItemMenu">Menu</string>
|
||||||
<string id="Confirm">Jo da?</string>
|
<string id="Confirm">Jo da?</string>
|
||||||
<string id="NoPhone">Ingen telefonforbindelse</string>
|
<string id="NoPhone" scope="glance">Ingen telefonforbindelse</string>
|
||||||
<string id="NoInternet">Ingen internetforbindelse</string>
|
<string id="NoInternet">Ingen internetforbindelse</string>
|
||||||
<string id="NoResponse">Intet svar, tjek internetforbindelse</string>
|
<string id="NoResponse">Intet svar, tjek internetforbindelse</string>
|
||||||
<string id="NoMenu">Menuhentningsfejl</string>
|
<string id="NoAPIKey" scope="glance">Ingen API-nøgle i applikationsindstillingerne</string>
|
||||||
<string id="NoAPIKey">Ingen API-nøgle i applikationsindstillingerne</string>
|
<string id="NoApiUrl" scope="glance">Ingen API-URL i applikationsindstillingerne</string>
|
||||||
<string id="NoApiUrl">Ingen API-URL i applikationsindstillingerne</string>
|
<string id="NoConfigUrl" scope="glance">Ingen konfigurations-URL i applikationsindstillingerne</string>
|
||||||
<string id="NoConfigUrl">Ingen konfigurations-URL i applikationsindstillingerne</string>
|
|
||||||
<string id="ApiFlood">API-kald for hurtigt. Sænk venligst dine anmodninger.</string>
|
<string id="ApiFlood">API-kald for hurtigt. Sænk venligst dine anmodninger.</string>
|
||||||
<string id="ApiUrlNotFound">URL ikke fundet. Potentiel API URL-fejl i indstillinger.</string>
|
<string id="ApiUrlNotFound">URL ikke fundet. Potentiel API URL-fejl i indstillinger.</string>
|
||||||
<string id="ConfigUrlNotFound">URL ikke fundet. Potentiel konfigurations-URL-fejl i indstillinger.</string>
|
<string id="ConfigUrlNotFound">URL ikke fundet. Potentiel konfigurations-URL-fejl i indstillinger.</string>
|
||||||
|
<string id="NoJson">Ingen JSON returneret fra HTTP-anmodning.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP-anmodning returnerede fejlkode =</string>
|
<string id="UnhandledHttpErr">HTTP-anmodning returnerede fejlkode =</string>
|
||||||
<string id="TrailingSlashErr">API URL må ikke have en efterfølgende skråstreg '/'</string>
|
<string id="TrailingSlashErr">API URL må ikke have en efterfølgende skråstreg '/'</string>
|
||||||
<string id="FetchingMenuConfig">Henter menukonfiguration..</string>
|
<string id="Available" scope="glance">Ledig</string>
|
||||||
<string id="ExitViewTouch">Stryg til højre for at afslutte\nTryk for at blive</string>
|
<string id="Checking" scope="glance">Tjekker...</string>
|
||||||
<string id="ExitViewButtons">Tryk på Tilbage for at afslutte\nEnter for at blive</string>
|
<string id="Unavailable" scope="glance">Ikke tilgængelig</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Ukonfigureret</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menu</string>
|
||||||
<!-- Til indstillingerne GUI -->
|
<!-- Til indstillingerne GUI -->
|
||||||
<string id="SettingsApiKey">API-nøgle til HomeAssistant.</string>
|
<string id="SettingsApiKey">API-nøgle til HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Adgangstoken med lang levetid.</string>
|
<string id="SettingsApiKeyPrompt">Adgangstoken med lang levetid.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Efter dette tidspunkt (i sekunder) lukkes en bekræftelsesdialog for en handling automatisk, og handlingen annulleres. Indstil til 0 for at deaktivere timeout.</string>
|
<string id="SettingsConfirmTimeout">Efter dette tidspunkt (i sekunder) lukkes en bekræftelsesdialog for en handling automatisk, og handlingen annulleres. Indstil til 0 for at deaktivere timeout.</string>
|
||||||
<string id="SettingsUi">Repræsenterer typer med ikoner (fra) eller med etiketter (til).</string>
|
<string id="SettingsUi">Repræsenterer typer med ikoner (fra) eller med etiketter (til).</string>
|
||||||
<string id="SettingsTextAlign">Venstre (fra) eller Højre (til) menujustering.</string>
|
<string id="SettingsTextAlign">Venstre (fra) eller Højre (til) menujustering.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Kun widget) Start automatisk applikationen fra widgetten uden at vente på et tryk.</string>
|
||||||
</strings>
|
</strings>
|
@@ -22,7 +22,4 @@
|
|||||||
<string id="MenuItemTap">Antippen</string>
|
<string id="MenuItemTap">Antippen</string>
|
||||||
<string id="MenuItemMenu">Menü</string>
|
<string id="MenuItemMenu">Menü</string>
|
||||||
<string id="UnhandledHttpErr">Die HTTP-Anfrage gab folgenden Fehlercode zurück = </string>
|
<string id="UnhandledHttpErr">Die HTTP-Anfrage gab folgenden Fehlercode zurück = </string>
|
||||||
<string id="ExitViewTouch">Zum Beenden nach rechts swipen\nZum Bleiben antippen</string>
|
|
||||||
<string id="ExitViewButtons">Drücke „Zurück“, um zu Beenden.\n„Enter“, um zu bleiben</string>
|
|
||||||
<string id="FetchingMenuConfig">Lade Config vom Server ... </string>
|
|
||||||
</strings>
|
</strings>
|
||||||
|
@@ -23,23 +23,25 @@
|
|||||||
<string id="MenuItemOn">An</string>
|
<string id="MenuItemOn">An</string>
|
||||||
<string id="MenuItemOff">Aus</string>
|
<string id="MenuItemOff">Aus</string>
|
||||||
<string id="MenuItemTap">Antippen</string>
|
<string id="MenuItemTap">Antippen</string>
|
||||||
<string id="MenuItemMenu">Menü</string>
|
<string id="MenuItemMenu">Menü</string>
|
||||||
<string id="Confirm">Sicher?</string>
|
<string id="Confirm">Sicher?</string>
|
||||||
<string id="NoPhone">Keine Telefonverbindung</string>
|
<string id="NoPhone" scope="glance">Keine Telefonverbindung</string>
|
||||||
<string id="NoInternet">Keine Internetverbindung</string>
|
<string id="NoInternet">Keine Internetverbindung</string>
|
||||||
<string id="NoResponse">Keine Antwort, überprüfen Sie die Internetverbindung</string>
|
<string id="NoResponse">Keine Antwort, überprüfen Sie die Internetverbindung</string>
|
||||||
<string id="NoMenu">Fehler beim Abrufen des Menüs</string>
|
<string id="NoAPIKey" scope="glance">Kein API-Schlüssel in den Anwendungseinstellungen</string>
|
||||||
<string id="NoAPIKey">Kein API-Schlüssel in den Anwendungseinstellungen</string>
|
<string id="NoApiUrl" scope="glance">Keine API-URL in den Anwendungseinstellungen</string>
|
||||||
<string id="NoApiUrl">Keine API-URL in den Anwendungseinstellungen</string>
|
<string id="NoConfigUrl" scope="glance">Keine Konfigurations-URL in den Anwendungseinstellungen</string>
|
||||||
<string id="NoConfigUrl">Keine Konfigurations-URL in den Anwendungseinstellungen</string>
|
|
||||||
<string id="ApiFlood">API-Aufrufe zu schnell. Bitte verlangsamen Sie Ihre Anfragen.</string>
|
<string id="ApiFlood">API-Aufrufe zu schnell. Bitte verlangsamen Sie Ihre Anfragen.</string>
|
||||||
<string id="ApiUrlNotFound">URL nicht gefunden. Möglicher API-URL-Fehler in den Einstellungen.</string>
|
<string id="ApiUrlNotFound">URL nicht gefunden. Möglicher API-URL-Fehler in den Einstellungen.</string>
|
||||||
<string id="ConfigUrlNotFound">URL nicht gefunden. Möglicher Konfigurations-URL-Fehler in den Einstellungen.</string>
|
<string id="ConfigUrlNotFound">URL nicht gefunden. Möglicher Konfigurations-URL-Fehler in den Einstellungen.</string>
|
||||||
<string id="UnhandledHttpErr">Die HTTP-Anfrage gab folgenden Fehlercode zurück = </string>
|
<string id="NoJson">Von der HTTP-Anfrage wurde kein JSON zurückgegeben.</string>
|
||||||
|
<string id="UnhandledHttpErr">Die HTTP-Anfrage gab folgenden Fehlercode zurück = </string>
|
||||||
<string id="TrailingSlashErr">Die API-URL darf keinen abschließenden Schrägstrich „/“ enthalten.</string>
|
<string id="TrailingSlashErr">Die API-URL darf keinen abschließenden Schrägstrich „/“ enthalten.</string>
|
||||||
<string id="FetchingMenuConfig">Lade Config vom Server ... </string>
|
<string id="Available" scope="glance">Verfügbar</string>
|
||||||
<string id="ExitViewTouch">Zum Beenden nach rechts swipen\nZum Bleiben antippen</string>
|
<string id="Checking" scope="glance">Überprüfung...</string>
|
||||||
<string id="ExitViewButtons">Drücke „Zurück“, um zu Beenden.\n„Enter“, um zu bleiben</string>
|
<string id="Unavailable" scope="glance">Nicht verfügbar</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Unkonfiguriert</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Speisekarte</string>
|
||||||
<!-- Für die Einstellungs-GUI -->
|
<!-- Für die Einstellungs-GUI -->
|
||||||
<string id="SettingsApiKey">API-Schlüssel für HomeAssistant.</string>
|
<string id="SettingsApiKey">API-Schlüssel für HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Langlebiges Zugriffstoken.</string>
|
<string id="SettingsApiKeyPrompt">Langlebiges Zugriffstoken.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Nach dieser Zeit (in Sekunden) wird automatisch ein Bestätigungsdialog für eine Aktion geschlossen und die Aktion abgebrochen. Auf 0 setzen, um das Timeout zu deaktivieren.</string>
|
<string id="SettingsConfirmTimeout">Nach dieser Zeit (in Sekunden) wird automatisch ein Bestätigungsdialog für eine Aktion geschlossen und die Aktion abgebrochen. Auf 0 setzen, um das Timeout zu deaktivieren.</string>
|
||||||
<string id="SettingsUi">Darstellen von Typen mit Symbolen (aus) oder mit Beschriftungen (ein).</string>
|
<string id="SettingsUi">Darstellen von Typen mit Symbolen (aus) oder mit Beschriftungen (ein).</string>
|
||||||
<string id="SettingsTextAlign">Menüausrichtung links (aus) oder rechts (ein).</string>
|
<string id="SettingsTextAlign">Menüausrichtung links (aus) oder rechts (ein).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Nur Widget) Starten Sie die Anwendung automatisch über das Widget, ohne auf einen Tipp warten zu müssen.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Kraan</string>
|
<string id="MenuItemTap">Kraan</string>
|
||||||
<string id="MenuItemMenu">Menu</string>
|
<string id="MenuItemMenu">Menu</string>
|
||||||
<string id="Confirm">Zeker?</string>
|
<string id="Confirm">Zeker?</string>
|
||||||
<string id="NoPhone">Geen telefoonverbinding</string>
|
<string id="NoPhone" scope="glance">Geen telefoonverbinding</string>
|
||||||
<string id="NoInternet">Geen internet verbinding</string>
|
<string id="NoInternet">Geen internet verbinding</string>
|
||||||
<string id="NoResponse">Geen reactie, controleer de internetverbinding</string>
|
<string id="NoResponse">Geen reactie, controleer de internetverbinding</string>
|
||||||
<string id="NoMenu">Fout bij ophalen van menu</string>
|
<string id="NoAPIKey" scope="glance">Geen API-sleutel in de applicatie-instellingen</string>
|
||||||
<string id="NoAPIKey">Geen API-sleutel in de applicatie-instellingen</string>
|
<string id="NoApiUrl" scope="glance">Geen API-URL in de applicatie-instellingen</string>
|
||||||
<string id="NoApiUrl">Geen API-URL in de applicatie-instellingen</string>
|
<string id="NoConfigUrl" scope="glance">Geen configuratie-URL in de applicatie-instellingen</string>
|
||||||
<string id="NoConfigUrl">Geen configuratie-URL in de applicatie-instellingen</string>
|
|
||||||
<string id="ApiFlood">API-aanroepen te snel. Vertraag uw verzoeken.</string>
|
<string id="ApiFlood">API-aanroepen te snel. Vertraag uw verzoeken.</string>
|
||||||
<string id="ApiUrlNotFound">URL niet gevonden. Mogelijke API-URL-fout in instellingen.</string>
|
<string id="ApiUrlNotFound">URL niet gevonden. Mogelijke API-URL-fout in instellingen.</string>
|
||||||
<string id="ConfigUrlNotFound">URL niet gevonden. Mogelijke configuratie-URL-fout in de instellingen.</string>
|
<string id="ConfigUrlNotFound">URL niet gevonden. Mogelijke configuratie-URL-fout in de instellingen.</string>
|
||||||
|
<string id="NoJson">Er is geen JSON geretourneerd door een HTTP-verzoek.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP-verzoek retourneerde foutcode =</string>
|
<string id="UnhandledHttpErr">HTTP-verzoek retourneerde foutcode =</string>
|
||||||
<string id="TrailingSlashErr">API-URL mag geen afsluitende slash '/' bevatten</string>
|
<string id="TrailingSlashErr">API-URL mag geen afsluitende slash '/' bevatten</string>
|
||||||
<string id="FetchingMenuConfig">Menuconfiguratie ophalen..</string>
|
<string id="Available" scope="glance">Beschikbaar</string>
|
||||||
<string id="ExitViewTouch">Veeg naar rechts om af te sluiten\nTik om te blijven</string>
|
<string id="Checking" scope="glance">Controleren...</string>
|
||||||
<string id="ExitViewButtons">Druk op Terug om af te sluiten\nEnter om te blijven</string>
|
<string id="Unavailable" scope="glance">Niet beschikbaar</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Niet geconfigureerd</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menu</string>
|
||||||
<!-- Voor de instellingen-GUI -->
|
<!-- Voor de instellingen-GUI -->
|
||||||
<string id="SettingsApiKey">API-sleutel voor HomeAssistant.</string>
|
<string id="SettingsApiKey">API-sleutel voor HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Toegangstoken met lange levensduur.</string>
|
<string id="SettingsApiKeyPrompt">Toegangstoken met lange levensduur.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Na deze tijd (in seconden) wordt automatisch een bevestigingsvenster voor een actie gesloten en wordt de actie geannuleerd. Stel in op 0 om de time-out uit te schakelen.</string>
|
<string id="SettingsConfirmTimeout">Na deze tijd (in seconden) wordt automatisch een bevestigingsvenster voor een actie gesloten en wordt de actie geannuleerd. Stel in op 0 om de time-out uit te schakelen.</string>
|
||||||
<string id="SettingsUi">Typen weergeven met pictogrammen (uit) of met labels (aan).</string>
|
<string id="SettingsUi">Typen weergeven met pictogrammen (uit) of met labels (aan).</string>
|
||||||
<string id="SettingsTextAlign">Links (uit) of rechts (aan) Menu-uitlijning.</string>
|
<string id="SettingsTextAlign">Links (uit) of rechts (aan) Menu-uitlijning.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Alleen Widget) Start de applicatie automatisch vanuit de widget zonder te wachten op een tik.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Puudutage</string>
|
<string id="MenuItemTap">Puudutage</string>
|
||||||
<string id="MenuItemMenu">Menüü</string>
|
<string id="MenuItemMenu">Menüü</string>
|
||||||
<string id="Confirm">Muidugi?</string>
|
<string id="Confirm">Muidugi?</string>
|
||||||
<string id="NoPhone">Telefoniühendus puudub</string>
|
<string id="NoPhone" scope="glance">Telefoniühendus puudub</string>
|
||||||
<string id="NoInternet">Interneti-ühendus puudub</string>
|
<string id="NoInternet">Interneti-ühendus puudub</string>
|
||||||
<string id="NoResponse">Ei reageeri, kontrollige Interneti-ühendust</string>
|
<string id="NoResponse">Ei reageeri, kontrollige Interneti-ühendust</string>
|
||||||
<string id="NoMenu">Menüü toomise viga</string>
|
<string id="NoAPIKey" scope="glance">Rakenduse seadetes pole API-võtit</string>
|
||||||
<string id="NoAPIKey">Rakenduse seadetes pole API-võtit</string>
|
<string id="NoApiUrl" scope="glance">Rakenduse seadetes pole API URL-i</string>
|
||||||
<string id="NoApiUrl">Rakenduse seadetes pole API URL-i</string>
|
<string id="NoConfigUrl" scope="glance">Rakenduse seadetes pole konfiguratsiooni URL-i</string>
|
||||||
<string id="NoConfigUrl">Rakenduse seadetes pole konfiguratsiooni URL-i</string>
|
<string id="ApiFlood">API-kõned liiga kiired. Palun aeglustage oma taotlusi.</string>
|
||||||
<string id="ApiFlood">API-kõned liiga kiired. Palun aeglustage taotluste esitamist.</string>
|
|
||||||
<string id="ApiUrlNotFound">URL-i ei leitud. Võimalik API URL-i viga seadetes.</string>
|
<string id="ApiUrlNotFound">URL-i ei leitud. Võimalik API URL-i viga seadetes.</string>
|
||||||
<string id="ConfigUrlNotFound">URL-i ei leitud. Võimalik konfiguratsiooni URL-i viga seadetes.</string>
|
<string id="ConfigUrlNotFound">URL-i ei leitud. Võimalik konfiguratsiooni URL-i viga seadetes.</string>
|
||||||
|
<string id="NoJson">HTTP päringust ei tagastatud ühtegi JSON-i.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP päring tagastas veakoodi =</string>
|
<string id="UnhandledHttpErr">HTTP päring tagastas veakoodi =</string>
|
||||||
<string id="TrailingSlashErr">API URL-i lõpus ei tohi olla kaldkriipsu „/”</string>
|
<string id="TrailingSlashErr">API URL-i lõpus ei tohi olla kaldkriipsu „/”</string>
|
||||||
<string id="FetchingMenuConfig">Menüü konfiguratsiooni toomine...</string>
|
<string id="Available" scope="glance">Saadaval</string>
|
||||||
<string id="ExitViewTouch">Väljumiseks pühkige paremale\nPuudutage, et jääda</string>
|
<string id="Checking" scope="glance">Kontrollimine...</string>
|
||||||
<string id="ExitViewButtons">Väljumiseks vajutage Tagasi\nSisestage, et jääda</string>
|
<string id="Unavailable" scope="glance">Pole saadaval</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Konfigureerimata</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menüü</string>
|
||||||
<!-- Seadete GUI jaoks -->
|
<!-- Seadete GUI jaoks -->
|
||||||
<string id="SettingsApiKey">API-võti HomeAssistantile.</string>
|
<string id="SettingsApiKey">API-võti HomeAssistantile.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Pikaealine juurdepääsuluba.</string>
|
<string id="SettingsApiKeyPrompt">Pikaealine juurdepääsuluba.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Pärast seda aega (sekundites) suletakse automaatselt toimingu kinnitusdialoog ja toiming tühistatakse. Ajalõpu keelamiseks määrake väärtusele 0.</string>
|
<string id="SettingsConfirmTimeout">Pärast seda aega (sekundites) suletakse automaatselt toimingu kinnitusdialoog ja toiming tühistatakse. Ajalõpu keelamiseks määrake väärtusele 0.</string>
|
||||||
<string id="SettingsUi">Tüüpide tähistamine ikoonidega (väljas) või siltidega (sees).</string>
|
<string id="SettingsUi">Tüüpide tähistamine ikoonidega (väljas) või siltidega (sees).</string>
|
||||||
<string id="SettingsTextAlign">Vasak (väljas) või parem (sees) menüü joondamine.</string>
|
<string id="SettingsTextAlign">Vasak (väljas) või parem (sees) menüü joondamine.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Ainult vidin) Käivitage rakendus automaatselt vidinast ilma puudutust ootamata.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Napauta</string>
|
<string id="MenuItemTap">Napauta</string>
|
||||||
<string id="MenuItemMenu">Valikko</string>
|
<string id="MenuItemMenu">Valikko</string>
|
||||||
<string id="Confirm">Varma?</string>
|
<string id="Confirm">Varma?</string>
|
||||||
<string id="NoPhone">Ei puhelinyhteyttä</string>
|
<string id="NoPhone" scope="glance">Ei puhelinyhteyttä</string>
|
||||||
<string id="NoInternet">Ei Internet-yhteyttä</string>
|
<string id="NoInternet">Ei Internet-yhteyttä</string>
|
||||||
<string id="NoResponse">Ei vastausta, tarkista Internet-yhteys</string>
|
<string id="NoResponse">Ei vastausta, tarkista Internet-yhteys</string>
|
||||||
<string id="NoMenu">Valikkohakuvirhe</string>
|
<string id="NoAPIKey" scope="glance">Sovellusasetuksissa ei ole API-avainta</string>
|
||||||
<string id="NoAPIKey">Sovellusasetuksissa ei ole API-avainta</string>
|
<string id="NoApiUrl" scope="glance">Sovellusasetuksissa ei ole API URL-osoitetta</string>
|
||||||
<string id="NoApiUrl">Sovellusasetuksissa ei ole API URL-osoitetta</string>
|
<string id="NoConfigUrl" scope="glance">Sovelluksen asetuksissa ei ole konfigurointi-URL-osoitetta</string>
|
||||||
<string id="NoConfigUrl">Sovelluksen asetuksissa ei ole konfigurointi-URL-osoitetta</string>
|
|
||||||
<string id="ApiFlood">API-kutsut liian nopeita. Hidasta pyyntöjäsi.</string>
|
<string id="ApiFlood">API-kutsut liian nopeita. Hidasta pyyntöjäsi.</string>
|
||||||
<string id="ApiUrlNotFound">URL-osoitetta ei löydy. Mahdollinen API URL -virhe asetuksissa.</string>
|
<string id="ApiUrlNotFound">URL-osoitetta ei löydy. Mahdollinen API URL -virhe asetuksissa.</string>
|
||||||
<string id="ConfigUrlNotFound">URL-osoitetta ei löydy. Mahdollinen konfigurointi-URL-virhe asetuksissa.</string>
|
<string id="ConfigUrlNotFound">URL-osoitetta ei löydy. Mahdollinen konfigurointi-URL-virhe asetuksissa.</string>
|
||||||
|
<string id="NoJson">HTTP-pyynnöstä ei palautettu JSON-tiedostoja.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP-pyyntö palautti virhekoodin =</string>
|
<string id="UnhandledHttpErr">HTTP-pyyntö palautti virhekoodin =</string>
|
||||||
<string id="TrailingSlashErr">API-URL-osoitteessa ei saa olla perässä olevaa kauttaviivaa '/'</string>
|
<string id="TrailingSlashErr">API-URL-osoitteessa ei saa olla perässä olevaa kauttaviivaa '/'</string>
|
||||||
<string id="FetchingMenuConfig">Haetaan valikon asetuksia...</string>
|
<string id="Available" scope="glance">Saatavilla</string>
|
||||||
<string id="ExitViewTouch">Poistu pyyhkäisemällä oikealle\nPysy napauttamalla</string>
|
<string id="Checking" scope="glance">Tarkistetaan...</string>
|
||||||
<string id="ExitViewButtons">Poistu painamalla Takaisin\nSyötä jäädäksesi</string>
|
<string id="Unavailable" scope="glance">Ei saatavilla</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Määrittämätön</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Valikko</string>
|
||||||
<!-- GUI-asetusten osalta -->
|
<!-- GUI-asetusten osalta -->
|
||||||
<string id="SettingsApiKey">API-avain HomeAssistantille.</string>
|
<string id="SettingsApiKey">API-avain HomeAssistantille.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Pitkäikäinen pääsytunnus.</string>
|
<string id="SettingsApiKeyPrompt">Pitkäikäinen pääsytunnus.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Tämän ajan kuluttua (sekunneissa) toiminnon vahvistusikkuna suljetaan automaattisesti ja toiminto peruutetaan. Aseta arvoksi 0 poistaaksesi aikakatkaisun käytöstä.</string>
|
<string id="SettingsConfirmTimeout">Tämän ajan kuluttua (sekunneissa) toiminnon vahvistusikkuna suljetaan automaattisesti ja toiminto peruutetaan. Aseta arvoksi 0 poistaaksesi aikakatkaisun käytöstä.</string>
|
||||||
<string id="SettingsUi">Esittää tyyppejä kuvakkeilla (pois päältä) tai tarroilla (päällä).</string>
|
<string id="SettingsUi">Esittää tyyppejä kuvakkeilla (pois päältä) tai tarroilla (päällä).</string>
|
||||||
<string id="SettingsTextAlign">Vasen (pois) tai oikea (päällä) valikon kohdistus.</string>
|
<string id="SettingsTextAlign">Vasen (pois) tai oikea (päällä) valikon kohdistus.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Vain widget) Käynnistä sovellus automaattisesti widgetistä odottamatta napautusta.</string>
|
||||||
</strings>
|
</strings>
|
@@ -20,26 +20,28 @@
|
|||||||
|
|
||||||
<strings>
|
<strings>
|
||||||
<string id="AppName" scope="glance">HomeAssistant</string>
|
<string id="AppName" scope="glance">HomeAssistant</string>
|
||||||
<string id="MenuItemOn">Activé</string>
|
<string id="MenuItemOn">Activé</string>
|
||||||
<string id="MenuItemOff">Désactivé</string>
|
<string id="MenuItemOff">Désactivé</string>
|
||||||
<string id="MenuItemTap">Clic</string>
|
<string id="MenuItemTap">Clic</string>
|
||||||
<string id="MenuItemMenu">Menu</string>
|
<string id="MenuItemMenu">Menu</string>
|
||||||
<string id="Confirm">Bien sûr?</string>
|
<string id="Confirm">Bien sûr?</string>
|
||||||
<string id="NoPhone">Pas de connexion téléphonique</string>
|
<string id="NoPhone" scope="glance">Pas de connexion téléphonique</string>
|
||||||
<string id="NoInternet">Pas de connexion Internet</string>
|
<string id="NoInternet">Pas de connexion Internet</string>
|
||||||
<string id="NoResponse">Pas de réponse, vérifiez la connexion Internet</string>
|
<string id="NoResponse">Pas de réponse, vérifiez la connexion Internet</string>
|
||||||
<string id="NoMenu">Erreur de récupération du menu</string>
|
<string id="NoAPIKey" scope="glance">Pas de clé API dans les paramètres de l'application</string>
|
||||||
<string id="NoAPIKey">Pas de clé API dans les paramètres de l'application</string>
|
<string id="NoApiUrl" scope="glance">Aucune URL API dans les paramètres de l'application</string>
|
||||||
<string id="NoApiUrl">Aucune URL API dans les paramètres de l'application</string>
|
<string id="NoConfigUrl" scope="glance">Aucune URL de configuration dans les paramètres de l'application</string>
|
||||||
<string id="NoConfigUrl">Aucune URL de configuration dans les paramètres de l'application</string>
|
<string id="ApiFlood">Appels API trop rapide. Veuillez signaler cette erreur avec les détails de l'appareil.</string>
|
||||||
<string id="ApiFlood">Appels API trop rapide. Veuillez signaler cette erreur avec les détails de l'appareil.</string>
|
|
||||||
<string id="ApiUrlNotFound">URL introuvable. Erreur potentielle d'URL d'API dans les paramètres.</string>
|
<string id="ApiUrlNotFound">URL introuvable. Erreur potentielle d'URL d'API dans les paramètres.</string>
|
||||||
<string id="ConfigUrlNotFound">URL introuvable. Erreur potentielle d'URL de configuration dans les paramètres.</string>
|
<string id="ConfigUrlNotFound">URL introuvable. Erreur potentielle d'URL de configuration dans les paramètres.</string>
|
||||||
|
<string id="NoJson">Aucun JSON renvoyé par la requête HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">La requête HTTP a renvoyé un code d'erreur =</string>
|
<string id="UnhandledHttpErr">La requête HTTP a renvoyé un code d'erreur =</string>
|
||||||
<string id="TrailingSlashErr">L'URL de l'API ne doit pas comporter de barre oblique finale '/'</string>
|
<string id="TrailingSlashErr">L'URL de l'API ne doit pas comporter de barre oblique finale '/'</string>
|
||||||
<string id="FetchingMenuConfig">Récupération de la configuration du menu.</string>
|
<string id="Available" scope="glance">Disponible</string>
|
||||||
<string id="ExitViewTouch">Balayez vers la droite pour quitter\nAppuyez pour rester</string>
|
<string id="Checking" scope="glance">Vérification...</string>
|
||||||
<string id="ExitViewButtons">Appuyez sur Retour pour quitter\nEntrez pour rester</string>
|
<string id="Unavailable" scope="glance">Indisponible</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Non configuré</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menu</string>
|
||||||
<!-- Pour l'interface graphique des paramètres -->
|
<!-- Pour l'interface graphique des paramètres -->
|
||||||
<string id="SettingsApiKey">Clé API pour HomeAssistant.</string>
|
<string id="SettingsApiKey">Clé API pour HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Jeton d'accès de longue durée.</string>
|
<string id="SettingsApiKeyPrompt">Jeton d'accès de longue durée.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Passé ce délai (en secondes), une boîte de dialogue de confirmation d'une action se ferme automatiquement et l'action est annulée. Réglez sur 0 pour désactiver le délai d'attente.</string>
|
<string id="SettingsConfirmTimeout">Passé ce délai (en secondes), une boîte de dialogue de confirmation d'une action se ferme automatiquement et l'action est annulée. Réglez sur 0 pour désactiver le délai d'attente.</string>
|
||||||
<string id="SettingsUi">Représentation des types avec des icônes (off) ou avec des étiquettes (on).</string>
|
<string id="SettingsUi">Représentation des types avec des icônes (off) ou avec des étiquettes (on).</string>
|
||||||
<string id="SettingsTextAlign">Alignement du menu à gauche (désactivé) ou à droite (activé).</string>
|
<string id="SettingsTextAlign">Alignement du menu à gauche (désactivé) ou à droite (activé).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Widget uniquement) Démarrez automatiquement l'application à partir du widget sans attendre un clic.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Παρακέντηση</string>
|
<string id="MenuItemTap">Παρακέντηση</string>
|
||||||
<string id="MenuItemMenu">Μενού</string>
|
<string id="MenuItemMenu">Μενού</string>
|
||||||
<string id="Confirm">Σίγουρος?</string>
|
<string id="Confirm">Σίγουρος?</string>
|
||||||
<string id="NoPhone">Δεν υπάρχει σύνδεση τηλεφώνου</string>
|
<string id="NoPhone" scope="glance">Δεν υπάρχει σύνδεση τηλεφώνου</string>
|
||||||
<string id="NoInternet">Δεν υπάρχει σύνδεση στο διαδίκτυο</string>
|
<string id="NoInternet">Δεν υπάρχει σύνδεση στο διαδίκτυο</string>
|
||||||
<string id="NoResponse">Καμία απάντηση, ελέγξτε τη σύνδεση στο Διαδίκτυο</string>
|
<string id="NoResponse">Καμία απάντηση, ελέγξτε τη σύνδεση στο Διαδίκτυο</string>
|
||||||
<string id="NoMenu">Σφάλμα ανάκτησης μενού</string>
|
<string id="NoAPIKey" scope="glance">Δεν υπάρχει κλειδί API στις ρυθμίσεις της εφαρμογής</string>
|
||||||
<string id="NoAPIKey">Δεν υπάρχει κλειδί API στις ρυθμίσεις της εφαρμογής</string>
|
<string id="NoApiUrl" scope="glance">Δεν υπάρχει URL API στις ρυθμίσεις της εφαρμογής</string>
|
||||||
<string id="NoApiUrl">Δεν υπάρχει URL API στις ρυθμίσεις της εφαρμογής</string>
|
<string id="NoConfigUrl" scope="glance">Δεν υπάρχει διεύθυνση URL διαμόρφωσης στις ρυθμίσεις της εφαρμογής</string>
|
||||||
<string id="NoConfigUrl">Δεν υπάρχει διεύθυνση URL διαμόρφωσης στις ρυθμίσεις της εφαρμογής</string>
|
|
||||||
<string id="ApiFlood">Κλήσεις API πολύ γρήγορες. Παρακαλώ επιβραδύνετε τα αιτήματά σας.</string>
|
<string id="ApiFlood">Κλήσεις API πολύ γρήγορες. Παρακαλώ επιβραδύνετε τα αιτήματά σας.</string>
|
||||||
<string id="ApiUrlNotFound">Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα διεύθυνσης URL API στις ρυθμίσεις.</string>
|
<string id="ApiUrlNotFound">Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα διεύθυνσης URL API στις ρυθμίσεις.</string>
|
||||||
<string id="ConfigUrlNotFound">Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα διεύθυνσης URL διαμόρφωσης στις ρυθμίσεις.</string>
|
<string id="ConfigUrlNotFound">Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα διεύθυνσης URL διαμόρφωσης στις ρυθμίσεις.</string>
|
||||||
|
<string id="NoJson">Δεν επιστράφηκε JSON από αίτημα HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">Το αίτημα HTTP επέστρεψε κωδικό σφάλματος =</string>
|
<string id="UnhandledHttpErr">Το αίτημα HTTP επέστρεψε κωδικό σφάλματος =</string>
|
||||||
<string id="TrailingSlashErr">Η διεύθυνση URL του API δεν πρέπει να έχει τελική κάθετο "/"</string>
|
<string id="TrailingSlashErr">Η διεύθυνση URL του API δεν πρέπει να έχει τελική κάθετο "/"</string>
|
||||||
<string id="FetchingMenuConfig">Ανάκτηση παραμέτρων μενού..</string>
|
<string id="Available" scope="glance">Διαθέσιμος</string>
|
||||||
<string id="ExitViewTouch">Σύρετε προς τα δεξιά για έξοδο\nΠατήστε για να μείνετε</string>
|
<string id="Checking" scope="glance">Ελεγχος...</string>
|
||||||
<string id="ExitViewButtons">Πατήστε Επιστροφή για Έξοδος\nEnter για να μείνετε</string>
|
<string id="Unavailable" scope="glance">Μη διαθέσιμο</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Μη διαμορφωμένο</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Μενού</string>
|
||||||
<!-- Για τις ρυθμίσεις GUI -->
|
<!-- Για τις ρυθμίσεις GUI -->
|
||||||
<string id="SettingsApiKey">Κλειδί API για το HomeAssistant.</string>
|
<string id="SettingsApiKey">Κλειδί API για το HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Διακριτικό πρόσβασης μακράς διαρκείας.</string>
|
<string id="SettingsApiKeyPrompt">Διακριτικό πρόσβασης μακράς διαρκείας.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Μετά από αυτό το χρονικό διάστημα (σε δευτερόλεπτα), ένα παράθυρο διαλόγου επιβεβαίωσης για μια ενέργεια κλείνει αυτόματα και η ενέργεια ακυρώνεται. Ορίστε στο 0 για να απενεργοποιήσετε το χρονικό όριο.</string>
|
<string id="SettingsConfirmTimeout">Μετά από αυτό το χρονικό διάστημα (σε δευτερόλεπτα), ένα παράθυρο διαλόγου επιβεβαίωσης για μια ενέργεια κλείνει αυτόματα και η ενέργεια ακυρώνεται. Ορίστε στο 0 για να απενεργοποιήσετε το χρονικό όριο.</string>
|
||||||
<string id="SettingsUi">Αναπαράσταση τύπων με εικονίδια (απενεργοποίηση) ή με ετικέτες (ενεργό).</string>
|
<string id="SettingsUi">Αναπαράσταση τύπων με εικονίδια (απενεργοποίηση) ή με ετικέτες (ενεργό).</string>
|
||||||
<string id="SettingsTextAlign">Αριστερά (απενεργοποίηση) ή Δεξιά (ενεργό) Ευθυγράμμιση μενού.</string>
|
<string id="SettingsTextAlign">Αριστερά (απενεργοποίηση) ή Δεξιά (ενεργό) Ευθυγράμμιση μενού.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Μόνο widget) Αυτόματη εκκίνηση της εφαρμογής από το widget χωρίς να περιμένετε ένα πάτημα.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">בֶּרֶז</string>
|
<string id="MenuItemTap">בֶּרֶז</string>
|
||||||
<string id="MenuItemMenu">תַפרִיט</string>
|
<string id="MenuItemMenu">תַפרִיט</string>
|
||||||
<string id="Confirm">בטוח?</string>
|
<string id="Confirm">בטוח?</string>
|
||||||
<string id="NoPhone">אין חיבור לטלפון</string>
|
<string id="NoPhone" scope="glance">אין חיבור לטלפון</string>
|
||||||
<string id="NoInternet">אין חיבור אינטרנט</string>
|
<string id="NoInternet">אין חיבור אינטרנט</string>
|
||||||
<string id="NoResponse">אין תגובה, בדוק חיבור לאינטרנט</string>
|
<string id="NoResponse">אין תגובה, בדוק חיבור לאינטרנט</string>
|
||||||
<string id="NoMenu">שגיאת אחזור תפריט</string>
|
<string id="NoAPIKey" scope="glance">אין מפתח API בהגדרות האפליקציה</string>
|
||||||
<string id="NoAPIKey">אין מפתח API בהגדרות האפליקציה</string>
|
<string id="NoApiUrl" scope="glance">אין כתובת API בהגדרות האפליקציה</string>
|
||||||
<string id="NoApiUrl">אין כתובת API בהגדרות האפליקציה</string>
|
<string id="NoConfigUrl" scope="glance">אין כתובת אתר תצורה בהגדרות האפליקציה</string>
|
||||||
<string id="NoConfigUrl">אין כתובת אתר תצורה בהגדרות האפליקציה</string>
|
|
||||||
<string id="ApiFlood">קריאות API מהירות מדי. נא להאט את הבקשות שלך.</string>
|
<string id="ApiFlood">קריאות API מהירות מדי. נא להאט את הבקשות שלך.</string>
|
||||||
<string id="ApiUrlNotFound">כתובת האתר לא נמצאה. שגיאה פוטנציאלית של כתובת ה-API בהגדרות.</string>
|
<string id="ApiUrlNotFound">כתובת האתר לא נמצאה. שגיאה פוטנציאלית של כתובת ה-API בהגדרות.</string>
|
||||||
<string id="ConfigUrlNotFound">כתובת האתר לא נמצאה. שגיאת כתובת אתר פוטנציאלית של תצורה בהגדרות.</string>
|
<string id="ConfigUrlNotFound">כתובת האתר לא נמצאה. שגיאת כתובת אתר פוטנציאלית של תצורה בהגדרות.</string>
|
||||||
|
<string id="NoJson">לא הוחזר JSON מבקשת HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">בקשת HTTP החזירה קוד שגיאה =</string>
|
<string id="UnhandledHttpErr">בקשת HTTP החזירה קוד שגיאה =</string>
|
||||||
<string id="TrailingSlashErr">כתובת ה-API לא חייבת לכלול לוכסן אחורי '/'</string>
|
<string id="TrailingSlashErr">כתובת ה-API לא חייבת לכלול לוכסן אחורי '/'</string>
|
||||||
<string id="FetchingMenuConfig">מביא את תצורת התפריט...</string>
|
<string id="Available" scope="glance">זמין</string>
|
||||||
<string id="ExitViewTouch">החלק ימינה כדי לצאת\nהקש כדי להישאר</string>
|
<string id="Checking" scope="glance">בודק...</string>
|
||||||
<string id="ExitViewButtons">לחץ על חזרה ליציאה\nEnter כדי להישאר</string>
|
<string id="Unavailable" scope="glance">אינו זמין</string>
|
||||||
|
<string id="Unconfigured" scope="glance">לא מוגדר</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">תַפרִיט</string>
|
||||||
<!-- עבור ה-GUI של ההגדרות -->
|
<!-- עבור ה-GUI של ההגדרות -->
|
||||||
<string id="SettingsApiKey">מפתח API עבור HomeAssistant.</string>
|
<string id="SettingsApiKey">מפתח API עבור HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">אסימון גישה ארוך-חיים.</string>
|
<string id="SettingsApiKeyPrompt">אסימון גישה ארוך-חיים.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">לאחר זמן זה (בשניות), תיבת דו-שיח לאישור פעולה נסגרת אוטומטית והפעולה מבוטלת. הגדר ל-0 כדי לבטל את הזמן הקצוב.</string>
|
<string id="SettingsConfirmTimeout">לאחר זמן זה (בשניות), תיבת דו-שיח לאישור פעולה נסגרת אוטומטית והפעולה מבוטלת. הגדר ל-0 כדי לבטל את הזמן הקצוב.</string>
|
||||||
<string id="SettingsUi">ייצוג סוגים עם סמלים (כבוי) או עם תוויות (מופעל).</string>
|
<string id="SettingsUi">ייצוג סוגים עם סמלים (כבוי) או עם תוויות (מופעל).</string>
|
||||||
<string id="SettingsTextAlign">יישור תפריט שמאלה (כבוי) או ימינה (מופעל).</string>
|
<string id="SettingsTextAlign">יישור תפריט שמאלה (כבוי) או ימינה (מופעל).</string>
|
||||||
|
<string id="SettingsWidgetStart">(יישומון בלבד) הפעל אוטומטית את האפליקציה מהווידג'ט מבלי לחכות להקשה.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Dodirnite</string>
|
<string id="MenuItemTap">Dodirnite</string>
|
||||||
<string id="MenuItemMenu">Jelovnik</string>
|
<string id="MenuItemMenu">Jelovnik</string>
|
||||||
<string id="Confirm">Naravno?</string>
|
<string id="Confirm">Naravno?</string>
|
||||||
<string id="NoPhone">Nema telefonske veze</string>
|
<string id="NoPhone" scope="glance">Nema telefonske veze</string>
|
||||||
<string id="NoInternet">Nema internetske veze</string>
|
<string id="NoInternet">Nema internetske veze</string>
|
||||||
<string id="NoResponse">Nema odgovora, provjerite internetsku vezu</string>
|
<string id="NoResponse">Nema odgovora, provjerite internetsku vezu</string>
|
||||||
<string id="NoMenu">Pogreška dohvaćanja izbornika</string>
|
<string id="NoAPIKey" scope="glance">Nema API ključa u postavkama aplikacije</string>
|
||||||
<string id="NoAPIKey">Nema API ključa u postavkama aplikacije</string>
|
<string id="NoApiUrl" scope="glance">Nema API URL-a u postavkama aplikacije</string>
|
||||||
<string id="NoApiUrl">Nema API URL-a u postavkama aplikacije</string>
|
<string id="NoConfigUrl" scope="glance">Nema konfiguracijskog URL-a u postavkama aplikacije</string>
|
||||||
<string id="NoConfigUrl">Nema konfiguracijskog URL-a u postavkama aplikacije</string>
|
|
||||||
<string id="ApiFlood">API pozivi su prebrzi. Molimo usporite svoje zahtjeve.</string>
|
<string id="ApiFlood">API pozivi su prebrzi. Molimo usporite svoje zahtjeve.</string>
|
||||||
<string id="ApiUrlNotFound">URL nije pronađen. Potencijalna pogreška API URL-a u postavkama.</string>
|
<string id="ApiUrlNotFound">URL nije pronađen. Potencijalna pogreška API URL-a u postavkama.</string>
|
||||||
<string id="ConfigUrlNotFound">URL nije pronađen. Potencijalna pogreška URL-a konfiguracije u postavkama.</string>
|
<string id="ConfigUrlNotFound">URL nije pronađen. Potencijalna pogreška URL-a konfiguracije u postavkama.</string>
|
||||||
|
<string id="NoJson">HTTP zahtjev nije vratio JSON.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP zahtjev vratio je kod greške =</string>
|
<string id="UnhandledHttpErr">HTTP zahtjev vratio je kod greške =</string>
|
||||||
<string id="TrailingSlashErr">API URL ne smije imati kosu crtu na kraju '/'</string>
|
<string id="TrailingSlashErr">API URL ne smije imati kosu crtu na kraju '/'</string>
|
||||||
<string id="FetchingMenuConfig">Dohvaćanje konfiguracije izbornika..</string>
|
<string id="Available" scope="glance">Dostupno</string>
|
||||||
<string id="ExitViewTouch">Prijeđite prstom udesno za izlaz\nDodirnite za ostanak</string>
|
<string id="Checking" scope="glance">Provjera...</string>
|
||||||
<string id="ExitViewButtons">Pritisnite Natrag za izlaz\nUnesite za ostanak</string>
|
<string id="Unavailable" scope="glance">Nedostupan</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Nekonfigurirano</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Jelovnik</string>
|
||||||
<!-- Za GUI postavki -->
|
<!-- Za GUI postavki -->
|
||||||
<string id="SettingsApiKey">API ključ za HomeAssistant.</string>
|
<string id="SettingsApiKey">API ključ za HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Dugotrajni pristupni token.</string>
|
<string id="SettingsApiKeyPrompt">Dugotrajni pristupni token.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Nakon tog vremena (u sekundama), dijaloški okvir za potvrdu radnje automatski se zatvara i radnja se poništava. Postavite na 0 da onemogućite vremensko ograničenje.</string>
|
<string id="SettingsConfirmTimeout">Nakon tog vremena (u sekundama), dijaloški okvir za potvrdu radnje automatski se zatvara i radnja se poništava. Postavite na 0 da onemogućite vremensko ograničenje.</string>
|
||||||
<string id="SettingsUi">Predstavljanje tipova ikonama (isključeno) ili oznakama (uključeno).</string>
|
<string id="SettingsUi">Predstavljanje tipova ikonama (isključeno) ili oznakama (uključeno).</string>
|
||||||
<string id="SettingsTextAlign">Lijevo (isključeno) ili desno (uključeno) poravnanje izbornika.</string>
|
<string id="SettingsTextAlign">Lijevo (isključeno) ili desno (uključeno) poravnanje izbornika.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Samo widget) Automatski pokrenite aplikaciju iz widgeta bez čekanja na dodir.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Koppintson a</string>
|
<string id="MenuItemTap">Koppintson a</string>
|
||||||
<string id="MenuItemMenu">Menü</string>
|
<string id="MenuItemMenu">Menü</string>
|
||||||
<string id="Confirm">Biztos?</string>
|
<string id="Confirm">Biztos?</string>
|
||||||
<string id="NoPhone">Nincs telefonkapcsolat</string>
|
<string id="NoPhone" scope="glance">Nincs telefonkapcsolat</string>
|
||||||
<string id="NoInternet">Nincs internetkapcsolat</string>
|
<string id="NoInternet">Nincs internetkapcsolat</string>
|
||||||
<string id="NoResponse">Nincs válasz, ellenőrizze az internetkapcsolatot</string>
|
<string id="NoResponse">Nincs válasz, ellenőrizze az internetkapcsolatot</string>
|
||||||
<string id="NoMenu">Menü Lekérési hiba</string>
|
<string id="NoAPIKey" scope="glance">Nincs API kulcs az alkalmazás beállításaiban</string>
|
||||||
<string id="NoAPIKey">Nincs API kulcs az alkalmazás beállításaiban</string>
|
<string id="NoApiUrl" scope="glance">Nincs API URL az alkalmazás beállításai között</string>
|
||||||
<string id="NoApiUrl">Nincs API URL az alkalmazás beállításai között</string>
|
<string id="NoConfigUrl" scope="glance">Nincs konfigurációs URL az alkalmazás beállításai között</string>
|
||||||
<string id="NoConfigUrl">Nincs konfigurációs URL az alkalmazás beállításai között</string>
|
|
||||||
<string id="ApiFlood">Az API-hívások túl gyorsak. Kérjük, lassítsa a kérések teljesítését.</string>
|
<string id="ApiFlood">Az API-hívások túl gyorsak. Kérjük, lassítsa a kérések teljesítését.</string>
|
||||||
<string id="ApiUrlNotFound">Az URL nem található. Lehetséges API URL hiba a beállításokban.</string>
|
<string id="ApiUrlNotFound">Az URL nem található. Lehetséges API URL hiba a beállításokban.</string>
|
||||||
<string id="ConfigUrlNotFound">Az URL nem található. Lehetséges konfigurációs URL hiba a beállításokban.</string>
|
<string id="ConfigUrlNotFound">Az URL nem található. Lehetséges konfigurációs URL hiba a beállításokban.</string>
|
||||||
|
<string id="NoJson">A HTTP-kérésből nem érkezett vissza JSON.</string>
|
||||||
<string id="UnhandledHttpErr">A HTTP-kérés = hibakódot adott vissza</string>
|
<string id="UnhandledHttpErr">A HTTP-kérés = hibakódot adott vissza</string>
|
||||||
<string id="TrailingSlashErr">Az API URL-ben nem lehet perjel a „/”</string>
|
<string id="TrailingSlashErr">Az API URL-ben nem lehet perjel a „/”</string>
|
||||||
<string id="FetchingMenuConfig">Menükonfiguráció lekérése...</string>
|
<string id="Available" scope="glance">Elérhető</string>
|
||||||
<string id="ExitViewTouch">Csúsztassa jobbra a kilépéshez\nKoppintson a Maradáshoz</string>
|
<string id="Checking" scope="glance">Ellenőrzés...</string>
|
||||||
<string id="ExitViewButtons">Nyomja meg a Vissza gombot a kilépéshez\nEnter a Maradáshoz</string>
|
<string id="Unavailable" scope="glance">Nem érhető el</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Nincs konfigurálva</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menü</string>
|
||||||
<!-- A beállítások GUI-hoz -->
|
<!-- A beállítások GUI-hoz -->
|
||||||
<string id="SettingsApiKey">API-kulcs a HomeAssistant számára.</string>
|
<string id="SettingsApiKey">API-kulcs a HomeAssistant számára.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Hosszú életű hozzáférési token.</string>
|
<string id="SettingsApiKeyPrompt">Hosszú életű hozzáférési token.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Ezen idő letelte után (másodpercben) a művelet megerősítő párbeszédablakja automatikusan bezárul, és a művelet megszakad. Állítsa 0-ra az időtúllépés letiltásához.</string>
|
<string id="SettingsConfirmTimeout">Ezen idő letelte után (másodpercben) a művelet megerősítő párbeszédablakja automatikusan bezárul, és a művelet megszakad. Állítsa 0-ra az időtúllépés letiltásához.</string>
|
||||||
<string id="SettingsUi">A típusokat ikonokkal (kikapcsolva) vagy címkékkel (bekapcsolva) ábrázolja.</string>
|
<string id="SettingsUi">A típusokat ikonokkal (kikapcsolva) vagy címkékkel (bekapcsolva) ábrázolja.</string>
|
||||||
<string id="SettingsTextAlign">Balra (ki) vagy Jobbra (be) Menüigazítás.</string>
|
<string id="SettingsTextAlign">Balra (ki) vagy Jobbra (be) Menüigazítás.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Csak widget) Az alkalmazás automatikus indítása a widgetről anélkül, hogy egy érintésre várna.</string>
|
||||||
</strings>
|
</strings>
|
@@ -1 +1,7 @@
|
|||||||
<svg height="18" viewBox="0 -960 960 960" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="18" viewBox="0 0 200 500" width="18" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="21" viewBox="0 -960 960 960" width="21" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="21" viewBox="0 0 200 500" width="21" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="24" viewBox="0 -960 960 960" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="24" viewBox="0 0 200 500" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="26" viewBox="0 -960 960 960" width="26" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="26" viewBox="0 0 200 500" width="26" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="28" viewBox="0 -960 960 960" width="28" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="28" viewBox="0 0 200 500" width="28" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="30" viewBox="0 -960 960 960" width="30" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="30" viewBox="0 0 200 500" width="30" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="32" viewBox="0 -960 960 960" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="32" viewBox="0 0 200 500" width="32" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="38" viewBox="0 -960 960 960" width="38" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="38" viewBox="0 0 200 500" width="38" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="42" viewBox="0 -960 960 960" width="42" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="42" viewBox="0 0 200 500" width="42" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="46" viewBox="0 -960 960 960" width="46" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="46" viewBox="0 0 200 500" width="46" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -1 +1,8 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" height="48" viewBox="0 -960 960 960" width="48"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<svg viewBox="0 0 200 500" width="48" height="48" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect x="0" y="0" width="200" height="100" fill="blue" rx="40" ry="40"/>
|
||||||
|
<rect x="0" y="200" width="200" height="100" fill="blue" rx="40" ry="40"/>
|
||||||
|
<rect x="0" y="400" width="200" height="100" fill="blue" rx="40" ry="40"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 606 B After Width: | Height: | Size: 419 B |
@@ -1 +1,7 @@
|
|||||||
<svg height="53" viewBox="0 -960 960 960" width="53" xmlns="http://www.w3.org/2000/svg"><path d="M479.858-160Q460-160 446-174.142q-14-14.141-14-34Q432-228 446.142-242q14.141-14 34-14Q500-256 514-241.858q14 14.141 14 34Q528-188 513.858-174q-14.141 14-34 14Zm0-272Q460-432 446-446.142q-14-14.141-14-34Q432-500 446.142-514q14.141-14 34-14Q500-528 514-513.858q14 14.141 14 34Q528-460 513.858-446q-14.141 14-34 14Zm0-272Q460-704 446-718.142q-14-14.141-14-34Q432-772 446.142-786q14.141-14 34-14Q500-800 514-785.858q14 14.141 14 34Q528-732 513.858-718q-14.141 14-34 14Z" fill="darkgrey" stroke="darkgrey"/></svg>
|
<svg height="53" viewBox="0 0 200 500" width="53" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, 1, 0, 0)">
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
|
||||||
|
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 361 B |
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Mengetuk</string>
|
<string id="MenuItemTap">Mengetuk</string>
|
||||||
<string id="MenuItemMenu">Menu</string>
|
<string id="MenuItemMenu">Menu</string>
|
||||||
<string id="Confirm">Tentu?</string>
|
<string id="Confirm">Tentu?</string>
|
||||||
<string id="NoPhone">Tidak ada koneksi Telepon</string>
|
<string id="NoPhone" scope="glance">Tidak ada koneksi Telepon</string>
|
||||||
<string id="NoInternet">Tidak ada koneksi internet</string>
|
<string id="NoInternet">Tidak ada koneksi internet</string>
|
||||||
<string id="NoResponse">Tidak Ada Respon, periksa koneksi Internet</string>
|
<string id="NoResponse">Tidak Ada Respon, periksa koneksi Internet</string>
|
||||||
<string id="NoMenu">Kesalahan Pengambilan Menu</string>
|
<string id="NoAPIKey" scope="glance">Tidak ada kunci API di pengaturan aplikasi</string>
|
||||||
<string id="NoAPIKey">Tidak ada kunci API di pengaturan aplikasi</string>
|
<string id="NoApiUrl" scope="glance">Tidak ada URL API di pengaturan aplikasi</string>
|
||||||
<string id="NoApiUrl">Tidak ada URL API di pengaturan aplikasi</string>
|
<string id="NoConfigUrl" scope="glance">Tidak ada URL konfigurasi di pengaturan aplikasi</string>
|
||||||
<string id="NoConfigUrl">Tidak ada URL konfigurasi dalam pengaturan aplikasi</string>
|
|
||||||
<string id="ApiFlood">Panggilan API terlalu cepat. Harap memperlambat permintaan Anda.</string>
|
<string id="ApiFlood">Panggilan API terlalu cepat. Harap memperlambat permintaan Anda.</string>
|
||||||
<string id="ApiUrlNotFound">URL tidak ditemukan. Potensi kesalahan URL API dalam pengaturan.</string>
|
<string id="ApiUrlNotFound">URL tidak ditemukan. Potensi kesalahan URL API dalam pengaturan.</string>
|
||||||
<string id="ConfigUrlNotFound">URL tidak ditemukan. Potensi kesalahan URL Konfigurasi dalam pengaturan.</string>
|
<string id="ConfigUrlNotFound">URL tidak ditemukan. Potensi kesalahan URL Konfigurasi dalam pengaturan.</string>
|
||||||
|
<string id="NoJson">Tidak ada JSON yang dikembalikan dari permintaan HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">Permintaan HTTP mengembalikan kode kesalahan =</string>
|
<string id="UnhandledHttpErr">Permintaan HTTP mengembalikan kode kesalahan =</string>
|
||||||
<string id="TrailingSlashErr">URL API tidak boleh memiliki garis miring '/'</string>
|
<string id="TrailingSlashErr">URL API tidak boleh memiliki garis miring '/'</string>
|
||||||
<string id="FetchingMenuConfig">Mengambil Konfigurasi Menu..</string>
|
<string id="Available" scope="glance">Tersedia</string>
|
||||||
<string id="ExitViewTouch">Geser ke Kanan untuk Keluar\nKetuk untuk Tetap</string>
|
<string id="Checking" scope="glance">Memeriksa...</string>
|
||||||
<string id="ExitViewButtons">Tekan Kembali untuk Keluar\nMasuk untuk Tetap</string>
|
<string id="Unavailable" scope="glance">Tidak tersedia</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Tidak dikonfigurasi</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menu</string>
|
||||||
<!-- Untuk pengaturan GUI -->
|
<!-- Untuk pengaturan GUI -->
|
||||||
<string id="SettingsApiKey">Kunci API untuk HomeAssistant.</string>
|
<string id="SettingsApiKey">Kunci API untuk HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Token Akses Berumur Panjang.</string>
|
<string id="SettingsApiKeyPrompt">Token Akses Berumur Panjang.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Setelah waktu ini (dalam detik), dialog konfirmasi untuk suatu tindakan secara otomatis ditutup dan tindakan tersebut dibatalkan. Setel ke 0 untuk menonaktifkan batas waktu.</string>
|
<string id="SettingsConfirmTimeout">Setelah waktu ini (dalam detik), dialog konfirmasi untuk suatu tindakan secara otomatis ditutup dan tindakan tersebut dibatalkan. Setel ke 0 untuk menonaktifkan batas waktu.</string>
|
||||||
<string id="SettingsUi">Mewakili tipe dengan ikon (mati) atau dengan label (aktif).</string>
|
<string id="SettingsUi">Mewakili tipe dengan ikon (mati) atau dengan label (aktif).</string>
|
||||||
<string id="SettingsTextAlign">Penyelarasan Menu Kiri (mati) atau Kanan (hidup).</string>
|
<string id="SettingsTextAlign">Penyelarasan Menu Kiri (mati) atau Kanan (hidup).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Khusus widget) Secara otomatis memulai aplikasi dari widget tanpa menunggu ketukan.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Rubinetto</string>
|
<string id="MenuItemTap">Rubinetto</string>
|
||||||
<string id="MenuItemMenu">Menù</string>
|
<string id="MenuItemMenu">Menù</string>
|
||||||
<string id="Confirm">Sicuro?</string>
|
<string id="Confirm">Sicuro?</string>
|
||||||
<string id="NoPhone">Nessuna connessione telefonica</string>
|
<string id="NoPhone" scope="glance">Nessuna connessione telefonica</string>
|
||||||
<string id="NoInternet">Nessuna connessione internet</string>
|
<string id="NoInternet">Nessuna connessione internet</string>
|
||||||
<string id="NoResponse">Nessuna risposta, controlla la connessione Internet</string>
|
<string id="NoResponse">Nessuna risposta, controlla la connessione Internet</string>
|
||||||
<string id="NoMenu">Errore di recupero del menu</string>
|
<string id="NoAPIKey" scope="glance">Nessuna chiave API nelle impostazioni dell'applicazione</string>
|
||||||
<string id="NoAPIKey">Nessuna chiave API nelle impostazioni dell'applicazione</string>
|
<string id="NoApiUrl" scope="glance">Nessun URL API nelle impostazioni dell'applicazione</string>
|
||||||
<string id="NoApiUrl">Nessun URL API nelle impostazioni dell'applicazione</string>
|
<string id="NoConfigUrl" scope="glance">Nessun URL di configurazione nelle impostazioni dell'applicazione</string>
|
||||||
<string id="NoConfigUrl">Nessun URL di configurazione nelle impostazioni dell'applicazione</string>
|
|
||||||
<string id="ApiFlood">Chiamate API troppo rapide. Per favore rallenta le tue richieste.</string>
|
<string id="ApiFlood">Chiamate API troppo rapide. Per favore rallenta le tue richieste.</string>
|
||||||
<string id="ApiUrlNotFound">URL non trovato. Potenziale errore URL API nelle impostazioni.</string>
|
<string id="ApiUrlNotFound">URL non trovato. Potenziale errore URL API nelle impostazioni.</string>
|
||||||
<string id="ConfigUrlNotFound">URL non trovato. Potenziale errore dell'URL di configurazione nelle impostazioni.</string>
|
<string id="ConfigUrlNotFound">URL non trovato. Potenziale errore dell'URL di configurazione nelle impostazioni.</string>
|
||||||
|
<string id="NoJson">Nessun JSON restituito dalla richiesta HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">La richiesta HTTP ha restituito il codice di errore =</string>
|
<string id="UnhandledHttpErr">La richiesta HTTP ha restituito il codice di errore =</string>
|
||||||
<string id="TrailingSlashErr">L'URL dell'API non deve avere una barra finale "/"</string>
|
<string id="TrailingSlashErr">L'URL dell'API non deve avere una barra finale "/"</string>
|
||||||
<string id="FetchingMenuConfig">Recupero configurazione menu..</string>
|
<string id="Available" scope="glance">Disponibile</string>
|
||||||
<string id="ExitViewTouch">Scorri verso destra per uscire\nTocca per restare</string>
|
<string id="Checking" scope="glance">Controllo...</string>
|
||||||
<string id="ExitViewButtons">Premi Indietro per uscire\nInvio per restare</string>
|
<string id="Unavailable" scope="glance">Non disponibile</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Non configurato</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menù</string>
|
||||||
<!-- Per la GUI delle impostazioni -->
|
<!-- Per la GUI delle impostazioni -->
|
||||||
<string id="SettingsApiKey">Chiave API per HomeAssistant.</string>
|
<string id="SettingsApiKey">Chiave API per HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Token di accesso di lunga durata.</string>
|
<string id="SettingsApiKeyPrompt">Token di accesso di lunga durata.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Trascorso questo tempo (in secondi), una finestra di dialogo di conferma per un'azione viene chiusa automaticamente e l'azione viene annullata. Impostare su 0 per disabilitare il timeout.</string>
|
<string id="SettingsConfirmTimeout">Trascorso questo tempo (in secondi), una finestra di dialogo di conferma per un'azione viene chiusa automaticamente e l'azione viene annullata. Impostare su 0 per disabilitare il timeout.</string>
|
||||||
<string id="SettingsUi">Rappresentazione dei tipi con icone (disattivata) o con etichette (attivata).</string>
|
<string id="SettingsUi">Rappresentazione dei tipi con icone (disattivata) o con etichette (attivata).</string>
|
||||||
<string id="SettingsTextAlign">Allineamento del menu a sinistra (spento) o a destra (acceso).</string>
|
<string id="SettingsTextAlign">Allineamento del menu a sinistra (spento) o a destra (acceso).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Solo widget) Avvia automaticamente l'applicazione dal widget senza attendere un tocco.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">タップ</string>
|
<string id="MenuItemTap">タップ</string>
|
||||||
<string id="MenuItemMenu">メニュー</string>
|
<string id="MenuItemMenu">メニュー</string>
|
||||||
<string id="Confirm">もちろん?</string>
|
<string id="Confirm">もちろん?</string>
|
||||||
<string id="NoPhone">電話が接続されていません</string>
|
<string id="NoPhone" scope="glance">電話が接続されていません</string>
|
||||||
<string id="NoInternet">インターネット接続なし</string>
|
<string id="NoInternet">インターネット接続なし</string>
|
||||||
<string id="NoResponse">応答がありません。インターネット接続を確認してください</string>
|
<string id="NoResponse">応答がありません。インターネット接続を確認してください</string>
|
||||||
<string id="NoMenu">メニューフェッチエラー</string>
|
<string id="NoAPIKey" scope="glance">アプリケーション設定に API キーがありません</string>
|
||||||
<string id="NoAPIKey">アプリケーション設定に API キーがありません</string>
|
<string id="NoApiUrl" scope="glance">アプリケーション設定に API URL がありません</string>
|
||||||
<string id="NoApiUrl">アプリケーション設定に API URL がありません</string>
|
<string id="NoConfigUrl" scope="glance">アプリケーション設定に構成 URL がありません</string>
|
||||||
<string id="NoConfigUrl">アプリケーション設定に構成 URL がありません</string>
|
|
||||||
<string id="ApiFlood">API 呼び出しが速すぎます。リクエストは遅くしてください。</string>
|
<string id="ApiFlood">API 呼び出しが速すぎます。リクエストは遅くしてください。</string>
|
||||||
<string id="ApiUrlNotFound">URLが見つかりません。設定における API URL エラーの可能性があります。</string>
|
<string id="ApiUrlNotFound">URLが見つかりません。設定における API URL エラーの可能性があります。</string>
|
||||||
<string id="ConfigUrlNotFound">URLが見つかりません。設定内の構成 URL エラーの可能性があります。</string>
|
<string id="ConfigUrlNotFound">URLが見つかりません。設定内の構成 URL エラーの可能性があります。</string>
|
||||||
|
<string id="NoJson">HTTP リクエストから JSON が返されませんでした。</string>
|
||||||
<string id="UnhandledHttpErr">HTTP リクエストがエラー コードを返しました =</string>
|
<string id="UnhandledHttpErr">HTTP リクエストがエラー コードを返しました =</string>
|
||||||
<string id="TrailingSlashErr">API URL の末尾にスラッシュ「/」を含めることはできません</string>
|
<string id="TrailingSlashErr">API URL の末尾にスラッシュ「/」を含めることはできません</string>
|
||||||
<string id="FetchingMenuConfig">メニュー構成を取得しています。</string>
|
<string id="Available" scope="glance">利用可能</string>
|
||||||
<string id="ExitViewTouch">右にスワイプして終了\nタップしてそのまま残ります</string>
|
<string id="Checking" scope="glance">チェック中...</string>
|
||||||
<string id="ExitViewButtons">終了するには戻るキーを押してください\n続行するには Enter キーを押してください</string>
|
<string id="Unavailable" scope="glance">利用不可</string>
|
||||||
|
<string id="Unconfigured" scope="glance">未構成</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">メニュー</string>
|
||||||
<!-- 設定GUIの場合 -->
|
<!-- 設定GUIの場合 -->
|
||||||
<string id="SettingsApiKey">ホームアシスタントの API キー。</string>
|
<string id="SettingsApiKey">ホームアシスタントの API キー。</string>
|
||||||
<string id="SettingsApiKeyPrompt">有効期間の長いアクセス トークン。</string>
|
<string id="SettingsApiKeyPrompt">有効期間の長いアクセス トークン。</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">この時間 (秒単位) が経過すると、アクションの確認ダイアログが自動的に閉じられ、アクションがキャンセルされます。タイムアウトを無効にするには、0 に設定します。</string>
|
<string id="SettingsConfirmTimeout">この時間 (秒単位) が経過すると、アクションの確認ダイアログが自動的に閉じられ、アクションがキャンセルされます。タイムアウトを無効にするには、0 に設定します。</string>
|
||||||
<string id="SettingsUi">タイプをアイコン (オフ) またはラベル (オン) で表します。</string>
|
<string id="SettingsUi">タイプをアイコン (オフ) またはラベル (オン) で表します。</string>
|
||||||
<string id="SettingsTextAlign">左 (オフ) または右 (オン) メニューの配置。</string>
|
<string id="SettingsTextAlign">左 (オフ) または右 (オン) メニューの配置。</string>
|
||||||
|
<string id="SettingsWidgetStart">(ウィジェットのみ)タップを待たずにウィジェットからアプリを自動起動します。</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">수도꼭지</string>
|
<string id="MenuItemTap">수도꼭지</string>
|
||||||
<string id="MenuItemMenu">메뉴</string>
|
<string id="MenuItemMenu">메뉴</string>
|
||||||
<string id="Confirm">확신하는?</string>
|
<string id="Confirm">확신하는?</string>
|
||||||
<string id="NoPhone">전화 연결 없음</string>
|
<string id="NoPhone" scope="glance">전화 연결 없음</string>
|
||||||
<string id="NoInternet">인터넷에 연결되지 않음</string>
|
<string id="NoInternet">인터넷에 연결되지 않음</string>
|
||||||
<string id="NoResponse">응답이 없습니다. 인터넷 연결을 확인하세요.</string>
|
<string id="NoResponse">응답이 없습니다. 인터넷 연결을 확인하세요.</string>
|
||||||
<string id="NoMenu">메뉴 가져오기 오류</string>
|
<string id="NoAPIKey" scope="glance">애플리케이션 설정에 API 키가 없습니다.</string>
|
||||||
<string id="NoAPIKey">애플리케이션 설정에 API 키가 없습니다.</string>
|
<string id="NoApiUrl" scope="glance">애플리케이션 설정에 API URL이 없습니다.</string>
|
||||||
<string id="NoApiUrl">애플리케이션 설정에 API URL이 없습니다.</string>
|
<string id="NoConfigUrl" scope="glance">애플리케이션 설정에 구성 URL이 없습니다.</string>
|
||||||
<string id="NoConfigUrl">애플리케이션 설정에 구성 URL이 없습니다.</string>
|
|
||||||
<string id="ApiFlood">API 호출이 너무 빠릅니다. 요청 속도를 늦추시기 바랍니다.</string>
|
<string id="ApiFlood">API 호출이 너무 빠릅니다. 요청 속도를 늦추시기 바랍니다.</string>
|
||||||
<string id="ApiUrlNotFound">URL을 찾을 수 없습니다. 설정에 잠재적인 API URL 오류가 있습니다.</string>
|
<string id="ApiUrlNotFound">URL을 찾을 수 없습니다. 설정에 잠재적인 API URL 오류가 있습니다.</string>
|
||||||
<string id="ConfigUrlNotFound">URL을 찾을 수 없습니다. 설정에 잠재적인 구성 URL 오류가 있습니다.</string>
|
<string id="ConfigUrlNotFound">URL을 찾을 수 없습니다. 설정에 잠재적인 구성 URL 오류가 있습니다.</string>
|
||||||
|
<string id="NoJson">HTTP 요청에서 JSON이 반환되지 않았습니다.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP 요청이 오류 코드를 반환했습니다 =</string>
|
<string id="UnhandledHttpErr">HTTP 요청이 오류 코드를 반환했습니다 =</string>
|
||||||
<string id="TrailingSlashErr">API URL에는 후행 슬래시 '/'가 없어야 합니다.</string>
|
<string id="TrailingSlashErr">API URL에는 후행 슬래시 '/'가 없어야 합니다.</string>
|
||||||
<string id="FetchingMenuConfig">메뉴 구성을 가져오는 중..</string>
|
<string id="Available" scope="glance">사용 가능</string>
|
||||||
<string id="ExitViewTouch">종료하려면 오른쪽으로 스와이프하세요.\n계속하려면 탭하세요.</string>
|
<string id="Checking" scope="glance">확인 중...</string>
|
||||||
<string id="ExitViewButtons">종료하려면 뒤로 버튼을 누르세요.\n계속하려면 입력하세요.</string>
|
<string id="Unavailable" scope="glance">없는</string>
|
||||||
|
<string id="Unconfigured" scope="glance">구성되지 않음</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">메뉴</string>
|
||||||
<!-- 설정 GUI의 경우 -->
|
<!-- 설정 GUI의 경우 -->
|
||||||
<string id="SettingsApiKey">HomeAssistant용 API 키.</string>
|
<string id="SettingsApiKey">HomeAssistant용 API 키.</string>
|
||||||
<string id="SettingsApiKeyPrompt">장기 액세스 토큰.</string>
|
<string id="SettingsApiKeyPrompt">장기 액세스 토큰.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">이 시간(초)이 지나면 작업에 대한 확인 대화 상자가 자동으로 닫히고 작업이 취소됩니다. 시간 초과를 비활성화하려면 0으로 설정합니다.</string>
|
<string id="SettingsConfirmTimeout">이 시간(초)이 지나면 작업에 대한 확인 대화 상자가 자동으로 닫히고 작업이 취소됩니다. 시간 초과를 비활성화하려면 0으로 설정합니다.</string>
|
||||||
<string id="SettingsUi">아이콘(끄기) 또는 레이블(켜기)로 유형을 나타냅니다.</string>
|
<string id="SettingsUi">아이콘(끄기) 또는 레이블(켜기)로 유형을 나타냅니다.</string>
|
||||||
<string id="SettingsTextAlign">왼쪽(끄기) 또는 오른쪽(켜기) 메뉴 정렬.</string>
|
<string id="SettingsTextAlign">왼쪽(끄기) 또는 오른쪽(켜기) 메뉴 정렬.</string>
|
||||||
|
<string id="SettingsWidgetStart">(위젯만 해당) 탭을 기다리지 않고 위젯에서 애플리케이션을 자동으로 시작합니다.</string>
|
||||||
</strings>
|
</strings>
|
17
resources-launcher-33-33/drawables.xml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Distributed under MIT Licence
|
||||||
|
See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
|
||||||
|
|
||||||
|
|
||||||
|
GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely
|
||||||
|
tested on a Venu 2 device. The source code is provided at:
|
||||||
|
https://github.com/house-of-abbey/GarminHomeAssistant.
|
||||||
|
|
||||||
|
P A Abbey & J D Abbey & Someone0nEarth, 31 October 2023
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<drawables>
|
||||||
|
<bitmap id="LauncherIcon" filename="launcher.png" />
|
||||||
|
</drawables>
|
BIN
resources-launcher-33-33/launcher.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Krāns</string>
|
<string id="MenuItemTap">Krāns</string>
|
||||||
<string id="MenuItemMenu">Izvēlne</string>
|
<string id="MenuItemMenu">Izvēlne</string>
|
||||||
<string id="Confirm">Protams?</string>
|
<string id="Confirm">Protams?</string>
|
||||||
<string id="NoPhone">Nav tālruņa savienojuma</string>
|
<string id="NoPhone" scope="glance">Nav tālruņa savienojuma</string>
|
||||||
<string id="NoInternet">Nav interneta savienojuma</string>
|
<string id="NoInternet">Nav interneta savienojuma</string>
|
||||||
<string id="NoResponse">Nav atbildes, pārbaudiet interneta savienojumu</string>
|
<string id="NoResponse">Nav atbildes, pārbaudiet interneta savienojumu</string>
|
||||||
<string id="NoMenu">Izvēlnes ielādes kļūda</string>
|
<string id="NoAPIKey" scope="glance">Lietojumprogrammas iestatījumos nav API atslēgas</string>
|
||||||
<string id="NoAPIKey">Lietojumprogrammas iestatījumos nav API atslēgas</string>
|
<string id="NoApiUrl" scope="glance">Lietojumprogrammas iestatījumos nav API URL</string>
|
||||||
<string id="NoApiUrl">Lietojumprogrammas iestatījumos nav API URL</string>
|
<string id="NoConfigUrl" scope="glance">Lietojumprogrammas iestatījumos nav konfigurācijas URL</string>
|
||||||
<string id="NoConfigUrl">Lietojumprogrammas iestatījumos nav konfigurācijas URL</string>
|
|
||||||
<string id="ApiFlood">API izsaukumi ir pārāk ātri. Lūdzu, palēniniet pieprasījumu izpildi.</string>
|
<string id="ApiFlood">API izsaukumi ir pārāk ātri. Lūdzu, palēniniet pieprasījumu izpildi.</string>
|
||||||
<string id="ApiUrlNotFound">URL nav atrasts. Iespējama API URL kļūda iestatījumos.</string>
|
<string id="ApiUrlNotFound">URL nav atrasts. Iespējama API URL kļūda iestatījumos.</string>
|
||||||
<string id="ConfigUrlNotFound">URL nav atrasts. Iespējama konfigurācijas URL kļūda iestatījumos.</string>
|
<string id="ConfigUrlNotFound">URL nav atrasts. Iespējama konfigurācijas URL kļūda iestatījumos.</string>
|
||||||
|
<string id="NoJson">No HTTP pieprasījuma netika atgriezts neviens JSON fails.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP pieprasījums atgrieza kļūdas kodu =</string>
|
<string id="UnhandledHttpErr">HTTP pieprasījums atgrieza kļūdas kodu =</string>
|
||||||
<string id="TrailingSlashErr">API URL beigās nedrīkst būt slīpsvītra “/”</string>
|
<string id="TrailingSlashErr">API URL beigās nedrīkst būt slīpsvītra “/”</string>
|
||||||
<string id="FetchingMenuConfig">Notiek izvēlnes konfigurācijas iegūšana...</string>
|
<string id="Available" scope="glance">Pieejams</string>
|
||||||
<string id="ExitViewTouch">Lai izietu, velciet pa labi\nPieskarieties, lai paliktu</string>
|
<string id="Checking" scope="glance">Notiek pārbaude...</string>
|
||||||
<string id="ExitViewButtons">Noklikšķiniet uz Atpakaļ, lai izietu.\nIevadiet, lai paliktu</string>
|
<string id="Unavailable" scope="glance">Nav pieejams</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Nav konfigurēts</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Izvēlne</string>
|
||||||
<!-- Iestatījumu GUI -->
|
<!-- Iestatījumu GUI -->
|
||||||
<string id="SettingsApiKey">API atslēga Home Assistant.</string>
|
<string id="SettingsApiKey">API atslēga Home Assistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Ilgmūžīgs piekļuves marķieris.</string>
|
<string id="SettingsApiKeyPrompt">Ilgmūžīgs piekļuves marķieris.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Pēc šī laika (sekundēs) tiek automātiski aizvērts darbības apstiprinājuma dialoglodziņš un darbība tiek atcelta. Iestatiet uz 0, lai atspējotu taimautu.</string>
|
<string id="SettingsConfirmTimeout">Pēc šī laika (sekundēs) tiek automātiski aizvērts darbības apstiprinājuma dialoglodziņš un darbība tiek atcelta. Iestatiet uz 0, lai atspējotu taimautu.</string>
|
||||||
<string id="SettingsUi">Apzīmē veidus ar ikonām (izslēgts) vai ar etiķetēm (ieslēgts).</string>
|
<string id="SettingsUi">Apzīmē veidus ar ikonām (izslēgts) vai ar etiķetēm (ieslēgts).</string>
|
||||||
<string id="SettingsTextAlign">Kreisā (izslēgta) vai labā (ieslēgta) izvēlnes līdzināšana.</string>
|
<string id="SettingsTextAlign">Kreisā (izslēgta) vai labā (ieslēgta) izvēlnes līdzināšana.</string>
|
||||||
|
<string id="SettingsWidgetStart">(tikai logrīkam) Automātiski startējiet lietojumprogrammu no logrīka, negaidot pieskārienu.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Bakstelėkite</string>
|
<string id="MenuItemTap">Bakstelėkite</string>
|
||||||
<string id="MenuItemMenu">Meniu</string>
|
<string id="MenuItemMenu">Meniu</string>
|
||||||
<string id="Confirm">Žinoma?</string>
|
<string id="Confirm">Žinoma?</string>
|
||||||
<string id="NoPhone">Nėra telefono ryšio</string>
|
<string id="NoPhone" scope="glance">Nėra telefono ryšio</string>
|
||||||
<string id="NoInternet">Nėra interneto ryšio</string>
|
<string id="NoInternet">Nėra interneto ryšio</string>
|
||||||
<string id="NoResponse">Neatsako, patikrinkite interneto ryšį</string>
|
<string id="NoResponse">Neatsako, patikrinkite interneto ryšį</string>
|
||||||
<string id="NoMenu">Meniu gavimo klaida</string>
|
<string id="NoAPIKey" scope="glance">Programos nustatymuose nėra API rakto</string>
|
||||||
<string id="NoAPIKey">Programos nustatymuose nėra API rakto</string>
|
<string id="NoApiUrl" scope="glance">Programos nustatymuose nėra API URL</string>
|
||||||
<string id="NoApiUrl">Programos nustatymuose nėra API URL</string>
|
<string id="NoConfigUrl" scope="glance">Programos nustatymuose nėra konfigūracijos URL</string>
|
||||||
<string id="NoConfigUrl">Programos nustatymuose nėra konfigūracijos URL</string>
|
|
||||||
<string id="ApiFlood">API skambučiai per greiti. Sulėtinkite prašymų vykdymą.</string>
|
<string id="ApiFlood">API skambučiai per greiti. Sulėtinkite prašymų vykdymą.</string>
|
||||||
<string id="ApiUrlNotFound">URL nerastas. Galima API URL klaida nustatymuose.</string>
|
<string id="ApiUrlNotFound">URL nerastas. Galima API URL klaida nustatymuose.</string>
|
||||||
<string id="ConfigUrlNotFound">URL nerastas. Galima konfigūracijos URL klaida nustatymuose.</string>
|
<string id="ConfigUrlNotFound">URL nerastas. Galima konfigūracijos URL klaida nustatymuose.</string>
|
||||||
|
<string id="NoJson">Joks JSON negrąžintas iš HTTP užklausos.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP užklausa grąžino klaidos kodą =</string>
|
<string id="UnhandledHttpErr">HTTP užklausa grąžino klaidos kodą =</string>
|
||||||
<string id="TrailingSlashErr">API URL pabaigoje negali būti pasvirojo brūkšnio „/“</string>
|
<string id="TrailingSlashErr">API URL pabaigoje negali būti pasvirojo brūkšnio „/“</string>
|
||||||
<string id="FetchingMenuConfig">Gaunama meniu konfigūracija...</string>
|
<string id="Available" scope="glance">Yra</string>
|
||||||
<string id="ExitViewTouch">Norėdami išeiti, braukite į dešinę\nPalieskite, kad pasiliktumėte</string>
|
<string id="Checking" scope="glance">Tikrinama...</string>
|
||||||
<string id="ExitViewButtons">Norėdami išeiti, paspauskite „Atgal“.\nĮveskite, kad pasiliktumėte</string>
|
<string id="Unavailable" scope="glance">Nepasiekiamas</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Nesukonfigūruotas</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Meniu</string>
|
||||||
<!-- Dėl nustatymų GUI -->
|
<!-- Dėl nustatymų GUI -->
|
||||||
<string id="SettingsApiKey">API raktas, skirtas HomeAssistant.</string>
|
<string id="SettingsApiKey">API raktas, skirtas HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Ilgalaikis prieigos raktas.</string>
|
<string id="SettingsApiKeyPrompt">Ilgalaikis prieigos raktas.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Praėjus šiam laikui (sekundėmis), veiksmo patvirtinimo dialogo langas automatiškai uždaromas ir veiksmas atšaukiamas. Nustatykite 0, kad išjungtumėte skirtąjį laiką.</string>
|
<string id="SettingsConfirmTimeout">Praėjus šiam laikui (sekundėmis), veiksmo patvirtinimo dialogo langas automatiškai uždaromas ir veiksmas atšaukiamas. Nustatykite 0, kad išjungtumėte skirtąjį laiką.</string>
|
||||||
<string id="SettingsUi">Tipai su piktogramomis (išjungta) arba etiketėmis (įjungta).</string>
|
<string id="SettingsUi">Tipai su piktogramomis (išjungta) arba etiketėmis (įjungta).</string>
|
||||||
<string id="SettingsTextAlign">Kairysis (išjungtas) arba dešinysis (įjungtas) meniu lygiavimas.</string>
|
<string id="SettingsTextAlign">Kairysis (išjungtas) arba dešinysis (įjungtas) meniu lygiavimas.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Tik valdiklis) Automatiškai paleiskite programą iš valdiklio, nelaukdami palietimo.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Trykk på</string>
|
<string id="MenuItemTap">Trykk på</string>
|
||||||
<string id="MenuItemMenu">Meny</string>
|
<string id="MenuItemMenu">Meny</string>
|
||||||
<string id="Confirm">Sikker?</string>
|
<string id="Confirm">Sikker?</string>
|
||||||
<string id="NoPhone">Ingen telefonforbindelse</string>
|
<string id="NoPhone" scope="glance">Ingen telefonforbindelse</string>
|
||||||
<string id="NoInternet">Ingen Internett-tilkobling</string>
|
<string id="NoInternet">Ingen Internett-tilkobling</string>
|
||||||
<string id="NoResponse">Ingen svar, sjekk Internett-tilkoblingen</string>
|
<string id="NoResponse">Ingen svar, sjekk Internett-tilkoblingen</string>
|
||||||
<string id="NoMenu">Menyhentingsfeil</string>
|
<string id="NoAPIKey" scope="glance">Ingen API-nøkkel i applikasjonsinnstillingene</string>
|
||||||
<string id="NoAPIKey">Ingen API-nøkkel i applikasjonsinnstillingene</string>
|
<string id="NoApiUrl" scope="glance">Ingen API-URL i applikasjonsinnstillingene</string>
|
||||||
<string id="NoApiUrl">Ingen API-URL i applikasjonsinnstillingene</string>
|
<string id="NoConfigUrl" scope="glance">Ingen konfigurasjons-URL i applikasjonsinnstillingene</string>
|
||||||
<string id="NoConfigUrl">Ingen konfigurasjons-URL i applikasjonsinnstillingene</string>
|
|
||||||
<string id="ApiFlood">API-kall for raske. Vennligst senke forespørslene dine.</string>
|
<string id="ApiFlood">API-kall for raske. Vennligst senke forespørslene dine.</string>
|
||||||
<string id="ApiUrlNotFound">Finner ikke URL. Potensiell API URL-feil i innstillingene.</string>
|
<string id="ApiUrlNotFound">Finner ikke URL. Potensiell API URL-feil i innstillingene.</string>
|
||||||
<string id="ConfigUrlNotFound">Finner ikke URL. Potensiell konfigurasjons-URL-feil i innstillingene.</string>
|
<string id="ConfigUrlNotFound">Finner ikke URL. Potensiell konfigurasjons-URL-feil i innstillingene.</string>
|
||||||
|
<string id="NoJson">Ingen JSON returnert fra HTTP-forespørsel.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP-forespørsel returnerte feilkode =</string>
|
<string id="UnhandledHttpErr">HTTP-forespørsel returnerte feilkode =</string>
|
||||||
<string id="TrailingSlashErr">API URL må ikke ha en etterfølgende skråstrek '/'</string>
|
<string id="TrailingSlashErr">API URL må ikke ha en etterfølgende skråstrek '/'</string>
|
||||||
<string id="FetchingMenuConfig">Henter menykonfigurasjon..</string>
|
<string id="Available" scope="glance">Tilgjengelig</string>
|
||||||
<string id="ExitViewTouch">Sveip til høyre for å avslutte\nTrykk for å bli</string>
|
<string id="Checking" scope="glance">Sjekker...</string>
|
||||||
<string id="ExitViewButtons">Trykk Tilbake for å avslutte\nEnter for å bli</string>
|
<string id="Unavailable" scope="glance">Utilgjengelig</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Ukonfigurert</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Meny</string>
|
||||||
<!-- For innstillingene GUI -->
|
<!-- For innstillingene GUI -->
|
||||||
<string id="SettingsApiKey">API-nøkkel for HomeAssistant.</string>
|
<string id="SettingsApiKey">API-nøkkel for HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Langlevd tilgangstoken.</string>
|
<string id="SettingsApiKeyPrompt">Langlevd tilgangstoken.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Etter denne tiden (i sekunder), lukkes en bekreftelsesdialog for en handling automatisk og handlingen avbrytes. Sett til 0 for å deaktivere tidsavbruddet.</string>
|
<string id="SettingsConfirmTimeout">Etter denne tiden (i sekunder), lukkes en bekreftelsesdialog for en handling automatisk og handlingen avbrytes. Sett til 0 for å deaktivere tidsavbruddet.</string>
|
||||||
<string id="SettingsUi">Representerer typer med ikoner (av) eller med etiketter (på).</string>
|
<string id="SettingsUi">Representerer typer med ikoner (av) eller med etiketter (på).</string>
|
||||||
<string id="SettingsTextAlign">Venstre (av) eller Høyre (på) Menyjustering.</string>
|
<string id="SettingsTextAlign">Venstre (av) eller Høyre (på) Menyjustering.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Kun widget) Start applikasjonen automatisk fra widgeten uten å vente på et trykk.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Uzyskiwać</string>
|
<string id="MenuItemTap">Uzyskiwać</string>
|
||||||
<string id="MenuItemMenu">Menu</string>
|
<string id="MenuItemMenu">Menu</string>
|
||||||
<string id="Confirm">Jasne?</string>
|
<string id="Confirm">Jasne?</string>
|
||||||
<string id="NoPhone">Brak połączenia telefonicznego</string>
|
<string id="NoPhone" scope="glance">Brak połączenia telefonicznego</string>
|
||||||
<string id="NoInternet">Brak połączenia z internetem</string>
|
<string id="NoInternet">Brak połączenia z internetem</string>
|
||||||
<string id="NoResponse">Brak odpowiedzi, sprawdź połączenie internetowe</string>
|
<string id="NoResponse">Brak odpowiedzi, sprawdź połączenie internetowe</string>
|
||||||
<string id="NoMenu">Błąd pobierania menu</string>
|
<string id="NoAPIKey" scope="glance">Brak klucza API w ustawieniach aplikacji</string>
|
||||||
<string id="NoAPIKey">Brak klucza API w ustawieniach aplikacji</string>
|
<string id="NoApiUrl" scope="glance">Brak adresu API w ustawieniach aplikacji</string>
|
||||||
<string id="NoApiUrl">Brak adresu API w ustawieniach aplikacji</string>
|
<string id="NoConfigUrl" scope="glance">Brak adresu URL konfiguracji w ustawieniach aplikacji</string>
|
||||||
<string id="NoConfigUrl">Brak adresu URL konfiguracji w ustawieniach aplikacji</string>
|
|
||||||
<string id="ApiFlood">Wywołania API są zbyt szybkie. Proszę spowolnić swoje żądania.</string>
|
<string id="ApiFlood">Wywołania API są zbyt szybkie. Proszę spowolnić swoje żądania.</string>
|
||||||
<string id="ApiUrlNotFound">Nie znaleziono adresu URL. Potencjalny błąd adresu URL interfejsu API w ustawieniach.</string>
|
<string id="ApiUrlNotFound">Nie znaleziono adresu URL. Potencjalny błąd adresu URL interfejsu API w ustawieniach.</string>
|
||||||
<string id="ConfigUrlNotFound">Nie znaleziono adresu URL. Potencjalny błąd adresu URL konfiguracji w ustawieniach.</string>
|
<string id="ConfigUrlNotFound">Nie znaleziono adresu URL. Potencjalny błąd adresu URL konfiguracji w ustawieniach.</string>
|
||||||
|
<string id="NoJson">Z żądania HTTP nie zwrócono żadnego kodu JSON.</string>
|
||||||
<string id="UnhandledHttpErr">Żądanie HTTP zwróciło kod błędu =</string>
|
<string id="UnhandledHttpErr">Żądanie HTTP zwróciło kod błędu =</string>
|
||||||
<string id="TrailingSlashErr">Adres URL interfejsu API nie może zawierać końcowego ukośnika „/”</string>
|
<string id="TrailingSlashErr">Adres URL interfejsu API nie może zawierać końcowego ukośnika „/”</string>
|
||||||
<string id="FetchingMenuConfig">Pobieranie konfiguracji menu..</string>
|
<string id="Available" scope="glance">Dostępny</string>
|
||||||
<string id="ExitViewTouch">Przesuń w prawo, aby wyjść\nDotknij, aby pozostać</string>
|
<string id="Checking" scope="glance">Kontrola...</string>
|
||||||
<string id="ExitViewButtons">Naciśnij Wstecz, aby wyjść\nEnter, aby pozostać</string>
|
<string id="Unavailable" scope="glance">Niedostępne</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Nieskonfigurowane</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menu</string>
|
||||||
<!-- Dla ustawień GUI -->
|
<!-- Dla ustawień GUI -->
|
||||||
<string id="SettingsApiKey">Klucz API dla HomeAssistant.</string>
|
<string id="SettingsApiKey">Klucz API dla HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Długowieczny token dostępu.</string>
|
<string id="SettingsApiKeyPrompt">Długowieczny token dostępu.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Po tym czasie (w sekundach) okno dialogowe z potwierdzeniem akcji zamyka się automatycznie, a akcja zostaje anulowana. Ustaw na 0, aby wyłączyć limit czasu.</string>
|
<string id="SettingsConfirmTimeout">Po tym czasie (w sekundach) okno dialogowe z potwierdzeniem akcji zamyka się automatycznie, a akcja zostaje anulowana. Ustaw na 0, aby wyłączyć limit czasu.</string>
|
||||||
<string id="SettingsUi">Reprezentowanie typów za pomocą ikon (wyłączone) lub etykiet (włączone).</string>
|
<string id="SettingsUi">Reprezentowanie typów za pomocą ikon (wyłączone) lub etykiet (włączone).</string>
|
||||||
<string id="SettingsTextAlign">Wyrównanie menu do lewej (wyłączone) lub do prawej (włączone).</string>
|
<string id="SettingsTextAlign">Wyrównanie menu do lewej (wyłączone) lub do prawej (włączone).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Tylko widget) Automatycznie uruchamiaj aplikację z widgetu, bez czekania na dotknięcie.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Tocar</string>
|
<string id="MenuItemTap">Tocar</string>
|
||||||
<string id="MenuItemMenu">Cardápio</string>
|
<string id="MenuItemMenu">Cardápio</string>
|
||||||
<string id="Confirm">Claro?</string>
|
<string id="Confirm">Claro?</string>
|
||||||
<string id="NoPhone">Sem conexão telefônica</string>
|
<string id="NoPhone" scope="glance">Sem conexão telefônica</string>
|
||||||
<string id="NoInternet">Sem conexão com a Internet</string>
|
<string id="NoInternet">Sem conexão com a Internet</string>
|
||||||
<string id="NoResponse">Sem resposta, verifique a conexão com a Internet</string>
|
<string id="NoResponse">Sem resposta, verifique a conexão com a Internet</string>
|
||||||
<string id="NoMenu">Erro ao buscar menu</string>
|
<string id="NoAPIKey" scope="glance">Nenhuma chave de API nas configurações do aplicativo</string>
|
||||||
<string id="NoAPIKey">Nenhuma chave de API nas configurações do aplicativo</string>
|
<string id="NoApiUrl" scope="glance">Nenhum URL de API nas configurações do aplicativo</string>
|
||||||
<string id="NoApiUrl">Nenhum URL de API nas configurações do aplicativo</string>
|
<string id="NoConfigUrl" scope="glance">Nenhum URL de configuração nas configurações do aplicativo</string>
|
||||||
<string id="NoConfigUrl">Nenhum URL de configuração nas configurações do aplicativo</string>
|
|
||||||
<string id="ApiFlood">Chamadas de API muito rápidas. Por favor, diminua a velocidade de seus pedidos.</string>
|
<string id="ApiFlood">Chamadas de API muito rápidas. Por favor, diminua a velocidade de seus pedidos.</string>
|
||||||
<string id="ApiUrlNotFound">URL não encontrado. Possível erro de URL da API nas configurações.</string>
|
<string id="ApiUrlNotFound">URL não encontrado. Possível erro de URL da API nas configurações.</string>
|
||||||
<string id="ConfigUrlNotFound">URL não encontrado. Possível erro de URL de configuração nas configurações.</string>
|
<string id="ConfigUrlNotFound">URL não encontrado. Possível erro de URL de configuração nas configurações.</string>
|
||||||
|
<string id="NoJson">Nenhum JSON foi retornado da solicitação HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">Solicitação HTTP retornou código de erro =</string>
|
<string id="UnhandledHttpErr">Solicitação HTTP retornou código de erro =</string>
|
||||||
<string id="TrailingSlashErr">O URL da API não deve ter uma barra final '/'</string>
|
<string id="TrailingSlashErr">O URL da API não deve ter uma barra final '/'</string>
|
||||||
<string id="FetchingMenuConfig">Buscando configuração do menu..</string>
|
<string id="Available" scope="glance">Disponível</string>
|
||||||
<string id="ExitViewTouch">Deslize para a direita para sair\nToque para permanecer</string>
|
<string id="Checking" scope="glance">Verificando...</string>
|
||||||
<string id="ExitViewButtons">Volte para sair\nEntre para permanecer</string>
|
<string id="Unavailable" scope="glance">Indisponível</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Não configurado</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Cardápio</string>
|
||||||
<!-- Para a GUI de configurações -->
|
<!-- Para a GUI de configurações -->
|
||||||
<string id="SettingsApiKey">Chave de API para HomeAssistant.</string>
|
<string id="SettingsApiKey">Chave de API para HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Token de acesso de longa duração.</string>
|
<string id="SettingsApiKeyPrompt">Token de acesso de longa duração.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Após esse tempo (em segundos), uma caixa de diálogo de confirmação de uma ação é automaticamente fechada e a ação é cancelada. Defina como 0 para desativar o tempo limite.</string>
|
<string id="SettingsConfirmTimeout">Após esse tempo (em segundos), uma caixa de diálogo de confirmação de uma ação é automaticamente fechada e a ação é cancelada. Defina como 0 para desativar o tempo limite.</string>
|
||||||
<string id="SettingsUi">Representando tipos com ícones (desligado) ou com rótulos (ligado).</string>
|
<string id="SettingsUi">Representando tipos com ícones (desligado) ou com rótulos (ligado).</string>
|
||||||
<string id="SettingsTextAlign">Alinhamento do menu à esquerda (desligado) ou à direita (ligado).</string>
|
<string id="SettingsTextAlign">Alinhamento do menu à esquerda (desligado) ou à direita (ligado).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Somente widget) Inicie automaticamente o aplicativo a partir do widget sem esperar por um toque.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Atingeți</string>
|
<string id="MenuItemTap">Atingeți</string>
|
||||||
<string id="MenuItemMenu">Meniul</string>
|
<string id="MenuItemMenu">Meniul</string>
|
||||||
<string id="Confirm">Sigur?</string>
|
<string id="Confirm">Sigur?</string>
|
||||||
<string id="NoPhone">Fără conexiune telefonică</string>
|
<string id="NoPhone" scope="glance">Fără conexiune telefonică</string>
|
||||||
<string id="NoInternet">Fără conexiune internet</string>
|
<string id="NoInternet">Fără conexiune internet</string>
|
||||||
<string id="NoResponse">Niciun răspuns, verificați conexiunea la internet</string>
|
<string id="NoResponse">Niciun răspuns, verificați conexiunea la internet</string>
|
||||||
<string id="NoMenu">Eroare de preluare a meniului</string>
|
<string id="NoAPIKey" scope="glance">Nicio cheie API în setările aplicației</string>
|
||||||
<string id="NoAPIKey">Nicio cheie API în setările aplicației</string>
|
<string id="NoApiUrl" scope="glance">Nicio adresă URL API în setările aplicației</string>
|
||||||
<string id="NoApiUrl">Nicio adresă URL API în setările aplicației</string>
|
<string id="NoConfigUrl" scope="glance">Nicio adresă URL de configurare în setările aplicației</string>
|
||||||
<string id="NoConfigUrl">Nicio adresă URL de configurare în setările aplicației</string>
|
|
||||||
<string id="ApiFlood">Apeluri API prea rapide. Vă rugăm să vă încetiniți solicitările.</string>
|
<string id="ApiFlood">Apeluri API prea rapide. Vă rugăm să vă încetiniți solicitările.</string>
|
||||||
<string id="ApiUrlNotFound">Adresa URL nu a fost găsită. Potențială eroare URL API în setări.</string>
|
<string id="ApiUrlNotFound">Adresa URL nu a fost găsită. Potențială eroare URL API în setări.</string>
|
||||||
<string id="ConfigUrlNotFound">Adresa URL nu a fost găsită. Potențială eroare URL de configurare în setări.</string>
|
<string id="ConfigUrlNotFound">Adresa URL nu a fost găsită. Potențială eroare URL de configurare în setări.</string>
|
||||||
|
<string id="NoJson">Niciun JSON nu a fost returnat de la solicitarea HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">Solicitarea HTTP a returnat codul de eroare =</string>
|
<string id="UnhandledHttpErr">Solicitarea HTTP a returnat codul de eroare =</string>
|
||||||
<string id="TrailingSlashErr">Adresa URL API nu trebuie să aibă o bară oblică „/”</string>
|
<string id="TrailingSlashErr">Adresa URL API nu trebuie să aibă o bară oblică „/”</string>
|
||||||
<string id="FetchingMenuConfig">Se preiau configurarea meniului...</string>
|
<string id="Available" scope="glance">Disponibil</string>
|
||||||
<string id="ExitViewTouch">Glisați spre dreapta pentru a ieși\nAtingeți pentru a rămâne</string>
|
<string id="Checking" scope="glance">Control...</string>
|
||||||
<string id="ExitViewButtons">Apăsați Înapoi pentru a ieși\nIntră pentru a rămâne</string>
|
<string id="Unavailable" scope="glance">Indisponibil</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Neconfigurat</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Meniul</string>
|
||||||
<!-- Pentru GUI de setări -->
|
<!-- Pentru GUI de setări -->
|
||||||
<string id="SettingsApiKey">Cheie API pentru HomeAssistant.</string>
|
<string id="SettingsApiKey">Cheie API pentru HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Token de acces cu viață lungă.</string>
|
<string id="SettingsApiKeyPrompt">Token de acces cu viață lungă.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">După acest timp (în secunde), un dialog de confirmare pentru o acțiune este închis automat și acțiunea este anulată. Setați la 0 pentru a dezactiva timeout-ul.</string>
|
<string id="SettingsConfirmTimeout">După acest timp (în secunde), un dialog de confirmare pentru o acțiune este închis automat și acțiunea este anulată. Setați la 0 pentru a dezactiva timeout-ul.</string>
|
||||||
<string id="SettingsUi">Reprezentarea tipurilor cu pictograme (dezactivate) sau cu etichete (activate).</string>
|
<string id="SettingsUi">Reprezentarea tipurilor cu pictograme (dezactivate) sau cu etichete (activate).</string>
|
||||||
<string id="SettingsTextAlign">Alinierea meniului la stânga (dezactivată) sau la dreapta (activată).</string>
|
<string id="SettingsTextAlign">Alinierea meniului la stânga (dezactivată) sau la dreapta (activată).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Numai widget) Porniți automat aplicația din widget fără a aștepta o atingere.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Klepnite</string>
|
<string id="MenuItemTap">Klepnite</string>
|
||||||
<string id="MenuItemMenu">Ponuka</string>
|
<string id="MenuItemMenu">Ponuka</string>
|
||||||
<string id="Confirm">Samozrejme?</string>
|
<string id="Confirm">Samozrejme?</string>
|
||||||
<string id="NoPhone">Žiadne telefónne spojenie</string>
|
<string id="NoPhone" scope="glance">Žiadne telefónne spojenie</string>
|
||||||
<string id="NoInternet">Žiadne internetové pripojenie</string>
|
<string id="NoInternet">Žiadne internetové pripojenie</string>
|
||||||
<string id="NoResponse">Žiadna odpoveď, skontrolujte internetové pripojenie</string>
|
<string id="NoResponse">Žiadna odpoveď, skontrolujte internetové pripojenie</string>
|
||||||
<string id="NoMenu">Chyba načítania ponuky</string>
|
<string id="NoAPIKey" scope="glance">V nastaveniach aplikácie nie je žiadny kľúč API</string>
|
||||||
<string id="NoAPIKey">V nastaveniach aplikácie nie je žiadny kľúč API</string>
|
<string id="NoApiUrl" scope="glance">V nastaveniach aplikácie nie je žiadna adresa URL rozhrania API</string>
|
||||||
<string id="NoApiUrl">V nastaveniach aplikácie nie je žiadna adresa URL rozhrania API</string>
|
<string id="NoConfigUrl" scope="glance">V nastaveniach aplikácie nie je žiadna konfiguračná URL</string>
|
||||||
<string id="NoConfigUrl">V nastaveniach aplikácie nie je žiadna konfiguračná URL</string>
|
|
||||||
<string id="ApiFlood">Volania API sú príliš rýchle. Spomaľte svoje požiadavky.</string>
|
<string id="ApiFlood">Volania API sú príliš rýchle. Spomaľte svoje požiadavky.</string>
|
||||||
<string id="ApiUrlNotFound">Adresa URL sa nenašla. Potenciálna chyba webovej adresy rozhrania API v nastaveniach.</string>
|
<string id="ApiUrlNotFound">Adresa URL sa nenašla. Potenciálna chyba webovej adresy rozhrania API v nastaveniach.</string>
|
||||||
<string id="ConfigUrlNotFound">Adresa URL sa nenašla. Potenciálna chyba konfiguračnej adresy URL v nastaveniach.</string>
|
<string id="ConfigUrlNotFound">Adresa URL sa nenašla. Potenciálna chyba konfiguračnej adresy URL v nastaveniach.</string>
|
||||||
|
<string id="NoJson">Z požiadavky HTTP sa nevrátil žiadny JSON.</string>
|
||||||
<string id="UnhandledHttpErr">Požiadavka HTTP vrátila kód chyby =</string>
|
<string id="UnhandledHttpErr">Požiadavka HTTP vrátila kód chyby =</string>
|
||||||
<string id="TrailingSlashErr">Adresa URL rozhrania API nesmie obsahovať koncovú lomku „/“</string>
|
<string id="TrailingSlashErr">Adresa URL rozhrania API nesmie obsahovať koncovú lomku „/“</string>
|
||||||
<string id="FetchingMenuConfig">Načítava sa konfigurácia ponuky...</string>
|
<string id="Available" scope="glance">Dostupné</string>
|
||||||
<string id="ExitViewTouch">Ukončite prejdením prstom doprava\nKlepnutím zostanete</string>
|
<string id="Checking" scope="glance">Prebieha kontrola...</string>
|
||||||
<string id="ExitViewButtons">Stlačte Späť na ukončenie\nVstúpte a zostaňte</string>
|
<string id="Unavailable" scope="glance">nedostupné</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Nekonfigurované</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Ponuka</string>
|
||||||
<!-- Pre nastavenia GUI -->
|
<!-- Pre nastavenia GUI -->
|
||||||
<string id="SettingsApiKey">Kľúč API pre HomeAssistant.</string>
|
<string id="SettingsApiKey">Kľúč API pre HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Prístupový token s dlhou životnosťou.</string>
|
<string id="SettingsApiKeyPrompt">Prístupový token s dlhou životnosťou.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Po tomto čase (v sekundách) sa dialógové okno s potvrdením akcie automaticky zatvorí a akcia sa zruší. Ak chcete časový limit deaktivovať, nastavte na 0.</string>
|
<string id="SettingsConfirmTimeout">Po tomto čase (v sekundách) sa dialógové okno s potvrdením akcie automaticky zatvorí a akcia sa zruší. Ak chcete časový limit deaktivovať, nastavte na 0.</string>
|
||||||
<string id="SettingsUi">Typy predstavujú ikony (vypnuté) alebo štítky (zapnuté).</string>
|
<string id="SettingsUi">Typy predstavujú ikony (vypnuté) alebo štítky (zapnuté).</string>
|
||||||
<string id="SettingsTextAlign">Zarovnanie ponuky vľavo (vypnuté) alebo vpravo (zapnuté).</string>
|
<string id="SettingsTextAlign">Zarovnanie ponuky vľavo (vypnuté) alebo vpravo (zapnuté).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Len miniaplikácia) Automaticky spustite aplikáciu z miniaplikácie bez čakania na klepnutie.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Tapnite</string>
|
<string id="MenuItemTap">Tapnite</string>
|
||||||
<string id="MenuItemMenu">meni</string>
|
<string id="MenuItemMenu">meni</string>
|
||||||
<string id="Confirm">Seveda?</string>
|
<string id="Confirm">Seveda?</string>
|
||||||
<string id="NoPhone">Ni telefonske povezave</string>
|
<string id="NoPhone" scope="glance">Ni telefonske povezave</string>
|
||||||
<string id="NoInternet">Ni internetne povezave</string>
|
<string id="NoInternet">Ni internetne povezave</string>
|
||||||
<string id="NoResponse">Ni odgovora, preverite internetno povezavo</string>
|
<string id="NoResponse">Ni odgovora, preverite internetno povezavo</string>
|
||||||
<string id="NoMenu">Napaka pri pridobivanju menija</string>
|
<string id="NoAPIKey" scope="glance">V nastavitvah aplikacije ni ključa API</string>
|
||||||
<string id="NoAPIKey">V nastavitvah aplikacije ni ključa API</string>
|
<string id="NoApiUrl" scope="glance">V nastavitvah aplikacije ni URL-ja API-ja</string>
|
||||||
<string id="NoApiUrl">V nastavitvah aplikacije ni URL-ja API-ja</string>
|
<string id="NoConfigUrl" scope="glance">V nastavitvah aplikacije ni konfiguracijskega URL-ja</string>
|
||||||
<string id="NoConfigUrl">V nastavitvah aplikacije ni konfiguracijskega URL-ja</string>
|
|
||||||
<string id="ApiFlood">API klici so prehitri. Prosim, upočasnite svoje zahteve.</string>
|
<string id="ApiFlood">API klici so prehitri. Prosim, upočasnite svoje zahteve.</string>
|
||||||
<string id="ApiUrlNotFound">URL-ja ni bilo mogoče najti. Morebitna napaka URL-ja API-ja v nastavitvah.</string>
|
<string id="ApiUrlNotFound">URL-ja ni bilo mogoče najti. Morebitna napaka URL-ja API-ja v nastavitvah.</string>
|
||||||
<string id="ConfigUrlNotFound">URL-ja ni bilo mogoče najti. Morebitna napaka URL-ja konfiguracije v nastavitvah.</string>
|
<string id="ConfigUrlNotFound">URL-ja ni bilo mogoče najti. Morebitna napaka URL-ja konfiguracije v nastavitvah.</string>
|
||||||
|
<string id="NoJson">Zahteva HTTP ni vrnila JSON.</string>
|
||||||
<string id="UnhandledHttpErr">Zahteva HTTP je vrnila kodo napake =</string>
|
<string id="UnhandledHttpErr">Zahteva HTTP je vrnila kodo napake =</string>
|
||||||
<string id="TrailingSlashErr">URL API-ja ne sme imeti končne poševnice '/'</string>
|
<string id="TrailingSlashErr">URL API-ja ne sme imeti končne poševnice '/'</string>
|
||||||
<string id="FetchingMenuConfig">Pridobivanje konfiguracije menija..</string>
|
<string id="Available" scope="glance">Na voljo</string>
|
||||||
<string id="ExitViewTouch">Povlecite v desno za izhod\nDotaknite se, da ostanete</string>
|
<string id="Checking" scope="glance">Preverjanje ...</string>
|
||||||
<string id="ExitViewButtons">Pritisnite Nazaj za izhod\nVstopite, da ostanete</string>
|
<string id="Unavailable" scope="glance">Ni na voljo</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Nekonfigurirano</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">meni</string>
|
||||||
<!-- Za nastavitve GUI -->
|
<!-- Za nastavitve GUI -->
|
||||||
<string id="SettingsApiKey">API ključ za HomeAssistant.</string>
|
<string id="SettingsApiKey">API ključ za HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Dolgoživ dostopni žeton.</string>
|
<string id="SettingsApiKeyPrompt">Dolgoživ dostopni žeton.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Po tem času (v sekundah) se potrditveno pogovorno okno za dejanje samodejno zapre in dejanje je preklicano. Nastavite na 0, da onemogočite časovno omejitev.</string>
|
<string id="SettingsConfirmTimeout">Po tem času (v sekundah) se potrditveno pogovorno okno za dejanje samodejno zapre in dejanje je preklicano. Nastavite na 0, da onemogočite časovno omejitev.</string>
|
||||||
<string id="SettingsUi">Predstavljanje tipov z ikonami (izklopljeno) ali z oznakami (vklopljeno).</string>
|
<string id="SettingsUi">Predstavljanje tipov z ikonami (izklopljeno) ali z oznakami (vklopljeno).</string>
|
||||||
<string id="SettingsTextAlign">Leva (izklopljena) ali desna (vklopljena) poravnava menija.</string>
|
<string id="SettingsTextAlign">Leva (izklopljena) ali desna (vklopljena) poravnava menija.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Samo pripomoček) Samodejno zaženite aplikacijo iz pripomočka, ne da bi čakali na dotik.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Grifo</string>
|
<string id="MenuItemTap">Grifo</string>
|
||||||
<string id="MenuItemMenu">Menú</string>
|
<string id="MenuItemMenu">Menú</string>
|
||||||
<string id="Confirm">¿Seguro?</string>
|
<string id="Confirm">¿Seguro?</string>
|
||||||
<string id="NoPhone">Sin conexión telefónica</string>
|
<string id="NoPhone" scope="glance">Sin conexión telefónica</string>
|
||||||
<string id="NoInternet">Sin conexión a Internet</string>
|
<string id="NoInternet">Sin conexión a Internet</string>
|
||||||
<string id="NoResponse">No hay respuesta, verifique la conexión a Internet</string>
|
<string id="NoResponse">No hay respuesta, verifique la conexión a Internet</string>
|
||||||
<string id="NoMenu">Error de recuperación del menú</string>
|
<string id="NoAPIKey" scope="glance">Sin clave API en la configuración de la aplicación</string>
|
||||||
<string id="NoAPIKey">Sin clave API en la configuración de la aplicación</string>
|
<string id="NoApiUrl" scope="glance">No hay URL de API en la configuración de la aplicación</string>
|
||||||
<string id="NoApiUrl">No hay URL de API en la configuración de la aplicación</string>
|
<string id="NoConfigUrl" scope="glance">No hay URL de configuración en la configuración de la aplicación.</string>
|
||||||
<string id="NoConfigUrl">No hay URL de configuración en la configuración de la aplicación.</string>
|
|
||||||
<string id="ApiFlood">Llamadas API demasiado rápidas. Por favor, ralentice sus solicitudes.</string>
|
<string id="ApiFlood">Llamadas API demasiado rápidas. Por favor, ralentice sus solicitudes.</string>
|
||||||
<string id="ApiUrlNotFound">URL no encontrada. Posible error de URL de API en la configuración.</string>
|
<string id="ApiUrlNotFound">URL no encontrada. Posible error de URL de API en la configuración.</string>
|
||||||
<string id="ConfigUrlNotFound">URL no encontrada. Posible error de URL de configuración en la configuración.</string>
|
<string id="ConfigUrlNotFound">URL no encontrada. Posible error de URL de configuración en la configuración.</string>
|
||||||
|
<string id="NoJson">No se devolvió ningún JSON de la solicitud HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">La solicitud HTTP devolvió el código de error =</string>
|
<string id="UnhandledHttpErr">La solicitud HTTP devolvió el código de error =</string>
|
||||||
<string id="TrailingSlashErr">La URL de API no debe tener una barra diagonal '/'</string>
|
<string id="TrailingSlashErr">La URL de API no debe tener una barra diagonal '/'</string>
|
||||||
<string id="FetchingMenuConfig">Obteniendo configuración del menú..</string>
|
<string id="Available" scope="glance">Disponible</string>
|
||||||
<string id="ExitViewTouch">Desliza hacia la derecha para salir\nToca para permanecer</string>
|
<string id="Checking" scope="glance">Comprobación...</string>
|
||||||
<string id="ExitViewButtons">Presione Atrás para salir\nEntrar para permanecer</string>
|
<string id="Unavailable" scope="glance">Indisponible</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Desconfigurado</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menú</string>
|
||||||
<!-- Para la configuración GUI -->
|
<!-- Para la configuración GUI -->
|
||||||
<string id="SettingsApiKey">Clave API para HomeAssistant.</string>
|
<string id="SettingsApiKey">Clave API para HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Token de acceso de larga duración.</string>
|
<string id="SettingsApiKeyPrompt">Token de acceso de larga duración.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Después de este tiempo (en segundos), se cierra automáticamente un cuadro de diálogo de confirmación de una acción y se cancela la acción. Establezca en 0 para desactivar el tiempo de espera.</string>
|
<string id="SettingsConfirmTimeout">Después de este tiempo (en segundos), se cierra automáticamente un cuadro de diálogo de confirmación de una acción y se cancela la acción. Establezca en 0 para desactivar el tiempo de espera.</string>
|
||||||
<string id="SettingsUi">Representando tipos con iconos (apagados) o con etiquetas (encendido).</string>
|
<string id="SettingsUi">Representando tipos con iconos (apagados) o con etiquetas (encendido).</string>
|
||||||
<string id="SettingsTextAlign">Alineación del menú izquierda (desactivada) o derecha (activada).</string>
|
<string id="SettingsTextAlign">Alineación del menú izquierda (desactivada) o derecha (activada).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Solo widget) Inicia automáticamente la aplicación desde el widget sin esperar un toque.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,28 +25,31 @@
|
|||||||
<string id="MenuItemTap">Knacka</string>
|
<string id="MenuItemTap">Knacka</string>
|
||||||
<string id="MenuItemMenu">Meny</string>
|
<string id="MenuItemMenu">Meny</string>
|
||||||
<string id="Confirm">Säker?</string>
|
<string id="Confirm">Säker?</string>
|
||||||
<string id="NoPhone">Ingen telefonanslutning</string>
|
<string id="NoPhone" scope="glance">Ingen telefonanslutning</string>
|
||||||
<string id="NoInternet">Ingen internetanslutning</string>
|
<string id="NoInternet">Ingen internetanslutning</string>
|
||||||
<string id="NoResponse">Inget svar, kontrollera internetanslutningen</string>
|
<string id="NoResponse">Inget svar, kontrollera internetanslutningen</string>
|
||||||
<string id="NoMenu">Menyhämtningsfel</string>
|
<string id="NoAPIKey" scope="glance">Ingen API-nyckel i applikationsinställningarna</string>
|
||||||
<string id="NoAPIKey">Ingen API-nyckel i applikationsinställningarna</string>
|
<string id="NoApiUrl" scope="glance">Ingen API-URL i applikationsinställningarna</string>
|
||||||
<string id="NoApiUrl">Ingen API-URL i applikationsinställningarna</string>
|
<string id="NoConfigUrl" scope="glance">Ingen konfigurations-URL i programinställningarna</string>
|
||||||
<string id="NoConfigUrl">Ingen konfigurations-URL i programinställningarna</string>
|
|
||||||
<string id="ApiFlood">API-anrop för snabba. Vänligen sakta ner dina förfrågningar.</string>
|
<string id="ApiFlood">API-anrop för snabba. Vänligen sakta ner dina förfrågningar.</string>
|
||||||
<string id="ApiUrlNotFound">Webbadressen hittades inte. Potentiellt API-URL-fel i inställningarna.</string>
|
<string id="ApiUrlNotFound">Webbadressen hittades inte. Potentiellt API-URL-fel i inställningarna.</string>
|
||||||
<string id="ConfigUrlNotFound">Webbadressen hittades inte. Potentiellt konfigurations-URL-fel i inställningarna.</string>
|
<string id="ConfigUrlNotFound">Webbadressen hittades inte. Potentiellt konfigurations-URL-fel i inställningarna.</string>
|
||||||
|
<string id="NoJson">Ingen JSON returnerades från HTTP-begäran.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP-begäran returnerade felkod =</string>
|
<string id="UnhandledHttpErr">HTTP-begäran returnerade felkod =</string>
|
||||||
<string id="TrailingSlashErr">API-URL får inte ha ett snedstreck '/'</string>
|
<string id="TrailingSlashErr">API-URL får inte ha ett snedstreck '/'</string>
|
||||||
<string id="FetchingMenuConfig">Hämtar menykonfiguration..</string>
|
<string id="Available" scope="glance">Tillgängliga</string>
|
||||||
<string id="ExitViewTouch">Svep åt höger för att avsluta\nKnacka för att stanna</string>
|
<string id="Checking" scope="glance">Kontroll...</string>
|
||||||
<string id="ExitViewButtons">Tryck på Tillbaka för att avsluta\nEnter för att stanna</string>
|
<string id="Unavailable" scope="glance">Inte tillgänglig</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Okonfigurerad</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Meny</string>
|
||||||
<!-- För inställningar GUI -->
|
<!-- För inställningar GUI -->
|
||||||
<string id="SettingsApiKey">API-nyckel för HomeAssistant.</string>
|
<string id="SettingsApiKey">API-nyckel för HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Långlivad åtkomsttoken.</string>
|
<string id="SettingsApiKeyPrompt">Långlivad åtkomsttoken.</string>
|
||||||
<string id="SettingsApiUrl">URL för HomeAssistant API.</string>
|
<string id="SettingsApiUrl">URL för HomeAssistant API.</string>
|
||||||
<string id="SettingsConfigUrl">URL för menykonfiguration (JSON).</string>
|
<string id="SettingsConfigUrl">URL för menykonfiguration (JSON).</string>
|
||||||
<string id="SettingsAppTimeout">Timeout på sekunder. Avsluta programmet efter denna period av inaktivitet för att spara enhetens batteri.</string>
|
<string id="SettingsAppTimeout">Timeout i sekunder. Avsluta programmet efter denna period av inaktivitet för att spara enhetens batteri.</string>
|
||||||
<string id="SettingsConfirmTimeout">Efter denna tid (i sekunder) stängs en bekräftelsedialog för en åtgärd automatiskt och åtgärden avbryts. Ställ in på 0 för att inaktivera timeout.</string>
|
<string id="SettingsConfirmTimeout">Efter denna tid (i sekunder) stängs en bekräftelsedialog för en åtgärd automatiskt och åtgärden avbryts. Ställ in på 0 för att inaktivera timeout.</string>
|
||||||
<string id="SettingsUi">Representerar typer med ikoner (av) eller med etiketter (på).</string>
|
<string id="SettingsUi">Representerar typer med ikoner (av) eller med etiketter (på).</string>
|
||||||
<string id="SettingsTextAlign">Vänster (av) eller höger (på) menyjustering.</string>
|
<string id="SettingsTextAlign">Vänster (av) eller höger (på) menyjustering.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Endast widget) Starta programmet automatiskt från widgeten utan att vänta på ett tryck.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">แตะ</string>
|
<string id="MenuItemTap">แตะ</string>
|
||||||
<string id="MenuItemMenu">เมนู</string>
|
<string id="MenuItemMenu">เมนู</string>
|
||||||
<string id="Confirm">แน่นอน?</string>
|
<string id="Confirm">แน่นอน?</string>
|
||||||
<string id="NoPhone">ไม่มีการเชื่อมต่อโทรศัพท์</string>
|
<string id="NoPhone" scope="glance">ไม่มีการเชื่อมต่อโทรศัพท์</string>
|
||||||
<string id="NoInternet">ไม่มีการเชื่อมต่ออินเทอร์เน็ต</string>
|
<string id="NoInternet">ไม่มีการเชื่อมต่ออินเทอร์เน็ต</string>
|
||||||
<string id="NoResponse">ไม่มีการตอบสนอง ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต</string>
|
<string id="NoResponse">ไม่มีการตอบสนอง ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต</string>
|
||||||
<string id="NoMenu">เมนูดึงข้อมูลผิดพลาด</string>
|
<string id="NoAPIKey" scope="glance">ไม่มีคีย์ API ในการตั้งค่าแอปพลิเคชัน</string>
|
||||||
<string id="NoAPIKey">ไม่มีคีย์ API ในการตั้งค่าแอปพลิเคชัน</string>
|
<string id="NoApiUrl" scope="glance">ไม่มี URL API ในการตั้งค่าแอปพลิเคชัน</string>
|
||||||
<string id="NoApiUrl">ไม่มี URL API ในการตั้งค่าแอปพลิเคชัน</string>
|
<string id="NoConfigUrl" scope="glance">ไม่มี URL การกำหนดค่าในการตั้งค่าแอปพลิเคชัน</string>
|
||||||
<string id="NoConfigUrl">ไม่มี URL การกำหนดค่าในการตั้งค่าแอปพลิเคชัน</string>
|
|
||||||
<string id="ApiFlood">การเรียก API เร็วเกินไป กรุณาชะลอคำขอของคุณ</string>
|
<string id="ApiFlood">การเรียก API เร็วเกินไป กรุณาชะลอคำขอของคุณ</string>
|
||||||
<string id="ApiUrlNotFound">ไม่พบ URL ข้อผิดพลาด URL API ที่อาจเกิดขึ้นในการตั้งค่า</string>
|
<string id="ApiUrlNotFound">ไม่พบ URL ข้อผิดพลาด URL API ที่อาจเกิดขึ้นในการตั้งค่า</string>
|
||||||
<string id="ConfigUrlNotFound">ไม่พบ URL ข้อผิดพลาด URL การกำหนดค่าที่อาจเกิดขึ้นในการตั้งค่า</string>
|
<string id="ConfigUrlNotFound">ไม่พบ URL ข้อผิดพลาด URL การกำหนดค่าที่อาจเกิดขึ้นในการตั้งค่า</string>
|
||||||
|
<string id="NoJson">ไม่มี JSON ที่ส่งคืนจากคำขอ HTTP</string>
|
||||||
<string id="UnhandledHttpErr">คำขอ HTTP ส่งคืนรหัสข้อผิดพลาด =</string>
|
<string id="UnhandledHttpErr">คำขอ HTTP ส่งคืนรหัสข้อผิดพลาด =</string>
|
||||||
<string id="TrailingSlashErr">URL ของ API ต้องไม่มีเครื่องหมายทับต่อท้าย '/'</string>
|
<string id="TrailingSlashErr">URL ของ API ต้องไม่มีเครื่องหมายทับต่อท้าย '/'</string>
|
||||||
<string id="FetchingMenuConfig">กำลังดึงข้อมูลการกำหนดค่าเมนู..</string>
|
<string id="Available" scope="glance">มีอยู่</string>
|
||||||
<string id="ExitViewTouch">ปัดไปทางขวาเพื่อออก\nแตะเพื่ออยู่ต่อ</string>
|
<string id="Checking" scope="glance">กำลังตรวจสอบ...</string>
|
||||||
<string id="ExitViewButtons">กดกลับเพื่อออก\nเข้าไปเพื่ออยู่ต่อ</string>
|
<string id="Unavailable" scope="glance">ไม่พร้อมใช้งาน</string>
|
||||||
|
<string id="Unconfigured" scope="glance">ไม่ได้กำหนดค่า</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">เมนู</string>
|
||||||
<!-- สำหรับการตั้งค่า GUI -->
|
<!-- สำหรับการตั้งค่า GUI -->
|
||||||
<string id="SettingsApiKey">คีย์ API สำหรับ HomeAssistant</string>
|
<string id="SettingsApiKey">คีย์ API สำหรับ HomeAssistant</string>
|
||||||
<string id="SettingsApiKeyPrompt">โทเค็นการเข้าถึงที่มีอายุการใช้งานยาวนาน</string>
|
<string id="SettingsApiKeyPrompt">โทเค็นการเข้าถึงที่มีอายุการใช้งานยาวนาน</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">หลังจากเวลานี้ (เป็นวินาที) กล่องโต้ตอบการยืนยันสำหรับการดำเนินการจะปิดโดยอัตโนมัติและการดำเนินการจะถูกยกเลิก ตั้งค่าเป็น 0 เพื่อปิดใช้งานการหมดเวลา</string>
|
<string id="SettingsConfirmTimeout">หลังจากเวลานี้ (เป็นวินาที) กล่องโต้ตอบการยืนยันสำหรับการดำเนินการจะปิดโดยอัตโนมัติและการดำเนินการจะถูกยกเลิก ตั้งค่าเป็น 0 เพื่อปิดใช้งานการหมดเวลา</string>
|
||||||
<string id="SettingsUi">เป็นตัวแทนประเภทด้วยไอคอน (ปิด) หรือมีป้ายกำกับ (เปิด)</string>
|
<string id="SettingsUi">เป็นตัวแทนประเภทด้วยไอคอน (ปิด) หรือมีป้ายกำกับ (เปิด)</string>
|
||||||
<string id="SettingsTextAlign">การจัดตำแหน่งเมนูซ้าย (ปิด) หรือขวา (เปิด)</string>
|
<string id="SettingsTextAlign">การจัดตำแหน่งเมนูซ้าย (ปิด) หรือขวา (เปิด)</string>
|
||||||
|
<string id="SettingsWidgetStart">(วิดเจ็ตเท่านั้น) เริ่มแอปพลิเคชันโดยอัตโนมัติจากวิดเจ็ตโดยไม่ต้องรอการแตะ</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,28 +25,31 @@
|
|||||||
<string id="MenuItemTap">Musluk</string>
|
<string id="MenuItemTap">Musluk</string>
|
||||||
<string id="MenuItemMenu">Menü</string>
|
<string id="MenuItemMenu">Menü</string>
|
||||||
<string id="Confirm">Elbette?</string>
|
<string id="Confirm">Elbette?</string>
|
||||||
<string id="NoPhone">Telefon bağlantısı yok</string>
|
<string id="NoPhone" scope="glance">Telefon bağlantısı yok</string>
|
||||||
<string id="NoInternet">İnternet bağlantısı yok</string>
|
<string id="NoInternet">İnternet bağlantısı yok</string>
|
||||||
<string id="NoResponse">Yanıt Yok, İnternet bağlantısını kontrol edin</string>
|
<string id="NoResponse">Yanıt Yok, İnternet bağlantısını kontrol edin</string>
|
||||||
<string id="NoMenu">Menü Alma Hatası</string>
|
<string id="NoAPIKey" scope="glance">Uygulama ayarlarında API anahtarı yok</string>
|
||||||
<string id="NoAPIKey">Uygulama ayarlarında API anahtarı yok</string>
|
<string id="NoApiUrl" scope="glance">Uygulama ayarlarında API URL'si yok</string>
|
||||||
<string id="NoApiUrl">Uygulama ayarlarında API URL'si yok</string>
|
<string id="NoConfigUrl" scope="glance">Uygulama ayarlarında yapılandırma URL'si yok</string>
|
||||||
<string id="NoConfigUrl">Uygulama ayarlarında yapılandırma URL'si yok</string>
|
|
||||||
<string id="ApiFlood">API çağrıları çok hızlı. Lütfen isteklerinizi yavaşlatın.</string>
|
<string id="ApiFlood">API çağrıları çok hızlı. Lütfen isteklerinizi yavaşlatın.</string>
|
||||||
<string id="ApiUrlNotFound">URL bulunamadı. Ayarlarda olası API URL hatası.</string>
|
<string id="ApiUrlNotFound">URL bulunamadı. Ayarlarda olası API URL hatası.</string>
|
||||||
<string id="ConfigUrlNotFound">URL bulunamadı. Ayarlarda Olası Yapılandırma URL'si hatası.</string>
|
<string id="ConfigUrlNotFound">URL bulunamadı. Ayarlarda Olası Yapılandırma URL'si hatası.</string>
|
||||||
|
<string id="NoJson">HTTP isteğinden JSON döndürülmedi.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP isteği hata kodunu döndürdü =</string>
|
<string id="UnhandledHttpErr">HTTP isteği hata kodunu döndürdü =</string>
|
||||||
<string id="TrailingSlashErr">API URL'sinin sonunda eğik çizgi '/' olmamalıdır</string>
|
<string id="TrailingSlashErr">API URL'sinin sonunda eğik çizgi '/' olmamalıdır</string>
|
||||||
<string id="FetchingMenuConfig">Menü Yapılandırması alınıyor..</string>
|
<string id="Available" scope="glance">Mevcut</string>
|
||||||
<string id="ExitViewTouch">Çıkmak için Sağa Kaydırın\nKalmak için Dokunun</string>
|
<string id="Checking" scope="glance">Kontrol etme...</string>
|
||||||
<string id="ExitViewButtons">Çıkış için Geri tuşuna basın\nKalmak için Enter'a basın</string>
|
<string id="Unavailable" scope="glance">Kullanım dışı</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Yapılandırılmamış</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menü</string>
|
||||||
<!-- Ayarlar GUI'si için -->
|
<!-- Ayarlar GUI'si için -->
|
||||||
<string id="SettingsApiKey">HomeAssistant için API Anahtarı.</string>
|
<string id="SettingsApiKey">HomeAssistant için API Anahtarı.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Uzun Ömürlü Erişim Jetonu.</string>
|
<string id="SettingsApiKeyPrompt">Uzun Ömürlü Erişim Jetonu.</string>
|
||||||
<string id="SettingsApiUrl">HomeAssistant API'sinin URL'si.</string>
|
<string id="SettingsApiUrl">HomeAssistant API'sinin URL'si.</string>
|
||||||
<string id="SettingsConfigUrl">Menü yapılandırmasının URL'si (JSON).</string>
|
<string id="SettingsConfigUrl">Menü yapılandırmasının URL'si (JSON).</string>
|
||||||
<string id="SettingsAppTimeout">Saniye cinsinden zaman aşımı. Cihazın pilinden tasarruf etmek için bu süre boyunca işlem yapılmadığında uygulamadan çıkın.</string>
|
<string id="SettingsAppTimeout">Saniye cinsinden zaman aşımı. Cihazın pilinden tasarruf etmek için bu süre boyunca işlem yapılmadığında uygulamadan çıkın.</string>
|
||||||
<string id="SettingsConfirmTimeout">Bu sürenin sonunda (saniye olarak), bir eyleme ilişkin onay iletişim kutusu otomatik olarak kapatılır ve eylem iptal edilir. Zaman aşımını devre dışı bırakmak için 0'a ayarlayın.</string>
|
<string id="SettingsConfirmTimeout">Bu sürenin sonunda (saniye cinsinden), bir eyleme ilişkin onay iletişim kutusu otomatik olarak kapatılır ve eylem iptal edilir. Zaman aşımını devre dışı bırakmak için 0'a ayarlayın.</string>
|
||||||
<string id="SettingsUi">Türleri simgelerle (kapalı) veya etiketlerle (açık) temsil etme.</string>
|
<string id="SettingsUi">Türleri simgelerle (kapalı) veya etiketlerle (açık) temsil etme.</string>
|
||||||
<string id="SettingsTextAlign">Sol (kapalı) veya Sağ (açık) Menü Hizalaması.</string>
|
<string id="SettingsTextAlign">Sol (kapalı) veya Sağ (açık) Menü Hizalaması.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Yalnızca Widget) Dokunmayı beklemeden uygulamayı widget'tan otomatik olarak başlatın.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Торкніться</string>
|
<string id="MenuItemTap">Торкніться</string>
|
||||||
<string id="MenuItemMenu">Меню</string>
|
<string id="MenuItemMenu">Меню</string>
|
||||||
<string id="Confirm">Зрозуміло?</string>
|
<string id="Confirm">Зрозуміло?</string>
|
||||||
<string id="NoPhone">Немає телефонного зв'язку</string>
|
<string id="NoPhone" scope="glance">Немає телефонного зв'язку</string>
|
||||||
<string id="NoInternet">Немає підключення до Інтернету</string>
|
<string id="NoInternet">Немає підключення до Інтернету</string>
|
||||||
<string id="NoResponse">Немає відповіді, перевірте підключення до Інтернету</string>
|
<string id="NoResponse">Немає відповіді, перевірте підключення до Інтернету</string>
|
||||||
<string id="NoMenu">Помилка вибірки меню</string>
|
<string id="NoAPIKey" scope="glance">У налаштуваннях програми немає ключа API</string>
|
||||||
<string id="NoAPIKey">У налаштуваннях програми немає ключа API</string>
|
<string id="NoApiUrl" scope="glance">У налаштуваннях програми немає URL-адреси API</string>
|
||||||
<string id="NoApiUrl">У налаштуваннях програми немає URL-адреси API</string>
|
<string id="NoConfigUrl" scope="glance">У налаштуваннях програми немає URL-адреси конфігурації</string>
|
||||||
<string id="NoConfigUrl">У налаштуваннях програми немає URL-адреси конфігурації</string>
|
|
||||||
<string id="ApiFlood">Надто швидкі виклики API. Будь ласка, сповільніть свої запити.</string>
|
<string id="ApiFlood">Надто швидкі виклики API. Будь ласка, сповільніть свої запити.</string>
|
||||||
<string id="ApiUrlNotFound">URL не знайдено. Потенційна помилка URL-адреси API в налаштуваннях.</string>
|
<string id="ApiUrlNotFound">URL не знайдено. Потенційна помилка URL-адреси API в налаштуваннях.</string>
|
||||||
<string id="ConfigUrlNotFound">URL не знайдено. Потенційна помилка URL-адреси конфігурації в налаштуваннях.</string>
|
<string id="ConfigUrlNotFound">URL не знайдено. Потенційна помилка URL-адреси конфігурації в налаштуваннях.</string>
|
||||||
|
<string id="NoJson">Запит HTTP не повертає JSON.</string>
|
||||||
<string id="UnhandledHttpErr">Запит HTTP повернув код помилки =</string>
|
<string id="UnhandledHttpErr">Запит HTTP повернув код помилки =</string>
|
||||||
<string id="TrailingSlashErr">URL-адреса API не повинна містити косу риску '/'</string>
|
<string id="TrailingSlashErr">URL-адреса API не повинна містити косу риску '/'</string>
|
||||||
<string id="FetchingMenuConfig">Отримання конфігурації меню..</string>
|
<string id="Available" scope="glance">в наявності</string>
|
||||||
<string id="ExitViewTouch">Проведіть праворуч, щоб вийти\nТоркніться, щоб залишитися</string>
|
<string id="Checking" scope="glance">Перевірка...</string>
|
||||||
<string id="ExitViewButtons">Натисніть «Назад», щоб вийти\nВведіть, щоб залишитися</string>
|
<string id="Unavailable" scope="glance">Недоступний</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Неналаштований</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Меню</string>
|
||||||
<!-- Для налаштування GUI -->
|
<!-- Для налаштування GUI -->
|
||||||
<string id="SettingsApiKey">Ключ API для HomeAssistant.</string>
|
<string id="SettingsApiKey">Ключ API для HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Довговічний маркер доступу.</string>
|
<string id="SettingsApiKeyPrompt">Довговічний маркер доступу.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Після закінчення цього часу (у секундах) діалогове вікно підтвердження дії автоматично закривається, а дія скасовується. Встановіть 0, щоб вимкнути тайм-аут.</string>
|
<string id="SettingsConfirmTimeout">Після закінчення цього часу (у секундах) діалогове вікно підтвердження дії автоматично закривається, а дія скасовується. Встановіть 0, щоб вимкнути тайм-аут.</string>
|
||||||
<string id="SettingsUi">Представлення типів піктограмами (вимкнено) або мітками (увімкнено).</string>
|
<string id="SettingsUi">Представлення типів піктограмами (вимкнено) або мітками (увімкнено).</string>
|
||||||
<string id="SettingsTextAlign">Ліворуч (вимкнено) або праворуч (увімкнено) вирівнювання меню.</string>
|
<string id="SettingsTextAlign">Ліворуч (вимкнено) або праворуч (увімкнено) вирівнювання меню.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Лише віджет) Автоматично запускайте програму з віджета, не чекаючи дотику.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Vỗ nhẹ</string>
|
<string id="MenuItemTap">Vỗ nhẹ</string>
|
||||||
<string id="MenuItemMenu">Thực đơn</string>
|
<string id="MenuItemMenu">Thực đơn</string>
|
||||||
<string id="Confirm">Chắc chắn?</string>
|
<string id="Confirm">Chắc chắn?</string>
|
||||||
<string id="NoPhone">Không có kết nối điện thoại</string>
|
<string id="NoPhone" scope="glance">Không có kết nối điện thoại</string>
|
||||||
<string id="NoInternet">Không có kết nối Internet</string>
|
<string id="NoInternet">Không có kết nối Internet</string>
|
||||||
<string id="NoResponse">Không có phản hồi, kiểm tra kết nối Internet</string>
|
<string id="NoResponse">Không có phản hồi, kiểm tra kết nối Internet</string>
|
||||||
<string id="NoMenu">Lỗi tìm nạp menu</string>
|
<string id="NoAPIKey" scope="glance">Không có khóa API trong cài đặt ứng dụng</string>
|
||||||
<string id="NoAPIKey">Không có khóa API trong cài đặt ứng dụng</string>
|
<string id="NoApiUrl" scope="glance">Không có URL API trong cài đặt ứng dụng</string>
|
||||||
<string id="NoApiUrl">Không có URL API trong cài đặt ứng dụng</string>
|
<string id="NoConfigUrl" scope="glance">Không có URL cấu hình trong cài đặt ứng dụng</string>
|
||||||
<string id="NoConfigUrl">Không có URL cấu hình trong cài đặt ứng dụng</string>
|
|
||||||
<string id="ApiFlood">Cuộc gọi API quá nhanh. Hãy làm chậm yêu cầu của bạn.</string>
|
<string id="ApiFlood">Cuộc gọi API quá nhanh. Hãy làm chậm yêu cầu của bạn.</string>
|
||||||
<string id="ApiUrlNotFound">Không tìm thấy URL. Lỗi URL API tiềm ẩn trong cài đặt.</string>
|
<string id="ApiUrlNotFound">Không tìm thấy URL. Lỗi URL API tiềm ẩn trong cài đặt.</string>
|
||||||
<string id="ConfigUrlNotFound">Không tìm thấy URL. Lỗi URL cấu hình tiềm ẩn trong cài đặt.</string>
|
<string id="ConfigUrlNotFound">Không tìm thấy URL. Lỗi URL cấu hình tiềm ẩn trong cài đặt.</string>
|
||||||
|
<string id="NoJson">Không có JSON nào được trả về từ yêu cầu HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">Yêu cầu HTTP trả về mã lỗi =</string>
|
<string id="UnhandledHttpErr">Yêu cầu HTTP trả về mã lỗi =</string>
|
||||||
<string id="TrailingSlashErr">URL API không được có dấu gạch chéo ở cuối '/'</string>
|
<string id="TrailingSlashErr">URL API không được có dấu gạch chéo ở cuối '/'</string>
|
||||||
<string id="FetchingMenuConfig">Đang tìm nạp cấu hình menu..</string>
|
<string id="Available" scope="glance">Có sẵn</string>
|
||||||
<string id="ExitViewTouch">Vuốt sang phải để thoát\nNhấn để ở lại</string>
|
<string id="Checking" scope="glance">Đang kiểm tra...</string>
|
||||||
<string id="ExitViewButtons">Nhấn Quay lại để thoát\nNhập để ở lại</string>
|
<string id="Unavailable" scope="glance">Không có sẵn</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Chưa được định cấu hình</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Thực đơn</string>
|
||||||
<!-- Đối với GUI cài đặt -->
|
<!-- Đối với GUI cài đặt -->
|
||||||
<string id="SettingsApiKey">Khóa API cho HomeAssistant.</string>
|
<string id="SettingsApiKey">Khóa API cho HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Mã thông báo truy cập tồn tại lâu dài.</string>
|
<string id="SettingsApiKeyPrompt">Mã thông báo truy cập tồn tại lâu dài.</string>
|
||||||
@@ -47,6 +49,7 @@
|
|||||||
<string id="SettingsConfigUrl">URL cho cấu hình menu (JSON).</string>
|
<string id="SettingsConfigUrl">URL cho cấu hình menu (JSON).</string>
|
||||||
<string id="SettingsAppTimeout">Thời gian chờ tính bằng giây. Thoát khỏi ứng dụng sau khoảng thời gian không hoạt động này để tiết kiệm pin cho thiết bị.</string>
|
<string id="SettingsAppTimeout">Thời gian chờ tính bằng giây. Thoát khỏi ứng dụng sau khoảng thời gian không hoạt động này để tiết kiệm pin cho thiết bị.</string>
|
||||||
<string id="SettingsConfirmTimeout">Sau thời gian này (tính bằng giây), hộp thoại xác nhận cho một hành động sẽ tự động đóng và hành động đó sẽ bị hủy. Đặt thành 0 để tắt thời gian chờ.</string>
|
<string id="SettingsConfirmTimeout">Sau thời gian này (tính bằng giây), hộp thoại xác nhận cho một hành động sẽ tự động đóng và hành động đó sẽ bị hủy. Đặt thành 0 để tắt thời gian chờ.</string>
|
||||||
<string id="SettingsUi">Thể hiện các loại bằng biểu tượng (tắt) hoặc bằng nhãn (bật).</string>
|
<string id="SettingsUi">Biểu diễn các loại bằng biểu tượng (tắt) hoặc bằng nhãn (bật).</string>
|
||||||
<string id="SettingsTextAlign">Căn chỉnh menu Trái (tắt) hoặc Phải (bật).</string>
|
<string id="SettingsTextAlign">Căn chỉnh menu Trái (tắt) hoặc Phải (bật).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Chỉ tiện ích) Tự động khởi động ứng dụng từ tiện ích mà không cần chờ nhấn.</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">轻敲</string>
|
<string id="MenuItemTap">轻敲</string>
|
||||||
<string id="MenuItemMenu">菜单</string>
|
<string id="MenuItemMenu">菜单</string>
|
||||||
<string id="Confirm">当然?</string>
|
<string id="Confirm">当然?</string>
|
||||||
<string id="NoPhone">没有电话连接</string>
|
<string id="NoPhone" scope="glance">没有电话连接</string>
|
||||||
<string id="NoInternet">没有网络连接</string>
|
<string id="NoInternet">没有网络连接</string>
|
||||||
<string id="NoResponse">无响应,请检查互联网连接</string>
|
<string id="NoResponse">无响应,请检查互联网连接</string>
|
||||||
<string id="NoMenu">菜单获取错误</string>
|
<string id="NoAPIKey" scope="glance">应用程序设置中没有 API 密钥</string>
|
||||||
<string id="NoAPIKey">应用程序设置中没有 API 密钥</string>
|
<string id="NoApiUrl" scope="glance">应用程序设置中没有 API URL</string>
|
||||||
<string id="NoApiUrl">应用程序设置中没有 API URL</string>
|
<string id="NoConfigUrl" scope="glance">应用程序设置中没有配置 URL</string>
|
||||||
<string id="NoConfigUrl">应用程序设置中没有配置 URL</string>
|
|
||||||
<string id="ApiFlood">API 调用速度太快。请放慢您的请求。</string>
|
<string id="ApiFlood">API 调用速度太快。请放慢您的请求。</string>
|
||||||
<string id="ApiUrlNotFound">找不到网址。设置中可能存在 API URL 错误。</string>
|
<string id="ApiUrlNotFound">找不到网址。设置中可能存在 API URL 错误。</string>
|
||||||
<string id="ConfigUrlNotFound">找不到网址。设置中可能存在配置 URL 错误。</string>
|
<string id="ConfigUrlNotFound">找不到网址。设置中可能存在配置 URL 错误。</string>
|
||||||
|
<string id="NoJson">HTTP 请求未返回 JSON。</string>
|
||||||
<string id="UnhandledHttpErr">HTTP请求返回错误码=</string>
|
<string id="UnhandledHttpErr">HTTP请求返回错误码=</string>
|
||||||
<string id="TrailingSlashErr">API URL 不得有尾部斜杠“/”</string>
|
<string id="TrailingSlashErr">API URL 不得有尾部斜杠“/”</string>
|
||||||
<string id="FetchingMenuConfig">正在获取菜单配置..</string>
|
<string id="Available" scope="glance">可用的</string>
|
||||||
<string id="ExitViewTouch">向右滑动即可退出\n点击即可停留</string>
|
<string id="Checking" scope="glance">检查...</string>
|
||||||
<string id="ExitViewButtons">按回车键退出\n按回车键继续</string>
|
<string id="Unavailable" scope="glance">不可用</string>
|
||||||
|
<string id="Unconfigured" scope="glance">未配置</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">菜单</string>
|
||||||
<!-- 对于设置 GUI -->
|
<!-- 对于设置 GUI -->
|
||||||
<string id="SettingsApiKey">HomeAssistant 的 API 密钥。</string>
|
<string id="SettingsApiKey">HomeAssistant 的 API 密钥。</string>
|
||||||
<string id="SettingsApiKeyPrompt">长期访问令牌。</string>
|
<string id="SettingsApiKeyPrompt">长期访问令牌。</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">在此时间(以秒为单位)之后,操作的确认对话框将自动关闭并取消该操作。设置为 0 以禁用超时。</string>
|
<string id="SettingsConfirmTimeout">在此时间(以秒为单位)之后,操作的确认对话框将自动关闭并取消该操作。设置为 0 以禁用超时。</string>
|
||||||
<string id="SettingsUi">用图标(关闭)或标签(打开)表示类型。</string>
|
<string id="SettingsUi">用图标(关闭)或标签(打开)表示类型。</string>
|
||||||
<string id="SettingsTextAlign">左(关)或右(开)菜单对齐。</string>
|
<string id="SettingsTextAlign">左(关)或右(开)菜单对齐。</string>
|
||||||
|
<string id="SettingsWidgetStart">(仅限小部件)从小部件自动启动应用程序,无需等待点击。</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">輕敲</string>
|
<string id="MenuItemTap">輕敲</string>
|
||||||
<string id="MenuItemMenu">選單</string>
|
<string id="MenuItemMenu">選單</string>
|
||||||
<string id="Confirm">當然?</string>
|
<string id="Confirm">當然?</string>
|
||||||
<string id="NoPhone">沒有電話連接</string>
|
<string id="NoPhone" scope="glance">沒有電話連接</string>
|
||||||
<string id="NoInternet">沒有網路連線</string>
|
<string id="NoInternet">沒有網路連線</string>
|
||||||
<string id="NoResponse">無響應,請檢查互聯網連接</string>
|
<string id="NoResponse">無響應,請檢查互聯網連接</string>
|
||||||
<string id="NoMenu">選單取得錯誤</string>
|
<string id="NoAPIKey" scope="glance">應用程式設定中沒有 API 金鑰</string>
|
||||||
<string id="NoAPIKey">應用程式設定中沒有 API 金鑰</string>
|
<string id="NoApiUrl" scope="glance">應用程式設定中沒有 API URL</string>
|
||||||
<string id="NoApiUrl">應用程式設定中沒有 API URL</string>
|
<string id="NoConfigUrl" scope="glance">應用程式設定中沒有配置 URL</string>
|
||||||
<string id="NoConfigUrl">應用程式設定中沒有配置 URL</string>
|
|
||||||
<string id="ApiFlood">API 呼叫速度太快。請放慢您的請求。</string>
|
<string id="ApiFlood">API 呼叫速度太快。請放慢您的請求。</string>
|
||||||
<string id="ApiUrlNotFound">找不到網址。設定中可能存在 API URL 錯誤。</string>
|
<string id="ApiUrlNotFound">找不到網址。設定中可能存在 API URL 錯誤。</string>
|
||||||
<string id="ConfigUrlNotFound">找不到網址。設定中可能存在配置 URL 錯誤。</string>
|
<string id="ConfigUrlNotFound">找不到網址。設定中可能存在配置 URL 錯誤。</string>
|
||||||
|
<string id="NoJson">HTTP 請求未傳回 JSON。</string>
|
||||||
<string id="UnhandledHttpErr">HTTP請求回傳錯誤碼=</string>
|
<string id="UnhandledHttpErr">HTTP請求回傳錯誤碼=</string>
|
||||||
<string id="TrailingSlashErr">API URL 不得有尾部斜線“/”</string>
|
<string id="TrailingSlashErr">API URL 不得有尾部斜線“/”</string>
|
||||||
<string id="FetchingMenuConfig">正在取得選單配置..</string>
|
<string id="Available" scope="glance">可用的</string>
|
||||||
<string id="ExitViewTouch">向右滑動即可退出\n點選即可停留</string>
|
<string id="Checking" scope="glance">檢查...</string>
|
||||||
<string id="ExitViewButtons">按回車鍵退出\n按回車鍵繼續</string>
|
<string id="Unavailable" scope="glance">不可用</string>
|
||||||
|
<string id="Unconfigured" scope="glance">未配置</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">選單</string>
|
||||||
<!-- 對於設定 GUI -->
|
<!-- 對於設定 GUI -->
|
||||||
<string id="SettingsApiKey">HomeAssistant 的 API 金鑰。</string>
|
<string id="SettingsApiKey">HomeAssistant 的 API 金鑰。</string>
|
||||||
<string id="SettingsApiKeyPrompt">長期訪問令牌。</string>
|
<string id="SettingsApiKeyPrompt">長期訪問令牌。</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">在此時間(以秒為單位)之後,操作的確認對話方塊將自動關閉並取消該操作。設定為 0 以停用逾時。</string>
|
<string id="SettingsConfirmTimeout">在此時間(以秒為單位)之後,操作的確認對話方塊將自動關閉並取消該操作。設定為 0 以停用逾時。</string>
|
||||||
<string id="SettingsUi">用圖示(關閉)或標籤(開啟)表示類型。</string>
|
<string id="SettingsUi">用圖示(關閉)或標籤(開啟)表示類型。</string>
|
||||||
<string id="SettingsTextAlign">左(關)或右(開)選單對齊。</string>
|
<string id="SettingsTextAlign">左(關)或右(開)選單對齊。</string>
|
||||||
|
<string id="SettingsWidgetStart">(僅限小部件)從小部件自動啟動應用程序,無需等待點擊。</string>
|
||||||
</strings>
|
</strings>
|
@@ -25,21 +25,23 @@
|
|||||||
<string id="MenuItemTap">Ketik</string>
|
<string id="MenuItemTap">Ketik</string>
|
||||||
<string id="MenuItemMenu">Menu</string>
|
<string id="MenuItemMenu">Menu</string>
|
||||||
<string id="Confirm">pasti?</string>
|
<string id="Confirm">pasti?</string>
|
||||||
<string id="NoPhone">Tiada sambungan Telefon</string>
|
<string id="NoPhone" scope="glance">Tiada sambungan Telefon</string>
|
||||||
<string id="NoInternet">Tiada sambungan internet</string>
|
<string id="NoInternet">Tiada sambungan internet</string>
|
||||||
<string id="NoResponse">Tiada Respons, semak sambungan Internet</string>
|
<string id="NoResponse">Tiada Respons, semak sambungan Internet</string>
|
||||||
<string id="NoMenu">Ralat Pengambilan Menu</string>
|
<string id="NoAPIKey" scope="glance">Tiada kunci API dalam tetapan aplikasi</string>
|
||||||
<string id="NoAPIKey">Tiada kunci API dalam tetapan aplikasi</string>
|
<string id="NoApiUrl" scope="glance">Tiada URL API dalam tetapan aplikasi</string>
|
||||||
<string id="NoApiUrl">Tiada URL API dalam tetapan aplikasi</string>
|
<string id="NoConfigUrl" scope="glance">Tiada URL konfigurasi dalam tetapan aplikasi</string>
|
||||||
<string id="NoConfigUrl">Tiada URL konfigurasi dalam tetapan aplikasi</string>
|
|
||||||
<string id="ApiFlood">Panggilan API terlalu pantas. Sila perlahankan permintaan anda.</string>
|
<string id="ApiFlood">Panggilan API terlalu pantas. Sila perlahankan permintaan anda.</string>
|
||||||
<string id="ApiUrlNotFound">URL tidak ditemui. Ralat URL API yang berpotensi dalam tetapan.</string>
|
<string id="ApiUrlNotFound">URL tidak ditemui. Ralat URL API yang berpotensi dalam tetapan.</string>
|
||||||
<string id="ConfigUrlNotFound">URL tidak ditemui. Ralat URL Konfigurasi Potensi dalam tetapan.</string>
|
<string id="ConfigUrlNotFound">URL tidak ditemui. Ralat URL Konfigurasi Potensi dalam tetapan.</string>
|
||||||
|
<string id="NoJson">Tiada JSON dikembalikan daripada permintaan HTTP.</string>
|
||||||
<string id="UnhandledHttpErr">Permintaan HTTP mengembalikan kod ralat =</string>
|
<string id="UnhandledHttpErr">Permintaan HTTP mengembalikan kod ralat =</string>
|
||||||
<string id="TrailingSlashErr">URL API tidak boleh mempunyai garis miring '/'</string>
|
<string id="TrailingSlashErr">URL API tidak boleh mempunyai garis miring '/'</string>
|
||||||
<string id="FetchingMenuConfig">Mengambil Konfigurasi Menu..</string>
|
<string id="Available" scope="glance">Tersedia</string>
|
||||||
<string id="ExitViewTouch">Leret ke Kanan untuk Keluar\nKetik untuk Kekal</string>
|
<string id="Checking" scope="glance">Menyemak...</string>
|
||||||
<string id="ExitViewButtons">Tekan Kembali untuk Keluar\nMasuk untuk Kekal</string>
|
<string id="Unavailable" scope="glance">Tidak ada</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Tidak dikonfigurasikan</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menu</string>
|
||||||
<!-- Untuk GUI tetapan -->
|
<!-- Untuk GUI tetapan -->
|
||||||
<string id="SettingsApiKey">Kunci API untuk HomeAssistant.</string>
|
<string id="SettingsApiKey">Kunci API untuk HomeAssistant.</string>
|
||||||
<string id="SettingsApiKeyPrompt">Token Akses Berumur Panjang.</string>
|
<string id="SettingsApiKeyPrompt">Token Akses Berumur Panjang.</string>
|
||||||
@@ -49,4 +51,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">Selepas masa ini (dalam beberapa saat), dialog pengesahan untuk tindakan ditutup secara automatik dan tindakan itu dibatalkan. Tetapkan kepada 0 untuk melumpuhkan tamat masa.</string>
|
<string id="SettingsConfirmTimeout">Selepas masa ini (dalam beberapa saat), dialog pengesahan untuk tindakan ditutup secara automatik dan tindakan itu dibatalkan. Tetapkan kepada 0 untuk melumpuhkan tamat masa.</string>
|
||||||
<string id="SettingsUi">Mewakili jenis dengan ikon (dimatikan) atau dengan label (dihidupkan).</string>
|
<string id="SettingsUi">Mewakili jenis dengan ikon (dimatikan) atau dengan label (dihidupkan).</string>
|
||||||
<string id="SettingsTextAlign">Penjajaran Menu Kiri (mati) atau Kanan (hidup).</string>
|
<string id="SettingsTextAlign">Penjajaran Menu Kiri (mati) atau Kanan (hidup).</string>
|
||||||
|
<string id="SettingsWidgetStart">(Widget sahaja) Mulakan aplikasi secara automatik daripada widget tanpa menunggu satu ketikan.</string>
|
||||||
</strings>
|
</strings>
|
@@ -36,8 +36,22 @@
|
|||||||
-->
|
-->
|
||||||
<property id="confirm_timeout" type="number">3</property>
|
<property id="confirm_timeout" type="number">3</property>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Lean UI vs second level of menu text.
|
||||||
|
-->
|
||||||
<property id="types_representation" type="boolean"></property>
|
<property id="types_representation" type="boolean"></property>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
left to right or right-to-left text. Language dependent.
|
||||||
|
-->
|
||||||
<property id="menu_alignment" type="boolean"></property>
|
<property id="menu_alignment" type="boolean"></property>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Widget specific setting:
|
||||||
|
As soon as the menu has been fetched start show the menu of items.
|
||||||
|
This behaviour is inconsistent with the standard Garmin User Interface, but has been
|
||||||
|
requested by users so has been made the non-default option.
|
||||||
|
-->
|
||||||
|
<property id="widget_start_no_tap" type="boolean"></property>
|
||||||
|
|
||||||
</properties>
|
</properties>
|
||||||
|
@@ -81,4 +81,13 @@
|
|||||||
/>
|
/>
|
||||||
</setting>
|
</setting>
|
||||||
|
|
||||||
|
<setting
|
||||||
|
propertyKey="@Properties.widget_start_no_tap"
|
||||||
|
title="@Strings.SettingsWidgetStart"
|
||||||
|
>
|
||||||
|
<settingConfig
|
||||||
|
type="boolean"
|
||||||
|
/>
|
||||||
|
</setting>
|
||||||
|
|
||||||
</settings>
|
</settings>
|
||||||
|
@@ -19,21 +19,23 @@
|
|||||||
<string id="MenuItemTap">Tap</string>
|
<string id="MenuItemTap">Tap</string>
|
||||||
<string id="MenuItemMenu">Menu</string>
|
<string id="MenuItemMenu">Menu</string>
|
||||||
<string id="Confirm">Sure?</string>
|
<string id="Confirm">Sure?</string>
|
||||||
<string id="NoPhone">No Phone connection</string>
|
<string id="NoPhone" scope="glance">No Phone connection</string>
|
||||||
<string id="NoInternet">No Internet connection</string>
|
<string id="NoInternet">No Internet connection</string>
|
||||||
<string id="NoResponse">No Response, check Internet connection</string>
|
<string id="NoResponse">No Response, check Internet connection</string>
|
||||||
<string id="NoMenu">Menu Fetch Error</string>
|
<string id="NoAPIKey" scope="glance">No API key in the application settings</string>
|
||||||
<string id="NoAPIKey">No API key in the application settings</string>
|
<string id="NoApiUrl" scope="glance">No API URL in the application settings</string>
|
||||||
<string id="NoApiUrl">No API URL in the application settings</string>
|
<string id="NoConfigUrl" scope="glance">No configuration URL in the application settings</string>
|
||||||
<string id="NoConfigUrl">No configuration URL in the application settings</string>
|
|
||||||
<string id="ApiFlood">API calls too rapid. Please slow down your requests.</string>
|
<string id="ApiFlood">API calls too rapid. Please slow down your requests.</string>
|
||||||
<string id="ApiUrlNotFound">URL not found. Potential API URL error in settings.</string>
|
<string id="ApiUrlNotFound">URL not found. Potential API URL error in settings.</string>
|
||||||
<string id="ConfigUrlNotFound">URL not found. Potential Configuration URL error in settings.</string>
|
<string id="ConfigUrlNotFound">URL not found. Potential Configuration URL error in settings.</string>
|
||||||
|
<string id="NoJson">No JSON returned from HTTP request.</string>
|
||||||
<string id="UnhandledHttpErr">HTTP request returned error code = </string>
|
<string id="UnhandledHttpErr">HTTP request returned error code = </string>
|
||||||
<string id="TrailingSlashErr">API URL must not have a trailing slash '/'</string>
|
<string id="TrailingSlashErr">API URL must not have a trailing slash '/'</string>
|
||||||
<string id="FetchingMenuConfig">Fetching Menu Config..</string>
|
<string id="Available" scope="glance">Available</string>
|
||||||
<string id="ExitViewTouch">Swipe to Right to Exit\nTap to Stay</string>
|
<string id="Checking" scope="glance">Checking...</string>
|
||||||
<string id="ExitViewButtons">Hit Back to Exit\nEnter to Stay</string>
|
<string id="Unavailable" scope="glance">Unavailable</string>
|
||||||
|
<string id="Unconfigured" scope="glance">Unconfigured</string>
|
||||||
|
<string id="GlanceMenu" scope="glance">Menu</string>
|
||||||
|
|
||||||
<!-- For the settings GUI -->
|
<!-- For the settings GUI -->
|
||||||
<string id="SettingsApiKey">API Key for HomeAssistant.</string>
|
<string id="SettingsApiKey">API Key for HomeAssistant.</string>
|
||||||
@@ -44,4 +46,5 @@
|
|||||||
<string id="SettingsConfirmTimeout">After this time (in seconds), a confirmation dialog for an action is automatically closed and the action is cancelled. Set to 0 to disable the timeout.</string>
|
<string id="SettingsConfirmTimeout">After this time (in seconds), a confirmation dialog for an action is automatically closed and the action is cancelled. Set to 0 to disable the timeout.</string>
|
||||||
<string id="SettingsUi">Representing types with icons (off) or with labels (on).</string>
|
<string id="SettingsUi">Representing types with icons (off) or with labels (on).</string>
|
||||||
<string id="SettingsTextAlign">Left (off) or Right (on) Menu Alignment.</string>
|
<string id="SettingsTextAlign">Left (off) or Right (on) Menu Alignment.</string>
|
||||||
|
<string id="SettingsWidgetStart">(Widget only) Automatically start the application from the widget without waiting for a tap.</string>
|
||||||
</strings>
|
</strings>
|
||||||
|
@@ -27,40 +27,39 @@ using Toybox.Graphics;
|
|||||||
using Toybox.WatchUi;
|
using Toybox.WatchUi;
|
||||||
using Toybox.Timer;
|
using Toybox.Timer;
|
||||||
|
|
||||||
const bRadius = 10;
|
|
||||||
|
|
||||||
class Alert extends WatchUi.View {
|
class Alert extends WatchUi.View {
|
||||||
private var mTimer;
|
private static const bRadius = 10;
|
||||||
private var mTimeout;
|
private var mTimer as Timer.Timer;
|
||||||
private var mText;
|
private var mTimeout as Lang.Number;
|
||||||
private var mFont;
|
private var mText as Lang.String;
|
||||||
private var mFgcolor;
|
private var mFont as Graphics.FontType;
|
||||||
private var mBgcolor;
|
private var mFgcolor as Graphics.ColorType;
|
||||||
|
private var mBgcolor as Graphics.ColorType;
|
||||||
|
|
||||||
function initialize(params as Lang.Dictionary) {
|
function initialize(params as Lang.Dictionary) {
|
||||||
View.initialize();
|
View.initialize();
|
||||||
|
|
||||||
mText = params.get(:text);
|
mText = params.get(:text) as Lang.String;
|
||||||
if (mText == null) {
|
if (mText == null) {
|
||||||
mText = "Alert";
|
mText = "Alert";
|
||||||
}
|
}
|
||||||
|
|
||||||
mFont = params.get(:font);
|
mFont = params.get(:font) as Graphics.FontType;
|
||||||
if (mFont == null) {
|
if (mFont == null) {
|
||||||
mFont = Graphics.FONT_MEDIUM;
|
mFont = Graphics.FONT_MEDIUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
mFgcolor = params.get(:fgcolor);
|
mFgcolor = params.get(:fgcolor) as Graphics.ColorType;
|
||||||
if (mFgcolor == null) {
|
if (mFgcolor == null) {
|
||||||
mFgcolor = Graphics.COLOR_BLACK;
|
mFgcolor = Graphics.COLOR_BLACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
mBgcolor = params.get(:bgcolor);
|
mBgcolor = params.get(:bgcolor) as Graphics.ColorType;
|
||||||
if (mBgcolor == null) {
|
if (mBgcolor == null) {
|
||||||
mBgcolor = Graphics.COLOR_WHITE;
|
mBgcolor = Graphics.COLOR_WHITE;
|
||||||
}
|
}
|
||||||
|
|
||||||
mTimeout = params.get(:timeout);
|
mTimeout = params.get(:timeout) as Lang.Number;
|
||||||
if (mTimeout == null) {
|
if (mTimeout == null) {
|
||||||
mTimeout = 2000;
|
mTimeout = 2000;
|
||||||
}
|
}
|
||||||
@@ -84,7 +83,7 @@ class Alert extends WatchUi.View {
|
|||||||
var bX = (dc.getWidth() - bWidth) / 2;
|
var bX = (dc.getWidth() - bWidth) / 2;
|
||||||
var bY = (dc.getHeight() - bHeight) / 2;
|
var bY = (dc.getHeight() - bHeight) / 2;
|
||||||
|
|
||||||
if(dc has :setAntiAlias) {
|
if (dc has :setAntiAlias) {
|
||||||
dc.setAntiAlias(true);
|
dc.setAntiAlias(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,30 +112,30 @@ class Alert extends WatchUi.View {
|
|||||||
|
|
||||||
// Remove the alert from view, usually on user input, but that is defined by the calling function.
|
// Remove the alert from view, usually on user input, but that is defined by the calling function.
|
||||||
//
|
//
|
||||||
function dismiss() {
|
function dismiss() as Void {
|
||||||
WatchUi.popView(SLIDE_IMMEDIATE);
|
WatchUi.popView(SLIDE_IMMEDIATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
function pushView(transition) {
|
function pushView(transition) as Void {
|
||||||
WatchUi.pushView(self, new AlertDelegate(self), transition);
|
WatchUi.pushView(self, new AlertDelegate(self), transition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class AlertDelegate extends WatchUi.InputDelegate {
|
class AlertDelegate extends WatchUi.InputDelegate {
|
||||||
hidden var mView;
|
private var mView;
|
||||||
|
|
||||||
function initialize(view) {
|
function initialize(view) {
|
||||||
InputDelegate.initialize();
|
InputDelegate.initialize();
|
||||||
mView = view;
|
mView = view;
|
||||||
}
|
}
|
||||||
|
|
||||||
function onKey(evt) {
|
function onKey(evt) as Lang.Boolean {
|
||||||
mView.dismiss();
|
mView.dismiss();
|
||||||
getApp().getQuitTimer().reset();
|
getApp().getQuitTimer().reset();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTap(evt) {
|
function onTap(evt) as Lang.Boolean {
|
||||||
mView.dismiss();
|
mView.dismiss();
|
||||||
getApp().getQuitTimer().reset();
|
getApp().getQuitTimer().reset();
|
||||||
return true;
|
return true;
|
||||||
|
@@ -33,6 +33,7 @@ using Toybox.Graphics;
|
|||||||
using Toybox.Lang;
|
using Toybox.Lang;
|
||||||
using Toybox.WatchUi;
|
using Toybox.WatchUi;
|
||||||
using Toybox.Communications;
|
using Toybox.Communications;
|
||||||
|
using Toybox.Timer;
|
||||||
|
|
||||||
class ErrorView extends ScalableView {
|
class ErrorView extends ScalableView {
|
||||||
private var mText as Lang.String = "";
|
private var mText as Lang.String = "";
|
||||||
@@ -53,14 +54,12 @@ class ErrorView extends ScalableView {
|
|||||||
mDelegate = new ErrorDelegate(self);
|
mDelegate = new ErrorDelegate(self);
|
||||||
// Convert the settings from % of screen size to pixels
|
// Convert the settings from % of screen size to pixels
|
||||||
mErrorIconMargin = pixelsForScreen(cSettings.get(:errorIconMargin) as Lang.Float);
|
mErrorIconMargin = pixelsForScreen(cSettings.get(:errorIconMargin) as Lang.Float);
|
||||||
|
mErrorIcon = Application.loadResource(Rez.Drawables.ErrorIcon) as Graphics.BitmapResource;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load your resources here
|
// Load your resources here
|
||||||
function onLayout(dc as Graphics.Dc) as Void {
|
function onLayout(dc as Graphics.Dc) as Void {
|
||||||
mErrorIcon = Application.loadResource(Rez.Drawables.ErrorIcon) as Graphics.BitmapResource;
|
|
||||||
|
|
||||||
var w = dc.getWidth();
|
var w = dc.getWidth();
|
||||||
var h = dc.getHeight();
|
|
||||||
|
|
||||||
mTextArea = new WatchUi.TextArea({
|
mTextArea = new WatchUi.TextArea({
|
||||||
:text => mText,
|
:text => mText,
|
||||||
@@ -68,22 +67,21 @@ class ErrorView extends ScalableView {
|
|||||||
:font => Graphics.FONT_XTINY,
|
:font => Graphics.FONT_XTINY,
|
||||||
:justification => Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER,
|
:justification => Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER,
|
||||||
:locX => 0,
|
:locX => 0,
|
||||||
:locY => 83,
|
:locY => pixelsForScreen(20.0),
|
||||||
:width => w,
|
:width => w,
|
||||||
:height => h - 166
|
:height => pixelsForScreen(60.0)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the view
|
// Update the view
|
||||||
function onUpdate(dc as Graphics.Dc) as Void {
|
function onUpdate(dc as Graphics.Dc) as Void {
|
||||||
var w = dc.getWidth();
|
var w = dc.getWidth();
|
||||||
var hw = w/2;
|
|
||||||
if(dc has :setAntiAlias) {
|
if(dc has :setAntiAlias) {
|
||||||
dc.setAntiAlias(true);
|
dc.setAntiAlias(true);
|
||||||
}
|
}
|
||||||
dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_BLUE);
|
dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_BLUE);
|
||||||
dc.clear();
|
dc.clear();
|
||||||
dc.drawBitmap(hw - mErrorIcon.getWidth()/2, mErrorIconMargin, mErrorIcon);
|
dc.drawBitmap(w/2 - mErrorIcon.getWidth()/2, mErrorIconMargin, mErrorIcon);
|
||||||
mTextArea.draw(dc);
|
mTextArea.draw(dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,19 +95,35 @@ class ErrorView extends ScalableView {
|
|||||||
}
|
}
|
||||||
if (!mShown) {
|
if (!mShown) {
|
||||||
instance.setText(text);
|
instance.setText(text);
|
||||||
|
mShown = true;
|
||||||
}
|
}
|
||||||
return [instance, instance.getDelegate()];
|
return [instance, instance.getDelegate()];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create or reuse an existing ErrorView, and pass on the text.
|
// Create or reuse an existing ErrorView, and pass on the text.
|
||||||
static function show(text as Lang.String) as Void {
|
static function show(text as Lang.String) as Void {
|
||||||
create(text); // Ignore returned values
|
|
||||||
if (!mShown) {
|
if (!mShown) {
|
||||||
|
create(text); // Ignore returned values
|
||||||
WatchUi.pushView(instance, instance.getDelegate(), WatchUi.SLIDE_UP);
|
WatchUi.pushView(instance, instance.getDelegate(), WatchUi.SLIDE_UP);
|
||||||
|
// This must be last to avoid a race condition with unShow(), where the
|
||||||
|
// ErrorView can't be dismissed.
|
||||||
mShown = true;
|
mShown = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static function unShow() as Void {
|
||||||
|
if (mShown) {
|
||||||
|
WatchUi.popView(WatchUi.SLIDE_DOWN);
|
||||||
|
// The call to 'updateNextMenuItem()' must be on another thread so that the view is popped above.
|
||||||
|
var myTimer = new Timer.Timer();
|
||||||
|
// Now this feels very "closely coupled" to the application, but it is the most reliable method instead of using a timer.
|
||||||
|
myTimer.start(getApp().method(:updateNextMenuItem), Globals.scApiResume, false);
|
||||||
|
// This must be last to avoid a race condition with show(), where the
|
||||||
|
// ErrorView can't be dismissed.
|
||||||
|
mShown = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Internal show now we're not a static method like 'show()'.
|
// Internal show now we're not a static method like 'show()'.
|
||||||
function setText(text as Lang.String) as Void {
|
function setText(text as Lang.String) as Void {
|
||||||
mText = text;
|
mText = text;
|
||||||
@@ -119,13 +133,6 @@ class ErrorView extends ScalableView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static function unShow() as Void {
|
|
||||||
if (mShown) {
|
|
||||||
mShown = false;
|
|
||||||
WatchUi.popView(WatchUi.SLIDE_DOWN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ErrorDelegate extends WatchUi.BehaviorDelegate {
|
class ErrorDelegate extends WatchUi.BehaviorDelegate {
|
||||||
@@ -134,7 +141,7 @@ class ErrorDelegate extends WatchUi.BehaviorDelegate {
|
|||||||
WatchUi.BehaviorDelegate.initialize();
|
WatchUi.BehaviorDelegate.initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onBack() {
|
function onBack() as Lang.Boolean {
|
||||||
getApp().getQuitTimer().reset();
|
getApp().getQuitTimer().reset();
|
||||||
ErrorView.unShow();
|
ErrorView.unShow();
|
||||||
return true;
|
return true;
|
||||||
|
@@ -26,4 +26,10 @@ class Globals {
|
|||||||
static const scDebug = false;
|
static const scDebug = false;
|
||||||
static const scAlertTimeout = 2000; // ms
|
static const scAlertTimeout = 2000; // ms
|
||||||
static const scTapTimeout = 1000; // ms
|
static const scTapTimeout = 1000; // ms
|
||||||
|
// Time to let the existing HTTP responses get serviced after a
|
||||||
|
// Communications.NETWORK_RESPONSE_OUT_OF_MEMORY response code.
|
||||||
|
static const scApiBackoff = 1000; // ms
|
||||||
|
// Needs to be long enough to enable a "double ESC" to quit the application from
|
||||||
|
// an ErrorView.
|
||||||
|
static const scApiResume = 200; // ms
|
||||||
}
|
}
|
||||||
|
@@ -22,33 +22,45 @@ using Toybox.Application;
|
|||||||
using Toybox.Lang;
|
using Toybox.Lang;
|
||||||
using Toybox.WatchUi;
|
using Toybox.WatchUi;
|
||||||
using Toybox.Application.Properties;
|
using Toybox.Application.Properties;
|
||||||
|
using Toybox.Timer;
|
||||||
|
|
||||||
class HomeAssistantApp extends Application.AppBase {
|
class HomeAssistantApp extends Application.AppBase {
|
||||||
private var mHaMenu as HomeAssistantView or Null;
|
|
||||||
private var mQuitTimer as QuitTimer or Null;
|
|
||||||
private var strNoApiKey as Lang.String or Null;
|
private var strNoApiKey as Lang.String or Null;
|
||||||
private var strNoApiUrl as Lang.String or Null;
|
private var strNoApiUrl as Lang.String or Null;
|
||||||
private var strNoConfigUrl as Lang.String or Null;
|
private var strNoConfigUrl as Lang.String or Null;
|
||||||
private var strNoPhone as Lang.String or Null;
|
private var strNoPhone as Lang.String or Null;
|
||||||
private var strNoInternet as Lang.String or Null;
|
private var strNoInternet as Lang.String or Null;
|
||||||
private var strNoResponse as Lang.String or Null;
|
private var strNoResponse as Lang.String or Null;
|
||||||
private var strNoMenu as Lang.String or Null;
|
|
||||||
private var strApiFlood as Lang.String or Null;
|
private var strApiFlood as Lang.String or Null;
|
||||||
private var strConfigUrlNotFound as Lang.String or Null;
|
private var strConfigUrlNotFound as Lang.String or Null;
|
||||||
|
private var strNoJson as Lang.String or Null;
|
||||||
private var strUnhandledHttpErr as Lang.String or Null;
|
private var strUnhandledHttpErr as Lang.String or Null;
|
||||||
private var strTrailingSlashErr as Lang.String or Null;
|
private var strTrailingSlashErr as Lang.String or Null;
|
||||||
private var mItemsToUpdate; // Array initialised by onReturnFetchMenuConfig()
|
private var strAvailable = WatchUi.loadResource($.Rez.Strings.Available);
|
||||||
private var mNextItemToUpdate = 0; // Index into the above array
|
private var strUnavailable = WatchUi.loadResource($.Rez.Strings.Unavailable);
|
||||||
|
private var strUnconfigured = WatchUi.loadResource($.Rez.Strings.Unconfigured);
|
||||||
|
|
||||||
|
private var mApiKey as Lang.String or Null; // The compiler can't tell these are updated by
|
||||||
|
private var mApiUrl as Lang.String or Null; // initialize(), hence the "or Null".
|
||||||
|
private var mConfigUrl as Lang.String or Null; //
|
||||||
|
private var mApiStatus as Lang.String = WatchUi.loadResource($.Rez.Strings.Checking);
|
||||||
|
private var mMenuStatus as Lang.String = WatchUi.loadResource($.Rez.Strings.Checking);
|
||||||
|
private var mHaMenu as HomeAssistantView or Null;
|
||||||
|
private var mQuitTimer as QuitTimer or Null;
|
||||||
|
private var mTimer as Timer.Timer or Null;
|
||||||
|
private var mItemsToUpdate; // Array initialised by onReturnFetchMenuConfig()
|
||||||
|
private var mNextItemToUpdate = 0; // Index into the above array
|
||||||
|
private var mIsGlance as Lang.Boolean = false;
|
||||||
|
|
||||||
function initialize() {
|
function initialize() {
|
||||||
AppBase.initialize();
|
AppBase.initialize();
|
||||||
|
onSettingsChanged();
|
||||||
// ATTENTION when adding stuff into this block:
|
// ATTENTION when adding stuff into this block:
|
||||||
// Because of the >>GlanceView<<, it should contain only
|
// Because of the >>GlanceView<<, it should contain only
|
||||||
// code, which is used as well for the glance:
|
// code, which is used as well for the glance:
|
||||||
// - https://developer.garmin.com/connect-iq/core-topics/glances/
|
// - https://developer.garmin.com/connect-iq/core-topics/glances/
|
||||||
//
|
//
|
||||||
// Also dealing with resources "Rez" needs attention, too. See
|
// Also dealing with resources "Rez" needs attention, too. See
|
||||||
// "Resource Scopes":
|
// "Resource Scopes":
|
||||||
// - https://developer.garmin.com/connect-iq/core-topics/resources/
|
// - https://developer.garmin.com/connect-iq/core-topics/resources/
|
||||||
//
|
//
|
||||||
@@ -58,12 +70,13 @@ class HomeAssistantApp extends Application.AppBase {
|
|||||||
|
|
||||||
// onStart() is called on application start up
|
// onStart() is called on application start up
|
||||||
function onStart(state as Lang.Dictionary?) as Void {
|
function onStart(state as Lang.Dictionary?) as Void {
|
||||||
|
AppBase.onStart(state);
|
||||||
// ATTENTION when adding stuff into this block:
|
// ATTENTION when adding stuff into this block:
|
||||||
// Because of the >>GlanceView<<, it should contain only
|
// Because of the >>GlanceView<<, it should contain only
|
||||||
// code, which is used as well for the glance:
|
// code, which is used as well for the glance:
|
||||||
// - https://developer.garmin.com/connect-iq/core-topics/glances/
|
// - https://developer.garmin.com/connect-iq/core-topics/glances/
|
||||||
//
|
//
|
||||||
// Also dealing with resources "Rez" needs attention, too. See
|
// Also dealing with resources "Rez" needs attention, too. See
|
||||||
// "Resource Scopes":
|
// "Resource Scopes":
|
||||||
// - https://developer.garmin.com/connect-iq/core-topics/resources/
|
// - https://developer.garmin.com/connect-iq/core-topics/resources/
|
||||||
//
|
//
|
||||||
@@ -73,12 +86,13 @@ class HomeAssistantApp extends Application.AppBase {
|
|||||||
|
|
||||||
// onStop() is called when your application is exiting
|
// onStop() is called when your application is exiting
|
||||||
function onStop(state as Lang.Dictionary?) as Void {
|
function onStop(state as Lang.Dictionary?) as Void {
|
||||||
|
AppBase.onStop(state);
|
||||||
// ATTENTION when adding stuff into this block:
|
// ATTENTION when adding stuff into this block:
|
||||||
// Because of the >>GlanceView<<, it should contain only
|
// Because of the >>GlanceView<<, it should contain only
|
||||||
// code, which is used as well for the glance:
|
// code, which is used as well for the glance:
|
||||||
// - https://developer.garmin.com/connect-iq/core-topics/glances/
|
// - https://developer.garmin.com/connect-iq/core-topics/glances/
|
||||||
//
|
//
|
||||||
// Also dealing with resources "Rez" needs attention, too. See
|
// Also dealing with resources "Rez" needs attention, too. See
|
||||||
// "Resource Scopes":
|
// "Resource Scopes":
|
||||||
// - https://developer.garmin.com/connect-iq/core-topics/resources/
|
// - https://developer.garmin.com/connect-iq/core-topics/resources/
|
||||||
//
|
//
|
||||||
@@ -88,38 +102,35 @@ class HomeAssistantApp extends Application.AppBase {
|
|||||||
|
|
||||||
// Return the initial view of your application here
|
// Return the initial view of your application here
|
||||||
function getInitialView() as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>? {
|
function getInitialView() as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>? {
|
||||||
|
|
||||||
strNoApiKey = WatchUi.loadResource($.Rez.Strings.NoAPIKey);
|
strNoApiKey = WatchUi.loadResource($.Rez.Strings.NoAPIKey);
|
||||||
strNoApiUrl = WatchUi.loadResource($.Rez.Strings.NoApiUrl);
|
strNoApiUrl = WatchUi.loadResource($.Rez.Strings.NoApiUrl);
|
||||||
strNoConfigUrl = WatchUi.loadResource($.Rez.Strings.NoConfigUrl);
|
strNoConfigUrl = WatchUi.loadResource($.Rez.Strings.NoConfigUrl);
|
||||||
strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
|
strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
|
||||||
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
|
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
|
||||||
strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
|
strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
|
||||||
strNoMenu = WatchUi.loadResource($.Rez.Strings.NoMenu);
|
|
||||||
strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
|
strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
|
||||||
strConfigUrlNotFound = WatchUi.loadResource($.Rez.Strings.ConfigUrlNotFound);
|
strConfigUrlNotFound = WatchUi.loadResource($.Rez.Strings.ConfigUrlNotFound);
|
||||||
|
strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson);
|
||||||
strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
|
strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
|
||||||
strTrailingSlashErr = WatchUi.loadResource($.Rez.Strings.TrailingSlashErr);
|
strTrailingSlashErr = WatchUi.loadResource($.Rez.Strings.TrailingSlashErr);
|
||||||
mQuitTimer = new QuitTimer();
|
mQuitTimer = new QuitTimer();
|
||||||
|
|
||||||
var api_url = Properties.getValue("api_url") as Lang.String;
|
if (mApiKey.length() == 0) {
|
||||||
|
|
||||||
if ((Properties.getValue("api_key") as Lang.String).length() == 0) {
|
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantApp getInitialView(): No API key in the application settings.");
|
System.println("HomeAssistantApp getInitialView(): No API key in the application settings.");
|
||||||
}
|
}
|
||||||
return ErrorView.create(strNoApiKey + ".");
|
return ErrorView.create(strNoApiKey + ".");
|
||||||
} else if (api_url.length() == 0) {
|
} else if (mApiUrl.length() == 0) {
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantApp getInitialView(): No API URL in the application settings.");
|
System.println("HomeAssistantApp getInitialView(): No API URL in the application settings.");
|
||||||
}
|
}
|
||||||
return ErrorView.create(strNoApiUrl + ".");
|
return ErrorView.create(strNoApiUrl + ".");
|
||||||
} else if (api_url.substring(-1, api_url.length()).equals("/")) {
|
} else if (mApiUrl.substring(-1, mApiUrl.length()).equals("/")) {
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantApp getInitialView(): API URL must not have a trailing slash '/'.");
|
System.println("HomeAssistantApp getInitialView(): API URL must not have a trailing slash '/'.");
|
||||||
}
|
}
|
||||||
return ErrorView.create(strTrailingSlashErr + ".");
|
return ErrorView.create(strTrailingSlashErr + ".");
|
||||||
} else if ((Properties.getValue("config_url") as Lang.String).length() == 0) {
|
} else if (mConfigUrl.length() == 0) {
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantApp getInitialView(): No configuration URL in the application settings.");
|
System.println("HomeAssistantApp getInitialView(): No configuration URL in the application settings.");
|
||||||
}
|
}
|
||||||
@@ -136,79 +147,293 @@ class HomeAssistantApp extends Application.AppBase {
|
|||||||
return ErrorView.create(strNoInternet + ".");
|
return ErrorView.create(strNoInternet + ".");
|
||||||
} else {
|
} else {
|
||||||
fetchMenuConfig();
|
fetchMenuConfig();
|
||||||
return [new RootView(self), new RootViewDelegate(self)] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
|
fetchApiStatus();
|
||||||
|
if (WidgetApp.isWidget) {
|
||||||
|
return [new RootView(self), new RootViewDelegate(self)] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
|
||||||
|
} else {
|
||||||
|
return [new WatchUi.View(), new WatchUi.BehaviorDelegate()] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Callback function after completing the GET request to fetch the configuration menu.
|
// Callback function after completing the GET request to fetch the configuration menu.
|
||||||
//
|
//
|
||||||
|
(:glance)
|
||||||
function onReturnFetchMenuConfig(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void {
|
function onReturnFetchMenuConfig(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void {
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: " + responseCode);
|
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: " + responseCode);
|
||||||
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Data: " + data);
|
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Data: " + data);
|
||||||
}
|
}
|
||||||
if (responseCode == Communications.BLE_HOST_TIMEOUT || responseCode == Communications.BLE_CONNECTION_UNAVAILABLE) {
|
|
||||||
if (Globals.scDebug) {
|
mMenuStatus = strUnavailable;
|
||||||
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
switch (responseCode) {
|
||||||
}
|
case Communications.BLE_HOST_TIMEOUT:
|
||||||
ErrorView.show(strNoPhone + ".");
|
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
||||||
} else if (responseCode == Communications.BLE_QUEUE_FULL) {
|
if (Globals.scDebug) {
|
||||||
if (Globals.scDebug) {
|
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
||||||
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
}
|
||||||
}
|
if (!mIsGlance) {
|
||||||
// Don't need to worry about multiple ErrorViews here as the fetch does not happen a second time.
|
ErrorView.show(strNoPhone + ".");
|
||||||
ErrorView.show(strApiFlood);
|
}
|
||||||
} else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) {
|
break;
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
case Communications.BLE_QUEUE_FULL:
|
||||||
}
|
if (Globals.scDebug) {
|
||||||
ErrorView.show(strNoResponse);
|
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
||||||
} else if (responseCode == 404) {
|
}
|
||||||
if (Globals.scDebug) {
|
if (!mIsGlance) {
|
||||||
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: 404, page not found. Check Configuration URL setting.");
|
ErrorView.show(strApiFlood);
|
||||||
}
|
}
|
||||||
ErrorView.show(strConfigUrlNotFound);
|
break;
|
||||||
} else if (responseCode == 200) {
|
|
||||||
mHaMenu = new HomeAssistantView(data, null);
|
case Communications.NETWORK_REQUEST_TIMED_OUT:
|
||||||
mQuitTimer.begin();
|
if (Globals.scDebug) {
|
||||||
pushHomeAssistantMenuView();
|
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
||||||
mItemsToUpdate = mHaMenu.getItemsToUpdate();
|
}
|
||||||
// Start the continuous update process that continues for as long as the application is running.
|
if (!mIsGlance) {
|
||||||
// The chain of functions from 'updateNextMenuItem()' calls 'updateNextMenuItem()' on completion.
|
ErrorView.show(strNoResponse);
|
||||||
if (mItemsToUpdate.size() > 0) {
|
}
|
||||||
updateNextMenuItem();
|
break;
|
||||||
}
|
|
||||||
} else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) {
|
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantApp onReturnFetchMenuConfig(): Network request timeout.");
|
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
|
||||||
}
|
}
|
||||||
ErrorView.show(strNoMenu + ". " + strNoInternet + "?");
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(strNoJson);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: 404, page not found. Check Configuration URL setting.");
|
||||||
|
}
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(strConfigUrlNotFound);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 200:
|
||||||
|
mMenuStatus = strAvailable;
|
||||||
|
if (!mIsGlance) {
|
||||||
|
mHaMenu = new HomeAssistantView(data, null);
|
||||||
|
mQuitTimer.begin();
|
||||||
|
if (Properties.getValue("widget_start_no_tap")) {
|
||||||
|
// As soon as the menu has been fetched start show the menu of items.
|
||||||
|
// This behaviour is inconsistent with the standard Garmin User Interface, but has been
|
||||||
|
// requested by users so has been made the non-default option.
|
||||||
|
pushHomeAssistantMenuView();
|
||||||
|
}
|
||||||
|
mItemsToUpdate = mHaMenu.getItemsToUpdate();
|
||||||
|
// Start the continuous update process that continues for as long as the application is running.
|
||||||
|
// The chain of functions from 'updateNextMenuItem()' calls 'updateNextMenuItem()' on completion.
|
||||||
|
if (mItemsToUpdate.size() > 0) {
|
||||||
|
updateNextMenuItem();
|
||||||
|
}
|
||||||
|
if (!WidgetApp.isWidget) {
|
||||||
|
WatchUi.switchToView(mHaMenu, new HomeAssistantViewDelegate(false), WatchUi.SLIDE_IMMEDIATE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantApp onReturnFetchMenuConfig(): Unhandled HTTP response code = " + responseCode);
|
||||||
|
}
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(strUnhandledHttpErr + responseCode);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
WatchUi.requestUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
(:glance)
|
||||||
|
function fetchMenuConfig() as Void {
|
||||||
|
if (mConfigUrl.equals("")) {
|
||||||
|
mMenuStatus = strUnconfigured;
|
||||||
|
WatchUi.requestUpdate();
|
||||||
} else {
|
} else {
|
||||||
if (Globals.scDebug) {
|
var options = {
|
||||||
System.println("HomeAssistantApp onReturnFetchMenuConfig(): Unhandled HTTP response code = " + responseCode);
|
:method => Communications.HTTP_REQUEST_METHOD_GET,
|
||||||
|
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
|
||||||
|
};
|
||||||
|
if (! System.getDeviceSettings().phoneConnected) {
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem getState(): No Phone connection, skipping API call.");
|
||||||
|
}
|
||||||
|
if (mIsGlance) {
|
||||||
|
WatchUi.requestUpdate();
|
||||||
|
} else {
|
||||||
|
ErrorView.show(strNoPhone + ".");
|
||||||
|
}
|
||||||
|
mMenuStatus = strUnavailable;
|
||||||
|
} else if (! System.getDeviceSettings().connectionAvailable) {
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem getState(): No Internet connection, skipping API call.");
|
||||||
|
}
|
||||||
|
if (mIsGlance) {
|
||||||
|
WatchUi.requestUpdate();
|
||||||
|
} else {
|
||||||
|
ErrorView.show(strNoInternet + ".");
|
||||||
|
}
|
||||||
|
mMenuStatus = strUnavailable;
|
||||||
|
} else {
|
||||||
|
Communications.makeWebRequest(
|
||||||
|
mConfigUrl,
|
||||||
|
null,
|
||||||
|
options,
|
||||||
|
method(:onReturnFetchMenuConfig)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
ErrorView.show(strUnhandledHttpErr + responseCode );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function fetchMenuConfig() as Void {
|
// Callback function after completing the GET request to fetch the API status.
|
||||||
var options = {
|
//
|
||||||
:method => Communications.HTTP_REQUEST_METHOD_GET,
|
(:glance)
|
||||||
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
|
function onReturnFetchApiStatus(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void {
|
||||||
};
|
if (Globals.scDebug) {
|
||||||
Communications.makeWebRequest(
|
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: " + responseCode);
|
||||||
Properties.getValue("config_url"),
|
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Data: " + data);
|
||||||
null,
|
}
|
||||||
options,
|
|
||||||
method(:onReturnFetchMenuConfig)
|
mApiStatus = strUnavailable;
|
||||||
);
|
switch (responseCode) {
|
||||||
|
case Communications.BLE_HOST_TIMEOUT:
|
||||||
|
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
||||||
|
}
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(strNoPhone + ".");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Communications.BLE_QUEUE_FULL:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
||||||
|
}
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(strApiFlood);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Communications.NETWORK_REQUEST_TIMED_OUT:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
||||||
|
}
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(strNoResponse);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
|
||||||
|
}
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(strNoJson);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: 404, page not found. Check Configuration URL setting.");
|
||||||
|
}
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(strConfigUrlNotFound);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 200:
|
||||||
|
var msg = null;
|
||||||
|
if (data != null) {
|
||||||
|
msg = data.get("message");
|
||||||
|
}
|
||||||
|
if (msg.equals("API running.")) {
|
||||||
|
mApiStatus = strAvailable;
|
||||||
|
} else {
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show("API " + mApiStatus + ".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantApp onReturnFetchApiStatus(): Unhandled HTTP response code = " + responseCode);
|
||||||
|
}
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(strUnhandledHttpErr + responseCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WatchUi.requestUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
function homeAssistantMenuIsLoaded() as Lang.Boolean{
|
(:glance)
|
||||||
return mHaMenu!=null;
|
function fetchApiStatus() as Void {
|
||||||
|
if (mApiUrl.equals("")) {
|
||||||
|
mApiStatus = strUnconfigured;
|
||||||
|
WatchUi.requestUpdate();
|
||||||
|
} else {
|
||||||
|
var options = {
|
||||||
|
:method => Communications.HTTP_REQUEST_METHOD_GET,
|
||||||
|
:headers => {
|
||||||
|
"Authorization" => "Bearer " + mApiKey
|
||||||
|
},
|
||||||
|
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
|
||||||
|
};
|
||||||
|
if (! System.getDeviceSettings().phoneConnected) {
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem getState(): No Phone connection, skipping API call.");
|
||||||
|
}
|
||||||
|
mApiStatus = strUnavailable;
|
||||||
|
if (mIsGlance) {
|
||||||
|
WatchUi.requestUpdate();
|
||||||
|
} else {
|
||||||
|
ErrorView.show(strNoPhone + ".");
|
||||||
|
}
|
||||||
|
} else if (! System.getDeviceSettings().connectionAvailable) {
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem getState(): No Internet connection, skipping API call.");
|
||||||
|
}
|
||||||
|
mApiStatus = strUnavailable;
|
||||||
|
if (mIsGlance) {
|
||||||
|
WatchUi.requestUpdate();
|
||||||
|
} else {
|
||||||
|
ErrorView.show(strNoInternet + ".");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Communications.makeWebRequest(
|
||||||
|
mApiUrl + "/",
|
||||||
|
null,
|
||||||
|
options,
|
||||||
|
method(:onReturnFetchApiStatus)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function pushHomeAssistantMenuView() as Void{
|
function setApiStatus(s as Lang.String) {
|
||||||
|
mApiStatus = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
(:glance)
|
||||||
|
function getApiStatus() as Lang.String {
|
||||||
|
return mApiStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
(:glance)
|
||||||
|
function getMenuStatus() as Lang.String {
|
||||||
|
return mMenuStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isHomeAssistantMenuLoaded() as Lang.Boolean {
|
||||||
|
return mHaMenu != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function pushHomeAssistantMenuView() as Void {
|
||||||
WatchUi.pushView(mHaMenu, new HomeAssistantViewDelegate(true), WatchUi.SLIDE_IMMEDIATE);
|
WatchUi.pushView(mHaMenu, new HomeAssistantViewDelegate(true), WatchUi.SLIDE_IMMEDIATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,17 +441,44 @@ class HomeAssistantApp extends Application.AppBase {
|
|||||||
// This function is called by a timer every Globals.menuItemUpdateInterval ms.
|
// This function is called by a timer every Globals.menuItemUpdateInterval ms.
|
||||||
function updateNextMenuItem() as Void {
|
function updateNextMenuItem() as Void {
|
||||||
var itu = mItemsToUpdate as Lang.Array<HomeAssistantToggleMenuItem>;
|
var itu = mItemsToUpdate as Lang.Array<HomeAssistantToggleMenuItem>;
|
||||||
itu[mNextItemToUpdate].getState();
|
if (itu == null) {
|
||||||
mNextItemToUpdate = (mNextItemToUpdate + 1) % itu.size();
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantApp updateNextMenuItem(): No menu items to update");
|
||||||
|
}
|
||||||
|
if (!mIsGlance) {
|
||||||
|
ErrorView.show(WatchUi.loadResource($.Rez.Strings.ConfigUrlNotFound));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
itu[mNextItemToUpdate].getState();
|
||||||
|
mNextItemToUpdate = (mNextItemToUpdate + 1) % itu.size();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getQuitTimer() as QuitTimer{
|
function getQuitTimer() as QuitTimer {
|
||||||
return mQuitTimer;
|
return mQuitTimer;
|
||||||
}
|
}
|
||||||
|
|
||||||
(:glance)
|
(:glance)
|
||||||
function getGlanceView() {
|
function getGlanceView() as Lang.Array<WatchUi.GlanceView or WatchUi.GlanceViewDelegate> or Null {
|
||||||
return [new HomeAssistantGlanceView()];
|
mIsGlance = true;
|
||||||
|
updateGlance();
|
||||||
|
mTimer = new Timer.Timer();
|
||||||
|
mTimer.start(method(:updateGlance), Globals.scApiBackoff, true);
|
||||||
|
return [new HomeAssistantGlanceView(self)];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Required for the Glance update timer.
|
||||||
|
function updateGlance() as Void {
|
||||||
|
fetchMenuConfig();
|
||||||
|
fetchApiStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace this functionality with a more central settings class as proposed in
|
||||||
|
// https://github.com/house-of-abbey/GarminHomeAssistant/pull/17.
|
||||||
|
function onSettingsChanged() as Void {
|
||||||
|
mApiKey = Properties.getValue("api_key");
|
||||||
|
mApiUrl = Properties.getValue("api_url");
|
||||||
|
mConfigUrl = Properties.getValue("config_url");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,19 +24,86 @@ using Toybox.Graphics;
|
|||||||
|
|
||||||
(:glance)
|
(:glance)
|
||||||
class HomeAssistantGlanceView extends WatchUi.GlanceView {
|
class HomeAssistantGlanceView extends WatchUi.GlanceView {
|
||||||
|
private static const scLeftMargin = 20; // in pixels
|
||||||
|
private static const scLeftIndent = 10; // Left Indent "_text:" in pixels
|
||||||
|
private static const scMidSep = 10; // Middle Separator "text:_text" in pixels
|
||||||
|
private var mApp as HomeAssistantApp;
|
||||||
|
private var mTitle as WatchUi.Text or Null;
|
||||||
|
private var mApiText as WatchUi.Text or Null;
|
||||||
|
private var mApiStatus as WatchUi.Text or Null;
|
||||||
|
private var mMenuText as WatchUi.Text or Null;
|
||||||
|
private var mMenuStatus as WatchUi.Text or Null;
|
||||||
|
|
||||||
private var mText as Lang.String;
|
function initialize(app as HomeAssistantApp) {
|
||||||
|
|
||||||
function initialize() {
|
|
||||||
GlanceView.initialize();
|
GlanceView.initialize();
|
||||||
|
mApp = app;
|
||||||
|
}
|
||||||
|
|
||||||
mText = WatchUi.loadResource($.Rez.Strings.AppName);
|
function onLayout(dc as Graphics.Dc) as Void {
|
||||||
|
var strChecking = WatchUi.loadResource($.Rez.Strings.Checking);
|
||||||
|
var strGlanceMenu = WatchUi.loadResource($.Rez.Strings.GlanceMenu);
|
||||||
|
var h = dc.getHeight();
|
||||||
|
var tw = dc.getTextWidthInPixels(strGlanceMenu, Graphics.FONT_XTINY);
|
||||||
|
|
||||||
|
mTitle = new WatchUi.Text({
|
||||||
|
:text => WatchUi.loadResource($.Rez.Strings.AppName),
|
||||||
|
:color => Graphics.COLOR_WHITE,
|
||||||
|
:font => Graphics.FONT_TINY,
|
||||||
|
:justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER,
|
||||||
|
:locX => scLeftMargin,
|
||||||
|
:locY => 1 * h / 6
|
||||||
|
});
|
||||||
|
|
||||||
|
mApiText = new WatchUi.Text({
|
||||||
|
:text => "API:",
|
||||||
|
:color => Graphics.COLOR_WHITE,
|
||||||
|
:font => Graphics.FONT_XTINY,
|
||||||
|
:justification => Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER,
|
||||||
|
:locX => scLeftMargin + scLeftIndent + tw,
|
||||||
|
:locY => 3 * h / 6
|
||||||
|
});
|
||||||
|
mApiStatus = new WatchUi.Text({
|
||||||
|
:text => strChecking,
|
||||||
|
:color => Graphics.COLOR_WHITE,
|
||||||
|
:font => Graphics.FONT_XTINY,
|
||||||
|
:justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER,
|
||||||
|
:locX => scLeftMargin + scLeftIndent + scMidSep + tw,
|
||||||
|
:locY => 3 * h / 6
|
||||||
|
});
|
||||||
|
mMenuText = new WatchUi.Text({
|
||||||
|
:text => strGlanceMenu + ":",
|
||||||
|
:color => Graphics.COLOR_WHITE,
|
||||||
|
:font => Graphics.FONT_XTINY,
|
||||||
|
:justification => Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER,
|
||||||
|
:locX => scLeftMargin + scLeftIndent + tw,
|
||||||
|
:locY => 5 * h / 6
|
||||||
|
});
|
||||||
|
mMenuStatus = new WatchUi.Text({
|
||||||
|
:text => strChecking,
|
||||||
|
:color => Graphics.COLOR_WHITE,
|
||||||
|
:font => Graphics.FONT_XTINY,
|
||||||
|
:justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER,
|
||||||
|
:locX => scLeftMargin + scLeftIndent + scMidSep + tw,
|
||||||
|
:locY => 5 * h / 6
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onUpdate(dc) as Void {
|
function onUpdate(dc) as Void {
|
||||||
GlanceView.onUpdate(dc);
|
GlanceView.onUpdate(dc);
|
||||||
|
if(dc has :setAntiAlias) {
|
||||||
dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_BLACK);
|
dc.setAntiAlias(true);
|
||||||
dc.drawText(0, dc.getHeight() / 2, Graphics.FONT_TINY, mText, Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER);
|
}
|
||||||
|
dc.setColor(
|
||||||
|
Graphics.COLOR_WHITE,
|
||||||
|
Graphics.COLOR_BLUE
|
||||||
|
);
|
||||||
|
dc.clear();
|
||||||
|
mTitle.draw(dc);
|
||||||
|
mApiText.draw(dc);
|
||||||
|
mApiStatus.setText(mApp.getApiStatus());
|
||||||
|
mApiStatus.draw(dc);
|
||||||
|
mMenuText.draw(dc);
|
||||||
|
mMenuStatus.setText(mApp.getMenuStatus());
|
||||||
|
mMenuStatus.draw(dc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,22 +24,18 @@ using Toybox.Graphics;
|
|||||||
using Toybox.Application.Properties;
|
using Toybox.Application.Properties;
|
||||||
|
|
||||||
class HomeAssistantService {
|
class HomeAssistantService {
|
||||||
private var mApiKey as Lang.String;
|
private var strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
|
||||||
private var strNoPhone as Lang.String;
|
private var strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
|
||||||
private var strNoInternet as Lang.String;
|
private var strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
|
||||||
private var strNoResponse as Lang.String;
|
private var strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson);
|
||||||
private var strApiFlood as Lang.String;
|
private var strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
|
||||||
private var strApiUrlNotFound as Lang.String;
|
private var strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound);
|
||||||
private var strUnhandledHttpErr as Lang.String;
|
private var strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
|
||||||
|
|
||||||
|
private var mApiKey as Lang.String;
|
||||||
|
|
||||||
function initialize() {
|
function initialize() {
|
||||||
strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
|
mApiKey = Properties.getValue("api_key");
|
||||||
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
|
|
||||||
strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
|
|
||||||
strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
|
|
||||||
strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound);
|
|
||||||
strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
|
|
||||||
mApiKey = Properties.getValue("api_key");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Callback function after completing the POST request to call a service.
|
// Callback function after completing the POST request to call a service.
|
||||||
@@ -50,54 +46,79 @@ class HomeAssistantService {
|
|||||||
System.println("HomeAssistantService onReturnCall() Response Code: " + responseCode);
|
System.println("HomeAssistantService onReturnCall() Response Code: " + responseCode);
|
||||||
System.println("HomeAssistantService onReturnCall() Response Data: " + data);
|
System.println("HomeAssistantService onReturnCall() Response Data: " + data);
|
||||||
}
|
}
|
||||||
if (responseCode == Communications.BLE_HOST_TIMEOUT || responseCode == Communications.BLE_CONNECTION_UNAVAILABLE) {
|
|
||||||
if (Globals.scDebug) {
|
switch (responseCode) {
|
||||||
System.println("HomeAssistantService onReturnCall() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
case Communications.BLE_HOST_TIMEOUT:
|
||||||
}
|
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
||||||
ErrorView.show(strNoPhone + ".");
|
if (Globals.scDebug) {
|
||||||
} else if (responseCode == Communications.BLE_QUEUE_FULL) {
|
System.println("HomeAssistantService onReturnCall() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println("HomeAssistantService onReturnCall() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
|
||||||
}
|
|
||||||
// Don't need to worry about multiple ErrorViews here as the call is not on a repeat timer.
|
|
||||||
ErrorView.show(strApiFlood);
|
|
||||||
} else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) {
|
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println("HomeAssistantService onReturnCall() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
|
||||||
}
|
|
||||||
ErrorView.show(strNoResponse);
|
|
||||||
} else if (responseCode == 404) {
|
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println("HomeAssistantService onReturnCall() Response Code: 404, page not found. Check API URL setting.");
|
|
||||||
}
|
|
||||||
ErrorView.show(strApiUrlNotFound);
|
|
||||||
} else if (responseCode == 200) {
|
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println("HomeAssistantService onReturnCall(): Service executed.");
|
|
||||||
}
|
|
||||||
var d = data as Lang.Array;
|
|
||||||
var toast = "Executed";
|
|
||||||
for(var i = 0; i < d.size(); i++) {
|
|
||||||
if ((d[i].get("entity_id") as Lang.String).equals(identifier)) {
|
|
||||||
toast = (d[i].get("attributes") as Lang.Dictionary).get("friendly_name") as Lang.String;
|
|
||||||
}
|
}
|
||||||
}
|
ErrorView.show(strNoPhone + ".");
|
||||||
if (WatchUi has :showToast) {
|
break;
|
||||||
WatchUi.showToast(toast, null);
|
|
||||||
} else {
|
case Communications.BLE_QUEUE_FULL:
|
||||||
new Alert({
|
if (Globals.scDebug) {
|
||||||
:timeout => Globals.scAlertTimeout,
|
System.println("HomeAssistantService onReturnCall() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
||||||
:font => Graphics.FONT_MEDIUM,
|
}
|
||||||
:text => toast,
|
ErrorView.show(strApiFlood);
|
||||||
:fgcolor => Graphics.COLOR_WHITE,
|
break;
|
||||||
:bgcolor => Graphics.COLOR_BLACK
|
|
||||||
}).pushView(WatchUi.SLIDE_IMMEDIATE);
|
case Communications.NETWORK_REQUEST_TIMED_OUT:
|
||||||
}
|
if (Globals.scDebug) {
|
||||||
} else {
|
System.println("HomeAssistantService onReturnCall() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
||||||
if (Globals.scDebug) {
|
}
|
||||||
System.println("HomeAssistantService onReturnCall(): Unhandled HTTP response code = " + responseCode);
|
ErrorView.show(strNoResponse);
|
||||||
}
|
break;
|
||||||
ErrorView.show(strUnhandledHttpErr + responseCode );
|
|
||||||
|
case Communications.NETWORK_RESPONSE_OUT_OF_MEMORY:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantService onReturnCall() Response Code: NETWORK_RESPONSE_OUT_OF_MEMORY, are we going too fast?");
|
||||||
|
}
|
||||||
|
// Ignore and see if we can carry on
|
||||||
|
break;
|
||||||
|
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantService onReturnCall() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
|
||||||
|
}
|
||||||
|
ErrorView.show(strNoJson);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantService onReturnCall() Response Code: 404, page not found. Check API URL setting.");
|
||||||
|
}
|
||||||
|
ErrorView.show(strApiUrlNotFound);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 200:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantService onReturnCall(): Service executed.");
|
||||||
|
}
|
||||||
|
var d = data as Lang.Array;
|
||||||
|
var toast = "Executed";
|
||||||
|
for(var i = 0; i < d.size(); i++) {
|
||||||
|
if ((d[i].get("entity_id") as Lang.String).equals(identifier)) {
|
||||||
|
toast = (d[i].get("attributes") as Lang.Dictionary).get("friendly_name") as Lang.String;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (WatchUi has :showToast) {
|
||||||
|
WatchUi.showToast(toast, null);
|
||||||
|
} else {
|
||||||
|
new Alert({
|
||||||
|
:timeout => Globals.scAlertTimeout,
|
||||||
|
:font => Graphics.FONT_MEDIUM,
|
||||||
|
:text => toast,
|
||||||
|
:fgcolor => Graphics.COLOR_WHITE,
|
||||||
|
:bgcolor => Graphics.COLOR_BLACK
|
||||||
|
}).pushView(WatchUi.SLIDE_IMMEDIATE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantService onReturnCall(): Unhandled HTTP response code = " + responseCode);
|
||||||
|
}
|
||||||
|
ErrorView.show(strUnhandledHttpErr + responseCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -25,13 +25,17 @@ using Toybox.Application.Properties;
|
|||||||
using Toybox.Timer;
|
using Toybox.Timer;
|
||||||
|
|
||||||
class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
||||||
private var mApiKey as Lang.String;
|
private var strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
|
||||||
private var strNoPhone as Lang.String;
|
private var strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
|
||||||
private var strNoInternet as Lang.String;
|
private var strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
|
||||||
private var strNoResponse as Lang.String;
|
private var strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson);
|
||||||
private var strApiFlood as Lang.String;
|
private var strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
|
||||||
private var strApiUrlNotFound as Lang.String;
|
private var strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound);
|
||||||
private var strUnhandledHttpErr as Lang.String;
|
private var strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
|
||||||
|
private var strUnavailable = WatchUi.loadResource($.Rez.Strings.Unavailable);
|
||||||
|
private var strAvailable = WatchUi.loadResource($.Rez.Strings.Available);
|
||||||
|
|
||||||
|
private var mApiKey as Lang.String;
|
||||||
|
|
||||||
function initialize(
|
function initialize(
|
||||||
label as Lang.String or Lang.Symbol,
|
label as Lang.String or Lang.Symbol,
|
||||||
@@ -46,13 +50,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
:icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol
|
:icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol
|
||||||
} or Null
|
} or Null
|
||||||
) {
|
) {
|
||||||
strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
|
mApiKey = Properties.getValue("api_key");
|
||||||
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
|
|
||||||
strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
|
|
||||||
strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
|
|
||||||
strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound);
|
|
||||||
strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
|
|
||||||
mApiKey = Properties.getValue("api_key");
|
|
||||||
WatchUi.ToggleMenuItem.initialize(label, subLabel, identifier, enabled, options);
|
WatchUi.ToggleMenuItem.initialize(label, subLabel, identifier, enabled, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,14 +67,16 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Callback function after completing the GET request to fetch the status.
|
// Callback function after completing the GET request to fetch the status.
|
||||||
|
// Terminate updating the toggle menu items via the chain of calls for a permanent network
|
||||||
|
// error. The ErrorView cancellation will resume the call chain.
|
||||||
//
|
//
|
||||||
function onReturnGetState(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void {
|
function onReturnGetState(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void {
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: " + responseCode);
|
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: " + responseCode);
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Data: " + data);
|
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Data: " + data);
|
||||||
}
|
}
|
||||||
// Provide the ability to terminate updating chain of calls for a permanent network error.
|
|
||||||
var keepUpdating = true;
|
var status = strUnavailable;
|
||||||
switch (responseCode) {
|
switch (responseCode) {
|
||||||
case Communications.BLE_HOST_TIMEOUT:
|
case Communications.BLE_HOST_TIMEOUT:
|
||||||
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
||||||
@@ -85,45 +85,66 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
}
|
}
|
||||||
ErrorView.show(strNoPhone + ".");
|
ErrorView.show(strNoPhone + ".");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Communications.BLE_QUEUE_FULL:
|
case Communications.BLE_QUEUE_FULL:
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
||||||
}
|
}
|
||||||
ErrorView.show(strApiFlood);
|
ErrorView.show(strApiFlood);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Communications.NETWORK_REQUEST_TIMED_OUT:
|
case Communications.NETWORK_REQUEST_TIMED_OUT:
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
||||||
}
|
}
|
||||||
ErrorView.show(strNoResponse);
|
ErrorView.show(strNoResponse);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
|
||||||
|
}
|
||||||
|
ErrorView.show(strNoJson);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Communications.NETWORK_RESPONSE_OUT_OF_MEMORY:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: NETWORK_RESPONSE_OUT_OF_MEMORY, are we going too fast?");
|
||||||
|
}
|
||||||
|
var myTimer = new Timer.Timer();
|
||||||
|
// Now this feels very "closely coupled" to the application, but it is the most reliable method instead of using a timer.
|
||||||
|
myTimer.start(getApp().method(:updateNextMenuItem), Globals.scApiBackoff, false);
|
||||||
|
break;
|
||||||
|
|
||||||
case 404:
|
case 404:
|
||||||
var msg = null;
|
var msg = null;
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
msg = data.get("message");
|
msg = data.get("message");
|
||||||
}
|
}
|
||||||
if (msg != null) {
|
if (msg != null) {
|
||||||
// Should be an HTTP 405 according to curl queries
|
// Should be an HTTP 404 according to curl queries
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: 404. " + mIdentifier + " " + msg);
|
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: 404. " + mIdentifier + " " + msg);
|
||||||
}
|
}
|
||||||
ErrorView.show("HTTP 405, " + mIdentifier + ". " + data.get("message"));
|
ErrorView.show("HTTP 404, " + mIdentifier + ". " + data.get("message"));
|
||||||
} else {
|
} else {
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: 404, page not found. Check API URL setting.");
|
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: 404, page not found. Check API URL setting.");
|
||||||
}
|
}
|
||||||
ErrorView.show(strApiUrlNotFound);
|
ErrorView.show(strApiUrlNotFound);
|
||||||
}
|
}
|
||||||
keepUpdating = false;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 405:
|
case 405:
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: 405. " + mIdentifier + " " + data.get("message"));
|
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: 405. " + mIdentifier + " " + data.get("message"));
|
||||||
}
|
}
|
||||||
ErrorView.show("HTTP 405, " + mIdentifier + ". " + data.get("message"));
|
ErrorView.show("HTTP 405, " + mIdentifier + ". " + data.get("message"));
|
||||||
keepUpdating = false;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 200:
|
case 200:
|
||||||
|
status = strAvailable;
|
||||||
var state = data.get("state") as Lang.String;
|
var state = data.get("state") as Lang.String;
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println((data.get("attributes") as Lang.Dictionary).get("friendly_name") + " State=" + state);
|
System.println((data.get("attributes") as Lang.Dictionary).get("friendly_name") + " State=" + state);
|
||||||
@@ -133,17 +154,17 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
}
|
}
|
||||||
setUiToggle(state);
|
setUiToggle(state);
|
||||||
ErrorView.unShow();
|
ErrorView.unShow();
|
||||||
|
// Now this feels very "closely coupled" to the application, but it is the most reliable method instead of using a timer.
|
||||||
|
getApp().updateNextMenuItem();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnGetState(): Unhandled HTTP response code = " + responseCode);
|
System.println("HomeAssistantToggleMenuItem onReturnGetState(): Unhandled HTTP response code = " + responseCode);
|
||||||
}
|
}
|
||||||
ErrorView.show(strUnhandledHttpErr + responseCode);
|
ErrorView.show(strUnhandledHttpErr + responseCode);
|
||||||
}
|
}
|
||||||
if (keepUpdating) {
|
getApp().setApiStatus(status);
|
||||||
// Now this feels very "closely coupled" to the application, but it is the most reliable method instead of using a timer.
|
|
||||||
getApp().updateNextMenuItem();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getState() as Void {
|
function getState() as Void {
|
||||||
@@ -154,17 +175,18 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
},
|
},
|
||||||
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
|
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
|
||||||
};
|
};
|
||||||
var keepUpdating = true;
|
|
||||||
if (! System.getDeviceSettings().phoneConnected) {
|
if (! System.getDeviceSettings().phoneConnected) {
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantToggleMenuItem getState(): No Phone connection, skipping API call.");
|
System.println("HomeAssistantToggleMenuItem getState(): No Phone connection, skipping API call.");
|
||||||
}
|
}
|
||||||
ErrorView.show(strNoPhone + ".");
|
ErrorView.show(strNoPhone + ".");
|
||||||
|
getApp().setApiStatus(strUnavailable);
|
||||||
} else if (! System.getDeviceSettings().connectionAvailable) {
|
} else if (! System.getDeviceSettings().connectionAvailable) {
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
System.println("HomeAssistantToggleMenuItem getState(): No Internet connection, skipping API call.");
|
System.println("HomeAssistantToggleMenuItem getState(): No Internet connection, skipping API call.");
|
||||||
}
|
}
|
||||||
ErrorView.show(strNoInternet + ".");
|
ErrorView.show(strNoInternet + ".");
|
||||||
|
getApp().setApiStatus(strUnavailable);
|
||||||
} else {
|
} else {
|
||||||
var url = Properties.getValue("api_url") + "/states/" + mIdentifier;
|
var url = Properties.getValue("api_url") + "/states/" + mIdentifier;
|
||||||
if (Globals.scDebug) {
|
if (Globals.scDebug) {
|
||||||
@@ -176,19 +198,6 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
options,
|
options,
|
||||||
method(:onReturnGetState)
|
method(:onReturnGetState)
|
||||||
);
|
);
|
||||||
// The update is called by onReturnGetState() instead
|
|
||||||
keepUpdating = false;
|
|
||||||
}
|
|
||||||
// On temporary failure, keep the updating going.
|
|
||||||
if (keepUpdating) {
|
|
||||||
// Need to avoid an infinite loop where the pushed ErrorView does not appear before getState() is called again
|
|
||||||
// and the call stack overflows. So continue the call chain from somewhere asynchronous.
|
|
||||||
var myTimer = new Timer.Timer();
|
|
||||||
// Now this feels very "closely coupled" to the application, but it is the most reliable method instead of using a timer.
|
|
||||||
myTimer.start(getApp().method(:updateNextMenuItem), 500, false);
|
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println("HomeAssistantToggleMenuItem getState(): Updated failed " + mIdentifier);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,44 +208,67 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: " + responseCode);
|
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: " + responseCode);
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Data: " + data);
|
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Data: " + data);
|
||||||
}
|
}
|
||||||
if (responseCode == Communications.BLE_HOST_TIMEOUT || responseCode == Communications.BLE_CONNECTION_UNAVAILABLE) {
|
|
||||||
if (Globals.scDebug) {
|
var status = strUnavailable;
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
switch (responseCode) {
|
||||||
}
|
case Communications.BLE_HOST_TIMEOUT:
|
||||||
ErrorView.show(strNoPhone + ".");
|
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
||||||
} else if (responseCode == Communications.BLE_QUEUE_FULL) {
|
if (Globals.scDebug) {
|
||||||
if (Globals.scDebug) {
|
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
|
||||||
}
|
|
||||||
ErrorView.show(strApiFlood);
|
|
||||||
} else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) {
|
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
|
||||||
}
|
|
||||||
ErrorView.show(strNoResponse);
|
|
||||||
} else if (responseCode == 404) {
|
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: 404, page not found. Check API URL setting.");
|
|
||||||
}
|
|
||||||
ErrorView.show(strApiUrlNotFound);
|
|
||||||
} else if (responseCode == 200) {
|
|
||||||
var state;
|
|
||||||
var d = data as Lang.Array;
|
|
||||||
for(var i = 0; i < d.size(); i++) {
|
|
||||||
if ((d[i].get("entity_id") as Lang.String).equals(mIdentifier)) {
|
|
||||||
state = d[i].get("state") as Lang.String;
|
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println((d[i].get("attributes") as Lang.Dictionary).get("friendly_name") + " State=" + state);
|
|
||||||
}
|
|
||||||
setUiToggle(state);
|
|
||||||
}
|
}
|
||||||
}
|
ErrorView.show(strNoPhone + ".");
|
||||||
} else {
|
break;
|
||||||
if (Globals.scDebug) {
|
|
||||||
System.println("HomeAssistantToggleMenuItem onReturnSetState(): Unhandled HTTP response code = " + responseCode);
|
case Communications.BLE_QUEUE_FULL:
|
||||||
}
|
if (Globals.scDebug) {
|
||||||
ErrorView.show(strUnhandledHttpErr + responseCode );
|
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
||||||
|
}
|
||||||
|
ErrorView.show(strApiFlood);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Communications.NETWORK_REQUEST_TIMED_OUT:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
||||||
|
}
|
||||||
|
ErrorView.show(strNoResponse);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
|
||||||
|
}
|
||||||
|
ErrorView.show(strNoJson);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: 404, page not found. Check API URL setting.");
|
||||||
|
}
|
||||||
|
ErrorView.show(strApiUrlNotFound);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 200:
|
||||||
|
var state;
|
||||||
|
var d = data as Lang.Array;
|
||||||
|
for(var i = 0; i < d.size(); i++) {
|
||||||
|
if ((d[i].get("entity_id") as Lang.String).equals(mIdentifier)) {
|
||||||
|
state = d[i].get("state") as Lang.String;
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println((d[i].get("attributes") as Lang.Dictionary).get("friendly_name") + " State=" + state);
|
||||||
|
}
|
||||||
|
setUiToggle(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
status = strAvailable;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (Globals.scDebug) {
|
||||||
|
System.println("HomeAssistantToggleMenuItem onReturnSetState(): Unhandled HTTP response code = " + responseCode);
|
||||||
|
}
|
||||||
|
ErrorView.show(strUnhandledHttpErr + responseCode);
|
||||||
}
|
}
|
||||||
|
getApp().setApiStatus(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setState(s as Lang.Boolean) as Void {
|
function setState(s as Lang.Boolean) as Void {
|
||||||
|