mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-08-11 13:21:10 +03:00
Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aaf0edc8ed | ||
|
|
e3fa701893 | ||
|
|
168cbea9ea | ||
|
|
c0cf08ab4a | ||
|
|
6f80bcd19f | ||
|
|
d02a1156b7 | ||
|
|
c17538aff9 |
@@ -2,7 +2,7 @@
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
SQLITE_VEC_VERSION="0.1.3"
|
||||
SQLITE_VEC_VERSION="0.1.9"
|
||||
|
||||
source /etc/os-release
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@ It is not recommended to copy this full configuration file. Only specify values
|
||||
|
||||
:::
|
||||
|
||||
Sections marked `# NOTE: Can be overridden at the camera level` can be set globally and then adjusted per camera. See [Global and Camera-Level Configuration](../config_overrides.md) for how that works.
|
||||
|
||||
```yaml
|
||||
mqtt:
|
||||
# Optional: Enable mqtt server (default: shown below)
|
||||
@@ -171,13 +173,14 @@ model:
|
||||
# Valid values are rgb, bgr, or yuv. (default: shown below)
|
||||
input_pixel_format: rgb
|
||||
# Required: Object detection model input tensor format
|
||||
# Valid values are nhwc or nchw (default: shown below)
|
||||
# Valid values are nhwc, nchw, hwnc, or hwcn (default: shown below)
|
||||
input_tensor: nhwc
|
||||
# Optional: Data type of the model input tensor
|
||||
# Valid values are float, float_denorm, or int (default: shown below)
|
||||
input_dtype: int
|
||||
# Required: Object detection model type, currently only used with the OpenVINO detector
|
||||
# Valid values are ssd, yolox, yolonas (default: shown below)
|
||||
# Required: Object detection model architecture, used by detectors that support more
|
||||
# than one model type (openvino, onnx, rknn, memryx, axengine, synaptics, and others)
|
||||
# Valid values are ssd, yolox, yolonas, yolo-generic, rfdetr, dfine (default: shown below)
|
||||
model_type: ssd
|
||||
# Required: Label name modifications. These are merged into the standard labelmap.
|
||||
labelmap:
|
||||
@@ -468,8 +471,8 @@ review:
|
||||
detections: False
|
||||
# Optional: Activity Context Prompt to give context to the GenAI what activity is and is not suspicious.
|
||||
# It is important to be direct and detailed. See documentation for the default prompt structure.
|
||||
activity_context_prompt: """Define what is and is not suspicious
|
||||
"""
|
||||
activity_context_prompt: |
|
||||
Define what is and is not suspicious
|
||||
# Optional: Image source for GenAI (default: preview)
|
||||
# Options: "preview" (uses cached preview frames at ~180p) or "recordings" (extracts frames from recordings at 480p)
|
||||
# Using "recordings" provides better image quality but uses more tokens per image.
|
||||
@@ -813,7 +816,8 @@ classification:
|
||||
cameras:
|
||||
camera_name:
|
||||
# Required: Crop of image frame on this camera to run classification on
|
||||
crop: [0, 180, 220, 400]
|
||||
# [x1, y1, x2, y2] as decimals between 0 and 1, relative to the detect resolution
|
||||
crop: [0.0, 0.25, 0.3, 0.85]
|
||||
# Optional: If classification should be run when motion is detected in the crop (default: shown below)
|
||||
motion: False
|
||||
# Optional: Interval to run classification on in seconds (default: shown below)
|
||||
|
||||
@@ -335,7 +335,7 @@ For example:
|
||||
```
|
||||
services:
|
||||
frigate:
|
||||
image: blakeblackshear/frigate:latest
|
||||
image: ghcr.io/blakeblackshear/frigate:stable
|
||||
environment:
|
||||
- FRIGATE_BASE_PATH=/frigate
|
||||
```
|
||||
|
||||
@@ -272,7 +272,7 @@ If you have CUDA hardware, you can experiment with the `large` `whisper` model o
|
||||
|
||||
#### Transcription and translation of `speech` audio events
|
||||
|
||||
Any `speech` events in Explore can be transcribed and/or translated through the Transcribe button in the Tracked Object Details pane.
|
||||
Any `speech` events in Explore can be transcribed and/or translated through the Transcribe button (the microphone icon) in the Tracked Object Details pane.
|
||||
|
||||
In order to use transcription and translation for past events, you must enable audio detection and define `speech` as an audio type to listen for. To have `speech` events translated into the language of your choice, set the `language` config parameter with the correct [language code](https://github.com/openai/whisper/blob/main/whisper/tokenizer.py#L10).
|
||||
|
||||
@@ -294,7 +294,7 @@ Recorded `speech` events will always use a `whisper` model, regardless of the `m
|
||||
|
||||
Because transcription is **serialized (one event at a time)** and speech events can be generated far faster than they can be processed, an auto-transcribe toggle would very quickly create an ever-growing backlog and degrade core functionality. For the amount of engineering and risk involved, it adds **very little practical value** for the majority of deployments, which are often on low-powered, edge hardware.
|
||||
|
||||
If you hear speech that's actually important and worth saving/indexing for the future, **just press the transcribe button in Explore** on that specific `speech` event - that keeps things explicit, reliable, and under your control.
|
||||
If you hear speech that's actually important and worth saving/indexing for the future, **just press the transcribe button (the microphone icon) in Explore** on that specific `speech` event - that keeps things explicit, reliable, and under your control.
|
||||
|
||||
Other options are being considered for future versions of Frigate to add transcription options that support external `whisper` Docker containers. A single transcription service could then be shared by Frigate and other applications (for example, Home Assistant Voice), and run on more powerful machines when available.
|
||||
|
||||
|
||||
@@ -262,6 +262,19 @@ In this example:
|
||||
|
||||
- Admin precedence: if the `admin` mapping matches, Frigate resolves the session to `admin` to avoid accidental downgrade when a user belongs to multiple groups (for example both `admin` and `viewer` groups).
|
||||
|
||||
:::note
|
||||
|
||||
If a user isn't getting the role you expect, enable debug logging to see exactly what headers Frigate is receiving from your proxy:
|
||||
|
||||
```yaml
|
||||
logger:
|
||||
default: info
|
||||
logs:
|
||||
frigate.api.auth: debug
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
#### Port Considerations
|
||||
|
||||
**Authenticated Port (8971)**
|
||||
|
||||
@@ -20,7 +20,7 @@ Settings are organized into two scopes:
|
||||
- **Global configuration**: values under <NavPath path="Settings > Global configuration" /> apply to every camera by default. This is where you set the baseline behavior for object detection, recording, snapshots, motion, and so on.
|
||||
- **Camera configuration**: values under <NavPath path="Settings > Camera configuration" /> apply to a single camera. Use the camera selector button at the top of these pages to choose which camera you are editing.
|
||||
|
||||
When a camera-level section is left untouched, the camera simply inherits the global values. Changing a value on a camera page **overrides** the global value for that camera only: the global setting and every other camera are unaffected. This mirrors how the YAML works, where a value set under `cameras.<name>` takes precedence over the same value set at the top level.
|
||||
When a camera-level section is left untouched, the camera simply inherits the global values. Changing a value on a camera page **overrides** the global value for that camera only: the global setting and every other camera are unaffected. This mirrors how the YAML works, where a value set under `cameras.<name>` takes precedence over the same value set at the top level. See [Global and Camera-Level Configuration](./config_overrides.md) for the full details, including how lists and maps are handled and which settings must be enabled globally first.
|
||||
|
||||
To undo an override and go back to inheriting from the parent scope, use the reset button at the bottom of the section:
|
||||
|
||||
@@ -130,7 +130,8 @@ go2rtc:
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
api_key: "{FRIGATE_GENAI_API_KEY}"
|
||||
my_provider:
|
||||
api_key: "{FRIGATE_GENAI_API_KEY}"
|
||||
```
|
||||
|
||||
## Common configuration examples
|
||||
|
||||
@@ -0,0 +1,244 @@
|
||||
---
|
||||
id: config_overrides
|
||||
title: Global and Camera-Level Configuration
|
||||
---
|
||||
|
||||
import ConfigTabs from "@site/src/components/ConfigTabs";
|
||||
import TabItem from "@theme/TabItem";
|
||||
import NavPath from "@site/src/components/NavPath";
|
||||
|
||||
Most of Frigate's configuration can be set once for all cameras and then adjusted for individual cameras. The global value acts as the default for every camera, and any camera can override it.
|
||||
|
||||
This page explains how that inheritance works. For a tour of the Settings UI itself, see [Frigate Configuration](./config.md).
|
||||
|
||||
## The basics
|
||||
|
||||
Set a value globally and every camera uses it. Set the same value on a camera and that camera uses its own value instead.
|
||||
|
||||
<ConfigTabs>
|
||||
<TabItem value="ui">
|
||||
|
||||
1. Navigate to <NavPath path="Settings > Global configuration > Object detection" /> and set **Detect FPS** to `5`. Every camera now detects at 5 fps.
|
||||
2. Navigate to <NavPath path="Settings > Camera configuration > Object detection" />, select the `driveway` camera, and set **Detect FPS** to `10`.
|
||||
|
||||
The `driveway` camera now detects at 10 fps. Every other camera still uses the global value of 5.
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="yaml">
|
||||
|
||||
```yaml
|
||||
detect:
|
||||
fps: 5 # every camera detects at 5 fps
|
||||
|
||||
cameras:
|
||||
front_door:
|
||||
ffmpeg: ...
|
||||
driveway:
|
||||
ffmpeg: ...
|
||||
detect:
|
||||
fps: 10 # except this one
|
||||
```
|
||||
|
||||
`front_door` inherits `fps: 5`, and `driveway` uses `10`.
|
||||
|
||||
</TabItem>
|
||||
</ConfigTabs>
|
||||
|
||||
## Overrides apply per value, not per section
|
||||
|
||||
Overriding one value in a section does not detach the rest of that section. Everything you don't set on the camera still comes from the global configuration.
|
||||
|
||||
<ConfigTabs>
|
||||
<TabItem value="ui">
|
||||
|
||||
If you set a camera's **Motion threshold** but leave **Contour area** alone, only the threshold is overridden. The contour area continues to follow <NavPath path="Settings > Global configuration > Motion detection" />, and changing it there still affects that camera.
|
||||
|
||||
Open a section to see which values are overridden: the section header indicates how many fields differ from the global configuration.
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="yaml">
|
||||
|
||||
```yaml
|
||||
motion:
|
||||
threshold: 30
|
||||
contour_area: 10
|
||||
|
||||
cameras:
|
||||
driveway:
|
||||
motion:
|
||||
threshold: 40
|
||||
```
|
||||
|
||||
The `driveway` camera ends up with `threshold: 40` and `contour_area: 10`. Only the value you wrote was overridden.
|
||||
|
||||
</TabItem>
|
||||
</ConfigTabs>
|
||||
|
||||
## Returning a camera to the global value
|
||||
|
||||
<ConfigTabs>
|
||||
<TabItem value="ui">
|
||||
|
||||
A camera section that has its own values shows an **Overridden** badge. To remove the override and go back to inheriting, use the **Reset to Global** button at the bottom of the section.
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="yaml">
|
||||
|
||||
Frigate treats a camera value as an override because it is written in the config file, not because it differs from the global value. Repeating the global value under a camera still creates an override:
|
||||
|
||||
```yaml
|
||||
snapshots:
|
||||
enabled: true
|
||||
|
||||
cameras:
|
||||
driveway:
|
||||
snapshots:
|
||||
enabled: true # this is an override, even though it matches
|
||||
```
|
||||
|
||||
If you later change the global `snapshots.enabled` to `false`, `driveway` keeps saving snapshots, because it has its own value. To make a camera follow the global value again, delete the key from the camera rather than setting it to match.
|
||||
|
||||
</TabItem>
|
||||
</ConfigTabs>
|
||||
|
||||
## Lists replace, maps merge
|
||||
|
||||
This is the distinction that surprises people most.
|
||||
|
||||
**Lists are replaced entirely.** A camera's list does not add to the global list, it takes its place.
|
||||
|
||||
<ConfigTabs>
|
||||
<TabItem value="ui">
|
||||
|
||||
The camera page shows the objects the camera is currently tracking, starting from the global list. Changing that selection under <NavPath path="Settings > Camera configuration > Objects" /> replaces the list for that camera, so make sure every object you want tracked is selected, not just the ones you are adding.
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="yaml">
|
||||
|
||||
```yaml
|
||||
objects:
|
||||
track:
|
||||
- person
|
||||
- car
|
||||
|
||||
cameras:
|
||||
backyard:
|
||||
objects:
|
||||
track:
|
||||
- dog # backyard tracks ONLY dog, not person or car
|
||||
```
|
||||
|
||||
To track `dog` in addition to the global objects, list all of them on the camera.
|
||||
|
||||
</TabItem>
|
||||
</ConfigTabs>
|
||||
|
||||
An empty list is a valid override, and is the normal way to opt a camera out of something:
|
||||
|
||||
```yaml
|
||||
review:
|
||||
alerts:
|
||||
labels:
|
||||
- person
|
||||
|
||||
cameras:
|
||||
street:
|
||||
review:
|
||||
alerts:
|
||||
labels: [] # this camera never creates alerts
|
||||
```
|
||||
|
||||
**Maps are merged key by key.** A camera can add an entry without redeclaring the others.
|
||||
|
||||
<ConfigTabs>
|
||||
<TabItem value="ui">
|
||||
|
||||
Adding a filter for one object under <NavPath path="Settings > Camera configuration > Objects" /> does not remove the filters inherited from <NavPath path="Settings > Global configuration > Objects" />. The camera keeps both.
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="yaml">
|
||||
|
||||
```yaml
|
||||
objects:
|
||||
filters:
|
||||
person:
|
||||
min_area: 5000
|
||||
|
||||
cameras:
|
||||
driveway:
|
||||
objects:
|
||||
filters:
|
||||
car:
|
||||
min_area: 10000
|
||||
```
|
||||
|
||||
The `driveway` camera ends up with both the `car` filter it defined and the `person` filter from the global configuration.
|
||||
|
||||
</TabItem>
|
||||
</ConfigTabs>
|
||||
|
||||
## Which settings can be overridden
|
||||
|
||||
Most, but not all. The [full reference config](./advanced/reference.md) is the authoritative source: sections that support camera-level overrides are marked with the comment `# NOTE: Can be overridden at the camera level`. In the UI, a setting can be overridden if it appears under both <NavPath path="Settings > Global configuration" /> and <NavPath path="Settings > Camera configuration" />.
|
||||
|
||||
A few things worth knowing beyond that:
|
||||
|
||||
- Some sections are **global only** and have no camera-level equivalent, including `go2rtc`, `genai` providers, `classification`, `telemetry`, `camera_groups`, and `ui`.
|
||||
- Some sections exist **only at the camera level**, such as `zones` and `onvif`.
|
||||
- Some sections are **partially overridable**, meaning a camera accepts only a few of the keys available globally. `face_recognition`, `lpr`, and `audio_transcription` work this way, and the reference config notes which keys apply.
|
||||
|
||||
## Enrichments that must be enabled globally first
|
||||
|
||||
License plate recognition and face recognition are special: the global setting is not just a default, it is a switch that must be on before any camera can use the feature. Enabling one on a camera while it is disabled globally is a configuration error, and Frigate will refuse to start:
|
||||
|
||||
```
|
||||
Camera driveway has lpr enabled but lpr is disabled at the global level of the config. You must enable lpr at the global level.
|
||||
```
|
||||
|
||||
Enable the feature globally, then turn it off on the cameras that don't need it.
|
||||
|
||||
<ConfigTabs>
|
||||
<TabItem value="ui">
|
||||
|
||||
1. Navigate to <NavPath path="Settings > Global configuration > License plate recognition" /> and enable **LPR**.
|
||||
2. Navigate to <NavPath path="Settings > Camera configuration > License plate recognition" />, select each camera that should not run LPR, and disable the **Enable LPR** toggle.
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="yaml">
|
||||
|
||||
```yaml
|
||||
lpr:
|
||||
enabled: true
|
||||
|
||||
cameras:
|
||||
driveway:
|
||||
ffmpeg: ... # inherits lpr, enabled
|
||||
backyard:
|
||||
ffmpeg: ...
|
||||
lpr:
|
||||
enabled: false # opted out
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</ConfigTabs>
|
||||
|
||||
:::note
|
||||
|
||||
This applies only to `lpr` and `face_recognition`, because the global setting controls whether the supporting background process starts at all. Other features do not work this way. Audio transcription, for example, can be enabled on a single camera without being enabled globally.
|
||||
|
||||
:::
|
||||
|
||||
## Profiles
|
||||
|
||||
[Profiles](./profiles.md) add a further layer on top of everything described above. A profile is a named set of camera overrides that you can switch on and off while Frigate is running, for example to change detection and recording behavior when you leave the house.
|
||||
|
||||
Profiles are applied on top of a camera's already-resolved configuration, so a profile value wins over both the camera and the global value while that profile is active. Profiles cover a subset of the camera sections and do not modify your config file.
|
||||
|
||||
## Summary
|
||||
|
||||
- A camera inherits every value you don't set on it.
|
||||
- Overriding one value does not detach the rest of the section.
|
||||
- Writing a value on a camera overrides it, even if it matches the global value. Remove it to inherit again.
|
||||
- Lists replace the global list. Maps merge into it.
|
||||
- An empty list is an override, not an omission.
|
||||
- `lpr` and `face_recognition` must be enabled globally before a camera can use them.
|
||||
@@ -73,9 +73,13 @@ classification:
|
||||
interval: 10 # also run every N seconds (optional)
|
||||
cameras:
|
||||
front:
|
||||
crop: [0, 180, 220, 400]
|
||||
# [x1, y1, x2, y2] as decimals between 0 and 1, relative to the
|
||||
# camera's detect resolution
|
||||
crop: [0.0, 0.25, 0.3, 0.85]
|
||||
```
|
||||
|
||||
Crop coordinates are normalized: each value is a fraction of the camera's `detect` width or height, not a pixel value. Drawing the crop in the UI wizard writes these values for you.
|
||||
|
||||
An optional config, `save_attempts`, can be set as a key under the model name. This defines the number of classification attempts to save in the Recent Classifications tab. For state classification models, the default is 100.
|
||||
|
||||
</TabItem>
|
||||
|
||||
@@ -232,7 +232,21 @@ Once front-facing images are performing well, start choosing slightly off-angle
|
||||
|
||||
Start with the [Usage](#usage) section and re-read the [Model Requirements](#model-requirements) above.
|
||||
|
||||
1. Ensure `person` is being _detected_. A `person` will automatically be scanned by Frigate for a face. Any detected faces will appear in the Recent Recognitions tab in the Frigate UI's Face Library.
|
||||
1. Enable debug logs to see exactly what Frigate is doing.
|
||||
- Enable debug logs for face recognition by adding `frigate.data_processing.real_time.face: debug` to your `logger` configuration. Restart Frigate after this change.
|
||||
|
||||
```yaml
|
||||
logger:
|
||||
default: info
|
||||
logs:
|
||||
# highlight-next-line
|
||||
frigate.data_processing.real_time.face: debug
|
||||
```
|
||||
|
||||
- These logs report where the pipeline stopped for each `person` object, such as no face being found within the person's bounding box, the detected face being smaller than `min_area`, or a face being recognized but scoring too low.
|
||||
- If you see no face-related messages at all, also add `frigate.embeddings.maintainer: debug` to confirm that the face processor was created at startup and that `person` updates are reaching it.
|
||||
|
||||
2. Ensure `person` is being _detected_. A `person` will automatically be scanned by Frigate for a face. Any detected faces will appear in the Recent Recognitions tab in the Frigate UI's Face Library.
|
||||
|
||||
If you are using a Frigate+ or `face` detecting model:
|
||||
- Watch the [debug view](/usage/live#the-single-camera-view) to ensure that `face` is being detected along with `person`.
|
||||
@@ -242,7 +256,7 @@ Start with the [Usage](#usage) section and re-read the [Model Requirements](#mod
|
||||
- Check your `detect` stream resolution and ensure it is sufficiently high enough to capture face details on `person` objects.
|
||||
- You may need to lower your `detection_threshold` if faces are not being detected.
|
||||
|
||||
2. Any detected faces will then be _recognized_.
|
||||
3. Any detected faces will then be _recognized_.
|
||||
- Make sure you have trained at least one face per the recommendations above.
|
||||
- Adjust `recognition_threshold` settings per the suggestions [above](#advanced-configuration).
|
||||
|
||||
|
||||
@@ -9,9 +9,27 @@ import NavPath from "@site/src/components/NavPath";
|
||||
|
||||
## Configuration
|
||||
|
||||
A Generative AI provider can be configured in the global config, which will make the Generative AI features available for use. There are currently 4 native providers available to integrate with Frigate. Other providers that support the OpenAI standard API can also be used. See the OpenAI-Compatible section below.
|
||||
A Generative AI provider can be configured in the global config, which will make the Generative AI features available for use. There are currently 5 native providers available to integrate with Frigate. Other providers that support the OpenAI standard API can also be used. See the OpenAI-Compatible section below.
|
||||
|
||||
To use Generative AI, you must define a single provider at the global level of your Frigate configuration. If the provider you choose requires an API key, you may either directly paste it in your configuration, or store it in an environment variable prefixed with `FRIGATE_`.
|
||||
`genai` is a map of named providers. Each key under `genai` is a name you choose, and its value is that provider's settings:
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
my_provider: # any name you like
|
||||
provider: ollama
|
||||
base_url: http://localhost:11434
|
||||
model: qwen3-vl:4b
|
||||
roles:
|
||||
- descriptions
|
||||
- embeddings
|
||||
- chat
|
||||
```
|
||||
|
||||
The examples on this page all use `my_provider`, but the name is arbitrary and is only used to reference the provider elsewhere in the config (for example, `semantic_search.model`).
|
||||
|
||||
Each provider handles one or more **roles**: `chat`, `descriptions`, and `embeddings`. A provider handles all three by default, and each role may be assigned to exactly one provider. Define a single provider if you want it to do everything, or split the roles across several providers using the `roles` option.
|
||||
|
||||
If the provider you choose requires an API key, you may either directly paste it in your configuration, or store it in an environment variable prefixed with `FRIGATE_`.
|
||||
|
||||
## Local Providers
|
||||
|
||||
@@ -78,23 +96,26 @@ All llama.cpp native options can be passed through `provider_options`, including
|
||||
- Set **Provider** to `llamacpp`
|
||||
- Set **Base URL** to your llama.cpp server address (e.g., `http://localhost:8080`)
|
||||
- Set **Model** to the name of your model
|
||||
- Under **Provider Options**, set `context_size` to tell Frigate your context size so it can send the appropriate amount of information
|
||||
- Optionally, under **Provider Options**, set `context_size` to override the context size Frigate detects from the server
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="yaml">
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: llamacpp
|
||||
base_url: http://localhost:8080
|
||||
model: your-model-name
|
||||
provider_options:
|
||||
context_size: 16000 # Tell Frigate your context size so it can send the appropriate amount of information.
|
||||
my_provider:
|
||||
provider: llamacpp
|
||||
base_url: http://localhost:8080
|
||||
model: your-model-name
|
||||
provider_options:
|
||||
context_size: 16000 # Optional, overrides the context size reported by the server.
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</ConfigTabs>
|
||||
|
||||
Frigate queries the llama.cpp server for the model's context size at startup and logs it along with the other detected capabilities. If `context_size` is set in `provider_options`, that value is always used instead, even when the server reports its own.
|
||||
|
||||
### Ollama
|
||||
|
||||
[Ollama](https://ollama.com/) allows you to self-host large language models and keep everything running locally. It is highly recommended to host this server on a machine with an Nvidia graphics card, or on a Apple silicon Mac for best performance.
|
||||
@@ -127,13 +148,14 @@ Note that Frigate will not automatically download the model you specify in your
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: ollama
|
||||
base_url: http://localhost:11434
|
||||
model: qwen3-vl:4b
|
||||
provider_options: # other Ollama client options can be defined
|
||||
keep_alive: -1
|
||||
options:
|
||||
num_ctx: 8192 # make sure the context matches other services that are using ollama
|
||||
my_provider:
|
||||
provider: ollama
|
||||
base_url: http://localhost:11434
|
||||
model: qwen3-vl:4b
|
||||
provider_options: # other Ollama client options can be defined
|
||||
keep_alive: -1
|
||||
options:
|
||||
num_ctx: 8192 # make sure the context matches other services that are using ollama
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
@@ -149,11 +171,12 @@ For OpenAI-compatible servers (such as llama.cpp) that don't expose the configur
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: openai
|
||||
base_url: http://your-llama-server
|
||||
model: your-model-name
|
||||
provider_options:
|
||||
context_size: 8192 # Specify the configured context size
|
||||
my_provider:
|
||||
provider: openai
|
||||
base_url: http://your-llama-server
|
||||
model: your-model-name
|
||||
provider_options:
|
||||
context_size: 8192 # Specify the configured context size
|
||||
```
|
||||
|
||||
This ensures Frigate uses the correct context window size when generating prompts.
|
||||
@@ -176,10 +199,11 @@ This ensures Frigate uses the correct context window size when generating prompt
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: openai
|
||||
base_url: http://your-server:port
|
||||
api_key: your-api-key # May not be required for local servers
|
||||
model: your-model-name
|
||||
my_provider:
|
||||
provider: openai
|
||||
base_url: http://your-server:port
|
||||
api_key: your-api-key # May not be required for local servers
|
||||
model: your-model-name
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
@@ -217,19 +241,21 @@ Ollama also supports [cloud models](https://ollama.com/cloud), where model infer
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: ollama
|
||||
base_url: http://localhost:11434
|
||||
model: cloud-model-name
|
||||
my_provider:
|
||||
provider: ollama
|
||||
base_url: http://localhost:11434
|
||||
model: cloud-model-name
|
||||
```
|
||||
|
||||
or when using Ollama Cloud directly
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: ollama
|
||||
base_url: https://ollama.com
|
||||
model: cloud-model-name
|
||||
api_key: your-api-key
|
||||
my_provider:
|
||||
provider: ollama
|
||||
base_url: https://ollama.com
|
||||
model: cloud-model-name
|
||||
api_key: your-api-key
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
@@ -267,9 +293,10 @@ To start using Gemini, you must first get an API key from [Google AI Studio](htt
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: gemini
|
||||
api_key: "{FRIGATE_GEMINI_API_KEY}"
|
||||
model: gemini-2.5-flash
|
||||
my_provider:
|
||||
provider: gemini
|
||||
api_key: "{FRIGATE_GEMINI_API_KEY}"
|
||||
model: gemini-2.5-flash
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
@@ -279,12 +306,13 @@ genai:
|
||||
|
||||
To use a different Gemini-compatible API endpoint, set the `provider_options` with the `base_url` key to your provider's API URL. For example:
|
||||
|
||||
```yaml {4,5}
|
||||
```yaml {5,6}
|
||||
genai:
|
||||
provider: gemini
|
||||
...
|
||||
provider_options:
|
||||
base_url: https://...
|
||||
my_provider:
|
||||
provider: gemini
|
||||
...
|
||||
provider_options:
|
||||
base_url: https://...
|
||||
```
|
||||
|
||||
Other HTTP options are available, see the [python-genai documentation](https://github.com/googleapis/python-genai).
|
||||
@@ -318,9 +346,10 @@ To start using OpenAI, you must first [create an API key](https://platform.opena
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: openai
|
||||
api_key: "{FRIGATE_OPENAI_API_KEY}"
|
||||
model: gpt-4o
|
||||
my_provider:
|
||||
provider: openai
|
||||
api_key: "{FRIGATE_OPENAI_API_KEY}"
|
||||
model: gpt-4o
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
@@ -336,13 +365,14 @@ To use a different OpenAI-compatible API endpoint, set the `OPENAI_BASE_URL` env
|
||||
|
||||
For OpenAI-compatible servers (such as llama.cpp) that don't expose the configured context size in the API response, you can manually specify the context size in `provider_options`:
|
||||
|
||||
```yaml {5,6}
|
||||
```yaml {6,7}
|
||||
genai:
|
||||
provider: openai
|
||||
base_url: http://your-llama-server
|
||||
model: your-model-name
|
||||
provider_options:
|
||||
context_size: 8192 # Specify the configured context size
|
||||
my_provider:
|
||||
provider: openai
|
||||
base_url: http://your-llama-server
|
||||
model: your-model-name
|
||||
provider_options:
|
||||
context_size: 8192 # Specify the configured context size
|
||||
```
|
||||
|
||||
This ensures Frigate uses the correct context window size when generating prompts.
|
||||
@@ -377,10 +407,11 @@ To start using Azure OpenAI, you must first [create a resource](https://learn.mi
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: azure_openai
|
||||
base_url: https://instance.cognitiveservices.azure.com/openai/responses?api-version=2025-04-01-preview
|
||||
model: gpt-5-mini
|
||||
api_key: "{FRIGATE_OPENAI_API_KEY}"
|
||||
my_provider:
|
||||
provider: azure_openai
|
||||
base_url: https://instance.cognitiveservices.azure.com/openai/responses?api-version=2025-04-01-preview
|
||||
model: gpt-5-mini
|
||||
api_key: "{FRIGATE_OPENAI_API_KEY}"
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
|
||||
@@ -52,9 +52,10 @@ You can define custom prompts at the global level and per-object type. To config
|
||||
|
||||
```yaml
|
||||
genai:
|
||||
provider: ollama
|
||||
base_url: http://localhost:11434
|
||||
model: qwen3-vl:8b-instruct
|
||||
my_provider:
|
||||
provider: ollama
|
||||
base_url: http://localhost:11434
|
||||
model: qwen3-vl:8b-instruct
|
||||
|
||||
objects:
|
||||
genai:
|
||||
|
||||
@@ -196,7 +196,7 @@ services:
|
||||
|
||||
:::
|
||||
|
||||
See [go2rtc WebRTC docs](https://github.com/AlexxIT/go2rtc/tree/v1.8.3#module-webrtc) for more information about this.
|
||||
See [go2rtc WebRTC docs](https://github.com/AlexxIT/go2rtc/tree/v1.9.14#module-webrtc) for more information about this.
|
||||
|
||||
### Two way talk
|
||||
|
||||
|
||||
@@ -232,6 +232,21 @@ No. Only one profile can be active at a time. Activating a new profile automatic
|
||||
|
||||
When you delete a base zone or mask in the Frigate UI, any profile overrides for that entry are deleted automatically as part of the same operation. If you remove a base entry by editing your config file directly and leave a profile override behind, the config will fail validation at startup until the orphaned override is removed as well.
|
||||
|
||||
### How do I make a YAML profile track no objects at all?
|
||||
|
||||
Set the tracked object list explicitly to an empty list in the profile:
|
||||
|
||||
```yaml
|
||||
cameras:
|
||||
front_door:
|
||||
profiles:
|
||||
home:
|
||||
objects:
|
||||
track: []
|
||||
```
|
||||
|
||||
Leaving the `objects` section empty (or omitting `track`) does not clear the list. Empty sections set no fields, so the profile inherits the full tracked object list from the base config, including anything set at the global level. The same applies to other lists, such as `audio.listen`.
|
||||
|
||||
### Why are some settings missing when I configure a profile override?
|
||||
|
||||
Fields that require a Frigate restart to take effect cannot be overridden by profiles, since profiles are applied at runtime without restarting. Those fields are hidden when editing a profile override and can only be changed on the base configuration.
|
||||
|
||||
@@ -163,8 +163,8 @@ genai:
|
||||
model: your-model-name
|
||||
roles:
|
||||
- embeddings
|
||||
- vision
|
||||
- tools
|
||||
- descriptions
|
||||
- chat
|
||||
|
||||
semantic_search:
|
||||
enabled: True
|
||||
|
||||
@@ -281,7 +281,7 @@ For advanced usecases, this behavior can be changed with the [RTSP URL
|
||||
template](#options) option. When set, this string will override the default stream
|
||||
address that is derived from the default behavior described above. This option supports
|
||||
[jinja2 templates](https://jinja.palletsprojects.com/) and has the `camera` dict
|
||||
variables from [Frigate API](../integrations/api)
|
||||
variables from [Frigate API](/integrations/api/frigate-http-api)
|
||||
available for the template. Note that no Home Assistant state is available to the
|
||||
template, only the camera dict from Frigate.
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ MQTT requires a network connection to your broker. This is typically local, but
|
||||
### `frigate/available`
|
||||
|
||||
Designed to be used as an availability topic with Home Assistant. Possible message are:
|
||||
"online": published when Frigate is running (on startup)
|
||||
"online": published once Frigate is running and has published its initial state. Note that this is published on every connection to the broker, so it is republished if the broker restarts or the connection drops and recovers, without Frigate itself restarting.
|
||||
"stopped": published when Frigate is stopped normally
|
||||
"offline": published automatically by the MQTT broker if Frigate disconnects unexpectedly (via MQTT Will Message)
|
||||
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
---
|
||||
id: common_errors
|
||||
title: Common Error Messages
|
||||
---
|
||||
|
||||
import FaqItem from "@site/src/components/FaqItem";
|
||||
|
||||
This page is an index of error messages you might see in Frigate's logs, what each one means, and where to go next. It is organized by the kind of problem, not by which component logged the message.
|
||||
|
||||
Two things to know before you start:
|
||||
|
||||
- **Many of these messages come from FFmpeg, go2rtc, GPU drivers, or the operating system, not from Frigate itself.** Frigate captures and re-logs their output, so the log level shown in the Frigate UI does not always reflect the original severity.
|
||||
- **Wrapped errors put the real cause on the next line.** When Frigate logs a generic message like `Error occurred when attempting to maintain recording cache`, the actual exception is logged immediately after it. When a camera's FFmpeg process exits, Frigate logs `The following ffmpeg logs include the last 100 lines prior to exit` and dumps that camera's FFmpeg output. Always read those lines, they are where the answer usually is.
|
||||
|
||||
## Camera connection and streams
|
||||
|
||||
<FaqItem id="connection-refused-no-route-to-host-401-404" question="Connection refused / No route to host / 401 Unauthorized / 404 Not Found">
|
||||
|
||||
These are FFmpeg errors about reaching the camera (or the go2rtc restream). `Connection refused` and `No route to host` mean nothing is listening at that address or the host is unreachable; `401 Unauthorized` is wrong credentials; `404 Not Found` is a wrong stream path (or a `restream` input pointing at a go2rtc stream name that does not exist). A camera that has hit its concurrent-connection limit can also return `refused` or `401` on a URL that works in VLC.
|
||||
|
||||
See [go2rtc troubleshooting](/troubleshooting/go2rtc#1-read-the-go2rtc-logs) for how to isolate the stream.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="no-frames-received-in-20-seconds" question="No frames received from <camera> in 20 seconds. Exiting ffmpeg...">
|
||||
|
||||
FFmpeg is running but has stopped delivering video for 20 seconds, so Frigate's camera watchdog restarts it. The stream connected at least once, then went quiet: a camera reboot, a network drop, the camera evicting the connection, or a stalled decoder. If it repeats on a loop, the stream is unstable.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="ffmpeg-process-crashed-unexpectedly" question="Ffmpeg process crashed unexpectedly for <camera>">
|
||||
|
||||
The detect FFmpeg process exited on its own. This message is only the notification; the cause is in the 100 FFmpeg log lines Frigate dumps right after it (look for a `Failed to sync surface`, `Connection refused`, codec, or audio error in that block). Related watchdog messages include `<camera> exceeded fps limit`, which means the camera is delivering frames faster than `detect.fps` (usually a camera whose real frame rate differs from what is configured).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="non-monotonically-increasing-dts" question="Application provided invalid, non monotonically increasing dts to muxer">
|
||||
|
||||
An FFmpeg message meaning the camera sent packets with out-of-order timestamps. Because recordings are copied without re-encoding, FFmpeg cannot fix them, and the segment muxer often splits early, producing one-second segments and a cache backlog. The usual cause is a camera "Smart Codec" / H.264+ / H.265+ mode or a camera clock that jumps.
|
||||
|
||||
See [Recordings: segments are only 1 second long](/troubleshooting/recordings#segments-are-only-1-second-long).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="bad-cseq" question="RTP: PT=xx: bad cseq (packet loss / reordering)">
|
||||
|
||||
An FFmpeg message meaning RTP packets arrived out of sequence, which almost always means the stream is using UDP transport. Frigate's RTSP presets force TCP, so seeing this points at a custom `input_args`, `preset-rtsp-udp`, or a go2rtc source that is not using TCP. Switch to TCP unless your camera is [UDP-only](/configuration/camera_specific#udp-only-cameras).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="error-while-decoding-mb-non-existing-pps" question="error while decoding MB / non-existing PPS referenced (corrupt frames)">
|
||||
|
||||
FFmpeg decoder messages meaning the received video bitstream was incomplete or damaged. A few of these at every stream start are normal (the decoder connected before the first keyframe) and Frigate discards them. A continuous stream of them means real packet loss, from Wi-Fi or a saturated link, an overloaded camera, or an FFmpeg restart loop caused by another problem. Fix the underlying instability rather than the message.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="could-not-find-codec-parameters" question="Could not find codec parameters for stream ... unspecified size">
|
||||
|
||||
An FFmpeg message meaning it probed the stream but never saw enough decodable video to determine the frame size, often because the probe window ended before the first keyframe on a long-GOP stream, or because the stream is not delivering usable video. If it is a Reolink HTTP stream, use `preset-http-reolink`, which raises the probe size for exactly this case.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
## Recording
|
||||
|
||||
<FaqItem id="no-new-recording-segments" question="No new recording segments were created for <camera> in the last 120s">
|
||||
|
||||
Frigate's record watchdog is restarting the record FFmpeg process because no valid segment has reached the cache. This means the record stream is not connecting or the segments are being rejected (see the audio-codec entry below).
|
||||
|
||||
See [Recordings: the record stream isn't connecting](/troubleshooting/recordings#the-record-stream-isnt-connecting).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="invalid-or-missing-video-stream-in-segment" question="Invalid or missing video stream in segment. Discarding.">
|
||||
|
||||
A cached recording segment failed validation (no readable video stream) and was deleted. The most common cause is a segment that was truncated because the record FFmpeg process was killed mid-write, so this often appears alongside, and as a consequence of, the record-stream restarts above. A segment containing only audio triggers it too.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="incompatible-audio-codec" question="Recordings silently fail to save (incompatible audio codec)">
|
||||
|
||||
Some camera audio codecs (G.711 variants such as `pcm_alaw` and `pcm_mulaw`) cannot be stored in an MP4 container, so segments never finalize even though live view works.
|
||||
|
||||
See [Recordings: incompatible audio codec](/troubleshooting/recordings#incompatible-audio-codec-recordings-silently-fail-to-save) for the FFmpeg preset that transcodes the audio to AAC.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="error-maintaining-recording-cache" question="Error occurred when attempting to maintain recording cache">
|
||||
|
||||
A generic wrapper; the real exception is on the next log line. Frequently it is `[Errno 28] No space left on device` or `[Errno 17] File exists` on a network share.
|
||||
|
||||
See [Recordings cache warnings and errors](/troubleshooting/recordings#i-see-the-message-error--error-occurred-when-attempting-to-maintain-recording-cache), which covers this message and the common `Errno` cases.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
## Hardware acceleration
|
||||
|
||||
<FaqItem id="failed-to-sync-surface" question="Failed to sync surface / Failed to download frame: -5 / Error while filtering">
|
||||
|
||||
A VAAPI/QSV hardware frame-sync failure between FFmpeg and the GPU driver, not a Frigate bug. It usually appears when the detect stream is being scaled or decoded on the GPU.
|
||||
|
||||
See [GPU: Failed to download frame: -5](/troubleshooting/gpu#failed-to-download-frame--5), which lists the fixes in order (switch VAAPI/QSV preset, change `LIBVA_DRIVER_NAME`, use an H.264 substream, match detect resolution and fps to the stream).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="no-decoder-surfaces-left" question="No decoder surfaces left / Can't allocate a surface">
|
||||
|
||||
Both mean the GPU ran out of decode surfaces: `No decoder surfaces left` is NVIDIA NVDEC, `Can't allocate a surface` is Intel QSV. This is surface-pool exhaustion, typically from too many concurrent hardware-decoded cameras on one GPU (consumer NVIDIA cards have a driver-enforced limit on simultaneous decode sessions). Reduce the number of cameras decoding on that GPU, decode some on the CPU, or move to hardware without the session cap.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="nvidia-container-cli-nvml-error" question="nvidia-container-cli: nvml error: driver not loaded">
|
||||
|
||||
This comes from the NVIDIA container runtime while starting the container, not from Frigate, and the container never starts. The NVIDIA driver is not loaded on the host. Confirm `nvidia-smi` works on the host itself (not inside the container) before troubleshooting Frigate. In a VM or LXC, the driver must be available inside the guest. See [Hardware: Nvidia GPU](/configuration/hardware_acceleration_video).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
## Detectors and models
|
||||
|
||||
<FaqItem id="illegal-instruction" question="Illegal instruction (core dumped)">
|
||||
|
||||
The process was killed by the CPU for executing an unsupported instruction. There are two distinct causes in Frigate:
|
||||
|
||||
- **A Coral EdgeTPU** on a newer kernel with an outdated gasket driver. See [EdgeTPU: Illegal instruction](/troubleshooting/edgetpu#attempting-to-load-tpu-as-pci--fatal-python-error-illegal-instruction).
|
||||
- **A CPU without AVX/AVX2**, when enabling semantic search, face recognition, license plate recognition, classification, or audio transcription. These features use libraries compiled with AVX and crash immediately on CPUs that lack it (commonly Intel Celeron/Pentium before the 2020 Tiger Lake generation). See the [CPU requirements](/frigate/planning_setup#cpu).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="onnx-invalidprotobuf" question="ONNX Runtime InvalidProtobuf / failed to load model">
|
||||
|
||||
ONNX Runtime could not parse the model file. The file exists but its contents are not a valid ONNX model, usually a corrupted or interrupted download in `model_cache`, or the wrong file pointed at by `model.path`. Delete the cached model file so Frigate re-downloads it, and confirm `model.path` points at an actual `.onnx` model. See [ONNX detector configuration](/configuration/object_detectors#onnx).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="cuda-failure-999-901" question="CUDA failure 999 / CUDA failure 901">
|
||||
|
||||
ONNX Runtime CUDA errors. `999` (`cudaErrorUnknown`) is a general, unrecoverable CUDA context failure, usually a driver/runtime version mismatch between the host and the container or a GPU in a bad state. `901` is a CUDA-graph capture error, which points at a custom model whose operations are not capture-safe. For `999`, align the host driver with the container's CUDA version and confirm the GPU is healthy.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="openvino-no-supported-devices" question="Can't get OPTIMIZATION_CAPABILITIES property as no supported devices found">
|
||||
|
||||
OpenVINO could not find the configured device (usually `GPU` or `NPU`). Most often the `/dev/dri` render node is not passed into the container, or the wrong render node is mapped when an iGPU and a discrete GPU coexist.
|
||||
|
||||
See [GPU: no supported devices found](/troubleshooting/gpu#cant-get-optimization_capabilities-property-as-no-supported-devices-found).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
## Memory and storage
|
||||
|
||||
<FaqItem id="fatal-python-error-bus-error" question="Fatal Python error: Bus error">
|
||||
|
||||
Frigate ran out of shared memory (`/dev/shm`). The container's `shm_size` is too small for the number and resolution of your detect streams, or you added cameras after startup without increasing it.
|
||||
|
||||
See [Calculating required shm-size](/frigate/installation#calculating-required-shm-size). If you cannot increase `shm_size`, lowering the `SHM_MAX_FRAMES` environment variable reduces how many frames Frigate buffers per camera.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="errno-28-no-space-left" question="[Errno 28] No space left on device">
|
||||
|
||||
A filesystem is full: the recordings volume (`/media/frigate`), the cache tmpfs (`/tmp/cache`), or `/dev/shm`. Check which one, and note that inode exhaustion can produce this while `df -h` still shows free space.
|
||||
|
||||
See [Recordings: No space left on device](/troubleshooting/recordings#i-see-the-message-error--error-occurred-when-attempting-to-maintain-recording-cache).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="container-exits-with-no-logs" question="The container exits or restarts with no error in the logs">
|
||||
|
||||
A silent exit is usually the host or container out-of-memory killer. Because `/dev/shm` and `/tmp/cache` are memory-backed, they count against the container's memory limit, so aggressive shm or cache sizing can trigger it. Give the container more memory, or reduce shm/cache sizing, and check the host's OOM messages (`dmesg`).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
## Database
|
||||
|
||||
<FaqItem id="database-is-locked" question="database is locked">
|
||||
|
||||
SQLite could not acquire the write lock. Frigate's timeout already scales with camera count, so under normal local-disk operation this essentially only happens when the database is on a network share (SMB/NFS), where file locking is unreliable, or when two instances point at the same file.
|
||||
|
||||
See [Database is locked](/troubleshooting/faqs#error-database-is-locked).
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="database-disk-image-is-malformed" question="database disk image is malformed">
|
||||
|
||||
The SQLite database file is corrupted, typically after hard power loss, a network-share database, or a filesystem with unsafe write semantics. Frigate does not repair it automatically, but the database can usually be recovered by hand.
|
||||
|
||||
**Stop Frigate first**, then work on the database file directly (by default `/config/frigate.db`). Start by checking what is actually wrong:
|
||||
|
||||
```bash
|
||||
sqlite3 frigate.db "PRAGMA integrity_check;"
|
||||
```
|
||||
|
||||
If the only problems reported are index-related (lines such as `row 14 missing from index recordings_path` or `non-unique entry in index ...`), rebuilding the indexes is usually enough and is the least destructive fix:
|
||||
|
||||
```bash
|
||||
sqlite3 frigate.db "REINDEX;"
|
||||
```
|
||||
|
||||
If the integrity check reports page or byte-level corruption instead (for example `Multiple uses for byte 2706 of page 142272`), dump the readable contents into a new database:
|
||||
|
||||
```bash
|
||||
# dump what can still be read
|
||||
sqlite3 frigate.db .dump > frigate.dump
|
||||
|
||||
# keep the corrupt file, then rebuild from the dump
|
||||
mv frigate.db frigate.db.bak
|
||||
cat frigate.dump | sqlite3 frigate.db
|
||||
|
||||
# confirm the rebuilt database is clean, this should print "ok"
|
||||
sqlite3 frigate.db "PRAGMA integrity_check;"
|
||||
```
|
||||
|
||||
Rows stored in the corrupted pages cannot be recovered, so expect to lose some tracked objects, review items, or thumbnails. Recordings themselves are files on disk and are not affected.
|
||||
|
||||
As a last resort, stop Frigate, delete `frigate.db`, and restart. Frigate recreates it, but existing recordings lose all of their metadata. If a `backup.db` exists next to your database, Frigate wrote it before the last schema migration and restoring it recovers everything up to that point.
|
||||
|
||||
Repeat corruption usually points at the underlying storage: move the database off a network share, and on Raspberry Pi check power delivery and the SD card or SSD.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
## Startup and web access
|
||||
|
||||
<FaqItem id="unable-to-start-frigate-in-safe-mode" question="Unable to start Frigate in safe mode / Starting Frigate in safe mode">
|
||||
|
||||
When your config fails validation at startup, Frigate prints the validation errors (with line numbers), then starts in **safe mode**: a minimal configuration with no cameras and MQTT disabled, so the UI stays reachable. In safe mode the only available page is the Config Editor, which shows the validation errors so you can fix them, then save and restart. Note that recording retention and storage cleanup do **not** run while in safe mode, so do not leave a low-disk system sitting in it.
|
||||
|
||||
`Unable to start Frigate in safe mode` means even the minimal config failed, which points at an error in your `auth`, `proxy`, or `database` section, or a config file that is not valid YAML at all. Safe mode is not sticky; fix the config and restart and Frigate returns to normal.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="502-bad-gateway" question="502 Bad Gateway / connection refused to 127.0.0.1:5001">
|
||||
|
||||
The web server is up but the Frigate backend (port 5001) is not answering yet. By far the most common reason is that the page was loaded during startup: the API binds last, after database migrations (which can take minutes on a large database), model downloads, and process startup, while the web server is already serving. Wait for startup to finish. If it persists, the backend has failed to start, and the reason is earlier in the logs. This also explains a `connection refused to 127.0.0.1:5001` seen while loading `/ws`, because every authenticated request first makes an auth subrequest to that port.
|
||||
|
||||
</FaqItem>
|
||||
@@ -428,3 +428,19 @@ You'll want to:
|
||||
- [Tune your motion detection settings](/configuration/motion_detection) either by editing your config file or by using the UI's Motion Tuner.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
<FaqItem id="my-timeline-previews-are-black-after-restarting-frigate-or-recreating-the-container" question="My timeline previews are black after restarting Frigate or recreating the container. Why?">
|
||||
|
||||
The scrubbing previews (the timelapse clips shown when dragging the History timeline, the secondary-camera previews, and the preview that plays when hovering a review card) are not recorded continuously. Frigate caches low-resolution preview frames in `/tmp/cache` throughout each hour and only assembles them into a finished preview clip **at the top of the hour**.
|
||||
|
||||
In the recommended configuration, `/tmp/cache` is a small in-memory (`tmpfs`) area. When Frigate starts, it tries to restore the current hour's cached frames, so a **soft restart from the UI** preserves them. But if you recreate the Docker container or stop Frigate forcibly by any other means partway through an hour, the in-memory cache is discarded, so no preview clip is produced for that partial hour.
|
||||
|
||||
This is expected behavior, not a bug:
|
||||
|
||||
- Previews for hours that already completed and were written to disk are unaffected.
|
||||
- The next full hour after a restart will generate previews normally.
|
||||
- This is unrelated to `shm_size`; increasing shared memory does not change it.
|
||||
|
||||
To avoid the gap, use the **Restart Frigate** button in the UI's Settings menu rather than recreating the container when possible.
|
||||
|
||||
</FaqItem>
|
||||
|
||||
@@ -34,7 +34,7 @@ All of your exports live on the **Exports** page, reachable from the main naviga
|
||||
- **Rename** it, and
|
||||
- **Delete** it: deleting is the only way an export is removed.
|
||||
|
||||
You can also select multiple exports at once to **delete** them in bulk, or to **add them to** (or **remove them from**) a [case](#cases).
|
||||
You can also select multiple exports at once to **delete** them in bulk, or to **add them to** (or **remove them from**) a [case](#cases). To download multiple exports as a zip archive, add them to a **case** and use the Download button there.
|
||||
|
||||
## Cases
|
||||
|
||||
|
||||
Generated
+4
-3
@@ -19,6 +19,7 @@
|
||||
"docusaurus-plugin-openapi-docs": "^4.5.1",
|
||||
"docusaurus-theme-openapi-docs": "^4.5.1",
|
||||
"js-yaml": "^4.1.1",
|
||||
"marked": "^16.4.2",
|
||||
"prism-react-renderer": "^2.4.1",
|
||||
"raw-loader": "^4.0.2",
|
||||
"react": "^18.3.1",
|
||||
@@ -12320,9 +12321,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/immutable": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
|
||||
"integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
|
||||
"version": "5.1.9",
|
||||
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
|
||||
"integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/import-fresh": {
|
||||
|
||||
@@ -30,6 +30,7 @@ const sidebars: SidebarsConfig = {
|
||||
],
|
||||
Configuration: [
|
||||
"configuration/config",
|
||||
"configuration/config_overrides",
|
||||
{
|
||||
type: "category",
|
||||
label: "Detectors",
|
||||
@@ -165,6 +166,7 @@ const sidebars: SidebarsConfig = {
|
||||
],
|
||||
Troubleshooting: [
|
||||
"troubleshooting/faqs",
|
||||
"troubleshooting/common_errors",
|
||||
"troubleshooting/go2rtc",
|
||||
"troubleshooting/recordings",
|
||||
"troubleshooting/dummy-camera",
|
||||
|
||||
Vendored
+5
@@ -8244,6 +8244,11 @@ components:
|
||||
properties:
|
||||
provider:
|
||||
$ref: '#/components/schemas/GenAIProviderEnum'
|
||||
name:
|
||||
anyOf:
|
||||
- type: string
|
||||
- type: 'null'
|
||||
title: Name
|
||||
api_key:
|
||||
anyOf:
|
||||
- type: string
|
||||
|
||||
+9
-2
@@ -196,7 +196,7 @@ def genai_models(request: Request):
|
||||
"before saving the configuration."
|
||||
),
|
||||
)
|
||||
async def genai_probe(body: GenAIProbeBody):
|
||||
async def genai_probe(request: Request, body: GenAIProbeBody):
|
||||
load_providers()
|
||||
|
||||
provider_cls = PROVIDERS.get(body.provider)
|
||||
@@ -206,6 +206,13 @@ async def genai_probe(body: GenAIProbeBody):
|
||||
content={"success": False, "message": "Unknown provider"},
|
||||
)
|
||||
|
||||
api_key = body.api_key
|
||||
if api_key == REDACTED_CREDENTIAL_SENTINEL:
|
||||
saved_cfg = (
|
||||
request.app.frigate_config.genai.get(body.name) if body.name else None
|
||||
)
|
||||
api_key = saved_cfg.api_key if saved_cfg else None
|
||||
|
||||
# The OpenAI-compatible SDKs accept "timeout" as a constructor kwarg via
|
||||
# provider_options; other plugins use GenAIClient.timeout passed below.
|
||||
# Don't inject timeout for Gemini — its HttpOptions interprets the value
|
||||
@@ -217,7 +224,7 @@ async def genai_probe(body: GenAIProbeBody):
|
||||
try:
|
||||
transient_cfg = GenAIConfig(
|
||||
provider=body.provider,
|
||||
api_key=body.api_key,
|
||||
api_key=api_key,
|
||||
base_url=body.base_url,
|
||||
provider_options=probe_provider_options,
|
||||
# model is required by the schema but irrelevant for listing.
|
||||
|
||||
@@ -14,6 +14,7 @@ class AppConfigSetBody(BaseModel):
|
||||
|
||||
class GenAIProbeBody(BaseModel):
|
||||
provider: GenAIProviderEnum
|
||||
name: str | None = None
|
||||
api_key: str | None = None
|
||||
base_url: str | None = None
|
||||
provider_options: dict[str, Any] = Field(default_factory=dict)
|
||||
|
||||
+15
-10
@@ -1538,15 +1538,18 @@ async def set_description(
|
||||
event.data["description"] = new_description
|
||||
event.save()
|
||||
|
||||
# If semantic search is enabled, update the index
|
||||
if request.app.frigate_config.semantic_search.enabled:
|
||||
context: EmbeddingsContext = request.app.embeddings
|
||||
context: EmbeddingsContext | None = request.app.embeddings
|
||||
|
||||
if context is not None:
|
||||
if len(new_description) > 0:
|
||||
context.update_description(
|
||||
event_id,
|
||||
new_description,
|
||||
)
|
||||
# If semantic search is enabled, update the index
|
||||
if request.app.frigate_config.semantic_search.enabled:
|
||||
context.update_description(
|
||||
event_id,
|
||||
new_description,
|
||||
)
|
||||
else:
|
||||
# embeddings are always cleaned up so they don't outlive their description
|
||||
context.db.delete_embeddings_description(event_ids=[event_id])
|
||||
|
||||
response_message = (
|
||||
@@ -1675,9 +1678,11 @@ async def delete_single_event(event_id: str, request: Request) -> dict:
|
||||
event.delete_instance()
|
||||
Timeline.delete().where(Timeline.source_id == event_id).execute()
|
||||
|
||||
# If semantic search is enabled, update the index
|
||||
if request.app.frigate_config.semantic_search.enabled:
|
||||
context: EmbeddingsContext = request.app.embeddings
|
||||
# embeddings are always cleaned up, even when semantic search is disabled,
|
||||
# so that they don't outlive their events
|
||||
context: EmbeddingsContext | None = request.app.embeddings
|
||||
|
||||
if context is not None:
|
||||
context.db.delete_embeddings_thumbnail(event_ids=[event_id])
|
||||
context.db.delete_embeddings_description(event_ids=[event_id])
|
||||
|
||||
|
||||
+1
-1
@@ -270,7 +270,7 @@ class FrigateApp:
|
||||
10
|
||||
* len([c for c in self.config.cameras.values() if c.enabled_in_config]),
|
||||
),
|
||||
load_vec_extension=self.config.semantic_search.enabled,
|
||||
load_vec_extension=True,
|
||||
)
|
||||
models = [
|
||||
Event,
|
||||
|
||||
@@ -23,7 +23,6 @@ from frigate.const import (
|
||||
EXPIRE_AUDIO_ACTIVITY,
|
||||
INSERT_MANY_RECORDINGS,
|
||||
INSERT_PREVIEW,
|
||||
NOTIFICATION_TEST,
|
||||
REQUEST_REGION_GRID,
|
||||
UPDATE_AUDIO_ACTIVITY,
|
||||
UPDATE_AUDIO_TRANSCRIPTION_STATE,
|
||||
@@ -57,7 +56,6 @@ _WS_BLOCKED_TOPICS = frozenset(
|
||||
UPDATE_EMBEDDINGS_REINDEX_PROGRESS,
|
||||
UPDATE_BIRDSEYE_LAYOUT,
|
||||
UPDATE_AUDIO_TRANSCRIPTION_STATE,
|
||||
NOTIFICATION_TEST,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -640,7 +640,7 @@ class FrigateConfig(FrigateBaseModel):
|
||||
# set notifications state
|
||||
self.notifications.enabled_in_config = self.notifications.enabled
|
||||
|
||||
# validate genai: each role (tools, vision, embeddings) at most once
|
||||
# validate genai: each role (chat, descriptions, embeddings) at most once
|
||||
role_to_name: dict[GenAIRoleEnum, str] = {}
|
||||
for name, genai_cfg in self.genai.items():
|
||||
for role in genai_cfg.roles:
|
||||
|
||||
@@ -288,6 +288,10 @@ class FaceRealTimeProcessor(RealTimeProcessorApi):
|
||||
max(0, face_box[0]) : min(frame.shape[1], face_box[2]),
|
||||
]
|
||||
|
||||
if face_frame.size == 0:
|
||||
logger.debug(f"Empty face crop for {id}")
|
||||
return
|
||||
|
||||
res = self.recognizer.classify(face_frame)
|
||||
|
||||
if not res:
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
import logging
|
||||
import sqlite3
|
||||
from typing import Any
|
||||
|
||||
import regex
|
||||
from playhouse.sqliteq import SqliteQueueDatabase
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
REGEXP_TIMEOUT_SECONDS = 1.0
|
||||
|
||||
|
||||
@@ -28,8 +31,14 @@ class SqliteVecQueueDatabase(SqliteQueueDatabase):
|
||||
|
||||
def _load_vec_extension(self, conn: sqlite3.Connection) -> None:
|
||||
conn.enable_load_extension(True)
|
||||
conn.load_extension(self.sqlite_vec_path)
|
||||
conn.enable_load_extension(False)
|
||||
|
||||
try:
|
||||
conn.load_extension(self.sqlite_vec_path)
|
||||
except conn.OperationalError:
|
||||
logger.error("Unable to load the sqlite-vec extension")
|
||||
self.load_vec_extension = False
|
||||
finally:
|
||||
conn.enable_load_extension(False)
|
||||
|
||||
def _register_regexp(self, conn: sqlite3.Connection) -> None:
|
||||
def regexp(expr: str, item: str | None) -> bool:
|
||||
@@ -44,13 +53,33 @@ class SqliteVecQueueDatabase(SqliteQueueDatabase):
|
||||
|
||||
conn.create_function("REGEXP", 2, regexp)
|
||||
|
||||
def delete_embeddings_thumbnail(self, event_ids: list[str]) -> None:
|
||||
def _delete_embeddings(self, table: str, event_ids: list[str]) -> None:
|
||||
"""Delete embeddings for the given events, if the table exists.
|
||||
|
||||
Embeddings outlive the events they belong to when semantic search is
|
||||
disabled, so deletes are attempted regardless of the current config.
|
||||
"""
|
||||
if not event_ids or not self.load_vec_extension:
|
||||
return
|
||||
|
||||
# the embeddings tables are only created once semantic search has run
|
||||
cursor = self.execute_sql(
|
||||
"SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?",
|
||||
(table,),
|
||||
)
|
||||
|
||||
if cursor.fetchone() is None:
|
||||
logger.debug("Skipping %s cleanup, table does not exist", table)
|
||||
return
|
||||
|
||||
ids = ",".join(["?" for _ in event_ids])
|
||||
self.execute_sql(f"DELETE FROM vec_thumbnails WHERE id IN ({ids})", event_ids)
|
||||
self.execute_sql(f"DELETE FROM {table} WHERE id IN ({ids})", event_ids)
|
||||
|
||||
def delete_embeddings_thumbnail(self, event_ids: list[str]) -> None:
|
||||
self._delete_embeddings("vec_thumbnails", event_ids)
|
||||
|
||||
def delete_embeddings_description(self, event_ids: list[str]) -> None:
|
||||
ids = ",".join(["?" for _ in event_ids])
|
||||
self.execute_sql(f"DELETE FROM vec_descriptions WHERE id IN ({ids})", event_ids)
|
||||
self._delete_embeddings("vec_descriptions", event_ids)
|
||||
|
||||
def drop_embeddings_tables(self) -> None:
|
||||
self.execute_sql("""
|
||||
|
||||
@@ -93,7 +93,7 @@ class ModelConfig(BaseModel):
|
||||
model_type: ModelTypeEnum = Field(
|
||||
default=ModelTypeEnum.ssd,
|
||||
title="Object Detection Model Type",
|
||||
description="Detector model architecture type (ssd, yolox, yolonas) used by some detectors for optimization.",
|
||||
description="Detector model architecture type (ssd, yolox, yolonas, yolo-generic, rfdetr, dfine) used by some detectors for optimization.",
|
||||
)
|
||||
_merged_labelmap: dict[int, str] | None = PrivateAttr()
|
||||
_colormap: dict[int, tuple[int, int, int]] = PrivateAttr()
|
||||
|
||||
@@ -366,9 +366,10 @@ class EventCleanup(threading.Thread):
|
||||
logger.debug(f"Deleting {len(chunk)} events from the database")
|
||||
Event.delete().where(Event.id << chunk).execute()
|
||||
|
||||
if self.config.semantic_search.enabled:
|
||||
self.db.delete_embeddings_description(event_ids=chunk)
|
||||
self.db.delete_embeddings_thumbnail(event_ids=chunk)
|
||||
logger.debug(f"Deleted {len(ids_to_delete)} embeddings")
|
||||
# embeddings are always cleaned up, even when semantic search
|
||||
# is disabled, so that they don't outlive their events
|
||||
self.db.delete_embeddings_description(event_ids=chunk)
|
||||
self.db.delete_embeddings_thumbnail(event_ids=chunk)
|
||||
logger.debug(f"Deleted {len(chunk)} embeddings")
|
||||
|
||||
logger.info("Exiting event cleanup...")
|
||||
|
||||
@@ -192,7 +192,7 @@ class LlamaCppClient(GenAIClient):
|
||||
logger.info(
|
||||
"llama.cpp model '%s' initialized — context: %s, vision: %s, audio: %s, tools: %s, reasoning: %s",
|
||||
configured_model,
|
||||
self._context_size or "unknown",
|
||||
self.get_context_size(),
|
||||
self._supports_vision,
|
||||
self._supports_audio,
|
||||
self._supports_tools,
|
||||
|
||||
@@ -159,6 +159,8 @@ class FFMpegConverter(threading.Thread):
|
||||
f"duration {self.frame_times[t_idx + 1] - self.frame_times[t_idx]}"
|
||||
)
|
||||
|
||||
Path(self.path).parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
try:
|
||||
p = sp.run(
|
||||
self.ffmpeg_cmd.split(" "),
|
||||
|
||||
@@ -132,6 +132,77 @@ class TestHttpApp(BaseTestHttp):
|
||||
"models": ["fake-model-a", "fake-model-b"],
|
||||
}
|
||||
|
||||
def test_genai_probe_resolves_sentinel_to_saved_api_key(self):
|
||||
# After a save the UI's api_key field holds the redaction sentinel;
|
||||
# the probe must substitute the saved key for the named entry instead
|
||||
# of sending the literal sentinel to the provider (GH discussion 23754).
|
||||
probed_keys: list[str | None] = []
|
||||
|
||||
class CapturingClient(GenAIClient):
|
||||
def list_models(self):
|
||||
probed_keys.append(self.genai_config.api_key)
|
||||
return ["fake-model"]
|
||||
|
||||
self.minimal_config["genai"] = {
|
||||
"llm": {
|
||||
"provider": "openai",
|
||||
"api_key": "sk-saved",
|
||||
"base_url": "https://example.invalid",
|
||||
"model": "fake-model",
|
||||
}
|
||||
}
|
||||
app = super().create_app()
|
||||
|
||||
with (
|
||||
AuthTestClient(app) as client,
|
||||
patch.dict(
|
||||
frigate.genai.PROVIDERS,
|
||||
{GenAIProviderEnum.openai: CapturingClient},
|
||||
),
|
||||
):
|
||||
response = client.post(
|
||||
"/genai/probe",
|
||||
json={
|
||||
"provider": "openai",
|
||||
"name": "llm",
|
||||
"api_key": REDACTED_CREDENTIAL_SENTINEL,
|
||||
"base_url": "https://example.invalid",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
assert response.json()["success"] is True
|
||||
assert probed_keys == ["sk-saved"]
|
||||
|
||||
def test_genai_probe_sentinel_without_saved_entry_sends_no_key(self):
|
||||
# If the sentinel arrives for an entry that has no saved config, the
|
||||
# probe must drop the key entirely rather than leak the sentinel.
|
||||
probed_keys: list[str | None] = []
|
||||
|
||||
class CapturingClient(GenAIClient):
|
||||
def list_models(self):
|
||||
probed_keys.append(self.genai_config.api_key)
|
||||
return ["fake-model"]
|
||||
|
||||
app = super().create_app()
|
||||
|
||||
with (
|
||||
AuthTestClient(app) as client,
|
||||
patch.dict(
|
||||
frigate.genai.PROVIDERS,
|
||||
{GenAIProviderEnum.openai: CapturingClient},
|
||||
),
|
||||
):
|
||||
response = client.post(
|
||||
"/genai/probe",
|
||||
json={
|
||||
"provider": "openai",
|
||||
"name": "llm",
|
||||
"api_key": REDACTED_CREDENTIAL_SENTINEL,
|
||||
},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
assert probed_keys == [None]
|
||||
|
||||
def test_genai_probe_empty_list_is_treated_as_failure(self):
|
||||
# The plugin's list_models() returns [] on connection failure rather
|
||||
# than raising. The endpoint should surface that as success=false so
|
||||
|
||||
@@ -491,6 +491,34 @@ class TestLlamaCppProvider(unittest.TestCase):
|
||||
final = _final_message(self._run_with_lines(client, lines, MULTIMODAL_MESSAGES))
|
||||
self.assertEqual(final["content"], "ok")
|
||||
|
||||
def _validated_client(self, server_context_size, provider_options=None):
|
||||
"""Build a client as if the server reported the given context size."""
|
||||
cfg = GenAIConfig(
|
||||
provider="llamacpp",
|
||||
model="m",
|
||||
base_url="http://localhost:9999",
|
||||
provider_options=provider_options or {},
|
||||
)
|
||||
info = {
|
||||
"context_size": server_context_size,
|
||||
"supports_vision": False,
|
||||
"supports_audio": False,
|
||||
"supports_tools": False,
|
||||
"supports_reasoning": False,
|
||||
"media_marker": "<__media__>",
|
||||
}
|
||||
cls = PROVIDERS[GenAIProviderEnum.llamacpp]
|
||||
with patch.object(cls, "_get_model_info", return_value=info):
|
||||
return cls(cfg, timeout=5)
|
||||
|
||||
def test_server_context_size_used_without_override(self):
|
||||
client = self._validated_client(4096)
|
||||
self.assertEqual(client.get_context_size(), 4096)
|
||||
|
||||
def test_provider_options_context_size_overrides_server(self):
|
||||
client = self._validated_client(4096, {"context_size": 32768})
|
||||
self.assertEqual(client.get_context_size(), 32768)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
"""Tests for embedding cleanup on the main Frigate database.
|
||||
|
||||
Embeddings are deleted whether or not semantic search is currently enabled, so
|
||||
the delete path has to tolerate databases where the vec0 tables were never
|
||||
created and installs where the sqlite-vec extension is unavailable.
|
||||
"""
|
||||
|
||||
import os
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from frigate.db.sqlitevecq import SqliteVecQueueDatabase
|
||||
|
||||
|
||||
class TestDeleteEmbeddings(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.tmp_dir = tempfile.TemporaryDirectory()
|
||||
self.db = SqliteVecQueueDatabase(os.path.join(self.tmp_dir.name, "test.db"))
|
||||
self.db.start()
|
||||
# the extension is not available to tests, so stand in for a database
|
||||
# that has it loaded and use a plain table for the deletes
|
||||
self.db.load_vec_extension = True
|
||||
|
||||
def tearDown(self) -> None:
|
||||
self.db.stop()
|
||||
self.db.close()
|
||||
self.tmp_dir.cleanup()
|
||||
|
||||
def _flush_writes(self) -> None:
|
||||
# writes are queued and applied by a worker thread, and the queue is
|
||||
# FIFO, so awaiting a later write means the earlier ones are done
|
||||
self.db.execute_sql("PRAGMA user_version = 0").fetchall()
|
||||
|
||||
def _create_thumbnails_table(self) -> None:
|
||||
self.db.execute_sql("CREATE TABLE vec_thumbnails (id TEXT PRIMARY KEY)")
|
||||
self.db.execute_sql("INSERT INTO vec_thumbnails (id) VALUES ('a'), ('b')")
|
||||
self._flush_writes()
|
||||
|
||||
def _thumbnail_ids(self) -> list[str]:
|
||||
return [row[0] for row in self.db.execute_sql("SELECT id FROM vec_thumbnails")]
|
||||
|
||||
def test_delete_without_tables_does_not_raise(self) -> None:
|
||||
# semantic search was never enabled, so event cleanup has nothing to do
|
||||
self.db.delete_embeddings_thumbnail(event_ids=["1700000000.0-abc"])
|
||||
self.db.delete_embeddings_description(event_ids=["1700000000.0-abc"])
|
||||
|
||||
def test_delete_removes_embeddings(self) -> None:
|
||||
self._create_thumbnails_table()
|
||||
|
||||
self.db.delete_embeddings_thumbnail(event_ids=["a"])
|
||||
self._flush_writes()
|
||||
|
||||
self.assertEqual(self._thumbnail_ids(), ["b"])
|
||||
|
||||
def test_delete_skipped_without_extension(self) -> None:
|
||||
self._create_thumbnails_table()
|
||||
self.db.load_vec_extension = False
|
||||
|
||||
self.db.delete_embeddings_thumbnail(event_ids=["a"])
|
||||
self._flush_writes()
|
||||
|
||||
# the vec0 tables cannot be written without the extension
|
||||
self.assertEqual(self._thumbnail_ids(), ["a", "b"])
|
||||
@@ -115,6 +115,13 @@ class TestCheckWsAuthorization(unittest.TestCase):
|
||||
)
|
||||
)
|
||||
|
||||
def test_viewer_blocked_from_notification_test(self):
|
||||
self.assertFalse(
|
||||
_check_ws_authorization(
|
||||
"notification_test", "viewer", self.DEFAULT_SEPARATOR
|
||||
)
|
||||
)
|
||||
|
||||
# --- Admin access ---
|
||||
|
||||
def test_admin_can_send_restart(self):
|
||||
@@ -134,6 +141,13 @@ class TestCheckWsAuthorization(unittest.TestCase):
|
||||
_check_ws_authorization("front_door/ptz", "admin", self.DEFAULT_SEPARATOR)
|
||||
)
|
||||
|
||||
def test_admin_can_send_notification_test(self):
|
||||
self.assertTrue(
|
||||
_check_ws_authorization(
|
||||
"notification_test", "admin", self.DEFAULT_SEPARATOR
|
||||
)
|
||||
)
|
||||
|
||||
# --- Comma-separated roles ---
|
||||
|
||||
def test_comma_separated_admin_viewer_grants_admin(self):
|
||||
|
||||
@@ -684,22 +684,21 @@ class TrackedObjectProcessor(threading.Thread):
|
||||
# check for config updates
|
||||
updated_topics = self.camera_config_subscriber.check_for_updates()
|
||||
|
||||
if "enabled" in updated_topics:
|
||||
for camera in updated_topics["enabled"]:
|
||||
if self.camera_states[camera].prev_enabled is None:
|
||||
self.camera_states[camera].prev_enabled = self.config.cameras[
|
||||
camera
|
||||
].enabled
|
||||
elif "add" in updated_topics:
|
||||
for camera in updated_topics["add"]:
|
||||
self.config.cameras[camera] = (
|
||||
self.camera_config_subscriber.camera_configs[camera]
|
||||
)
|
||||
self.create_camera_state(camera)
|
||||
elif "remove" in updated_topics:
|
||||
# a single drain can carry several topics at once, so add and
|
||||
# remove are handled independently rather than as exclusive branches
|
||||
for camera in updated_topics.get("add", []):
|
||||
self.config.cameras[camera] = (
|
||||
self.camera_config_subscriber.camera_configs[camera]
|
||||
)
|
||||
self.create_camera_state(camera)
|
||||
|
||||
if "remove" in updated_topics:
|
||||
for camera in updated_topics["remove"]:
|
||||
removed_camera_state = self.camera_states[camera]
|
||||
removed_camera_state.shutdown()
|
||||
camera_state = self.camera_states.get(camera)
|
||||
if camera_state is None:
|
||||
continue
|
||||
|
||||
camera_state.shutdown()
|
||||
self.camera_states.pop(camera)
|
||||
self.camera_activity.pop(camera, None)
|
||||
self.last_motion_detected.pop(camera, None)
|
||||
|
||||
@@ -326,7 +326,7 @@ def get_ort_providers(
|
||||
{
|
||||
"device_id": device_id,
|
||||
"trt_fp16_enable": requires_fp16
|
||||
and os.environ.get("USE_FP_16", "True") != "False",
|
||||
and os.environ.get("USE_FP16", "True") != "False",
|
||||
"trt_timing_cache_enable": True,
|
||||
"trt_engine_cache_enable": True,
|
||||
"trt_timing_cache_path": os.path.join(
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
/**
|
||||
* Semantic Search settings tests -- MEDIUM tier.
|
||||
*
|
||||
* Focuses on the model_size field, which is unused when a GenAI embeddings
|
||||
* provider is selected as the semantic search model. The resolved config always
|
||||
* reports model_size (it has a schema default of "small"), even when the YAML
|
||||
* file has no such key. Clearing model_size for a provider used to run
|
||||
* unconditionally, which falsely marked the section dirty on load and asked the
|
||||
* backend to delete a key that wasn't in the config file (KeyError: 'model_size').
|
||||
*/
|
||||
|
||||
import { readFileSync } from "node:fs";
|
||||
import { resolve, dirname } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { test, expect } from "../../fixtures/frigate-test";
|
||||
import type { Page } from "@playwright/test";
|
||||
import { configFactory } from "../../fixtures/mock-data/config";
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const CONFIG_SCHEMA = JSON.parse(
|
||||
readFileSync(
|
||||
resolve(__dirname, "../../fixtures/mock-data/config-schema.json"),
|
||||
"utf-8",
|
||||
),
|
||||
);
|
||||
|
||||
const PROVIDER = "llama_cpp";
|
||||
const SETTINGS_URL = "/settings?page=integrationSemanticSearch";
|
||||
const NOT_APPLICABLE = "Not applicable for GenAI providers";
|
||||
const UNSAVED = "You have unsaved changes";
|
||||
|
||||
type SemanticSearch = {
|
||||
enabled?: boolean;
|
||||
model?: string;
|
||||
model_size?: string;
|
||||
};
|
||||
|
||||
async function installRoutes(page: Page, semanticSearch: SemanticSearch) {
|
||||
const config = configFactory({
|
||||
genai: { [PROVIDER]: { provider: PROVIDER, roles: ["embeddings"] } },
|
||||
semantic_search: semanticSearch,
|
||||
});
|
||||
|
||||
let lastSavedConfig: unknown = null;
|
||||
|
||||
await page.route("**/api/config/schema.json", (route) =>
|
||||
route.fulfill({ json: CONFIG_SCHEMA }),
|
||||
);
|
||||
await page.route("**/api/config", (route) => {
|
||||
if (route.request().method() === "GET") {
|
||||
return route.fulfill({ json: config });
|
||||
}
|
||||
return route.fulfill({ json: { success: true } });
|
||||
});
|
||||
await page.route("**/api/config/set", async (route) => {
|
||||
lastSavedConfig = route.request().postDataJSON();
|
||||
await route.fulfill({ json: { success: true, require_restart: false } });
|
||||
});
|
||||
await page.route("**/api/config/raw_paths", (route) =>
|
||||
route.fulfill({ json: { semantic_search: semanticSearch } }),
|
||||
);
|
||||
|
||||
return { capturedConfig: () => lastSavedConfig };
|
||||
}
|
||||
|
||||
test.describe("semantic search model_size @medium", () => {
|
||||
test("a provider with a defaulted model_size is not dirty on load", async ({
|
||||
frigateApp,
|
||||
}) => {
|
||||
// model_size stays at its schema default ("small"), i.e. it is not present
|
||||
// in the YAML. This mirrors the reported bug: selecting a GenAI provider and
|
||||
// returning to the page.
|
||||
await installRoutes(frigateApp.page, {
|
||||
enabled: true,
|
||||
model: PROVIDER,
|
||||
});
|
||||
await frigateApp.goto(SETTINGS_URL);
|
||||
|
||||
// The provider path is active: model_size shows "Not applicable".
|
||||
await expect(frigateApp.page.getByText(NOT_APPLICABLE)).toBeVisible();
|
||||
|
||||
// Give any clearing effect time to fire, then confirm the section stayed
|
||||
// clean (no phantom unsaved-changes banner, Save disabled).
|
||||
await frigateApp.page.waitForTimeout(1000);
|
||||
await expect(frigateApp.page.getByText(UNSAVED)).toBeHidden();
|
||||
await expect(
|
||||
frigateApp.page.getByRole("button", { name: "Save", exact: true }),
|
||||
).toBeDisabled();
|
||||
});
|
||||
|
||||
test("switching from a configured non-default model_size clears it", async ({
|
||||
frigateApp,
|
||||
}) => {
|
||||
// A genuinely configured non-default model_size ("large") can only come from
|
||||
// the YAML, so switching to a provider must still remove it.
|
||||
const capture = await installRoutes(frigateApp.page, {
|
||||
enabled: true,
|
||||
model: "jinav2",
|
||||
model_size: "large",
|
||||
});
|
||||
await frigateApp.goto(SETTINGS_URL);
|
||||
|
||||
// Starts clean on a Jina model.
|
||||
await expect(frigateApp.page.getByText(UNSAVED)).toBeHidden();
|
||||
|
||||
// Switch the model to the GenAI provider.
|
||||
await frigateApp.page
|
||||
.getByRole("combobox", { name: /Semantic search model/ })
|
||||
.click();
|
||||
await frigateApp.page.getByRole("option", { name: PROVIDER }).click();
|
||||
|
||||
// The change is now dirty and model_size is no longer applicable.
|
||||
await expect(frigateApp.page.getByText(NOT_APPLICABLE)).toBeVisible();
|
||||
await expect(frigateApp.page.getByText(UNSAVED)).toBeVisible();
|
||||
|
||||
await frigateApp.page
|
||||
.getByRole("button", { name: "Save", exact: true })
|
||||
.click();
|
||||
|
||||
// The saved payload removes model_size (empty string = "remove" key).
|
||||
await expect
|
||||
.poll(() => capture.capturedConfig(), { timeout: 5_000 })
|
||||
.toMatchObject({
|
||||
config_data: {
|
||||
semantic_search: { model: PROVIDER, model_size: "" },
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -61,8 +61,7 @@
|
||||
"error": {
|
||||
"endTimeMustAfterStartTime": "L'hora de finalització ha de ser posterior a l'hora d'inici",
|
||||
"noVaildTimeSelected": "No s'ha seleccionat un rang de temps vàlid",
|
||||
"failed": "No s'ha pogut inciar l'exportació: {{error}}",
|
||||
"noValidTimeSelected": "No s'ha seleccionat cap interval de temps vàlid"
|
||||
"failed": "No s'ha pogut inciar l'exportació: {{error}}"
|
||||
},
|
||||
"view": "Vista",
|
||||
"queued": "Exporta a la cua. Mostra el progrés a la pàgina d'exportacions.",
|
||||
|
||||
@@ -493,9 +493,6 @@
|
||||
"max_concurrent": {
|
||||
"label": "Màxim d'exportacions concurrents",
|
||||
"description": "Nombre màxim de treballs d'exportació a processar al mateix temps."
|
||||
},
|
||||
"chapters": {
|
||||
"label": "Metadades de capítol per incrustar en els enregistraments exportats"
|
||||
}
|
||||
},
|
||||
"preview": {
|
||||
|
||||
@@ -380,9 +380,6 @@
|
||||
"max_concurrent": {
|
||||
"label": "Màxim d'exportacions concurrents",
|
||||
"description": "Nombre màxim de treballs d'exportació a processar al mateix temps."
|
||||
},
|
||||
"chapters": {
|
||||
"label": "Metadades de capítol per incrustar en els enregistraments exportats"
|
||||
}
|
||||
},
|
||||
"preview": {
|
||||
|
||||
@@ -192,20 +192,7 @@
|
||||
"title": "Edita el model de classificació",
|
||||
"descriptionState": "Edita les classes per a aquest model de classificació d'estats. Els canvis requeriran tornar a entrenar el model.",
|
||||
"descriptionObject": "Edita el tipus d'objecte i el tipus de classificació per a aquest model de classificació d'objectes.",
|
||||
"stateClassesInfo": "S'ha actualitzat el model. Restringeix el model perquè els canvis de classe tinguin efecte.",
|
||||
"enabled": "Habilitat",
|
||||
"enabledDesc": "Executa aquest model. Quan està desactivat, deixa d'executar-se i ja no classifica.",
|
||||
"saveAttempts": "Desa els intents",
|
||||
"saveAttemptsDesc": "Nombre d'imatges de classificació que s'intenten mantenir per a les classificacions recents UI.",
|
||||
"motion": "Executa en moviment",
|
||||
"motionDesc": "Executa la classificació quan es detecta el moviment dins de l'escapçat configurat.",
|
||||
"interval": "Interval",
|
||||
"intervalDesc": "Segons entre les classificacions periòdiques. Deixeu-ho buit per a executar-se només en moviment.",
|
||||
"intervalPlaceholder": "Sense interval",
|
||||
"errors": {
|
||||
"saveAttemptsInvalid": "Els intents de desar han de ser un nombre sencer de 0 o més",
|
||||
"intervalInvalid": "L'interval ha de ser un nombre sencer més gran que 0"
|
||||
}
|
||||
"stateClassesInfo": "Nota: Canviar les classes d'estat requereix tornar a entrenar el model amb les classes actualitzades."
|
||||
},
|
||||
"tooltip": {
|
||||
"trainingInProgress": "El model s'està entrenant actualment",
|
||||
@@ -215,6 +202,5 @@
|
||||
},
|
||||
"none": "Cap",
|
||||
"reclassifyImageAs": "Reclassifica la imatge com a:",
|
||||
"reclassifyImage": "Reclassifica la imatge",
|
||||
"disabled": "Desactivat"
|
||||
"reclassifyImage": "Reclassifica la imatge"
|
||||
}
|
||||
|
||||
@@ -303,7 +303,7 @@
|
||||
},
|
||||
"offset": {
|
||||
"label": "Òfset d'Anotació",
|
||||
"desc": "Aquestes dades provenen del canal de detecció de la càmera, però estan sobreposades a les imatges del canal de registre. És poc probable que els dos corrents estiguin perfectament sincronitzats. Com a resultat, la caixa contenidora i les imatges no s'alinearan perfectament. Podeu utilitzar aquest paràmetre per a compensar les anotacions cap endavant o cap enrere en el temps per a alinear-les millor amb el metratge gravat.",
|
||||
"desc": "Aquestes dades provenen del flux de detecció de la càmera, però se superposen a les imatges del flux de gravació. És poc probable que els dos fluxos estiguin perfectament sincronitzats. Com a resultat, el quadre delimitador i les imatges no s'alinearan perfectament. Tanmateix, es pot utilitzar el camp <code>annotation_offset</code> per ajustar-ho.",
|
||||
"millisecondsToOffset": "Millisegons per l'òfset de detecció d'anotacions per. <em>Per defecte: 0</em>",
|
||||
"tips": "Reduïu el valor si la reproducció del vídeo es troba per davant dels quadres i els punts de ruta, i augmenteu-lo si es troba per darrere. Aquest valor pot ser negatiu.",
|
||||
"toast": {
|
||||
|
||||
@@ -698,7 +698,7 @@
|
||||
"title": "Crear un nou usuari",
|
||||
"confirmPassword": "Siusplau, confirma la contrasenya",
|
||||
"usernameOnlyInclude": "El nom d'usuari només pot contenir lletres, números, . o _",
|
||||
"desc": "Afegeix un compte d'usuari nou i especifica un rol per a l'accés a les àrees de la interfície d'usuari de Frigate."
|
||||
"desc": "Afegeix un nou compte d'usuari i especifica un rol per accedir a àrees de la interfície de Frigate."
|
||||
}
|
||||
},
|
||||
"title": "Usuaris",
|
||||
@@ -1323,7 +1323,7 @@
|
||||
"details": {
|
||||
"edit": "Edita els detalls de la càmera",
|
||||
"title": "Edita els detalls de la càmera",
|
||||
"description": "Actualitza el nom de visualització, l'URL extern i la visibilitat utilitzada per a aquesta càmera a tota la interfície d'usuari de Frigate.",
|
||||
"description": "Actualitza el nom de visualització, l'URL extern i la visibilitat utilitzada per a aquesta càmera a tota la interfície d'usuari de la Fragata.",
|
||||
"friendlyNameLabel": "Nom a mostrar",
|
||||
"friendlyNameHelp": "Nom amistós que es mostra per a aquesta càmera a tota la interfície d'usuari de Frigate. Deixeu-ho en blanc per utilitzar l'ID de la càmera.",
|
||||
"webuiUrlLabel": "URL de la interfície web de la càmera",
|
||||
@@ -1484,7 +1484,7 @@
|
||||
"successMulti_other": "Configuració copiada a {{count}} càmeres",
|
||||
"successMultiWithRestart_one": "Configuració copiada a la càmera {{count}}. Reinicia Frigate per aplicar tots els canvis.",
|
||||
"successMultiWithRestart_many": "Configuració copiada a {{count}} càmeres. Reinicia Frigate per aplicar tots els canvis.",
|
||||
"successMultiWithRestart_other": "Configuració copiada a {{count}} càmeres. Reinicia Frigate per aplicar tots els canvis.",
|
||||
"successMultiWithRestart_other": "Configuració copiada a {{count}} càmeres. Reinicia la fragata per aplicar tots els canvis.",
|
||||
"partialFailure": "{{successCount}} seccions aplicades; «{{failedSection}}» ha fallat: {{errorMessage}}",
|
||||
"partialFailureMulti": "S'ha copiat a {{successCount}} càmera(es); ha fallat {{failed}}: {{errorMessage}}",
|
||||
"newCameraPartialFailure": "S'ha creat la càmera {{cameraName}} però no s'han pogut copiar alguns paràmetres: {{errorMessage}}",
|
||||
@@ -1641,14 +1641,7 @@
|
||||
"keyLabel": "Clau",
|
||||
"valueLabel": "Valor",
|
||||
"keyPlaceholder": "Nou valor",
|
||||
"remove": "Elimina",
|
||||
"providerNameLabel": "Nom del proveïdor",
|
||||
"providerNamePlaceholder": "p. ex., openai",
|
||||
"variableNameLabel": "Nom de la variable",
|
||||
"variableNamePlaceholder": ". ex., La_Meva_Variable",
|
||||
"loggerNameLabel": "Nom del registrador",
|
||||
"loggerNamePlaceholder": "p. ex., friagte.registre",
|
||||
"keyPatternError": "Utilitza només lletres, números, guions i guions baixos (sense espais)"
|
||||
"remove": "Elimina"
|
||||
},
|
||||
"timezone": {
|
||||
"defaultOption": "Utilitza la zona horària del navegador"
|
||||
|
||||
@@ -322,7 +322,7 @@
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Object Detection Model Type",
|
||||
"description": "Detector model architecture type (ssd, yolox, yolonas) used by some detectors for optimization."
|
||||
"description": "Detector model architecture type (ssd, yolox, yolonas, yolo-generic, rfdetr, dfine) used by some detectors for optimization."
|
||||
}
|
||||
},
|
||||
"model_path": {
|
||||
@@ -495,7 +495,7 @@
|
||||
},
|
||||
"model_type": {
|
||||
"label": "Object Detection Model Type",
|
||||
"description": "Detector model architecture type (ssd, yolox, yolonas) used by some detectors for optimization."
|
||||
"description": "Detector model architecture type (ssd, yolox, yolonas, yolo-generic, rfdetr, dfine) used by some detectors for optimization."
|
||||
}
|
||||
},
|
||||
"genai": {
|
||||
|
||||
@@ -1936,7 +1936,8 @@
|
||||
"inputDimensionsNotDetectResolution": "Model input width and height are the input dimensions of the object detection model, not your camera's detect resolution. They should match the dimensions of the model you're using — typically a square size like 320x320 or 640x640."
|
||||
},
|
||||
"ffmpeg": {
|
||||
"hwaccelManualNotRecommended": "Manual hardware acceleration arguments are not recommended. Unless a specific requirement exists, select the preset that matches your hardware."
|
||||
"hwaccelManualNotRecommended": "Manual hardware acceleration arguments are not recommended. Unless a specific requirement exists, select the preset that matches your hardware.",
|
||||
"inputsMissingGo2rtcStream": "An input below points at a go2rtc restream that no longer exists. Select an existing restream or enter the camera's URL manually, otherwise this camera will fail to connect."
|
||||
},
|
||||
"objects": {
|
||||
"genaiNoDescriptionsProvider": "You must configure a GenAI provider with the 'descriptions' role for descriptions to be generated."
|
||||
|
||||
@@ -273,69 +273,5 @@
|
||||
"sailboat": "Purjekas",
|
||||
"soundtrack_music": "Filmimuusika",
|
||||
"jingle": "Kõlisemine/tilisemine",
|
||||
"theme_music": "Tunnusmuusika",
|
||||
"steel_guitar": "Steel Kitarr",
|
||||
"tapping": "Koputamine",
|
||||
"strum": "Klimberdus",
|
||||
"drum_machine": "Trummimasin",
|
||||
"drum": "Trumm",
|
||||
"maraca": "Marakas",
|
||||
"bowed_string_instrument": "Poogenkeelpill",
|
||||
"singing_bowl": "Helikauss",
|
||||
"wind_noise": "Tuulemüra",
|
||||
"rustling_leaves": "Sahisevad lehed",
|
||||
"waves": "Lained",
|
||||
"steam": "Aur",
|
||||
"ship": "Laev",
|
||||
"motor_vehicle": "Mootorsõiduk",
|
||||
"rowboat": "Sõudepaat",
|
||||
"motorboat": "Mootorpaat",
|
||||
"waterfall": "Kosk",
|
||||
"ocean": "Ookean",
|
||||
"rain_on_surface": "Vihm pinnal",
|
||||
"stream": "Oja",
|
||||
"fire": "Tuli",
|
||||
"crackle": "Praksumine",
|
||||
"car_alarm": "Auto alarm",
|
||||
"truck": "Veoauto",
|
||||
"police_car": "Politseiauto",
|
||||
"ambulance": "Kiirabi",
|
||||
"fire_engine": "Tuletõrjeauto",
|
||||
"aircraft": "Lennuk",
|
||||
"aircraft_engine": "Lennukimootor",
|
||||
"jet_engine": "Reaktiivmootor",
|
||||
"propeller": "Propeller",
|
||||
"helicopter": "Helikopter",
|
||||
"fixed-wing_aircraft": "Fikseeritud tiivaga õhusõiduk",
|
||||
"train_horn": "Rongisignaal",
|
||||
"railroad_car": "Kaubavagun",
|
||||
"lawn_mower": "Muruniiduk",
|
||||
"chainsaw": "mootorsaag",
|
||||
"engine": "Mootor",
|
||||
"knock": "Koputus",
|
||||
"alarm": "Häire",
|
||||
"siren": "Sireen",
|
||||
"fire_alarm": "Tulekahjuhäire",
|
||||
"telephone": "Telefon",
|
||||
"telephone_bell_ringing": "Helisev telefon",
|
||||
"ringtone": "Telefonihelin",
|
||||
"smoke_detector": "Suitsuandur",
|
||||
"foghorn": "Udupasun",
|
||||
"whistle": "Vile",
|
||||
"printer": "Printer",
|
||||
"drill": "Puur",
|
||||
"explosion": "Plahvatus",
|
||||
"hammer": "Haamer",
|
||||
"air_conditioning": "Õhukonditsioneer",
|
||||
"gunshot": "Püssilask",
|
||||
"glass": "Klaas",
|
||||
"boom": "Pauk",
|
||||
"fireworks": "Ilutulestik",
|
||||
"static": "Staatiline",
|
||||
"white_noise": "Valge müra",
|
||||
"radio": "Raadio",
|
||||
"television": "Televiisor",
|
||||
"scream": "Karjumine",
|
||||
"pour": "Valamine",
|
||||
"drip": "Tilkumine"
|
||||
"theme_music": "Tunnusmuusika"
|
||||
}
|
||||
|
||||
@@ -37,9 +37,6 @@
|
||||
"ask_an": "Kas see objekt on <code>{{label}}</code>?",
|
||||
"ask_full": "Kas see objekt on <code>{{untranslatedLabel}}</code> ({{translatedLabel}})?",
|
||||
"label": "Kinnita see silt Frigate+ teenuse jaoks"
|
||||
},
|
||||
"toast": {
|
||||
"error": "Frigate+ teenusesse saatmine ebaõnnestus. Palun kontrolli oma võrguühendust ja proovi uuesti."
|
||||
}
|
||||
},
|
||||
"submitToPlus": {
|
||||
@@ -73,79 +70,18 @@
|
||||
"success": "Eksportimise käivitamine õnnestus. Faili leiad eksportimise lehelt.",
|
||||
"view": "Vaata",
|
||||
"error": {
|
||||
"failed": "Eksportimise järjekorda lisamine ei õnnestunud: {{error}}",
|
||||
"failed": "Eksportimise käivitamine ei õnnestunud: {{error}}",
|
||||
"endTimeMustAfterStartTime": "Ajavahemiku lõpp peab olema peale algust",
|
||||
"noVaildTimeSelected": "Ühtegi kehtivat ajavahemikku pole valitud",
|
||||
"noValidTimeSelected": "Ühtegi korrektset ajavahemikku pole valitud"
|
||||
},
|
||||
"queued": "Eksport on järjekorda lisatud. Vaata progressi eksportide lehelt.",
|
||||
"batchSuccess_one": "Alustasin 1 ekspordiga. Avan juhtumi kohe.",
|
||||
"batchSuccess_other": "Alustasin {{count}} ekspordiga. Avan juhtumi kohe.",
|
||||
"batchPartial": "Alustasin {{successful}}/{{total}} ekspordiga. Ebaõnnestunud kaamerad: {{failedCameras}}",
|
||||
"batchFailed": "{{total}} eksporti ebaõnnestus algatada. Ebaõnnestunud kaamerad: {{failedCameras}}",
|
||||
"batchQueuedSuccess_one": "1 eksport järjekorda lisatud. Avan juhtumi kohe.",
|
||||
"batchQueuedSuccess_other": "{{count}} eksporti järjekorda lisatud. Avan juhtumi kohe.",
|
||||
"batchQueuedPartial": "{{successful}}/{{total}} ekspordist on järjekorda lisatud. Ebaõnnestunud kaamerad: {{failedCameras}}",
|
||||
"batchQueueFailed": "{{total}} eksporti ebaõnnestus järjekorda lisada. Ebaõnnestunud kaamerad: {{failedCameras}}"
|
||||
"noVaildTimeSelected": "Ühtegi kehtivat ajavahemikku pole valitud"
|
||||
}
|
||||
},
|
||||
"fromTimeline": {
|
||||
"saveExport": "Salvesta eksporditud sisu",
|
||||
"previewExport": "Eksporditud sisu eelvaade",
|
||||
"queueingExport": "Ekspordi järjekorda lisamine...",
|
||||
"useThisRange": "Kasuta seda vahemikku"
|
||||
"previewExport": "Eksporditud sisu eelvaade"
|
||||
},
|
||||
"case": {
|
||||
"label": "Juhtum",
|
||||
"placeholder": "Vali juhtum",
|
||||
"newCaseOption": "Ava uus juhtum",
|
||||
"newCaseNamePlaceholder": "Uue juhtumi nimi",
|
||||
"newCaseDescriptionPlaceholder": "Juhtumi kirjeldus",
|
||||
"nonAdminHelp": "Uus juhtum avatakse järnevatele eksportidele."
|
||||
},
|
||||
"queueing": "Ekspordi järjekorda lisamine...",
|
||||
"tabs": {
|
||||
"export": "Üksik kaamera",
|
||||
"multiCamera": "Mitu kaamerat"
|
||||
},
|
||||
"multiCamera": {
|
||||
"timeRange": "Ajavahemik",
|
||||
"selectFromTimeline": "Vali ajajoonelt",
|
||||
"cameraSelection": "Kaamerad",
|
||||
"cameraSelectionHelp": "Selles ajavahemikus tuvastatud objektidega kaamerad on eelvalitud",
|
||||
"searchOrSelectGroup": "Otsi või vali kaamera grupp...",
|
||||
"selectAll": "Vali kõik kaamerad",
|
||||
"clearSelection": "Tühista valik",
|
||||
"selectWithActivity": "Jälgitud objektidega kaamerad",
|
||||
"selectGroup": "Vali grupp",
|
||||
"noMatchingCameras": "Ükski kaamera ei sobitunud otsinguga",
|
||||
"selectedCount": "{{selected}} / {{total}} valitud",
|
||||
"checkingActivity": "Kaamera aktiivsuse kontrollimine...",
|
||||
"noCameras": "Ühtegi kaamerat pole saadaval",
|
||||
"detectionCount_one": "1 jälgitav objekt",
|
||||
"detectionCount_other": "{{count}} jälgitavat objekti",
|
||||
"nameLabel": "Ekspordi nimi",
|
||||
"namePlaceholder": "Valikuline baasnimi nendele eksportidele",
|
||||
"queueingButton": "Ekspordi järjekorda lisamine...",
|
||||
"exportButton_one": "Ekspordi 1 kaamera",
|
||||
"exportButton_other": "Ekspordi {{count}} kaamerat"
|
||||
},
|
||||
"multi": {
|
||||
"title_one": "Ekspordi 1 ülevaade",
|
||||
"title_other": "Espordi {{count}} ülevaadet",
|
||||
"description": "Ekspordi valitud ülevaated. Kõik ekspordid on grupeeritud ühte juhtumisse.",
|
||||
"descriptionNoCase": "Ekspordi kõik valitud juhtumid.",
|
||||
"caseNamePlaceholder": "Ülevaate eksport - {{date}}",
|
||||
"exportButton_one": "Ekspordi 1 ülevaade",
|
||||
"exportButton_other": "Ekspordi {{count}} ülevaadet",
|
||||
"exportingButton": "Ekspordin...",
|
||||
"toast": {
|
||||
"started_one": "Alustasin 1 eksporti. Avan juhtumi kohe.",
|
||||
"started_other": "Alustasin {{count}} ekspordiga. Avan juhtumi kohe.",
|
||||
"startedNoCase_one": "Alustasin 1 ekspordiga.",
|
||||
"startedNoCase_other": "Alustasin {{count}} ekspordiga.",
|
||||
"partial": "Alustasin {{successful}}/{{total}} ekspordiga. Ebaõnnestusid: {{failedItems}}",
|
||||
"failed": "{{total}} ekspordi algatamine ebaõnnestus. Ebaõnnestunud: {{failedItems}}"
|
||||
}
|
||||
"placeholder": "Vali juhtum"
|
||||
}
|
||||
},
|
||||
"streaming": {
|
||||
@@ -178,14 +114,6 @@
|
||||
"success": "Selle ülevaadatava objektiga seotud videosisu on kustutatud.",
|
||||
"error": "Kustutamine ei õnnestunud: {{error}}"
|
||||
}
|
||||
},
|
||||
"shareTimestamp": {
|
||||
"label": "Jaotise ajatempel",
|
||||
"title": "Jaotise ajatempel",
|
||||
"description": "Jaga praeguse esituskoha ajatempliga URL-i või vali kohandatud ajatempel. Arvesta, et see ei ole avalik jagamislink ja on kättesaadav ainult kasutajatele, kellel on ligipääs Frigate'ile ja sellele kaamerale.",
|
||||
"custom": "Kohandatud ajatempel",
|
||||
"button": "Jaga ajatempliga linki",
|
||||
"shareTitle": "Frigate ülevaate ajatempel: {{camera}}"
|
||||
}
|
||||
},
|
||||
"imagePicker": {
|
||||
|
||||
@@ -12,20 +12,11 @@
|
||||
"description": "Kasutusel"
|
||||
},
|
||||
"audio": {
|
||||
"label": "Heli tuvastus",
|
||||
"min_volume": {
|
||||
"label": "Minimaalne helitase"
|
||||
},
|
||||
"filters": {
|
||||
"label": "Audio filtrid"
|
||||
}
|
||||
"label": "Helisündmused"
|
||||
},
|
||||
"birdseye": {
|
||||
"mode": {
|
||||
"label": "Jälgimisrežiim"
|
||||
},
|
||||
"order": {
|
||||
"label": "Positsioon"
|
||||
}
|
||||
},
|
||||
"label": "Kaameraseadistus",
|
||||
@@ -34,8 +25,7 @@
|
||||
"threshold": {
|
||||
"description": "Minimaalne sarnasuse punktiskoor (0-1), mis on vajalik selle päästiku käivitamiseks."
|
||||
}
|
||||
},
|
||||
"label": "Semantiline otsing"
|
||||
}
|
||||
},
|
||||
"lpr": {
|
||||
"label": "Sõidukite numbrimärkide tuvastus",
|
||||
@@ -44,171 +34,6 @@
|
||||
"review": {
|
||||
"genai": {
|
||||
"description": "Kontrollib generatiivse tehisaru kasutamist kirjelduste ja kokkuvõtete koostamiseks ülevaatamisele kuuluvate objektide jaoks."
|
||||
},
|
||||
"alerts": {
|
||||
"enabled": {
|
||||
"label": "Luba häired"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio_transcription": {
|
||||
"label": "Audio transkriptsioon",
|
||||
"live_enabled": {
|
||||
"label": "Reaalajas transkriptsioon"
|
||||
},
|
||||
"enabled": {
|
||||
"label": "Luba heli üleskirjutamine tekstina"
|
||||
}
|
||||
},
|
||||
"detect": {
|
||||
"label": "Objekti tuvastus",
|
||||
"enabled": {
|
||||
"label": "Luba objektituvastus"
|
||||
},
|
||||
"height": {
|
||||
"label": "Tuvastamise kõrgus"
|
||||
},
|
||||
"width": {
|
||||
"label": "Tuvastamise laius"
|
||||
},
|
||||
"fps": {
|
||||
"label": "Tuvastamise kaadrisagedus"
|
||||
},
|
||||
"stationary": {
|
||||
"label": "Püsivate objektide sätted"
|
||||
}
|
||||
},
|
||||
"face_recognition": {
|
||||
"label": "Näotuvastus"
|
||||
},
|
||||
"ffmpeg": {
|
||||
"path": {
|
||||
"label": "FFmpeg asukoht"
|
||||
},
|
||||
"gpu": {
|
||||
"label": "GPU indeks"
|
||||
},
|
||||
"inputs": {
|
||||
"global_args": {
|
||||
"label": "FFmpeg globaalsed argumendid"
|
||||
}
|
||||
}
|
||||
},
|
||||
"live": {
|
||||
"label": "Reaalajas mahamängimine",
|
||||
"height": {
|
||||
"label": "Otseülekande kõrgus"
|
||||
},
|
||||
"quality": {
|
||||
"label": "Otseülekande kvaliteet"
|
||||
},
|
||||
"streams": {
|
||||
"label": "Otseülekande voo nimed"
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "Liikumistuvastus",
|
||||
"frame_height": {
|
||||
"label": "Kaadri kõrgus"
|
||||
},
|
||||
"enabled": {
|
||||
"label": "Luba liikumistuvastus"
|
||||
}
|
||||
},
|
||||
"objects": {
|
||||
"label": "Objektid",
|
||||
"filters": {
|
||||
"min_area": {
|
||||
"label": "Minimaalne objekti ala"
|
||||
},
|
||||
"max_area": {
|
||||
"label": "Maksimaalne objekti ala"
|
||||
}
|
||||
},
|
||||
"genai": {
|
||||
"label": "GenAI objekti konfiguratsioon",
|
||||
"required_zones": {
|
||||
"label": "Nõutud tsoonid"
|
||||
},
|
||||
"debug_save_thumbnails": {
|
||||
"label": "Salvesta pisipildid"
|
||||
},
|
||||
"enabled": {
|
||||
"label": "Luba GenAI"
|
||||
},
|
||||
"use_snapshot": {
|
||||
"label": "Kasuta hetktõmmiseid"
|
||||
}
|
||||
}
|
||||
},
|
||||
"mqtt": {
|
||||
"label": "MQTT"
|
||||
},
|
||||
"notifications": {
|
||||
"enabled": {
|
||||
"label": "Luba teavitused"
|
||||
},
|
||||
"email": {
|
||||
"label": "Teavituste email"
|
||||
},
|
||||
"label": "Teavitused"
|
||||
},
|
||||
"ui": {
|
||||
"label": "Kaamera kasutajaliides"
|
||||
},
|
||||
"record": {
|
||||
"label": "Salvestus",
|
||||
"enabled": {
|
||||
"label": "Luba salvestamine"
|
||||
}
|
||||
},
|
||||
"snapshots": {
|
||||
"enabled": {
|
||||
"label": "Luba hetktõmmised"
|
||||
}
|
||||
},
|
||||
"timestamp_style": {
|
||||
"color": {
|
||||
"red": {
|
||||
"label": "Punane",
|
||||
"description": "Punase komponent (0–255) ajatempli värvi jaoks."
|
||||
},
|
||||
"green": {
|
||||
"label": "Roheline",
|
||||
"description": "Rohelise komponent (0–255) ajatempli värvi jaoks."
|
||||
},
|
||||
"blue": {
|
||||
"label": "Sinine",
|
||||
"description": "Sinise komponent (0–255) ajatempli värvi jaoks."
|
||||
},
|
||||
"label": "Ajatempli värv",
|
||||
"description": "Ajatempli teksti RGB värviväärtused (kõik väärtused 0–255)."
|
||||
},
|
||||
"thickness": {
|
||||
"label": "Ajatempli paksus",
|
||||
"description": "Ajatempli teksti joone paksus."
|
||||
},
|
||||
"effect": {
|
||||
"label": "Ajatempli efekt",
|
||||
"description": "Ajatempli teksti visuaalne efekt (puudub, ühtlane, vari)."
|
||||
}
|
||||
},
|
||||
"onvif": {
|
||||
"user": {
|
||||
"label": "ONVIF kasutajanimi"
|
||||
},
|
||||
"password": {
|
||||
"label": "ONVIF parool"
|
||||
},
|
||||
"port": {
|
||||
"label": "ONVIF port"
|
||||
},
|
||||
"label": "ONVIF",
|
||||
"host": {
|
||||
"label": "ONVIF host"
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"label": "Profiilid"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,31 +1,10 @@
|
||||
{
|
||||
"audio": {
|
||||
"label": "Heli tuvastus",
|
||||
"min_volume": {
|
||||
"label": "Minimaalne helitase"
|
||||
},
|
||||
"filters": {
|
||||
"label": "Audio filtrid"
|
||||
}
|
||||
"label": "Helisündmused"
|
||||
},
|
||||
"birdseye": {
|
||||
"mode": {
|
||||
"label": "Jälgimisrežiim"
|
||||
},
|
||||
"order": {
|
||||
"label": "Positsioon"
|
||||
},
|
||||
"height": {
|
||||
"label": "Kõrgus"
|
||||
},
|
||||
"width": {
|
||||
"label": "Laius"
|
||||
},
|
||||
"layout": {
|
||||
"label": "Paigutus",
|
||||
"scaling_factor": {
|
||||
"label": "Skaleerimistegur"
|
||||
}
|
||||
}
|
||||
},
|
||||
"version": {
|
||||
@@ -43,15 +22,6 @@
|
||||
"threshold": {
|
||||
"label": "Punktiskoori lävend",
|
||||
"description": "Punktiskoori lävend, mida kasutatakse klassifitseerimise oleku muutmiseks."
|
||||
},
|
||||
"enabled": {
|
||||
"label": "Luba mudel"
|
||||
},
|
||||
"name": {
|
||||
"label": "Mudeli nimi"
|
||||
},
|
||||
"save_attempts": {
|
||||
"label": "Salvestamiskatsed"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -60,25 +30,11 @@
|
||||
"threshold": {
|
||||
"description": "Minimaalne sarnasuse punktiskoor (0-1), mis on vajalik selle päästiku käivitamiseks."
|
||||
}
|
||||
},
|
||||
"label": "Semantiline otsing",
|
||||
"model_size": {
|
||||
"label": "Mudeli suurus"
|
||||
},
|
||||
"device": {
|
||||
"label": "Seade"
|
||||
}
|
||||
},
|
||||
"face_recognition": {
|
||||
"unknown_score": {
|
||||
"label": "Tundmatu punktiskoori lävend"
|
||||
},
|
||||
"label": "Näotuvastus",
|
||||
"model_size": {
|
||||
"label": "Mudeli suurus"
|
||||
},
|
||||
"device": {
|
||||
"label": "Seade"
|
||||
}
|
||||
},
|
||||
"lpr": {
|
||||
@@ -86,393 +42,15 @@
|
||||
"description": "Sõidukite numbrimärkide tuvastuse seadistus sisaldab tuvastuse lävendeid, vormindust ja teadaolevaid numbrimärke.",
|
||||
"enabled": {
|
||||
"description": "Lülita sõidukite numbrimärkide tuvastus kõikide kaamerate jaoks sisse; seda saad kaamerakohaselt ka sürjutada."
|
||||
},
|
||||
"model_size": {
|
||||
"label": "Mudeli suurus"
|
||||
},
|
||||
"device": {
|
||||
"label": "Seade"
|
||||
}
|
||||
},
|
||||
"genai": {
|
||||
"label": "Generatiivse tehisaru seadistus",
|
||||
"description": "Seadistsued generatiivse tehisaru teenusepakkujate kasutamisel kirjelduste ja kokkuvõtete loomiseks ülevaatamisele kuuluvate objektide jaoks.",
|
||||
"model": {
|
||||
"label": "Mudel"
|
||||
},
|
||||
"roles": {
|
||||
"label": "Rollid"
|
||||
},
|
||||
"api_key": {
|
||||
"label": "API võti"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Baas-URL"
|
||||
}
|
||||
"description": "Seadistsued generatiivse tehisaru teenusepakkujate kasutamisel kirjelduste ja kokkuvõtete loomiseks ülevaatamisele kuuluvate objektide jaoks."
|
||||
},
|
||||
"review": {
|
||||
"genai": {
|
||||
"description": "Kontrollib generatiivse tehisaru kasutamist kirjelduste ja kokkuvõtete koostamiseks ülevaatamisele kuuluvate objektide jaoks."
|
||||
},
|
||||
"alerts": {
|
||||
"enabled": {
|
||||
"label": "Luba häired",
|
||||
"description": "Luba või keela kõigi kaamerate häirete genereerimine; seda saab kaamerati eraldi muuta."
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio_transcription": {
|
||||
"label": "Audio transkriptsioon",
|
||||
"live_enabled": {
|
||||
"label": "Reaalajas transkriptsioon"
|
||||
},
|
||||
"enabled": {
|
||||
"label": "Luba heli üleskirjutamine tekstina",
|
||||
"description": "Luba või keela automaatne heli üleskirjutamine tektina kõigi kaamerate jaoks; seda saad kaamerati eraldi muuta."
|
||||
},
|
||||
"language": {
|
||||
"label": "Üleskirjutuse keel",
|
||||
"description": "Üleskirjutuse/tõlkimise jaoks kasutatav keelekood (näiteks „en” inglise keele puhul). Toetatud keelekoodid leiad lehelt https://whisper-api.com/docs/languages/."
|
||||
},
|
||||
"device": {
|
||||
"label": "Üleskirjutusseade"
|
||||
},
|
||||
"model_size": {
|
||||
"label": "Mudeli suurus"
|
||||
}
|
||||
},
|
||||
"detect": {
|
||||
"label": "Objekti tuvastus",
|
||||
"enabled": {
|
||||
"label": "Luba objektituvastus"
|
||||
},
|
||||
"height": {
|
||||
"label": "Tuvastamise kõrgus"
|
||||
},
|
||||
"width": {
|
||||
"label": "Tuvastamise laius"
|
||||
},
|
||||
"fps": {
|
||||
"label": "Tuvastamise kaadrisagedus"
|
||||
},
|
||||
"stationary": {
|
||||
"label": "Püsivate objektide sätted"
|
||||
}
|
||||
},
|
||||
"ffmpeg": {
|
||||
"path": {
|
||||
"label": "FFmpeg asukoht"
|
||||
},
|
||||
"gpu": {
|
||||
"label": "GPU indeks"
|
||||
},
|
||||
"inputs": {
|
||||
"global_args": {
|
||||
"label": "FFmpeg globaalsed argumendid"
|
||||
}
|
||||
},
|
||||
"label": "FFmpeg"
|
||||
},
|
||||
"live": {
|
||||
"label": "Reaalajas mahamängimine",
|
||||
"height": {
|
||||
"label": "Otseülekande kõrgus"
|
||||
},
|
||||
"quality": {
|
||||
"label": "Otseülekande kvaliteet"
|
||||
},
|
||||
"streams": {
|
||||
"label": "Otseülekande voo nimed"
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "Liikumistuvastus",
|
||||
"frame_height": {
|
||||
"label": "Kaadri kõrgus"
|
||||
},
|
||||
"enabled": {
|
||||
"label": "Luba liikumistuvastus"
|
||||
}
|
||||
},
|
||||
"objects": {
|
||||
"label": "Objektid",
|
||||
"filters": {
|
||||
"min_area": {
|
||||
"label": "Minimaalne objekti ala"
|
||||
},
|
||||
"max_area": {
|
||||
"label": "Maksimaalne objekti ala"
|
||||
}
|
||||
},
|
||||
"genai": {
|
||||
"label": "GenAI objekti konfiguratsioon",
|
||||
"required_zones": {
|
||||
"label": "Nõutud tsoonid"
|
||||
},
|
||||
"debug_save_thumbnails": {
|
||||
"label": "Salvesta pisipildid"
|
||||
},
|
||||
"enabled": {
|
||||
"label": "Luba GenAI"
|
||||
},
|
||||
"use_snapshot": {
|
||||
"label": "Kasuta hetktõmmiseid"
|
||||
}
|
||||
}
|
||||
},
|
||||
"auth": {
|
||||
"reset_admin_password": {
|
||||
"label": "Lähtesta administraatori parool"
|
||||
},
|
||||
"cookie_name": {
|
||||
"label": "JWT küpsise nimi"
|
||||
},
|
||||
"enabled": {
|
||||
"label": "Luba autentimine"
|
||||
},
|
||||
"label": "Autentimine",
|
||||
"session_length": {
|
||||
"label": "Sessiooni pikkus"
|
||||
}
|
||||
},
|
||||
"database": {
|
||||
"label": "Andmebaas"
|
||||
},
|
||||
"mqtt": {
|
||||
"label": "MQTT",
|
||||
"enabled": {
|
||||
"label": "Luba MQTT"
|
||||
},
|
||||
"user": {
|
||||
"label": "MQTT kasutajanimi"
|
||||
},
|
||||
"tls_ca_certs": {
|
||||
"label": "TLS CA sertifikaat"
|
||||
},
|
||||
"tls_client_cert": {
|
||||
"label": "Kliendi sertifikaat"
|
||||
},
|
||||
"host": {
|
||||
"label": "MQTT host",
|
||||
"description": "MQTT maakleri hostinimi või IP-aadress."
|
||||
},
|
||||
"port": {
|
||||
"label": "MQTT port"
|
||||
},
|
||||
"client_id": {
|
||||
"label": "Kliendi ID"
|
||||
},
|
||||
"stats_interval": {
|
||||
"label": "Statistika intervall"
|
||||
},
|
||||
"tls_client_key": {
|
||||
"label": "Kliendi võti"
|
||||
},
|
||||
"qos": {
|
||||
"label": "MQTT QoS"
|
||||
}
|
||||
},
|
||||
"go2rtc": {
|
||||
"label": "go2rtc"
|
||||
},
|
||||
"notifications": {
|
||||
"enabled": {
|
||||
"label": "Luba teavitused"
|
||||
},
|
||||
"email": {
|
||||
"label": "Teavituste email"
|
||||
},
|
||||
"label": "Teavitused"
|
||||
},
|
||||
"networking": {
|
||||
"ipv6": {
|
||||
"label": "IPv6 sätted",
|
||||
"enabled": {
|
||||
"label": "Luba IPv6"
|
||||
}
|
||||
},
|
||||
"label": "Võrguühendus",
|
||||
"listen": {
|
||||
"internal": {
|
||||
"label": "Sisemine port"
|
||||
},
|
||||
"external": {
|
||||
"label": "Välimine port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"proxy": {
|
||||
"label": "Vaheserver",
|
||||
"logout_url": {
|
||||
"label": "Väljalogimise url"
|
||||
},
|
||||
"default_role": {
|
||||
"label": "Vaikimisi roll"
|
||||
}
|
||||
},
|
||||
"telemetry": {
|
||||
"stats": {
|
||||
"label": "Süsteemi statistika",
|
||||
"amd_gpu_stats": {
|
||||
"label": "AMD GPU statistika"
|
||||
},
|
||||
"intel_gpu_stats": {
|
||||
"label": "Intel GPU statistika"
|
||||
},
|
||||
"intel_gpu_device": {
|
||||
"label": "Intel GPU seade"
|
||||
},
|
||||
"network_bandwidth": {
|
||||
"label": "Võrgu ribalaius"
|
||||
}
|
||||
},
|
||||
"label": "Telemeetria",
|
||||
"network_interfaces": {
|
||||
"label": "Võrguliides"
|
||||
},
|
||||
"version_check": {
|
||||
"label": "Versiooni kontroll",
|
||||
"description": "Luba väljaminev ühendus, et kontrollida uuema Frigate versooni olemasolu."
|
||||
}
|
||||
},
|
||||
"tls": {
|
||||
"label": "TLS",
|
||||
"enabled": {
|
||||
"label": "Luba TLS"
|
||||
}
|
||||
},
|
||||
"ui": {
|
||||
"timezone": {
|
||||
"label": "ajavöönd"
|
||||
},
|
||||
"label": "Kasutajaliides",
|
||||
"description": "Kasutajaliidese eelistused nagu ajavöönd, aja ja kuupäeva formaat ning ühikud.",
|
||||
"unit_system": {
|
||||
"label": "Ühikute süsteem"
|
||||
}
|
||||
},
|
||||
"detectors": {
|
||||
"label": "Detektori riistvara",
|
||||
"cpu": {
|
||||
"label": "CPU"
|
||||
},
|
||||
"deepstack": {
|
||||
"label": "DeepStack"
|
||||
},
|
||||
"edgetpu": {
|
||||
"label": "EdgeTPU"
|
||||
},
|
||||
"onnx": {
|
||||
"label": "ONNX",
|
||||
"device": {
|
||||
"label": "Seadme tüüp"
|
||||
}
|
||||
},
|
||||
"rknn": {
|
||||
"label": "RKNN"
|
||||
},
|
||||
"openvino": {
|
||||
"label": "OpenVINO"
|
||||
},
|
||||
"tensorrt": {
|
||||
"label": "TensorRT"
|
||||
},
|
||||
"teflon_tfl": {
|
||||
"label": "Teflon"
|
||||
},
|
||||
"synaptics": {
|
||||
"label": "Synaptics"
|
||||
},
|
||||
"memryx": {
|
||||
"device": {
|
||||
"label": "Seadme asukoht"
|
||||
},
|
||||
"label": "MemryX"
|
||||
},
|
||||
"hailo8l": {
|
||||
"label": "Hailo-8/Hailo-8L"
|
||||
},
|
||||
"zmq": {
|
||||
"label": "ZMQ IPC"
|
||||
},
|
||||
"axengine": {
|
||||
"label": "AXEngine NPU"
|
||||
},
|
||||
"degirum": {
|
||||
"label": "DeGirum"
|
||||
}
|
||||
},
|
||||
"logger": {
|
||||
"label": "Logimine"
|
||||
},
|
||||
"model": {
|
||||
"label": "Tuvastusmudel"
|
||||
},
|
||||
"record": {
|
||||
"label": "Salvestus",
|
||||
"enabled": {
|
||||
"label": "Luba salvestamine",
|
||||
"description": "Luba või keela salvestamine kõigi kaamerate jaoks; seda saab kaamerati eraldi muuta."
|
||||
}
|
||||
},
|
||||
"snapshots": {
|
||||
"enabled": {
|
||||
"label": "Luba hetktõmmised",
|
||||
"description": "Luba või keela kõigi kaamerate hetktõmmiste salvestamine; seda saab kaamerati eraldi muuta."
|
||||
}
|
||||
},
|
||||
"timestamp_style": {
|
||||
"color": {
|
||||
"red": {
|
||||
"label": "Punane",
|
||||
"description": "Punase komponent (0–255) ajatempli värvi jaoks."
|
||||
},
|
||||
"green": {
|
||||
"label": "Roheline",
|
||||
"description": "Rohelise komponent (0–255) ajatempli värvi jaoks."
|
||||
},
|
||||
"blue": {
|
||||
"label": "Sinine",
|
||||
"description": "Sinise komponent (0–255) ajatempli värvi jaoks."
|
||||
},
|
||||
"label": "Ajatempli värv",
|
||||
"description": "Ajatempli teksti RGB värviväärtused (kõik väärtused 0–255)."
|
||||
},
|
||||
"thickness": {
|
||||
"label": "Ajatempli paksus",
|
||||
"description": "Ajatempli teksti joone paksus."
|
||||
},
|
||||
"effect": {
|
||||
"label": "Ajatempli efekt",
|
||||
"description": "Ajatempli teksti visuaalne efekt (puudub, ühtlane, vari)."
|
||||
}
|
||||
},
|
||||
"onvif": {
|
||||
"user": {
|
||||
"label": "ONVIF kasutajanimi"
|
||||
},
|
||||
"password": {
|
||||
"label": "ONVIF parool"
|
||||
},
|
||||
"port": {
|
||||
"label": "ONVIF port"
|
||||
},
|
||||
"label": "ONVIF",
|
||||
"host": {
|
||||
"label": "ONVIF host"
|
||||
}
|
||||
},
|
||||
"camera_mqtt": {
|
||||
"quality": {
|
||||
"label": "JPEG kvaliteet",
|
||||
"description": "MQTT-sse saadetud piltide JPEG-kvaliteet (0–100)."
|
||||
},
|
||||
"enabled": {
|
||||
"label": "Saada pilt"
|
||||
},
|
||||
"label": "MQTT"
|
||||
},
|
||||
"profiles": {
|
||||
"label": "Profiilid"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,67 +6,5 @@
|
||||
"error": "Midagi läks valesti. Palun proovi uuesti.",
|
||||
"processing": "Töötlen…",
|
||||
"toolsUsed": "Kasutatud: {{tools}}",
|
||||
"similarity_score": "Sarnasus",
|
||||
"showTools": "Näita tööriistu ({{count}})",
|
||||
"hideTools": "Peida tööriistad",
|
||||
"call": "Kutse",
|
||||
"result": "Tulemus",
|
||||
"arguments": "Argumendid:",
|
||||
"response": "Vastus:",
|
||||
"send": "Saada",
|
||||
"new_chat": "Uus vestlus",
|
||||
"settings": {
|
||||
"title": "Vestluse sätted",
|
||||
"show_stats": {
|
||||
"title": "Näita statistikat",
|
||||
"always": "Alati",
|
||||
"desc": "Kuva vastuste genereerimise kiirus ja konteksti suurus.",
|
||||
"while_generating": "Genereerimise ajal"
|
||||
},
|
||||
"auto_scroll": {
|
||||
"title": "Automaatne kerimine",
|
||||
"desc": "Jälgi uusi sõnumeid kohe, kui need saabuvad."
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"context": "{{tokens}} tokenit",
|
||||
"tokens_per_second": "{{rate}} t/s"
|
||||
},
|
||||
"starting_requests_prompts": {
|
||||
"recap": "Mis juhtus kui ma olin ära?",
|
||||
"watch_camera": "Jälgi ust ja anna mulle teada kui keegi tuleb",
|
||||
"show_camera_status": "Milline on minu kaamerate praegune seis?",
|
||||
"show_recent_events": "Näita mulle viimase tunni viimaseid sündmusi"
|
||||
},
|
||||
"starting_requests": {
|
||||
"show_camera_status": "Näita kaamera olekut",
|
||||
"show_recent_events": "Kuva hiljutised sündmused",
|
||||
"recap": "Mis juhtus kui ma olin ära?",
|
||||
"watch_camera": "Jälgi kaamerat aktiivsuse osas"
|
||||
},
|
||||
"suggested_requests": "Proovi küsida:",
|
||||
"semantic_search_required": "Sarnaste objektide leidmiseks peab olema lubatud semantiline otsing.",
|
||||
"no_similar_objects_found": "Sarnaseid objekte ei leitud.",
|
||||
"quick_reply_when_else": "Millal seda veel nähti?",
|
||||
"quick_reply_find_similar_text": "Leia sarnaseid vaatepilte.",
|
||||
"quick_reply_tell_me_more_text": "Räägi mulle sellest lähemalt.",
|
||||
"quick_reply_when_else_text": "Millal seda veel nähtud on?",
|
||||
"attach_event_aria": "Lisa sündmus {{eventId}}",
|
||||
"attachment_picker_paste_label": "Või kleebi sündmuse ID",
|
||||
"attachment_picker_attach": "Lisa",
|
||||
"attachment_picker_placeholder": "Lisa sündmus",
|
||||
"quick_reply_find_similar": "Leia sarnaseid vaatlusi",
|
||||
"quick_reply_tell_me_more": "Räägi mulle sellest lähemalt",
|
||||
"attachment_chip_remove": "Eemalda manus",
|
||||
"attachment_chip_label": "{{label}} kaameras {{camera}}",
|
||||
"open_in_explore": "Ava uurimisvaates",
|
||||
"anchor": "Viide",
|
||||
"reasoning": {
|
||||
"active": "Otsin põhjendust…",
|
||||
"show": "Näita põhjendust",
|
||||
"hide": "Peida põhjendus"
|
||||
},
|
||||
"thinking": {
|
||||
"toggle": "Näita mõtlemise olekut või peida see"
|
||||
}
|
||||
"similarity_score": "Sarnasus"
|
||||
}
|
||||
|
||||
@@ -43,8 +43,5 @@
|
||||
},
|
||||
"tooltip": {
|
||||
"trainingInProgress": "Mudel on parasjagu õppimas"
|
||||
},
|
||||
"train": {
|
||||
"titleShort": "Hiljutised"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,8 +5,7 @@
|
||||
"noTrackedObjects": "Ühtegi jälgitavat objekti ei leidunud",
|
||||
"itemMenu": {
|
||||
"findSimilar": {
|
||||
"aria": "Otsi sarnaseid jälgitavaid objekte",
|
||||
"label": "Leia sarnane"
|
||||
"aria": "Otsi sarnaseid jälgitavaid objekte"
|
||||
},
|
||||
"downloadSnapshot": {
|
||||
"label": "Laadi hetkvõte alla",
|
||||
@@ -15,14 +14,6 @@
|
||||
"downloadCleanSnapshot": {
|
||||
"label": "Laadi puhas hetkvõte alla",
|
||||
"aria": "Laadi puhas hetkvõte alla"
|
||||
},
|
||||
"viewTrackingDetails": {
|
||||
"label": "Vaata jälgimise üksikasju",
|
||||
"aria": "Näita jälgimise üksikasju"
|
||||
},
|
||||
"downloadVideo": {
|
||||
"label": "Laadi video alla",
|
||||
"aria": "Laadi video alla"
|
||||
}
|
||||
},
|
||||
"trackingDetails": {
|
||||
@@ -30,22 +21,11 @@
|
||||
"showAllZones": {
|
||||
"title": "Näita kõiki tsoone",
|
||||
"desc": "Kui objekt on sisenenud tsooni, siis alati näida tsooni märgistust."
|
||||
},
|
||||
"title": "Annotatsioonide seaded",
|
||||
"offset": {
|
||||
"desc": "Need andmed pärinevad teie kaamera tuvastusvoost, kuid on salvestusvoo piltide peal. On ebatõenäoline, et need kaks voogu on ideaalselt sünkroonis. Seetõttu ei joondu piirav kast ja kaader ideaalselt. Selle säte abil saad annotatsioone ajas edasi või tagasi nihutada, et need salvestatud kaadriga paremini joonduks.",
|
||||
"millisecondsToOffset": "Millisekundid annotatsioonide tuvastuse nihutamiseks. <em>Vaikimisi: 0</em>",
|
||||
"tips": "Vähendage väärtust, kui video taasesitus on kastidest ja teekonnapunktidest ees, ning suurendage väärtust, kui video taasesitus on neist maas. See väärtus võib olla negatiivne.",
|
||||
"toast": {
|
||||
"success": "Kaamera '{{camera}}' annotatsiooni nihe on konfiguratsioonifaili salvestatud."
|
||||
},
|
||||
"label": "Annotatsiooni nihe"
|
||||
}
|
||||
},
|
||||
"lifecycleItemDesc": {
|
||||
"attribute": {
|
||||
"other": "{{label}} on tuvastatud kui {{attribute}}",
|
||||
"faceOrLicense_plate": "{{attribute}} tuvastatud objektil {{label}}"
|
||||
"other": "{{label}} on tuvastatud kui {{attribute}}"
|
||||
},
|
||||
"stationary": "{{label}} jäi paigale",
|
||||
"active": "{{label}} muutus aktiivseks",
|
||||
@@ -57,8 +37,7 @@
|
||||
"area": "Ala",
|
||||
"score": "Punktiskoor",
|
||||
"computedScore": "Arvutatud punktiskoor",
|
||||
"topScore": "Suuremad punktiskoorid",
|
||||
"toggleAdvancedScores": "Täpsemate tulemuste sisse-/väljalülitamine"
|
||||
"topScore": "Suuremad punktiskoorid"
|
||||
},
|
||||
"external": "{{label}} on tuvastatud",
|
||||
"heard": "{{label}} on kuuldud",
|
||||
@@ -71,11 +50,7 @@
|
||||
"previous": "Eelmine slaid",
|
||||
"next": "Järgmine slaid"
|
||||
},
|
||||
"count": "{{first}} / {{second}}",
|
||||
"adjustAnnotationSettings": "Korrigeeri annotatsioonide seadeid",
|
||||
"scrollViewTips": "Klõpsake selle objekti elutsükli oluliste hetkede vaatamiseks.",
|
||||
"autoTrackingTips": "Piirdekastide asukohad on automaatselt jälgivate kaamerate puhul ebatäpsed.",
|
||||
"trackedPoint": "Jälgitav punkt"
|
||||
"count": "{{first}} / {{second}}"
|
||||
},
|
||||
"documentTitle": "Avasta - Frigate",
|
||||
"generativeAI": "Generatiivne tehisaru",
|
||||
@@ -89,22 +64,7 @@
|
||||
},
|
||||
"startingUp": "Käivitun…",
|
||||
"estimatedTime": "Hinnanguliselt jäänud aega:",
|
||||
"finishingShortly": "Lõpetan õige pea",
|
||||
"context": "Avastamist saab kasutada pärast seda, kui jälgitavate objektide manustamine on uuesti indekseerimise lõpetanud."
|
||||
},
|
||||
"title": "Avastamine pole saadaval",
|
||||
"downloadingModels": {
|
||||
"context": "Frigate laadib alla semantilise otsingu funktsiooni toetamiseks vajalikke manustamismudeleid. See võib võtta mitu minutit, olenevalt teie võrguühenduse kiirusest.",
|
||||
"setup": {
|
||||
"visionModel": "Nägemismudel",
|
||||
"visionModelFeatureExtractor": "Nägemismudeli tunnuste eraldaja",
|
||||
"textModel": "Tekstimudel",
|
||||
"textTokenizer": "Teksti tokenisaator"
|
||||
},
|
||||
"tips": {
|
||||
"context": "Pärast mudelite allalaadimist tuleks oma jälgitavate objektide manused uuesti indekseerida."
|
||||
},
|
||||
"error": "Tekkis viga. Kontrollige Frigate'i logisid."
|
||||
"finishingShortly": "Lõpetan õige pea"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
@@ -147,52 +107,8 @@
|
||||
},
|
||||
"recognizedLicensePlate": "Tuvastatud sõiduki numbrimärk",
|
||||
"description": {
|
||||
"aiTips": "Frigate ei küsi sinu generatiivse tehisaru teenusepakkujalt kirjeldust enne, kui jälgitava objekti elutsükkel on lõppenud.",
|
||||
"label": "Kirjeldus",
|
||||
"placeholder": "Jälgitava objekti kirjeldus"
|
||||
},
|
||||
"label": "Silt",
|
||||
"editSubLabel": {
|
||||
"title": "Muuda alamsilti",
|
||||
"desc": "Sisesta sildile '{{label}}' uus alamsilt",
|
||||
"descNoLabel": "Sisesta sellele jälgitavale objektile uus alamsilt"
|
||||
},
|
||||
"camera": "Kaamera",
|
||||
"zones": "Tsoonid",
|
||||
"title": {
|
||||
"label": "Pealkiri"
|
||||
},
|
||||
"button": {
|
||||
"findSimilar": "Leia sarnane",
|
||||
"regenerate": {
|
||||
"title": "Taasloomine",
|
||||
"label": "Jälgitava objekti kirjelduse uuesti genereerimine"
|
||||
}
|
||||
},
|
||||
"topScore": {
|
||||
"label": "Parim punktiskoor",
|
||||
"info": "Kõrgeim skoor on jälgitava objekti kõrgeim mediaanskoor, seega võib see erineda otsingutulemuste pisipildil kuvatavast skoorist."
|
||||
},
|
||||
"objects": "Objektid",
|
||||
"tips": {
|
||||
"descriptionSaved": "Kirjeldus salvestati edukalt",
|
||||
"saveDescriptionFailed": "Kirjelduse uuendamine ebaõnnestus: {{errorMessage}}"
|
||||
},
|
||||
"attributes": "Klassifikatsiooni atribuudid",
|
||||
"estimatedSpeed": "Hinnanguline kiirus",
|
||||
"editAttributes": {
|
||||
"title": "Atribuutide muutmine",
|
||||
"desc": "Valige selle sildi '{{label}}' jaoks klassifikatsiooniatribuudid"
|
||||
"aiTips": "Frigate ei küsi sinu generatiivse tehisaru teenusepakkujalt kirjeldust enne, kui jälgitava objekti elutsükkel on lõppenud."
|
||||
}
|
||||
},
|
||||
"trackedObjectDetails": "Jälgitava objekti üksikasjad",
|
||||
"aiAnalysis": {
|
||||
"title": "Tehisintellekti analüüs"
|
||||
},
|
||||
"concerns": {
|
||||
"label": "Mured"
|
||||
},
|
||||
"objectLifecycle": {
|
||||
"noImageFound": "Selle jälgitava objekti kohta ei leitud pilti."
|
||||
}
|
||||
"trackedObjectDetails": "Jälgitava objekti üksikasjad"
|
||||
}
|
||||
|
||||
@@ -16,15 +16,12 @@
|
||||
"downloadVideo": "Laadi video alla",
|
||||
"editName": "Muuda nime",
|
||||
"deleteExport": "Kustuta eksporditud sisu",
|
||||
"assignToCase": "Lisa juhtumile",
|
||||
"removeFromCase": "Eemalda juhtumist"
|
||||
"assignToCase": "Lisa juhtumile"
|
||||
},
|
||||
"toast": {
|
||||
"error": {
|
||||
"renameExportFailed": "Eksporditud sisu nime muutmine ei õnnestunud: {{errorMessage}}",
|
||||
"assignCaseFailed": "Juhtumiga seose uuendamine ei õnnestunud: {{errorMessage}}",
|
||||
"caseSaveFailed": "Juhtumi salvestamine ei õnnestunud: {{errorMessage}}",
|
||||
"caseDeleteFailed": "Juhtumi kustutamine ei õnnestunud: {{errorMessage}}"
|
||||
"assignCaseFailed": "Juhtumiga seose uuendamine ei õnnestunud: {{errorMessage}}"
|
||||
}
|
||||
},
|
||||
"headings": {
|
||||
@@ -38,44 +35,5 @@
|
||||
"nameLabel": "Juhtumi nimi",
|
||||
"descriptionLabel": "Kirjeldus",
|
||||
"description": "Vali olemasolev juhtum või lisa uus."
|
||||
},
|
||||
"toolbar": {
|
||||
"newCase": "Uus juhtum",
|
||||
"addExport": "Lisa eksportimiseks",
|
||||
"editCase": "Muuda juhtumit",
|
||||
"deleteCase": "Kustuta juhtum"
|
||||
},
|
||||
"deleteCase": {
|
||||
"label": "Kustuta juhtum",
|
||||
"desc": "Kas oled kindel, et soovid „{{caseName}}“ juhtumi kustutada?"
|
||||
},
|
||||
"caseCard": {
|
||||
"emptyCase": "Eksportimise veel pole"
|
||||
},
|
||||
"jobCard": {
|
||||
"defaultName": "Eksportimine kaamerast „{{camera}}“",
|
||||
"queued": "Lisatud järjekorda",
|
||||
"running": "Töös",
|
||||
"preparing": "Ettevalmistamisel",
|
||||
"copying": "Kopeerimisel",
|
||||
"encoding": "Kodeerimisel",
|
||||
"encodingRetry": "Kodeerimisel (uuesti)",
|
||||
"finalizing": "Lõpetamisel"
|
||||
},
|
||||
"caseView": {
|
||||
"noDescription": "Kirjeldust pole",
|
||||
"createdAt": "Loodud {{value}}",
|
||||
"exportCount_one": "1 eksportimine",
|
||||
"exportCount_other": "{{count}} eksportimist",
|
||||
"cameraCount_one": "1 kaamera",
|
||||
"cameraCount_other": "{{count}} kaamerat",
|
||||
"showMore": "Näita rohkem",
|
||||
"showLess": "Näita vähem",
|
||||
"emptyTitle": "See juhtum on tühi"
|
||||
},
|
||||
"caseEditor": {
|
||||
"namePlaceholder": "Juhtumi nimi",
|
||||
"editTitle": "Muuda juhtumit",
|
||||
"createTitle": "Lisa juhtum"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
{
|
||||
"button": {
|
||||
"uploadImage": "Laadi pilt üles",
|
||||
"deleteFaceAttempts": "Kustuta näod",
|
||||
"addFace": "Lisa nägu",
|
||||
"renameFace": "Nimeta nägu ümber",
|
||||
"deleteFace": "Kustuta nägu",
|
||||
"reprocessFace": "Käivita näotuvastus uuesti"
|
||||
"uploadImage": "Laadi pilt üles"
|
||||
},
|
||||
"collections": "Kogumikud",
|
||||
"description": {
|
||||
@@ -16,41 +11,28 @@
|
||||
},
|
||||
"documentTitle": "Näoteek - Frigate",
|
||||
"createFaceLibrary": {
|
||||
"new": "Lisa uus nägu",
|
||||
"nextSteps": "Tugeva tuvastusaluse loomiseks:<li>Kasuta vahekaarti \"Hiljutised tuvastused\", et valida pilte ja treenida isikutuvastust.</li><li>Parima tulemuse saavutamiseks keskendu otsepiltidele; väldi nurga all olevaid nägusid treenimiseks.</li></ul>"
|
||||
"new": "Lisa uus nägu"
|
||||
},
|
||||
"deleteFaceLibrary": {
|
||||
"title": "Kustuta nimi",
|
||||
"desc": "Kas oled kindel, et soovid isiku '{{name}}' kollektsiooni kustutada? See kustutab jäädavalt kõik seotud näod."
|
||||
"title": "Kustuta nimi"
|
||||
},
|
||||
"toast": {
|
||||
"error": {
|
||||
"addFaceLibraryFailed": "Näo sidumine nimega ei õnnestunud: {{errorMessage}}",
|
||||
"updateFaceScoreFailed": "Näo punktiskoori uuendamine ei õnnestunud: {{errorMessage}}",
|
||||
"uploadingImageFailed": "Pildi üleslaadimine ebaõnnestus: {{errorMessage}}",
|
||||
"deleteFaceFailed": "Kustutamine ebaõnnestus: {{errorMessage}}",
|
||||
"deleteNameFailed": "Nime kustutamine ebaõnnestus: {{errorMessage}}",
|
||||
"renameFaceFailed": "Näo ümbernimetamine ebaõnnestus: {{errorMessage}}",
|
||||
"trainFailed": "Treenimine ebaõnnestus: {{errorMessage}}",
|
||||
"reclassifyFailed": "Näo ümberklassifitseerimine ebaõnnestus: {{errorMessage}}"
|
||||
"updateFaceScoreFailed": "Näo punktiskoori uuendamine ei õnnestunud: {{errorMessage}}"
|
||||
},
|
||||
"success": {
|
||||
"addFaceLibrary": "Lisamine nägude kogusse õnnestus: {{name}}!",
|
||||
"addFaceLibrary": "Lisamine Näoteeki õnnestus: {{name}}!",
|
||||
"deletedFace_one": "{{count}} näo kustutamine õnnestus.",
|
||||
"deletedFace_other": "{{count}} näo kustutamine õnnestus.",
|
||||
"deletedName_one": "{{count}} näo kustutamine õnnestus.",
|
||||
"deletedName_other": "{{count}} näo kustutamine õnnestus.",
|
||||
"updatedFaceScore": "Näo punktiskoori uuendamine õnnestus: {{name}} ({{score}}).",
|
||||
"uploadedImage": "Pildi üleslaadimine õnnestus.",
|
||||
"renamedFace": "Näo ümbernimetamine õnnestus, uus nimi on {{name}}",
|
||||
"trainedFace": "Edukalt treenitud nägu.",
|
||||
"reclassifiedFace": "Näo ümberklassifitseerimine õnnestus."
|
||||
"updatedFaceScore": "Näo punktiskoori uuendamine õnnestus: {{name}} ({{score}})."
|
||||
}
|
||||
},
|
||||
"deleteFaceAttempts": {
|
||||
"desc_one": "Kas oled kindel, et soovid kustutada {{count}} näo? Seda tegevust ei saa tagasi pöörata.",
|
||||
"desc_other": "Kas oled kindel, et soovid kustutada {{count}} nägu? Seda tegevust ei saa tagasi pöörata.",
|
||||
"title": "Kustuta näod"
|
||||
"desc_other": "Kas oled kindel, et soovid kustutada {{count}} nägu? Seda tegevust ei saa tagasi pöörata."
|
||||
},
|
||||
"details": {
|
||||
"timestamp": "Ajatampel",
|
||||
@@ -60,40 +42,5 @@
|
||||
"uploadFaceImage": {
|
||||
"title": "Laadi näopilt üles",
|
||||
"desc": "Laadi üles pilt, et otsida sellelt nägusid ja lisada see {{pageToggle}}'i jaoks"
|
||||
},
|
||||
"steps": {
|
||||
"faceName": "Lisa näole nimi",
|
||||
"uploadFace": "Lae näopilt üles",
|
||||
"nextSteps": "Järgmised sammud",
|
||||
"description": {
|
||||
"uploadFace": "Laadi üles pilt isikust '{{name}}', mis näitab tema nägu eestvaates. Ainult nägu ei pea pildilt välja lõikama."
|
||||
}
|
||||
},
|
||||
"train": {
|
||||
"title": "Hiljutised tuvastamised",
|
||||
"titleShort": "Hiljutised",
|
||||
"aria": "Vali hiljutised tuvastamised",
|
||||
"empty": "Hiljutisi näotuvastuse katseid pole",
|
||||
"emptyNoLibrary": {
|
||||
"title": "Laadi üles nägu",
|
||||
"description": "Näotuvastuse toimimiseks peate lisama vähemalt ühe näo kogusse."
|
||||
}
|
||||
},
|
||||
"renameFace": {
|
||||
"title": "Nimeta nägu ümber",
|
||||
"desc": "Sisesta uus nimi isiku '{{name}}' jaoks"
|
||||
},
|
||||
"imageEntry": {
|
||||
"validation": {
|
||||
"selectImage": "Palun vali pildifail."
|
||||
},
|
||||
"dropActive": "Lohista pilt siia…",
|
||||
"dropInstructions": "Lohistage või kleepige pilt siia või klõpsake valimiseks",
|
||||
"maxSize": "Maksimum suurus: {{size}}MB"
|
||||
},
|
||||
"nofaces": "Nägusid pole saadaval",
|
||||
"trainFaceAs": "Treeni nägu kui:",
|
||||
"trainFace": "Treeni nägu",
|
||||
"reclassifyFaceAs": "Liigita nägu ümber järgmiselt:",
|
||||
"reclassifyFace": "Näo ümberklassifitseerimine"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,78 +1,4 @@
|
||||
{
|
||||
"documentTitle": "Liikumise tuvastus - Frigate",
|
||||
"title": "Liikumise otsing",
|
||||
"cancelSearch": "Tühista",
|
||||
"startSearch": "Alusta otsingut",
|
||||
"selectCamera": "Liikumisotsingut laaditakse",
|
||||
"description": "Joonesta hulknurk, et määratleda huvipakkuv piirkond, ja määra ajavahemik, mille jooksul otsida liikumise muutusi selles piirkonnas.",
|
||||
"searchStarted": "Otsing alustatud",
|
||||
"searchCancelled": "Otsing tühistatud",
|
||||
"searching": "Otsing on pooleli.",
|
||||
"searchComplete": "Otsing lõpetatud",
|
||||
"noResultsYet": "Käivita otsing valitud piirkonnas liikumise muutuste leidmiseks",
|
||||
"noChangesFound": "Valitud piirkonnas ei tuvastatud pikslimuutusi",
|
||||
"results": "Tulemused",
|
||||
"polygonControls": {
|
||||
"drawMode": "Joonista",
|
||||
"moveMode": "Liiguta",
|
||||
"reset": "Lähtesta hulknurk",
|
||||
"undo": "Tühista viimane punkt",
|
||||
"points_one": "{{count}} punkt",
|
||||
"points_other": "{{count}} punkti"
|
||||
},
|
||||
"newSearch": "Uus otsing",
|
||||
"clearResults": "Tühista tulemused",
|
||||
"clearROI": "Tühista hulknurk",
|
||||
"dialog": {
|
||||
"cameraLabel": "Kaamera",
|
||||
"title": "Liikumisotsing",
|
||||
"previewAlt": "Kaamera '{{camera}}' eelvaade"
|
||||
},
|
||||
"timeRange": {
|
||||
"title": "Otsinguvahemik",
|
||||
"start": "Algusaeg",
|
||||
"end": "Lõppaeg"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Otsinguseaded",
|
||||
"parallelMode": "Paralleelrežiim",
|
||||
"parallelModeDesc": "Skanni mitut salvestusvahemikku korraga (kiirem; kasutab rohkem dekodeerimisressursse)",
|
||||
"threshold": "Tundlikkuse lävi",
|
||||
"thresholdDesc": "Väiksemad väärtused tuvastavad väiksemaid muutusi (1–255)",
|
||||
"minArea": "Minimaalne muutusala",
|
||||
"minAreaDesc": "Ühe liikuva piirkonna minimaalne suurus protsentides huvipakkuvast piirkonnast",
|
||||
"maxResults": "Maksimaalselt tulemusi",
|
||||
"maxResultsDesc": "Peata pärast nii paljude ajatemplite sobivust"
|
||||
},
|
||||
"errors": {
|
||||
"noCamera": "Palun vali kaamera",
|
||||
"noROI": "Palun joonistage huvipakkuv piirkond",
|
||||
"noTimeRange": "Palun valige ajavahemik",
|
||||
"invalidTimeRange": "Lõppaeg peab olema pärast algusaega",
|
||||
"searchFailed": "Otsing ebaõnnestus: {{message}}",
|
||||
"polygonTooSmall": "Hulknurgal peab olema vähemalt 3 punkti",
|
||||
"unknown": "Tundmatu viga"
|
||||
},
|
||||
"changePercentage": "{{percentage}}% muutus",
|
||||
"metrics": {
|
||||
"title": "Otsingumõõdikud",
|
||||
"segmentsScanned": "Skannitud segmente",
|
||||
"segmentsProcessed": "Töödeldud",
|
||||
"segmentsSkippedInactive": "Vahele jäetud (tegevust pole)",
|
||||
"segmentsSkippedHeatmap": "Vahele jäetud (kattuvaid piirkondi pole)",
|
||||
"fallbackFullRange": "Varurežiimis täisulatusega skaneerimine",
|
||||
"framesDecoded": "Kaadreid dekodeeritud",
|
||||
"wallTime": "Otsingu aeg",
|
||||
"seconds": "{{seconds}}s",
|
||||
"minutesSeconds": "{{minutes}}m {{seconds}}s",
|
||||
"segmentErrors": "Segmendi vead",
|
||||
"scanSummary": "{{segments}} segmenti · {{time}}"
|
||||
},
|
||||
"jumpToTime": "Hüppa sellele ajale",
|
||||
"framesProcessed": "{{count}} kaadrit töödeldud",
|
||||
"changesFound_one": "Tuvastatud {{count}} liikumine",
|
||||
"changesFound_other": "Tuvastatud {{count}} liikumist",
|
||||
"motionHeatmapLabel": "Liikumise soojakaart",
|
||||
"showSegmentHeatmap": "Soojakaart",
|
||||
"scanning": "Skannimine {{time}}"
|
||||
"title": "Liikumise otsing"
|
||||
}
|
||||
|
||||
@@ -12,48 +12,7 @@
|
||||
"selectFromTimeline": "Vali",
|
||||
"starting": "Käivitan kordust…",
|
||||
"startLabel": "Algus",
|
||||
"endLabel": "Lõpp",
|
||||
"title": "Alusta silumise taasesitust",
|
||||
"description": "Looge ajutine taasesituskaamera, mis kordab ajaloolist salvestist objektide tuvastamise ja jälgimise probleemide silumiseks. Taasesituskaameral on sama tuvastusseadistus mis lähtekaameral. Valige algusaeg.",
|
||||
"toast": {
|
||||
"error": "Silumise taasesitus ebaõnnestus: {{error}}",
|
||||
"alreadyActive": "Kordusseanss on juba aktiivne",
|
||||
"stopError": "Silumise taasesituse peatamine ebaõnnestus: {{error}}",
|
||||
"goToReplay": "Mine kordusesse"
|
||||
}
|
||||
"endLabel": "Lõpp"
|
||||
},
|
||||
"title": "Kordus veaotsinguks",
|
||||
"websocket_messages": "Sõnumid",
|
||||
"description": "Mängi kaamera salvestisi veaotsinguks. Objektide loend näitab tuvastatud objektide ajalist viivitust ja vahekaart „Sõnumid” näitab Fregati sisemiste sõnumite voogu taasesituse materjalist.",
|
||||
"page": {
|
||||
"noSession": "Aktiivset silumis- ja taasesitusseanssi pole",
|
||||
"noSessionDesc": "Alusta silumissalvestise taasesitust ajaloo vaates, klõpsates tööriistaribal nupul \"Toimingud\" ja valides silumissalvestise taasesituse.",
|
||||
"goToRecordings": "Mine ajaloo vaatesse",
|
||||
"preparingClip": "Klipi ettevalmistamine…",
|
||||
"preparingClipDesc": "Frigate koondab valitud ajavahemiku salvestisi. Pikemate vahemike puhul võib see võtta kauem.",
|
||||
"startingCamera": "Silumise taasesituse käivitamine…",
|
||||
"startError": {
|
||||
"title": "Silumise taasesituse käivitamine ebaõnnestus",
|
||||
"back": "Tagasi ajaloo vaatesse"
|
||||
},
|
||||
"sourceCamera": "Lähtekaamera",
|
||||
"replayCamera": "Taasesituse kaamera",
|
||||
"initializingReplay": "Silumise taasesituse initsialiseerimine...",
|
||||
"stoppingReplay": "Silumise taasesituse peatamine...",
|
||||
"stopReplay": "Peata kordusesitus",
|
||||
"confirmStop": {
|
||||
"title": "Peata silumise kordusesitus?",
|
||||
"description": "See peatab seansi ja kustutab kõik ajutised andmed. Kas oled kindel?",
|
||||
"confirm": "Peata kordusesitus",
|
||||
"cancel": "Tühista"
|
||||
},
|
||||
"activity": "Toimingud",
|
||||
"objects": "Objekti loend",
|
||||
"audioDetections": "Audio tuvastused",
|
||||
"noActivity": "Ühtegi tegevust ei tuvastatud",
|
||||
"activeTracking": "Aktiivne jälgimine",
|
||||
"noActiveTracking": "Aktiivset jälgimist pole",
|
||||
"configuration": "Seaded",
|
||||
"configurationDesc": "Peenhäälesta liikumistuvastuse ja objektide jälgimise sätteid silumis- ja taasesituskaamera jaoks. Frigate'i konfiguratsiooni faili muudatusi ei salvestata."
|
||||
}
|
||||
"title": "Kordus veaotsinguks"
|
||||
}
|
||||
|
||||
@@ -7,28 +7,7 @@
|
||||
"connectionSettings": "Ühenduse seadistused",
|
||||
"port": "Port",
|
||||
"username": "Kasutajanimi",
|
||||
"usernamePlaceholder": "Valikuline",
|
||||
"cameraName": "Kaamera nimi",
|
||||
"cameraNamePlaceholder": "näiteks: eesmine_uks või Hoovi ülevaade",
|
||||
"host": "Host/IP-aadress",
|
||||
"cameraBrand": "Kaamera bränd",
|
||||
"selectBrand": "Vali URL malli jaoks kaamera bränd",
|
||||
"customUrl": "Kohandatud voo URL",
|
||||
"brandInformation": "Brändi teave",
|
||||
"brandUrlFormat": "Kaamerate puhul, mille RTSP URL-i vorming on järgmine: {{exampleUrl}}",
|
||||
"selectTransport": "Valige transpordiprotokoll",
|
||||
"description": "Sisestage oma kaamera andmed ja valige, kas soovite kaamerat tuvastada või valida tootja käsitsi.",
|
||||
"onvifPort": "ONVIF port",
|
||||
"probeMode": "Tuvasta kaamera",
|
||||
"manualMode": "Manuaalne valik",
|
||||
"errors": {
|
||||
"nameRequired": "Kaamera nimi on kohustuslik",
|
||||
"nameLength": "Kaamera nimi peab olema kuni 64 tähemärki pikk",
|
||||
"invalidCharacters": "Kaamera nimi sisaldab sobimatuid märke",
|
||||
"nameExists": "Kaamera nimi on juba olemas",
|
||||
"brandOrCustomUrlRequired": "Valige kas kaamera bränd koos hosti/IP-aadressiga või valige „Muu” kohandatud URL-iga"
|
||||
},
|
||||
"detectionMethod": "Vootuvastus meetod"
|
||||
"usernamePlaceholder": "Valikuline"
|
||||
},
|
||||
"step3": {
|
||||
"streamUrlPlaceholder": "rtsp://kasutajanimi:salasõna@host:port/asukoht",
|
||||
@@ -38,37 +17,17 @@
|
||||
"roles": "Rollid",
|
||||
"roleLabels": {
|
||||
"record": "Salvestamine",
|
||||
"audio": "Heliriba",
|
||||
"detect": "Objektituvastus"
|
||||
"audio": "Heliriba"
|
||||
},
|
||||
"connected": "Ühendatud",
|
||||
"featuresTitle": "Funktsionaalsused",
|
||||
"selectStream": "Vali voog",
|
||||
"selectQuality": "Valige kvaliteet",
|
||||
"notConnected": "Pole ühendatud",
|
||||
"testFailedTitle": "Test ebaõnnestus",
|
||||
"testStream": "Testi ühendust",
|
||||
"testSuccess": "Voo test edukas!",
|
||||
"testFailed": "Voo test ebaõnnestus",
|
||||
"selectResolution": "Vali resolutsioon",
|
||||
"noStreamFound": "Voogu ei leitud",
|
||||
"addAnotherStream": "Lisa järgmine voog",
|
||||
"streamTitle": "Voog {{number}}",
|
||||
"streamUrl": "Voo URL",
|
||||
"addStream": "Lisa voog",
|
||||
"description": "Seadista voogedastusrolle ja lisa oma kaamerale täiendavaid vooge.",
|
||||
"streamsTitle": "Kaamera vood"
|
||||
"featuresTitle": "Funktsionaalsused"
|
||||
},
|
||||
"steps": {
|
||||
"probeOrSnapshot": "Võta proov või tee hetkvõte",
|
||||
"nameAndConnection": "Nimi ja ühendus",
|
||||
"streamConfiguration": "Voo seaded",
|
||||
"validationAndTesting": "Valideerimine ja testimine"
|
||||
"probeOrSnapshot": "Võta proov või tee hetkvõte"
|
||||
},
|
||||
"step2": {
|
||||
"testing": {
|
||||
"fetchingSnapshot": "Laadin kaamera hetkvõtet alla...",
|
||||
"probingMetadata": "Tuvastan kaamera metaandmeid..."
|
||||
"fetchingSnapshot": "Laadin kaamera hetkvõtet alla..."
|
||||
},
|
||||
"retry": "Proovi uuesti",
|
||||
"manufacturer": "Tootja",
|
||||
@@ -78,30 +37,7 @@
|
||||
"presets": "Eelseadistused",
|
||||
"useCandidate": "Kasuta",
|
||||
"uriCopy": "Kopeeri",
|
||||
"connected": "Ühendatud",
|
||||
"testSuccess": "Ühenduse test õnnestus!",
|
||||
"testFailed": "Ühenduse test ebaõnnestus. Palun kontrollige sisestatud andmeid ja proovige uuesti.",
|
||||
"testFailedTitle": "Test ebaõnnestus",
|
||||
"streamDetails": "Voo üksikasjad",
|
||||
"probing": "Tuvastan kaamerat...",
|
||||
"ptzSupport": "PTZ tugi",
|
||||
"testConnection": "Testi ühendust",
|
||||
"toggleUriView": "Klõpsake täieliku URI vaate sisse/välja lülitamiseks",
|
||||
"notConnected": "Pole ühendatud",
|
||||
"errors": {
|
||||
"hostRequired": "Hosti/IP-aadress on kohustuslik"
|
||||
},
|
||||
"candidateStreamTitle": "Kandidaat {{number}}",
|
||||
"probeSuccessful": "Tuvastamine õnnestus",
|
||||
"probeError": "Tuvastamise viga",
|
||||
"probeNoSuccess": "Tuvastamine ebaõnnestus",
|
||||
"deviceInfo": "Seadme info",
|
||||
"autotrackingSupport": "Automaatse jälgimise tugi",
|
||||
"uriCopied": "URI kopeeriti lõikelauale",
|
||||
"rtspCandidates": "RTSP kandidaadid",
|
||||
"probingDevice": "Tuvastan seadet...",
|
||||
"description": "Tuvasta kaamera vooge või seadista käsitsi seaded vastavalt valitud tuvastusmeetodile.",
|
||||
"probeFailed": "Kaamera tuvastamine ebaõnnestus: {{error}}"
|
||||
"connected": "Ühendatud"
|
||||
},
|
||||
"testResultLabels": {
|
||||
"resolution": "Resolutsioon",
|
||||
@@ -120,17 +56,7 @@
|
||||
"roles": "Rollid",
|
||||
"none": "Määramata",
|
||||
"error": "Viga"
|
||||
},
|
||||
"commonErrors": {
|
||||
"noUrl": "Palun sisestage kehtiv voogesituse URL",
|
||||
"testFailed": "Voo test ebaõnnestus: {{error}}"
|
||||
},
|
||||
"save": {
|
||||
"success": "Uue kaamera '{{cameraName}}' salvestamine õnnestus.",
|
||||
"failure": "Viga kaamera '{{cameraName}}' salvestamisel."
|
||||
},
|
||||
"title": "Lisa kaamera",
|
||||
"description": "Uue kaamera lisamiseks oma Frigate paigaldisesse järgige alltoodud samme."
|
||||
}
|
||||
},
|
||||
"users": {
|
||||
"updatePassword": "Lähtesta salasõna",
|
||||
@@ -246,32 +172,24 @@
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "Seadistused - Frigate",
|
||||
"authentication": "Autentimise seaded - Frigate",
|
||||
"cameraReview": "Kaamerate kordusvaatuste seaded - Frigate",
|
||||
"general": "Profiili seaded - Frigate",
|
||||
"frigatePlus": "Frigate+ seaded - Frigate",
|
||||
"notifications": "Teavituste seaded - Frigate",
|
||||
"authentication": "Autentimise seadistused - Frigate",
|
||||
"cameraReview": "Kaamerate kordusvaatuste seadistused - Frigate",
|
||||
"general": "Profiili seadistused - Frigate",
|
||||
"frigatePlus": "Frigate+ seadistused - Frigate",
|
||||
"notifications": "Teavituste seadistused - Frigate",
|
||||
"cameraManagement": "Kaamerate haldus - Frigate",
|
||||
"masksAndZones": "Maskide ja tsoonide haldus - Frigate",
|
||||
"object": "Silumine ja veaotsing - Frigate",
|
||||
"enrichments": "Rikastamise seaded - Frigate",
|
||||
"motionTuner": "Liikumise häälestaja – Frigate",
|
||||
"globalConfig": "Globaalsed seaded – Frigate",
|
||||
"cameraConfig": "Kaamera seaded - Frigate",
|
||||
"detectorsAndModel": "Detektorid ja mudel – Frigate",
|
||||
"maintenance": "Hooldus – Frigate",
|
||||
"profiles": "Profiilid - Frigate"
|
||||
"object": "Silumine ja veaotsing - Frigate"
|
||||
},
|
||||
"general": {
|
||||
"title": "Kasutajaliidese seadistused",
|
||||
"title": "Profiili seadistused",
|
||||
"cameraGroupStreaming": {
|
||||
"clearAll": "Kustuta kõik voogedastuse seadistused"
|
||||
},
|
||||
"liveDashboard": {
|
||||
"title": "Töölaud reaalajas",
|
||||
"automaticLiveView": {
|
||||
"label": "Automaatne otseülekande vaade",
|
||||
"desc": "Aktiveerib automaatselt kaamera reaalajas vaate, kui tuvastatakse tegevus. Selle valiku keelamisel uuendatakse kaamerapilti töölaual ainult üks kord minutis."
|
||||
"label": "Automaatne otseülekande vaade"
|
||||
}
|
||||
},
|
||||
"calendar": {
|
||||
@@ -417,7 +335,7 @@
|
||||
},
|
||||
"menu": {
|
||||
"ui": "Kasutajaliides",
|
||||
"cameraManagement": "Kaamera haldus",
|
||||
"cameraManagement": "Haldus",
|
||||
"masksAndZones": "Maskid ja tsoonid",
|
||||
"triggers": "Päästikud",
|
||||
"debug": "Silumine ja veaotsing",
|
||||
@@ -455,37 +373,7 @@
|
||||
"systemMqtt": "MQTT",
|
||||
"systemGo2rtcStreams": "go2rtc voogedastus",
|
||||
"integrationSemanticSearch": "Semantiline otsing",
|
||||
"integrationGenerativeAi": "Generatiivne tehisaru",
|
||||
"general": "Üldine",
|
||||
"globalConfig": "Globaalsed seaded",
|
||||
"system": "Süsteem",
|
||||
"integrations": "Integratsioonid",
|
||||
"cameras": "Kaamera seaded",
|
||||
"integrationFaceRecognition": "Nöotuvastus",
|
||||
"cameraDetect": "Objektituvastus",
|
||||
"cameraFfmpeg": "Vood (FFmpeg)",
|
||||
"cameraRecording": "Salvestus",
|
||||
"cameraSnapshots": "Hetktõmmised",
|
||||
"cameraMotion": "Liikumistuvastus",
|
||||
"cameraObjects": "Objektid",
|
||||
"cameraConfigReview": "Ülevaade",
|
||||
"cameraAudioEvents": "audiotuvastus",
|
||||
"cameraAudioTranscription": "Audio transkriptsioon",
|
||||
"cameraNotifications": "Teated",
|
||||
"cameraLivePlayback": "Otseülekanne",
|
||||
"integrationAudioTranscription": "Audio transkriptsioon",
|
||||
"integrationObjectClassification": "Objektide klassifitseerimine",
|
||||
"cameraFaceRecognition": "Näotuvastus",
|
||||
"cameraMqttConfig": "MQTT",
|
||||
"cameraOnvif": "ONVIF",
|
||||
"cameraUi": "Kaamera kasutajaliides",
|
||||
"cameraTimestampStyle": "Ajatempli stiil",
|
||||
"cameraMqtt": "Kaamera MQTT",
|
||||
"maintenance": "Hooldus",
|
||||
"mediaSync": "Meedia sünkroonimine",
|
||||
"regionGrid": "Regioonide ruudustik",
|
||||
"enrichments": "Andmete rikastamine",
|
||||
"motionTuner": "Liikumistuvastuse seadistaja"
|
||||
"integrationGenerativeAi": "Generatiivne tehisaru"
|
||||
},
|
||||
"dialog": {
|
||||
"unsavedChanges": {
|
||||
@@ -501,11 +389,7 @@
|
||||
"semanticSearch": {
|
||||
"reindexNow": {
|
||||
"confirmButton": "Indekseeri uuesti",
|
||||
"label": "Indekseeri kohe uuesti",
|
||||
"alreadyInProgress": "Ümberindekseerimine on juba käimas.",
|
||||
"error": "Uuesti indekseerimise alustamine ebaõnnestus: {{errorMessage}}",
|
||||
"success": "Ümberindekseerimine algas edukalt.",
|
||||
"confirmTitle": "Kinnita uuesti indekseerimine"
|
||||
"label": "Indekseeri uuesti kohe"
|
||||
},
|
||||
"modelSize": {
|
||||
"small": {
|
||||
@@ -513,9 +397,7 @@
|
||||
},
|
||||
"large": {
|
||||
"title": "suur"
|
||||
},
|
||||
"label": "Mudeli suurus",
|
||||
"desc": "Semantilise otsingu manustamiseks kasutatava mudeli suurus."
|
||||
}
|
||||
},
|
||||
"title": "Semantiline otsing"
|
||||
},
|
||||
@@ -526,23 +408,14 @@
|
||||
},
|
||||
"large": {
|
||||
"title": "suur"
|
||||
},
|
||||
"label": "Mudeli suurus",
|
||||
"desc": "Näotuvastuseks kasutatava mudeli suurus."
|
||||
},
|
||||
"title": "Näotuvastus"
|
||||
}
|
||||
}
|
||||
},
|
||||
"birdClassification": {
|
||||
"title": "Lindude klassifikatsioon"
|
||||
},
|
||||
"licensePlateRecognition": {
|
||||
"title": "Sõidukite numbrimärkide tuvastus"
|
||||
},
|
||||
"title": "Andmerikastuse seaded",
|
||||
"restart_required": "Taaskäivitamine on vajalik (Andmerikastuse seadeid on muudetud)",
|
||||
"toast": {
|
||||
"success": "Andmerikastamise seaded on salvestatud. Muudatuste rakendamiseks taaskäivitage Frigate.",
|
||||
"error": "Seadete muudatuste salvestamine ebaõnnestus: {{errorMessage}}"
|
||||
}
|
||||
},
|
||||
"cameraReview": {
|
||||
@@ -624,31 +497,5 @@
|
||||
"lpr": {
|
||||
"vehicleNotTracked": "Sõidukite numbrimärkide tuvastus eeldab, et auto või mootorratas on jälgitav. Lülita menüüst Objektid sell kaamera jaoks sisse valikud „auto“ või „mootorratas“."
|
||||
}
|
||||
},
|
||||
"button": {
|
||||
"overriddenGlobal": "Ülekirjutatud (Globaalne)",
|
||||
"overriddenGlobalTooltip": "Käesolev kaamera kirjutab selles jaotises üle globaalsed seaded",
|
||||
"overriddenGlobalHeading_one": "See kaamera sürjutab {{count}} üldise seadistuse välja:",
|
||||
"overriddenGlobalHeading_other": "See kaamera sürjutab {{count}} üldise seadistuse välja:"
|
||||
},
|
||||
"saveAllPreview": {
|
||||
"title": "Salvestatavad muudatused",
|
||||
"triggerLabel": "Vaadake üle ootel olevad muudatused",
|
||||
"empty": "Ootel muudatusi pole.",
|
||||
"scope": {
|
||||
"label": "Ulatus",
|
||||
"global": "Globaalne",
|
||||
"camera": "Kaamera: {{cameraName}}"
|
||||
},
|
||||
"profile": {
|
||||
"label": "Profiil"
|
||||
},
|
||||
"field": {
|
||||
"label": "Väli"
|
||||
},
|
||||
"value": {
|
||||
"label": "Uus väärtus",
|
||||
"reset": "Lähtesta"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,14 +2,7 @@
|
||||
"documentTitle": {
|
||||
"general": "Üldine statistika - Frigate",
|
||||
"cameras": "Kaamerate statistika - Frigate",
|
||||
"storage": "Andmeruumi statistika - Frigate",
|
||||
"logs": {
|
||||
"frigate": "Frigate logid - Frigate",
|
||||
"go2rtc": "Go2RTC logid - Frigate",
|
||||
"nginx": "Nginx logid - Frigate",
|
||||
"websocket": "Sõnumite logid - Frigate"
|
||||
},
|
||||
"enrichments": "Rikastus statistika - Frigate"
|
||||
"storage": "Andmeruumi statistika - Frigate"
|
||||
},
|
||||
"logs": {
|
||||
"download": {
|
||||
@@ -23,29 +16,11 @@
|
||||
"websocket": {
|
||||
"filter": {
|
||||
"cameras_count_one": "{{count}} kaamera",
|
||||
"cameras_count_other": "{{count}} kaamerat",
|
||||
"camera": "Kaamera",
|
||||
"all_cameras": "Kõik kaamerad",
|
||||
"events": "Sündmused",
|
||||
"reviews": "Ülevaated",
|
||||
"system": "Süsteem",
|
||||
"topics": "Teemad",
|
||||
"all": "Kõik teemad",
|
||||
"face_recognition": "Näotuvastus",
|
||||
"classification": "Klassifikatsioon",
|
||||
"camera_activity": "Kaamera aktiivsus",
|
||||
"lpr": "Numbrimärgituvastus"
|
||||
"cameras_count_other": "{{count}} kaamerat"
|
||||
},
|
||||
"empty": "Ühtegi sõnumit pole veel hõivatud",
|
||||
"count_one": "{{count}} sõnum",
|
||||
"count_other": "{{count}} sõnumit",
|
||||
"pause": "Peata",
|
||||
"resume": "Jätka",
|
||||
"label": "Sõnumid",
|
||||
"clear": "Tühista",
|
||||
"expanded": {
|
||||
"payload": "Last"
|
||||
}
|
||||
"count_other": "{{count}} sõnumit"
|
||||
},
|
||||
"type": {
|
||||
"label": "Tüüp",
|
||||
@@ -61,170 +36,5 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"title": "Süsteem",
|
||||
"enrichments": {
|
||||
"embeddings": {
|
||||
"object_description_events_per_second": "Objekti kirjeldus",
|
||||
"face_recognition": "Näotuvastus",
|
||||
"plate_recognition": "Numbrimärgi tuvastus",
|
||||
"object_description": "Objekti kirjeldus",
|
||||
"review_description_events_per_second": "Ülevaate kirjeldus",
|
||||
"review_description": "Ülevaate kirjeldus",
|
||||
"yolov9_plate_detection": "YOLOv9 numbrimärgi tuvastus",
|
||||
"yolov9_plate_detection_speed": "YOLOv9 numbrimärgi tuvastuskiirus",
|
||||
"plate_recognition_speed": "Numbrimärgituvastuse kiirus",
|
||||
"face_recognition_speed": "Näotuvastuse kiirus"
|
||||
},
|
||||
"title": "Andmerikastused"
|
||||
},
|
||||
"cameras": {
|
||||
"connectionQuality": {
|
||||
"reconnectsLastHour": "Uuesti ühendumisi (viimase tunni jooksul)",
|
||||
"stallsLastHour": "Seiskumisi (viimase tunni jooksul)",
|
||||
"title": "Ühenduse kvaliteet",
|
||||
"excellent": "Suurepärane",
|
||||
"fair": "Rahuldav",
|
||||
"poor": "Kehv",
|
||||
"unusable": "Mittekasutatav",
|
||||
"fps": "Kaadrisagedus",
|
||||
"expectedFps": "Eeldatav kaadrisagedus (FPS)"
|
||||
},
|
||||
"label": {
|
||||
"camera": "kaamera",
|
||||
"detect": "tuvasta",
|
||||
"skipped": "vahele jäetud",
|
||||
"ffmpeg": "FFmpeg",
|
||||
"cameraFfmpeg": "{{camName}} FFmpeg",
|
||||
"cameraGpu": "{{camName}} GPU",
|
||||
"cameraDetect": "{{camName}} tuvastus",
|
||||
"overallFramesPerSecond": "kaadreid sekundis kokku",
|
||||
"overallDetectionsPerSecond": "kogutuvastusi sekundis",
|
||||
"overallSkippedDetectionsPerSecond": "vahelejäänud tuvastusi sekundis kokku",
|
||||
"cameraFramesPerSecond": "{{camName}} kaadreid sekundis",
|
||||
"cameraDetectionsPerSecond": "{{camName}} tuvastusi sekundis",
|
||||
"cameraSkippedDetectionsPerSecond": "{{camName}} vahelejäänud tuvastusi sekundis",
|
||||
"capture": "jäädvustamine"
|
||||
},
|
||||
"noCameras": {
|
||||
"title": "Ühtegi kaamerat ei leitud"
|
||||
},
|
||||
"framesAndDetections": "Kaadreid / Tuvastusi",
|
||||
"info": {
|
||||
"keyframes": {
|
||||
"recordDisabled": "Selle kaamera salvestamine on välja lülitatud.",
|
||||
"segmentLength": "Salvestuse segmendi pikkus:",
|
||||
"recordStream": "Salvestusvoog:",
|
||||
"keyframeCount": "Vaadeldud võtmekaadrid:",
|
||||
"observedDuration": "Vaadeldud kestus:"
|
||||
},
|
||||
"audio": "Audio:",
|
||||
"error": "Viga: {{error}}",
|
||||
"codec": "Koodek:",
|
||||
"resolution": "Resolutsioon:",
|
||||
"video": "Video:",
|
||||
"aspectRatio": "kuvasuhe",
|
||||
"unknown": "Tundmatu",
|
||||
"fetching": "Kaameraandmete toomine",
|
||||
"stream": "Voog {{idx}}",
|
||||
"streamDataFromFFPROBE": "Vooandmed saadakse <code>ffprobe</code> abil.",
|
||||
"fps": "Kaadrisagedus (FPS):"
|
||||
},
|
||||
"title": "Kaamerad",
|
||||
"overview": "Ülevaade"
|
||||
},
|
||||
"lastRefreshed": "Viimati uuendatud: ",
|
||||
"stats": {
|
||||
"healthy": "Süsteem on töökorras",
|
||||
"detectIsSlow": "{{detect}} on aeglane ({{speed}} ms)",
|
||||
"detectIsVerySlow": "{{detect}} on väga aeglane ({{speed}} ms)",
|
||||
"cameraIsOffline": "{{camera}} on ühenduseta"
|
||||
},
|
||||
"storage": {
|
||||
"cameraStorage": {
|
||||
"camera": "Kaamera",
|
||||
"unused": {
|
||||
"title": "Kasutamata",
|
||||
"tips": "See väärtus ei pruugi Frigate'i jaoks saadaolevat vaba ruumi täpselt kajastada, kui teie draivil on lisaks Frigate'i salvestistele ka muid faile. Frigate ei jälgi salvestusruumi kasutamist väljaspool oma salvestisi."
|
||||
},
|
||||
"bandwidth": "Ribalaius",
|
||||
"storageUsed": "Salvestusmaht",
|
||||
"percentageOfTotalUsed": "protsent kogusummast",
|
||||
"unusedStorageInformation": "Kasutamata salvestusmahu info",
|
||||
"title": "Kaamera salvestusmaht"
|
||||
},
|
||||
"title": "Säilitus",
|
||||
"overview": "Ülevaade",
|
||||
"recordings": {
|
||||
"title": "Salvestused",
|
||||
"earliestRecording": "Varaseim saadaolev salvestis:"
|
||||
},
|
||||
"shm": {
|
||||
"title": "SHM (jagatud mälu) eraldus",
|
||||
"frameLifetime": {
|
||||
"title": "Kaadri eluiga"
|
||||
}
|
||||
}
|
||||
},
|
||||
"metrics": "Süsteemi mõõdikud",
|
||||
"general": {
|
||||
"title": "Üldine",
|
||||
"hardwareInfo": {
|
||||
"gpuUsage": "GPU kasutus",
|
||||
"gpuMemory": "GPU mälu",
|
||||
"gpuInfo": {
|
||||
"vainfoOutput": {
|
||||
"title": "Vainfo väljund",
|
||||
"processOutput": "Protsessi väljund:",
|
||||
"processError": "Protsessi viga:",
|
||||
"returnCode": "Tagastuskood: {{code}}"
|
||||
},
|
||||
"closeInfo": {
|
||||
"label": "Sulge GPU info"
|
||||
},
|
||||
"copyInfo": {
|
||||
"label": "Kopeeri GPU info"
|
||||
},
|
||||
"nvidiaSMIOutput": {
|
||||
"title": "Nvidia SMI väljund",
|
||||
"name": "Nimi: {{name}}",
|
||||
"driver": "Draiver: {{driver}}",
|
||||
"cudaComputerCapability": "CUDA arvutusvõimekus: {{cuda_compute}}",
|
||||
"vbios": "VBios info: {{vbios}}"
|
||||
},
|
||||
"toast": {
|
||||
"success": "GPU info kopeeriti lõikelauale"
|
||||
}
|
||||
},
|
||||
"gpuDecoder": "GPU dekooder",
|
||||
"gpuTemperature": "GPU temperatuur",
|
||||
"gpuEncoder": "GPU kodeerija",
|
||||
"gpuCompute": "GPU arvutus / kodeerimine",
|
||||
"title": "Riistvara info",
|
||||
"npuUsage": "NPU kasutus",
|
||||
"npuMemory": "NPU mälu",
|
||||
"npuTemperature": "NPU temperatuur",
|
||||
"intelGpuWarning": {
|
||||
"title": "Inteli GPU statistika hoiatus",
|
||||
"message": "GPU statistika pole saadaval"
|
||||
}
|
||||
},
|
||||
"otherProcesses": {
|
||||
"series": {
|
||||
"go2rtc": "go2rtc",
|
||||
"recording": "salvestus",
|
||||
"review_segment": "Segmendi ülevaade",
|
||||
"audio_detector": "audio detektor"
|
||||
},
|
||||
"processCpuUsage": "Protsessi CPU kasutus",
|
||||
"processMemoryUsage": "Protsessi mälukasutus"
|
||||
},
|
||||
"detector": {
|
||||
"title": "Detektorid",
|
||||
"memoryUsage": "Detektori mälukasutus",
|
||||
"cpuUsage": "Detektori CPU kasutus",
|
||||
"temperature": "Detektori temperatuur",
|
||||
"inferenceSpeed": "Detektori järelduskiirus",
|
||||
"cpuUsageInformation": "Protsessori võimsus, mida kasutatakse tuvastusmudelite sisend- ja väljundandmete ettevalmistamisel. See väärtus ei mõõda järelduste kasutamist isegi siis, kui kasutatakse graafikaprotsessorit või kiirendit."
|
||||
}
|
||||
}
|
||||
"title": "Süsteem"
|
||||
}
|
||||
|
||||
@@ -67,8 +67,7 @@
|
||||
"error": {
|
||||
"failed": "Échec du démarrage de l'exportation : {{error}}",
|
||||
"endTimeMustAfterStartTime": "L'heure de fin doit être postérieure à l'heure de début.",
|
||||
"noVaildTimeSelected": "La plage horaire sélectionnée n'est pas valide.",
|
||||
"noValidTimeSelected": "Interval de temps invalide"
|
||||
"noVaildTimeSelected": "La plage horaire sélectionnée n'est pas valide."
|
||||
},
|
||||
"success": "Exportation démarrée avec succès. Consultez le fichier sur la page des exportations.",
|
||||
"view": "Vue",
|
||||
@@ -89,9 +88,7 @@
|
||||
"export": "Exporter",
|
||||
"fromTimeline": {
|
||||
"saveExport": "Enregistrer l'exportation",
|
||||
"previewExport": "Aperçu de l'exportation",
|
||||
"queueingExport": "Traitement de l'export...",
|
||||
"useThisRange": "Utiliser cet interval"
|
||||
"previewExport": "Aperçu de l'exportation"
|
||||
},
|
||||
"case": {
|
||||
"label": "Dossier",
|
||||
@@ -198,10 +195,6 @@
|
||||
"markAsReviewed": "Marquer comme traité",
|
||||
"deleteNow": "Supprimer maintenant",
|
||||
"markAsUnreviewed": "Marquer comme non traité"
|
||||
},
|
||||
"shareTimestamp": {
|
||||
"label": "Partager cette date",
|
||||
"title": "Partager cette date"
|
||||
}
|
||||
},
|
||||
"imagePicker": {
|
||||
|
||||
@@ -433,22 +433,5 @@
|
||||
"trickle": "Csörgedezés",
|
||||
"gush": "Folyás",
|
||||
"stir": "Kavarás",
|
||||
"thump": "Puffanás",
|
||||
"arrow": "Nyíl",
|
||||
"bouncing": "Pattog",
|
||||
"vibration": "Vibrálás",
|
||||
"inside": "Belül",
|
||||
"outside": "Kívül",
|
||||
"mains_hum": "Hálózati zaj",
|
||||
"distortion": "Torzulás",
|
||||
"throbbing": "Lüktetés",
|
||||
"flap": "Csapkodás",
|
||||
"scratch": "Kapar",
|
||||
"scrape": "Karcolás",
|
||||
"rub": "Dörzsölés",
|
||||
"roll": "Gördül",
|
||||
"crushing": "Összenyom",
|
||||
"crumpling": "Gyűrődés",
|
||||
"beep": "Sípolás",
|
||||
"clang": "Csengés"
|
||||
"thump": "Puffanás"
|
||||
}
|
||||
|
||||
@@ -24,9 +24,6 @@
|
||||
},
|
||||
"state": {
|
||||
"submitted": "Terkirim"
|
||||
},
|
||||
"toast": {
|
||||
"error": "Gagal submit ke Frigate+. Harap periksa koneksi jaringan Anda dan coba lagi."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -60,8 +57,7 @@
|
||||
"view": "Melihat",
|
||||
"batchSuccess_other": "{{count}} Ekspor dimulai. Membuka kasusnya sekarang.",
|
||||
"batchPartial": "Ekspor berhasil dimulai sebanyak {{successful}} dari total {{total}} ekspor. Kamera yang gagal: {{failedCameras}}",
|
||||
"batchFailed": "Gagal memulai ekspor sebanyak {{total}}. Kamera yang gagal: {{failedCameras}}",
|
||||
"batchQueuedPartial": "Antrian ekspor berhasil sebanyak {{successful}} dari total {{total}} ekspor. Kamera yang gagal: {{failedCameras}}"
|
||||
"batchFailed": "Gagal memulai ekspor sebanyak {{total}}. Kamera yang gagal: {{failedCameras}}"
|
||||
},
|
||||
"case": {
|
||||
"newCaseOption": "Membuat Kasus Baru",
|
||||
@@ -91,9 +87,7 @@
|
||||
"selectGroup": "Pilih grup",
|
||||
"noMatchingCameras": "Tidak ada kamera yang sesuai dengan pencarian Anda",
|
||||
"selectedCount": "{{terpilih}} / {{total}} terpilih",
|
||||
"namePlaceholder": "Nama dasar opsional untuk ekspor ini",
|
||||
"searchOrSelectGroup": "Cari, atau pilih grup kamera...",
|
||||
"selectAll": "Pilih semua kamera"
|
||||
"namePlaceholder": "Nama dasar opsional untuk ekspor ini"
|
||||
},
|
||||
"multi": {
|
||||
"title_other": "Ekspor {{count}} Ulasan",
|
||||
|
||||
@@ -68,8 +68,8 @@
|
||||
"choir": "Koris",
|
||||
"yodeling": "Jodelēšana",
|
||||
"mantra": "Mantra",
|
||||
"rapping": "Repošana",
|
||||
"whistling": "Svilpošana",
|
||||
"rapping": "Repot",
|
||||
"whistling": "Svilpot",
|
||||
"sniff": "Ošņāt",
|
||||
"hands": "Rokas",
|
||||
"animal": "Dzīvnieks",
|
||||
@@ -122,17 +122,5 @@
|
||||
"fireworks": "Uguņošana",
|
||||
"glass": "Stikls",
|
||||
"white_noise": "Baltais troksnis",
|
||||
"radio": "Radio",
|
||||
"chant": "Piedziedājums",
|
||||
"synthetic_singing": "Sintētiskā dziedāšana",
|
||||
"groan": "Vaidēšana",
|
||||
"grunt": "Rukšķēšana",
|
||||
"breathing": "Elpošana",
|
||||
"wheeze": "Gārgšana",
|
||||
"snoring": "Krākšana",
|
||||
"gasp": "Elsošana",
|
||||
"pant": "Elšana",
|
||||
"snort": "Šņaukt",
|
||||
"cough": "Klepus",
|
||||
"throat_clearing": "Kakla tīrīšana"
|
||||
"radio": "Radio"
|
||||
}
|
||||
|
||||
@@ -64,8 +64,7 @@
|
||||
"error": {
|
||||
"failed": "Kunne ikke legge eksport i kø: {{error}}",
|
||||
"noVaildTimeSelected": "Ingen gyldig tidsperiode valgt",
|
||||
"endTimeMustAfterStartTime": "Sluttid må være etter starttid",
|
||||
"noValidTimeSelected": "Ingen gyldig tidsperiode valgt"
|
||||
"endTimeMustAfterStartTime": "Sluttid må være etter starttid"
|
||||
},
|
||||
"view": "Vis",
|
||||
"queued": "Eksport lagt i kø. Se fremdrift på eksportsiden.",
|
||||
|
||||
@@ -34,9 +34,6 @@
|
||||
"label": "Bevestig dit label voor Frigate Plus",
|
||||
"ask_a": "Is dit object een <code>{{label}}</code>?",
|
||||
"ask_full": "Is dit object een <code>{{untranslatedLabel}}</code> ({{translatedLabel}})?"
|
||||
},
|
||||
"toast": {
|
||||
"error": "Gefaald bij Frigate+ in te dienen. Controleer je netwerkverbinding en probeer opnieuw."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -107,14 +104,7 @@
|
||||
"namePlaceholder": "Optionele basisnaam voor deze exporten",
|
||||
"queueingButton": "Exporten in wachtrij plaatsen...",
|
||||
"exportButton_one": "Export 1 Camera",
|
||||
"exportButton_other": "{{count}} camera's exporteren",
|
||||
"searchOrSelectGroup": "Zoek of selecteer een cameragroep...",
|
||||
"selectAll": "Selecteer alle camera's",
|
||||
"clearSelection": "Wis selectie",
|
||||
"selectWithActivity": "Camera's met gevolgde objecten",
|
||||
"selectGroup": "Selecteer groep",
|
||||
"noMatchingCameras": "Geen camera's komen overeen met je zoekopdracht",
|
||||
"selectedCount": "{{selected}} / {{total}} geselecteerd"
|
||||
"exportButton_other": "{{count}} camera's exporteren"
|
||||
},
|
||||
"multi": {
|
||||
"title_one": "Review 1 exporteren",
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
"question": {
|
||||
"label": "Confirmar esse rótulo para Frigate Plus",
|
||||
"ask_a": "Este objeto é um <code>{{label}}</code>?",
|
||||
"ask_an": "Este objeto é um <code>{{label}}</code>?",
|
||||
"ask_full": "Este objeto é um <code>{{untranslatedLabel}}</code> ({{translatedLabel}})?"
|
||||
"ask_an": "Este objeto é um<code>{{label}}</code>?",
|
||||
"ask_full": "Este objeto é um<code>{{untranslatedLabel}}</code> ({{translatedLabel}})?"
|
||||
},
|
||||
"state": {
|
||||
"submitted": "Enviado"
|
||||
@@ -71,10 +71,7 @@
|
||||
"batchQueueFailed": "Falha ao enfileirar {{total}} exportações. Câmeras com falha: {{failedCameras}}",
|
||||
"batchPartial": "Iniciadas {{successful}} de {{total}} exportações. Câmeras com falha: {{failedCameras}}",
|
||||
"batchFailed": "Falha ao iniciar {{total}} exportações. Câmeras com falha: {{failedCameras}}",
|
||||
"queued": "Exportação na fila. Acompanhe o progresso na página de exportações.",
|
||||
"batchSuccess_one": "1 exportação iniciada. Abrindo o caso agora.",
|
||||
"batchSuccess_many": "{{count}} exportações iniciadas. Abrindo o caso agora.",
|
||||
"batchSuccess_other": "{{count}} exportações iniciadas. Abrindo o caso agora."
|
||||
"queued": "Exportação na fila. Acompanhe o progresso na página de exportações."
|
||||
},
|
||||
"fromTimeline": {
|
||||
"saveExport": "Salvar Exportação",
|
||||
@@ -135,10 +132,7 @@
|
||||
"started_many": "Iniciadas {{count}} exportações. Abrindo o caso agora.",
|
||||
"started_other": "",
|
||||
"failed": "Falha ao iniciar {{total}} exportações. Falhas: {{failedItems}}",
|
||||
"partial": "Iniciadas {{successful}} de {{total}} exportações. Falhas: {{failedItems}}",
|
||||
"startedNoCase_one": "1 exportação iniciada.",
|
||||
"startedNoCase_many": "{{count}} exportações iniciadas.",
|
||||
"startedNoCase_other": "{{count}} exportações iniciadas."
|
||||
"partial": "Iniciadas {{successful}} de {{total}} exportações. Falhas: {{failedItems}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -215,8 +215,7 @@
|
||||
"label": "Birdseye",
|
||||
"description": "Configurações para a visualização composta \"Birdseye\", que combina múltiplas transmissões de câmera em um único layout.",
|
||||
"enabled": {
|
||||
"label": "Ativar Birdseye",
|
||||
"description": "Habilita ou desabilita a função Birdseye."
|
||||
"label": "Ativar Birdseye"
|
||||
}
|
||||
},
|
||||
"live": {
|
||||
@@ -402,9 +401,7 @@
|
||||
"enhancement": {
|
||||
"label": "Nível de aprimoramento",
|
||||
"description": "Nível de aprimoramento (0-10) a ser aplicado aos recortes da placa antes do OCR; valores mais altos nem sempre melhoram os resultados, e níveis acima de 5 podem funcionar apenas com placas noturnas, devendo ser utilizados com cautela."
|
||||
},
|
||||
"label": "Reconhecimento de placa veicular",
|
||||
"description": "Configurações de reconhecimento de placa veicular, incluindo limites de detecção, formatação e placas conhecidas."
|
||||
}
|
||||
},
|
||||
"record": {
|
||||
"label": "Gravação",
|
||||
@@ -542,18 +539,6 @@
|
||||
"enabled": {
|
||||
"label": "Ativar detecções",
|
||||
"description": "Ative ou desative eventos de detecção para esta câmera."
|
||||
},
|
||||
"labels": {
|
||||
"label": "Rótulos de detecção",
|
||||
"description": "Lista de rótulos de objetos que são considerados eventos de detecção."
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "Zonas requeridas",
|
||||
"description": "Zonas em que um objeto deve entrar para ser considerado detectado. Deixe em branco para permitir qualquer zona."
|
||||
},
|
||||
"cutoff_time": {
|
||||
"label": "Tempo limite de detecção",
|
||||
"description": "Segundos a esperar após o fim da atividade antes de encerrar a detecção."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -239,8 +239,7 @@
|
||||
"label": "Birdseye",
|
||||
"description": "Configurações para a visualização composta \"Birdseye\", que combina múltiplas transmissões de câmera em um único layout.",
|
||||
"enabled": {
|
||||
"label": "Ativar Birdseye",
|
||||
"description": "Habilita ou desabilita a função Birdseye."
|
||||
"label": "Ativar Birdseye"
|
||||
}
|
||||
},
|
||||
"live": {
|
||||
@@ -421,9 +420,7 @@
|
||||
"enhancement": {
|
||||
"label": "Nível de aprimoramento",
|
||||
"description": "Nível de aprimoramento (0-10) a ser aplicado aos recortes da placa antes do OCR; valores mais altos nem sempre melhoram os resultados, e níveis acima de 5 podem funcionar apenas com placas noturnas, devendo ser utilizados com cautela."
|
||||
},
|
||||
"label": "Reconhecimento de placa veicular",
|
||||
"description": "Configurações de reconhecimento de placa veicular, incluindo limites de detecção, formatação e placas conhecidas."
|
||||
}
|
||||
},
|
||||
"record": {
|
||||
"label": "Gravação",
|
||||
@@ -556,18 +553,6 @@
|
||||
"description": "Configurações que definem para quais objetos rastreados são geradas detecções (sem gerar alerta) e como essas detecções são retidas.",
|
||||
"enabled": {
|
||||
"label": "Ativar detecções"
|
||||
},
|
||||
"labels": {
|
||||
"label": "Rótulos de detecção",
|
||||
"description": "Lista de rótulos de objetos que são considerados eventos de detecção."
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "Zonas requeridas",
|
||||
"description": "Zonas em que um objeto deve entrar para ser considerado detectado. Deixe em branco para permitir qualquer zona."
|
||||
},
|
||||
"cutoff_time": {
|
||||
"label": "Tempo limite de detecção",
|
||||
"description": "Segundos a esperar após o fim da atividade antes de encerrar a detecção."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,12 +12,12 @@
|
||||
},
|
||||
"toast": {
|
||||
"success": {
|
||||
"deletedCategory_one": "{{count}} classe removida",
|
||||
"deletedCategory_many": "{{count}} classes removidas",
|
||||
"deletedCategory_other": "{{count}} classes removidas",
|
||||
"deletedImage_one": "{{count}} imagem removida",
|
||||
"deletedImage_many": "{{count}} imagens removidas",
|
||||
"deletedImage_other": "{{count}} imagens removidas",
|
||||
"deletedCategory_one": "Classe Apagada",
|
||||
"deletedCategory_many": "Classes apagadas",
|
||||
"deletedCategory_other": "",
|
||||
"deletedImage_one": "Imagen Apagada",
|
||||
"deletedImage_many": "Imagens Apagadas",
|
||||
"deletedImage_other": "",
|
||||
"categorizedImage": "Imagem Classificada com Sucesso",
|
||||
"trainedModel": "Modelo treinado com sucesso.",
|
||||
"trainingModel": "Treinamento do modelo iniciado com sucesso.",
|
||||
|
||||
@@ -296,7 +296,7 @@
|
||||
}
|
||||
},
|
||||
"motionMaskLabel": "Máscara de Movimento {{number}}",
|
||||
"objectMaskLabel": "Máscara de Objeto {{number}}",
|
||||
"objectMaskLabel": "Máscara de Objeto {{number}} ({{label}})",
|
||||
"form": {
|
||||
"zoneName": {
|
||||
"error": {
|
||||
@@ -437,7 +437,7 @@
|
||||
"add": "Nova Máscara de Movimento",
|
||||
"edit": "Editar Máscara de Movimento",
|
||||
"context": {
|
||||
"title": "Máscaras de movimento são usadas para prevenir tipos de movimento não desejados de ativarem uma detecção (exemplo: galhos de árvores, timestamps de câmeras). Máscaras de movimento devem ser usadas <em>com moderação</em>. Excesso de mascaramento tornará o rastreamento de objetos mais difícil.",
|
||||
"title": "Máscaras de movimento são usadas para prevenir tipos de movimento não desejados de ativarem uma detecção (exemplo: galhos de árvores, timestamps de câmeras). Máscaras de movimento devem ser usadas <em> com moderação </em>. Excesso de mascaramento tornará o rastreamento de objetos mais difícil.",
|
||||
"documentation": "Leia a documentação"
|
||||
},
|
||||
"point_one": "{{count}} ponto",
|
||||
@@ -723,7 +723,7 @@
|
||||
"title": "Configuração de Captura de Imagem",
|
||||
"desc": "Envios ao Frigate+ requerem tanto a captura de imagem normais quanto a captura de imagem <code>clean_copy</code> estarem habilitadas na sua configuração.",
|
||||
"documentation": "Leia a documentação",
|
||||
"cleanCopyWarning": "Algumas câmeras estão com os snapshots desativados",
|
||||
"cleanCopyWarning": "Algumas câmeras possuem captura de imagem habilitada porém têm a cópia limpa desabilitada. Você precisa habilitar a <code>clean_copy</code> nas suas configurações de captura de imagem para poder submeter imagems dessa câmera ao Frigate+.",
|
||||
"table": {
|
||||
"camera": "Câmera",
|
||||
"snapshots": "Capturas de Imagem",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"machine_gun": "Mitraliera",
|
||||
"speech": "Vorbire",
|
||||
"babbling": "Murmur",
|
||||
"yell": "Strigăt",
|
||||
"yell": "Striga",
|
||||
"bellow": "Sub",
|
||||
"dog": "Câine",
|
||||
"horse": "Cal",
|
||||
|
||||
@@ -32,9 +32,6 @@
|
||||
"ask_a": "Este acest obiect un <code>{{label}}</code>?",
|
||||
"ask_an": "Este acest obiect un <code>{{label}}</code>?",
|
||||
"ask_full": "Este acest obiect un <code>{{untranslatedLabel}}</code> ({{translatedLabel}})?"
|
||||
},
|
||||
"toast": {
|
||||
"error": "Trimiterea către Frigate+ a eșuat. Te rog să verifici conexiunea la rețea și să încerci din nou."
|
||||
}
|
||||
},
|
||||
"submitToPlus": {
|
||||
@@ -99,8 +96,7 @@
|
||||
"error": {
|
||||
"failed": "Nu s-a putut adăuga exportul în coadă: {{error}}",
|
||||
"endTimeMustAfterStartTime": "Ora de sfârșit trebuie să fie după ora de început",
|
||||
"noVaildTimeSelected": "Nu a fost selectat un interval de timp valid",
|
||||
"noValidTimeSelected": "Niciun interval de timp valid selectat"
|
||||
"noVaildTimeSelected": "Nu a fost selectat un interval de timp valid"
|
||||
},
|
||||
"view": "Vizualizează",
|
||||
"queued": "Export pus la coadă. Vezi progresul pe pagina de exporturi.",
|
||||
@@ -149,14 +145,7 @@
|
||||
"queueingButton": "Se adaugă exporturile la coadă...",
|
||||
"exportButton_one": "Exportă 1 cameră",
|
||||
"exportButton_few": "Exportă {{count}} camere",
|
||||
"exportButton_other": "Exportă {{count}} de camere",
|
||||
"searchOrSelectGroup": "Caută sau selectează un grup de camere...",
|
||||
"selectAll": "Selectează toate camerele",
|
||||
"clearSelection": "Șterge selecția",
|
||||
"selectWithActivity": "Camere cu obiecte urmărite",
|
||||
"selectGroup": "Selectează grupul",
|
||||
"noMatchingCameras": "Nicio cameră nu corespunde căutării tale",
|
||||
"selectedCount": "{{selected}} / {{total}} selectate"
|
||||
"exportButton_other": "Exportă {{count}} de camere"
|
||||
},
|
||||
"multi": {
|
||||
"title_one": "Exportă o revizuire",
|
||||
|
||||
@@ -371,7 +371,7 @@
|
||||
"description": "Folosește snapshot-urile obiectelor în loc de miniaturi pentru GenAI."
|
||||
},
|
||||
"prompt": {
|
||||
"label": "Prompt de descriere",
|
||||
"label": "Prompt descriere",
|
||||
"description": "Șablonul de prompt implicit pentru descrierile GenAI."
|
||||
},
|
||||
"object_prompts": {
|
||||
@@ -493,9 +493,6 @@
|
||||
"max_concurrent": {
|
||||
"description": "Numărul maxim de sarcini de export de procesat în același timp.",
|
||||
"label": "Număr maxim de exporturi simultane"
|
||||
},
|
||||
"chapters": {
|
||||
"label": "Metadate de capitol de încorporat în înregistrările exportate"
|
||||
}
|
||||
},
|
||||
"preview": {
|
||||
@@ -771,7 +768,7 @@
|
||||
"description": "Adresa de email folosită pentru notificări push sau cerută de anumiți furnizori de notificări."
|
||||
},
|
||||
"cooldown": {
|
||||
"label": "Perioadă de repaus",
|
||||
"label": "Perioadă de răcire",
|
||||
"description": "Timpul de așteptare (secunde) între notificări pentru a evita spamarea destinatarilor."
|
||||
},
|
||||
"enabled_in_config": {
|
||||
|
||||
@@ -217,7 +217,7 @@
|
||||
},
|
||||
"ffmpeg": {
|
||||
"label": "FFmpeg",
|
||||
"description": "Setări FFmpeg: inclusiv calea către binar, argumente, accelerare hardware și ieșiri per rol.",
|
||||
"description": "Setări FFmpeg: cale binar, argumente, accelerare hardware și ieșiri per rol.",
|
||||
"path": {
|
||||
"label": "Cale FFmpeg",
|
||||
"description": "Calea către binarul FFmpeg sau un alias de versiune (\"7.0\" sau \"8.0\")."
|
||||
@@ -481,7 +481,7 @@
|
||||
"description": "Folosește snapshot-urile obiectelor în loc de miniaturi pentru GenAI."
|
||||
},
|
||||
"prompt": {
|
||||
"label": "Prompt de descriere",
|
||||
"label": "Prompt descriere",
|
||||
"description": "Șablonul de prompt implicit pentru descrierile GenAI."
|
||||
},
|
||||
"object_prompts": {
|
||||
@@ -637,9 +637,6 @@
|
||||
"max_concurrent": {
|
||||
"description": "Numărul maxim de sarcini de export de procesat în același timp.",
|
||||
"label": "Număr maxim de exporturi simultane"
|
||||
},
|
||||
"chapters": {
|
||||
"label": "Metadate de capitol de încorporat în înregistrările exportate"
|
||||
}
|
||||
},
|
||||
"preview": {
|
||||
@@ -955,7 +952,7 @@
|
||||
"description": "Adresa de email folosită pentru notificări push sau cerută de anumiți furnizori de notificări."
|
||||
},
|
||||
"cooldown": {
|
||||
"label": "Perioadă de repaus",
|
||||
"label": "Perioadă de răcire",
|
||||
"description": "Timpul de așteptare (secunde) între notificări pentru a evita spamarea destinatarilor."
|
||||
},
|
||||
"enabled_in_config": {
|
||||
|
||||
@@ -192,20 +192,7 @@
|
||||
"title": "Editează modelul de clasificare",
|
||||
"descriptionState": "Editează clasele pentru acest model de clasificare a stării. Modificările vor necesita reantrenarea modelului.",
|
||||
"descriptionObject": "Editează tipul de obiect și tipul de clasificare pentru acest model de clasificare a obiectelor.",
|
||||
"stateClassesInfo": "Model actualizat. Reantrenează modelul pentru ca modificările claselor să aibă efect.",
|
||||
"enabled": "Activat",
|
||||
"enabledDesc": "Rulează acest model. Când este dezactivat, se oprește și nu mai clasifică.",
|
||||
"saveAttempts": "Încercări de salvare",
|
||||
"saveAttemptsDesc": "Numărul de imagini cu încercări de clasificare de păstrat pentru interfața de clasificări recente.",
|
||||
"motion": "Rulează la mișcare",
|
||||
"motionDesc": "Rulează clasificarea atunci când este detectată mișcare în decupajul configurat.",
|
||||
"interval": "Interval",
|
||||
"intervalDesc": "Secunde între rulările periodice de clasificare. Lasă necompletat pentru a rula doar la mișcare.",
|
||||
"intervalPlaceholder": "Niciun interval",
|
||||
"errors": {
|
||||
"saveAttemptsInvalid": "Încercările de salvare trebuie să fie un număr întreg de 0 sau mai mare",
|
||||
"intervalInvalid": "Intervalul trebuie să fie un număr întreg mai mare decât 0"
|
||||
}
|
||||
"stateClassesInfo": "Notă: Modificarea claselor de stare necesită reantrenarea modelului cu clasele actualizate."
|
||||
},
|
||||
"tooltip": {
|
||||
"trainingInProgress": "Modelul este în curs de antrenare",
|
||||
@@ -215,6 +202,5 @@
|
||||
},
|
||||
"none": "Niciuna",
|
||||
"reclassifyImageAs": "Reclasifică imaginea ca:",
|
||||
"reclassifyImage": "Reclasifică imaginea",
|
||||
"disabled": "Dezactivat"
|
||||
"reclassifyImage": "Reclasifică imaginea"
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
},
|
||||
"editSubLabel": {
|
||||
"title": "Editează subeticheta",
|
||||
"desc": "Introdu o sub-etichetă nouă pentru acest/această {{label}}",
|
||||
"desc": "Introdu o sub-etichetă nouă pentru acest {{label}}",
|
||||
"descNoLabel": "Introduceți o nouă subetichetă pentru acest obiect urmărit"
|
||||
},
|
||||
"editLPR": {
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
"desc": "Arată întotdeauna numele camerelor într-un tag (chip) în dashboard-ul live multi-cameră."
|
||||
},
|
||||
"liveFallbackTimeout": {
|
||||
"label": "Timp de expirare pentru player-ul live",
|
||||
"label": "Timeout Rezecție Player Live",
|
||||
"desc": "Când stream-ul live de înaltă calitate nu este disponibil, comută pe modul de bandă redusă după acest număr de secunde. Implicit: 3."
|
||||
}
|
||||
},
|
||||
@@ -1337,7 +1337,7 @@
|
||||
"reviewHelp": "Arată această cameră în revizuiri, inclusiv filtrul de camere, revizuirea mișcărilor și vizualizarea istoricului."
|
||||
},
|
||||
"label": "Stare cameră",
|
||||
"description": "Setează starea de funcționare pentru fiecare cameră.<br /><br /><strong>Pornit</strong>: stream-urile sunt procesate normal.<br /><strong>Oprit</strong>: pune temporar pe pauză procesarea. Nu se menține după repornirile Frigate.<br /><strong>Dezactivat</strong>: oprește procesarea și salvează modificarea în configurația ta. Este necesară o repornire pentru a reactiva o cameră dezactivată.<br /><br /><em>Notă: Dezactivarea nu afectează restream-urile go2rtc.</em><br /><br />Trage⋮ pentru a reordona camerele active așa cum apar în interfață, inclusiv în panoul Live și în meniurile drop-down de selecție a camerei.",
|
||||
"description": "Setează starea de funcționare pentru fiecare cameră.<br /><br /><strong>Pornit</strong>: stream-urile sunt procesate normal.<br /><strong>Oprit</strong>: pune temporar pe pauză procesarea. Nu se menține după repornirile Frigate.<br /><strong>Dezactivat</strong>: oprește procesarea și salvează modificarea în configurația ta. Este necesară o repornire pentru a reactiva o cameră dezactivată.<br /><br /><em>Notă: Dezactivarea nu afectează restream-urile go2rtc.</em><br /><br />Trage de mâner pentru a reordona camerele active așa cum apar în interfață, inclusiv în panoul Live și în meniurile drop-down de selecție a camerei.",
|
||||
"disabledSubheading": "Dezactivat în configurație",
|
||||
"status": {
|
||||
"on": "Pornit",
|
||||
@@ -1643,14 +1643,7 @@
|
||||
"keyLabel": "Cheie",
|
||||
"valueLabel": "Valoare",
|
||||
"keyPlaceholder": "Cheie nouă",
|
||||
"remove": "Elimină",
|
||||
"providerNamePlaceholder": "de ex., openai",
|
||||
"providerNameLabel": "Nume furnizor",
|
||||
"variableNameLabel": "Nume variabilă",
|
||||
"variableNamePlaceholder": "de ex., MY_VARIABLE",
|
||||
"loggerNameLabel": "Nume logger",
|
||||
"loggerNamePlaceholder": "de ex., frigate.record",
|
||||
"keyPatternError": "Folosește doar litere, cifre, cratime și linii de subliniere (fără spații)"
|
||||
"remove": "Elimină"
|
||||
},
|
||||
"timezone": {
|
||||
"defaultOption": "Folosește fusul orar al browserului"
|
||||
@@ -2105,10 +2098,6 @@
|
||||
},
|
||||
"ffmpeg": {
|
||||
"hwaccelManualNotRecommended": "Argumentele manuale pentru accelerarea hardware nu sunt recomandate. Dacă nu există o cerință specifică, selectează presetarea care se potrivește cu hardware-ul tău."
|
||||
},
|
||||
"model": {
|
||||
"optimizedFor320": "Frigate este optimizat pentru un model de 320x320, care este cea mai bună alegere pentru majoritatea configurațiilor. Un model de 640x640 este mai lent și ajută doar în scenarii specifice.",
|
||||
"inputDimensionsNotDetectResolution": "Lățimea și înălțimea de intrare ale modelului reprezintă dimensiunile de intrare ale modelului de detectare a obiectelor, nu rezoluția de detecție a camerei tale. Acestea ar trebui să se potrivească cu dimensiunile modelului pe care îl folosești — de obicei o dimensiune pătrată, cum ar fi 320x320 sau 640x640."
|
||||
}
|
||||
},
|
||||
"birdseye": {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"time": {
|
||||
"untilForTime": "Do {{time}}",
|
||||
"untilForTime": "Do{{time}}",
|
||||
"untilForRestart": "Do reštartu Frigate.",
|
||||
"untilRestart": "Do reštartu",
|
||||
"ago": "pred {{timeAgo}}",
|
||||
"ago": "{{timeAgo}} pred časom",
|
||||
"justNow": "Práve teraz",
|
||||
"today": "Dnes",
|
||||
"yesterday": "Včera",
|
||||
@@ -23,32 +23,32 @@
|
||||
"am": "ráno",
|
||||
"yr": "{{time}}r",
|
||||
"pm": "popoludní",
|
||||
"year_one": "{{time}} rok",
|
||||
"year_few": "{{time}} roky",
|
||||
"year_other": "{{time}} rokov",
|
||||
"year_one": "{{time}}rok",
|
||||
"year_few": "{{time}}rokov",
|
||||
"year_other": "{{time}}rokov",
|
||||
"mo": "{{time}}mes",
|
||||
"month_one": "{{time}} mesiac",
|
||||
"month_one": "{{time}}mesiac",
|
||||
"month_few": "{{time}} mesiace",
|
||||
"month_other": "{{time}} mesiacov",
|
||||
"month_other": "{{time}} mesiaca",
|
||||
"d": "{{time}}d",
|
||||
"day_one": "{{time}} deň",
|
||||
"day_few": "{{time}} dni",
|
||||
"day_other": "{{time}} dní",
|
||||
"day_one": "{{time}}deň",
|
||||
"day_few": "{{time}}dni",
|
||||
"day_other": "{{time}}dni",
|
||||
"h": "{{time}}h",
|
||||
"hour_one": "{{time}} hodina",
|
||||
"hour_few": "{{time}} hodiny",
|
||||
"hour_other": "{{time}} hodín",
|
||||
"hour_one": "{{time}}hodina",
|
||||
"hour_few": "{{time}}hodiny",
|
||||
"hour_other": "{{time}}hodin",
|
||||
"m": "{{time}} min",
|
||||
"s": "{{time}}s",
|
||||
"minute_one": "{{time}} minúta",
|
||||
"minute_few": "{{time}} minúty",
|
||||
"minute_other": "{{time}} minút",
|
||||
"second_one": "{{time}} sekunda",
|
||||
"second_few": "{{time}} sekundy",
|
||||
"second_other": "{{time}} sekúnd",
|
||||
"minute_one": "{{time}}minuta",
|
||||
"minute_few": "{{time}}minuty",
|
||||
"minute_other": "{{time}}minut",
|
||||
"second_one": "{{time}}sekunda",
|
||||
"second_few": "{{time}}sekundy",
|
||||
"second_other": "{{time}}sekund",
|
||||
"formattedTimestamp": {
|
||||
"12hour": "d MMM, h:mm:ss aaa",
|
||||
"24hour": "d MMM, HH:mm:ss"
|
||||
"12hour": "Deň MMM, h:mm:ss aaa",
|
||||
"24hour": "Deň MMM, HH:mm:ss"
|
||||
},
|
||||
"formattedTimestamp2": {
|
||||
"12hour": "MM/dd h:mm:ssa",
|
||||
@@ -219,9 +219,9 @@
|
||||
"allCameras": "Všetky kamery",
|
||||
"cameras": {
|
||||
"title": "Kamery",
|
||||
"count_one": "{{count}} kamera",
|
||||
"count_few": "{{count}} kamery",
|
||||
"count_other": "{{count}} kamier"
|
||||
"count_one": "{{count}}kamera",
|
||||
"count_few": "{{count}}kamery",
|
||||
"count_other": "{{count}}kamier"
|
||||
}
|
||||
},
|
||||
"export": "Exportovať",
|
||||
|
||||
@@ -43,9 +43,9 @@
|
||||
"title": "Čas ukončenia",
|
||||
"label": "Vybrat čas ukončenia"
|
||||
},
|
||||
"lastHour_one": "Posledná hodina",
|
||||
"lastHour_few": "Posledné {{count}} hodiny",
|
||||
"lastHour_other": "Posledných {{count}} hodín"
|
||||
"lastHour_one": "Minulu hodinu",
|
||||
"lastHour_few": "Minule{{count}}hodiny",
|
||||
"lastHour_other": "Minulych{{count}}hodin"
|
||||
},
|
||||
"name": {
|
||||
"placeholder": "Pomenujte Export"
|
||||
|
||||
@@ -12,12 +12,12 @@
|
||||
},
|
||||
"toast": {
|
||||
"success": {
|
||||
"deletedCategory_one": "Vymazaná {{count}} trieda",
|
||||
"deletedCategory_few": "Vymazané {{count}} triedy",
|
||||
"deletedCategory_other": "Vymazaných {{count}} tried",
|
||||
"deletedImage_one": "Vymazaný {{count}} obrázok",
|
||||
"deletedImage_few": "Vymazané {{count}} obrázky",
|
||||
"deletedImage_other": "Vymazaných {{count}} obrázkov",
|
||||
"deletedCategory_one": "Vymazaná Trieda",
|
||||
"deletedCategory_few": "",
|
||||
"deletedCategory_other": "",
|
||||
"deletedImage_one": "Vymazané Obrázky",
|
||||
"deletedImage_few": "",
|
||||
"deletedImage_other": "",
|
||||
"categorizedImage": "Obrázok bol úspešne klasifikovaný",
|
||||
"trainedModel": "Úspešne vyškolený model.",
|
||||
"trainingModel": "Úspešne spustené trénovanie modelu.",
|
||||
@@ -81,7 +81,7 @@
|
||||
"buttonText": "Vytvorte objektový model"
|
||||
},
|
||||
"state": {
|
||||
"title": "Žiadne modely klasifikácie stavov",
|
||||
"title": "Žiadne modely klasifikácie štátov",
|
||||
"description": "Vytvorte si vlastný model na monitorovanie a klasifikáciu zmien stavu v špecifických oblastiach kamery.",
|
||||
"buttonText": "Vytvorte model stavu"
|
||||
}
|
||||
@@ -90,7 +90,7 @@
|
||||
"title": "Vytvorte novú klasifikáciu",
|
||||
"steps": {
|
||||
"nameAndDefine": "Názov a definícia",
|
||||
"stateArea": "Oblasť stavu",
|
||||
"stateArea": "Štátna oblasť",
|
||||
"chooseExamples": "Vyberte Príklady"
|
||||
},
|
||||
"step1": {
|
||||
@@ -98,7 +98,7 @@
|
||||
"name": "Meno",
|
||||
"namePlaceholder": "Zadajte názov modelu...",
|
||||
"type": "Typ",
|
||||
"typeState": "Stav",
|
||||
"typeState": "štátu",
|
||||
"typeObject": "Objekt",
|
||||
"objectLabel": "Označenie objektu",
|
||||
"objectLabelPlaceholder": "Vyberte typ objektu...",
|
||||
@@ -118,12 +118,12 @@
|
||||
"nameOnlyNumbers": "Názov modelu nemôže obsahovať iba čísla",
|
||||
"classRequired": "Vyžaduje sa aspoň 1 kurz",
|
||||
"classesUnique": "Názvy tried musia byť jedinečné",
|
||||
"stateRequiresTwoClasses": "Stavové modely vyžadujú aspoň 2 triedy",
|
||||
"stateRequiresTwoClasses": "Modely štátov vyžadujú aspoň 2 triedy",
|
||||
"objectLabelRequired": "Vyberte označenie objektu",
|
||||
"objectTypeRequired": "Vyberte typ klasifikácie",
|
||||
"noneNotAllowed": "Trieda 'none' nie je povolená"
|
||||
},
|
||||
"states": "Stavy"
|
||||
"states": "Štátov"
|
||||
},
|
||||
"step2": {
|
||||
"description": "Vyberte kamery a definujte oblasť, ktorú chcete pre každú kameru monitorovať. Model klasifikuje stav týchto oblastí.",
|
||||
@@ -134,7 +134,7 @@
|
||||
},
|
||||
"step3": {
|
||||
"selectImagesPrompt": "Vybrať všetky obrázky s: {{className}}",
|
||||
"selectImagesDescription": "Kliknite na obrázky a vyberte ich. Po dokončení tejto triedy kliknite na tlačidlo Pokračovať.",
|
||||
"selectImagesDescription": "Kliknite na obrázky a vyberte ich. Po dokončení tejto hodiny kliknite na tlačidlo Pokračovať.",
|
||||
"generating": {
|
||||
"title": "Generovanie vzorových obrázkov",
|
||||
"description": "Frigate načítava reprezentatívne obrázky z vašich nahrávok. Môže to chvíľu trvať..."
|
||||
@@ -155,9 +155,9 @@
|
||||
"classifyFailed": "Nepodarilo sa klasifikovať obrázky: {{error}}"
|
||||
},
|
||||
"generateSuccess": "Vzorové obrázky boli úspešne vygenerované",
|
||||
"allImagesRequired_one": "Klasifikujte všetky obrázky. Zostáva {{count}} obrázok.",
|
||||
"allImagesRequired_few": "Klasifikujte všetky obrázky. Zostávajú {{count}} obrázky.",
|
||||
"allImagesRequired_other": "Klasifikujte všetky obrázky. Zostáva {{count}} obrázkov.",
|
||||
"allImagesRequired_one": "Uveďte všetky obrázky. {{count}} obrázok zostáva.",
|
||||
"allImagesRequired_few": "Uveďte všetky obrázky. {{count}} obrázky zostávajú.",
|
||||
"allImagesRequired_other": "Uveďte všetky obrázky. {{count}} obrázkov zostávajú.",
|
||||
"modelCreated": "Model vytvorený úspešne. Použite aktuálne klasifikácie na pridanie obrázkov pre chýbajúce stavy a nasledne dajte trénovať model.",
|
||||
"missingStatesWarning": {
|
||||
"title": "Chýbajúce príklady stavov",
|
||||
@@ -174,7 +174,7 @@
|
||||
},
|
||||
"menu": {
|
||||
"objects": "Objekty",
|
||||
"states": "Stavy"
|
||||
"states": "Štátov"
|
||||
},
|
||||
"details": {
|
||||
"scoreInfo": "Skóre predstavuje priemernú istotu klasifikácie naprieč všetkými detekciami tohoto objektu.",
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
"detail": {
|
||||
"noDataFound": "Žiadne podrobné údaje na kontrolu",
|
||||
"aria": "Prepnúť zobrazenie detailov",
|
||||
"trackedObject_one": "{{count}} objekt",
|
||||
"trackedObject_other": "{{count}} objektov",
|
||||
"trackedObject_one": "objekt",
|
||||
"trackedObject_other": "objekty",
|
||||
"noObjectDetailData": "Nie sú k dispozícii žiadne podrobné údaje o objekte.",
|
||||
"label": "Detail",
|
||||
"settings": "Nastavenia podrobného zobrazenia",
|
||||
|
||||
@@ -18,12 +18,12 @@
|
||||
"title": "Nahrať obrázok tváre",
|
||||
"desc": "Nahrajte obrázok na skenovanie tvárí a zahrňte ho do {{pageToggle}}"
|
||||
},
|
||||
"collections": "Kolekcie",
|
||||
"collections": "Zbierky",
|
||||
"createFaceLibrary": {
|
||||
"title": "Vytvoriť Zbierku",
|
||||
"desc": "Vytvoriť novú zbierku",
|
||||
"new": "Vytvoriť novú tvár",
|
||||
"nextSteps": "Vybudovanie silného základu:<li>Použite kartu Nedávno rozpoznané tváre na výber a trénovanie obrázkov pre každú rozpoznanú osobu.</li><li>Pre dosiahnutie najlepších výsledkov sa zamerajte na priame obrázky; vyhnite sa trénovaniu obrázkov, ktoré zachytávajú tváre pod uhlom.</li></ul>"
|
||||
"nextSteps": "Vybudovanie silného základu:<li>Použite kartu Nedávne rozpoznania na výber a trénovanie obrázkov pre každú rozpoznanú osobu.</li><li>Pre dosiahnutie najlepších výsledkov sa zamerajte na priame obrázky; vyhnite sa trénovaniu obrázkov, ktoré zachytávajú tváre pod uhlom.</li></ul>"
|
||||
},
|
||||
"steps": {
|
||||
"faceName": "Zadajte Meno tváre",
|
||||
@@ -34,8 +34,8 @@
|
||||
}
|
||||
},
|
||||
"train": {
|
||||
"title": "Nedávno rozpoznané tváre",
|
||||
"aria": "Vyberte nedávno rozpoznané tváre",
|
||||
"title": "Nedávne uznania",
|
||||
"aria": "Vyberte posledné rozpoznania",
|
||||
"empty": "Neexistujú žiadne predchádzajúce pokusy o rozpoznávanie tváre"
|
||||
},
|
||||
"selectItem": "Vyberte {{item}}",
|
||||
@@ -85,10 +85,9 @@
|
||||
"deletedName_one": "{{count}} tvár bola úspešne odstránená.",
|
||||
"deletedName_few": "{{count}} tváre boli úspešne odstránené.",
|
||||
"deletedName_other": "{{count}} tvárí bolo úspešne odstránených.",
|
||||
"renamedFace": "Tvár bola úspešne premenovaná na {{name}}.",
|
||||
"trainedFace": "Tvár bola úspešne natrénovaná.",
|
||||
"updatedFaceScore": "Skóre tváre bolo úspešne aktualizované na {{name}} ({{score}}).",
|
||||
"reclassifiedFace": "Tvár bola úspešne preklasifikovaná."
|
||||
"renamedFace": "Úspešne premenovaná tvár na {{name}}",
|
||||
"trainedFace": "Úspešne natrénovaná tvár.",
|
||||
"updatedFaceScore": "Úspešne aktualizované skóre tváre."
|
||||
},
|
||||
"error": {
|
||||
"uploadingImageFailed": "Nepodarilo sa nahrať obrázok: {{errorMessage}}",
|
||||
@@ -96,9 +95,8 @@
|
||||
"deleteFaceFailed": "Nepodarilo sa odstrániť: {{errorMessage}}",
|
||||
"deleteNameFailed": "Nepodarilo sa odstrániť meno: {{errorMessage}}",
|
||||
"renameFaceFailed": "Nepodarilo sa premenovať tvár: {{errorMessage}}",
|
||||
"trainFailed": "Nepodarilo sa natrénovať tvár: {{errorMessage}}",
|
||||
"updateFaceScoreFailed": "Nepodarilo sa aktualizovať skóre tváre: {{errorMessage}}",
|
||||
"reclassifyFailed": "Nepodarilo sa preklasifikovať tvár: {{errorMessage}}"
|
||||
"trainFailed": "Nepodarilo sa trénovať: {{errorMessage}}",
|
||||
"updateFaceScoreFailed": "Nepodarilo sa aktualizovať skóre tváre: {{errorMessage}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -339,9 +339,9 @@
|
||||
},
|
||||
"add": "Pridať zónu",
|
||||
"edit": "Upraviť zónu",
|
||||
"point_one": "{{count}} bod",
|
||||
"point_few": "{{count}} body",
|
||||
"point_other": "{{count}} bodov"
|
||||
"point_one": "{{count}}bod",
|
||||
"point_few": "{{count}}body",
|
||||
"point_other": "{{count}}bodov"
|
||||
},
|
||||
"motionMasks": {
|
||||
"label": "Maska Detekcia pohybu",
|
||||
@@ -380,8 +380,8 @@
|
||||
"add": "Pridať Masku Objektu",
|
||||
"edit": "Upraviť Masku Objektu",
|
||||
"context": "Masky filtrovania objektov slúžia na odfiltrovanie falošných poplachov konkrétneho typu objektu na základe jeho umiestnenia.",
|
||||
"point_one": "{{count}} bod",
|
||||
"point_few": "{{count}} body",
|
||||
"point_one": "{{count}}bod",
|
||||
"point_few": "{{count}}body",
|
||||
"point_other": "{{count}} bodov",
|
||||
"clickDrawPolygon": "Kliknutím nakreslite polygón do obrázku.",
|
||||
"objects": {
|
||||
@@ -397,7 +397,7 @@
|
||||
}
|
||||
},
|
||||
"motionMaskLabel": "Maska Detekcia pohybu {{number}}",
|
||||
"objectMaskLabel": "Maska objektu {{number}}"
|
||||
"objectMaskLabel": "Maska Objektu {{number}} {{label}}"
|
||||
},
|
||||
"motionDetectionTuner": {
|
||||
"title": "Ladenie detekcie pohybu",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"cameras": "Štatistiky kamier - Frigate",
|
||||
"storage": "Štatistiky úložiska - Frigate",
|
||||
"general": "Všeobecné štatistiky - Frigate",
|
||||
"enrichments": "Štatistiky AI funkcií - Frigate",
|
||||
"enrichments": "Štatistiky obohatenia - Frigate",
|
||||
"logs": {
|
||||
"frigate": "Protokoly Frigate - Frigate",
|
||||
"go2rtc": "Protokoly Go2RTC - Frigate",
|
||||
@@ -36,7 +36,7 @@
|
||||
}
|
||||
},
|
||||
"general": {
|
||||
"title": "Všeobecné",
|
||||
"title": "Hlavný",
|
||||
"detector": {
|
||||
"title": "Detektory",
|
||||
"inferenceSpeed": "Detekčná rýchlosť",
|
||||
@@ -96,7 +96,7 @@
|
||||
}
|
||||
},
|
||||
"storage": {
|
||||
"title": "Úložisko",
|
||||
"title": "Skladovanie",
|
||||
"overview": "Prehľad",
|
||||
"recordings": {
|
||||
"title": "Nahrávky",
|
||||
@@ -108,11 +108,11 @@
|
||||
"warning": "Aktuálna veľkosť SHM {{total}}MB je príliš malá. Zvýšte ju aspoň na {{min_shm}}MB."
|
||||
},
|
||||
"cameraStorage": {
|
||||
"title": "Úložisko kamier",
|
||||
"title": "Úložisko kamery",
|
||||
"camera": "Kamera",
|
||||
"unusedStorageInformation": "Informácie o nevyužitom úložisku",
|
||||
"storageUsed": "Úložisko",
|
||||
"percentageOfTotalUsed": "Percento z celku",
|
||||
"unusedStorageInformation": "Nepoužité informácie o úložisku",
|
||||
"storageUsed": "Skladovanie",
|
||||
"percentageOfTotalUsed": "Percento z celkového počtu",
|
||||
"bandwidth": "Šírka pásma",
|
||||
"unused": {
|
||||
"title": "Nepoužité",
|
||||
@@ -125,7 +125,7 @@
|
||||
"overview": "Prehľad",
|
||||
"info": {
|
||||
"aspectRatio": "pomer strán",
|
||||
"cameraProbeInfo": "Údaje o kamere {{camera}}",
|
||||
"cameraProbeInfo": "{{camera}} Informácie o sonde kamery",
|
||||
"streamDataFromFFPROBE": "Údaje zo streamu sa získavajú pomocou príkazu <code>ffprobe</code>.",
|
||||
"fetching": "Načítavajú sa údaje z kamery",
|
||||
"stream": "Stream {{idx}}",
|
||||
@@ -137,33 +137,32 @@
|
||||
"audio": "Zvuk:",
|
||||
"error": "Chyba: {{error}}",
|
||||
"tips": {
|
||||
"title": "Údaje o kamere"
|
||||
"title": "Informácie o kamerovej sonde"
|
||||
}
|
||||
},
|
||||
"framesAndDetections": "Snímky / Detekcie",
|
||||
"framesAndDetections": "Rámy / Detekcie",
|
||||
"label": {
|
||||
"camera": "kamera",
|
||||
"detect": "detekcie",
|
||||
"detect": "odhaliť",
|
||||
"skipped": "preskočené",
|
||||
"ffmpeg": "FFmpeg",
|
||||
"capture": "zachytávanie",
|
||||
"capture": "zachytiť",
|
||||
"cameraFfmpeg": "{{camName}} FFmpeg",
|
||||
"cameraCapture": "{{camName}} zachytávanie",
|
||||
"cameraDetect": "{{camName}} detekcie",
|
||||
"cameraCapture": "zachytiť{{camName}}",
|
||||
"cameraDetect": "Detekcia {{camName}}",
|
||||
"overallFramesPerSecond": "celkový počet snímok za sekundu",
|
||||
"overallDetectionsPerSecond": "celkový počet detekcií za sekundu",
|
||||
"overallSkippedDetectionsPerSecond": "celkový počet preskočených detekcií za sekundu",
|
||||
"overallSkippedDetectionsPerSecond": "celkový počet vynechaných detekcií za sekundu",
|
||||
"cameraFramesPerSecond": "{{camName}} snímky za sekundu",
|
||||
"cameraDetectionsPerSecond": "{{camName}} detekcie za sekundu",
|
||||
"cameraSkippedDetectionsPerSecond": "{{camName}} preskočené detekcie za sekundu",
|
||||
"cameraGpu": "{{camName}} GPU"
|
||||
"cameraDetectionsPerSecond": "{{camName}}detekcie za sekundu",
|
||||
"cameraSkippedDetectionsPerSecond": "{{camName}} vynechaných detekcií za sekundu"
|
||||
},
|
||||
"toast": {
|
||||
"success": {
|
||||
"copyToClipboard": "Údaje o kamere boli skopírované do schránky."
|
||||
"copyToClipboard": "Dáta sondy boli skopírované do schránky."
|
||||
},
|
||||
"error": {
|
||||
"unableToProbeCamera": "Nepodarilo sa načítať údaje z kamery: {{errorMessage}}"
|
||||
"unableToProbeCamera": "Nepodarilo sa overiť kameru: {{errorMessage}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -179,7 +178,7 @@
|
||||
"shmTooLow": "Alokácia /dev/shm ({{total}} MB) by sa mala zvýšiť aspoň na {{min}} MB."
|
||||
},
|
||||
"enrichments": {
|
||||
"title": "AI funkcie",
|
||||
"title": "Obohatenia",
|
||||
"infPerSecond": "Inferencie za sekundu",
|
||||
"embeddings": {
|
||||
"image_embedding": "Vkladanie obrázkov",
|
||||
|
||||
@@ -75,9 +75,5 @@
|
||||
"24hour": "MM-dd-yy-HH-mm-ss"
|
||||
}
|
||||
},
|
||||
"readTheDocumentation": "Прочитајте документацију",
|
||||
"menu": {
|
||||
"system": "Систем",
|
||||
"profiles": "Профили"
|
||||
}
|
||||
"readTheDocumentation": "Прочитајте документацију"
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -24,9 +24,6 @@
|
||||
},
|
||||
"state": {
|
||||
"submitted": "Inskickad"
|
||||
},
|
||||
"toast": {
|
||||
"error": "Misslyckades att skicka till Frigate+. Kontrollera din nätverksanslutning och försök igen."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -109,10 +106,7 @@
|
||||
"selectAll": "Välj alla kameror",
|
||||
"selectWithActivity": "Kameror med spårade objekt",
|
||||
"selectGroup": "Välj grupp",
|
||||
"noMatchingCameras": "Ingen kamera matchar din sökning",
|
||||
"searchOrSelectGroup": "Sök, eller välj en kameragrupp...",
|
||||
"clearSelection": "Rensa val",
|
||||
"selectedCount": "{{selected}} / {{total}} valda"
|
||||
"noMatchingCameras": "Ingen kamera matchar din sökning"
|
||||
},
|
||||
"multi": {
|
||||
"title_one": "Exportera 1 recension",
|
||||
|
||||
@@ -20,35 +20,10 @@
|
||||
"description": "Aktivera eller avaktivera ljudbaserad detektering för denna kamera."
|
||||
},
|
||||
"max_not_heard": {
|
||||
"description": "Antal sekunder utan den konfigurerade ljudtypen innan en ljudbaserad händelse slutar.",
|
||||
"label": "Avbryt paus"
|
||||
"description": "Antal sekunder utan den konfigurerade ljudtypen innan en ljudbaserad händelse slutar."
|
||||
},
|
||||
"min_volume": {
|
||||
"label": "Minsta ljudvolym",
|
||||
"description": "Lägsta RMS volym för ljuddetektion; lägre värde ökar känslighet (t.e.x. 200 högt, 500 medium, 1000 lågt)."
|
||||
},
|
||||
"listen": {
|
||||
"label": "Lyssningstyper",
|
||||
"description": "Lista på typer av ljudevent att detektera (till exempel: skälla, brandlarm, tal, skrik)."
|
||||
},
|
||||
"filters": {
|
||||
"label": "Ljudfilter",
|
||||
"description": "Filterinställningar per ljudtyp, till exempel konfidinströskel som används för att minska falska positiva resultat.",
|
||||
"threshold": {
|
||||
"label": "Lägsta ljud-konfidinströskel",
|
||||
"description": "Lägsta konfidinströskel för att ljudhändelsen ska räknas."
|
||||
}
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "Ursprungligt ljudtillstånd",
|
||||
"description": "Indikerar om ljuddetektion ursprungligen var aktiverat i den statiska konfigurationsfilen."
|
||||
},
|
||||
"num_threads": {
|
||||
"label": "Detekteringstrådar",
|
||||
"description": "Antal trådar att använda för bearbetning av ljuddetektering."
|
||||
"label": "Minsta ljudvolym"
|
||||
}
|
||||
},
|
||||
"audio_transcription": {
|
||||
"label": "Ljudtranskribering"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,35 +8,10 @@
|
||||
"label": "Aktivera ljuddetektering"
|
||||
},
|
||||
"max_not_heard": {
|
||||
"description": "Antal sekunder utan den konfigurerade ljudtypen innan en ljudbaserad händelse slutar.",
|
||||
"label": "Avbryt paus"
|
||||
"description": "Antal sekunder utan den konfigurerade ljudtypen innan en ljudbaserad händelse slutar."
|
||||
},
|
||||
"min_volume": {
|
||||
"label": "Minsta ljudvolym",
|
||||
"description": "Lägsta RMS volym för ljuddetektion; lägre värde ökar känslighet (t.e.x. 200 högt, 500 medium, 1000 lågt)."
|
||||
},
|
||||
"listen": {
|
||||
"label": "Lyssningstyper",
|
||||
"description": "Lista på typer av ljudevent att detektera (till exempel: skälla, brandlarm, tal, skrik)."
|
||||
},
|
||||
"filters": {
|
||||
"label": "Ljudfilter",
|
||||
"description": "Filterinställningar per ljudtyp, till exempel konfidinströskel som används för att minska falska positiva resultat.",
|
||||
"threshold": {
|
||||
"label": "Lägsta ljud-konfidinströskel",
|
||||
"description": "Lägsta konfidinströskel för att ljudhändelsen ska räknas."
|
||||
}
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "Ursprungligt ljudtillstånd",
|
||||
"description": "Indikerar om ljuddetektion ursprungligen var aktiverat i den statiska konfigurationsfilen."
|
||||
},
|
||||
"num_threads": {
|
||||
"label": "Detekteringstrådar",
|
||||
"description": "Antal trådar att använda för bearbetning av ljuddetektering."
|
||||
"label": "Minsta ljudvolym"
|
||||
}
|
||||
},
|
||||
"audio_transcription": {
|
||||
"label": "Ljudtranskribering"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,9 +30,6 @@
|
||||
"label": "Bu etiketi Frigate+ için onaylayın",
|
||||
"ask_a": "Bu nesne bir <code>{{label}}</code> mi?",
|
||||
"ask_full": "Bu nesne bir <code>{{untranslatedLabel}}</code> ({{translatedLabel}}) nesnesi mi?"
|
||||
},
|
||||
"toast": {
|
||||
"error": "Frigate+'a gönderilemedi. Lütfen ağ bağlantınızı kontrol edin ve tekrar deneyin."
|
||||
}
|
||||
},
|
||||
"submitToPlus": {
|
||||
@@ -65,7 +62,7 @@
|
||||
"toast": {
|
||||
"success": "Dışa aktarma başarıyla başlatıldı. Dosyayı dışa aktarmalar sayfasında görüntüleyebilirsiniz.",
|
||||
"error": {
|
||||
"failed": "Dışa aktarım sıraya alınamadı: {{error}}",
|
||||
"failed": "Dışa aktarım başlatılamadı: {{error}}",
|
||||
"endTimeMustAfterStartTime": "Bitiş zamanı başlangıç zamanından sonra olmalıdır",
|
||||
"noVaildTimeSelected": "Geçerli bir zaman aralığı seçilmedi"
|
||||
},
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
"label": "主题",
|
||||
"blue": "蓝色",
|
||||
"green": "绿色",
|
||||
"nord": "极地蓝",
|
||||
"nord": "Nord",
|
||||
"red": "红色",
|
||||
"contrast": "高对比度",
|
||||
"default": "默认",
|
||||
|
||||
@@ -67,8 +67,7 @@
|
||||
"error": {
|
||||
"failed": "未能加入导出队列:{{error}}",
|
||||
"endTimeMustAfterStartTime": "结束时间必须在开始时间之后",
|
||||
"noVaildTimeSelected": "未选择有效的时间范围",
|
||||
"noValidTimeSelected": "未选择有效的时间范围"
|
||||
"noVaildTimeSelected": "未选择有效的时间范围"
|
||||
},
|
||||
"view": "查看",
|
||||
"queued": "导出已加入队列。请在导出页面查看进度。",
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
"label": "日志级别筛选",
|
||||
"filterBySeverity": "按严重程度筛选日志",
|
||||
"loading": {
|
||||
"title": "实时加载",
|
||||
"title": "加载中",
|
||||
"desc": "当日志面板滚动到底部时,新的日志会自动流式加载。"
|
||||
},
|
||||
"disableLogStreaming": "禁用日志流式加载",
|
||||
|
||||
@@ -314,12 +314,12 @@
|
||||
"description": "画面变动轮廓被计入所需的最小轮廓区域(像素)。"
|
||||
},
|
||||
"delta_alpha": {
|
||||
"label": "变化量权重",
|
||||
"description": "该值用于调节帧间差异计算时的混合比例,影响运动检测的灵敏度。"
|
||||
"label": "Delta alpha",
|
||||
"description": "用于画面变动计算的帧差异中使用的 alpha 混合因子。"
|
||||
},
|
||||
"frame_alpha": {
|
||||
"label": "背景更新速度",
|
||||
"description": "该值在运动检测前对画面进行预处理,控制帧混合程度,影响后续检测的输入质量。"
|
||||
"label": "画面 alpha 通道",
|
||||
"description": "画面变动预处理时混合画面所使用的 alpha 值。"
|
||||
},
|
||||
"frame_height": {
|
||||
"label": "画面高度",
|
||||
@@ -452,15 +452,15 @@
|
||||
},
|
||||
"continuous": {
|
||||
"label": "持续保留",
|
||||
"description": "无论是否有追踪目标或画面变动,保留录像的天数。如果只想保留警报和检测的录制,请设置为 0。",
|
||||
"description": "无论是否有追踪目标或动作,保留录像的天数。如果只想保留警报和检测的录像,请设置为 0。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留录像的天数。"
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "画面变动录制保留",
|
||||
"description": "无论是否有追踪目标,只要画面变动触发保存的录制保留天数。如果只想保留警报和检测的录制,请设置为 0。",
|
||||
"label": "动作保留",
|
||||
"description": "无论是否有追踪目标,由动作触发的录像保留天数。如果只想保留警报和检测的录像,请设置为 0。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留录像的天数。"
|
||||
@@ -486,7 +486,7 @@
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:全部(保存所有片段)、画面变动(保存有画面变动的片段)或 活动目标(保存有活动目标的片段)。"
|
||||
"description": "保留模式:all(保存所有片段)、motion(保存有动作的片段)或 active_objects(保存有活动目标的片段)。"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -510,7 +510,7 @@
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:全部(保存所有片段)、画面变动(保存有画面变动的片段)或 活动目标(保存有活动目标的片段)。"
|
||||
"description": "保留模式:all(保存所有片段)、motion(保存有动作的片段)或 active_objects(保存有活动目标的片段)。"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1507,10 +1507,10 @@
|
||||
},
|
||||
"motion": {
|
||||
"label": "画面变动检测",
|
||||
"description": "默认情况下,画面变动检测配置统一应用于各摄像头,除非对特定摄像头单独进行自定义。",
|
||||
"description": "应用于摄像头的默认动作检测设置,除非按摄像头覆盖。",
|
||||
"enabled": {
|
||||
"label": "开启画面变动检测",
|
||||
"description": "为所有摄像头启用或禁用画面变动检测。可以给指定摄像头单独覆盖此设置。"
|
||||
"description": "为所有摄像头启用或禁用动作检测;可按摄像头覆盖。"
|
||||
},
|
||||
"threshold": {
|
||||
"label": "画面变动阈值",
|
||||
@@ -1533,12 +1533,12 @@
|
||||
"description": "画面变动轮廓被计入所需的最小轮廓区域(像素)。"
|
||||
},
|
||||
"delta_alpha": {
|
||||
"label": "变化量权重",
|
||||
"description": "该值用于调节帧间差异计算时的混合比例,影响运动检测的灵敏度。"
|
||||
"label": "Delta alpha",
|
||||
"description": "用于画面变动计算的帧差异中使用的 alpha 混合因子。"
|
||||
},
|
||||
"frame_alpha": {
|
||||
"label": "背景更新速度",
|
||||
"description": "该值在运动检测前对画面进行预处理,控制帧混合程度,影响后续检测的输入质量。"
|
||||
"label": "画面 alpha 通道",
|
||||
"description": "画面变动预处理时混合画面所使用的 alpha 值。"
|
||||
},
|
||||
"frame_height": {
|
||||
"label": "画面高度",
|
||||
@@ -1706,15 +1706,15 @@
|
||||
},
|
||||
"continuous": {
|
||||
"label": "持续保留",
|
||||
"description": "无论是否有追踪目标或画面变动,保留录像的天数。如果只想保留警报和检测的录制,请设置为 0。",
|
||||
"description": "无论是否有追踪目标或动作,保留录像的天数。如果只想保留警报和检测的录像,请设置为 0。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留录像的天数。"
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "画面变动录制保留",
|
||||
"description": "无论是否有追踪目标,只要画面变动触发保存的录制保留天数。如果只想保留警报和检测的录制,请设置为 0。",
|
||||
"label": "动作保留",
|
||||
"description": "无论是否有追踪目标,由动作触发的录像保留天数。如果只想保留警报和检测的录像,请设置为 0。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留录像的天数。"
|
||||
@@ -1740,7 +1740,7 @@
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:全部(保存所有片段)、画面变动(保存有画面变动的片段)或 活动目标(保存有活动目标的片段)。"
|
||||
"description": "保留模式:all(保存所有片段)、motion(保存有动作的片段)或 active_objects(保存有活动目标的片段)。"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1764,7 +1764,7 @@
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:全部(保存所有片段)、画面变动(保存有画面变动的片段)或 活动目标(保存有活动目标的片段)。"
|
||||
"description": "保留模式:all(保存所有片段)、motion(保存有动作的片段)或 active_objects(保存有活动目标的片段)。"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2030,8 +2030,8 @@
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "画面变动时运行",
|
||||
"description": "启用后,当在指定裁剪区域内检测到画面变动时进行分类。"
|
||||
"label": "动作时运行",
|
||||
"description": "启用后,当在指定裁剪区域内检测到动作时运行分类。"
|
||||
},
|
||||
"interval": {
|
||||
"label": "分类间隔",
|
||||
|
||||
@@ -178,20 +178,7 @@
|
||||
"title": "编辑分类模型",
|
||||
"descriptionState": "编辑此状态分类模型的类别;更改后需要重新训练模型。",
|
||||
"descriptionObject": "编辑此目标分类模型的目标类型和分类类型。",
|
||||
"stateClassesInfo": "模型已更新。请重新训练模型以使类别更改生效。",
|
||||
"enabled": "开启",
|
||||
"enabledDesc": "运行此模型。禁用后,它将停止运行且不再进行分类。",
|
||||
"saveAttempts": "保存尝试",
|
||||
"saveAttemptsDesc": "保存在近期分类记录界面中显示的分类快照数量。",
|
||||
"motion": "画面变动时运行",
|
||||
"motionDesc": "检测到配置的裁剪区域内发生移动时,运行分类。",
|
||||
"interval": "间隔",
|
||||
"intervalDesc": "定期分类运行之间的间隔秒数。留空则仅在检测到移动时运行。",
|
||||
"intervalPlaceholder": "无间隔",
|
||||
"errors": {
|
||||
"saveAttemptsInvalid": "保存在近期分类记录数量必须是大于或等于 0 的整数",
|
||||
"intervalInvalid": "间隔必须是大于 0 的整数"
|
||||
}
|
||||
"stateClassesInfo": "注意:更改状态类别后需使用更新后的类别重新训练模型。"
|
||||
},
|
||||
"tooltip": {
|
||||
"trainingInProgress": "模型正在训练中",
|
||||
@@ -201,6 +188,5 @@
|
||||
},
|
||||
"none": "无标签",
|
||||
"reclassifyImageAs": "重新分类图片为:",
|
||||
"reclassifyImage": "重新分类图片",
|
||||
"disabled": "关闭"
|
||||
"reclassifyImage": "重新分类图片"
|
||||
}
|
||||
|
||||
@@ -1655,14 +1655,7 @@
|
||||
"keyLabel": "键",
|
||||
"valueLabel": "值",
|
||||
"keyPlaceholder": "新键名",
|
||||
"remove": "移除",
|
||||
"providerNameLabel": "提供商名称",
|
||||
"providerNamePlaceholder": "例如:openai、deepseek",
|
||||
"variableNameLabel": "变量名",
|
||||
"variableNamePlaceholder": "例如:MY_VARIABLE",
|
||||
"loggerNameLabel": "日志模块名称",
|
||||
"loggerNamePlaceholder": "例如:frigate.record",
|
||||
"keyPatternError": "只能使用字母、数字、连字符和下划线(不包含空格)"
|
||||
"remove": "移除"
|
||||
},
|
||||
"roleMap": {
|
||||
"empty": "未配置权限组映射",
|
||||
@@ -2181,7 +2174,7 @@
|
||||
},
|
||||
"review": {
|
||||
"imageSource": {
|
||||
"recordings": "录制",
|
||||
"recordings": "录制文件",
|
||||
"previews": "预览"
|
||||
}
|
||||
},
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user