Compare commits

..

11 Commits

Author SHA1 Message Date
Hosted Weblate
702c9a5f16
Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (215 of 215 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: OverTheHillsAndFarAway <prosjektx@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/nb_NO/
Translation: Frigate NVR/common
2026-01-17 13:20:50 +01:00
Hosted Weblate
0d0b6588f5
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (43 of 43 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: wolfish1 <fish20488@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/zh_Hant/
Translation: Frigate NVR/views-events
2026-01-17 13:20:50 +01:00
Hosted Weblate
bef60b3016
Translated using Weblate (Uzbek)
Currently translated at 1.3% (1 of 74 strings)

Translated using Weblate (Uzbek)

Currently translated at 1.8% (1 of 55 strings)

Translated using Weblate (Uzbek)

Currently translated at 0.1% (1 of 501 strings)

Translated using Weblate (Uzbek)

Currently translated at 50.0% (1 of 2 strings)

Translated using Weblate (Uzbek)

Currently translated at 16.6% (1 of 6 strings)

Translated using Weblate (Uzbek)

Currently translated at 0.8% (1 of 118 strings)

Translated using Weblate (Uzbek)

Currently translated at 0.4% (1 of 215 strings)

Translated using Weblate (Uzbek)

Currently translated at 4.0% (1 of 25 strings)

Translated using Weblate (Uzbek)

Currently translated at 0.7% (1 of 136 strings)

Translated using Weblate (Uzbek)

Currently translated at 10.0% (1 of 10 strings)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Added translation using Weblate (Uzbek)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Shohruh Ismoilov <shohruh.genius@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/uz/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/uz/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-auth/uz/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/uz/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-filter/uz/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-input/uz/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/uz/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/uz/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/uz/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-recording/uz/
Translation: Frigate NVR/audio
Translation: Frigate NVR/common
Translation: Frigate NVR/components-auth
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/components-filter
Translation: Frigate NVR/components-input
Translation: Frigate NVR/components-player
Translation: Frigate NVR/objects
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-recording
2026-01-17 13:20:50 +01:00
Hosted Weblate
28ecc893dd
Translated using Weblate (Serbian)
Currently translated at 31.9% (39 of 122 strings)

Translated using Weblate (Serbian)

Currently translated at 16.2% (35 of 215 strings)

Translated using Weblate (Serbian)

Currently translated at 10.3% (52 of 501 strings)

Translated using Weblate (Serbian)

Currently translated at 71.6% (38 of 53 strings)

Translated using Weblate (Serbian)

Currently translated at 42.3% (39 of 92 strings)

Translated using Weblate (Serbian)

Currently translated at 27.9% (38 of 136 strings)

Translated using Weblate (Serbian)

Currently translated at 32.2% (38 of 118 strings)

Translated using Weblate (Serbian)

Currently translated at 84.7% (39 of 46 strings)

Translated using Weblate (Serbian)

Currently translated at 70.9% (39 of 55 strings)

Translated using Weblate (Serbian)

Currently translated at 90.6% (39 of 43 strings)

Translated using Weblate (Serbian)

Currently translated at 28.6% (39 of 136 strings)

Translated using Weblate (Serbian)

Currently translated at 79.5% (39 of 49 strings)

Translated using Weblate (Serbian)

Currently translated at 5.5% (36 of 654 strings)

Translated using Weblate (Serbian)

Currently translated at 14.8% (32 of 215 strings)

Translated using Weblate (Serbian)

Currently translated at 100.0% (10 of 10 strings)

Translated using Weblate (Serbian)

Currently translated at 56.6% (30 of 53 strings)

Translated using Weblate (Serbian)

Currently translated at 72.0% (31 of 43 strings)

Translated using Weblate (Serbian)

Currently translated at 22.7% (31 of 136 strings)

Translated using Weblate (Serbian)

Currently translated at 100.0% (74 of 74 strings)

Translated using Weblate (Serbian)

Currently translated at 67.3% (31 of 46 strings)

Translated using Weblate (Serbian)

Currently translated at 25.4% (31 of 122 strings)

Translated using Weblate (Serbian)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Serbian)

Currently translated at 100.0% (10 of 10 strings)

Translated using Weblate (Serbian)

Currently translated at 56.3% (31 of 55 strings)

Translated using Weblate (Serbian)

Currently translated at 100.0% (25 of 25 strings)

Translated using Weblate (Serbian)

Currently translated at 8.5% (43 of 501 strings)

Translated using Weblate (Serbian)

Currently translated at 63.2% (31 of 49 strings)

Translated using Weblate (Serbian)

Currently translated at 32.6% (30 of 92 strings)

Translated using Weblate (Serbian)

Currently translated at 26.2% (31 of 118 strings)

Translated using Weblate (Serbian)

Currently translated at 22.0% (30 of 136 strings)

Translated using Weblate (Serbian)

Currently translated at 4.5% (30 of 654 strings)

Co-authored-by: Aleksandar Jevremovic <aleksandar@jevremovic.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-auth/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-camera/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-filter/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-configeditor/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-search/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/sr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/sr/
Translation: Frigate NVR/audio
Translation: Frigate NVR/common
Translation: Frigate NVR/components-auth
Translation: Frigate NVR/components-camera
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/components-filter
Translation: Frigate NVR/components-player
Translation: Frigate NVR/objects
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-configeditor
Translation: Frigate NVR/views-events
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-exports
Translation: Frigate NVR/views-facelibrary
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-search
Translation: Frigate NVR/views-settings
Translation: Frigate NVR/views-system
2026-01-17 13:20:49 +01:00
Hosted Weblate
cac42fcaf6
Translated using Weblate (Finnish)
Currently translated at 76.9% (10 of 13 strings)

Translated using Weblate (Finnish)

Currently translated at 32.8% (215 of 654 strings)

Translated using Weblate (Finnish)

Currently translated at 4.0% (5 of 122 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Niko Järvinen <nbjarvinen@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/fi/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/fi/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/fi/
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-exports
Translation: Frigate NVR/views-settings
2026-01-17 13:20:49 +01:00
Hosted Weblate
f57b72a0d8
Translated using Weblate (Dutch)
Currently translated at 100.0% (122 of 122 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Marijn <168113859+Marijn0@users.noreply.github.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/nl/
Translation: Frigate NVR/views-classificationmodel
2026-01-17 13:20:48 +01:00
Hosted Weblate
9170ad0269
Translated using Weblate (Indonesian)
Currently translated at 13.9% (17 of 122 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ariska <ariska@databisnis.id>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/id/
Translation: Frigate NVR/views-classificationmodel
2026-01-17 13:20:48 +01:00
Hosted Weblate
62b8b08821
Translated using Weblate (Hungarian)
Currently translated at 20.4% (25 of 122 strings)

Translated using Weblate (Hungarian)

Currently translated at 88.9% (121 of 136 strings)

Translated using Weblate (Hungarian)

Currently translated at 85.4% (428 of 501 strings)

Translated using Weblate (Hungarian)

Currently translated at 93.9% (202 of 215 strings)

Translated using Weblate (Hungarian)

Currently translated at 68.3% (93 of 136 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Peter Bartfai <pbartfai@stardust.hu>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/hu/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/hu/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/hu/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/hu/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/hu/
Translation: Frigate NVR/audio
Translation: Frigate NVR/common
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-system
2026-01-17 13:20:47 +01:00
Hosted Weblate
59d7950454
Translated using Weblate (Portuguese)
Currently translated at 90.5% (48 of 53 strings)

Translated using Weblate (Portuguese)

Currently translated at 76.9% (10 of 13 strings)

Translated using Weblate (Portuguese)

Currently translated at 28.6% (35 of 122 strings)

Co-authored-by: Carlos Santos <c.santos00@hotmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/pt/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/pt/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/pt/
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-exports
Translation: Frigate NVR/views-facelibrary
2026-01-17 13:20:47 +01:00
Hosted Weblate
d22367d8fe
Translated using Weblate (Czech)
Currently translated at 100.0% (53 of 53 strings)

Translated using Weblate (Czech)

Currently translated at 93.4% (86 of 92 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (43 of 43 strings)

Translated using Weblate (Czech)

Currently translated at 96.3% (53 of 55 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (74 of 74 strings)

Translated using Weblate (Czech)

Currently translated at 64.9% (425 of 654 strings)

Translated using Weblate (Czech)

Currently translated at 74.2% (101 of 136 strings)

Translated using Weblate (Czech)

Currently translated at 32.7% (40 of 122 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Martin Brož <code@martin-broz.cz>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/cs/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-filter/cs/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/cs/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/cs/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/cs/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/cs/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/cs/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/cs/
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/components-filter
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-events
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-facelibrary
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-settings
2026-01-17 13:20:47 +01:00
Hosted Weblate
c2316fac52
Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.3% (53 of 55 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 68.6% (449 of 654 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 78.6% (107 of 136 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 43.4% (53 of 122 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (53 of 53 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 77.9% (106 of 136 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.7% (89 of 92 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 40.9% (50 of 122 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: cvroque <carlos.vroque@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/pt_BR/
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-facelibrary
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-settings
2026-01-17 13:20:46 +01:00
26 changed files with 52 additions and 375 deletions

View File

@ -1,3 +1,2 @@
- For Frigate NVR, never write strings in the frontend directly. Since the project uses `react-i18next`, use `t()` and write the English string in the relevant translations file in `web/public/locales/en`. Never write strings in the frontend directly, always write to and reference the relevant translations file.
- Always conform new and refactored code to the existing coding style in the project. Always conform new and refactored code to the existing coding style in the project.
- Always have a way to test your work and confirm your changes. When running backend tests, use `python3 -u -m unittest`.

View File

@ -66,6 +66,8 @@ Some models are labeled as **hybrid** (capable of both thinking and instruct tas
**Recommendation:** **Recommendation:**
Always select the `-instruct` or documented instruct/tagged variant of any model you use in your Frigate configuration. If in doubt, refer to your model providers documentation or model library for guidance on the correct model variant to use. Always select the `-instruct` or documented instruct/tagged variant of any model you use in your Frigate configuration. If in doubt, refer to your model providers documentation or model library for guidance on the correct model variant to use.
### Supported Models ### Supported Models
You must use a vision capable model with Frigate. Current model variants can be found [in their model library](https://ollama.com/search?c=vision). Note that Frigate will not automatically download the model you specify in your config, you must download the model to your local instance of Ollama first i.e. by running `ollama pull qwen3-vl:2b-instruct` on your Ollama server/Docker container. Note that the model specified in Frigate's config must match the downloaded model tag. You must use a vision capable model with Frigate. Current model variants can be found [in their model library](https://ollama.com/search?c=vision). Note that Frigate will not automatically download the model you specify in your config, you must download the model to your local instance of Ollama first i.e. by running `ollama pull qwen3-vl:2b-instruct` on your Ollama server/Docker container. Note that the model specified in Frigate's config must match the downloaded model tag.
@ -91,7 +93,7 @@ genai:
## Google Gemini ## Google Gemini
Google Gemini has a [free tier](https://ai.google.dev/pricing) for the API, however the limits may not be sufficient for standard Frigate usage. Choose a plan appropriate for your installation. Google Gemini has a free tier allowing [15 queries per minute](https://ai.google.dev/pricing) to the API, which is more than sufficient for standard Frigate usage.
### Supported Models ### Supported Models
@ -112,7 +114,7 @@ To start using Gemini, you must first get an API key from [Google AI Studio](htt
genai: genai:
provider: gemini provider: gemini
api_key: "{FRIGATE_GEMINI_API_KEY}" api_key: "{FRIGATE_GEMINI_API_KEY}"
model: gemini-2.5-flash model: gemini-2.0-flash
``` ```
:::note :::note

View File

@ -68,8 +68,8 @@ Fine-tune the LPR feature using these optional parameters at the global level of
- Default: `1000` pixels. Note: this is intentionally set very low as it is an _area_ measurement (length x width). For reference, 1000 pixels represents a ~32x32 pixel square in your camera image. - Default: `1000` pixels. Note: this is intentionally set very low as it is an _area_ measurement (length x width). For reference, 1000 pixels represents a ~32x32 pixel square in your camera image.
- Depending on the resolution of your camera's `detect` stream, you can increase this value to ignore small or distant plates. - Depending on the resolution of your camera's `detect` stream, you can increase this value to ignore small or distant plates.
- **`device`**: Device to use to run license plate detection _and_ recognition models. - **`device`**: Device to use to run license plate detection _and_ recognition models.
- Default: `None` - Default: `CPU`
- This is auto-selected by Frigate and can be `CPU`, `GPU`, or the GPU's device number. For users without a model that detects license plates natively, using a GPU may increase performance of the YOLOv9 license plate detector model. See the [Hardware Accelerated Enrichments](/configuration/hardware_acceleration_enrichments.md) documentation. However, for users who run a model that detects `license_plate` natively, there is little to no performance gain reported with running LPR on GPU compared to the CPU. - This can be `CPU`, `GPU`, or the GPU's device number. For users without a model that detects license plates natively, using a GPU may increase performance of the YOLOv9 license plate detector model. See the [Hardware Accelerated Enrichments](/configuration/hardware_acceleration_enrichments.md) documentation. However, for users who run a model that detects `license_plate` natively, there is little to no performance gain reported with running LPR on GPU compared to the CPU.
- **`model_size`**: The size of the model used to identify regions of text on plates. - **`model_size`**: The size of the model used to identify regions of text on plates.
- Default: `small` - Default: `small`
- This can be `small` or `large`. - This can be `small` or `large`.
@ -432,6 +432,6 @@ If you are using a model that natively detects `license_plate`, add an _object m
If you are not using a model that natively detects `license_plate` or you are using dedicated LPR camera mode, only a _motion mask_ over your text is required. If you are not using a model that natively detects `license_plate` or you are using dedicated LPR camera mode, only a _motion mask_ over your text is required.
### I see "Error running ... model" in my logs, or my inference time is very high. How can I fix this? ### I see "Error running ... model" in my logs. How can I fix this?
This usually happens when your GPU is unable to compile or use one of the LPR models. Set your `device` to `CPU` and try again. GPU acceleration only provides a slight performance increase, and the models are lightweight enough to run without issue on most CPUs. This usually happens when your GPU is unable to compile or use one of the LPR models. Set your `device` to `CPU` and try again. GPU acceleration only provides a slight performance increase, and the models are lightweight enough to run without issue on most CPUs.

View File

@ -23,12 +23,7 @@ from markupsafe import escape
from peewee import SQL, fn, operator from peewee import SQL, fn, operator
from pydantic import ValidationError from pydantic import ValidationError
from frigate.api.auth import ( from frigate.api.auth import allow_any_authenticated, allow_public, require_role
allow_any_authenticated,
allow_public,
get_allowed_cameras_for_filter,
require_role,
)
from frigate.api.defs.query.app_query_parameters import AppTimelineHourlyQueryParameters from frigate.api.defs.query.app_query_parameters import AppTimelineHourlyQueryParameters
from frigate.api.defs.request.app_body import AppConfigSetBody from frigate.api.defs.request.app_body import AppConfigSetBody
from frigate.api.defs.tags import Tags from frigate.api.defs.tags import Tags
@ -692,19 +687,13 @@ def plusModels(request: Request, filterByCurrentModelDetector: bool = False):
@router.get( @router.get(
"/recognized_license_plates", dependencies=[Depends(allow_any_authenticated())] "/recognized_license_plates", dependencies=[Depends(allow_any_authenticated())]
) )
def get_recognized_license_plates( def get_recognized_license_plates(split_joined: Optional[int] = None):
split_joined: Optional[int] = None,
allowed_cameras: List[str] = Depends(get_allowed_cameras_for_filter),
):
try: try:
query = ( query = (
Event.select( Event.select(
SQL("json_extract(data, '$.recognized_license_plate') AS plate") SQL("json_extract(data, '$.recognized_license_plate') AS plate")
) )
.where( .where(SQL("json_extract(data, '$.recognized_license_plate') IS NOT NULL"))
(SQL("json_extract(data, '$.recognized_license_plate') IS NOT NULL"))
& (Event.camera << allowed_cameras)
)
.distinct() .distinct()
) )
recognized_license_plates = [row[0] for row in query.tuples()] recognized_license_plates = [row[0] for row in query.tuples()]

View File

@ -662,13 +662,6 @@ class FrigateConfig(FrigateBaseModel):
# generate zone contours # generate zone contours
if len(camera_config.zones) > 0: if len(camera_config.zones) > 0:
for zone in camera_config.zones.values(): for zone in camera_config.zones.values():
if zone.filters:
for object_name, filter_config in zone.filters.items():
zone.filters[object_name] = RuntimeFilterConfig(
frame_shape=camera_config.frame_shape,
**filter_config.model_dump(exclude_unset=True),
)
zone.generate_contour(camera_config.frame_shape) zone.generate_contour(camera_config.frame_shape)
# Set live view stream if none is set # Set live view stream if none is set

View File

@ -24,14 +24,6 @@ class GeminiClient(GenAIClient):
http_options_dict = { http_options_dict = {
"api_version": "v1", "api_version": "v1",
"timeout": int(self.timeout * 1000), # requires milliseconds "timeout": int(self.timeout * 1000), # requires milliseconds
"retry_options": types.HttpRetryOptions(
attempts=3,
initial_delay=1.0,
max_delay=60.0,
exp_base=2.0,
jitter=1.0,
http_status_codes=[429, 500, 502, 503, 504],
),
} }
if isinstance(self.genai_config.provider_options, dict): if isinstance(self.genai_config.provider_options, dict):

View File

@ -632,49 +632,6 @@ class TestConfig(unittest.TestCase):
) )
assert frigate_config.cameras["back"].zones["test"].color != (0, 0, 0) assert frigate_config.cameras["back"].zones["test"].color != (0, 0, 0)
def test_zone_filter_area_percent_converts_to_pixels(self):
config = {
"mqtt": {"host": "mqtt"},
"record": {
"alerts": {
"retain": {
"days": 20,
}
}
},
"cameras": {
"back": {
"ffmpeg": {
"inputs": [
{"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]}
]
},
"detect": {
"height": 1080,
"width": 1920,
"fps": 5,
},
"zones": {
"notification": {
"coordinates": "0.03,1,0.025,0,0.626,0,0.643,1",
"objects": ["person"],
"filters": {"person": {"min_area": 0.1}},
}
},
}
},
}
frigate_config = FrigateConfig(**config)
expected_min_area = int(1080 * 1920 * 0.1)
assert (
frigate_config.cameras["back"]
.zones["notification"]
.filters["person"]
.min_area
== expected_min_area
)
def test_zone_relative_matches_explicit(self): def test_zone_relative_matches_explicit(self):
config = { config = {
"mqtt": {"host": "mqtt"}, "mqtt": {"host": "mqtt"},

View File

@ -3,7 +3,6 @@
"untilForTime": "Until {{time}}", "untilForTime": "Until {{time}}",
"untilForRestart": "Until Frigate restarts.", "untilForRestart": "Until Frigate restarts.",
"untilRestart": "Until restart", "untilRestart": "Until restart",
"never": "Never",
"ago": "{{timeAgo}} ago", "ago": "{{timeAgo}} ago",
"justNow": "Just now", "justNow": "Just now",
"today": "Today", "today": "Today",

View File

@ -116,8 +116,7 @@
"show": "Pokaż {{item}}", "show": "Pokaż {{item}}",
"ID": "ID", "ID": "ID",
"none": "Brak", "none": "Brak",
"all": "Wszystko", "all": "Wszystko"
"other": "Inne"
}, },
"button": { "button": {
"apply": "Zastosuj", "apply": "Zastosuj",

View File

@ -50,18 +50,5 @@
"biting": "Угриз", "biting": "Угриз",
"gargling": "Гргорење", "gargling": "Гргорење",
"stomach_rumble": "Крчање стомака", "stomach_rumble": "Крчање стомака",
"camera": "Камера", "camera": "Камера"
"burping": "Подригивање",
"skateboard": "Скејтборд",
"hiccup": "Штуцање",
"fart": "Прдеж",
"hands": "Руке",
"finger_snapping": "Пуцање прстима",
"clapping": "Пљескање",
"heartbeat": "Откуцаји срца",
"cheering": "Навијање",
"applause": "Аплауз",
"chatter": "Жамор",
"crowd": "Маса",
"children_playing": "Деца се играју"
} }

View File

@ -23,9 +23,9 @@
"pm": "pm", "pm": "pm",
"am": "am", "am": "am",
"yr": "{{time}}god", "yr": "{{time}}god",
"year_one": "{{time}} година", "year_one": "1,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21...",
"year_few": "{{time}} године", "year_few": "2,3,4,22,23,24,32,33,34,42,...",
"year_other": "{{time}} година", "year_other": "",
"mo": "{{time}}mes", "mo": "{{time}}mes",
"month_one": "{{time}} месец", "month_one": "{{time}} месец",
"month_few": "{{time}} месеца", "month_few": "{{time}} месеца",
@ -45,35 +45,7 @@
"s": "{{time}}s", "s": "{{time}}s",
"second_one": "{{time}} секунда", "second_one": "{{time}} секунда",
"second_few": "{{time}} секунде", "second_few": "{{time}} секунде",
"second_other": "{{time}} секунди", "second_other": "{{time}} секунди"
"formattedTimestampHourMinute": {
"24hour": "HH:mm"
},
"formattedTimestampHourMinuteSecond": {
"12hour": "h:mm:ss aaa",
"24hour": "HH:mm:ss"
},
"formattedTimestampMonthDayHourMinute": {
"12hour": "MMM d, h:mm aaa",
"24hour": "MMM d, HH:mm"
},
"formattedTimestampMonthDayYear": {
"12hour": "MMM d, yyyy",
"24hour": "MMM d, yyyy"
},
"formattedTimestampMonthDayYearHourMinute": {
"12hour": "MMM d yyyy, h:mm aaa",
"24hour": "MMM d yyyy, HH:mm"
},
"formattedTimestamp": {
"12hour": "MMM d, h:mm:ss aaa",
"24hour": "MMM d, HH:mm:ss"
},
"formattedTimestampMonthDay": "MMM d",
"formattedTimestampFilename": {
"12hour": "MM-dd-yy-h-mm-ss-a",
"24hour": "MM-dd-yy-HH-mm-ss"
}
}, },
"readTheDocumentation": "Прочитајте документацију" "readTheDocumentation": "Прочитајте документацију"
} }

View File

@ -73,14 +73,7 @@
"options": { "options": {
"label": "Подешавања", "label": "Подешавања",
"title": "Опције", "title": "Опције",
"showOptions": "Приказ опција", "showOptions": "Приказ опција"
"hideOptions": "Скривање опција" }
},
"boundingBox": "Оквир",
"timestamp": "Временски тренутак",
"zones": "Зоне",
"mask": "Маска",
"motion": "Покрет",
"regions": "Региони"
} }
} }

View File

@ -83,36 +83,7 @@
"search": { "search": {
"saveSearch": { "saveSearch": {
"label": "Сачувати претрагу", "label": "Сачувати претрагу",
"desc": "Обезбедите назив за ову сачувану претрагу.", "desc": "Обезбедите назив за ову сачувану претрагу."
"placeholder": "Унесите име за вашу претрагу",
"overwrite": "{{searchName}} већ постоји. Чување ће преписати постојећу вредност.",
"success": "Претрага ({{searchName}}) је сачувана.",
"button": {
"save": {
"label": "Чување ове претраге"
}
}
} }
},
"recording": {
"confirmDelete": {
"title": "Потврдите брисање",
"desc": {
"selected": "Да ли сте сигурни да желите да обришете све видео снимке повезане са овом ставком? <br /><br /> Држите притиснут <em>Shift</em> тастер да прескочите овај дијалог у будућности."
},
"toast": {
"success": "Видео снимак повезан са изабраним ставкама за преглед успешно је обрисан.",
"error": "Неуспешно брисање: {{error}}"
}
},
"button": {
"export": "Извоз",
"markAsReviewed": "Означити као прегледано",
"markAsUnreviewed": "Означити као непрегледано",
"deleteNow": "Обрисати сада"
}
},
"imagePicker": {
"selectImage": "Избор сличице за праћени објекат"
} }
} }

View File

@ -36,19 +36,5 @@
"snowboard": "Сноуборд", "snowboard": "Сноуборд",
"sports_ball": "Спортска лопта", "sports_ball": "Спортска лопта",
"baseball_bat": "Палица за бејзбол", "baseball_bat": "Палица за бејзбол",
"baseball_glove": "Рукавица за бејзбол", "baseball_glove": "Рукавица за бејзбол"
"kite": "Змај",
"skateboard": "Скејтборд",
"surfboard": "Даска за сурфовање",
"tennis_racket": "Тениски рекет",
"bottle": "Боца",
"plate": "Тањир",
"wine_glass": "Чаша за вино",
"cup": "Шоља",
"fork": "Виљушка",
"knife": "Нож",
"spoon": "Кашика",
"bowl": "Посуда",
"banana": "Банана",
"apple": "Јабука"
} }

View File

@ -46,8 +46,7 @@
} }
}, },
"train": { "train": {
"titleShort": "Скорашње", "titleShort": "Скорашње"
"title": "Скорашње класификације"
}, },
"deleteCategory": { "deleteCategory": {
"title": "Брисање класе", "title": "Брисање класе",
@ -57,34 +56,6 @@
}, },
"deleteModel": { "deleteModel": {
"title": "Брисање класификационог модела", "title": "Брисање класификационог модела",
"single": "Да ли сте сигурни да желите да обришете {{name}}? Ово ће трајно обрисати све повезане податке, укључујући слике и податке за тренирање. Ова акција се не може накнадно опозвати.", "single": "Да ли сте сигурни да желите да обришете {{name}}? Ово ће трајно обрисати све повезане податке, укључујући слике и податке за тренирање. Ова акција се не може накнадно опозвати."
"desc_one": "Да ли сте сигурни да желите да обришете {{count}} модел? Ово ће трајно обрисати све повезане податке, укључујући и слике и податке за тренирање. Ова акција не може бити опозвана накнадно.",
"desc_few": "Да ли сте сигурни да желите да обришете {{count}} модела? Ово ће трајно обрисати све повезане податке, укључујући и слике и податке за тренирање. Ова акција не може бити опозвана накнадно.",
"desc_other": "Да ли сте сигурни да желите да обришете {{count}} модела? Ово ће трајно обрисати све повезане податке, укључујући и слике и податке за тренирање. Ова акција не може бити опозвана накнадно."
},
"edit": {
"title": "Уређивање класификационог модела",
"descriptionState": "Уређивање класа за класификациони модел овог стања. Измене ће захтевати поновно тренирање модела.",
"descriptionObject": "Уређивање типа објекта и типа касификације за овај објекат класификационог модела.",
"stateClassesInfo": "Напомена: Измена класа стања захтева поновно тренирање модела са ажурираним класама."
},
"deleteDatasetImages": {
"title": "Брисање слика датасета",
"desc_one": "Да ли сте сигурни да желите да обришете {{count}} слику из {{dataset}}? Ова акција се не може накнадно опозвати и захтева поновно тренирање модела.",
"desc_few": "Да ли сте сигурни да желите да обришете {{count}} слике из {{dataset}}? Ова акција се не може накнадно опозвати и захтева поновно тренирање модела.",
"desc_other": "Да ли сте сигурни да желите да обришете {{count}} слика из {{dataset}}? Ова акција се не може накнадно опозвати и захтева поновно тренирање модела."
},
"deleteTrainImages": {
"title": "Брисање слика за тренирање",
"desc_one": "Да ли сте сигурни да желите да избришете {{count}} слику? Ова акција не може бити накнадно опозвана.",
"desc_few": "Да ли сте сигурни да желите да избришете {{count}} слике? Ова акција не може бити накнадно опозвана.",
"desc_other": "Да ли сте сигурни да желите да избришете {{count}} слика? Ова акција не може бити накнадно опозвана."
},
"renameCategory": {
"title": "Преименовање класе",
"desc": "Унесите ново име за {{name}}. Мораћете поново да тренирате модел да би промена имала ефекта."
},
"description": {
"invalidName": "Неисправно име. Имена могу да садрже само слова, цифре, размаке, апострофе, доње црте и повлаке."
} }
} }

View File

@ -57,9 +57,5 @@
"selected_one": "{{count}} изабрано", "selected_one": "{{count}} изабрано",
"selected_other": "{{count}} изабрано", "selected_other": "{{count}} изабрано",
"select_all": "Све", "select_all": "Све",
"camera": "Камера", "camera": "Камера"
"detected": "детектовано",
"normalActivity": "Нормално",
"needsReview": "Потребан је преглед",
"securityConcern": "Безбедносно питање"
} }

View File

@ -57,22 +57,6 @@
"attribute": { "attribute": {
"faceOrLicense_plate": "{{attribute}} детектован за {{label}}", "faceOrLicense_plate": "{{attribute}} детектован за {{label}}",
"other": "{{label}} је препознат као {{attribute}}" "other": "{{label}} је препознат као {{attribute}}"
},
"gone": "{{label}} преостало",
"heard": "{{label}} се чуло",
"external": "{{label}} детектован",
"header": {
"zones": "Зоне",
"ratio": "Однос",
"area": "Подручје",
"score": "Резултат"
}
},
"annotationSettings": {
"title": "Подешавања анотације",
"showAllZones": {
"title": "Приказ свих зона",
"desc": "Увек приказати зоне на фрејмовима у којима су објекти ушли у зону."
} }
} }
} }

View File

@ -1,8 +1,8 @@
{ {
"description": { "description": {
"addFace": "Додавање нове колекције у библиотеку лица отпремањем прве слике.", "addFace": "Prođite kroz dodavanje nove kolekcije u biblioteku lica.",
"placeholder": "Unesite ime za ovu kolekciju", "placeholder": "Unesite ime za ovu kolekciju",
"invalidName": "Неисправно име. Имена могу да садрже само слова, цифре, размаке, апострофе, доње црте и повлаке." "invalidName": "Nevažeće ime. Imena mogu da sadrže samo slova, brojeve, razmake, apostrofe, donje crte i crtice."
}, },
"details": { "details": {
"person": "Osoba", "person": "Osoba",
@ -69,28 +69,5 @@
}, },
"nofaces": "Нема доступних лица", "nofaces": "Нема доступних лица",
"trainFaceAs": "Тренирање лица као:", "trainFaceAs": "Тренирање лица као:",
"trainFace": "Тренирање лица", "trainFace": "Тренирање лица"
"toast": {
"success": {
"uploadedImage": "Слика је успешно отпремљена.",
"addFaceLibrary": "{{name}} је успешно додат у библиотеку лица!",
"deletedFace_one": "Успешно је обрисано {{count}} лице.",
"deletedFace_few": "Успешно је обрисано {{count}} лица.",
"deletedFace_other": "Успешно је обрисано {{count}} лица.",
"deletedName_one": "{{count}} лице је успешно обрисано.",
"deletedName_few": "{{count}} лица су успешно обрисана.",
"deletedName_other": "{{count}} лица је успешно обрисано.",
"renamedFace": "Лице је успешно преименовано у {{name}}",
"trainedFace": "Лице је успешно истренирано.",
"updatedFaceScore": "Успешно је ажуриран резултат лица за {{name}} ({{score}})."
},
"error": {
"uploadingImageFailed": "Неуспешно отпремање слике: {{errorMessage}}",
"addFaceLibraryFailed": "Неуспешно постављање имена лица: {{errorMessage}}",
"deleteFaceFailed": "Неуспешно брисање: {{errorMessage}}",
"deleteNameFailed": "Неуспешно брисање имена: {{errorMessage}}",
"renameFaceFailed": "Неуспешна промена назива лица: {{errorMessage}}",
"trainFailed": "Неуспешно тренирање: {{errorMessage}}"
}
}
} }

View File

@ -88,26 +88,6 @@
"disable": "Искључивање транскрибовања звука уживо" "disable": "Искључивање транскрибовања звука уживо"
}, },
"autotracking": { "autotracking": {
"enable": "Омогућавање аутоматског праћења", "enable": "Омогућавање аутоматског праћења"
"disable": "Онемогућити аутоматско праћење"
},
"streamStats": {
"enable": "Приказ статистике стримовања",
"disable": "Скривање статистике стримовања"
},
"manualRecording": {
"title": "На захтев",
"tips": "Преузимање тренутног снепшота или ручно покретање догађаја засновано на подешавањима задржавања снимања ове камере.",
"playInBackground": {
"label": "Пустити у позадини",
"desc": "Укључите ову опцију да наставите стримовање када је плејер скривен."
},
"showStats": {
"label": "Приказ статистике"
},
"debugView": "Приказ за дебаговање",
"start": "Почетак снимања на захтев",
"started": "Ручно снимање на захтев је започето.",
"failedToStart": "Неуспешно покретање ручног снимања на захтев."
} }
} }

View File

@ -4,7 +4,7 @@
"searchFor": "Pretraži {{inputValue}}", "searchFor": "Pretraži {{inputValue}}",
"button": { "button": {
"clear": "Obriši pretragu", "clear": "Obriši pretragu",
"save": "Чување претраге", "save": "Sačuvaj pretragu",
"delete": "Izbrišite sačuvanu pretragu", "delete": "Izbrišite sačuvanu pretragu",
"filterInformation": "Filtriraj informacije", "filterInformation": "Filtriraj informacije",
"filterActive": "Aktivni filteri" "filterActive": "Aktivni filteri"
@ -50,24 +50,8 @@
"step1": "Откуцајте назив кључа филтера а затим две тачке (нпр. \"cameras:\").", "step1": "Откуцајте назив кључа филтера а затим две тачке (нпр. \"cameras:\").",
"step2": "Изаберите предложену или сопствену вредност.", "step2": "Изаберите предложену или сопствену вредност.",
"step3": "Примените више филтера тако што ћете их додати један за другим са размаком између.", "step3": "Примените више филтера тако што ћете их додати један за другим са размаком између.",
"step4": "Филтери за датум (пре: и касније:) користе {{DateFormat}} формат.", "step4": "Филтери за датум (пре: и касније:) користе {{DateFormat}} формат."
"step5": "Филтер за временски распон користи {{exampleTime}} формат.",
"step6": "Уклоните филтере кликом на 'x' поред њих.",
"exampleLabel": "Пример:"
} }
},
"header": {
"currentFilterType": "Филтрирање вредности",
"noFilters": "Филтери",
"activeFilters": "Активни филтери"
} }
},
"similaritySearch": {
"title": "Претрага сличности",
"active": "Претрага по сличности је активна",
"clear": "Почистити претрагу сличности"
},
"placeholder": {
"search": "Претрага…"
} }
} }

View File

@ -6,7 +6,7 @@
"enrichments": "Podešavanja obogaćivanja - Frigate", "enrichments": "Podešavanja obogaćivanja - Frigate",
"masksAndZones": "Uređivač maski i zona - Frigate", "masksAndZones": "Uređivač maski i zona - Frigate",
"motionTuner": "Tjuner pokreta - Frigate", "motionTuner": "Tjuner pokreta - Frigate",
"general": "Подењавања UI - Фригејт", "general": "Generalna podešavanja - Frigate",
"cameraManagement": "Управљање камерама - Фригејт", "cameraManagement": "Управљање камерама - Фригејт",
"cameraReview": "Преглед подешавања камере - Фригејт", "cameraReview": "Преглед подешавања камере - Фригејт",
"object": "Дебаговање - Фригејт", "object": "Дебаговање - Фригејт",
@ -58,30 +58,7 @@
} }
}, },
"storedLayouts": { "storedLayouts": {
"title": "Сачувани распореди", "title": "Сачувани распореди"
"desc": "Распоред камера у групи може бити превлачен и може му се променити величина. Позиције су складиштене у локалном Веб браузеру.",
"clearAll": "Чишћење свих распореда"
},
"cameraGroupStreaming": {
"title": "Подешавање стримовања за групу камера",
"desc": "Подешавања стримовања за сваку групу камера чувају се у локалном браузеру.",
"clearAll": "Чишћење свих подешавања стримовања"
},
"recordingsViewer": {
"title": "Преглед снимака",
"defaultPlaybackRate": {
"label": "Подразумевана брзина репродукције",
"desc": "Подразумевана брзина репродукције за снимке."
}
},
"calendar": {
"title": "Календар",
"firstWeekday": {
"label": "Први дан у недељи",
"desc": "Дан којим недеље у календару прегледа почињу.",
"sunday": "Недеља",
"monday": "Понедељак"
}
} }
} }
} }

View File

@ -2,7 +2,7 @@
"documentTitle": { "documentTitle": {
"cameras": "Statusi kamera - Frigate", "cameras": "Statusi kamera - Frigate",
"storage": "Statistika skladištenja - Frigate", "storage": "Statistika skladištenja - Frigate",
"general": "Општа статистика - Фригејт", "general": "Opšta statistika - Frigate",
"enrichments": "Statistika obogaćivanja - Frigate", "enrichments": "Statistika obogaćivanja - Frigate",
"logs": { "logs": {
"frigate": "Frigate logovi - Frigate", "frigate": "Frigate logovi - Frigate",
@ -60,33 +60,9 @@
}, },
"nvidiaSMIOutput": { "nvidiaSMIOutput": {
"title": "Nvidia SMI излаз", "title": "Nvidia SMI излаз",
"name": "Назив: {{name}}", "name": "Назив: {{name}}"
"driver": "Драјвер: {{driver}}",
"cudaComputerCapability": "Способност CUDA рачунања: {{cuda_compute}}",
"vbios": "VBios Info: {{vbios}}"
},
"closeInfo": {
"label": "Затварање GPU информација"
},
"copyInfo": {
"label": "Копирање GPU ифнормација"
},
"toast": {
"success": "Копиране су GPU информације у клипборд"
} }
},
"npuUsage": "Употреба NPU",
"npuMemory": "NPU меморија",
"intelGpuWarning": {
"title": "Упозорење за Intel GPU статистику",
"message": "GPU статистика није доступна",
"description": "Ово је познати баг у алатима за извештавање статистике код Intel GPU (intel_gpu_top) где се јавља пуцање и враћа 0% као GPU искоришћење, чак и у случајевима када хардверска акцелерација и детектовање објекта регуларно раде на (i)GPU. Ово није баг у Фригејту. Можете рестартовати хост да привремено поправите проблем и потврдите да GPU ради исправно. Ово не утиче на перформансе."
} }
},
"otherProcesses": {
"title": "Остали процеси",
"processCpuUsage": "Процесна употреба CPU",
"processMemoryUsage": "Процесна употреба меморије"
} }
} }
} }

View File

@ -268,7 +268,7 @@ export default function CreateTriggerDialog({
<FormItem className="flex flex-row items-center justify-between"> <FormItem className="flex flex-row items-center justify-between">
<div className="space-y-0.5"> <div className="space-y-0.5">
<FormLabel className="text-base"> <FormLabel className="text-base">
{t("button.enabled", { ns: "common" })} {t("enabled", { ns: "common" })}
</FormLabel> </FormLabel>
<div className="text-sm text-muted-foreground"> <div className="text-sm text-muted-foreground">
{t("triggers.dialog.form.enabled.description")} {t("triggers.dialog.form.enabled.description")}
@ -394,10 +394,7 @@ export default function CreateTriggerDialog({
</FormLabel> </FormLabel>
<div className="space-y-2"> <div className="space-y-2">
{availableActions.map((action) => ( {availableActions.map((action) => (
<label <div key={action} className="flex items-center space-x-2">
key={action}
className="flex cursor-pointer items-center space-x-2"
>
<FormControl> <FormControl>
<Checkbox <Checkbox
checked={form checked={form
@ -419,10 +416,10 @@ export default function CreateTriggerDialog({
}} }}
/> />
</FormControl> </FormControl>
<span className="text-sm font-normal"> <FormLabel className="text-sm font-normal">
{t(`triggers.actions.${action}`)} {t(`triggers.actions.${action}`)}
</span> </FormLabel>
</label> </div>
))} ))}
</div> </div>
<FormDescription> <FormDescription>

View File

@ -142,10 +142,7 @@ export default function Step3ThresholdAndActions({
<FormLabel>{t("triggers.dialog.form.actions.title")}</FormLabel> <FormLabel>{t("triggers.dialog.form.actions.title")}</FormLabel>
<div className="space-y-2"> <div className="space-y-2">
{availableActions.map((action) => ( {availableActions.map((action) => (
<label <div key={action} className="flex items-center space-x-2">
key={action}
className="flex cursor-pointer items-center space-x-2"
>
<FormControl> <FormControl>
<Checkbox <Checkbox
checked={form checked={form
@ -167,10 +164,10 @@ export default function Step3ThresholdAndActions({
}} }}
/> />
</FormControl> </FormControl>
<span className="text-sm font-normal"> <FormLabel className="text-sm font-normal">
{t(`triggers.actions.${action}`)} {t(`triggers.actions.${action}`)}
</span> </FormLabel>
</label> </div>
))} ))}
</div> </div>
<FormDescription> <FormDescription>
@ -200,7 +197,9 @@ export default function Step3ThresholdAndActions({
{isLoading && <ActivityIndicator className="mr-2 size-5" />} {isLoading && <ActivityIndicator className="mr-2 size-5" />}
{isLoading {isLoading
? t("button.saving", { ns: "common" }) ? t("button.saving", { ns: "common" })
: t("button.save", { ns: "common" })} : t("triggers.dialog.form.save", {
defaultValue: "Save Trigger",
})}
</Button> </Button>
</div> </div>
</form> </form>

View File

@ -206,7 +206,7 @@ function Exports() {
> >
{Object.values(exports).map((item) => ( {Object.values(exports).map((item) => (
<ExportCard <ExportCard
key={item.id} key={item.name}
className={ className={
search == "" || filteredExports.includes(item) ? "" : "hidden" search == "" || filteredExports.includes(item) ? "" : "hidden"
} }

View File

@ -1,7 +1,6 @@
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
import { Trans, useTranslation } from "react-i18next"; import { Trans, useTranslation } from "react-i18next";
import { toast } from "sonner"; import { Toaster, toast } from "sonner";
import { Toaster } from "@/components/ui/sonner";
import useSWR from "swr"; import useSWR from "swr";
import axios from "axios"; import axios from "axios";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
@ -599,7 +598,7 @@ export default function TriggerView({
date_style: "medium", date_style: "medium",
}, },
) )
: t("never", { ns: "common" })} : "Never"}
</span> </span>
{trigger_status?.triggers[trigger.name] {trigger_status?.triggers[trigger.name]
?.triggering_event_id && ( ?.triggering_event_id && (
@ -664,9 +663,7 @@ export default function TriggerView({
<TableHeader className="sticky top-0 bg-muted/50"> <TableHeader className="sticky top-0 bg-muted/50">
<TableRow> <TableRow>
<TableHead className="w-4"></TableHead> <TableHead className="w-4"></TableHead>
<TableHead> <TableHead>{t("name", { ns: "common" })}</TableHead>
{t("name", { ns: "triggers.table.name" })}
</TableHead>
<TableHead>{t("triggers.table.type")}</TableHead> <TableHead>{t("triggers.table.type")}</TableHead>
<TableHead> <TableHead>
{t("triggers.table.lastTriggered")} {t("triggers.table.lastTriggered")}
@ -762,7 +759,7 @@ export default function TriggerView({
date_style: "medium", date_style: "medium",
}, },
) )
: t("time.never", { ns: "common" })} : "Never"}
</span> </span>
{trigger_status?.triggers[trigger.name] {trigger_status?.triggers[trigger.name]
?.triggering_event_id && ( ?.triggering_event_id && (