Compare commits

..

No commits in common. "dev" and "v0.17.0-beta2" have entirely different histories.

245 changed files with 917 additions and 7953 deletions

View File

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

View File

@ -47,7 +47,7 @@ onnxruntime == 1.22.*
# Embeddings
transformers == 4.45.*
# Generative AI
google-genai == 1.58.*
google-generativeai == 0.8.*
ollama == 0.6.*
openai == 1.65.*
# push notifications

View File

@ -54,8 +54,8 @@ function setup_homekit_config() {
local config_path="$1"
if [[ ! -f "${config_path}" ]]; then
echo "[INFO] Creating empty config file for HomeKit..."
echo '{}' > "${config_path}"
echo "[INFO] Creating empty HomeKit config file..."
echo 'homekit: {}' > "${config_path}"
fi
# Convert YAML to JSON for jq processing
@ -69,15 +69,15 @@ function setup_homekit_config() {
local cleaned_json="/tmp/cache/homekit_cleaned.json"
jq '
# Keep only the homekit section if it exists, otherwise empty object
if has("homekit") then {homekit: .homekit} else {} end
if has("homekit") then {homekit: .homekit} else {homekit: {}} end
' "${temp_json}" > "${cleaned_json}" 2>/dev/null || {
echo '{}' > "${cleaned_json}"
echo '{"homekit": {}}' > "${cleaned_json}"
}
# Convert back to YAML and write to the config file
yq eval -P "${cleaned_json}" > "${config_path}" 2>/dev/null || {
echo "[WARNING] Failed to convert cleaned config to YAML, creating minimal config"
echo '{}' > "${config_path}"
echo 'homekit: {}' > "${config_path}"
}
# Clean up temp files

View File

@ -23,28 +23,8 @@ sys.path.remove("/opt/frigate")
yaml = YAML()
# Check if arbitrary exec sources are allowed (defaults to False for security)
allow_arbitrary_exec = None
if "GO2RTC_ALLOW_ARBITRARY_EXEC" in os.environ:
allow_arbitrary_exec = os.environ.get("GO2RTC_ALLOW_ARBITRARY_EXEC")
elif (
os.path.isdir("/run/secrets")
and os.access("/run/secrets", os.R_OK)
and "GO2RTC_ALLOW_ARBITRARY_EXEC" in os.listdir("/run/secrets")
):
allow_arbitrary_exec = (
Path(os.path.join("/run/secrets", "GO2RTC_ALLOW_ARBITRARY_EXEC"))
.read_text()
.strip()
)
# check for the add-on options file
elif os.path.isfile("/data/options.json"):
with open("/data/options.json") as f:
raw_options = f.read()
options = json.loads(raw_options)
allow_arbitrary_exec = options.get("go2rtc_allow_arbitrary_exec")
ALLOW_ARBITRARY_EXEC = allow_arbitrary_exec is not None and str(
allow_arbitrary_exec
ALLOW_ARBITRARY_EXEC = os.environ.get(
"GO2RTC_ALLOW_ARBITRARY_EXEC", "false"
).lower() in ("true", "1", "yes")
FRIGATE_ENV_VARS = {k: v for k, v in os.environ.items() if k.startswith("FRIGATE_")}

View File

@ -79,12 +79,6 @@ cameras:
If the ONVIF connection is successful, PTZ controls will be available in the camera's WebUI.
:::note
Some cameras use a separate ONVIF/service account that is distinct from the device administrator credentials. If ONVIF authentication fails with the admin account, try creating or using an ONVIF/service user in the camera's firmware. Refer to your camera manufacturer's documentation for more.
:::
:::tip
If your ONVIF camera does not require authentication credentials, you may still need to specify an empty string for `user` and `password`, eg: `user: ""` and `password: ""`.
@ -101,7 +95,7 @@ The FeatureList on the [ONVIF Conformant Products Database](https://www.onvif.or
| Brand or specific camera | PTZ Controls | Autotracking | Notes |
| ---------------------------- | :----------: | :----------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Amcrest | ✅ | ✅ | ⛔️ Generally, Amcrest should work, but some older models (like the common IP2M-841) don't support autotracking |
| Amcrest | ✅ | ✅ | ⛔️ Generally, Amcrest should work, but some older models (like the common IP2M-841) don't support autotracking |
| Amcrest ASH21 | ✅ | ❌ | ONVIF service port: 80 |
| Amcrest IP4M-S2112EW-AI | ✅ | ❌ | FOV relative movement not supported. |
| Amcrest IP5M-1190EW | ✅ | ❌ | ONVIF Port: 80. FOV relative movement not supported. |

View File

@ -0,0 +1,249 @@
---
id: genai
title: Generative AI
---
Generative AI can be used to automatically generate descriptive text based on the thumbnails of your tracked objects. This helps with [Semantic Search](/configuration/semantic_search) in Frigate to provide more context about your tracked objects. Descriptions are accessed via the _Explore_ view in the Frigate UI by clicking on a tracked object's thumbnail.
Requests for a description are sent off automatically to your AI provider at the end of the tracked object's lifecycle, or can optionally be sent earlier after a number of significantly changed frames, for example in use in more real-time notifications. Descriptions can also be regenerated manually via the Frigate UI. Note that if you are manually entering a description for tracked objects prior to its end, this will be overwritten by the generated response.
## Configuration
Generative AI can be enabled for all cameras or only for specific cameras. If GenAI is disabled for a camera, you can still manually generate descriptions for events using the HTTP API. There are currently 3 native providers available to integrate with Frigate. Other providers that support the OpenAI standard API can also be used. See the OpenAI 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_`.
```yaml
genai:
provider: gemini
api_key: "{FRIGATE_GEMINI_API_KEY}"
model: gemini-2.0-flash
cameras:
front_camera:
genai:
enabled: True # <- enable GenAI for your front camera
use_snapshot: True
objects:
- person
required_zones:
- steps
indoor_camera:
objects:
genai:
enabled: False # <- disable GenAI for your indoor camera
```
By default, descriptions will be generated for all tracked objects and all zones. But you can also optionally specify `objects` and `required_zones` to only generate descriptions for certain tracked objects or zones.
Optionally, you can generate the description using a snapshot (if enabled) by setting `use_snapshot` to `True`. By default, this is set to `False`, which sends the uncompressed images from the `detect` stream collected over the object's lifetime to the model. Once the object lifecycle ends, only a single compressed and cropped thumbnail is saved with the tracked object. Using a snapshot might be useful when you want to _regenerate_ a tracked object's description as it will provide the AI with a higher-quality image (typically downscaled by the AI itself) than the cropped/compressed thumbnail. Using a snapshot otherwise has a trade-off in that only a single image is sent to your provider, which will limit the model's ability to determine object movement or direction.
Generative AI can also be toggled dynamically for a camera via MQTT with the topic `frigate/<camera_name>/object_descriptions/set`. See the [MQTT documentation](/integrations/mqtt/#frigatecamera_nameobjectdescriptionsset).
## Ollama
:::warning
Using Ollama on CPU is not recommended, high inference times make using Generative AI impractical.
:::
[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.
Most of the 7b parameter 4-bit vision models will fit inside 8GB of VRAM. There is also a [Docker container](https://hub.docker.com/r/ollama/ollama) available.
Parallel requests also come with some caveats. You will need to set `OLLAMA_NUM_PARALLEL=1` and choose a `OLLAMA_MAX_QUEUE` and `OLLAMA_MAX_LOADED_MODELS` values that are appropriate for your hardware and preferences. See the [Ollama documentation](https://docs.ollama.com/faq#how-does-ollama-handle-concurrent-requests).
### Model Types: Instruct vs Thinking
Most vision-language models are available as **instruct** models, which are fine-tuned to follow instructions and respond concisely to prompts. However, some models (such as certain Qwen-VL or minigpt variants) offer both **instruct** and **thinking** versions.
- **Instruct models** are always recommended for use with Frigate. These models generate direct, relevant, actionable descriptions that best fit Frigate's object and event summary use case.
- **Thinking models** are fine-tuned for more free-form, open-ended, and speculative outputs, which are typically not concise and may not provide the practical summaries Frigate expects. For this reason, Frigate does **not** recommend or support using thinking models.
Some models are labeled as **hybrid** (capable of both thinking and instruct tasks). In these cases, Frigate will always use instruct-style prompts and specifically disables thinking-mode behaviors to ensure concise, useful responses.
**Recommendation:**
Always select the `-instruct` or documented instruct/tagged variant of any model you use in your Frigate configuration. If in doubt, refer to your model providers documentation or model library for guidance on the correct model variant to use.
### Supported Models
You must use a vision capable model with Frigate. Current model variants can be found [in their model library](https://ollama.com/search?c=vision). Note that Frigate will not automatically download the model you specify in your config, you must download the model to your local instance of Ollama first i.e. by running `ollama pull qwen3-vl:2b-instruct` on your Ollama server/Docker container. Note that the model specified in Frigate's config must match the downloaded model tag.
:::note
You should have at least 8 GB of RAM available (or VRAM if running on GPU) to run the 7B models, 16 GB to run the 13B models, and 32 GB to run the 33B models.
:::
#### Ollama Cloud models
Ollama also supports [cloud models](https://ollama.com/cloud), where your local Ollama instance handles requests from Frigate, but model inference is performed in the cloud. Set up Ollama locally, sign in with your Ollama account, and specify the cloud model name in your Frigate config. For more details, see the Ollama cloud model [docs](https://docs.ollama.com/cloud).
### Configuration
```yaml
genai:
provider: ollama
base_url: http://localhost:11434
model: qwen3-vl:4b
```
## Google Gemini
Google Gemini has a free tier allowing [15 queries per minute](https://ai.google.dev/pricing) to the API, which is more than sufficient for standard Frigate usage.
### Supported Models
You must use a vision capable model with Frigate. Current model variants can be found [in their documentation](https://ai.google.dev/gemini-api/docs/models/gemini).
### Get API Key
To start using Gemini, you must first get an API key from [Google AI Studio](https://aistudio.google.com).
1. Accept the Terms of Service
2. Click "Get API Key" from the right hand navigation
3. Click "Create API key in new project"
4. Copy the API key for use in your config
### Configuration
```yaml
genai:
provider: gemini
api_key: "{FRIGATE_GEMINI_API_KEY}"
model: gemini-2.0-flash
```
:::note
To use a different Gemini-compatible API endpoint, set the `GEMINI_BASE_URL` environment variable to your provider's API URL.
:::
## OpenAI
OpenAI does not have a free tier for their API. With the release of gpt-4o, pricing has been reduced and each generation should cost fractions of a cent if you choose to go this route.
### Supported Models
You must use a vision capable model with Frigate. Current model variants can be found [in their documentation](https://platform.openai.com/docs/models).
### Get API Key
To start using OpenAI, you must first [create an API key](https://platform.openai.com/api-keys) and [configure billing](https://platform.openai.com/settings/organization/billing/overview).
### Configuration
```yaml
genai:
provider: openai
api_key: "{FRIGATE_OPENAI_API_KEY}"
model: gpt-4o
```
:::note
To use a different OpenAI-compatible API endpoint, set the `OPENAI_BASE_URL` environment variable to your provider's API URL.
:::
## Azure OpenAI
Microsoft offers several vision models through Azure OpenAI. A subscription is required.
### Supported Models
You must use a vision capable model with Frigate. Current model variants can be found [in their documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models).
### Create Resource and Get API Key
To start using Azure OpenAI, you must first [create a resource](https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal#create-a-resource). You'll need your API key, model name, and resource URL, which must include the `api-version` parameter (see the example below).
### Configuration
```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}"
```
## Usage and Best Practices
Frigate's thumbnail search excels at identifying specific details about tracked objects for example, using an "image caption" approach to find a "person wearing a yellow vest," "a white dog running across the lawn," or "a red car on a residential street." To enhance this further, Frigates default prompts are designed to ask your AI provider about the intent behind the object's actions, rather than just describing its appearance.
While generating simple descriptions of detected objects is useful, understanding intent provides a deeper layer of insight. Instead of just recognizing "what" is in a scene, Frigates default prompts aim to infer "why" it might be there or "what" it could do next. Descriptions tell you whats happening, but intent gives context. For instance, a person walking toward a door might seem like a visitor, but if theyre moving quickly after hours, you can infer a potential break-in attempt. Detecting a person loitering near a door at night can trigger an alert sooner than simply noting "a person standing by the door," helping you respond based on the situations context.
### Using GenAI for notifications
Frigate provides an [MQTT topic](/integrations/mqtt), `frigate/tracked_object_update`, that is updated with a JSON payload containing `event_id` and `description` when your AI provider returns a description for a tracked object. This description could be used directly in notifications, such as sending alerts to your phone or making audio announcements. If additional details from the tracked object are needed, you can query the [HTTP API](/integrations/api/event-events-event-id-get) using the `event_id`, eg: `http://frigate_ip:5000/api/events/<event_id>`.
If looking to get notifications earlier than when an object ceases to be tracked, an additional send trigger can be configured of `after_significant_updates`.
```yaml
genai:
send_triggers:
tracked_object_end: true # default
after_significant_updates: 3 # how many updates to a tracked object before we should send an image
```
## Custom Prompts
Frigate sends multiple frames from the tracked object along with a prompt to your Generative AI provider asking it to generate a description. The default prompt is as follows:
```
Analyze the sequence of images containing the {label}. Focus on the likely intent or behavior of the {label} based on its actions and movement, rather than describing its appearance or the surroundings. Consider what the {label} is doing, why, and what it might do next.
```
:::tip
Prompts can use variable replacements `{label}`, `{sub_label}`, and `{camera}` to substitute information from the tracked object as part of the prompt.
:::
You are also able to define custom prompts in your configuration.
```yaml
genai:
provider: ollama
base_url: http://localhost:11434
model: qwen3-vl:8b-instruct
objects:
prompt: "Analyze the {label} in these images from the {camera} security camera. Focus on the actions, behavior, and potential intent of the {label}, rather than just describing its appearance."
object_prompts:
person: "Examine the main person in these images. What are they doing and what might their actions suggest about their intent (e.g., approaching a door, leaving an area, standing still)? Do not describe the surroundings or static details."
car: "Observe the primary vehicle in these images. Focus on its movement, direction, or purpose (e.g., parking, approaching, circling). If it's a delivery vehicle, mention the company."
```
Prompts can also be overridden at the camera level to provide a more detailed prompt to the model about your specific camera, if you desire.
```yaml
cameras:
front_door:
objects:
genai:
enabled: True
use_snapshot: True
prompt: "Analyze the {label} in these images from the {camera} security camera at the front door. Focus on the actions and potential intent of the {label}."
object_prompts:
person: "Examine the person in these images. What are they doing, and how might their actions suggest their purpose (e.g., delivering something, approaching, leaving)? If they are carrying or interacting with a package, include details about its source or destination."
cat: "Observe the cat in these images. Focus on its movement and intent (e.g., wandering, hunting, interacting with objects). If the cat is near the flower pots or engaging in any specific actions, mention it."
objects:
- person
- cat
required_zones:
- steps
```
### Experiment with prompts
Many providers also have a public facing chat interface for their models. Download a couple of different thumbnails or snapshots from Frigate and try new things in the playground to get descriptions to your liking before updating the prompt in Frigate.
- OpenAI - [ChatGPT](https://chatgpt.com)
- Gemini - [Google AI Studio](https://aistudio.google.com)
- Ollama - [Open WebUI](https://docs.openwebui.com/)

View File

@ -17,23 +17,11 @@ Using Ollama on CPU is not recommended, high inference times make using Generati
:::
[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.
[Ollama](https://ollama.com/) allows you to self-host large language models and keep everything running locally. It provides a nice API over [llama.cpp](https://github.com/ggerganov/llama.cpp). 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.
Most of the 7b parameter 4-bit vision models will fit inside 8GB of VRAM. There is also a [Docker container](https://hub.docker.com/r/ollama/ollama) available.
Parallel requests also come with some caveats. You will need to set `OLLAMA_NUM_PARALLEL=1` and choose a `OLLAMA_MAX_QUEUE` and `OLLAMA_MAX_LOADED_MODELS` values that are appropriate for your hardware and preferences. See the [Ollama documentation](https://docs.ollama.com/faq#how-does-ollama-handle-concurrent-requests).
### Model Types: Instruct vs Thinking
Most vision-language models are available as **instruct** models, which are fine-tuned to follow instructions and respond concisely to prompts. However, some models (such as certain Qwen-VL or minigpt variants) offer both **instruct** and **thinking** versions.
- **Instruct models** are always recommended for use with Frigate. These models generate direct, relevant, actionable descriptions that best fit Frigate's object and event summary use case.
- **Thinking models** are fine-tuned for more free-form, open-ended, and speculative outputs, which are typically not concise and may not provide the practical summaries Frigate expects. For this reason, Frigate does **not** recommend or support using thinking models.
Some models are labeled as **hybrid** (capable of both thinking and instruct tasks). In these cases, Frigate will always use instruct-style prompts and specifically disables thinking-mode behaviors to ensure concise, useful responses.
**Recommendation:**
Always select the `-instruct` or documented instruct/tagged variant of any model you use in your Frigate configuration. If in doubt, refer to your model providers documentation or model library for guidance on the correct model variant to use.
Parallel requests also come with some caveats. You will need to set `OLLAMA_NUM_PARALLEL=1` and choose a `OLLAMA_MAX_QUEUE` and `OLLAMA_MAX_LOADED_MODELS` values that are appropriate for your hardware and preferences. See the [Ollama documentation](https://github.com/ollama/ollama/blob/main/docs/faq.md#how-does-ollama-handle-concurrent-requests).
### Supported Models
@ -53,12 +41,12 @@ If you are trying to use a single model for Frigate and HomeAssistant, it will n
The following models are recommended:
| Model | Notes |
| ------------- | -------------------------------------------------------------------- |
| `qwen3-vl` | Strong visual and situational understanding, higher vram requirement |
| `Intern3.5VL` | Relatively fast with good vision comprehension |
| `gemma3` | Strong frame-to-frame understanding, slower inference times |
| `qwen2.5-vl` | Fast but capable model with good vision comprehension |
| Model | Notes |
| ----------------- | -------------------------------------------------------------------- |
| `qwen3-vl` | Strong visual and situational understanding, higher vram requirement |
| `Intern3.5VL` | Relatively fast with good vision comprehension |
| `gemma3` | Strong frame-to-frame understanding, slower inference times |
| `qwen2.5-vl` | Fast but capable model with good vision comprehension |
:::note
@ -66,26 +54,26 @@ You should have at least 8 GB of RAM available (or VRAM if running on GPU) to ru
:::
#### Ollama Cloud models
Ollama also supports [cloud models](https://ollama.com/cloud), where your local Ollama instance handles requests from Frigate, but model inference is performed in the cloud. Set up Ollama locally, sign in with your Ollama account, and specify the cloud model name in your Frigate config. For more details, see the Ollama cloud model [docs](https://docs.ollama.com/cloud).
### Configuration
```yaml
genai:
provider: ollama
base_url: http://localhost:11434
model: qwen3-vl:4b
model: minicpm-v:8b
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
```
## Google Gemini
Google Gemini has a [free tier](https://ai.google.dev/pricing) for the API, however the limits may not be sufficient for standard Frigate usage. Choose a plan appropriate for your installation.
Google Gemini has a free tier allowing [15 queries per minute](https://ai.google.dev/pricing) to the API, which is more than sufficient for standard Frigate usage.
### Supported Models
You must use a vision capable model with Frigate. Current model variants can be found [in their documentation](https://ai.google.dev/gemini-api/docs/models/gemini).
You must use a vision capable model with Frigate. Current model variants can be found [in their documentation](https://ai.google.dev/gemini-api/docs/models/gemini). At the time of writing, this includes `gemini-1.5-pro` and `gemini-1.5-flash`.
### Get API Key
@ -102,32 +90,16 @@ To start using Gemini, you must first get an API key from [Google AI Studio](htt
genai:
provider: gemini
api_key: "{FRIGATE_GEMINI_API_KEY}"
model: gemini-2.5-flash
model: gemini-1.5-flash
```
:::note
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:
```
genai:
provider: gemini
...
provider_options:
base_url: https://...
```
Other HTTP options are available, see the [python-genai documentation](https://github.com/googleapis/python-genai).
:::
## OpenAI
OpenAI does not have a free tier for their API. With the release of gpt-4o, pricing has been reduced and each generation should cost fractions of a cent if you choose to go this route.
### Supported Models
You must use a vision capable model with Frigate. Current model variants can be found [in their documentation](https://platform.openai.com/docs/models).
You must use a vision capable model with Frigate. Current model variants can be found [in their documentation](https://platform.openai.com/docs/models). At the time of writing, this includes `gpt-4o` and `gpt-4-turbo`.
### Get API Key
@ -148,41 +120,23 @@ To use a different OpenAI-compatible API endpoint, set the `OPENAI_BASE_URL` env
:::
:::tip
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
genai:
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.
:::
## Azure OpenAI
Microsoft offers several vision models through Azure OpenAI. A subscription is required.
### Supported Models
You must use a vision capable model with Frigate. Current model variants can be found [in their documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models).
You must use a vision capable model with Frigate. Current model variants can be found [in their documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models). At the time of writing, this includes `gpt-4o` and `gpt-4-turbo`.
### Create Resource and Get API Key
To start using Azure OpenAI, you must first [create a resource](https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal#create-a-resource). You'll need your API key, model name, and resource URL, which must include the `api-version` parameter (see the example below).
To start using Azure OpenAI, you must first [create a resource](https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal#create-a-resource). You'll need your API key and resource URL, which must include the `api-version` parameter (see the example below). The model field is not required in your configuration as the model is part of the deployment name you chose when deploying the resource.
### Configuration
```yaml
genai:
provider: azure_openai
base_url: https://instance.cognitiveservices.azure.com/openai/responses?api-version=2025-04-01-preview
model: gpt-5-mini
base_url: https://example-endpoint.openai.azure.com/openai/deployments/gpt-4o/chat/completions?api-version=2023-03-15-preview
api_key: "{FRIGATE_OPENAI_API_KEY}"
```

View File

@ -125,10 +125,10 @@ review:
## Review Reports
Along with individual review item summaries, Generative AI can also produce a single report of review items from all cameras marked "suspicious" over a specified time period (for example, a daily summary of suspicious activity while you're on vacation).
Along with individual review item summaries, Generative AI provides the ability to request a report of a given time period. For example, you can get a daily report while on a vacation of any suspicious activity or other concerns that may require review.
### Requesting Reports Programmatically
Review reports can be requested via the [API](/integrations/api/generate-review-summary-review-summarize-start-start-ts-end-end-ts-post) by sending a POST request to `/api/review/summarize/start/{start_ts}/end/{end_ts}` with Unix timestamps.
Review reports can be requested via the [API](/integrations/api#review-summarization) by sending a POST request to `/api/review/summarize/start/{start_ts}/end/{end_ts}` with Unix timestamps.
For Home Assistant users, there is a built-in service (`frigate.review_summarize`) that makes it easy to request review reports as part of automations or scripts. This allows you to automatically generate daily summaries, vacation reports, or custom time period reports based on your specific needs.

View File

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

View File

@ -696,9 +696,6 @@ genai:
# Optional additional args to pass to the GenAI Provider (default: None)
provider_options:
keep_alive: -1
# Optional: Options to pass during inference calls (default: {})
runtime_options:
temperature: 0.7
# Optional: Configuration for audio transcription
# NOTE: only the enabled option can be overridden at the camera level

View File

@ -11,12 +11,6 @@ Cameras configured to output H.264 video and AAC audio will offer the most compa
- **Stream Viewing**: This stream will be rebroadcast as is to Home Assistant for viewing with the stream component. Setting this resolution too high will use significant bandwidth when viewing streams in Home Assistant, and they may not load reliably over slower connections.
:::tip
For the best experience in Frigate's UI, configure your camera so that the detection and recording streams use the same aspect ratio. For example, if your main stream is 3840x2160 (16:9), set your substream to 640x360 (also 16:9) instead of 640x480 (4:3). While not strictly required, matching aspect ratios helps ensure seamless live stream display and preview/recordings playback.
:::
### Choosing a detect resolution
The ideal resolution for detection is one where the objects you want to detect fit inside the dimensions of the model used by Frigate (320x320). Frigate does not pass the entire camera frame to object detection. It will crop an area of motion from the full frame and look in that portion of the frame. If the area being inspected is larger than 320x320, Frigate must resize it before running object detection. Higher resolutions do not improve the detection accuracy because the additional detail is lost in the resize. Below you can see a reference for how large a 320x320 area is against common resolutions.

View File

@ -42,7 +42,7 @@ If the EQ13 is out of stock, the link below may take you to a suggested alternat
| ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | --------------------------------------------------- |
| Beelink EQ13 (<a href="https://amzn.to/4jn2qVr" target="_blank" rel="nofollow noopener sponsored">Amazon</a>) | Can run object detection on several 1080p cameras with low-medium activity | Dual gigabit NICs for easy isolated camera network. |
| Intel 1120p ([Amazon](https://www.amazon.com/Beelink-i3-1220P-Computer-Display-Gigabit/dp/B0DDCKT9YP) | Can handle a large number of 1080p cameras with high activity | |
| Intel 125H ([Amazon](https://www.amazon.com/MINISFORUM-Pro-125H-Barebone-Computer-HDMI2-1/dp/B0FH21FSZM) | Can handle a significant number of 1080p cameras with high activity | Includes NPU for more efficient detection in 0.17+ |
| Intel 125H ([Amazon](https://www.amazon.com/MINISFORUM-Pro-125H-Barebone-Computer-HDMI2-1/dp/B0FH21FSZM) | Can handle a significant number of 1080p cameras with high activity | Includes NPU for more efficient detection in 0.17+ |
## Detectors
@ -55,10 +55,12 @@ Frigate supports multiple different detectors that work on different types of ha
**Most Hardware**
- [Hailo](#hailo-8): The Hailo8 and Hailo8L AI Acceleration module is available in m.2 format with a HAT for RPi devices offering a wide range of compatibility with devices.
- [Supports many model architectures](../../configuration/object_detectors#configuration)
- Runs best with tiny or small size models
- [Google Coral EdgeTPU](#google-coral-tpu): The Google Coral EdgeTPU is available in USB and m.2 format allowing for a wide range of compatibility with devices.
- [Supports primarily ssdlite and mobilenet model architectures](../../configuration/object_detectors#edge-tpu-detector)
- <CommunityBadge /> [MemryX](#memryx-mx3): The MX3 M.2 accelerator module is available in m.2 format allowing for a wide range of compatibility with devices.
@ -87,6 +89,7 @@ Frigate supports multiple different detectors that work on different types of ha
**Nvidia**
- [TensortRT](#tensorrt---nvidia-gpu): TensorRT can run on Nvidia GPUs to provide efficient object detection.
- [Supports majority of model architectures via ONNX](../../configuration/object_detectors#onnx-supported-models)
- Runs well with any size models including large
@ -149,7 +152,9 @@ The OpenVINO detector type is able to run on:
:::note
Intel B-series (Battlemage) GPUs are not officially supported with Frigate 0.17, though a user has [provided steps to rebuild the Frigate container](https://github.com/blakeblackshear/frigate/discussions/21257) with support for them.
Intel NPUs have seen [limited success in community deployments](https://github.com/blakeblackshear/frigate/discussions/13248#discussioncomment-12347357), although they remain officially unsupported.
In testing, the NPU delivered performance that was only comparable to — or in some cases worse than — the integrated GPU.
:::

View File

@ -37,7 +37,7 @@ cameras:
## Steps
1. Export or copy the clip you want to replay to the Frigate host (e.g., `/media/frigate/` or `debug/clips/`). Depending on what you are looking to debug, it is often helpful to add some "pre-capture" time (where the tracked object is not yet visible) to the clip when exporting.
1. Export or copy the clip you want to replay to the Frigate host (e.g., `/media/frigate/` or `debug/clips/`).
2. Add the temporary camera to `config/config.yml` (example above). Use a unique name such as `test` or `replay_camera` so it's easy to remove later.
- If you're debugging a specific camera, copy the settings from that camera (frame rate, model/enrichment settings, zones, etc.) into the temporary camera so the replay closely matches the original environment. Leave `record` and `snapshots` disabled unless you are specifically debugging recording or snapshot behavior.
3. Restart Frigate.

View File

@ -18490,9 +18490,9 @@
}
},
"node_modules/qs": {
"version": "6.14.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
"integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
"integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.1.0"

View File

@ -1,8 +0,0 @@
https://:project.pages.dev/*
X-Robots-Tag: noindex
https://:version.:project.pages.dev/*
X-Robots-Tag: noindex
https://docs-dev.frigate.video/*
X-Robots-Tag: noindex

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 MiB

After

Width:  |  Height:  |  Size: 28 MiB

View File

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

View File

@ -848,10 +848,9 @@ async def onvif_probe(
try:
if isinstance(uri, str) and uri.startswith("rtsp://"):
if username and password and "@" not in uri:
# Inject raw credentials and add only the
# authenticated version. The credentials will be encoded
# later by ffprobe_stream or the config system.
cred = f"{username}:{password}@"
# Inject URL-encoded credentials and add only the
# authenticated version.
cred = f"{quote_plus(username)}:{quote_plus(password)}@"
injected = uri.replace(
"rtsp://", f"rtsp://{cred}", 1
)
@ -904,8 +903,12 @@ async def onvif_probe(
"/cam/realmonitor?channel=1&subtype=0",
"/11",
]
# Use raw credentials for pattern fallback URIs when provided
auth_str = f"{username}:{password}@" if username and password else ""
# Use URL-encoded credentials for pattern fallback URIs when provided
auth_str = (
f"{quote_plus(username)}:{quote_plus(password)}@"
if username and password
else ""
)
rtsp_port = 554
for path in common_paths:
uri = f"rtsp://{auth_str}{host}:{rtsp_port}{path}"
@ -927,7 +930,7 @@ async def onvif_probe(
and uri.startswith("rtsp://")
and "@" not in uri
):
cred = f"{username}:{password}@"
cred = f"{quote_plus(username)}:{quote_plus(password)}@"
cred_uri = uri.replace("rtsp://", f"rtsp://{cred}", 1)
if cred_uri not in to_test:
to_test.append(cred_uri)

View File

@ -759,28 +759,15 @@ def delete_classification_dataset_images(
CLIPS_DIR, sanitize_filename(name), "dataset", sanitize_filename(category)
)
deleted_count = 0
for id in list_of_ids:
file_path = os.path.join(folder, sanitize_filename(id))
if os.path.isfile(file_path):
os.unlink(file_path)
deleted_count += 1
if os.path.exists(folder) and not os.listdir(folder) and category.lower() != "none":
os.rmdir(folder)
# Update training metadata to reflect deleted images
# This ensures the dataset is marked as changed after deletion
# (even if the total count happens to be the same after adding and deleting)
if deleted_count > 0:
sanitized_name = sanitize_filename(name)
metadata = read_training_metadata(sanitized_name)
if metadata:
last_count = metadata.get("last_training_image_count", 0)
updated_count = max(0, last_count - deleted_count)
write_training_metadata(sanitized_name, updated_count)
return JSONResponse(
content=({"success": True, "message": "Successfully deleted images."}),
status_code=200,

View File

@ -10,7 +10,7 @@ class ReviewQueryParams(BaseModel):
cameras: str = "all"
labels: str = "all"
zones: str = "all"
reviewed: Union[int, SkipJsonSchema[None]] = None
reviewed: int = 0
limit: Union[int, SkipJsonSchema[None]] = None
severity: Union[SeverityEnum, SkipJsonSchema[None]] = None
before: Union[float, SkipJsonSchema[None]] = None

View File

@ -144,8 +144,6 @@ async def review(
(UserReviewStatus.has_been_reviewed == False)
| (UserReviewStatus.has_been_reviewed.is_null())
)
elif reviewed == 1:
review_query = review_query.where(UserReviewStatus.has_been_reviewed == True)
# Apply ordering and limit
review_query = (

View File

@ -26,6 +26,3 @@ class GenAIConfig(FrigateBaseModel):
provider_options: dict[str, Any] = Field(
default={}, title="GenAI Provider extra options."
)
runtime_options: dict[str, Any] = Field(
default={}, title="Options to pass during inference calls."
)

View File

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

View File

@ -2,7 +2,6 @@
import logging
import os
import threading
import warnings
from transformers import AutoFeatureExtractor, AutoTokenizer
@ -55,7 +54,6 @@ class JinaV1TextEmbedding(BaseEmbedding):
self.tokenizer = None
self.feature_extractor = None
self.runner = None
self._lock = threading.Lock()
files_names = list(self.download_urls.keys()) + [self.tokenizer_file]
if not all(
@ -136,18 +134,17 @@ class JinaV1TextEmbedding(BaseEmbedding):
)
def _preprocess_inputs(self, raw_inputs):
with self._lock:
max_length = max(len(self.tokenizer.encode(text)) for text in raw_inputs)
return [
self.tokenizer(
text,
padding="max_length",
truncation=True,
max_length=max_length,
return_tensors="np",
)
for text in raw_inputs
]
max_length = max(len(self.tokenizer.encode(text)) for text in raw_inputs)
return [
self.tokenizer(
text,
padding="max_length",
truncation=True,
max_length=max_length,
return_tensors="np",
)
for text in raw_inputs
]
class JinaV1ImageEmbedding(BaseEmbedding):
@ -177,7 +174,6 @@ class JinaV1ImageEmbedding(BaseEmbedding):
self.download_path = os.path.join(MODEL_CACHE_DIR, self.model_name)
self.feature_extractor = None
self.runner: BaseModelRunner | None = None
self._lock = threading.Lock()
files_names = list(self.download_urls.keys())
if not all(
os.path.exists(os.path.join(self.download_path, n)) for n in files_names
@ -220,9 +216,8 @@ class JinaV1ImageEmbedding(BaseEmbedding):
)
def _preprocess_inputs(self, raw_inputs):
with self._lock:
processed_images = [self._process_image(img) for img in raw_inputs]
return [
self.feature_extractor(images=image, return_tensors="np")
for image in processed_images
]
processed_images = [self._process_image(img) for img in raw_inputs]
return [
self.feature_extractor(images=image, return_tensors="np")
for image in processed_images
]

View File

@ -64,7 +64,6 @@ class OpenAIClient(GenAIClient):
},
],
timeout=self.timeout,
**self.genai_config.runtime_options,
)
except Exception as e:
logger.warning("Azure OpenAI returned an error: %s", str(e))

View File

@ -3,8 +3,8 @@
import logging
from typing import Optional
from google import genai
from google.genai import errors, types
import google.generativeai as genai
from google.api_core.exceptions import GoogleAPICallError
from frigate.config import GenAIProviderEnum
from frigate.genai import GenAIClient, register_genai_provider
@ -16,58 +16,40 @@ logger = logging.getLogger(__name__)
class GeminiClient(GenAIClient):
"""Generative AI client for Frigate using Gemini."""
provider: genai.Client
provider: genai.GenerativeModel
def _init_provider(self):
"""Initialize the client."""
# Merge provider_options into HttpOptions
http_options_dict = {
"timeout": int(self.timeout * 1000), # requires milliseconds
"retry_options": types.HttpRetryOptions(
attempts=3,
initial_delay=1.0,
max_delay=60.0,
exp_base=2.0,
jitter=1.0,
http_status_codes=[429, 500, 502, 503, 504],
),
}
if isinstance(self.genai_config.provider_options, dict):
http_options_dict.update(self.genai_config.provider_options)
return genai.Client(
api_key=self.genai_config.api_key,
http_options=types.HttpOptions(**http_options_dict),
genai.configure(api_key=self.genai_config.api_key)
return genai.GenerativeModel(
self.genai_config.model, **self.genai_config.provider_options
)
def _send(self, prompt: str, images: list[bytes]) -> Optional[str]:
"""Submit a request to Gemini."""
contents = [
types.Part.from_bytes(data=img, mime_type="image/jpeg") for img in images
data = [
{
"mime_type": "image/jpeg",
"data": img,
}
for img in images
] + [prompt]
try:
# Merge runtime_options into generation_config if provided
generation_config_dict = {"candidate_count": 1}
generation_config_dict.update(self.genai_config.runtime_options)
response = self.provider.models.generate_content(
model=self.genai_config.model,
contents=contents,
config=types.GenerateContentConfig(
**generation_config_dict,
response = self.provider.generate_content(
data,
generation_config=genai.types.GenerationConfig(
candidate_count=1,
),
request_options=genai.types.RequestOptions(
timeout=self.timeout,
),
)
except errors.APIError as e:
except GoogleAPICallError as e:
logger.warning("Gemini returned an error: %s", str(e))
return None
except Exception as e:
logger.warning("An unexpected error occurred with Gemini: %s", str(e))
return None
try:
description = response.text.strip()
except (ValueError, AttributeError):
except ValueError:
# No description was generated
return None
return description

View File

@ -58,15 +58,11 @@ class OllamaClient(GenAIClient):
)
return None
try:
ollama_options = {
**self.provider_options,
**self.genai_config.runtime_options,
}
result = self.provider.generate(
self.genai_config.model,
prompt,
images=images if images else None,
**ollama_options,
**self.provider_options,
)
logger.debug(
f"Ollama tokens used: eval_count={result.get('eval_count')}, prompt_eval_count={result.get('prompt_eval_count')}"

View File

@ -22,14 +22,9 @@ class OpenAIClient(GenAIClient):
def _init_provider(self):
"""Initialize the client."""
# Extract context_size from provider_options as it's not a valid OpenAI client parameter
# It will be used in get_context_size() instead
provider_opts = {
k: v
for k, v in self.genai_config.provider_options.items()
if k != "context_size"
}
return OpenAI(api_key=self.genai_config.api_key, **provider_opts)
return OpenAI(
api_key=self.genai_config.api_key, **self.genai_config.provider_options
)
def _send(self, prompt: str, images: list[bytes]) -> Optional[str]:
"""Submit a request to OpenAI."""
@ -61,7 +56,6 @@ class OpenAIClient(GenAIClient):
},
],
timeout=self.timeout,
**self.genai_config.runtime_options,
)
if (
result is not None
@ -79,16 +73,6 @@ class OpenAIClient(GenAIClient):
if self.context_size is not None:
return self.context_size
# First check provider_options for manually specified context size
# This is necessary for llama.cpp and other OpenAI-compatible servers
# that don't expose the configured runtime context size in the API response
if "context_size" in self.genai_config.provider_options:
self.context_size = self.genai_config.provider_options["context_size"]
logger.debug(
f"Using context size {self.context_size} from provider_options for model {self.genai_config.model}"
)
return self.context_size
try:
models = self.provider.models.list()
for model in models.data:

View File

@ -89,7 +89,6 @@ def apply_log_levels(default: str, log_levels: dict[str, LogLevel]) -> None:
"ws4py": LogLevel.error,
"PIL": LogLevel.warning,
"numba": LogLevel.warning,
"google_genai.models": LogLevel.warning,
**log_levels,
}

View File

@ -97,7 +97,6 @@ class RecordingMaintainer(threading.Thread):
self.object_recordings_info: dict[str, list] = defaultdict(list)
self.audio_recordings_info: dict[str, list] = defaultdict(list)
self.end_time_cache: dict[str, Tuple[datetime.datetime, float]] = {}
self.unexpected_cache_files_logged: bool = False
async def move_files(self) -> None:
cache_files = [
@ -113,14 +112,7 @@ class RecordingMaintainer(threading.Thread):
for cache in cache_files:
cache_path = os.path.join(CACHE_DIR, cache)
basename = os.path.splitext(cache)[0]
try:
camera, date = basename.rsplit("@", maxsplit=1)
except ValueError:
if not self.unexpected_cache_files_logged:
logger.warning("Skipping unexpected files in cache")
self.unexpected_cache_files_logged = True
continue
camera, date = basename.rsplit("@", maxsplit=1)
start_time = datetime.datetime.strptime(
date, CACHE_SEGMENT_FORMAT
).astimezone(datetime.timezone.utc)
@ -172,13 +164,7 @@ class RecordingMaintainer(threading.Thread):
cache_path = os.path.join(CACHE_DIR, cache)
basename = os.path.splitext(cache)[0]
try:
camera, date = basename.rsplit("@", maxsplit=1)
except ValueError:
if not self.unexpected_cache_files_logged:
logger.warning("Skipping unexpected files in cache")
self.unexpected_cache_files_logged = True
continue
camera, date = basename.rsplit("@", maxsplit=1)
# important that start_time is utc because recordings are stored and compared in utc
start_time = datetime.datetime.strptime(

View File

@ -171,8 +171,8 @@ class BaseTestHttp(unittest.TestCase):
def insert_mock_event(
self,
id: str,
start_time: float | None = None,
end_time: float | None = None,
start_time: float = datetime.datetime.now().timestamp(),
end_time: float = datetime.datetime.now().timestamp() + 20,
has_clip: bool = True,
top_score: int = 100,
score: int = 0,
@ -180,11 +180,6 @@ class BaseTestHttp(unittest.TestCase):
camera: str = "front_door",
) -> Event:
"""Inserts a basic event model with a given id."""
if start_time is None:
start_time = datetime.datetime.now().timestamp()
if end_time is None:
end_time = start_time + 20
return Event.insert(
id=id,
label="Mock",
@ -234,16 +229,11 @@ class BaseTestHttp(unittest.TestCase):
def insert_mock_recording(
self,
id: str,
start_time: float | None = None,
end_time: float | None = None,
start_time: float = datetime.datetime.now().timestamp(),
end_time: float = datetime.datetime.now().timestamp() + 20,
motion: int = 0,
) -> Event:
"""Inserts a recording model with a given id."""
if start_time is None:
start_time = datetime.datetime.now().timestamp()
if end_time is None:
end_time = start_time + 20
return Recordings.insert(
id=id,
path=id,

View File

@ -96,17 +96,16 @@ class TestHttpApp(BaseTestHttp):
assert len(events) == 0
def test_get_event_list_limit(self):
now = datetime.now().timestamp()
id = "123456.random"
id2 = "54321.random"
with AuthTestClient(self.app) as client:
super().insert_mock_event(id, start_time=now + 1)
super().insert_mock_event(id)
events = client.get("/events").json()
assert len(events) == 1
assert events[0]["id"] == id
super().insert_mock_event(id2, start_time=now)
super().insert_mock_event(id2)
events = client.get("/events").json()
assert len(events) == 2
@ -145,7 +144,7 @@ class TestHttpApp(BaseTestHttp):
assert events[0]["id"] == id2
assert events[1]["id"] == id
events = client.get("/events", params={"sort": "score_desc"}).json()
events = client.get("/events", params={"sort": "score_des"}).json()
assert len(events) == 2
assert events[0]["id"] == id
assert events[1]["id"] == id2

View File

@ -196,50 +196,6 @@ class TestHttpReview(BaseTestHttp):
assert len(response_json) == 1
assert response_json[0]["id"] == id
def test_get_review_with_reviewed_filter_unreviewed(self):
"""Test that reviewed=0 returns only unreviewed items."""
now = datetime.now().timestamp()
with AuthTestClient(self.app) as client:
id_unreviewed = "123456.unreviewed"
id_reviewed = "123456.reviewed"
super().insert_mock_review_segment(id_unreviewed, now, now + 2)
super().insert_mock_review_segment(id_reviewed, now, now + 2)
self._insert_user_review_status(id_reviewed, reviewed=True)
params = {
"reviewed": 0,
"after": now - 1,
"before": now + 3,
}
response = client.get("/review", params=params)
assert response.status_code == 200
response_json = response.json()
assert len(response_json) == 1
assert response_json[0]["id"] == id_unreviewed
def test_get_review_with_reviewed_filter_reviewed(self):
"""Test that reviewed=1 returns only reviewed items."""
now = datetime.now().timestamp()
with AuthTestClient(self.app) as client:
id_unreviewed = "123456.unreviewed"
id_reviewed = "123456.reviewed"
super().insert_mock_review_segment(id_unreviewed, now, now + 2)
super().insert_mock_review_segment(id_reviewed, now, now + 2)
self._insert_user_review_status(id_reviewed, reviewed=True)
params = {
"reviewed": 1,
"after": now - 1,
"before": now + 3,
}
response = client.get("/review", params=params)
assert response.status_code == 200
response_json = response.json()
assert len(response_json) == 1
assert response_json[0]["id"] == id_reviewed
####################################################################################################################
################################### GET /review/summary Endpoint #################################################
####################################################################################################################

View File

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

View File

@ -1,66 +0,0 @@
import sys
import unittest
from unittest.mock import MagicMock, patch
# Mock complex imports before importing maintainer
sys.modules["frigate.comms.inter_process"] = MagicMock()
sys.modules["frigate.comms.detections_updater"] = MagicMock()
sys.modules["frigate.comms.recordings_updater"] = MagicMock()
sys.modules["frigate.config.camera.updater"] = MagicMock()
# Now import the class under test
from frigate.config import FrigateConfig # noqa: E402
from frigate.record.maintainer import RecordingMaintainer # noqa: E402
class TestMaintainer(unittest.IsolatedAsyncioTestCase):
async def test_move_files_survives_bad_filename(self):
config = MagicMock(spec=FrigateConfig)
config.cameras = {}
stop_event = MagicMock()
maintainer = RecordingMaintainer(config, stop_event)
# We need to mock end_time_cache to avoid key errors if logic proceeds
maintainer.end_time_cache = {}
# Mock filesystem
# One bad file, one good file
files = ["bad_filename.mp4", "camera@20210101000000+0000.mp4"]
with patch("os.listdir", return_value=files):
with patch("os.path.isfile", return_value=True):
with patch(
"frigate.record.maintainer.psutil.process_iter", return_value=[]
):
with patch("frigate.record.maintainer.logger.warning") as warn:
# Mock validate_and_move_segment to avoid further logic
maintainer.validate_and_move_segment = MagicMock()
try:
await maintainer.move_files()
except ValueError as e:
if "not enough values to unpack" in str(e):
self.fail("move_files() crashed on bad filename!")
raise e
except Exception:
# Ignore other errors (like DB connection) as we only care about the unpack crash
pass
# The bad filename is encountered in multiple loops, but should only warn once.
matching = [
c
for c in warn.call_args_list
if c.args
and isinstance(c.args[0], str)
and "Skipping unexpected files in cache" in c.args[0]
]
self.assertEqual(
1,
len(matching),
f"Expected a single warning for unexpected files, got {len(matching)}",
)
if __name__ == "__main__":
unittest.main()

View File

@ -43,7 +43,6 @@ def write_training_metadata(model_name: str, image_count: int) -> None:
model_name: Name of the classification model
image_count: Number of images used in training
"""
model_name = model_name.strip()
clips_model_dir = os.path.join(CLIPS_DIR, model_name)
os.makedirs(clips_model_dir, exist_ok=True)
@ -71,7 +70,6 @@ def read_training_metadata(model_name: str) -> dict[str, any] | None:
Returns:
Dictionary with last_training_date and last_training_image_count, or None if not found
"""
model_name = model_name.strip()
clips_model_dir = os.path.join(CLIPS_DIR, model_name)
metadata_path = os.path.join(clips_model_dir, TRAINING_METADATA_FILE)
@ -97,7 +95,6 @@ def get_dataset_image_count(model_name: str) -> int:
Returns:
Total count of images across all categories
"""
model_name = model_name.strip()
dataset_dir = os.path.join(CLIPS_DIR, model_name, "dataset")
if not os.path.exists(dataset_dir):
@ -129,7 +126,6 @@ class ClassificationTrainingProcess(FrigateProcess):
"TF_KERAS_MOBILENET_V2_WEIGHTS_URL",
"",
)
model_name = model_name.strip()
super().__init__(
stop_event=None,
priority=PROCESS_PRIORITY_LOW,
@ -296,7 +292,6 @@ class ClassificationTrainingProcess(FrigateProcess):
def kickoff_model_training(
embeddingRequestor: EmbeddingsRequestor, model_name: str
) -> None:
model_name = model_name.strip()
requestor = InterProcessRequestor()
requestor.send_data(
UPDATE_MODEL_STATE,
@ -364,7 +359,6 @@ def collect_state_classification_examples(
model_name: Name of the classification model
cameras: Dict mapping camera names to normalized crop coordinates [x1, y1, x2, y2] (0-1)
"""
model_name = model_name.strip()
dataset_dir = os.path.join(CLIPS_DIR, model_name, "dataset")
# Step 1: Get review items for the cameras
@ -720,7 +714,6 @@ def collect_object_classification_examples(
model_name: Name of the classification model
label: Object label to collect (e.g., "person", "car")
"""
model_name = model_name.strip()
dataset_dir = os.path.join(CLIPS_DIR, model_name, "dataset")
temp_dir = os.path.join(dataset_dir, "temp")
os.makedirs(temp_dir, exist_ok=True)

View File

@ -540,16 +540,9 @@ def get_jetson_stats() -> Optional[dict[int, dict]]:
try:
results["mem"] = "-" # no discrete gpu memory
if os.path.exists("/sys/devices/gpu.0/load"):
with open("/sys/devices/gpu.0/load", "r") as f:
gpuload = float(f.readline()) / 10
results["gpu"] = f"{gpuload}%"
elif os.path.exists("/sys/devices/platform/gpu.0/load"):
with open("/sys/devices/platform/gpu.0/load", "r") as f:
gpuload = float(f.readline()) / 10
results["gpu"] = f"{gpuload}%"
else:
results["gpu"] = "-"
with open("/sys/devices/gpu.0/load", "r") as f:
gpuload = float(f.readline()) / 10
results["gpu"] = f"{gpuload}%"
except Exception:
return None

View File

@ -64,12 +64,10 @@ def stop_ffmpeg(ffmpeg_process: sp.Popen[Any], logger: logging.Logger):
try:
logger.info("Waiting for ffmpeg to exit gracefully...")
ffmpeg_process.communicate(timeout=30)
logger.info("FFmpeg has exited")
except sp.TimeoutExpired:
logger.info("FFmpeg didn't exit. Force killing...")
ffmpeg_process.kill()
ffmpeg_process.communicate()
logger.info("FFmpeg has been killed")
ffmpeg_process = None

300
web/package-lock.json generated
View File

@ -48,7 +48,7 @@
"idb-keyval": "^6.2.1",
"immer": "^10.1.1",
"konva": "^9.3.18",
"lodash": "^4.17.23",
"lodash": "^4.17.21",
"lucide-react": "^0.477.0",
"monaco-yaml": "^5.3.1",
"next-themes": "^0.3.0",
@ -64,7 +64,7 @@
"react-i18next": "^15.2.0",
"react-icons": "^5.5.0",
"react-konva": "^18.2.10",
"react-router-dom": "^6.30.3",
"react-router-dom": "^6.26.0",
"react-swipeable": "^7.0.2",
"react-tracked": "^2.0.1",
"react-transition-group": "^4.4.5",
@ -116,7 +116,7 @@
"prettier-plugin-tailwindcss": "^0.6.5",
"tailwindcss": "^3.4.9",
"typescript": "^5.8.2",
"vite": "^6.4.1",
"vite": "^6.2.0",
"vitest": "^3.0.7"
}
},
@ -3293,9 +3293,9 @@
"license": "MIT"
},
"node_modules/@remix-run/router": {
"version": "1.23.2",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz",
"integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==",
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz",
"integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
@ -4683,19 +4683,6 @@
"node": ">=8"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@ -5632,20 +5619,6 @@
"csstype": "^3.0.2"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@ -5706,24 +5679,6 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-module-lexer": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
@ -5731,33 +5686,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/esbuild": {
"version": "0.25.0",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
@ -6294,15 +6222,12 @@
}
},
"node_modules/form-data": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"license": "MIT",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@ -6382,30 +6307,6 @@
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-nonce": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
@ -6415,19 +6316,6 @@
"node": ">=6"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@ -6496,18 +6384,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/graphemer": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@ -6537,38 +6413,10 @@
"node": ">=8"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
"integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
"dependencies": {
"function-bind": "^1.1.2"
},
@ -7210,10 +7058,9 @@
}
},
"node_modules/lodash": {
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
"integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"license": "MIT"
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lodash.merge": {
"version": "4.6.2",
@ -7293,15 +7140,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@ -8618,12 +8456,12 @@
}
},
"node_modules/react-router": {
"version": "6.30.3",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz",
"integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==",
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz",
"integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.23.2"
"@remix-run/router": "1.19.0"
},
"engines": {
"node": ">=14.0.0"
@ -8633,13 +8471,13 @@
}
},
"node_modules/react-router-dom": {
"version": "6.30.3",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz",
"integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==",
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz",
"integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.23.2",
"react-router": "6.30.3"
"@remix-run/router": "1.19.0",
"react-router": "6.26.0"
},
"engines": {
"node": ">=14.0.0"
@ -9664,54 +9502,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
"picomatch": "^4.0.3"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
"node_modules/tinyglobby/node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
"picomatch": {
"optional": true
}
}
},
"node_modules/tinyglobby/node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/tinypool": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
@ -10078,18 +9868,15 @@
}
},
"node_modules/vite": {
"version": "6.4.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
"integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz",
"integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.4.4",
"picomatch": "^4.0.2",
"postcss": "^8.5.3",
"rollup": "^4.34.9",
"tinyglobby": "^0.2.13"
"rollup": "^4.30.1"
},
"bin": {
"vite": "bin/vite.js"
@ -10183,37 +9970,6 @@
"monaco-editor": ">=0.33.0"
}
},
"node_modules/vite/node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
"picomatch": {
"optional": true
}
}
},
"node_modules/vite/node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/vitest": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.7.tgz",

View File

@ -54,7 +54,7 @@
"idb-keyval": "^6.2.1",
"immer": "^10.1.1",
"konva": "^9.3.18",
"lodash": "^4.17.23",
"lodash": "^4.17.21",
"lucide-react": "^0.477.0",
"monaco-yaml": "^5.3.1",
"next-themes": "^0.3.0",
@ -70,7 +70,7 @@
"react-i18next": "^15.2.0",
"react-icons": "^5.5.0",
"react-konva": "^18.2.10",
"react-router-dom": "^6.30.3",
"react-router-dom": "^6.26.0",
"react-swipeable": "^7.0.2",
"react-tracked": "^2.0.1",
"react-transition-group": "^4.4.5",
@ -122,7 +122,7 @@
"prettier-plugin-tailwindcss": "^0.6.5",
"tailwindcss": "^3.4.9",
"typescript": "^5.8.2",
"vite": "^6.4.1",
"vite": "^6.2.0",
"vitest": "^3.0.7"
}
}

View File

@ -1,5 +1 @@
{
"train": {
"titleShort": "الأخيرة"
}
}
{}

View File

@ -1,6 +1,6 @@
{
"description": {
"addFace": "أضف مجموعة جديدة إلى مكتبة الوجوه عن طريق رفع صورتك الأولى.",
"addFace": "قم بإضافة مجموعة جديدة لمكتبة الأوجه.",
"invalidName": "أسم غير صالح. يجب أن يشمل الأسم فقط على الحروف، الأرقام، المسافات، الفاصلة العليا، الشرطة التحتية، والشرطة الواصلة.",
"placeholder": "أدخل أسم لهذه المجموعة"
},
@ -21,88 +21,6 @@
"collections": "المجموعات",
"createFaceLibrary": {
"title": "إنشاء المجاميع",
"desc": "إنشاء مجموعة جديدة",
"new": "إضافة وجه جديد",
"nextSteps": "لبناء أساس قوي:<li>استخدم علامة التبويب \"التعرّفات الأخيرة\" لاختيار الصور والتدريب عليها لكل شخص تم اكتشافه.</li> <li>ركّز على الصور الأمامية المباشرة للحصول على أفضل النتائج؛ وتجنّب صور التدريب التي تُظهر الوجوه بزاوية.</li>"
},
"steps": {
"faceName": "ادخل اسم للوجه",
"uploadFace": "ارفع صورة للوجه",
"nextSteps": "الخطوة التالية",
"description": {
"uploadFace": "قم برفع صورة لـ {{name}} تُظهر وجهه من زاوية أمامية مباشرة. لا يلزم أن تكون الصورة مقتصرة على الوجه فقط."
}
},
"train": {
"title": "التعرّفات الأخيرة",
"titleShort": "الأخيرة",
"aria": "اختر التعرّفات الأخيرة",
"empty": "لا توجد أي محاولات حديثة للتعرّف على الوجوه"
},
"deleteFaceLibrary": {
"title": "احذف الاسم",
"desc": "هل أنت متأكد أنك تريد حذف المجموعة {{name}}؟ سيؤدي هذا إلى حذف جميع الوجوه المرتبطة بها نهائيًا."
},
"deleteFaceAttempts": {
"title": "احذف الوجوه",
"desc_zero": "وجه",
"desc_one": "وجه",
"desc_two": "وجهان",
"desc_few": "وجوه",
"desc_many": "وجهًا",
"desc_other": "وجه"
},
"renameFace": {
"title": "اعادة تسمية الوجه",
"desc": "ادخل اسم جديد لـ{{name}}"
},
"button": {
"deleteFaceAttempts": "احذف الوجوه",
"addFace": "اظف وجهًا",
"renameFace": "اعد تسمية وجه",
"deleteFace": "احذف وجهًا",
"uploadImage": "ارفع صورة",
"reprocessFace": "إعادة معالجة الوجه"
},
"imageEntry": {
"validation": {
"selectImage": "يرجى اختيار ملف صورة."
},
"dropActive": "اسحب الصورة إلى هنا…",
"dropInstructions": "اسحب وأفلت أو الصق صورة هنا، أو انقر للاختيار",
"maxSize": "الحجم الأقصى: {{size}} ميغابايت"
},
"nofaces": "لا توجد وجوه متاحة",
"trainFaceAs": "درّب الوجه كـ:",
"trainFace": "درّب الوجه",
"toast": {
"success": {
"uploadedImage": "تم رفع الصورة بنجاح.",
"addFaceLibrary": "تمت إضافة {{name}} بنجاح إلى مكتبة الوجوه!",
"deletedFace_zero": "وجه",
"deletedFace_one": "وجه",
"deletedFace_two": "وجهين",
"deletedFace_few": "وجوه",
"deletedFace_many": "وجهًا",
"deletedFace_other": "وجه",
"deletedName_zero": "وجه",
"deletedName_one": "وجه",
"deletedName_two": "وجهين",
"deletedName_few": "وجوه",
"deletedName_many": "وجهًا",
"deletedName_other": "وجه",
"renamedFace": "تمت إعادة تسمية الوجه بنجاح إلى {{name}}",
"trainedFace": "تم تدريب الوجه بنجاح.",
"updatedFaceScore": "تم تحديث درجة الوجه بنجاح إلى {{name}} ({{score}})."
},
"error": {
"uploadingImageFailed": "فشل في رفع الصورة: {{errorMessage}}",
"addFaceLibraryFailed": "فشل في تعيين اسم الوجه: {{errorMessage}}",
"deleteFaceFailed": "فشل الحذف: {{errorMessage}}",
"deleteNameFailed": "فشل في حذف الاسم: {{errorMessage}}",
"renameFaceFailed": "فشل في إعادة تسمية الوجه: {{errorMessage}}",
"trainFailed": "فشل التدريب: {{errorMessage}}",
"updateFaceScoreFailed": "فشل في تحديث درجة الوجه: {{errorMessage}}"
}
"desc": "إنشاء مجموعة جديدة"
}
}

View File

@ -2,9 +2,9 @@
"babbling": "Бърборене",
"whispering": "Шепнене",
"laughter": "Смях",
"crying": "Плач",
"crying": "Плача",
"sigh": "Въздишка",
"singing": еене",
"singing": одписвам",
"choir": "Хор",
"yodeling": "Йоделинг",
"mantra": "Мантра",
@ -264,6 +264,5 @@
"pant": "Здъхване",
"stomach_rumble": "Къркорене на стомах",
"heartbeat": "Сърцебиене",
"scream": "Вик",
"snicker": "Хихикане"
"scream": "Вик"
}

View File

@ -1,16 +1,6 @@
{
"form": {
"user": "Потребителско име",
"password": "Парола",
"login": "Вход",
"firstTimeLogin": "Опитвате да влезете за първи път? Данните за вход са разпечатани в логовете на Frigate.",
"errors": {
"usernameRequired": "Потребителското име е задължително",
"passwordRequired": "Паролата е задължителна",
"rateLimit": "Надхвърлен брой опити. Моля Опитайте по-късно.",
"loginFailed": "Неуспешен вход",
"unknownError": "Неизвестна грешка. Поля проверете логовете.",
"webUnknownError": "Неизвестна грешка. Поля проверете изхода в конзолата."
}
"password": "Парола"
}
}

View File

@ -7,7 +7,7 @@
"label": "Изтрий група за камери",
"confirm": {
"title": "Потвърди изтриването",
"desc": "Сигурни ли сте, че искате да изтриете група <em>{{name}}</em>?"
"desc": "Сигурни ли сте, че искате да изтриете група </em>{{name}}</em>?"
}
},
"name": {

View File

@ -11,9 +11,6 @@
},
"restart": {
"title": "Сигурен ли сте, че искате да рестартирате Frigate?",
"button": "Рестартирай",
"restarting": {
"title": "Frigare се рестартира"
}
"button": "Рестартирай"
}
}

View File

@ -1,6 +1,3 @@
{
"documentTitle": "Модели за класификация - Frigate",
"description": {
"invalidName": "Невалидно име. Имената могат да съдържат единствено: букви, числа, празни места, долни черти и тирета."
}
"documentTitle": "Модели за класификация"
}

View File

@ -1,18 +1,4 @@
{
"documentTitle": "Настройки на конфигурацията - Frigate",
"configEditor": "Конфигуратор",
"safeConfigEditor": "Конфигуратор (Safe Mode)",
"safeModeDescription": "Frigate е в режим \"Safe Mode\" тъй като конфигурацията не минава проверките за валидност.",
"copyConfig": "Копирай Конфигурацията",
"saveAndRestart": "Запази и Рестартирай",
"saveOnly": "Запази",
"confirm": "Изход без запис?",
"toast": {
"success": {
"copyToClipboard": "Конфигурацията е копирана."
},
"error": {
"savingError": "Грешка при запис на конфигурацията"
}
}
"documentTitle": "Настройки на конфигурацията - Фригейт",
"configEditor": "Настройки на конфигурацията"
}

View File

@ -11,8 +11,5 @@
},
"allCameras": "Всички камери",
"alerts": "Известия",
"detections": "Засичания",
"motion": {
"label": "Движение"
}
"detections": "Засичания"
}

View File

@ -10,5 +10,5 @@
"trackedObjectsCount_one": "{{count}} проследен обект ",
"trackedObjectsCount_other": "{{count}} проследени обекта ",
"documentTitle": "Разгледай - Фригейт",
"generativeAI": "Генеративен Изкъствен Интелект"
"generativeAI": "Генериращ Изкъствен Интелект"
}

View File

@ -1,23 +1,4 @@
{
"documentTitle": "Експорт - Frigate",
"search": "Търси",
"noExports": "Няма намерени експорти",
"deleteExport": "Изтрий експорт",
"deleteExport.desc": "Сигурни ли сте, че искате да изтриете {{exportName}}?",
"editExport": {
"title": "Преименувай експорт",
"desc": "Въведете ново име за този експорт.",
"saveExport": "Запази експорт"
},
"tooltip": {
"shareExport": "Сподели експорт",
"downloadVideo": "Свали видео",
"editName": "Редактирай име",
"deleteExport": "Изтрий експорт"
},
"toast": {
"error": {
"renameExportFailed": "Неуспешно преименуване на експорт: {{errorMessage}}"
}
}
"search": "Търси"
}

View File

@ -13,7 +13,6 @@
},
"description": {
"addFace": "Добавете нова колекция във библиотеката за лица при качването на първата ви снимка.",
"placeholder": "Напишете име за тази колекция",
"invalidName": "Невалидно име. Имената могат да съдържат единствено: букви, числа, празни места, долни черти и тирета."
"placeholder": "Напишете име за тази колекция"
}
}

View File

@ -3,6 +3,5 @@
"save": "Запазване на търсенето"
},
"search": "Търси",
"savedSearches": "Запазени търсения",
"searchFor": "Търсене за {{inputValue}}"
"savedSearches": "Запазени търсения"
}

View File

@ -4,7 +4,6 @@
},
"documentTitle": {
"cameras": "Статистики за Камери - Фригейт",
"storage": "Статистика за паметта - Фригейт",
"general": "Обща Статистика - Frigate"
"storage": "Статистика за паметта - Фригейт"
}
}

View File

@ -227,8 +227,7 @@
"show": "Mostra {{item}}",
"ID": "ID",
"none": "Cap",
"all": "Tots",
"other": "Altres"
"all": "Tots"
},
"button": {
"apply": "Aplicar",

View File

@ -10,11 +10,7 @@
"empty": {
"alert": "Hi ha cap alerta per revisar",
"detection": "Hi ha cap detecció per revisar",
"motion": "No s'haan trobat dades de moviment",
"recordingsDisabled": {
"title": "S'han d'activar les gravacions",
"description": "Només es poden revisar temes quan s'han activat les gravacions de la càmera."
}
"motion": "No s'haan trobat dades de moviment"
},
"timeline": "Línia de temps",
"timeline.aria": "Seleccionar línia de temps",

View File

@ -169,10 +169,7 @@
"title": "Edita els atributs",
"desc": "Seleccioneu els atributs de classificació per a aquesta {{label}}"
},
"attributes": "Atributs de classificació",
"title": {
"label": "Títol"
}
"attributes": "Atributs de classificació"
},
"searchResult": {
"tooltip": "S'ha identificat {{type}} amb una confiança del {{confidence}}%",

View File

@ -86,14 +86,7 @@
"otherProcesses": {
"title": "Altres processos",
"processMemoryUsage": "Ús de memòria de procés",
"processCpuUsage": "Ús de la CPU del procés",
"series": {
"recording": "gravant",
"review_segment": "segment de revisió",
"embeddings": "incrustacions",
"audio_detector": "detector d'àudio",
"go2rtc": "go2rtc"
}
"processCpuUsage": "Ús de la CPU del procés"
}
},
"storage": {

View File

@ -130,8 +130,7 @@
"show": "Zeige {{item}}",
"ID": "ID",
"none": "Nichts",
"all": "Alle",
"other": "andere"
"all": "Alle"
},
"menu": {
"configurationEditor": "Konfigurationseditor",

View File

@ -1,5 +1,5 @@
{
"documentTitle": "Klassifikationsmodelle - Frigate",
"documentTitle": "Klassifizierungsmodelle - Fregatte",
"details": {
"scoreInfo": "Die Punktzahl gibt die durchschnittliche Konfidenz aller Erkennungen dieses Objekts wieder.",
"none": "Keiner",
@ -11,7 +11,7 @@
"deleteCategory": "Klasse löschen",
"deleteImages": "Bilder löschen",
"trainModel": "Modell trainieren",
"addClassification": "Klassifikationsmodell hinzufügen",
"addClassification": "Klassifizierung hinzufügen",
"deleteModels": "Modell löschen",
"editModel": "Modell bearbeiten"
},
@ -58,7 +58,7 @@
},
"edit": {
"title": "Klassifikationsmodell bearbeiten",
"descriptionState": "Bearbeite die Klassen für dieses Zustandsklassifikationsmodell. Änderungen erfordern ein erneutes Trainieren des Modells.",
"descriptionState": "Bearbeite die Klassen für dieses Zustandsklassifikationsmodell. Änderungen erfordern erneutes Trainieren des Modells.",
"descriptionObject": "Bearbeite den Objekttyp und Klassifizierungstyp für dieses Objektklassifikationsmodell.",
"stateClassesInfo": "Hinweis: Die Änderung der Statusklassen erfordert ein erneutes Trainieren des Modells mit den aktualisierten Klassen."
},
@ -97,49 +97,49 @@
"noModels": {
"object": {
"title": "Keine Objektklassifikationsmodelle",
"description": "Erstelle ein benutzerdefiniertes Objektklassifikationsmodell, um erkannte Objekte zu klassifizieren.",
"buttonText": "Objektklassifikationsmodell erstellen"
"description": "Erstelle ein benutzerdefiniertes Modell, um erkannte Objekte zu klassifizieren.",
"buttonText": "Objektmodell erstellen"
},
"state": {
"title": "Keine Zustandsklassifikationsmodelle",
"description": "Erstellen Sie ein benutzerdefiniertes Zustandsklassifikationsmodell, um Zustandsänderungen in bestimmten Kamerabereichen zu überwachen und zu klassifizieren.",
"buttonText": "Zustandsklassifikationsmodell erstellen"
"title": "Keine Statusklassifizierungsmodelle",
"description": "Erstellen Sie ein benutzerdefiniertes Modell, um Zustandsänderungen in bestimmten Kamerabereichen zu überwachen und zu klassifizieren.",
"buttonText": "Zustandsmodell erstellen"
}
},
"wizard": {
"title": "Neues Klassifikationsmodell erstellen",
"title": "Neue Klassifizierung erstellen",
"steps": {
"nameAndDefine": "Benennen und definieren",
"stateArea": "Überwachungsbereich",
"stateArea": "Gebiet",
"chooseExamples": "Beispiel auswählen"
},
"step1": {
"description": "Zustandsmodelle überwachen fest definierte Kamerabereiche auf Veränderungen (z. B. Tür offen/geschlossen). Objektmodelle klassifizieren erkannte Objekte genauer (z. B. in bekannte Tiere, Lieferanten usw.).",
"description": "Zustandsmodelle überwachen feste Kamerabereiche auf Veränderungen (z. B. Tür offen/geschlossen). Objektmodelle fügen den erkannten Objekten Klassifizierungen hinzu (z. B. bekannte Tiere, Lieferanten usw.).",
"name": "Name",
"namePlaceholder": "Modellname eingeben ...",
"namePlaceholder": "Eingeben Modell Name...",
"type": "Typ",
"typeState": "Zustand",
"typeObject": "Objekt",
"objectLabel": "Objektbezeichnung",
"objectLabel": "Objekt Bezeichnung",
"objectLabelPlaceholder": "Auswahl Objekt Typ...",
"classificationType": "Klassifizierungstyp",
"classificationTypeTip": "Etwas über Klassifizierungstyp lernen",
"classificationTypeDesc": "Unterbezeichnungen fügen dem Objektnamen zusätzlichen Text hinzu (z. B. „Person: UPS“). Attribute sind durchsuchbare Metadaten, die separat in den Objektmetadaten gespeichert sind.",
"classificationSubLabel": "Unterlabel",
"classificationAttribute": "Attribut",
"classes": "Klassen",
"states": "Zustände",
"classesTip": "Mehr über Klassen erfahren",
"classificationAttribute": "Merkmal",
"classes": "Klasse",
"states": "Gebiet",
"classesTip": "Über Klassen lernen",
"classesStateDesc": "Definieren Sie die verschiedenen Zustände, in denen sich Ihr Kamerabereich befinden kann. Beispiel: „offen” und „geschlossen” für ein Garagentor.",
"classesObjectDesc": "Definieren Sie die verschiedenen Kategorien, in die erkannte Objekte klassifiziert werden sollen. Beispiel: „Lieferant“, „Bewohner“, „Fremder“ für die Klassifizierung von Personen.",
"classPlaceholder": "Klassenbezeichnung eingeben...",
"errors": {
"nameRequired": "Der Modellname ist erforderlich",
"nameRequired": "Modellname ist erforderlich",
"nameLength": "Der Modellname darf maximal 64 Zeichen lang sein",
"nameOnlyNumbers": "Der Modellname darf nicht nur aus Zahlen bestehen",
"classRequired": "Mindestens eine Klasse ist erforderlich",
"classesUnique": "Der Klassenname muss eindeutig sein",
"stateRequiresTwoClasses": "Zustandsmodelle erfordern mindestens zwei Klassen",
"classesUnique": "Klassenname muss eindeutig sein",
"stateRequiresTwoClasses": "Gebietsmodelle erfordern mindestens zwei Klassen",
"objectLabelRequired": "Bitte wähle eine Objektbeschriftung",
"objectTypeRequired": "Bitte wählen Sie einen Klassifizierungstyp aus",
"noneNotAllowed": "Die Klasse „none“ ist nicht zulässig"
@ -149,12 +149,12 @@
"description": "Wählen Sie Kameras aus und legen Sie für jede Kamera den zu überwachenden Bereich fest. Das Modell klassifiziert den Zustand dieser Bereiche.",
"cameras": "Kameras",
"selectCamera": "Kamera auswählen",
"noCameras": "Klicke + zum Hinzufügen von Kameras",
"noCameras": "Klick + zum hinzufügen der Kameras",
"selectCameraPrompt": "Wählen Sie eine Kamera aus der Liste aus, um ihren Überwachungsbereich festzulegen"
},
"step3": {
"selectImagesPrompt": "Wählen Sie alle Bilder mit: {{className}}",
"selectImagesDescription": "Klicken Sie auf die Bilder, um sie auszuwählen. Klicken Sie auf „Weiter“, wenn Sie mit dieser Klasse fertig sind.",
"selectImagesPrompt": "Wählen sie alle Bilder mit: {{className}}",
"selectImagesDescription": "Klicken Sie auf die Bilder, um sie auszuwählen. Klicken Sie auf „Weiter“, wenn Sie mit diesem Kurs fertig sind.",
"allImagesRequired_one": "Bitte klassifizieren Sie alle Bilder. {{count}} Bild verbleibend.",
"allImagesRequired_other": "Bitte klassifizieren Sie alle Bilder. {{count}} Bilder verbleiben.",
"generating": {
@ -162,7 +162,7 @@
"description": "Frigate extrahiert repräsentative Bilder aus Ihren Aufnahmen. Dies kann einen Moment dauern..."
},
"training": {
"title": "Trainiere Modell",
"title": "Trainingsmodell",
"description": "Ihr Modell wird im Hintergrund trainiert. Schließen Sie diesen Dialog, und Ihr Modell wird ausgeführt, sobald das Training abgeschlossen ist."
},
"retryGenerate": "Generierung wiederholen",
@ -177,7 +177,7 @@
"classifyFailed": "Bilder konnten nicht klassifiziert werden: {{error}}"
},
"generateSuccess": "Erfolgreich generierte Beispielbilder",
"modelCreated": "Modell erfolgreich erstellt. Verwenden Sie die Ansicht „Aktuelle Klassifizierungen“, um Bilder für fehlende Zustände hinzuzufügen und trainieren Sie dann das Modell erneut.",
"modelCreated": "Modell erfolgreich erstellt. Verwenden Sie die Ansicht „Aktuelle Klassifizierungen“, um Bilder für fehlende Zustände hinzuzufügen, und trainieren Sie dann das Modell.",
"missingStatesWarning": {
"title": "Beispiele für fehlende Zustände",
"description": "Es wird empfohlen für alle Zustände Beispiele auszuwählen. Das Modell wird erst trainiert, wenn für alle Zustände Bilder vorhanden sind. Fahren Sie fort und verwenden Sie die Ansicht „Aktuelle Klassifizierungen“, um Bilder für die fehlenden Zustände zu klassifizieren. Trainieren Sie anschließend das Modell."

View File

@ -8,11 +8,7 @@
"empty": {
"alert": "Es gibt keine zu prüfenden Alarme",
"detection": "Es gibt keine zu prüfenden Erkennungen",
"motion": "Keine Bewegungsdaten gefunden",
"recordingsDisabled": {
"title": "Aufzeichnungen müssen aktiviert sein",
"description": "Überprüfungselemente können nur für eine Kamera erstellt werden, wenn Aufzeichnungen für diese Kamera aktiviert sind."
}
"motion": "Keine Bewegungsdaten gefunden"
},
"timeline": "Zeitleiste",
"timeline.aria": "Zeitleiste auswählen",

View File

@ -79,10 +79,7 @@
"title": "Attribute bearbeiten",
"desc": "Wählen Sie Klassifizierungsattribute für dieses {{label}} aus"
},
"attributes": "Klassifizierungsattribute",
"title": {
"label": "Titel"
}
"attributes": "Klassifizierungsattribute"
},
"documentTitle": "Erkunde - Frigate",
"generativeAI": "Generative KI",

View File

@ -1,7 +1,7 @@
{
"description": {
"placeholder": "Gib einen Name für diese Kollektion ein",
"addFace": "Füge der Gesichtsbibliothek eine neue Sammlung hinzu, indem du ein Bild hochlädst.",
"addFace": "Füge der Gesichtsbibliothek eine neue Sammlung hinzu, indem ein Bild hinzufügst.",
"invalidName": "Ungültiger Name. Namen dürfen nur Buchstaben, Zahlen, Leerzeichen, Apostrophe, Unterstriche und Bindestriche enthalten."
},
"details": {

View File

@ -49,7 +49,7 @@
"desc": "Standardmäßig werden die letzten Warnmeldungen auf dem Live-Dashboard als kurze Videoschleifen abgespielt. Deaktiviere diese Option, um nur ein statisches Bild der letzten Warnungen auf diesem Gerät/Browser anzuzeigen."
},
"automaticLiveView": {
"desc": "Zeigt automatisch das Live-Bild einer Kamera an, wenn eine Aktivität erkannt wird. Ist diese Option deaktiviert, werden Kamerabilder im Live-Dashboard nur einmal pro Minute aktualisiert.",
"desc": "Wechsle automatisch zur Live Ansicht der Kamera, wenn einen Aktivität erkannt wurde. Wenn du diese Option deaktivierst, werden die statischen Kamerabilder auf der Liveübersicht nur einmal pro Minute aktualisiert.",
"label": "Automatische Live Ansicht"
},
"displayCameraNames": {

View File

@ -50,14 +50,7 @@
"otherProcesses": {
"title": "Andere Prozesse",
"processCpuUsage": "CPU Auslastung für Prozess",
"processMemoryUsage": "Prozessspeicherauslastung",
"series": {
"go2rtc": "go2rtc",
"recording": "Aufnahme",
"audio_detector": "Geräuscherkennung",
"review_segment": "Überprüfungsteil",
"embeddings": "Einbettungen"
}
"processMemoryUsage": "Prozessspeicherauslastung"
}
},
"documentTitle": {

View File

@ -1,7 +1 @@
{
"documentTitle": "Μοντέλα Ταξινόμησης - Frigate",
"details": {
"scoreInfo": "Η βαθμολογία αντιπροσωπεύει την κατά μέσο όρο ταξινομική εμπιστοσύνη μεταξύ όλων των ανιχνεύσεων αυτού του αντικειμένου.",
"none": "Καμία"
}
}
{}

View File

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

View File

@ -15,9 +15,6 @@
},
"provider_options": {
"label": "GenAI Provider extra options."
},
"runtime_options": {
"label": "Options to pass during inference calls."
}
}
}
}

View File

@ -181,16 +181,6 @@
"restricted": {
"title": "No Cameras Available",
"description": "You don't have permission to view any cameras in this group."
},
"default": {
"title": "No Cameras Configured",
"description": "Get started by connecting a camera to Frigate.",
"buttonText": "Add Camera"
},
"group": {
"title": "No Cameras in Group",
"description": "This camera group has no assigned or enabled cameras.",
"buttonText": "Manage Groups"
}
}
}

View File

@ -386,11 +386,11 @@
"title": "Camera Review Settings",
"object_descriptions": {
"title": "Generative AI Object Descriptions",
"desc": "Temporarily enable/disable Generative AI object descriptions for this camera until Frigate restarts. When disabled, AI generated descriptions will not be requested for tracked objects on this camera."
"desc": "Temporarily enable/disable Generative AI object descriptions for this camera. When disabled, AI generated descriptions will not be requested for tracked objects on this camera."
},
"review_descriptions": {
"title": "Generative AI Review Descriptions",
"desc": "Temporarily enable/disable Generative AI review descriptions for this camera until Frigate restarts. When disabled, AI generated descriptions will not be requested for review items on this camera."
"desc": "Temporarily enable/disable Generative AI review descriptions for this camera. When disabled, AI generated descriptions will not be requested for review items on this camera."
},
"review": {
"title": "Review",

View File

@ -31,7 +31,7 @@
"crying": "Llanto",
"synthetic_singing": "Canto sintético",
"rapping": "Rap",
"humming": "Zumbido leve",
"humming": "Tarareo",
"groan": "Gemido",
"grunt": "Gruñido",
"whistling": "Silbido",
@ -129,7 +129,7 @@
"sitar": "Sitar",
"mandolin": "Mandolina",
"zither": "Cítara",
"ukulele": "Ukelele",
"ukulele": "Ukulele",
"piano": "Piano",
"organ": "Órgano",
"electronic_organ": "Órgano electrónico",
@ -153,7 +153,7 @@
"mallet_percussion": "Percusión con mazas",
"marimba": "Marimba",
"glockenspiel": "Glockenspiel",
"steelpan": "SarténAcero",
"steelpan": "Steelpan",
"orchestra": "Orquesta",
"trumpet": "Trompeta",
"string_section": "Sección de cuerdas",
@ -183,13 +183,13 @@
"psychedelic_rock": "Rock psicodélico",
"rhythm_and_blues": "Rhythm and blues",
"soul_music": "Música soul",
"country": "País",
"country": "Country",
"swing_music": "Música swing",
"disco": "Disco",
"house_music": "Música House",
"dubstep": "Dubstep",
"drum_and_bass": "Drum and Bass",
"electronica": "Electrónica",
"electronica": "Electronica",
"electronic_dance_music": "Música Dance Electronica",
"music_of_latin_america": "Música de América Latina",
"salsa_music": "Música Salsa",
@ -207,7 +207,7 @@
"song": "Canción",
"background_music": "Música Background",
"soundtrack_music": "Música de Pelicula",
"lullaby": "Cancion de cuna",
"lullaby": "Lullaby",
"video_game_music": "Música de Videojuego",
"christmas_music": "Música Navideña",
"sad_music": "Música triste",
@ -425,79 +425,5 @@
"radio": "Radio",
"gunshot": "Disparo",
"fusillade": "Descarga de Fusilería",
"pink_noise": "Ruido Rosa",
"shofar": "Shofar",
"liquid": "Líquido",
"splash": "Chapoteo",
"slosh": "líquido_en_movimiento",
"squish": "Chapotear",
"drip": "Goteo",
"pour": "Derramar",
"trickle": "Chorrito",
"gush": "Chorro",
"fill": "Llenar",
"spray": "Pulverizar",
"pump": "Bombear",
"stir": "Remover",
"boiling": "Hirviendo",
"sonar": "Sonar",
"arrow": "Flecha",
"whoosh": "Zas",
"thump": "Golpear",
"thunk": "Golpe_sordo",
"electronic_tuner": "Afinador_electrónico",
"effects_unit": "Unidades de efecto",
"chorus_effect": "Efecto Coral",
"basketball_bounce": "Bote baloncesto",
"bang": "Bang",
"slap": "Bofeteada",
"whack": "Aporreo",
"smash": "Aplastar",
"breaking": "Romper",
"bouncing": "Botar",
"whip": "Latigazo",
"flap": "Aleteo",
"scratch": "Arañazo",
"scrape": "Arañar",
"rub": "Frotar",
"roll": "Roll",
"crushing": "aplastar",
"crumpling": "Arrugar",
"tearing": "Rasgar",
"beep": "Bip",
"ping": "Ping",
"ding": "Ding",
"clang": "Sonido metálico",
"squeal": "Chillido",
"creak": "Crujido",
"rustle": "Crujir",
"whir": "Zumbido de ventilador",
"clatter": "Estrépito",
"sizzle": "Chisporroteo",
"clicking": "Click",
"clickety_clack": "Clic-clac",
"rumble": "Retumbar",
"plop": "Plaf",
"hum": "Murmullo",
"zing": "silbido",
"boing": "Bote",
"crunch": "Crujido",
"sine_wave": "Onda Sinusoidal",
"harmonic": "Harmonica",
"chirp_tone": "Tono de chirrido",
"pulse": "Pulso",
"inside": "Dentro",
"outside": "Afuera",
"reverberation": "Reverberación",
"echo": "Eco",
"noise": "Ruido",
"mains_hum": "Zumbido de red",
"distortion": "Distorsión",
"sidetone": "Tono lateral",
"cacophony": "Cacofonía",
"throbbing": "Palpitación",
"vibration": "Vibración",
"sodeling": "Sodeling",
"chird": "Chird",
"change_ringing": "Cambio timbre"
"pink_noise": "Ruido Rosa"
}

View File

@ -87,10 +87,7 @@
"formattedTimestampMonthDayYear": {
"12hour": "MMM d, yyyy",
"24hour": "MMM d, yyyy"
},
"inProgress": "En progreso",
"invalidStartTime": "Hora de inicio no válida",
"invalidEndTime": "Hora de finalización no válida"
}
},
"menu": {
"settings": "Ajustes",
@ -192,8 +189,7 @@
"review": "Revisar",
"explore": "Explorar",
"uiPlayground": "Zona de pruebas de la interfaz de usuario",
"faceLibrary": "Biblioteca de rostros",
"classification": "Clasificación"
"faceLibrary": "Biblioteca de rostros"
},
"unit": {
"speed": {
@ -203,14 +199,6 @@
"length": {
"meters": "Metros",
"feet": "Pies"
},
"data": {
"kbps": "kB/s",
"mbps": "MB/s",
"gbps": "GB/s",
"kbph": "kB/hora",
"mbph": "MB/hora",
"gbph": "GB/hora"
}
},
"button": {
@ -248,8 +236,7 @@
"enabled": "Habilitado",
"saving": "Guardando…",
"exitFullscreen": "Salir de pantalla completa",
"on": "ENCENDIDO",
"continue": "Continuar"
"on": "ENCENDIDO"
},
"toast": {
"save": {
@ -262,12 +249,7 @@
"copyUrlToClipboard": "URL copiada al portapapeles."
},
"label": {
"back": "Volver atrás",
"hide": "Ocultar {{item}}",
"show": "Mostrar {{item}}",
"ID": "ID",
"none": "Ninguno",
"all": "Todas"
"back": "Volver atrás"
},
"role": {
"title": "Rol",
@ -301,14 +283,5 @@
"readTheDocumentation": "Leer la documentación",
"information": {
"pixels": "{{area}}px"
},
"list": {
"two": "{{0}} y {{1}}",
"many": "{{items}}, y {{last}}",
"separatorWithSpace": ", "
},
"field": {
"optional": "Opcional",
"internalID": "La ID interna que usa Frigate en la configuración y en la base de datos"
}
}

View File

@ -66,11 +66,10 @@
"toast": {
"error": {
"failed": "No se pudo iniciar la exportación: {{error}}",
"noVaildTimeSelected": "No se seleccionó un rango de tiempo válido",
"endTimeMustAfterStartTime": "La hora de finalización debe ser posterior a la hora de inicio"
"noVaildTimeSelected": "No se seleccionó un rango de tiempo válido.",
"endTimeMustAfterStartTime": "La hora de finalización debe ser posterior a la hora de inicio."
},
"success": "Exportación iniciada con éxito. Ver el archivo en la página exportaciones.",
"view": "Ver"
"success": "Exportación iniciada con éxito. Ver el archivo en la página exportaciones."
},
"fromTimeline": {
"saveExport": "Guardar exportación",
@ -130,7 +129,6 @@
"search": {
"placeholder": "Búsqueda por etiqueta o sub-etiqueta..."
},
"noImages": "No se encontraron miniaturas para esta cámara",
"unknownLabel": "Imagen de activación guardada"
"noImages": "No se encontraron miniaturas para esta cámara"
}
}

View File

@ -133,9 +133,5 @@
},
"count_one": "{{count}} Clase",
"count_other": "{{count}} Clases"
},
"attributes": {
"label": "Clasificación de Atributos",
"all": "Todos los Atributos"
}
}

View File

@ -102,7 +102,7 @@
"baseball_bat": "Bate de béisbol",
"oven": "Horno",
"waste_bin": "Papelera",
"snowboard": "Tabla de Snow",
"snowboard": "Snowboard",
"sandwich": "Sandwich",
"fox": "Zorro",
"nzpost": "NZPost",

View File

@ -1,7 +1,7 @@
{
"documentTitle": "Modelos de Clasificación - Frigate",
"documentTitle": "Modelos de Clasificación",
"button": {
"deleteClassificationAttempts": "Borrar Imágenes de Clasificación",
"deleteClassificationAttempts": "Borrar Imágenes de Clasificación.",
"renameCategory": "Renombrar Clase",
"deleteCategory": "Borrar Clase",
"deleteImages": "Borrar Imágenes",
@ -30,15 +30,12 @@
"categorizeFailed": "Fallo al categorizar imagen: {{errorMessage}}",
"trainingFailed": "El entrenamiento del modelo ha fallado. Revisa los registros de Frigate para más detalles.",
"updateModelFailed": "Fallo al actualizar modelo: {{errorMessage}}",
"trainingFailedToStart": "No se pudo iniciar el entrenamiento del modelo: {{errorMessage}}",
"renameCategoryFailed": "Falló el renombrado de la clase: {{errorMessage}}"
"trainingFailedToStart": "No se pudo iniciar el entrenamiento del modelo: {{errorMessage}}"
}
},
"deleteCategory": {
"title": "Borrar Clase",
"desc": "¿Esta seguro de que quiere borrar la clase {{name}}? Esto borrará permanentemente todas las imágenes asociadas y requerirá reentrenar el modelo.",
"minClassesTitle": "No se puede Borrar la Clase",
"minClassesDesc": "Un modelo de clasificación debe tener al menos 2 clases. Añade otra clase antes de borrar esta."
"desc": "¿Esta seguro de que quiere borrar la clase {{name}}? Esto borrará permanentemente todas las imágenes asociadas y requerirá reentrenar el modelo."
},
"deleteModel": {
"title": "Borrar Modelo de Clasificación",
@ -48,145 +45,15 @@
"desc_other": "¿Estas seguro de que quiere borrar {{count}} modelos? Esto borrara permanentemente todos los datos asociados, incluyendo imágenes y datos de entrenamiento. Esta acción no puede ser desehecha."
},
"edit": {
"title": "Editar modelo de clasificación",
"descriptionState": "Edita las clases para este modelo de clasificación de estados. Los cambios requerirán un reentrenamiento de modelo.",
"descriptionObject": "Edita el tipo de objeto y el tipo de clasificación para este modelo de clasificación de objetos.",
"stateClassesInfo": "Nota: El cambio de las clases de estado requiere reentrenar el modelo con las clases actualizadas."
"title": "Editar modelo de clasificación"
},
"tooltip": {
"noChanges": "No se han realizado cambios en el conjunto de datos desde el último entrenamiento.",
"modelNotReady": "El modelo no está listo para el entrenamiento",
"trainingInProgress": "El modelo está entrenándose actualmente",
"trainingInProgress": "El modelo está entrenándose actualmente.",
"noNewImages": "No hay imágenes nuevas para entrenar. Clasifica antes más imágenes del conjunto de datos."
},
"details": {
"scoreInfo": "La puntuación representa la confianza media de clasificación en todas las detecciones de este objeto.",
"unknown": "Desconocido",
"none": "Nada"
},
"categorizeImage": "Clasificar Imagen",
"menu": {
"objects": "Objetos",
"states": "Estados"
},
"wizard": {
"steps": {
"chooseExamples": "Seleccionar Ejemplos",
"nameAndDefine": "Nombrar y definir",
"stateArea": "Área de estado"
},
"step1": {
"name": "Nombre",
"namePlaceholder": "Introducir nombre del modelo...",
"type": "Tipo",
"typeState": "Estado",
"typeObject": "Objeto",
"objectLabel": "Etiqueta de Objeto",
"objectLabelPlaceholder": "Seleccionar tipo de objeto...",
"classificationAttribute": "Atributo",
"classes": "Clases",
"states": "Estados",
"classPlaceholder": "Introducir nombre de la clase...",
"errors": {
"nameRequired": "Se requiere nombre del modelo",
"nameLength": "El nombre del modelo debe tener 64 caracteres o menos",
"nameOnlyNumbers": "El nombre del modelo no puede contener solo números",
"classRequired": "Al menos se requiere una clase",
"classesUnique": "Los nombres de clase deben ser únicos",
"noneNotAllowed": "La clase 'none' no esta permitida",
"stateRequiresTwoClasses": "Los modelos de estado requieren al menos 2 clases",
"objectLabelRequired": "Por favor seleccione una etiqueta de objeto",
"objectTypeRequired": "Por favor seleccione un tipo de clasificación"
},
"description": "Los modelos de estado monitorean las áreas fijas de la cámara para detectar cambios (p. ej., puerta abierta/cerrada). Los modelos de objetos clasifican los objetos detectados (p. ej., animales conocidos, repartidores, etc.).",
"classificationType": "Tipo de clasificación",
"classificationTypeTip": "Conozca más sobre los tipos de clasificación",
"classificationTypeDesc": "Las subetiquetas añaden texto adicional a la etiqueta del objeto (p. ej., «Persona: UPS»). Los atributos son metadatos que permiten búsquedas y se almacenan por separado en los metadatos del objeto.",
"classificationSubLabel": "Sub etiqueta",
"classesTip": "Aprenda más sobre clases",
"classesStateDesc": "Define los diferentes estados en los que puede estar el área de tu cámara. Por ejemplo: \"abierta\" y \"cerrada\" para una puerta de garaje.",
"classesObjectDesc": "Define las diferentes categorías para clasificar los objetos detectados. Por ejemplo: \"persona de reparto\", \"residente\" y \"desconocido\" para la clasificación de personas."
},
"step2": {
"description": "Seleccione las cámaras y defina el area a monitorizar por cada cámara. El modelo clasificará el estado de estas cámaras.",
"cameras": "Camaras",
"selectCamera": "Selecciones Cámara",
"noCameras": "Haga clic en + para añadir cámaras",
"selectCameraPrompt": "Seleccione una cámara de la lista para definir su área de monitorización"
},
"step3": {
"selectImagesPrompt": "Seleccione todas las imágenes de: {{className}}",
"selectImagesDescription": "Haga clic en las imágenes para seleccionarlas. Haga clic en Continuar cuando esté listo para esta clase.",
"generating": {
"title": "Generando Imágenes de Ejemplo",
"description": "Frigate está seleccionando imágenes representativas de sus grabaciones. Esto puede llevar un tiempo..."
},
"training": {
"title": "Modelo de Entrenamiento",
"description": "Tu modelo se está entrenando en segundo plano. Cierra este cuadro de diálogo y tu modelo comenzará a ejecutarse en cuanto finalice el entrenamiento."
},
"retryGenerate": "Reintentar Generación",
"noImages": "No se han generado imágenes de ejemplo",
"classifying": "Clasificando y Entrenando...",
"trainingStarted": "Entrenamiento iniciado con éxito",
"modelCreated": "Modelo creado con éxito. Use la vista de Clasificaciones Recientes para añadir imágenes para los estados que falten, después entrene el modelo.",
"errors": {
"noCameras": "No hay cámaras configuradas",
"noObjectLabel": "No se ha seleccionado etiqueta de objeto",
"generateFailed": "Falló la generación de ejemplos: {{error}}",
"generationFailed": "Generación fallida. Por favor pruebe otra vez.",
"classifyFailed": "Falló la clasificación de imágenes: {{error}}"
},
"generateSuccess": "Imágenes de ejemplo generadas correctamente",
"missingStatesWarning": {
"title": "Faltan Ejemplos de Estado",
"description": "Se recomienda seleccionar ejemplos para todos los estados para obtener mejores resultados. Puede continuar sin seleccionar todos los estados, pero el modelo no se entrenará hasta que todos los estados tengan imágenes. Después de continuar, use la vista \"Clasificaciones recientes\" para clasificar las imágenes de los estados faltantes y luego entrene el modelo."
},
"allImagesRequired_one": "Por favor clasifique todas las imágenes. Queda {{count}} imagen.",
"allImagesRequired_many": "Por favor clasifique todas las imágenes. Quedan {{count}} imágenes.",
"allImagesRequired_other": "Por favor clasifique todas las imágenes. Quedan {{count}} imágenes."
},
"title": "Crear nueva Clasificación"
},
"deleteDatasetImages": {
"title": "Borrar Conjunto de Imágenes",
"desc_one": "¿Está seguro de que quiere eliminar {{count}} imagen de {{dataset}}? Esta acción no puede ser deshecha y requerirá reentrenar el modelo.",
"desc_many": "¿Está seguro de que quiere eliminar {{count}} imágenes de {{dataset}}? Esta acción no puede ser deshecha y requerirá reentrenar el modelo.",
"desc_other": "¿Está seguro de que quiere eliminar {{count}} imágenes de {{dataset}}? Esta acción no puede ser deshecha y requerirá reentrenar el modelo."
},
"deleteTrainImages": {
"title": "Borrar Imágenes de Entrenamiento",
"desc_one": "¿Está seguro de que quiere eliminar {{count}} imagen? Esta acción no puede ser deshecha.",
"desc_many": "¿Está seguro de que quiere eliminar {{count}} imágenes? Esta acción no puede ser deshecha.",
"desc_other": "¿Está seguro de que quiere eliminar {{count}} imágenes? Esta acción no puede ser deshecha."
},
"renameCategory": {
"title": "Renombrar Clase",
"desc": "Introduzca un nuevo nombre para {{name}}. Se requerirá que reentrene el modelo para que el cambio de nombre tenga efecto."
},
"description": {
"invalidName": "Nombre incorrecto. Los nombres solo pueden incluir letras, números, espacios, apóstrofes, guiones bajos, y guiones."
},
"train": {
"title": "Clasificaciones Recientes",
"titleShort": "Reciente",
"aria": "Seleccione Clasificaciones Recientes"
},
"categories": "Clases",
"createCategory": {
"new": "Crear Nueva Clase"
},
"categorizeImageAs": "Clasificar Imagen Como:",
"noModels": {
"object": {
"title": "No hay Modelos de Clasificación de Objetos",
"description": "Crear modelo a medida para clasificar los objetos detectados.",
"buttonText": "Crear Modelo de Objetos"
},
"state": {
"title": "No hay Modelos de Clasificación de Estados",
"description": "Cree un modelo personalizado para monitorear y clasificar los cambios de estado en áreas específicas de la cámara.",
"buttonText": "Crear modelo de estado"
}
"scoreInfo": "La puntuación representa la confianza media de clasificación en todas las detecciones de este objeto."
}
}

View File

@ -9,11 +9,7 @@
"empty": {
"alert": "No hay alertas para revisar",
"detection": "No hay detecciones para revisar",
"motion": "No se encontraron datos de movimiento",
"recordingsDisabled": {
"title": "Las grabaciones deben estar habilitadas",
"description": "Solo se pueden crear elementos de revisión para una cámara cuando las grabaciones están habilitadas para esa cámara."
}
"motion": "No se encontraron datos de movimiento"
},
"timeline": "Línea de tiempo",
"timeline.aria": "Seleccionar línea de tiempo",
@ -60,9 +56,5 @@
"objectTrack": {
"clickToSeek": "Clic para ir a este momento",
"trackedPoint": "Puntro trazado"
},
"select_all": "Todas",
"normalActivity": "Normal",
"needsReview": "Necesita revisión",
"securityConcern": "Aviso de seguridad"
}
}

View File

@ -42,15 +42,13 @@
"updatedSublabel": "Subetiqueta actualizada con éxito.",
"regenerate": "Se ha solicitado una nueva descripción a {{provider}}. Dependiendo de la velocidad de tu proveedor, la nueva descripción puede tardar algún tiempo en regenerarse.",
"updatedLPR": "Matrícula actualizada con éxito.",
"audioTranscription": "Se solicitó correctamente la transcripción de audio. Dependiendo de la velocidad de su servidor Frigate, la transcripción puede tardar un tiempo.",
"updatedAttributes": "Atributos actualizados correctamente."
"audioTranscription": "Transcripción de audio solicitada con éxito."
},
"error": {
"regenerate": "No se pudo llamar a {{provider}} para una nueva descripción: {{errorMessage}}",
"updatedSublabelFailed": "No se pudo actualizar la subetiqueta: {{errorMessage}}",
"updatedLPRFailed": "No se pudo actualizar la matrícula: {{errorMessage}}",
"audioTranscription": "Transcripción de audio solicitada falló: {{errorMessage}}",
"updatedAttributesFailed": "No se pudieron actualizar los atributos: {{errorMessage}}"
"audioTranscription": "Transcripción de audio solicitada falló: {{errorMessage}}"
}
},
"tips": {
@ -104,14 +102,6 @@
},
"score": {
"label": "Puntuación"
},
"editAttributes": {
"title": "Editar atributos",
"desc": "Seleccione atributos de clasificación para esta {{label}}"
},
"attributes": "Atributos de clasificación",
"title": {
"label": "Título"
}
},
"documentTitle": "Explorar - Frigate",
@ -208,26 +198,12 @@
"addTrigger": {
"label": "Añadir disparador",
"aria": "Añadir disparador para el objeto seguido"
},
"downloadCleanSnapshot": {
"label": "Descargue instantánea limpia",
"aria": "Descargue instantánea limpia"
},
"viewTrackingDetails": {
"label": "Ver detalles de seguimiento",
"aria": "Ver detalles de seguimiento"
},
"showObjectDetails": {
"label": "Mostrar la ruta del objeto"
},
"hideObjectDetails": {
"label": "Ocultar la ruta del objeto"
}
},
"dialog": {
"confirmDelete": {
"title": "Confirmar eliminación",
"desc": "Al eliminar este objeto rastreado, se eliminan la instantánea, las incrustaciones guardadas y las entradas de detalles de seguimiento asociadas. Las grabaciones de este objeto rastreado en la vista Historial <em>NO</em> se eliminarán.<br /><br />¿Seguro que desea continuar?"
"desc": "Eliminar este objeto rastreado elimina la captura de pantalla, cualquier incrustación guardada y cualquier entrada asociada al ciclo de vida del objeto. Las grabaciones de este objeto rastreado en la vista de Historial <em>NO</em> se eliminarán.<br /><br />¿Estás seguro de que quieres proceder?"
}
},
"noTrackedObjects": "No se encontraron objetos rastreados",
@ -239,9 +215,7 @@
"error": "No se pudo eliminar el objeto rastreado: {{errorMessage}}"
}
},
"tooltip": "Coincidencia con {{type}} al {{confidence}}%",
"previousTrackedObject": "Objeto rastreado previo",
"nextTrackedObject": "Objeto rastreado siguiente"
"tooltip": "Coincidencia con {{type}} al {{confidence}}%"
},
"trackedObjectsCount_one": "{{count}} objeto rastreado ",
"trackedObjectsCount_many": "{{count}} objetos rastreados ",
@ -261,45 +235,7 @@
"scrollViewTips": "Haz clic para ver los momentos relevantes del ciclo de vida de este objeto.",
"count": "{{first}} de {{second}}",
"lifecycleItemDesc": {
"visible": "{{label}} detectado",
"active": "{{label}} ha sido activado/a",
"stationary": "{{label}} se volvió estacionaria",
"attribute": {
"faceOrLicense_plate": "{{attribute}} detectado para {{label}}",
"other": "{{label}} reconocido como {{attribute}}"
},
"gone": "{{label}} ha salido",
"heard": "{{label}} escuchado/a",
"external": "{{label}} detectado",
"header": {
"zones": "Zonas",
"area": "Área",
"score": "Puntuación",
"ratio": "Ratio(proporción)"
},
"entered_zone": "{{label}} ha entrado en {{zones}}"
},
"trackedPoint": "Punto rastreado",
"annotationSettings": {
"title": "Configuración de anotaciones",
"showAllZones": {
"title": "Mostrar todas las Zonas",
"desc": "Mostrar siempre zonas en los marcos donde los objetos han entrado en una zona."
},
"offset": {
"label": "Desplazamiento de anotación",
"desc": "Estos datos provienen de la señal de detección de la cámara, pero se superponen a las imágenes de la señal de grabación. Es poco probable que ambas transmisiones estén perfectamente sincronizadas. Por lo tanto, el cuadro delimitador y el metraje no se alinearán perfectamente. Puede usar esta configuración para desplazar las anotaciones hacia adelante o hacia atrás en el tiempo para que se alineen mejor con el metraje grabado.",
"millisecondsToOffset": "Milisegundos para compensar la detección de anotaciones. <em>Predeterminado: 0</em>",
"tips": "Disminuya el valor si la reproducción de vídeo se produce antes de los cuadros y los puntos de ruta, y auméntelo si se produce después de ellos. Este valor puede ser negativo.",
"toast": {
"success": "El desplazamiento de anotación para {{camera}} se ha guardado en el archivo de configuración."
}
}
},
"autoTrackingTips": "Las posiciones del cuadro delimitador serán inexactas para las cámaras con seguimiento automático.",
"carousel": {
"previous": "Vista anterior",
"next": "Vista siguiente"
"visible": "{{label}} detectado"
}
}
}

View File

@ -2,7 +2,7 @@
"description": {
"addFace": "Agregar una nueva colección a la Biblioteca de Rostros subiendo tu primera imagen.",
"placeholder": "Introduce un nombre para esta colección",
"invalidName": "Nombre incorrecto. Los nombres solo pueden incluir letras, números, espacios, apóstrofes, guiones bajos, y guiones."
"invalidName": "Nombre inválido. Los nombres solo pueden incluir letras, números, espacios, apóstrofes, guiones bajos y guiones."
},
"details": {
"person": "Persona",
@ -28,8 +28,7 @@
"train": {
"title": "Reconocimientos Recientes",
"aria": "Seleccionar reconocimientos recientes",
"empty": "No hay intentos recientes de reconocimiento facial",
"titleShort": "Reciente"
"empty": "No hay intentos recientes de reconocimiento facial"
},
"selectItem": "Seleccionar {{item}}",
"selectFace": "Seleccionar rostro",
@ -60,10 +59,10 @@
"deletedName_one": "{{count}} rostro ha sido eliminado con éxito.",
"deletedName_many": "{{count}} rostros han sido eliminados con éxito.",
"deletedName_other": "{{count}} rostros han sido eliminados con éxito.",
"updatedFaceScore": "Puntuación del rostro actualizada con éxito a {{name}} ({{score}}).",
"deletedFace_one": "{{count}} rostro eliminado con éxito.",
"deletedFace_many": "{{count}} rostros eliminados con éxito.",
"deletedFace_other": "{{count}} rostros eliminados con éxito.",
"updatedFaceScore": "Puntuación del rostro actualizada con éxito.",
"deletedFace_one": "{{count}} rostro eliminado con éxito",
"deletedFace_many": "{{count}} rostros eliminados con éxito",
"deletedFace_other": "{{count}} rostros eliminados con éxito",
"uploadedImage": "Imagen subida con éxito.",
"renamedFace": "Rostro renombrado con éxito a {{name}}"
},

View File

@ -86,7 +86,7 @@
},
"manualRecording": {
"title": "Bajo demanda",
"tips": "Descargar una instantánea o Iniciar un evento manual basado en la configuración de retención de grabaciones de esta cámara.",
"tips": "Iniciar un evento manual basado en la configuración de retención de grabaciones de esta cámara.",
"playInBackground": {
"label": "Reproducir en segundo plano",
"desc": "Habilitar esta opción para continuar transmitiendo cuando el reproductor esté oculto."
@ -173,17 +173,7 @@
},
"noCameras": {
"title": "No hay cámaras configuradas",
"description": "Comienza conectando una cámara a Frigate.",
"buttonText": "Añade Cámara",
"restricted": {
"title": "No hay cámaras disponibles",
"description": "No tiene permiso para ver ninguna cámara en este grupo."
}
},
"snapshot": {
"takeSnapshot": "Descarga captura instantánea",
"noVideoSource": "No hay ninguna fuente de video disponible para la instantánea.",
"captureFailed": "Fallo al capturar la instantánea.",
"downloadStarted": "La descarga de la instantánea ha comenzado."
"description": "Comienza conectando una cámara.",
"buttonText": "Añade Cámara"
}
}

View File

@ -26,8 +26,7 @@
"max_speed": "Velocidad Máxima",
"recognized_license_plate": "Matrícula Reconocida",
"has_clip": "Tiene Clip",
"has_snapshot": "Tiene Instantánea",
"attributes": "Atributos"
"has_snapshot": "Tiene Instantánea"
},
"searchType": {
"thumbnail": "Miniatura",

View File

@ -50,15 +50,7 @@
"label": "Reproducir vídeos de alertas",
"desc": "De forma predeterminada, las alertas recientes en el panel en directo se reproducen como pequeños vídeos en bucle. Desactiva esta opción para mostrar solo una imagen estática de las alertas recientes en este dispositivo/navegador."
},
"title": "Panel en directo",
"displayCameraNames": {
"label": "Siempre mostrar nombres de las Camaras",
"desc": "Siempre mostrar nombres de cámaras en la vista en vivo multi-cámara."
},
"liveFallbackTimeout": {
"label": "Tiempo de espera de respaldo del reproductor en vivo",
"desc": "Cuando la reproducción en vivo de alta calidad de la cámara no está disponible, se usará el modo de ancho de banda bajo después de este número de segundos. Por defecto: 3."
}
"title": "Panel en directo"
},
"cameraGroupStreaming": {
"desc": "La configuración de transmisión de cada grupo de cámaras se guarda en el almacenamiento local de tu navegador.",
@ -240,8 +232,7 @@
"mustNotBeSameWithCamera": "El nombre de la zona no debe ser el mismo que el nombre de la cámara.",
"hasIllegalCharacter": "El nombre de la zona contiene caracteres no permitidos.",
"mustBeAtLeastTwoCharacters": "El nombre de la zona debe tener al menos 2 caracteres.",
"mustNotContainPeriod": "El nombre de la zona no debe contener puntos.",
"mustHaveAtLeastOneLetter": "El nombre de la Zona debe contener al menos una letra."
"mustNotContainPeriod": "El nombre de la zona no debe contener puntos."
}
},
"distance": {
@ -307,7 +298,7 @@
"name": {
"title": "Nombre",
"inputPlaceHolder": "Introduce un nombre…",
"tips": "El nombre debe tener al menos 2 caracteres, al menos 1 letra y no debe coincidir con el nombre de una cámara ni de otra zona."
"tips": "El nombre debe tener al menos 2 caracteres y no debe ser el nombre de una cámara ni de otra zona."
},
"documentTitle": "Editar Zona - Frigate",
"clickDrawPolygon": "Haz clic para dibujar un polígono en la imagen.",
@ -335,7 +326,7 @@
"point_other": "{{count}} puntos",
"allObjects": "Todos los objetos",
"toast": {
"success": "La zona ({{zoneName}}) ha sido guardada."
"success": "La zona ({{zoneName}}) ha sido guardada. Reinicia Frigate para aplicar los cambios."
}
},
"toast": {
@ -369,8 +360,8 @@
},
"toast": {
"success": {
"noName": "La máscara de movimiento ha sido guardada.",
"title": "{{polygonName}} ha sido guardado."
"noName": "La máscara de movimiento ha sido guardada. Reinicia Frigate para aplicar los cambios.",
"title": "{{polygonName}} ha sido guardado. Reinicia Frigate para aplicar los cambios."
}
},
"documentTitle": "Editar Máscara de Movimiento - Frigate",
@ -395,8 +386,8 @@
},
"toast": {
"success": {
"noName": "La máscara de objetos ha sido guardada.",
"title": "{{polygonName}} ha sido guardado."
"noName": "La máscara de objetos ha sido guardada. Reinicia Frigate para aplicar los cambios.",
"title": "{{polygonName}} ha sido guardado. Reinicia Frigate para aplicar los cambios."
}
},
"point_one": "{{count}} punto",
@ -518,7 +509,7 @@
"role": "Rol",
"noUsers": "No se encontraron usuarios.",
"changeRole": "Cambiar el rol del usuario",
"password": "Restablecer Contraseña",
"password": "Contraseña",
"deleteUser": "Eliminar usuario"
},
"dialog": {
@ -543,16 +534,7 @@
"veryStrong": "Muy fuerte"
},
"match": "Las contraseñas coinciden",
"notMatch": "Las contraseñas no coinciden",
"show": "Mostrar contraseña",
"hide": "Ocultar contraseña",
"requirements": {
"title": "Requisitos de contraseña:",
"length": "Al menos 8 caracteres",
"uppercase": "Al menos una mayúscula",
"digit": "Al menos un número",
"special": "Al menos un caracter especial (!@#$%^&*(),.?\":{}|<>)"
}
"notMatch": "Las contraseñas no coinciden"
},
"newPassword": {
"title": "Nueva contraseña",
@ -562,23 +544,14 @@
}
},
"usernameIsRequired": "Se requiere el nombre de usuario",
"passwordIsRequired": "Se requiere contraseña",
"currentPassword": {
"title": "Contraseña actual",
"placeholder": "Introduzca su contraseña actual"
}
"passwordIsRequired": "Se requiere contraseña"
},
"passwordSetting": {
"updatePassword": "Actualizar contraseña para {{username}}",
"setPassword": "Establecer contraseña",
"desc": "Crear una contraseña fuerte para asegurar esta cuenta.",
"cannotBeEmpty": "La contraseña no puede estar vacía",
"doNotMatch": "Las contraseñas no coinciden",
"currentPasswordRequired": "Se requiere la contraseña actual",
"incorrectCurrentPassword": "La contraseña actual es incorrecta",
"passwordVerificationFailed": "Fallo al verificar la contraseña",
"multiDeviceWarning": "Cualquier otro dispositivo en el que haya iniciado sesión deberá iniciar sesión nuevamente con {{refresh_time}}.",
"multiDeviceAdmin": "También puede obligar a todos los usuarios a volver a autenticarse inmediatamente rotando su secreto JWT."
"doNotMatch": "Las contraseñas no coinciden"
},
"createUser": {
"desc": "Añadir una nueva cuenta de usuario y especificar un rol para el acceso a áreas de la interfaz de usuario de Frigate.",
@ -605,7 +578,7 @@
"desc": "Esta acción no se puede deshacer. Esto eliminará permanentemente la cuenta de usuario y eliminará todos los datos asociados."
}
},
"updatePassword": "Restablecer contraseña"
"updatePassword": "Actualizar contraseña"
},
"notification": {
"title": "Notificaciones",
@ -772,7 +745,7 @@
"triggers": {
"documentTitle": "Disparadores",
"management": {
"title": "Disparadores",
"title": "Gestión de disparadores",
"desc": "Gestionar disparadores para {{camera}}. Usa el tipo de miniatura para activar en miniaturas similares al objeto rastreado seleccionado, y el tipo de descripción para activar en descripciones similares al texto que especifiques."
},
"addTrigger": "Añadir Disparador",
@ -793,9 +766,7 @@
},
"actions": {
"alert": "Marcar como Alerta",
"notification": "Enviar Notificación",
"sub_label": "Añadir una subetiqueta",
"attribute": "Añadir atributo"
"notification": "Enviar Notificación"
},
"dialog": {
"createTrigger": {
@ -813,22 +784,19 @@
"form": {
"name": {
"title": "Nombre",
"placeholder": "Asigne nombre a este disparador",
"placeholder": "Entre nombre de disparador",
"error": {
"minLength": "El campo debe tener al menos 2 caracteres.",
"invalidCharacters": "El campo sólo puede contener letras, números, guiones bajos, y guiones.",
"minLength": "El nombre debe tener al menos 2 caracteres.",
"invalidCharacters": "El nombre sólo puede contener letras, números, guiones bajos, y guiones.",
"alreadyExists": "Un disparador con este nombre ya existe para esta cámara."
},
"description": "Ingrese un nombre o descripción únicos para identificar este disparador"
}
},
"enabled": {
"description": "Activa o desactiva este disparador"
},
"type": {
"title": "Tipo",
"placeholder": "Seleccione tipo de disparador",
"description": "Se dispara cuando se detecta una descripción de objeto rastreado similar",
"thumbnail": "Se dispara cuando se detecta una miniatura de un objeto rastreado similar"
"placeholder": "Seleccione tipo de disparador"
},
"friendly_name": {
"title": "Nombre amigable",
@ -837,12 +805,12 @@
},
"content": {
"title": "Contenido",
"imagePlaceholder": "Seleccione una imagen",
"imagePlaceholder": "Seleccione una imágen",
"textPlaceholder": "Entre contenido de texto",
"error": {
"required": "El contenido es requrido."
},
"imageDesc": "Solo se muestran las 100 miniaturas más recientes. Si no encuentra la miniatura que busca, revise los objetos anteriores en Explorar y configure un disparador desde el menú.",
"imageDesc": "Seleccione una imágen para iniciar esta acción cuando una imágen similar es detectada.",
"textDesc": "Entre texto para iniciar esta acción cuando la descripción de un objecto seguido similar es detectado."
},
"threshold": {
@ -850,15 +818,14 @@
"error": {
"min": "El umbral debe ser al menos 0",
"max": "El umbral debe ser al menos 1"
},
"desc": "Establezca el umbral de similitud para este disparador. Un umbral más alto significa que se requiere una coincidencia más cercana para activar el disparador."
}
},
"actions": {
"title": "Acciones",
"error": {
"min": "Al menos una acción debe ser seleccionada."
},
"desc": "Por defecto, Frigate manda un mensaje MQTT para todos los disparadores. Las subetiquetas añaden el nombre del disparador a la etiqueta del objeto. Los atributos son metadatos de búsqueda que se almacenan por separado en los metadatos del objeto rastreado."
"desc": "Por defecto, Frigate manda un mensaje MQTT por todos los disparadores. Seleccione una acción adicional que se realizará cuando este disparador se accione."
}
}
},
@ -877,23 +844,6 @@
"updateTriggerFailed": "Fallo al actualizar el disparador: {{errorMessage}}",
"deleteTriggerFailed": "Fallo al eliminar el disparador: {{errorMessage}}"
}
},
"wizard": {
"title": "Crear disparador",
"step1": {
"description": "Configure los ajustes básicos para su disparador."
},
"step2": {
"description": "Configure el contenido que activará esta acción."
},
"step3": {
"description": "Configure el umbral y las acciones para este disparador."
},
"steps": {
"nameAndType": "Nombre y tipo",
"configureData": "Configurar datos",
"thresholdAndActions": "Umbral y acciones"
}
}
},
"roles": {
@ -915,9 +865,9 @@
"createRole": "Rol {{role}} creado exitosamente",
"updateCameras": "Cámara actualizada para el rol {{role}}",
"deleteRole": "Rol {{role}} eliminado exitosamente",
"userRolesUpdated_one": "{{count}} usuario asignado a este rol ha sido actualizado a 'revisor', que tiene acceso a todas las cámaras.",
"userRolesUpdated_many": "{{count}} usuarios asignados a este rol han sido actualizado a 'revisor', que tienen acceso a todas las cámaras.",
"userRolesUpdated_other": "{{count}} usuarios asignados a este rol han sido actualizado a 'revisor', que tienen acceso a todas las cámaras."
"userRolesUpdated_one": "{{count}} usuarios asignados a este rol han sido actualizados a 'visor', que tiene acceso a todas las cámaras.",
"userRolesUpdated_many": "",
"userRolesUpdated_other": ""
},
"error": {
"createRoleFailed": "Creación de rol fallida: {{errorMessage}}",
@ -957,271 +907,5 @@
}
}
}
},
"cameraWizard": {
"step1": {
"errors": {
"nameRequired": "El nombre de la cámara es un campo obligatorio",
"nameLength": "El nombre de la cámara debe tener 64 caracteres o menos",
"invalidCharacters": "El nombre de la cámara contiene caracteres no válidos",
"nameExists": "El nombre de la cámara ya existe",
"customUrlRtspRequired": "Las URL personalizadas deben comenzar con \"rtsp://\". Se requiere configuración manual para transmisiones de cámara sin RTSP.",
"brandOrCustomUrlRequired": "Seleccione una marca de cámara con host/IP o elija \"Otro\" con una URL personalizada"
},
"description": "Ingrese los detalles de su cámara y elija probar la cámara o seleccionar manualmente la marca.",
"cameraName": "Nombre de la Cámara",
"cameraNamePlaceholder": "Ejempo: puerta_principal o Vista del Patio trasero",
"host": "Nombre Host / Dirección IP",
"port": "Puerto",
"username": "Nombre de usuario",
"usernamePlaceholder": "Opcional",
"password": "Contraseña",
"passwordPlaceholder": "Opcional",
"selectTransport": "Seleccionar protocolo de transporte",
"cameraBrand": "Marca de la cámara",
"selectBrand": "Seleccione la marca de la cámara para la plantilla de URL",
"customUrl": "URL de transmisión personalizada",
"brandInformation": "Información de la Marca",
"brandUrlFormat": "Para cámaras con formato de URL RTSP como: {{exampleUrl}}",
"customUrlPlaceholder": "rtsp://usuario:contraseña@hostname:puerto/ruta",
"connectionSettings": "Ajustes de conexión",
"detectionMethod": "Método de detección de transmisión",
"onvifPort": "Puerto ONVIF",
"probeMode": "Cámara de sonda",
"manualMode": "Selección manual",
"detectionMethodDescription": "Pruebe la cámara con ONVIF (si es compatible) para encontrar las URL de transmisión o seleccione manualmente la marca de la cámara para usar las URL predefinidas. Para introducir una URL RTSP personalizada, elija el método manual y seleccione \"Otro\".",
"onvifPortDescription": "Para las cámaras compatibles con ONVIF, normalmente es 80 o 8080.",
"useDigestAuth": "Use autenticación digest",
"useDigestAuthDescription": "Utilice la autenticación HTTP digest para ONVIF. Algunas cámaras pueden requerir un nombre de usuario y contraseña ONVIF específicos en lugar del usuario administrador estándar."
},
"step2": {
"description": "Pruebe la cámara para detectar transmisiones disponibles o configure ajustes manuales según el método de detección seleccionado.",
"testSuccess": "Test de conexión satisfactorio!",
"testFailed": "Test de conexión fallido. Revise la informacion proporcionada e inténtelo de nuevo.",
"testFailedTitle": "Test fallido",
"streamDetails": "Detalles de la transmisión",
"probing": "Probando la cámara...",
"retry": "Re-intentar",
"testing": {
"probingMetadata": "Probando metadatos de la cámara...",
"fetchingSnapshot": "Obteniendo una instantánea de la cámara..."
},
"probeFailed": "No se pudo alcanzar la cámara: {{error}}",
"probingDevice": "Probando el dispositivo...",
"probeSuccessful": "Prueba satisfactoria",
"probeError": "Error durante la prueba",
"probeNoSuccess": "Prueba fallida",
"deviceInfo": "Información de Dispositivo",
"manufacturer": "Fabricante",
"model": "Modelo",
"firmware": "Firmware",
"profiles": "Perfiles",
"ptzSupport": "Soporte PTZ",
"autotrackingSupport": "Soporte auto-seguimiento",
"presets": "Preestablecidos",
"rtspCandidates": "Candidatos RTSP",
"rtspCandidatesDescription": "Se encontraron las siguientes URL RTSP durante el sondeo de la cámara. Pruebe la conexión para ver los metadatos de la transmisión.",
"noRtspCandidates": "No se encontraron URL RTSP de la cámara. Es posible que sus credenciales sean incorrectas o que la cámara no sea compatible con ONVIF o el método utilizado para obtener las URL RTSP. Vuelva atrás e introduzca la URL RTSP manualmente.",
"candidateStreamTitle": "Candidato {{number}}",
"useCandidate": "Uso",
"uriCopy": "Copiar",
"uriCopied": "URI copiada al portapapeles",
"testConnection": "Probar conexión",
"toggleUriView": "Haga clic para alternar la vista completa de URI",
"connected": "Conectada",
"notConnected": "No conectada",
"errors": {
"hostRequired": "nombre host/dirección IP requeridos"
}
},
"step3": {
"description": "Configure los roles de transmisión y agregue transmisiones adicionales para su cámara.",
"streamsTitle": "Transmisiones de cámara",
"addStream": "Añadir ruta de transmisión",
"addAnotherStream": "Añadir otra ruta de transmisión",
"streamTitle": "Transmisión {{number}}",
"streamUrl": "URL de transmisión",
"streamUrlPlaceholder": "rtsp://usuario:contraseña@nombrehost:puerto/ruta",
"selectStream": "Seleccione una transmisión",
"searchCandidates": "Búsqueda de candidatos...",
"noStreamFound": "No se ha encontrado transmisión",
"url": "URL",
"resolution": "Resolución",
"selectResolution": "Seleccione resolución",
"quality": "Calidad",
"selectQuality": "Seleccione calidad",
"roles": "Roles",
"roleLabels": {
"detect": "Detección de objetos",
"record": "Grabando",
"audio": "Audio"
},
"testStream": "Pruebe la conexión",
"testSuccess": "Test de transmisión satisfactorio!",
"testFailed": "Test de transmisión fallido",
"testFailedTitle": "Prueba falló",
"connected": "Conectado",
"notConnected": "No conectado",
"featuresTitle": "Características",
"go2rtc": "Reduzca conexiones hacia la cámara",
"detectRoleWarning": "al menos una transmisión debe tener el roll de detección para continuar.",
"rolesPopover": {
"title": "Roles de transmisión",
"record": "Guarda segmentos de la transmisión de video según la configuración.",
"detect": "Hilo principal para detección de objetos.",
"audio": "Hilo para detección basada en audio."
},
"featuresPopover": {
"title": "Características de transmisión",
"description": "Utilice la retransmisión go2rtc para reducir las conexiones a su cámara."
}
},
"step4": {
"description": "Validación y análisis finales antes de guardar la nueva cámara. Conecte cada transmisión antes de guardar.",
"validationTitle": "Validacion de transmisión",
"connectAllStreams": "Conectar todas las transmisiones",
"reconnectionSuccess": "Reconexión satisfactoria.",
"reconnectionPartial": "Algunas transmisiones no pudieron reconectarse.",
"streamUnavailable": "Vista previa de transmisión no disponible",
"reload": "Recargar",
"connecting": "Conectando...",
"streamTitle": "Transmisión {{number}}",
"valid": "Válido",
"failed": "Falló",
"notTested": "No probado",
"connectStream": "Conectar",
"connectingStream": "Conectando",
"disconnectStream": "Desconectar",
"estimatedBandwidth": "Ancho de banda estimado",
"roles": "Roles",
"ffmpegModule": "Utilice el modo de compatibilidad de transmisión",
"ffmpegModuleDescription": "Si la transmisión no carga después de varios intentos, intenta activar esta opción. Al activarla, Frigate usará el módulo ffmpeg con go2rtc. Esto puede mejorar la compatibilidad con algunas transmisiones de cámara.",
"none": "Ninguna",
"error": "Error",
"streamValidated": "Transmisión {{number}} validada correctamente",
"streamValidationFailed": "Stream {{number}} falló la validación",
"saveAndApply": "Guardar nueva cámara",
"saveError": "Configuración inválida. Revise la configuración.",
"issues": {
"title": "Validación de transmisión",
"videoCodecGood": "El codec de video es {{codec}}.",
"audioCodecGood": "El codec de audio es {{codec}}.",
"resolutionHigh": "Una resolución de {{resolution}} puede provocar un mayor uso de recursos.",
"resolutionLow": "Una resolución de {{resolution}} puede ser demasiado baja para una detección confiable de objetos pequeños.",
"noAudioWarning": "No se detectó audio para esta transmisión, las grabaciones no tendrán audio.",
"audioCodecRecordError": "El códec de audio AAC es necesario para admitir audio en grabaciones.",
"audioCodecRequired": "Se requiere una transmisión de audio para admitir la detección de audio.",
"restreamingWarning": "Reducir las conexiones a la cámara para la transmisión de grabación puede aumentar ligeramente el uso de la CPU.",
"brands": {
"reolink-rtsp": "No se recomienda usar Reolink RTSP. Active HTTP en la configuración del firmware de la cámara y reinicie el asistente.",
"reolink-http": "Las transmisiones HTTP de Reolink deberían usar FFmpeg para una mejor compatibilidad. Active \"Usar modo de compatibilidad de transmisiones\" para esta transmisión."
},
"dahua": {
"substreamWarning": "La subtransmisión 1 está limitada a una resolución baja. Muchas cámaras Dahua/Amcrest/EmpireTech admiten subtransmisiones adicionales que deben habilitarse en la configuración de la cámara. Se recomienda comprobar y utilizar dichas transmisiones si están disponibles."
},
"hikvision": {
"substreamWarning": "La subtransmisión 1 está limitada a una resolución baja. Muchas cámaras Hikvision admiten subtransmisiones adicionales que deben habilitarse en la configuración de la cámara. Se recomienda comprobar y utilizar dichas transmisiones si están disponibles."
}
}
},
"title": "Añadir cámara",
"description": "Siga los siguientes pasos para agregar una nueva cámara a su instalación de Frigate.",
"steps": {
"nameAndConnection": "Nombre y conexión",
"probeOrSnapshot": "Sonda de prueba o hacer instantánea",
"streamConfiguration": "Configuración de transmisión",
"validationAndTesting": "Validación y pruebas"
},
"save": {
"success": "La nueva cámara {{cameraName}} se guardó correctamente.",
"failure": "Error al guardar {{cameraName}}."
},
"testResultLabels": {
"resolution": "Resolución",
"video": "Video",
"audio": "Audio",
"fps": "FPS"
},
"commonErrors": {
"noUrl": "Proporcione una URL de transmisión válida",
"testFailed": "Prueba de transmisión fallida: {{error}}"
}
},
"cameraManagement": {
"title": "Administrar cámaras",
"addCamera": "Añadir nueva cámara",
"editCamera": "Editar cámara:",
"selectCamera": "Seleccione una cámara",
"backToSettings": "Volver a configuración de la cámara",
"streams": {
"title": "Habilitar/deshabilitar cámaras",
"desc": "Desactiva temporalmente una cámara hasta que Frigate se reinicie. Desactivar una cámara detiene por completo el procesamiento de las transmisiones de Frigate. La detección, la grabación y la depuración no estarán disponibles.<br /> <em>Nota: Esto no desactiva las retransmisiones de go2rtc.</em>"
},
"cameraConfig": {
"add": "Añadir cámara",
"edit": "Editar cámara",
"description": "Configure los ajustes de la cámara, incluidas las entradas de transmisión y los roles.",
"name": "Nombre de la cámara",
"nameRequired": "El nombre de la cámara es obligatorio",
"nameLength": "El nombre de la cámara debe ser inferior a 64 caracteres.",
"namePlaceholder": "Ejemplo: puerta_principal o Vista general de patio trasero",
"enabled": "Habilitada",
"ffmpeg": {
"inputs": "Transmisiones entrantes",
"path": "Ruta de transmisión",
"pathRequired": "La ruta de transmisión es requerida",
"pathPlaceholder": "rtsp://...",
"roles": "Roles",
"rolesRequired": "Al menos un rol es requerido",
"rolesUnique": "Cada rol (audio, detección, grabación) puede únicamente asignarse a una transmisión",
"addInput": "Añadir transmision entrante",
"removeInput": "Elimine transmisión entrante",
"inputsRequired": "Se requiere al menos una transmisión entrante"
},
"go2rtcStreams": "Transmisiones go2rtc",
"streamUrls": "URLs de transmisión",
"addUrl": "Añadir URL",
"addGo2rtcStream": "Añadir transmisión go2rtc",
"toast": {
"success": "Cámara {{cameraName}} guardada correctamente"
}
}
},
"cameraReview": {
"title": "Configuración de revisión de la cámara",
"object_descriptions": {
"title": "Descripciones de objetos de IA generativa",
"desc": "Habilite o deshabilite temporalmente las descripciones de objetos generadas por IA para esta cámara. Al deshabilitarlas, no se solicitarán descripciones generadas por IA para los objetos rastreados en esta cámara."
},
"review_descriptions": {
"title": "Revisión de descripciones de IA generativa",
"desc": "Habilita o deshabilita temporalmente las revisión de descripciones generadas por IA para esta cámara. Al deshabilitarlas, no se solicitarán descripciones generadas por IA para los elementos de revisión de esta cámara."
},
"review": {
"title": "Revisar",
"desc": "Habilite o deshabilite temporalmente las alertas y detecciones de esta cámara hasta que Frigate se reinicie. Al deshabilitarlas, no se generarán nuevas revisiones. ",
"alerts": "Alertas ",
"detections": "Detecciones "
},
"reviewClassification": {
"title": "Clasificación de la revisión",
"desc": "Frigate clasifica los elementos de revisión como Alertas y Detecciones. De forma predeterminada, todos los objetos de <em>persona</em> y <em>coche</em> se consideran Alertas. Puede refinar la categorización de sus elementos de revisión configurando las zonas requeridas para ellos.",
"noDefinedZones": "No hay Zonas definidas para esta cámara.",
"objectAlertsTips": "Todos los objetos {{alertsLabels}} en {{cameraName}} se mostrarán como alertas.",
"zoneObjectAlertsTips": "Todos los objetos {{alertsLabels}} detectados en {{zone}} en {{cameraName}} se mostrarán como alertas.",
"objectDetectionsTips": "Todos los objetos {{detectionsLabels}} no categorizados en {{cameraName}} se mostrarán como Detecciones independientemente de la zona en la que se encuentren.",
"zoneObjectDetectionsTips": {
"text": "Todos los objetos {{detectionsLabels}} no categorizados en {{zone}} en {{cameraName}} se mostrarán como Detecciones.",
"notSelectDetections": "Todos los objetos {{detectionsLabels}} detectados en {{zone}} en {{cameraName}} que no estén categorizados como Alertas se mostrarán como Detecciones independientemente de la zona en la que se encuentren.",
"regardlessOfZoneObjectDetectionsTips": "Todos los objetos {{detectionsLabels}} no categorizados en {{cameraName}} se mostrarán como Detecciones independientemente de la zona en la que se encuentren."
},
"unsavedChanges": "Configuración de clasificación de revisión no guardadas para {{camera}}",
"selectAlertsZones": "Seleccione Zonas para Alertas",
"selectDetectionsZones": "Seleccione Zonas para la Detección",
"limitDetections": "Limite la detección a zonas específicas",
"toast": {
"success": "Se ha guardado la configuración de la clasificación de revisión. Reinicie Frigate para aplicar los cambios."
}
}
}
}

View File

@ -76,22 +76,12 @@
},
"gpuMemory": "Memoria de GPU",
"npuMemory": "Memoria de NPU",
"npuUsage": "Uso de NPU",
"intelGpuWarning": {
"title": "Aviso de estadísticas Intel GPU",
"message": "Estadísticas de GPU no disponibles",
"description": "Este es un error conocido en las herramientas de informes de estadísticas de GPU de Intel (intel_gpu_top). El error se produce y muestra repetidamente un uso de GPU del 0 %, incluso cuando la aceleración de hardware y la detección de objetos se ejecutan correctamente en la (i)GPU. No se trata de un error de Frigate. Puede reiniciar el host para solucionar el problema temporalmente y confirmar que la GPU funciona correctamente. Esto no afecta al rendimiento."
}
"npuUsage": "Uso de NPU"
},
"otherProcesses": {
"title": "Otros Procesos",
"processCpuUsage": "Uso de CPU del Proceso",
"processMemoryUsage": "Uso de Memoria del Proceso",
"series": {
"go2rtc": "go2rtc",
"recording": "grabación",
"review_segment": "revisar segmento"
}
"processMemoryUsage": "Uso de Memoria del Proceso"
}
},
"storage": {
@ -179,19 +169,9 @@
"plate_recognition": "Reconocimiento de Matrículas",
"yolov9_plate_detection": "Detección de Matrículas YOLOv9",
"image_embedding": "Incrustación de Imágenes",
"yolov9_plate_detection_speed": "Velocidad de Detección de Matrículas YOLOv9",
"review_description": "Revisión de descripción",
"review_description_speed": "Velocidad de revisión de la descripción",
"review_description_events_per_second": "Revisión de la descripción",
"object_description": "Descripción de Objeto",
"object_description_speed": "Velocidad de descripción de objeto",
"object_description_events_per_second": "Descripción de objeto",
"classification": "Clasificación de {{name}}",
"classification_speed": "Velocidad de clasificación de {{name}}",
"classification_events_per_second": "Clasificacion de eventos por segundo de {{name}}"
"yolov9_plate_detection_speed": "Velocidad de Detección de Matrículas YOLOv9"
},
"title": "Enriquecimientos",
"averageInf": "Tiempo promedio de inferencia"
"title": "Enriquecimientos"
},
"stats": {
"ffmpegHighCpuUsage": "{{camera}} tiene un uso elevado de CPU por FFmpeg ({{ffmpegAvg}}%)",

View File

@ -55,63 +55,5 @@
"toothbrush": "Hambahari",
"vehicle": "Sõiduk",
"bark": "Puukoor",
"goat": "Kits",
"snort": "Nuuskamine",
"cough": "Köhimine",
"throat_clearing": "Kurgu puhtaksköhatamine",
"sneeze": "Aevastamine",
"sniff": "Nuuskimine",
"run": "Jooksmine",
"cheering": "Hõiskamine",
"synthetic_singing": "Sünteesitud laulmine",
"rapping": "Räppimine",
"humming": "Ümisemine",
"groan": "Oigamine",
"grunt": "Röhatamine",
"chatter": "Jutuvada",
"shuffle": "Jalgade lohistamine",
"footsteps": "Sammumise heli",
"chewing": "Närimine",
"biting": "Hammustamine",
"gargling": "Kuristamine",
"stomach_rumble": "Kõhukorin",
"burping": "Röhitsemine",
"hiccup": "Luksumine",
"fart": "Peeretamine",
"yip": "Haukumine heleda häälega",
"howl": "Ulgumine",
"bow_wow": "Haukumise imiteerimine",
"growling": "Urisemine",
"whimper_dog": "Koera nuuksumine",
"purr": "Nurrumine",
"meow": "Näugumine",
"hiss": "Sisisemine",
"caterwaul": "Kräunumine",
"livestock": "Kariloomad",
"bleat": "Määgimine",
"dogs": "Koerad",
"rats": "Rotid",
"patter": "Pladin",
"insect": "Putukas",
"cricket": "Ritsikas",
"mosquito": "Sääsk",
"fly": "Kärbes",
"clip_clop": "Kabjaklobin",
"neigh": "Hirnumine",
"cattle": "Loomakari",
"moo": "Ammumine",
"cowbell": "Lehmakell",
"pig": "Siga",
"oink": "Röhkimine",
"fowl": "Kodulinnud",
"chicken": "Kana",
"cluck": "Kanade loksumine",
"cock_a_doodle_doo": "Kukeleegu",
"turkey": "Kalkun",
"gobble": "Kalkuni kulistamine",
"duck": "Part",
"quack": "Prääksumine",
"goose": "Hani",
"honk": "Kaagatamine",
"wild_animals": "Metsloomad"
"goat": "Kits"
}

View File

@ -240,8 +240,7 @@
"show": "Näita: {{item}}",
"all": "Kõik",
"ID": "Tunnus",
"none": "Puudub",
"other": "Muu"
"none": "Puudub"
},
"list": {
"two": "{{0}} ja {{1}}",

View File

@ -1,51 +1,8 @@
{
"noRecordingsFoundForThisTime": "Hetkel ei leidu ühtegi salvestust",
"noRecordingsFoundForThisTime": "Hetkel ei leidu ühtego salvestust",
"noPreviewFound": "Eelvaadet ei leidu",
"noPreviewFoundFor": "{{cameraName}} kaamera eelvaadet ei leidu",
"submitFrigatePlus": {
"submit": "Saada",
"title": "Kas saadad selle kaadri Frigate+ teenusesse?"
},
"cameraDisabled": "Kaamera on kasutuselt eemaldatud",
"stats": {
"streamType": {
"title": "Voogedastuse tüüp:",
"short": "Tüüp"
},
"bandwidth": {
"title": "Ribalaius:",
"short": "Ribalaius"
},
"latency": {
"title": "Latentsus:",
"value": "{{seconds}} sekundit",
"short": {
"title": "Latentsus",
"value": "{{seconds}} sek"
}
},
"totalFrames": "Kaadreid kokku:",
"droppedFrames": {
"title": "Vahelejäänud kaadreid:",
"short": {
"title": "Vahelejäänud",
"value": "{{droppedFrames}} kaadrit"
}
},
"decodedFrames": "Dekodeeritud kaadreid:",
"droppedFrameRate": "Vahelejäänud kaadrite sagedus:"
},
"livePlayerRequiredIOSVersion": "Selle voogedastuse tüübi jaoks on vajalik iOS-i versioon 17.1 või uuem.",
"streamOffline": {
"title": "Voogedastus ei toimi",
"desc": "„{{cameraName}}“ <code>detect</code>-tüüpi voogedastusest pole tulnud ühtegi kaadrit. Täpsemat teavet leiad vealogidest"
},
"toast": {
"success": {
"submittedFrigatePlus": "Kaadri saatmine Frigate+ teenusesse õnnestus"
},
"error": {
"submitFrigatePlusFailed": "Kaadri saatmine Frigate+ teenusesse ei õnnestunud"
}
"submit": "Saada"
}
}

View File

@ -7,18 +7,10 @@
},
"documentTitle": "Klassifitseerimise mudelid - Frigate",
"details": {
"scoreInfo": "Skoor näitab selle objekti kõigi tuvastuste keskmist klassifitseerimise usaldusväärsust.",
"none": "Puudub",
"unknown": "Pole teada"
"scoreInfo": "Skoor näitab selle objekti kõigi tuvastuste keskmist klassifitseerimise usaldusväärsust."
},
"button": {
"deleteClassificationAttempts": "Kustuta klassifitseerimispildid",
"renameCategory": "Muuda klassi nimi",
"deleteCategory": "Kustuta klass",
"deleteImages": "Kustuta pildid",
"addClassification": "Lisa klassifikatsioon",
"deleteModels": "Kustuta mudelid",
"editModel": "Muuda mudelit"
"deleteClassificationAttempts": "Kustuta klassifitseerimispildid"
},
"description": {
"invalidName": "Vigane nimi. Nimed võivad sisaldada ainult tähti, numbreid, tühikuid, ülakomasid, alakriipse ja sidekriipse."
@ -40,8 +32,5 @@
"allImagesRequired_one": "Palun klassifitseeri kõik pildid. Jäänud on veel {{count}} pilt.",
"allImagesRequired_other": "Palun klassifitseeri kõik pildid. Jäänud on veel {{count}} pilti."
}
},
"tooltip": {
"trainingInProgress": "Mudel on parasjagu õppimas"
}
}

View File

@ -22,11 +22,7 @@
"empty": {
"alert": "Ülevaatamiseks ei leidu ühtegi häiret",
"detection": "Ülevaatamiseks ei leidu ühtegi tuvastamist",
"motion": "Liikumise andmeid ei leidu",
"recordingsDisabled": {
"title": "Salvestamine peab olema sisse lülitatud",
"description": "Objekte saad määrata ülevaadatamiseks vaid siis, kui selle kaamera puhul on salvestamine lülitatud sisse."
}
"motion": "Liikumise andmeid ei leidu"
},
"select_all": "Kõik",
"camera": "Kaamera",

View File

@ -22,19 +22,7 @@
"title": "Näita kõiki tsoone",
"desc": "Kui objekt on sisenenud tsooni, siis alati näida tsooni märgistust."
}
},
"lifecycleItemDesc": {
"attribute": {
"other": "{{label}} on tuvastatud kui {{attribute}}"
},
"stationary": "{{label}} jäi paigale",
"active": "{{label}} muutus aktiivseks",
"entered_zone": "{{label}} sisenes tsooni {{zones}}",
"visible": "{{label}} on tuvastatud"
},
"title": "Jälgimise üksikasjad",
"noImageFound": "Selle ajatempli kohta ei leidu pilti.",
"createObjectMask": "Loo objektimask"
}
},
"documentTitle": "Avasta - Frigate",
"generativeAI": "Generatiivne tehisaru",
@ -45,18 +33,13 @@
"thumbnailsEmbedded": "Pisipildid on lõimitud: ",
"descriptionsEmbedded": "Kirjeldused on lõimitud: ",
"trackedObjectsProcessed": "Jälgitud objektid on töödeldud: "
},
"startingUp": "Käivitun…",
"estimatedTime": "Hinnanguliselt jäänud aega:",
"finishingShortly": "Lõpetan õige pea"
}
}
},
"type": {
"details": "üksikasjad",
"thumbnail": "pisipilt",
"snapshot": "hetkvõte",
"video": "video",
"tracking_details": "jälgimise üksikasjad"
"snapshot": "hetkvõte"
},
"details": {
"item": {
@ -68,7 +51,6 @@
"snapshotScore": {
"label": "Hetkvõttete punktiskoor"
},
"regenerateFromSnapshot": "Loo uuesti hetkvõttest",
"timestamp": "Ajatampel"
"regenerateFromSnapshot": "Loo uuesti hetkvõttest"
}
}

View File

@ -30,9 +30,5 @@
"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."
},
"details": {
"timestamp": "Ajatampel",
"unknown": "Pole teada"
}
}

View File

@ -91,10 +91,6 @@
"available": "Kahepoolne kõneside on selle voogedastuse puhul saadaval",
"unavailable": "Kahepoolne kõneside pole selle voogedastuse puhul saadaval",
"tips": "Sinu seadme peab seda funktsionaalsust toetama ja WebRTC peab olema kahepoolse kõneside jaoks seadistatud."
},
"playInBackground": {
"label": "Esita taustal",
"tips": "Selle eelistusega saad määrata, et voogedastus jääb tööle ka siis, kui meesiaesitaja on suletud."
}
},
"notifications": "Teavitused",
@ -123,12 +119,5 @@
"label": "Esita taustal",
"desc": "Kasuta seda valikut, kui tahad voogedastuse jätkumist ka siis, kui pildivaade on peidetud."
}
},
"noCameras": {
"buttonText": "Lisa kaamera",
"restricted": {
"title": "Ühtegi kaamerat pole saadaval",
"description": "Sul pole õigust ühegi selle grupi kaamera vaatamiseks."
}
}
}

View File

@ -8,16 +8,11 @@
"button": {
"clear": "Tühjenda otsing",
"save": "Salvesta otsing",
"delete": "Kustuta salvestatud otsing",
"filterInformation": "Filtri teave"
"delete": "Kustuta salvestatud otsing"
},
"filter": {
"label": {
"has_snapshot": "Leidub hetkvõte",
"cameras": "Kaamerad",
"labels": "Sildid",
"zones": "Tsoonid",
"sub_labels": "Alamsildid"
"has_snapshot": "Leidub hetkvõte"
}
}
}

View File

@ -7,11 +7,6 @@
"logs": {
"download": {
"label": "Laadi logid alla"
},
"copy": {
"label": "Kopeeri lõikelauale",
"success": "Logid on kopeeritud lõikelauale"
}
},
"title": "Süsteem"
}
}

View File

@ -23,481 +23,5 @@
"bus": "اتوبوس",
"motorcycle": "موتور سیکلت",
"train": "قطار",
"bicycle": "دوچرخه",
"child_singing": "آواز خواندن کودک",
"snort": "خرناس",
"cough": "سرفه",
"throat_clearing": "صاف کردن گلو",
"sneeze": "عطسه",
"sniff": "بو کشیدن",
"run": "دویدن",
"synthetic_singing": "آواز مصنوعی",
"rapping": "رپ‌خوانی",
"humming": "هوم‌خوانی",
"sheep": "گوسفند",
"groan": "ناله",
"grunt": "غرغر",
"whistling": "سوت زدن",
"breathing": "تنفس",
"wheeze": "خِس‌خِس",
"snoring": "خروپف",
"gasp": "به نفس‌نفس افتادن",
"pant": "نفس‌نفس‌زدن",
"shuffle": "پخش تصادفی",
"footsteps": "صدای قدم‌ها",
"chewing": "جویدن",
"biting": "گاز گرفتن",
"camera": "دوربین",
"gargling": "غرغره کردنغرغره کردن",
"stomach_rumble": "قاروقور شکم",
"burping": "آروغ زدن",
"skateboard": "اسکیت‌بورد",
"yip": "ییپ",
"howl": "زوزه",
"growling": "درحال غرغر",
"meow": "میو",
"caterwaul": "جیغ‌وداد",
"livestock": "دام",
"clip_clop": "تق‌تق",
"cattle": "گوساله",
"cowbell": "زنگولهٔ گاو",
"mouse": "موش",
"oink": "خِرخِر",
"keyboard": "صفحه‌کلید",
"goat": "بز",
"sink": "سینک",
"cluck": "قُدقُد",
"turkey": "بوقلمون",
"quack": "قاقا",
"scissors": "قیچی",
"honk": "بوق",
"hair_dryer": "سشوار",
"roar": "غرش",
"vehicle": "وسیلهٔ نقلیه",
"chirp": "جیک‌جیک",
"squawk": "جیغ زدن",
"coo": "قوقو",
"crow": "کلاغ",
"owl": "جغد",
"dogs": "سگ‌ها",
"patter": "شرشر",
"mosquito": "پشه",
"buzz": "وزوز",
"frog": "قورباغه",
"snake": "مار",
"rattle": "جغجغه کردن",
"music": "موسیقی",
"musical_instrument": "ساز موسیقی",
"guitar": "گیتار",
"electric_guitar": "گیتار برقی",
"acoustic_guitar": "گیتار آکوستیک",
"steel_guitar": "گیتار استیل",
"banjo": "بانجو",
"sitar": "سیتار",
"hiccup": "سکسکه",
"fart": "باد معده",
"finger_snapping": "بشکن زدن",
"clapping": "دست زدن",
"heartbeat": "ضربان قلب",
"heart_murmur": "سوفل قلبی",
"applause": "تشویق",
"chatter": "وراجی",
"crowd": "جمعیت",
"children_playing": "بازی کردن کودکان",
"animal": "حیوان",
"pets": "حیوانات خانگی",
"bark": "پارس",
"bow_wow": "هاپ‌هاپ",
"whimper_dog": "نالیدن سگ",
"purr": "خرخر",
"hiss": "هیس",
"neigh": "شیهه",
"door": "در",
"moo": "ماغ",
"pig": "خوک",
"bleat": "بع‌بع",
"fowl": "ماکیان",
"cock_a_doodle_doo": "قدقدی‌قدقد",
"blender": "مخلوط‌کن",
"chicken": "مرغ",
"gobble": "قورت دادن",
"clock": "ساعت",
"duck": "اردک",
"goose": "غاز",
"wild_animals": "حیوانات وحشی",
"toothbrush": "مسواک",
"roaring_cats": "غرش گربه‌ها",
"pigeon": "کبوتر",
"hoot": "هوهو",
"flapping_wings": "بال‌بال زدن",
"rats": "موش‌ها",
"insect": "حشره",
"cricket": "جیرجیرک",
"fly": "مگس",
"croak": "قارقار",
"whale_vocalization": "آواز نهنگ",
"plucked_string_instrument": "ساز زهی زخمه‌ای",
"bass_guitar": "گیتار باس",
"tapping": "ضربه‌زدن",
"strum": "زخمه‌زدن",
"mandolin": "ماندولین",
"zither": "زیتر",
"ukulele": "یوکللی",
"piano": "پیانو",
"electric_piano": "پیانوی الکتریکی",
"organ": "ارگ",
"electronic_organ": "ارگ الکترونیکی",
"hammond_organ": "ارگ هموند",
"synthesizer": "سینتی‌سایزر",
"sampler": "سمپلر",
"harpsichord": "هارپسیکورد",
"percussion": "سازهای کوبه‌ای",
"drum_kit": "ست درام",
"drum_machine": "درام ماشین",
"drum": "درام",
"snare_drum": "درام اسنیر",
"rimshot": "ریم‌شات",
"drum_roll": "درام رول",
"bass_drum": "درام باس",
"timpani": "تیمپانی",
"tabla": "طبلا",
"cymbal": "سنج",
"hi_hat": "های‌هت",
"wood_block": "بلوک چوبی",
"tambourine": "تامبورین",
"maraca": "ماراکا",
"gong": "گونگ",
"tubular_bells": "ناقوس‌های لوله‌ای",
"mallet_percussion": "سازهای کوبه‌ای مالت",
"marimba": "ماریمبا",
"glockenspiel": "گلوکن‌اشپیل",
"vibraphone": "ویبرافون",
"steelpan": "استیل‌پن",
"orchestra": "ارکستر",
"brass_instrument": "ساز بادی برنجی",
"french_horn": "هورن فرانسوی",
"trumpet": "ترومپت",
"trombone": "ترومبون",
"bowed_string_instrument": "ساز زهی آرشه‌ای",
"string_section": "بخش سازهای زهی",
"violin": "ویولن",
"pizzicato": "پیتزیکاتو",
"cello": "ویولنسل",
"double_bass": "کنترباس",
"wind_instrument": "ساز بادی",
"flute": "فلوت",
"saxophone": "ساکسوفون",
"clarinet": "کلارینت",
"harp": "چنگ",
"bell": "ناقوس",
"church_bell": "ناقوس کلیسا",
"jingle_bell": "زنگوله",
"bicycle_bell": "زنگ دوچرخه",
"tuning_fork": "دیاپازون",
"chime": "زنگ",
"wind_chime": "زنگ باد",
"harmonica": "سازدهنی",
"accordion": "آکاردئون",
"bagpipes": "نی‌انبان",
"didgeridoo": "دیجریدو",
"theremin": "ترمین",
"singing_bowl": "کاسهٔ آوازخوان",
"scratching": "خراشیدن",
"pop_music": "موسیقی پاپ",
"hip_hop_music": "موسیقی هیپ‌هاپ",
"beatboxing": "بیت‌باکس",
"rock_music": "موسیقی راک",
"heavy_metal": "هوی متال",
"punk_rock": "پانک راک",
"grunge": "گرانج",
"progressive_rock": "راک پراگرسیو",
"rock_and_roll": "راک اند رول",
"psychedelic_rock": "راک روان‌گردان",
"rhythm_and_blues": "ریتم اند بلوز",
"soul_music": "موسیقی سول",
"reggae": "رگی",
"country": "کانتری",
"swing_music": "موسیقی سوئینگ",
"bluegrass": "بلوگرس",
"funk": "فانک",
"folk_music": "موسیقی فولک",
"jazz": "جاز",
"disco": "دیسکو",
"classical_music": "موسیقی کلاسیک",
"opera": "اپرا",
"electronic_music": "موسیقی الکترونیک",
"house_music": "موسیقی هاوس",
"techno": "تکنو",
"dubstep": "داب‌استپ",
"drum_and_bass": "درام اند بیس",
"electronica": "الکترونیکا",
"electronic_dance_music": "موسیقی رقص الکترونیک",
"ambient_music": "موسیقی امبینت",
"trance_music": "موسیقی ترنس",
"music_of_latin_america": "موسیقی آمریکای لاتین",
"salsa_music": "موسیقی سالسا",
"flamenco": "فلامنکو",
"blues": "بلوز",
"music_for_children": "موسیقی برای کودکان",
"new-age_music": "موسیقی نیو ایج",
"vocal_music": "موسیقی آوازی",
"a_capella": "آکاپلا",
"music_of_africa": "موسیقی آفریقا",
"afrobeat": "آفروبیت",
"christian_music": "موسیقی مسیحی",
"gospel_music": "موسیقی گاسپل",
"music_of_asia": "موسیقی آسیا",
"carnatic_music": "موسیقی کارناتیک",
"music_of_bollywood": "موسیقی بالیوود",
"ska": "اسکا",
"traditional_music": "موسیقی سنتی",
"independent_music": "موسیقی مستقل",
"song": "آهنگ",
"background_music": "موسیقی پس‌زمینه",
"theme_music": "موسیقی تم",
"soundtrack_music": "موسیقی متن",
"lullaby": "لالایی",
"video_game_music": "موسیقی بازی‌های ویدیویی",
"christmas_music": "موسیقی کریسمس",
"dance_music": "موسیقی رقص",
"wedding_music": "موسیقی عروسی",
"happy_music": "موسیقی شاد",
"sad_music": "موسیقی غمگین",
"tender_music": "موسیقی لطیف",
"angry_music": "موسیقی خشمگین",
"exciting_music": "موسیقی هیجان‌انگیز",
"scary_music": "موسیقی ترسناک",
"wind": "باد",
"rustling_leaves": "خش‌خش برگ‌ها",
"wind_noise": "صدای باد",
"thunderstorm": "طوفان تندری",
"thunder": "رعد",
"water": "آب",
"rain": "باران",
"raindrop": "قطرهٔ باران",
"rain_on_surface": "باران روی سطح",
"waterfall": "آبشار",
"ocean": "اقیانوس",
"waves": "امواج",
"steam": "بخار",
"gurgling": "قل‌قل",
"motorboat": "قایق موتوری",
"ship": "کشتی",
"motor_vehicle": "وسیلهٔ نقلیهٔ موتوری",
"toot": "توت",
"car_alarm": "دزدگیر خودرو",
"truck": "کامیون",
"air_brake": "ترمز بادی",
"air_horn": "بوق بادی",
"reversing_beeps": "بوق دنده‌عقب",
"ice_cream_truck": "کامیون بستنی‌فروشی",
"traffic_noise": "صدای ترافیک",
"rail_transport": "حمل‌ونقل ریلی",
"train_whistle": "سوت قطار",
"train_horn": "بوق قطار",
"jet_engine": "موتور جت",
"propeller": "ملخ",
"helicopter": "بالگرد",
"fixed-wing_aircraft": "هواپیمای بال‌ثابت",
"medium_engine": "موتور متوسط",
"heavy_engine": "موتور سنگین",
"engine_knocking": "تق‌تق موتور",
"engine_starting": "روشن شدن موتور",
"idling": "درجا کار کردن",
"slam": "محکم کوبیدن",
"knock": "در زدن",
"tap": "ضربهٔ آرام",
"squeak": "جیرجیر",
"cupboard_open_or_close": "باز یا بسته شدن کمد",
"microwave_oven": "مایکروفر",
"water_tap": "شیر آب",
"bathtub": "وان حمام",
"toilet_flush": "سیفون توالت",
"keys_jangling": "جرینگ‌جرینگ کلیدها",
"coin": "سکه",
"electric_shaver": "ریش‌تراش برقی",
"shuffling_cards": "بر زدنِ کارت‌ها",
"telephone_bell_ringing": "زنگ خوردن تلفن",
"ringtone": "زنگ تماس",
"telephone_dialing": "شماره‌گیری تلفن",
"dial_tone": "بوق آزاد",
"busy_signal": "بوق اشغال",
"alarm_clock": "ساعت زنگ‌دار",
"fire_alarm": "هشدار آتش‌سوزی",
"foghorn": "بوق مه",
"whistle": "سوت",
"steam_whistle": "سوت بخار",
"mechanisms": "سازوکارها",
"pulleys": "قرقره‌ها",
"sewing_machine": "چرخ خیاطی",
"mechanical_fan": "پنکهٔ مکانیکی",
"air_conditioning": "تهویهٔ مطبوع",
"cash_register": "صندوق فروش",
"jackhammer": "چکش بادی",
"sawing": "اره‌کردن",
"drill": "دریل",
"sanding": "سنباده‌کاری",
"power_tool": "ابزار برقی",
"filing": "سوهان‌کاری",
"artillery_fire": "آتش توپخانه",
"cap_gun": "تفنگ ترقه‌ای",
"fireworks": "آتش‌بازی",
"firecracker": "ترقه",
"burst": "ترکیدن",
"crack": "ترک",
"glass": "شیشه",
"chink": "جرینگ",
"shatter": "خُرد شدن",
"silence": "سکوت",
"television": "تلویزیون",
"radio": "رادیو",
"field_recording": "ضبط میدانی",
"scream": "جیغ",
"chird": "جیرجیر",
"change_ringing": "زنگ خوردن پول خرد",
"shofar": "شوفار",
"liquid": "مایع",
"splash": "پاشیدن",
"gush": "فوران",
"fill": "پر کردن",
"spray": "اسپری",
"pump": "پمپ",
"stir": "هم زدن",
"thunk": "صدای افتادن",
"electronic_tuner": "تیونر الکترونیکی",
"effects_unit": "واحد افکت‌ها",
"chorus_effect": "افکت کُر",
"basketball_bounce": "پرش توپ بسکتبال",
"bouncing": "پرش",
"whip": "شلاق",
"flap": "بال‌بال زدن",
"scratch": "خراشیدن",
"scrape": "ساییدن",
"beep": "بیپ",
"ping": "پینگ",
"ding": "دینگ",
"clang": "تق",
"squeal": "جیغ",
"clicking": "کلیک‌کردن",
"clickety_clack": "تَق‌تَق",
"rumble": "غرّش",
"plop": "پَت",
"chirp_tone": "صدای جیک",
"pulse": "پالس",
"inside": "داخل",
"outside": "بیرون",
"reverberation": "پژواک",
"cacophony": "همهمه",
"throbbing": "تپش",
"vibration": "لرزش",
"hands": "دست‌ها",
"cheering": "تشویق کردن",
"caw": "قارقار",
"jingle": "جینگل",
"middle_eastern_music": "موسیقی خاورمیانه‌ای",
"stream": "جریان",
"fire": "آتش",
"crackle": "ترق‌تروق",
"sailboat": "قایق بادبانی",
"rowboat": "قایق پارویی",
"power_windows": "شیشه‌بالابر برقی",
"skidding": "سرخوردن",
"tire_squeal": "جیغ لاستیک",
"car_passing_by": "عبور خودرو",
"race_car": "خودروی مسابقه",
"emergency_vehicle": "خودروی امدادی",
"police_car": "خودروی پلیس",
"vacuum_cleaner": "جاروبرقی",
"zipper": "زیپ",
"typing": "تایپ کردن",
"typewriter": "ماشین تحریر",
"computer_keyboard": "صفحه‌کلید رایانه",
"writing": "نوشتن",
"alarm": "هشدار",
"telephone": "تلفن",
"siren": "آژیر",
"civil_defense_siren": "آژیر دفاع مدنی",
"buzzer": "بیزر",
"smoke_detector": "آشکارساز دود",
"ratchet": "جغجغه",
"tick-tock": "تیک‌تاک",
"gears": "چرخ‌دنده‌ها",
"printer": "چاپگر",
"single-lens_reflex_camera": "دوربین تک‌لنزی بازتابی",
"tools": "ابزارها",
"hammer": "چکش",
"explosion": "انفجار",
"gunshot": "شلیک",
"machine_gun": "مسلسل",
"fusillade": "رگبار",
"eruption": "فوران",
"boom": "بوم",
"wood": "چوب",
"sound_effect": "جلوهٔ صوتی",
"splinter": "تراشه",
"environmental_noise": "نویز محیطی",
"static": "ساکن",
"white_noise": "نویز سفید",
"squish": "فشردن",
"drip": "چکه",
"pour": "ریختن",
"trickle": "چکیدن",
"boiling": "جوشیدن",
"thump": "کوبیدن",
"bang": "بنگ",
"slap": "سیلی",
"whack": "ضربه",
"smash": "خرد کردن",
"roll": "غلتیدن",
"crushing": "خرد کردن",
"crumpling": "چروک شدن",
"tearing": "پاره کردن",
"creak": "جیرجیر",
"clatter": "قارقار",
"sizzle": "جوشیدن",
"hum": "زمزمه",
"zing": "زنگ",
"boing": "بویینگ",
"crunch": "خرد کردن",
"noise": "نویز",
"mains_hum": "زمزمهٔ برق",
"distortion": "اعوجاج",
"sidetone": "صدای گوشی",
"ambulance": "آمبولانس",
"fire_engine": "خودروی آتش‌نشانی",
"railroad_car": "واگن راه‌آهن",
"train_wheels_squealing": "جیرجیر چرخ‌های قطار",
"subway": "مترو",
"aircraft": "هوانورد",
"aircraft_engine": "موتور هواپیما",
"engine": "موتور",
"light_engine": "موتور سبک",
"dental_drill's_drill": "متهٔ دندانپزشکی",
"lawn_mower": "چمن‌زن",
"chainsaw": "ارهٔ زنجیری",
"accelerating": "شتاب‌گیری",
"doorbell": "زنگ در",
"ding-dong": "دینگ‌دونگ",
"sliding_door": "در کشویی",
"drawer_open_or_close": "باز یا بسته شدن کشو",
"dishes": "ظروف",
"cutlery": "قاشق و چنگال",
"chopping": "خرد کردن",
"frying": "سرخ کردن",
"electric_toothbrush": "مسواک برقی",
"tick": "تیک",
"chop": "خرد کردن",
"pink_noise": "نویز صورتی",
"sodeling": "سودلینگ",
"slosh": "پاشیدن",
"sonar": "سونار",
"arrow": "پیکان",
"whoosh": "ووش",
"breaking": "شکستن",
"rub": "مالیدن",
"rustle": "خش‌خش",
"whir": "وزوز",
"sine_wave": "موج سینوسی",
"harmonic": "هارمونیک",
"echo": "پژواک"
"bicycle": "دوچرخه"
}

View File

@ -4,294 +4,6 @@
"untilForRestart": "تا زمانی که فریگیت دوباره شروع به کار کند.",
"untilRestart": "تا زمان ری‌استارت",
"ago": "{{timeAgo}} قبل",
"justNow": "هم اکنون",
"today": "امروز",
"yesterday": "دیروز",
"last7": "۷ روز گذشته",
"last14": "۱۴ روز گذشته",
"last30": "۳۰ روز گذشته",
"thisWeek": "این هفته",
"lastWeek": "هفتهٔ گذشته",
"thisMonth": "این ماه",
"lastMonth": "ماه گذشته",
"5minutes": "۵ دقیقه",
"10minutes": "۱۰ دقیقه",
"day_one": "{{time}} روز",
"day_other": "{{time}} روز",
"h": "{{time}}س",
"hour_one": "{{time}} ساعت",
"hour_other": "{{time}} ساعت",
"m": "{{time}} دقیقه",
"minute_one": "{{time}} دقیقه",
"minute_other": "{{time}} دقیقه",
"s": "{{time}}ث",
"30minutes": "۳۰ دقیقه",
"1hour": "۱ ساعت",
"12hours": "۱۲ ساعت",
"24hours": "۲۴ ساعت",
"pm": "ب.ظ.",
"am": "ق.ظ.",
"yr": "{{time}} سال",
"year_one": "{{time}} سال",
"year_other": "{{time}} سال",
"mo": "{{time}} ماه",
"month_one": "{{time}} ماه",
"month_other": "{{time}} ماه",
"d": "{{time}} روز",
"second_one": "{{time}} ثانیه",
"second_other": "{{time}} ثانیه",
"formattedTimestamp": {
"12hour": "MMM d، h:mm:ss aaa",
"24hour": "MMM d، HH:mm:ss"
},
"formattedTimestamp2": {
"12hour": "MM/dd h:mm:ssa",
"24hour": "d MMM HH:mm:ssd MMM، HH:mm:ss"
},
"formattedTimestampHourMinute": {
"12hour": "h:mm aaa",
"24hour": "HH:mm"
},
"formattedTimestampHourMinuteSecond": {
"12hour": "h:mm:ss aaa",
"24hour": "HH:mm:ss"
},
"formattedTimestampMonthDayHourMinute": {
"12hour": "d MMM, h:mm aaa",
"24hour": "d MMM, HH:mm"
},
"formattedTimestampMonthDayYear": {
"12hour": "d MMM, yyyy",
"24hour": "d MMM, yyyy"
},
"formattedTimestampMonthDayYearHourMinute": {
"12hour": "d MMM yyyy, h:mm aaa",
"24hour": "yyyy MMM d, HH:mm"
},
"formattedTimestampMonthDay": "d MMM",
"formattedTimestampFilename": {
"12hour": "MM-dd-yy-h-mm-ss-a",
"24hour": "MM-dd-yy-HH-mm-ss"
},
"inProgress": "در حال انجام",
"invalidStartTime": "زمان شروع نامعتبر است",
"invalidEndTime": "زمان پایان نامعتبر است"
},
"unit": {
"length": {
"feet": "فوت",
"meters": "متر"
},
"data": {
"kbps": "kB/s",
"gbps": "GB/s",
"mbph": "مگابایت/ساعت",
"gbph": "گیگابایت/ساعت",
"mbps": "مگابایت/ثانیه",
"kbph": "کیلوبایت/ساعت"
},
"speed": {
"mph": "مایل/ساعت",
"kph": "کیلومتر/ساعت"
}
},
"label": {
"hide": "پنهان کردن {{item}}",
"ID": "شناسه",
"all": "همه",
"back": "برگشت به قبل",
"show": "نمایش {{item}}",
"none": "هیچ‌کدام"
},
"list": {
"many": "{{items}}، و {{last}}",
"two": "{{0}} و {{1}}",
"separatorWithSpace": ", · "
},
"field": {
"internalID": "شناسهٔ داخلی‌ای که Frigate در پیکربندی و پایگاه‌داده استفاده می‌کند",
"optional": "اختیاری"
},
"button": {
"apply": "اعمال",
"done": "انجام شد",
"enable": "فعال کردن",
"disabled": "غیرفعال",
"cancel": "لغو",
"close": "بستن",
"back": "بازگشت",
"fullscreen": "تمام‌صفحه",
"exitFullscreen": "خروج از حالت تمام‌صفحه",
"twoWayTalk": "مکالمهٔ دوطرفه",
"cameraAudio": "صدای دوربین",
"off": "خاموش",
"delete": "حذف",
"download": "دانلود",
"unsuspended": "برداشتن تعلیق",
"unselect": "لغو انتخاب",
"export": "خروجی گرفتن",
"next": "بعدی",
"reset": "بازنشانی",
"enabled": "فعال",
"disable": "غیرفعال کردن",
"save": "ذخیره",
"saving": "در حال ذخیره…",
"copy": "کپی",
"history": "تاریخچه",
"pictureInPicture": "تصویر در تصویر",
"copyCoordinates": "کپی مختصات",
"yes": "بله",
"no": "خیر",
"info": "اطلاعات",
"play": "پخش",
"deleteNow": "حذف فوری",
"continue": "ادامه",
"on": "روشن",
"edit": "ویرایش",
"suspended": "تعلیق‌شده"
},
"menu": {
"systemMetrics": "شاخص‌های سیستم",
"configuration": "پیکربندی",
"settings": "تنظیمات",
"language": {
"en": "انگلیسی (English)",
"hi": "هندی (Hindi)",
"fr": "فرانسوی (French)",
"ptBR": "پرتغالیِ برزیل (Brazilian Portuguese)",
"ru": "روسی (Russian)",
"es": "اسپانیایی (زبان اسپانیایی)",
"zhCN": "چینی ساده‌شده (چینی ساده)",
"ar": "عربی (زبان عربی)",
"pt": "پرتغالی (زبان پرتغالی)",
"de": "آلمانی (زبان آلمانی)",
"ja": "ژاپنی (زبان ژاپنی)",
"tr": "ترکی (زبان ترکی)",
"it": "ایتالیایی (زبان ایتالیایی)",
"nl": "هلندی (زبان هلندی)",
"sv": "سوئدی (زبان سوئدی)",
"cs": "چکی (زبان چکی)",
"nb": "بوکمل نروژیایی (بوکمل نروژی)",
"ko": "کره‌ای (زبان کره‌ای)",
"vi": "ویتنامی (زبان ویتنامی)",
"fa": "فارسی (زبان فارسی)",
"pl": "لهستانی (زبان لهستانی)",
"uk": "اوکراینی (زبان اوکراینی)",
"he": "عبری (زبان عبری)",
"el": "یونانی (زبان یونانی)",
"ro": "رومانیایی (زبان رومانیایی)",
"hu": "مجاری (زبان مجاری)",
"fi": "فنلاندی (زبان فنلاندی)",
"da": "دانمارکی (زبان دانمارکی)",
"sk": "اسلواکی (زبان اسلواکی)",
"yue": "کانتونی (زبان کانتونی)",
"th": "تایلندی (زبان تایلندی)",
"ca": "کاتالانی (زبان کاتالانی)",
"sr": "صربی (زبان صربی)",
"sl": "اسلوونیایی (زبان اسلوونیایی)",
"lt": "لیتوانیایی (زبان لیتوانیایی)",
"bg": "بلغاری (زبان بلغاری)",
"gl": "گالیسیایی (زبان گالیسیایی)",
"id": "اندونزیایی (زبان اندونزیایی)",
"ur": "اردو (زبان اردو)",
"withSystem": {
"label": "برای زبان از تنظیمات سامانه استفاده کنید"
}
},
"system": "سامانه",
"systemLogs": "لاگ‌های سامانه",
"configurationEditor": "ویرایشگر پیکربندی",
"languages": "زبان‌ها",
"appearance": "ظاهر",
"darkMode": {
"label": "حالت تاریک",
"light": "روشنایی",
"dark": "تاریک",
"withSystem": {
"label": "برای حالت روشن یا تاریک از تنظیمات سامانه استفاده کنید"
}
},
"withSystem": "سامانه",
"theme": {
"label": "پوسته",
"blue": "آبی",
"green": "سبز",
"nord": "نورد",
"red": "قرمز",
"highcontrast": "کنتراست بالا",
"default": "پیش‌فرض"
},
"help": "راهنما",
"documentation": {
"title": "مستندات",
"label": "مستندات Frigate"
},
"restart": "راه‌اندازی مجدد Frigate",
"live": {
"title": "زنده",
"allCameras": "همهٔ دوربین‌ها",
"cameras": {
"title": "دوربین‌ها",
"count_one": "{{count}} دوربین",
"count_other": "{{count}} دوربین"
}
},
"review": "بازبینی",
"explore": "کاوش",
"export": "خروجی گرفتن",
"uiPlayground": "محیط آزمایشی UI",
"faceLibrary": "کتابخانهٔ چهره",
"classification": "طبقه‌بندی",
"user": {
"title": "کاربر",
"account": "حساب کاربری",
"current": "کاربر فعلی: {{user}}",
"anonymous": "ناشناس",
"logout": "خروج",
"setPassword": "تنظیم گذرواژه"
}
},
"toast": {
"copyUrlToClipboard": "نشانی اینترنتی در کلیپ‌بورد کپی شد.",
"save": {
"title": "ذخیره",
"error": {
"title": "ذخیرهٔ تغییرات پیکربندی ناموفق بود: {{errorMessage}}",
"noMessage": "ذخیرهٔ تغییرات پیکربندی ناموفق بود"
}
}
},
"role": {
"title": "نقش",
"admin": "مدیر",
"viewer": "بیننده",
"desc": "مدیران به همهٔ ویژگی‌ها در رابط کاربری Frigate دسترسی کامل دارند. بیننده‌ها فقط می‌توانند دوربین‌ها، موارد بازبینی و ویدیوهای تاریخی را در رابط کاربری مشاهده کنند."
},
"pagination": {
"label": "صفحه‌بندی",
"previous": {
"title": "قبلی",
"label": "رفتن به صفحهٔ قبلی"
},
"next": {
"title": "بعدی",
"label": "رفتن به صفحهٔ بعدی"
},
"more": "صفحه‌های بیشتر"
},
"accessDenied": {
"documentTitle": "دسترسی ممنوع - Frigate",
"title": "دسترسی ممنوع",
"desc": "شما اجازهٔ مشاهدهٔ این صفحه را ندارید."
},
"notFound": {
"documentTitle": "یافت نشد - Frigate",
"title": "۴۰۴",
"desc": "صفحه پیدا نشد"
},
"selectItem": "انتخاب {{item}}",
"readTheDocumentation": "مستندات را بخوانید",
"information": {
"pixels": "{{area}}px"
"justNow": "هم اکنون"
}
}

View File

@ -3,14 +3,6 @@
"user": "نام کاربری",
"password": "رمز عبور",
"login": "ورود",
"firstTimeLogin": "اولین باز است وارد می شود؟ اطلاعات هویتی در ثبت رخداد های فریگیت چاپ خواهد شد.",
"errors": {
"usernameRequired": "وارد کردن نام کاربری الزامی است",
"passwordRequired": "وارد کردن رمز عبور الزامی است",
"loginFailed": "ورود ناموفق بود",
"unknownError": "خطای ناشناخته. گزارش‌ها را بررسی کنید.",
"webUnknownError": "خطای ناشناخته. گزارش‌های کنسول را بررسی کنید.",
"rateLimit": "از حد مجاز درخواست‌ها فراتر رفت. بعداً دوباره تلاش کنید."
}
"firstTimeLogin": "اولین باز است وارد می شود؟ اطلاعات هویتی در ثبت رخداد های فریگیت چاپ خواهد شد."
}
}

View File

@ -4,83 +4,7 @@
"add": "افزودن گروه دوربین",
"edit": "ویرایش گروه دوربین",
"delete": {
"label": "حذف گروه دوربین ها",
"confirm": {
"title": "تأیید حذف",
"desc": "آیا مطمئن هستید که می‌خواهید گروه دوربین «<em>{{name}}</em>» را حذف کنید؟"
}
},
"name": {
"label": "نام",
"placeholder": "یک نام وارد کنید…",
"errorMessage": {
"mustLeastCharacters": "نام گروه دوربین باید حداقل ۲ کاراکتر باشد.",
"exists": "نام گروه دوربین از قبل وجود دارد.",
"nameMustNotPeriod": "نام گروه دوربین نباید شامل نقطه باشد.",
"invalid": "نام گروه دوربین نامعتبر است."
}
},
"cameras": {
"desc": "دوربین‌های این گروه را انتخاب کنید.",
"label": "دوربین‌ها"
},
"icon": "آیکون",
"success": "گروه دوربین ({{name}}) ذخیره شد.",
"camera": {
"setting": {
"streamMethod": {
"method": {
"noStreaming": {
"label": "بدون پخش",
"desc": "تصاویر دوربین فقط هر یک دقیقه یک‌بار به‌روزرسانی می‌شوند و هیچ پخش زنده‌ای انجام نخواهد شد."
},
"smartStreaming": {
"label": "پخش هوشمند (پیشنهادی)",
"desc": "پخش هوشمند زمانی که فعالیت قابل تشخیصی وجود ندارد برای صرفه‌جویی در پهنای باند و منابع، تصویر دوربین شما را هر یک دقیقه یک‌بار به‌روزرسانی می‌کند. وقتی فعالیت تشخیص داده شود، تصویر به‌طور یکپارچه به پخش زنده تغییر می‌کند."
},
"continuousStreaming": {
"label": "پخش پیوسته",
"desc": {
"title": "تصویر دوربین وقتی در داشبورد قابل مشاهده باشد همیشه پخش زنده خواهد بود، حتی اگر هیچ فعالیتی تشخیص داده نشود.",
"warning": "پخش پیوسته ممکن است باعث مصرف بالای پهنای‌باند و مشکلات عملکردی شود. با احتیاط استفاده کنید."
}
}
},
"label": "روش پخش",
"placeholder": "یک روش پخش را انتخاب کنید"
},
"label": "تنظیمات پخش دوربین",
"title": "تنظیمات پخش {{cameraName}}",
"audioIsAvailable": "صدا برای این پخش در دسترس است",
"audioIsUnavailable": "صدا برای این پخش در دسترس نیست",
"audio": {
"tips": {
"title": "برای این پخش، صدا باید از دوربین شما خروجی گرفته شود و در go2rtc پیکربندی شده باشد."
}
},
"stream": "جریان",
"placeholder": "یک جریان را برگزینید",
"compatibilityMode": {
"label": "حالت سازگاری",
"desc": "این گزینه را فقط زمانی فعال کنید که پخش زندهٔ دوربین شما دچار آثار رنگی (artifact) است و در سمت راست تصویر یک خط مورب دیده می‌شود."
},
"desc": "گزینه‌های پخش زنده را برای داشبورد این گروه دوربین تغییر دهید. <em>این تنظیمات مخصوص دستگاه/مرورگر هستند. </em>"
},
"birdseye": "نمای پرنده"
"label": "حذف گروه دوربین ها"
}
},
"debug": {
"options": {
"label": "تنظیمات",
"title": "گزینه‌ها",
"showOptions": "نمایش گزینه‌ها",
"hideOptions": "پنهان کردن گزینه‌ها"
},
"boundingBox": "کادر محدوده",
"timestamp": "مهر زمانی",
"zones": "ناحیه‌ها",
"mask": "ماسک",
"motion": "حرکت",
"regions": "مناطق"
}
}

View File

@ -1,122 +1,11 @@
{
"restart": {
"title": "آیا برای راه اندازی مجدد Frigate مطمئن هستید؟",
"title": "آیا از ری‌استارت فریگیت اطمینان دارید؟",
"button": "ری‌استارت",
"restarting": {
"title": "فریگیت در حال ری‌استارت شدن",
"content": "صفحه تا {{countdown}} ثانیه دیگر مجددا بارگزاری خواهد شد.",
"button": "بارگزاری مجدد هم اکنون اجرا شود"
}
},
"explore": {
"plus": {
"submitToPlus": {
"label": "ارسال به Frigate+",
"desc": "اشیایی که در مکان‌هایی هستند که می‌خواهید از آن‌ها اجتناب کنید، «مثبت کاذب» محسوب نمی‌شوند. ارسال آن‌ها به‌عنوان مثبت کاذب باعث می‌شود مدل دچار سردرگمی شود."
},
"review": {
"question": {
"label": "این برچسب را برای Frigate Plus تأیید کنید",
"ask_a": "آیا این شیء <code>{{label}}</code> است؟",
"ask_an": "آیا این شیء یک <code>{{label}}</code> است؟",
"ask_full": "آیا این شیء یک <code>{{untranslatedLabel}}</code> ({{translatedLabel}}) است؟"
},
"state": {
"submitted": "ارسال شد"
}
}
},
"video": {
"viewInHistory": "مشاهده در تاریخچه"
}
},
"export": {
"time": {
"fromTimeline": "انتخاب از خط زمانی",
"lastHour_one": "ساعت گذشته",
"lastHour_other": "آخرین {{count}} ساعت",
"custom": "سفارشی",
"start": {
"title": "زمان شروع",
"label": "زمان شروع را انتخاب کنید"
},
"end": {
"title": "زمان پایان",
"label": "زمان پایان را انتخاب کنید"
}
},
"toast": {
"error": {
"endTimeMustAfterStartTime": "زمان پایان باید بعد از زمان شروع باشد",
"noVaildTimeSelected": "بازهٔ زمانی معتبر انتخاب نشده است",
"failed": "شروع خروجی‌گیری ناموفق بود: {{error}}"
},
"success": "ساخت خروجی با موفقیت آغاز شد. فایل را در صفحه خروجی‌ها مشاهده کنید.",
"view": "مشاهده"
},
"fromTimeline": {
"saveExport": "ذخیرهٔ خروجی",
"previewExport": "پیش‌نمایش خروجی"
},
"name": {
"placeholder": "برای خروجی نام بگذارید"
},
"select": "انتخاب",
"export": "خروجی",
"selectOrExport": "انتخاب یا خروجی"
},
"streaming": {
"label": "جریان",
"restreaming": {
"disabled": "بازپخش برای این دوربین فعال نیست.",
"desc": {
"title": "برای گزینه‌های بیشتر نمایش زنده و صدا برای این دوربین، go2rtc را تنظیم کنید."
}
},
"showStats": {
"label": "نمایش آمار جریان",
"desc": "این گزینه را فعال کنید تا آمار جریان به‌صورت پوششی روی تصویر دوربین نمایش داده شود."
},
"debugView": "نمای اشکال‌زدایی"
},
"search": {
"saveSearch": {
"label": "ذخیره جست‌وجو",
"desc": "برای این جست‌وجوی ذخیره‌شده یک نام وارد کنید.",
"placeholder": "برای جستجوی خود یک نام وارد کنید",
"success": "جستجو ({{searchName}}) ذخیره شد.",
"button": {
"save": {
"label": "ذخیرهٔ این جستجو"
}
},
"overwrite": "{{searchName}} موجود است. ذخیره سازی منجر به بازنویسی مقدار موجود خواهد شد."
}
},
"recording": {
"confirmDelete": {
"title": "تأیید حذف",
"desc": {
"selected": "آیا مطمئن هستید که می‌خواهید همهٔ ویدیوهای ضبط‌شدهٔ مرتبط با این مورد بازبینی را حذف کنید؟<br /><br />برای رد کردن این پنجره در آینده، کلید <em>Shift</em> را نگه دارید."
},
"toast": {
"success": "ویدیوهای مرتبط با موارد بازبینیِ انتخاب‌شده با موفقیت حذف شد.",
"error": "حذف ناموفق بود: {{error}}"
}
},
"button": {
"export": "خروجی گرفتن",
"markAsReviewed": "علامت‌گذاری به‌عنوان بازبینی‌شده",
"markAsUnreviewed": "علامت‌گذاری به‌عنوان بازبینی‌نشده",
"deleteNow": "حذف فوری"
}
},
"imagePicker": {
"selectImage": "یک بندانگشتیِ شیء ردیابی‌شده را انتخاب کنید",
"unknownLabel": "تصویر محرک ذخیره شد",
"search": {
"placeholder": "جستجو بر اساس برچسب یا زیر‌برچسب…"
},
"noImages": "برای این دوربین بندانگشتی‌ای یافت نشد"
}
}

View File

@ -5,136 +5,6 @@
"all": {
"title": "تمامی کلاس ها"
},
"count_one": "{{count}} کلاس",
"count_other": "{{count}} کلاس‌ها"
},
"labels": {
"label": "برچسب‌ها",
"all": {
"title": "همه برچسب‌ها",
"short": "برچسب‌ها"
},
"count_one": "{{count}} برچسب",
"count_other": "{{count}} برچسب‌ها"
},
"zones": {
"label": "ناحیه‌ها",
"all": {
"title": "همهٔ ناحیه‌ها",
"short": "ناحیه‌ها"
}
},
"dates": {
"selectPreset": "یک پیش‌تنظیم را انتخاب کنید…",
"all": {
"title": "همهٔ تاریخ‌ها",
"short": "تاریخ‌ها"
}
},
"features": {
"hasVideoClip": "دارای کلیپ ویدئویی است",
"submittedToFrigatePlus": {
"label": "ارسال‌شده به Frigate+",
"tips": "ابتدا باید روی اشیای ردیابی‌شده‌ای که عکس فوری دارند فیلتر کنید. <br /> <br />اشیای ردیابی‌شده بدون عکس فوری نمی‌توانند به Frigate+ ارسال شوند."
},
"label": "قابلیت‌ها",
"hasSnapshot": "دارای یک عکس فوری"
},
"sort": {
"label": "مرتب‌سازی",
"dateAsc": "تاریخ (صعودی)",
"dateDesc": "تاریخ (نزولی)",
"scoreAsc": "امتیاز شیء (صعودی)",
"scoreDesc": "امتیاز شیء (نزولی)",
"speedAsc": "سرعت تخمینی (صعودی)",
"speedDesc": "سرعت تخمینی (نزولی)",
"relevance": "آموزش چهره به‌عنوان:ارتباط"
},
"more": "فیلترهای بیشتر",
"reset": {
"label": "بازنشانی فیلترها به مقادیر پیش‌فرض"
},
"timeRange": "بازهٔ زمانی",
"subLabels": {
"label": "زیربرچسب‌ها",
"all": "همهٔ زیر برچسب‌ها"
},
"attributes": {
"label": "ویژگی‌های طبقه‌بندی",
"all": "همهٔ ویژگی‌ها"
},
"score": "امتیاز",
"estimatedSpeed": "سرعت تخمینی ( {{unit}})",
"cameras": {
"label": "فیلتر دوربین‌ها",
"all": {
"title": "همهٔ دوربین‌ها",
"short": "دوربین‌ها"
}
},
"logSettings": {
"filterBySeverity": "فیلتر کردن لاگ‌ها بر اساس شدت",
"loading": {
"desc": "وقتی پنل لاگ تا پایین‌ترین نقطه اسکرول شود، لاگ‌های جدید هنگام اضافه‌شدن به‌صورت خودکار نمایش داده می‌شوند.",
"title": "در حال بارگذاری"
},
"label": "فیلتر سطح لاگ",
"disableLogStreaming": "غیرفعال کردن پخش زندهٔ لاگ",
"allLogs": "همهٔ لاگ‌ها"
},
"trackedObjectDelete": {
"title": "تأیید حذف",
"toast": {
"success": "اشیای ردیابی‌شده با موفقیت حذف شدند.",
"error": "حذف اشیای ردیابی‌شده ناموفق بود: {{errorMessage}}"
},
"desc": "حذف این {{objectLength}} شیء ردیابی‌شده باعث حذف عکس فوری، هرگونه امبدینگِ ذخیره‌شده و همهٔ ورودی‌های مرتبط با چرخهٔ عمر شیء می‌شود. ویدیوهای ضبط‌شدهٔ این اشیای ردیابی‌شده در نمای تاریخچه <em>حذف نخواهند شد</em>.<br /><br />آیا مطمئن هستید که می‌خواهید ادامه دهید؟<br /><br />برای رد کردن این پنجره در آینده، کلید <em>Shift</em> را نگه دارید."
},
"zoneMask": {
"filterBy": "فیلتر بر اساس ماسک ناحیه"
},
"recognizedLicensePlates": {
"loadFailed": "بارگذاری پلاک‌های شناسایی‌شده ناموفق بود.",
"loading": "در حال بارگذاری پلاک‌های شناسایی‌شده…",
"noLicensePlatesFound": "هیچ پلاکی پیدا نشد.",
"selectAll": "انتخاب همه",
"title": "پلاک‌های شناسایی‌شده",
"placeholder": "برای جستجوی پلاک‌ها تایپ کنید…",
"selectPlatesFromList": "یک یا چند پلاک را از فهرست انتخاب کنید.",
"clearAll": "پاک کردن همه"
},
"review": {
"showReviewed": "نمایش بازبینی‌شده‌ها"
},
"motion": {
"showMotionOnly": "فقط نمایش حرکت"
},
"explore": {
"settings": {
"title": "تنظیمات",
"defaultView": {
"title": "نمای پیش‌فرض",
"summary": "خلاصه",
"unfilteredGrid": "شبکهٔ بدون فیلتر",
"desc": "هنگامی که هیچ فیلتری انتخاب نشده باشد، خلاصه ای از آخرین اشیاء ردیابی شده در هر برچسب یا یک شبکه فیلتر نشده نمایش داده خواهد شد."
},
"gridColumns": {
"title": "ستون‌های شبکه",
"desc": "تعداد ستون‌ها را در نمای شبکه انتخاب کنید."
},
"searchSource": {
"label": "منبع جستجو",
"desc": "انتخاب کنید که در بندانگشتی‌ها جستجو شود یا در توضیحات اشیای ردیابی‌شده.",
"options": {
"thumbnailImage": "تصویر پیش‌نمایش",
"description": "توضیحات"
}
}
},
"date": {
"selectDateBy": {
"label": "یک تاریخ را برای فیلتر کردن انتخاب کنید"
}
}
"count_one": "{{count}} کلاس"
}
}

View File

@ -2,7 +2,7 @@
"iconPicker": {
"selectIcon": "انتخاب آیکون",
"search": {
"placeholder": "جستجو برای آیکون"
"placeholder": "جستجو برای آیکون"
}
}
}

Some files were not shown because too many files have changed in this diff Show More