mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-11-13 09:03:01 +03:00
Compare commits
45
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0de4d3592 | ||
|
|
98ca637608 | ||
|
|
b2f5315e09 | ||
|
|
a655ddcb2e | ||
|
|
806ee66562 | ||
|
|
42f5a7560b | ||
|
|
21836c7444 | ||
|
|
e70eba2fb8 | ||
|
|
e0b5a6c965 | ||
|
|
6733a757e8 | ||
|
|
94e700fbac | ||
|
|
5f59f7c53c | ||
|
|
0e2da4e24a | ||
|
|
dade7a6b3e | ||
|
|
329430760e | ||
|
|
2fbb66e475 | ||
|
|
5019984a33 | ||
|
|
db58f9f5cc | ||
|
|
f83b8b57db | ||
|
|
146d61017e | ||
|
|
86c9b4bf74 | ||
|
|
ed1a515c1b | ||
|
|
c013f6dcb8 | ||
|
|
bb1736bb4d | ||
|
|
68988780cd | ||
|
|
c148063e76 | ||
|
|
37ca717f63 | ||
|
|
b6d16fb6f3 | ||
|
|
e45b7de79b | ||
|
|
a1f8f95497 | ||
|
|
cabbfd5d73 | ||
|
|
20a3bd7ac5 | ||
|
|
e287833e8d | ||
|
|
e150c5d1dd | ||
|
|
60c4e37303 | ||
|
|
3ac35fe777 | ||
|
|
8b0325aefb | ||
|
|
c57b48e977 | ||
|
|
74a2aac866 | ||
|
|
2af6dc34da | ||
|
|
9eb336a3d8 | ||
|
|
bb0e2c0d5e | ||
|
|
06d1365056 | ||
|
|
8a88cefc9a | ||
|
|
fba967c74b |
@@ -105,6 +105,8 @@ if [[ -n "$sentinel" ]]; then
|
||||
mismatch_expr+=(-a ! -path "$sentinel")
|
||||
fi
|
||||
|
||||
exec 3>&1
|
||||
|
||||
for path in "$@"; do
|
||||
# An absent root is an incomplete sweep, not a finished one: /media/frigate
|
||||
# is not in the image, so a boot before the volume is mounted would
|
||||
@@ -121,7 +123,18 @@ for path in "$@"; do
|
||||
# stale mount. Tolerate it rather than aborting under errexit, but never
|
||||
# read a failed scan as "nothing to do": that would record the sweep as
|
||||
# complete without having looked.
|
||||
if ! count=$(find "$path" -name lost+found -prune -o "${mismatch_expr[@]}" -printf '.' 2>/dev/null | wc -c); then
|
||||
# The walk prints nothing until it ends, so report every 30s through fd 3
|
||||
# (stdout) while the count itself comes back through the substitution.
|
||||
if ! count=$(find "$path" -name lost+found -prune -o "(" "${mismatch_expr[@]}" ")" -printf 'm\n' -o -printf '.\n' 2>/dev/null \
|
||||
| awk -v path="$path" '
|
||||
BEGIN { next_report = systime() + 30 }
|
||||
$0 == "m" { mismatched++ }
|
||||
systime() >= next_report {
|
||||
printf "[INFO] fix-ownership: still scanning %s, %d entries checked, %d need changes\n", path, NR, mismatched > "/dev/fd/3"
|
||||
fflush("/dev/fd/3")
|
||||
next_report = systime() + 30
|
||||
}
|
||||
END { print mismatched + 0 }'); then
|
||||
swept_clean=0
|
||||
echo "[WARN] fix-ownership: could not scan ${path}; will retry on next boot"
|
||||
continue
|
||||
|
||||
@@ -71,13 +71,14 @@ Both the script and the boot sweep report progress, so you can tell a slow sweep
|
||||
|
||||
```
|
||||
[INFO] fix-ownership: scanning /media/frigate for ownership mismatches; this may take a while on large filesystems
|
||||
[INFO] fix-ownership: still scanning /media/frigate, 2481000 entries checked, 2390112 need changes
|
||||
[WARN] fix-ownership: adjusting ownership of 4823941 entries under /media/frigate
|
||||
[INFO] fix-ownership: /media/frigate 5% (241197/4823941 entries)
|
||||
[INFO] fix-ownership: /media/frigate 10% (482394/4823941 entries)
|
||||
[INFO] fix-ownership: finished /media/frigate in 12m 4s
|
||||
```
|
||||
|
||||
The scan has no percentage because the total isn't known until it finishes. Watch the boot sweep with `docker logs -f frigate`.
|
||||
The scan has no percentage because the total isn't known until it finishes, so it reports a running count every 30 seconds instead. Watch the boot sweep with `docker logs -f frigate`.
|
||||
|
||||
Once the volumes are aligned, start Frigate normally. A file at `/config/.permissions_version` records what was done, so later boots skip the sweep unless you change `PUID`/`PGID`.
|
||||
|
||||
|
||||
@@ -413,17 +413,18 @@ Avoid removing audio from only one of the two streams (for example with `-an`).
|
||||
|
||||
As a general rule, features that read recordings prefer the main stream and fall back to the sub stream for time ranges where the main recordings have expired. Analytics features use only the main stream.
|
||||
|
||||
| Feature | Stream used |
|
||||
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| Recording playback (History and Review) | Both (main preferred with sub fallback by default), or exactly one stream when a quality is selected manually |
|
||||
| Tracking details and Explore clip playback | Main, falling back to sub where the main recordings have expired |
|
||||
| Feature | Stream used |
|
||||
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Recording playback (History and Review) | Both (main preferred with sub fallback by default), or exactly one stream when a quality is selected manually |
|
||||
| Tracking details and Explore clip playback | Main, falling back to sub where the main recordings have expired |
|
||||
| Exports | Both (main preferred with sub fallback by default), or exactly one stream when a quality is selected in the export dialog |
|
||||
| Clip downloads | Main; sub is used when no main recordings remain in the range (streams are never mixed in one file) |
|
||||
| Frames grabbed from a recording in History (download snapshot, submit frame to Frigate+) | Main preferred, sub fallback |
|
||||
| Audio extraction (e.g., transcription) | Main preferred, sub fallback |
|
||||
| Motion search | Main only |
|
||||
| Review timeline motion data | Main only |
|
||||
| Storage usage statistics | Both streams counted, and listed separately per camera |
|
||||
| Clip downloads | Main; sub is used when no main recordings remain in the range (streams are never mixed in one file) |
|
||||
| Debug replay | Main; sub is used when no main recordings remain in the range (streams are never mixed in one file) |
|
||||
| Frames grabbed from a recording in History (download snapshot, submit frame to Frigate+) | Main preferred, sub fallback |
|
||||
| Audio extraction (e.g., transcription) | Main preferred, sub fallback |
|
||||
| Motion search | Main only |
|
||||
| Review timeline motion data | Main only |
|
||||
| Storage usage statistics | Both streams counted, and listed separately per camera |
|
||||
|
||||
This table covers only features that read recordings from disk. Tracked object snapshots and thumbnails (the images shown in Explore and sent with notifications, and the images submitted to Frigate+ from a tracked object) are captured live from the `detect` stream as the object is tracked, never from recordings, so sub stream recording does not affect them.
|
||||
|
||||
|
||||
+14
-22
@@ -199,18 +199,14 @@ def events(
|
||||
sub_label_clauses.append(Event.sub_label.is_null())
|
||||
|
||||
for label in filtered_sub_labels:
|
||||
lowered = label.lower()
|
||||
sub_label_clauses.append(
|
||||
fn.LOWER(Event.sub_label.cast("text")) == lowered
|
||||
) # include exact matches (case-insensitive)
|
||||
# SQLite LOWER() only folds ASCII, so lower both sides in SQL to
|
||||
# keep non-ASCII names matching exactly
|
||||
stored = fn.LOWER(Event.sub_label.cast("text"))
|
||||
sub_label_clauses.append(stored == fn.LOWER(label))
|
||||
|
||||
# include this label when part of a list (LIKE is case-insensitive in sqlite for ASCII)
|
||||
sub_label_clauses.append(
|
||||
fn.LOWER(Event.sub_label.cast("text")) % f"*{lowered},*"
|
||||
)
|
||||
sub_label_clauses.append(
|
||||
fn.LOWER(Event.sub_label.cast("text")) % f"*, {lowered}*"
|
||||
)
|
||||
# include this label when part of a list
|
||||
sub_label_clauses.append(stored % fn.LOWER(f"*{label},*"))
|
||||
sub_label_clauses.append(stored % fn.LOWER(f"*, {label}*"))
|
||||
|
||||
sub_label_clause = reduce(operator.or_, sub_label_clauses)
|
||||
clauses.append(sub_label_clause)
|
||||
@@ -633,18 +629,14 @@ def events_search(
|
||||
sub_label_clauses.append(Event.sub_label.is_null())
|
||||
|
||||
for label in filtered_sub_labels:
|
||||
lowered = label.lower()
|
||||
sub_label_clauses.append(
|
||||
fn.LOWER(Event.sub_label.cast("text")) == lowered
|
||||
) # include exact matches (case-insensitive)
|
||||
# SQLite LOWER() only folds ASCII, so lower both sides in SQL to
|
||||
# keep non-ASCII names matching exactly
|
||||
stored = fn.LOWER(Event.sub_label.cast("text"))
|
||||
sub_label_clauses.append(stored == fn.LOWER(label))
|
||||
|
||||
# include this label when part of a list (LIKE is case-insensitive in sqlite for ASCII)
|
||||
sub_label_clauses.append(
|
||||
fn.LOWER(Event.sub_label.cast("text")) % f"*{lowered},*"
|
||||
)
|
||||
sub_label_clauses.append(
|
||||
fn.LOWER(Event.sub_label.cast("text")) % f"*, {lowered}*"
|
||||
)
|
||||
# include this label when part of a list
|
||||
sub_label_clauses.append(stored % fn.LOWER(f"*{label},*"))
|
||||
sub_label_clauses.append(stored % fn.LOWER(f"*, {label}*"))
|
||||
|
||||
event_filters.append(reduce(operator.or_, sub_label_clauses))
|
||||
|
||||
|
||||
@@ -84,3 +84,13 @@ class MqttConfig(FrigateBaseModel):
|
||||
if (self.user is None) != (self.password is None):
|
||||
raise ValueError("Password must be provided with username.")
|
||||
return self
|
||||
|
||||
@model_validator(mode="after")
|
||||
def tls_insecure_requires_tls(self) -> Self:
|
||||
"""Reject TLS verification settings without TLS when MQTT is enabled."""
|
||||
if self.enabled and self.tls_insecure is not None and self.tls_ca_certs is None:
|
||||
raise ValueError(
|
||||
"tls_insecure requires tls_ca_certs. Remove tls_insecure for plaintext "
|
||||
"MQTT, or set tls_ca_certs to a CA certificate path to enable TLS."
|
||||
)
|
||||
return self
|
||||
|
||||
@@ -68,6 +68,9 @@ class ReviewDescriptionProcessor(PostProcessorApi):
|
||||
self.review_desc_dps = EventsPerSecond()
|
||||
self.review_desc_dps.start()
|
||||
|
||||
# one review's ffmpeg extraction at a time, as on the maintainer loop
|
||||
self._frame_extraction_lock = threading.Lock()
|
||||
|
||||
def calculate_frame_count(
|
||||
self,
|
||||
camera: str,
|
||||
@@ -179,53 +182,72 @@ class ReviewDescriptionProcessor(PostProcessorApi):
|
||||
):
|
||||
return
|
||||
|
||||
image_source = camera_config.review.genai.image_source
|
||||
frame_mode = camera_config.review.genai.frame_mode
|
||||
threading.Thread(
|
||||
target=self._describe_finished_review,
|
||||
name=f"review_description_{id}",
|
||||
daemon=True,
|
||||
args=(
|
||||
camera_config,
|
||||
final_data,
|
||||
camera_config.review.genai.image_source,
|
||||
),
|
||||
).start()
|
||||
|
||||
if image_source == ImageSourceEnum.recordings:
|
||||
buffer_extension = get_recording_buffer_extension(
|
||||
final_data["end_time"] - final_data["start_time"]
|
||||
)
|
||||
final_data["start_time"] -= buffer_extension
|
||||
final_data["end_time"] += buffer_extension
|
||||
def _describe_finished_review(
|
||||
self,
|
||||
camera_config: CameraConfig,
|
||||
final_data: dict[str, Any],
|
||||
image_source: ImageSourceEnum,
|
||||
preview_fallback: bool = True,
|
||||
named_objects: list[tuple[str, str]] | None = None,
|
||||
) -> None:
|
||||
"""Gather frames for a finished review item and start its description.
|
||||
|
||||
Runs off the maintainer loop since recording frames shell out to ffmpeg
|
||||
once per frame.
|
||||
"""
|
||||
camera = final_data["camera"]
|
||||
id = final_data["id"]
|
||||
genai_config = camera_config.review.genai
|
||||
frames: list[tuple[bytes, float]] = []
|
||||
|
||||
if image_source == ImageSourceEnum.recordings:
|
||||
buffer_extension = get_recording_buffer_extension(
|
||||
final_data["end_time"] - final_data["start_time"]
|
||||
)
|
||||
with self._frame_extraction_lock:
|
||||
frames = self.get_recording_frames(
|
||||
camera,
|
||||
final_data["start_time"],
|
||||
final_data["end_time"],
|
||||
final_data["start_time"] - buffer_extension,
|
||||
final_data["end_time"] + buffer_extension,
|
||||
height=480, # Use 480p for good balance between quality and token usage
|
||||
frame_mode=frame_mode,
|
||||
frame_mode=genai_config.frame_mode,
|
||||
)
|
||||
|
||||
if not frames:
|
||||
# Fallback to preview frames if no recordings available
|
||||
logger.warning(
|
||||
f"No recording frames found for {camera}, falling back to preview frames"
|
||||
)
|
||||
frames = self.get_preview_frames_as_bytes(
|
||||
camera,
|
||||
final_data["start_time"],
|
||||
final_data["end_time"],
|
||||
final_data["thumb_path"],
|
||||
id,
|
||||
camera_config.review.genai.debug_save_thumbnails,
|
||||
frame_mode,
|
||||
)
|
||||
elif camera_config.review.genai.debug_save_thumbnails:
|
||||
if frames:
|
||||
if genai_config.debug_save_thumbnails:
|
||||
self.save_debug_recording_frames(id, frames)
|
||||
elif not preview_fallback:
|
||||
logger.error("No recording frames are available for review item %s", id)
|
||||
return
|
||||
else:
|
||||
# Use preview frames
|
||||
frames = self.get_preview_frames_as_bytes(
|
||||
logger.warning(
|
||||
"No recording frames found for %s, falling back to preview frames",
|
||||
camera,
|
||||
final_data["start_time"],
|
||||
final_data["end_time"],
|
||||
final_data["thumb_path"],
|
||||
id,
|
||||
camera_config.review.genai.debug_save_thumbnails,
|
||||
frame_mode,
|
||||
)
|
||||
|
||||
self.start_analysis(camera_config, final_data, frames)
|
||||
if not frames:
|
||||
frames = self.get_preview_frames_as_bytes(
|
||||
camera,
|
||||
final_data["start_time"],
|
||||
final_data["end_time"],
|
||||
final_data["thumb_path"],
|
||||
id,
|
||||
genai_config.debug_save_thumbnails,
|
||||
genai_config.frame_mode,
|
||||
)
|
||||
|
||||
self.start_analysis(camera_config, final_data, frames, named_objects)
|
||||
|
||||
def handle_request(self, topic: str, request_data: dict[str, Any]) -> str | None:
|
||||
if topic == EmbeddingsRequestEnum.regenerate_review_description.value:
|
||||
@@ -419,31 +441,12 @@ class ReviewDescriptionProcessor(PostProcessorApi):
|
||||
logger.error("Review item %s has not ended yet", review_id)
|
||||
return
|
||||
|
||||
buffer_extension = get_recording_buffer_extension(
|
||||
final_data["end_time"] - final_data["start_time"]
|
||||
)
|
||||
frames = self.get_recording_frames(
|
||||
str(review.camera),
|
||||
final_data["start_time"] - buffer_extension,
|
||||
final_data["end_time"] + buffer_extension,
|
||||
height=480,
|
||||
frame_mode=camera_config.review.genai.frame_mode,
|
||||
)
|
||||
|
||||
if not frames:
|
||||
logger.error(
|
||||
"No recording frames are available for review item %s", review_id
|
||||
)
|
||||
return
|
||||
|
||||
if camera_config.review.genai.debug_save_thumbnails:
|
||||
self.save_debug_recording_frames(review_id, frames)
|
||||
|
||||
self.start_analysis(
|
||||
self._describe_finished_review(
|
||||
camera_config,
|
||||
final_data,
|
||||
frames,
|
||||
get_named_objects(
|
||||
ImageSourceEnum.recordings,
|
||||
preview_fallback=False,
|
||||
named_objects=get_named_objects(
|
||||
final_data["data"].get("detections") or [],
|
||||
self.config.all_attributes,
|
||||
),
|
||||
|
||||
@@ -16,18 +16,21 @@ from abc import ABC, abstractmethod
|
||||
from dataclasses import dataclass
|
||||
from typing import TYPE_CHECKING, Any, Optional, cast
|
||||
|
||||
from peewee import ModelSelect
|
||||
|
||||
from frigate.config import FrigateConfig
|
||||
from frigate.config.camera.updater import CameraConfigUpdatePublisher
|
||||
from frigate.const import REPLAY_CAMERA_PREFIX, REPLAY_DIR
|
||||
from frigate.const import (
|
||||
REPLAY_CAMERA_PREFIX,
|
||||
REPLAY_DIR,
|
||||
STREAM_TYPE_MAIN,
|
||||
STREAM_TYPE_SUB,
|
||||
)
|
||||
from frigate.jobs.export import JobStatePublisher
|
||||
from frigate.jobs.job import Job
|
||||
from frigate.jobs.manager import job_is_running, set_current_job
|
||||
from frigate.models import Export, Recordings
|
||||
from frigate.models import Export
|
||||
from frigate.types import JobStatusTypesEnum
|
||||
from frigate.util.ffmpeg import run_ffmpeg_with_progress
|
||||
from frigate.util.recording_coverage import recording_overlap
|
||||
from frigate.util.recording_coverage import resolve_coverage
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from frigate.debug_replay import DebugReplayManager
|
||||
@@ -94,24 +97,6 @@ class DebugReplayJob(Job):
|
||||
}
|
||||
|
||||
|
||||
def query_recordings(source_camera: str, start_ts: float, end_ts: float) -> ModelSelect:
|
||||
"""Return the Recordings query for the time range.
|
||||
|
||||
Module-level so tests can patch it without instantiating a runner.
|
||||
"""
|
||||
query = (
|
||||
Recordings.select(
|
||||
Recordings.path,
|
||||
Recordings.start_time,
|
||||
Recordings.end_time,
|
||||
)
|
||||
.where(recording_overlap(start_ts, end_ts))
|
||||
.where(Recordings.camera == source_camera)
|
||||
.order_by(Recordings.start_time.asc())
|
||||
)
|
||||
return cast(ModelSelect, query)
|
||||
|
||||
|
||||
class NoRecordingsError(ValueError):
|
||||
"""Raised when no recordings exist in the requested time range."""
|
||||
|
||||
@@ -156,7 +141,8 @@ class RecordingDebugReplaySource(DebugReplaySource):
|
||||
|
||||
Feeds ffmpeg the internal VOD endpoint so segments with mismatched
|
||||
SPS/PPS (e.g. across day/night transitions) stitch cleanly via HLS
|
||||
discontinuities.
|
||||
discontinuities. The playlist is pinned to one stream because the
|
||||
stream-copied clip cannot change codec or resolution mid-file.
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
@@ -170,6 +156,7 @@ class RecordingDebugReplaySource(DebugReplaySource):
|
||||
self._start_ts = start_ts
|
||||
self._end_ts = end_ts
|
||||
self._internal_port = internal_port
|
||||
self._stream_type = STREAM_TYPE_MAIN
|
||||
|
||||
@property
|
||||
def source_camera(self) -> str:
|
||||
@@ -187,15 +174,28 @@ class RecordingDebugReplaySource(DebugReplaySource):
|
||||
if self._end_ts <= self._start_ts:
|
||||
raise ValueError("End time must be after start time")
|
||||
|
||||
if not query_recordings(self._camera, self._start_ts, self._end_ts).count():
|
||||
raise NoRecordingsError(
|
||||
f"No recordings found for camera '{self._camera}' in the specified time range"
|
||||
)
|
||||
# the VOD resolver decides what the pinned playlist serves, so it
|
||||
# also decides the stream; a row merely touching the range has no
|
||||
# interval and must not win
|
||||
intervals = resolve_coverage(self._camera, self._start_ts, self._end_ts)
|
||||
|
||||
if any(interval.main for interval in intervals):
|
||||
self._stream_type = STREAM_TYPE_MAIN
|
||||
return
|
||||
|
||||
if any(interval.sub for interval in intervals):
|
||||
self._stream_type = STREAM_TYPE_SUB
|
||||
return
|
||||
|
||||
raise NoRecordingsError(
|
||||
f"No recordings found for camera '{self._camera}' in the specified time range"
|
||||
)
|
||||
|
||||
def ffmpeg_input_args(self, working_dir: str) -> list[str]:
|
||||
playlist_url = (
|
||||
f"http://127.0.0.1:{self._internal_port}/vod/{self._camera}"
|
||||
f"/start/{self._start_ts}/end/{self._end_ts}/index.m3u8"
|
||||
f"/{self._stream_type}/start/{self._start_ts}/end/{self._end_ts}"
|
||||
"/index.m3u8"
|
||||
)
|
||||
return [
|
||||
"-protocol_whitelist",
|
||||
|
||||
+40
-51
@@ -585,26 +585,36 @@ class PtzAutoTracker(threading.Thread):
|
||||
|
||||
def _predict_movement_time(self, camera, pan, tilt):
|
||||
combined_movement = abs(pan) + abs(tilt)
|
||||
input_data = np.array([self.intercept[camera], combined_movement])
|
||||
input_data = np.array([1, combined_movement])
|
||||
|
||||
return np.dot(self.move_coefficients[camera], input_data)
|
||||
|
||||
def _predict_area_after_time(self, camera, time):
|
||||
return np.dot(
|
||||
self.tracked_object_metrics[camera]["area_coefficients"],
|
||||
[self.tracked_object_history[camera][-1]["frame_time"] + time],
|
||||
)
|
||||
|
||||
def _predict_target_box(self, camera, predicted_time):
|
||||
target_box = self.tracked_object_metrics[camera]["target_box"]
|
||||
tom = self.tracked_object_metrics[camera]
|
||||
target_box = tom["target_box"]
|
||||
|
||||
if not predicted_time:
|
||||
return target_box
|
||||
|
||||
frame_shape = self.config.cameras[camera].frame_shape
|
||||
camera_config = self.config.cameras[camera]
|
||||
left, top, right, bottom = self.tracked_object_history[camera][-1]["box"]
|
||||
size = max(right - left, bottom - top)
|
||||
|
||||
return target_box + self._predict_area_after_time(camera, predicted_time) / (
|
||||
frame_shape[0] * frame_shape[1]
|
||||
if size <= 0:
|
||||
return target_box
|
||||
|
||||
# the corner velocities diverge as the object approaches the camera
|
||||
frames = camera_config.detect.fps * predicted_time
|
||||
velocity = tom["velocity"]
|
||||
predicted_size = max(
|
||||
right - left + frames * (velocity[2] - velocity[0]),
|
||||
bottom - top + frames * (velocity[3] - velocity[1]),
|
||||
1,
|
||||
)
|
||||
|
||||
# target_box is the squared size raised to the zoom factor
|
||||
return target_box * (predicted_size / size) ** (
|
||||
2 * camera_config.onvif.autotracking.zoom_factor
|
||||
)
|
||||
|
||||
def _calculate_tracked_object_metrics(self, camera, obj):
|
||||
@@ -660,26 +670,6 @@ class PtzAutoTracker(threading.Thread):
|
||||
|
||||
filtered_areas = remove_outliers(areas) if len(areas) > 3 else areas
|
||||
|
||||
# Filter entries that are not touching the frame edge
|
||||
filtered_areas_not_touching_edge = [
|
||||
entry
|
||||
for entry in filtered_areas
|
||||
if self._touching_frame_edges(camera, entry["box"]) == 0
|
||||
]
|
||||
|
||||
# Calculate regression for area change predictions
|
||||
if len(filtered_areas_not_touching_edge):
|
||||
X = np.array(
|
||||
[item["frame_time"] for item in filtered_areas_not_touching_edge]
|
||||
)
|
||||
y = np.array([item["area"] for item in filtered_areas_not_touching_edge])
|
||||
|
||||
tom["area_coefficients"] = np.linalg.lstsq(X.reshape(-1, 1), y, rcond=None)[
|
||||
0
|
||||
]
|
||||
else:
|
||||
tom["area_coefficients"] = np.array([0])
|
||||
|
||||
weights = np.arange(1, len(filtered_areas) + 1)
|
||||
weighted_area = np.average(
|
||||
[item["area"] for item in filtered_areas], weights=weights
|
||||
@@ -744,6 +734,8 @@ class PtzAutoTracker(threading.Thread):
|
||||
continue
|
||||
|
||||
else:
|
||||
pan_tilt_times = None
|
||||
|
||||
if (
|
||||
camera_config.onvif.autotracking.zooming
|
||||
== ZoomingModeEnum.relative
|
||||
@@ -755,17 +747,28 @@ class PtzAutoTracker(threading.Thread):
|
||||
|
||||
await self._wait_until_stopped(camera, metrics)
|
||||
|
||||
# _zoom_absolute resets the metrics timestamps
|
||||
pan_tilt_times = (
|
||||
metrics.start_time.value,
|
||||
metrics.stop_time.value,
|
||||
)
|
||||
|
||||
if zoom > 0 and metrics.zoom_level.value != zoom:
|
||||
await self.onvif._zoom_absolute(camera, zoom, 1)
|
||||
|
||||
await self._wait_until_stopped(camera, metrics)
|
||||
|
||||
start_time, stop_time = pan_tilt_times or (
|
||||
metrics.start_time.value,
|
||||
metrics.stop_time.value,
|
||||
)
|
||||
|
||||
if camera_config.onvif.autotracking.movement_weights:
|
||||
logger.debug(
|
||||
f"{camera}: Predicted movement time: {self._predict_movement_time(camera, pan, tilt)}"
|
||||
)
|
||||
logger.debug(
|
||||
f"{camera}: Actual movement time: {metrics.stop_time.value - metrics.start_time.value}"
|
||||
f"{camera}: Actual movement time: {stop_time - start_time}"
|
||||
)
|
||||
|
||||
# save metrics for better estimate calculations
|
||||
@@ -781,8 +784,8 @@ class PtzAutoTracker(threading.Thread):
|
||||
{
|
||||
"pan": pan,
|
||||
"tilt": tilt,
|
||||
"start_timestamp": metrics.start_time.value,
|
||||
"end_timestamp": metrics.stop_time.value,
|
||||
"start_timestamp": start_time,
|
||||
"end_timestamp": stop_time,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -845,7 +848,6 @@ class PtzAutoTracker(threading.Thread):
|
||||
# Thresholds
|
||||
x_mags_thresh = camera_width / camera_fps / 2
|
||||
y_mags_thresh = camera_height / camera_fps / 2
|
||||
dir_thresh = 0.93
|
||||
delta_thresh = 20
|
||||
var_thresh = 10
|
||||
|
||||
@@ -863,24 +865,12 @@ class PtzAutoTracker(threading.Thread):
|
||||
stdev_list = np.std(velocities, axis=0)
|
||||
high_variances = np.any(stdev_list > var_thresh)
|
||||
|
||||
# Check direction difference
|
||||
# the corners of an object moving toward or away from the camera move
|
||||
# in different directions, so the delta bounds how far they may differ
|
||||
velocities = np.round(velocities)
|
||||
invalid_dirs = False
|
||||
if np.all(np.linalg.norm(velocities, axis=1)):
|
||||
cosine_sim = np.dot(velocities[0], velocities[1]) / (
|
||||
np.linalg.norm(velocities[0]) * np.linalg.norm(velocities[1])
|
||||
)
|
||||
dir_thresh = 0.6 if np.all(delta < delta_thresh / 2) else dir_thresh
|
||||
invalid_dirs = cosine_sim < dir_thresh
|
||||
|
||||
# Combine
|
||||
invalid = (
|
||||
invalid_x_mags
|
||||
or invalid_y_mags
|
||||
or invalid_dirs
|
||||
or invalid_delta
|
||||
or high_variances
|
||||
)
|
||||
invalid = invalid_x_mags or invalid_y_mags or invalid_delta or high_variances
|
||||
|
||||
if invalid:
|
||||
logger.debug(
|
||||
@@ -891,7 +881,6 @@ class PtzAutoTracker(threading.Thread):
|
||||
for var_name, is_invalid in [
|
||||
("invalid_x_mags", invalid_x_mags),
|
||||
("invalid_y_mags", invalid_y_mags),
|
||||
("invalid_dirs", invalid_dirs),
|
||||
("invalid_delta", invalid_delta),
|
||||
("high_variances", high_variances),
|
||||
]
|
||||
|
||||
@@ -485,6 +485,40 @@ class TestHttpApp(BaseTestHttp):
|
||||
assert sub_labels
|
||||
assert sub_labels == [sub_label]
|
||||
|
||||
def test_get_event_list_filter_sub_labels(self):
|
||||
sub_labels = {
|
||||
"1.cyrillic": "Кузнецова Ира",
|
||||
"2.joined": "Ира, Bob",
|
||||
"3.ascii": "Alice",
|
||||
"4.none": None,
|
||||
}
|
||||
mock_embeddings = Mock()
|
||||
mock_embeddings.search_thumbnail.return_value = [(id, 0.1) for id in sub_labels]
|
||||
|
||||
self.app.frigate_config.semantic_search.enabled = True
|
||||
self.app.embeddings = mock_embeddings
|
||||
|
||||
with AuthTestClient(self.app) as client:
|
||||
for id, sub_label in sub_labels.items():
|
||||
super().insert_mock_event(id)
|
||||
Event.update(sub_label=sub_label).where(Event.id == id).execute()
|
||||
|
||||
search_params = {"search_type": "similarity", "event_id": "1.cyrillic"}
|
||||
|
||||
for path, params in (("/events", {}), ("/events/search", search_params)):
|
||||
|
||||
def ids(query: str) -> set[str]:
|
||||
events = client.get(
|
||||
path, params={**params, "sub_labels": query}
|
||||
).json()
|
||||
return {event["id"] for event in events}
|
||||
|
||||
assert ids("Кузнецова Ира") == {"1.cyrillic"}
|
||||
assert ids("Ира") == {"2.joined"}
|
||||
assert ids("bob") == {"2.joined"}
|
||||
assert ids("ALICE") == {"3.ascii"}
|
||||
assert ids("None") == {"4.none"}
|
||||
|
||||
####################################################################################################################
|
||||
################################### GET /metrics Endpoint #########################################################
|
||||
####################################################################################################################
|
||||
|
||||
@@ -18,6 +18,7 @@ from frigate.jobs.debug_replay import (
|
||||
from frigate.jobs.export import JobStatePublisher
|
||||
from frigate.jobs.manager import _completed_jobs, _current_jobs
|
||||
from frigate.types import JobStatusTypesEnum
|
||||
from frigate.util.recording_coverage import CoverageInterval
|
||||
|
||||
|
||||
def _reset_job_manager() -> None:
|
||||
@@ -77,6 +78,31 @@ class TestDebugReplayJob(unittest.TestCase):
|
||||
self.assertEqual(results["end_ts"], 200.0)
|
||||
|
||||
|
||||
class TestRecordingDebugReplaySource(unittest.TestCase):
|
||||
def _source_url(self, intervals: list[CoverageInterval]) -> str:
|
||||
source = RecordingDebugReplaySource(
|
||||
source_camera="front", start_ts=100.0, end_ts=200.0, internal_port=5000
|
||||
)
|
||||
with patch(
|
||||
"frigate.jobs.debug_replay.resolve_coverage", return_value=intervals
|
||||
):
|
||||
source.validate()
|
||||
return source.ffmpeg_input_args("/tmp")[-1]
|
||||
|
||||
def test_pins_main_when_main_has_recordings(self) -> None:
|
||||
url = self._source_url(
|
||||
[
|
||||
CoverageInterval(100.0, 150.0, None, MagicMock()),
|
||||
CoverageInterval(150.0, 200.0, MagicMock(), MagicMock()),
|
||||
]
|
||||
)
|
||||
self.assertIn("/vod/front/main/start/100.0/end/200.0/", url)
|
||||
|
||||
def test_falls_back_to_sub_without_main_recordings(self) -> None:
|
||||
url = self._source_url([CoverageInterval(100.0, 200.0, None, MagicMock())])
|
||||
self.assertIn("/vod/front/sub/start/100.0/end/200.0/", url)
|
||||
|
||||
|
||||
class TestStartDebugReplayJob(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
_reset_job_manager()
|
||||
@@ -87,9 +113,7 @@ class TestStartDebugReplayJob(unittest.TestCase):
|
||||
self.frigate_config.ffmpeg.ffmpeg_path = "/bin/true"
|
||||
self.publisher = MagicMock()
|
||||
|
||||
self.recordings_qs = MagicMock()
|
||||
self.recordings_qs.count.return_value = 1
|
||||
self.recordings_qs.__iter__.return_value = iter([MagicMock(path="/tmp/r1.mp4")])
|
||||
self.coverage = [CoverageInterval(100.0, 200.0, MagicMock(), None)]
|
||||
|
||||
def tearDown(self) -> None:
|
||||
runner = get_active_runner()
|
||||
@@ -127,9 +151,7 @@ class TestStartDebugReplayJob(unittest.TestCase):
|
||||
)
|
||||
|
||||
def test_rejects_when_no_recordings(self) -> None:
|
||||
empty_qs = MagicMock()
|
||||
empty_qs.count.return_value = 0
|
||||
with patch("frigate.jobs.debug_replay.query_recordings", return_value=empty_qs):
|
||||
with patch("frigate.jobs.debug_replay.resolve_coverage", return_value=[]):
|
||||
with self.assertRaises(NoRecordingsError):
|
||||
start_debug_replay_job(
|
||||
source=RecordingDebugReplaySource(
|
||||
@@ -152,8 +174,8 @@ class TestStartDebugReplayJob(unittest.TestCase):
|
||||
|
||||
with (
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.query_recordings",
|
||||
return_value=self.recordings_qs,
|
||||
"frigate.jobs.debug_replay.resolve_coverage",
|
||||
return_value=self.coverage,
|
||||
),
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.run_ffmpeg_with_progress",
|
||||
@@ -192,8 +214,8 @@ class TestStartDebugReplayJob(unittest.TestCase):
|
||||
|
||||
with (
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.query_recordings",
|
||||
return_value=self.recordings_qs,
|
||||
"frigate.jobs.debug_replay.resolve_coverage",
|
||||
return_value=self.coverage,
|
||||
),
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.run_ffmpeg_with_progress",
|
||||
@@ -242,9 +264,7 @@ class TestRunnerHappyPath(unittest.TestCase):
|
||||
self.frigate_config.ffmpeg.ffmpeg_path = "/bin/true"
|
||||
self.publisher = MagicMock()
|
||||
|
||||
self.recordings_qs = MagicMock()
|
||||
self.recordings_qs.count.return_value = 1
|
||||
self.recordings_qs.__iter__.return_value = iter([MagicMock(path="/tmp/r1.mp4")])
|
||||
self.coverage = [CoverageInterval(100.0, 200.0, MagicMock(), None)]
|
||||
|
||||
def tearDown(self) -> None:
|
||||
runner = get_active_runner()
|
||||
@@ -272,8 +292,8 @@ class TestRunnerHappyPath(unittest.TestCase):
|
||||
|
||||
with (
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.query_recordings",
|
||||
return_value=self.recordings_qs,
|
||||
"frigate.jobs.debug_replay.resolve_coverage",
|
||||
return_value=self.coverage,
|
||||
),
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.run_ffmpeg_with_progress",
|
||||
@@ -325,9 +345,7 @@ class TestRunnerFailurePath(unittest.TestCase):
|
||||
self.frigate_config.cameras = {"front": MagicMock()}
|
||||
self.frigate_config.ffmpeg.ffmpeg_path = "/bin/true"
|
||||
self.publisher = MagicMock()
|
||||
self.recordings_qs = MagicMock()
|
||||
self.recordings_qs.count.return_value = 1
|
||||
self.recordings_qs.__iter__.return_value = iter([MagicMock(path="/tmp/r1.mp4")])
|
||||
self.coverage = [CoverageInterval(100.0, 200.0, MagicMock(), None)]
|
||||
|
||||
def tearDown(self) -> None:
|
||||
runner = get_active_runner()
|
||||
@@ -350,8 +368,8 @@ class TestRunnerFailurePath(unittest.TestCase):
|
||||
|
||||
with (
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.query_recordings",
|
||||
return_value=self.recordings_qs,
|
||||
"frigate.jobs.debug_replay.resolve_coverage",
|
||||
return_value=self.coverage,
|
||||
),
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.run_ffmpeg_with_progress",
|
||||
@@ -399,9 +417,7 @@ class TestRunnerCancellation(unittest.TestCase):
|
||||
self.frigate_config.cameras = {"front": MagicMock()}
|
||||
self.frigate_config.ffmpeg.ffmpeg_path = "/bin/true"
|
||||
self.publisher = MagicMock()
|
||||
self.recordings_qs = MagicMock()
|
||||
self.recordings_qs.count.return_value = 1
|
||||
self.recordings_qs.__iter__.return_value = iter([MagicMock(path="/tmp/r1.mp4")])
|
||||
self.coverage = [CoverageInterval(100.0, 200.0, MagicMock(), None)]
|
||||
|
||||
def tearDown(self) -> None:
|
||||
runner = get_active_runner()
|
||||
@@ -431,8 +447,8 @@ class TestRunnerCancellation(unittest.TestCase):
|
||||
|
||||
with (
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.query_recordings",
|
||||
return_value=self.recordings_qs,
|
||||
"frigate.jobs.debug_replay.resolve_coverage",
|
||||
return_value=self.coverage,
|
||||
),
|
||||
patch(
|
||||
"frigate.jobs.debug_replay.run_ffmpeg_with_progress",
|
||||
|
||||
@@ -5,6 +5,7 @@ per-camera gating those processors apply once they exist.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import threading
|
||||
import unittest
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
@@ -19,6 +20,8 @@ for mod in _MOCK_MODULES:
|
||||
if mod not in sys.modules:
|
||||
sys.modules[mod] = MagicMock()
|
||||
|
||||
from frigate.config.camera.review import ImageSourceEnum # noqa: E402
|
||||
|
||||
# imported from the maintainer to avoid tripping the circular import between
|
||||
# the maintainer and the processor modules
|
||||
from frigate.embeddings.maintainer import ( # noqa: E402
|
||||
@@ -211,3 +214,58 @@ class TestObjectDescriptionCameraGating(unittest.TestCase):
|
||||
|
||||
mock_create_thumbnail.assert_called_once()
|
||||
self.assertEqual(len(processor.tracked_events["1234.5-abcdef"]), 1)
|
||||
|
||||
|
||||
class TestReviewDescriptionOffLoop(unittest.TestCase):
|
||||
"""Frame extraction for a finished review must not block process_data."""
|
||||
|
||||
def test_recording_frames_extracted_off_the_caller_thread(self):
|
||||
camera = MagicMock()
|
||||
camera.review.genai.enabled = True
|
||||
camera.review.genai.alerts = True
|
||||
camera.review.genai.image_source = ImageSourceEnum.recordings
|
||||
camera.review.genai.debug_save_thumbnails = False
|
||||
config = MagicMock()
|
||||
config.cameras = {"front": camera}
|
||||
processor = ReviewDescriptionProcessor(
|
||||
config, MagicMock(), MagicMock(), MagicMock()
|
||||
)
|
||||
|
||||
release = threading.Event()
|
||||
extracted = threading.Event()
|
||||
analyzed = threading.Event()
|
||||
|
||||
def slow_frames(*args, **kwargs):
|
||||
release.wait(5)
|
||||
extracted.set()
|
||||
return [(b"jpg", 1.0)]
|
||||
|
||||
with (
|
||||
patch.object(processor, "get_recording_frames", side_effect=slow_frames),
|
||||
patch.object(
|
||||
processor, "start_analysis", side_effect=lambda *a, **k: analyzed.set()
|
||||
) as start_analysis,
|
||||
):
|
||||
processor.process_data(
|
||||
{
|
||||
"type": "end",
|
||||
"after": {
|
||||
"id": "1234.5-abcdef",
|
||||
"camera": "front",
|
||||
"severity": "alert",
|
||||
"start_time": 100.0,
|
||||
"end_time": 110.0,
|
||||
},
|
||||
},
|
||||
PostProcessDataEnum.review,
|
||||
)
|
||||
|
||||
self.assertFalse(extracted.is_set())
|
||||
release.set()
|
||||
self.assertTrue(extracted.wait(5))
|
||||
|
||||
self.assertTrue(analyzed.wait(5))
|
||||
start_analysis.assert_called_once()
|
||||
final_data = start_analysis.call_args.args[1]
|
||||
self.assertEqual(final_data["start_time"], 100.0)
|
||||
self.assertEqual(final_data["end_time"], 110.0)
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
"""Tests for MQTT TLS configuration validation."""
|
||||
|
||||
import unittest
|
||||
from contextlib import nullcontext
|
||||
|
||||
from pydantic import ValidationError
|
||||
|
||||
from frigate.config import MqttConfig
|
||||
|
||||
|
||||
class TestMqttTls(unittest.TestCase):
|
||||
def test_tls_insecure_requires_tls_only_when_enabled(self) -> None:
|
||||
"""Require TLS for either explicit verification flag only if MQTT is enabled."""
|
||||
for enabled in (True, False):
|
||||
for insecure in (True, False):
|
||||
expected = (
|
||||
self.assertRaisesRegex(
|
||||
ValidationError, "tls_insecure requires tls_ca_certs"
|
||||
)
|
||||
if enabled
|
||||
else nullcontext()
|
||||
)
|
||||
with self.subTest(enabled=enabled, tls_insecure=insecure), expected:
|
||||
MqttConfig(enabled=enabled, tls_insecure=insecure)
|
||||
@@ -11,11 +11,14 @@ KeyError on the autotracker thread or silently keep the wrong state:
|
||||
running its motion estimator for a camera that could not autotrack.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import unittest
|
||||
from unittest.mock import MagicMock
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
|
||||
import numpy as np
|
||||
|
||||
from frigate.camera import PTZMetrics
|
||||
from frigate.config import FrigateConfig
|
||||
from frigate.config import FrigateConfig, ZoomingModeEnum
|
||||
from frigate.config.camera.updater import CameraConfigUpdateEnum
|
||||
from frigate.ptz.autotrack import PtzAutoTracker, calculate_max_target_box
|
||||
|
||||
@@ -123,6 +126,118 @@ class TestAutotrackerDisable(unittest.TestCase):
|
||||
self.assertIs(payload, autotracking)
|
||||
|
||||
|
||||
class TestAutotrackerPrediction(unittest.TestCase):
|
||||
def test_movement_time_uses_the_fitted_intercept_unchanged(self) -> None:
|
||||
tracker = _make_tracker()
|
||||
tracker.intercept = {CAMERA: 0.5}
|
||||
tracker.move_coefficients = {CAMERA: [0.3, 0.8]}
|
||||
|
||||
self.assertAlmostEqual(tracker._predict_movement_time(CAMERA, 0.25, 0.25), 0.7)
|
||||
|
||||
def test_shrinking_box_keeps_a_positive_target_box(self) -> None:
|
||||
# 60 px shrinking 6 px/frame reaches zero after 2 s at 5 fps
|
||||
target_box = self._target_box_for((0, 0, 60, 60), [3, 3, -3, -3], 2.0)
|
||||
|
||||
self.assertGreater(target_box, 0)
|
||||
self.assertTrue(np.isfinite(target_box))
|
||||
|
||||
def test_approaching_object_keeps_its_velocity(self) -> None:
|
||||
# the box grows, so the corners move in opposite directions
|
||||
tracker = _make_tracker()
|
||||
obj = MagicMock()
|
||||
obj.obj_data = {"estimate_velocity": np.array([[-3.0, -4.0], [3.0, 1.0]])}
|
||||
|
||||
valid, velocity = tracker._get_valid_velocity(CAMERA, obj)
|
||||
|
||||
self.assertTrue(valid)
|
||||
self.assertEqual(list(velocity), [-3, -4, 3, 1])
|
||||
|
||||
def test_corners_that_disagree_too_much_are_rejected(self) -> None:
|
||||
tracker = _make_tracker()
|
||||
obj = MagicMock()
|
||||
obj.obj_data = {"estimate_velocity": np.array([[-15.0, 0.0], [15.0, 0.0]])}
|
||||
|
||||
valid, velocity = tracker._get_valid_velocity(CAMERA, obj)
|
||||
|
||||
self.assertFalse(valid)
|
||||
self.assertFalse(np.any(velocity))
|
||||
|
||||
def _target_box(self, velocity: list[float], predicted_time: float) -> float:
|
||||
return self._target_box_for((900, 400, 1000, 600), velocity, predicted_time)
|
||||
|
||||
def _target_box_for(
|
||||
self,
|
||||
box: tuple[int, int, int, int],
|
||||
velocity: list[float],
|
||||
predicted_time: float,
|
||||
) -> float:
|
||||
tracker = _make_tracker()
|
||||
tracker.tracked_object_history = {CAMERA: [{"box": box}]}
|
||||
tracker.tracked_object_metrics = {
|
||||
CAMERA: {"target_box": 0.2, "velocity": np.array(velocity)}
|
||||
}
|
||||
|
||||
return tracker._predict_target_box(CAMERA, predicted_time)
|
||||
|
||||
def test_target_box_grows_with_an_approaching_object(self) -> None:
|
||||
# the 200px height gains 4px per frame at 5 fps for 1 second
|
||||
zoom_factor = 0.3
|
||||
|
||||
self.assertAlmostEqual(
|
||||
self._target_box([-1, -2, 1, 2], 1.0),
|
||||
0.2 * (220 / 200) ** (2 * zoom_factor),
|
||||
)
|
||||
|
||||
def test_target_box_is_unchanged_without_growth_or_time(self) -> None:
|
||||
self.assertAlmostEqual(self._target_box([5, 0, 5, 0], 1.0), 0.2)
|
||||
self.assertEqual(self._target_box([-1, -2, 1, 2], 0), 0.2)
|
||||
|
||||
|
||||
class TestAutotrackerMoveQueue(unittest.IsolatedAsyncioTestCase):
|
||||
async def test_absolute_zoom_does_not_overwrite_the_pan_tilt_sample(self) -> None:
|
||||
tracker = _make_tracker()
|
||||
autotracking = tracker.config.cameras[CAMERA].onvif.autotracking
|
||||
autotracking.zooming = ZoomingModeEnum.absolute
|
||||
autotracking.calibrate_on_startup = True
|
||||
metrics = tracker.ptz_metrics[CAMERA]
|
||||
|
||||
tracker.stop_event = MagicMock()
|
||||
tracker.stop_event.is_set.side_effect = [False, True]
|
||||
tracker.move_queues = {CAMERA: asyncio.Queue()}
|
||||
tracker.move_queue_locks = {CAMERA: asyncio.Lock()}
|
||||
tracker.intercept = {CAMERA: 0.5}
|
||||
tracker.move_metrics = {CAMERA: []}
|
||||
tracker._wait_until_stopped = AsyncMock()
|
||||
tracker._calculate_move_coefficients = MagicMock()
|
||||
|
||||
async def move_relative(*_args) -> None:
|
||||
metrics.start_time.value = 100.0
|
||||
metrics.stop_time.value = 102.0
|
||||
|
||||
async def zoom_absolute(*_args) -> None:
|
||||
metrics.start_time.value = 103.0
|
||||
metrics.stop_time.value = 0
|
||||
|
||||
tracker.onvif._move_relative = AsyncMock(side_effect=move_relative)
|
||||
tracker.onvif._zoom_absolute = AsyncMock(side_effect=zoom_absolute)
|
||||
|
||||
tracker.move_queues[CAMERA].put_nowait((50.0, 0.5, 0.5, 0.5))
|
||||
await tracker._process_move_queue(CAMERA)
|
||||
|
||||
tracker.onvif._zoom_absolute.assert_awaited_once()
|
||||
self.assertEqual(
|
||||
tracker.move_metrics[CAMERA],
|
||||
[
|
||||
{
|
||||
"pan": 0.5,
|
||||
"tilt": 0.5,
|
||||
"start_timestamp": 100.0,
|
||||
"end_timestamp": 102.0,
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
class TestMaxTargetBox(unittest.TestCase):
|
||||
def test_follows_zoom_factor(self) -> None:
|
||||
self.assertAlmostEqual(calculate_max_target_box(0.5), 0.6**2)
|
||||
|
||||
@@ -9,6 +9,7 @@ import queue
|
||||
import re
|
||||
import shlex
|
||||
import struct
|
||||
import threading
|
||||
import time
|
||||
import urllib.parse
|
||||
from collections import deque
|
||||
@@ -42,6 +43,7 @@ class EventsPerSecond:
|
||||
self._max_events = max_events
|
||||
self._last_n_seconds = last_n_seconds
|
||||
self._timestamps: deque[float] = deque(maxlen=max_events)
|
||||
self._lock = threading.Lock()
|
||||
|
||||
def start(self) -> None:
|
||||
self._start = time.monotonic()
|
||||
@@ -71,8 +73,11 @@ class EventsPerSecond:
|
||||
# remove aged out timestamps
|
||||
def expire_timestamps(self, now: float) -> None:
|
||||
threshold = now - self._last_n_seconds
|
||||
while self._timestamps and self._timestamps[0] < threshold:
|
||||
self._timestamps.popleft()
|
||||
|
||||
# update() and eps() can run on different threads
|
||||
with self._lock:
|
||||
while self._timestamps and self._timestamps[0] < threshold:
|
||||
self._timestamps.popleft()
|
||||
|
||||
|
||||
class InferenceSpeed:
|
||||
|
||||
@@ -1289,8 +1289,6 @@
|
||||
},
|
||||
"apiKey": {
|
||||
"title": "Ключ API Frigate+",
|
||||
"validated": "Ключ API Frigate+ выяўлены і правераны",
|
||||
"notValidated": "Ключ API Frigate+ не выяўлены або не правераны",
|
||||
"desc": "Ключ API Frigate+ уключае інтэграцыю з сэрвісам Frigate+.",
|
||||
"plusLink": "Падрабязней пра Frigate+"
|
||||
},
|
||||
|
||||
@@ -1086,8 +1086,6 @@
|
||||
},
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API ključ",
|
||||
"validated": "Frigate+ API ključ je detektovan i validiran",
|
||||
"notValidated": "Frigate+ API ključ nije detektovan ili nije validiran",
|
||||
"desc": "Frigate+ API ključ omogućava integraciju sa uslugom Frigate+.",
|
||||
"plusLink": "Pročitajte više o Frigate+"
|
||||
},
|
||||
|
||||
@@ -714,9 +714,14 @@
|
||||
"apiKey": {
|
||||
"plusLink": "Llegeix més sobre Frigate+",
|
||||
"title": "Clau API de Frigate+",
|
||||
"validated": "La clau API de Frigate+ ha estat detectada i validada",
|
||||
"notValidated": "La clau API de Frigate+ no ha estat detectada o no ha estat validada",
|
||||
"desc": "La clau API de Frigate+ habilita la integració amb el servei Frigate+."
|
||||
"desc": "La clau API de Frigate+ habilita la integració amb el servei Frigate+.",
|
||||
"formatValid": "S'ha detectat la clau API Frigate+ i coincideix amb el format esperat",
|
||||
"formatInvalid": "La clau API Frigate+ no es detecta o no coincideix amb el format esperat",
|
||||
"validate": "Valida amb Frigate+",
|
||||
"validating": "S'està validant…",
|
||||
"serverValid": "Frigate+ ha acceptat aquesta clau API",
|
||||
"serverInvalid": "Frigate+ ha rebutjat aquesta clau API",
|
||||
"serverUnreachable": "No s'ha pogut arribar a Frigate+ per validar aquesta clau API"
|
||||
},
|
||||
"unsavedChanges": "Canvis dels paràmetres de Frigate+ sense desar",
|
||||
"title": "Paràmetres de Frigate+",
|
||||
|
||||
@@ -58,9 +58,7 @@
|
||||
"cleanCopyWarning": "Některé kamery mají snímky zakázané"
|
||||
},
|
||||
"apiKey": {
|
||||
"notValidated": "API klíč Frigate+ nebyl rozpoznán nebo nebyl ověřen",
|
||||
"plusLink": "Přečtěte si více o Frigate+",
|
||||
"validated": "API klíč Frigate+ byl rozpoznán a ověřen",
|
||||
"desc": "API klíč Frigate+ umožňuje integraci se službou Frigate+.",
|
||||
"title": "Frigate+ API Klíč"
|
||||
},
|
||||
|
||||
@@ -639,8 +639,6 @@
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API Key",
|
||||
"desc": "Der Frigate+ API Key aktiviert die Integration des Frigate+ Dienstes.",
|
||||
"validated": "Frigate+ API Key erkannt und validiert",
|
||||
"notValidated": "Frigate+ API Key nicht erkannt und validiert",
|
||||
"plusLink": "Lese mehr zu Frigate+"
|
||||
},
|
||||
"snapshotConfig": {
|
||||
|
||||
@@ -621,10 +621,8 @@
|
||||
"title": "Configuración de Frigate+",
|
||||
"apiKey": {
|
||||
"title": "Clave API de Frigate+",
|
||||
"notValidated": "La clave API de Frigate+ no ha sido detectada o no ha sido validada",
|
||||
"plusLink": "Lee más sobre Frigate+",
|
||||
"desc": "La clave API de Frigate+ permite la integración con el servicio Frigate+.",
|
||||
"validated": "La clave API de Frigate+ ha sido detectada y validada"
|
||||
"desc": "La clave API de Frigate+ permite la integración con el servicio Frigate+."
|
||||
},
|
||||
"snapshotConfig": {
|
||||
"title": "Configuración de instantáneas",
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
"24hour": "dd. MMM yyyy, HH:mm"
|
||||
},
|
||||
"formattedTimestampMonthDay": "dd. MMM",
|
||||
"never": "Mitte kunagi"
|
||||
"never": "Mitte kunagi",
|
||||
"custom": "Kohanadatud…"
|
||||
},
|
||||
"menu": {
|
||||
"user": {
|
||||
|
||||
@@ -1143,11 +1143,9 @@
|
||||
},
|
||||
"frigatePlus": {
|
||||
"apiKey": {
|
||||
"notValidated": "کلید API Frigate+ شناسایی نشده یا معتبرسازی نشده است",
|
||||
"desc": "کلید API Frigate+ امکان یکپارچهسازی با سرویس Frigate+ را فراهم میکند.",
|
||||
"plusLink": "دربارهٔ Frigate+ بیشتر بخوانید",
|
||||
"title": "کلید API فرigate+",
|
||||
"validated": "کلید API فرigate+ شناسایی و تأیید شد"
|
||||
"title": "کلید API فرigate+"
|
||||
},
|
||||
"snapshotConfig": {
|
||||
"title": "پیکربندی عکس فوری",
|
||||
|
||||
@@ -82,7 +82,8 @@
|
||||
"inProgress": "En cours",
|
||||
"invalidStartTime": "Heure de début invalide",
|
||||
"invalidEndTime": "Heure de fin invalide",
|
||||
"never": "Jamais"
|
||||
"never": "Jamais",
|
||||
"custom": "Personnalisé…"
|
||||
},
|
||||
"button": {
|
||||
"apply": "Appliquer",
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
"label": "Supprimer le groupe de caméras",
|
||||
"confirm": {
|
||||
"title": "Confirmez la suppression",
|
||||
"desc": "Êtes-vous sûr de vouloir supprimer le groupe de caméras <em>{{name}}</em> ?"
|
||||
"desc": "Êtes-vous sûr de vouloir supprimer le groupe de caméras <em>{{name}}</em>?"
|
||||
}
|
||||
},
|
||||
"name": {
|
||||
"placeholder": "Saisissez un nom.",
|
||||
"placeholder": "Saisissez un nom…",
|
||||
"label": "Nom",
|
||||
"errorMessage": {
|
||||
"mustLeastCharacters": "Le nom du groupe de caméras doit comporter au moins 2 caractères.",
|
||||
|
||||
@@ -87,7 +87,8 @@
|
||||
"placeholder": "Sélectionner un dossier",
|
||||
"newCaseOption": "Créer un nouveau cas",
|
||||
"newCaseNamePlaceholder": "Nouveau nom de cas",
|
||||
"newCaseDescriptionPlaceholder": "Description de cas"
|
||||
"newCaseDescriptionPlaceholder": "Description de cas",
|
||||
"nameRequired": "Nom du dossier requis"
|
||||
},
|
||||
"queueing": "Mise en file d'attente de l'export...",
|
||||
"tabs": {
|
||||
@@ -116,7 +117,9 @@
|
||||
"selectWithActivity": "Caméras avec des objets suivis",
|
||||
"selectGroup": "Sélectionner un groupe",
|
||||
"noMatchingCameras": "Aucune caméra ne correspond à votre recherche",
|
||||
"selectedCount": "{{selected}} / {{total}} sélectionnées"
|
||||
"selectedCount": "{{selected}} / {{total}} sélectionnées",
|
||||
"noCamerasSelected": "Sélectionner au moins une caméra",
|
||||
"caseNameDefault": "Export Caméra multiple - {{date}}"
|
||||
},
|
||||
"multi": {
|
||||
"title_one": "Export {{count}} revue",
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"title": "Toutes les dates",
|
||||
"short": "Dates"
|
||||
},
|
||||
"selectPreset": "Sélectionnez un préréglage."
|
||||
"selectPreset": "Sélectionnez un préréglage…"
|
||||
},
|
||||
"more": "Plus de filtres",
|
||||
"reset": {
|
||||
@@ -105,7 +105,7 @@
|
||||
"allLogs": "Tous les journaux"
|
||||
},
|
||||
"recognizedLicensePlates": {
|
||||
"placeholder": "Tapez pour rechercher des plaques d'immatriculation.",
|
||||
"placeholder": "Tapez pour rechercher des plaques d'immatriculation…",
|
||||
"noLicensePlatesFound": "Aucune plaque d'immatriculation trouvée",
|
||||
"loading": "Chargement des plaques d'immatriculation reconnues…",
|
||||
"title": "Plaques d'immatriculation reconnues",
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Customisation Audio",
|
||||
"description": "Remplacements ou entrées de remappage à fusionner avec la table standard des libellés audio."
|
||||
"description": "Remplacements ou réassignations à fusionner aux étiquettes audio standard."
|
||||
}
|
||||
},
|
||||
"audio_transcription": {
|
||||
@@ -78,8 +78,8 @@
|
||||
"description": "Emplacement numérique contrôlant l'ordre de la caméra dans la disposition en vue à vol d'oiseau."
|
||||
},
|
||||
"modes": {
|
||||
"label": "Types d'activité",
|
||||
"description": "Types d’activité qui incluent des caméras dans Birdseye."
|
||||
"label": "Types d'événements",
|
||||
"description": "Types d'activité qui incluent les caméras dans Birdseye."
|
||||
}
|
||||
},
|
||||
"detect": {
|
||||
@@ -143,7 +143,7 @@
|
||||
},
|
||||
"scene": {
|
||||
"label": "Détecter la scène",
|
||||
"description": "L'environnement filmé par cette caméra, utilisé pour déterminer lequel des modèles configurés doit être exécuté sur celle-ci. Les caméras laissées sur « default » utilisent le modèle configuré avec une scène définie sur « default »."
|
||||
"description": "L'environnement filmé par cette caméra, utilisé pour choisir le modèle configuré à exécuter. Les caméras laissées sur « default » exécutent le modèle configuré avec la scène « default »."
|
||||
}
|
||||
},
|
||||
"face_recognition": {
|
||||
@@ -240,6 +240,30 @@
|
||||
"quality": {
|
||||
"label": "Qualité de la diffusion en direct",
|
||||
"description": "Qualité de l'encodage pour le flux jsmpeg (1 étant la plus élevée, 31 la plus faible)."
|
||||
},
|
||||
"transcode": {
|
||||
"label": "Flux transcodés",
|
||||
"description": "Flux en direct transcodé en qualité inférieur à la demande de go2rtc.",
|
||||
"enabled": {
|
||||
"label": "Activé les flux transcodés",
|
||||
"description": "ajouter un flux en direct de qualité inférieur que go2rtc transcode en temps réel pendant que quelqu'un regarde."
|
||||
},
|
||||
"source": {
|
||||
"label": "Flux source",
|
||||
"description": "flux à décoder par go2rtc. Par défaut le premier flux en direct."
|
||||
},
|
||||
"qualities": {
|
||||
"label": "Qualités",
|
||||
"description": "Un flux transcodé est ajouté par qualité.",
|
||||
"height": {
|
||||
"label": "Taille",
|
||||
"description": "Taille de sortie en pixels; le forma respect le ratio de la source."
|
||||
},
|
||||
"bitrate": {
|
||||
"label": "Bitrate",
|
||||
"description": "Cible et bitrate maximum de la vidéo en kbps."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"lpr": {
|
||||
@@ -517,6 +541,41 @@
|
||||
"enabled_in_config": {
|
||||
"label": "État original de l'enregistrement",
|
||||
"description": "Indique si l'enregistrement était activé dans la configuration statique originale."
|
||||
},
|
||||
"sub": {
|
||||
"label": "Enregistrement flux secondaire",
|
||||
"description": "Paramètres pour enregistrer un second flux, de qualité moindre.",
|
||||
"enabled": {
|
||||
"label": "Activer l'enregistrement des flux secondaires",
|
||||
"description": "Activer l'enregistrement d'un flux secondaire, de qualité moindre pour une qualité adaptative et une rétention étendue."
|
||||
},
|
||||
"continuous": {
|
||||
"label": "Rétention continue des flux secondaires",
|
||||
"description": "Nombre de jour de rétention des enregistrements des flux secondaire sans prise en compte d'objet traqué ou de mouvement.",
|
||||
"days": {
|
||||
"label": "Jour de rétention",
|
||||
"description": "Combien de jour conserver les enregistrements."
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "Rétention des flux secondaires liés au mouvement",
|
||||
"description": "Nombre de jours de conservation des enregistrements des flux secondaires déclenchés par un mouvement.",
|
||||
"days": {
|
||||
"label": "Jours de rétention",
|
||||
"description": "Combien de jours conserver les enregistrements."
|
||||
}
|
||||
},
|
||||
"alerts": {
|
||||
"label": "Alerte rétention flux secondaires",
|
||||
"description": "Paramètres de conservation pour les flux secondaires liés aux alertes.",
|
||||
"days": {
|
||||
"label": "Jours de rétention",
|
||||
"description": "Nombre de jour de conservation des enregistrements lié à la détection d'événements."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Mode de rétention"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"review": {
|
||||
@@ -534,7 +593,7 @@
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "Zones requises",
|
||||
"description": "Zones qu'un objet doit entrer pour être considéré comme une alerte. (Laisser vide afin d'autoriser n'importe quelle zone.)"
|
||||
"description": "Zones dans lesquelles un objet doit entrer pour être considéré comme une alarme; laisser vide pour définir l'entièreté de la zone"
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "État des alertes originales",
|
||||
@@ -544,13 +603,13 @@
|
||||
"label": "Temps de coupure des alertes",
|
||||
"description": "Délai en secondes après l'absence d'activité déclenchant une alerte avant de la couper."
|
||||
},
|
||||
"description": "Paramètres pour lesquels les objets suivis génèrent des alertes et comment ces alertes sont conservées."
|
||||
"description": "Paramètres définissant quels objets suivis génèrent des alertes et comment ces alertes sont conservées."
|
||||
},
|
||||
"detections": {
|
||||
"label": "Configuration des détections",
|
||||
"description": "Paramètres pour lesquels les objets suivis génèrent des détections (hors alerte) et comment les détections sont conservées.",
|
||||
"enabled": {
|
||||
"label": "Activer les détections",
|
||||
"label": "Activation des détections",
|
||||
"description": "Activer ou désactiver les événements de détection pour cette caméra."
|
||||
},
|
||||
"labels": {
|
||||
|
||||
@@ -88,8 +88,8 @@
|
||||
"label": "Qualité d'encodage"
|
||||
},
|
||||
"modes": {
|
||||
"label": "Types d'activité",
|
||||
"description": "Types d’activité qui incluent des caméras dans Birdseye."
|
||||
"label": "Types d'événements",
|
||||
"description": "Types d'activité qui incluent les caméras dans Birdseye."
|
||||
}
|
||||
},
|
||||
"detect": {
|
||||
@@ -98,7 +98,7 @@
|
||||
},
|
||||
"scene": {
|
||||
"label": "Détecter la scène",
|
||||
"description": "L'environnement filmé par cette caméra, utilisé pour déterminer lequel des modèles configurés doit être exécuté sur celle-ci. Les caméras laissées sur « default » utilisent le modèle configuré avec une scène définie sur « default »."
|
||||
"description": "L'environnement filmé par cette caméra, utilisé pour choisir le modèle configuré à exécuter. Les caméras laissées sur « default » exécutent le modèle configuré avec la scène « default »."
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
@@ -222,7 +222,7 @@
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "Customisation Audio",
|
||||
"description": "Remplacements ou entrées de remappage à fusionner avec la table standard des libellés audio."
|
||||
"description": "Remplacements ou réassignations à fusionner aux étiquettes audio standard."
|
||||
}
|
||||
},
|
||||
"ffmpeg": {
|
||||
@@ -341,6 +341,41 @@
|
||||
"enabled_in_config": {
|
||||
"label": "État original de l'enregistrement",
|
||||
"description": "Indique si l'enregistrement était activé dans la configuration statique originale."
|
||||
},
|
||||
"sub": {
|
||||
"label": "Enregistrement flux secondaire",
|
||||
"description": "Paramètres pour enregistrer un second flux, de qualité moindre.",
|
||||
"enabled": {
|
||||
"label": "Activer l'enregistrement des flux secondaires",
|
||||
"description": "Activer l'enregistrement d'un flux secondaire, de qualité moindre pour une qualité adaptative et une rétention étendue."
|
||||
},
|
||||
"continuous": {
|
||||
"label": "Rétention continue des flux secondaires",
|
||||
"description": "Nombre de jour de rétention des enregistrements des flux secondaire sans prise en compte d'objet traqué ou de mouvement.",
|
||||
"days": {
|
||||
"label": "Jour de rétention",
|
||||
"description": "Combien de jour conserver les enregistrements."
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "Rétention des flux secondaires liés au mouvement",
|
||||
"description": "Nombre de jours de conservation des enregistrements des flux secondaires déclenchés par un mouvement.",
|
||||
"days": {
|
||||
"label": "Jours de rétention",
|
||||
"description": "Combien de jours conserver les enregistrements."
|
||||
}
|
||||
},
|
||||
"alerts": {
|
||||
"label": "Alerte rétention flux secondaires",
|
||||
"description": "Paramètres de conservation pour les flux secondaires liés aux alertes.",
|
||||
"days": {
|
||||
"label": "Jours de rétention",
|
||||
"description": "Nombre de jour de conservation des enregistrements lié à la détection d'événements."
|
||||
},
|
||||
"mode": {
|
||||
"label": "Mode de rétention"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"review": {
|
||||
@@ -356,7 +391,7 @@
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "Zones requises",
|
||||
"description": "Zones qu'un objet doit entrer pour être considéré comme une alerte. (Laisser vide afin d'autoriser n'importe quelle zone.)"
|
||||
"description": "Zones dans lesquelles un objet doit entrer pour être considéré comme une alarme; laisser vide pour définir l'entièreté de la zone"
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "État des alertes originales",
|
||||
@@ -366,13 +401,13 @@
|
||||
"label": "Temps de coupure des alertes",
|
||||
"description": "Délai en secondes après l'absence d'activité déclenchant une alerte avant de la couper."
|
||||
},
|
||||
"description": "Paramètres pour lesquels les objets suivis génèrent des alertes et comment ces alertes sont conservées."
|
||||
"description": "Paramètres définissant quels objets suivis génèrent des alertes et comment ces alertes sont conservées."
|
||||
},
|
||||
"detections": {
|
||||
"label": "Configuration des détections",
|
||||
"description": "Paramètres pour lesquels les objets suivis génèrent des détections (hors alerte) et comment les détections sont conservées.",
|
||||
"enabled": {
|
||||
"label": "Activer les détections"
|
||||
"label": "Activation des détections"
|
||||
},
|
||||
"labels": {
|
||||
"label": "Étiquettes de détection",
|
||||
@@ -415,5 +450,31 @@
|
||||
"description": "Une liste de préoccupations ou de notes supplémentaires que la GenAI devrait prendre en compte lors de l'évaluation de l'activité sur cette caméra."
|
||||
}
|
||||
}
|
||||
},
|
||||
"live": {
|
||||
"transcode": {
|
||||
"label": "Flux transcodés",
|
||||
"description": "Flux en direct transcodé en qualité inférieur à la demande de go2rtc.",
|
||||
"enabled": {
|
||||
"label": "Activé les flux transcodés",
|
||||
"description": "ajouter un flux en direct de qualité inférieur que go2rtc transcode en temps réel pendant que quelqu'un regarde."
|
||||
},
|
||||
"source": {
|
||||
"label": "Flux source",
|
||||
"description": "flux à décoder par go2rtc. Par défaut le premier flux en direct."
|
||||
},
|
||||
"qualities": {
|
||||
"label": "Qualités",
|
||||
"description": "Un flux transcodé est ajouté par qualité.",
|
||||
"height": {
|
||||
"label": "Taille",
|
||||
"description": "Taille de sortie en pixels; le forma respect le ratio de la source."
|
||||
},
|
||||
"bitrate": {
|
||||
"label": "Bitrate",
|
||||
"description": "Cible et bitrate maximum de la vidéo en kbps."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,9 +209,7 @@
|
||||
},
|
||||
"frigatePlus": {
|
||||
"apiKey": {
|
||||
"notValidated": "La clé API Frigate+ n'est pas détectée ou n'est pas validée.",
|
||||
"title": "Clé API Frigate+",
|
||||
"validated": "La clé API Frigate+ est détectée et validée",
|
||||
"desc": "La clé API Frigate+ permet l'intégration avec le service Frigate+.",
|
||||
"plusLink": "En savoir plus sur Frigate+"
|
||||
},
|
||||
|
||||
@@ -573,8 +573,6 @@
|
||||
"title": "הגדרות +Frigate",
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API מפתח",
|
||||
"validated": "מפתח ה-API של Frigate+ זוהה ואושר",
|
||||
"notValidated": "מפתח ה-API של Frigate+ לא זוהה או לא אומת",
|
||||
"desc": "מפתח ה-API של Frigate+ מאפשר אינטגרציה עם שירות Frigate+.",
|
||||
"plusLink": "קרא עוד על Frigate+"
|
||||
},
|
||||
|
||||
@@ -141,5 +141,7 @@
|
||||
"aircraft": "विमान",
|
||||
"bicycle": "साइकिल",
|
||||
"bellow": "गर्जना करना",
|
||||
"motorcycle": "मोटरसाइकिल"
|
||||
"motorcycle": "मोटरसाइकिल",
|
||||
"snicker": "खिलखिलाना",
|
||||
"choir": "गायक-वृन्द"
|
||||
}
|
||||
|
||||
@@ -897,8 +897,6 @@
|
||||
"title": "Frigate+ postavke",
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API ključ",
|
||||
"validated": "Frigate+ API ključ je detektiran i validiran",
|
||||
"notValidated": "Frigate+ API ključ nije detektiran ili nije validiran",
|
||||
"desc": "Frigate+ API ključ omogućuje integraciju s Frigate+ uslugom.",
|
||||
"plusLink": "Pročitajte više o Frigate+"
|
||||
},
|
||||
|
||||
@@ -246,8 +246,6 @@
|
||||
"apiKey": {
|
||||
"plusLink": "Tudjon meg többet a Frigate+-ról",
|
||||
"title": "Frigate+ API kulcs",
|
||||
"validated": "Frigate+ API kulcs észlelve és ellenőrizve",
|
||||
"notValidated": "Frigate+ API kulcs nem található vagy nem ellenőrzött",
|
||||
"desc": "A Frigate+ API kulcs lehetővé teszi az integrációt a Frigate+ szolgáltatással."
|
||||
},
|
||||
"snapshotConfig": {
|
||||
|
||||
@@ -1310,8 +1310,6 @@
|
||||
},
|
||||
"apiKey": {
|
||||
"title": "Kunci API Frigate+",
|
||||
"validated": "Kunci API Frigate+ terdeteksi dan tervalidasi",
|
||||
"notValidated": "Kunci API Frigate+ tidak terdeteksi atau tidak tervalidasi",
|
||||
"desc": "Kunci API Frigate+ memungkinkan integrasi dengan layanan Frigate+.",
|
||||
"plusLink": "Baca lebih lanjut tentang Frigate+"
|
||||
},
|
||||
|
||||
@@ -29,8 +29,6 @@
|
||||
},
|
||||
"apiKey": {
|
||||
"title": "Chiave API Frigate+",
|
||||
"validated": "La chiave API Frigate+ è stata rilevata e convalidata",
|
||||
"notValidated": "La chiave API Frigate+ non è stata rilevata o non è stata convalidata",
|
||||
"desc": "La chiave API Frigate+ consente l'integrazione con il servizio Frigate+.",
|
||||
"plusLink": "Scopri di più su Frigate+"
|
||||
},
|
||||
|
||||
@@ -734,8 +734,6 @@
|
||||
"title": "Frigate+ 設定",
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API キー",
|
||||
"validated": "Frigate+ API キーが検出され、検証されました",
|
||||
"notValidated": "Frigate+ API キーが検出されないか、検証されていません",
|
||||
"desc": "Frigate+ API キーは Frigate+ サービスとの統合を有効にします。",
|
||||
"plusLink": "Frigate+ の詳細を読む"
|
||||
},
|
||||
|
||||
@@ -1193,8 +1193,6 @@
|
||||
},
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API Key",
|
||||
"validated": "Frigate+ API key ត្រូវបានរកឃើញ និងផ្ទៀងផ្ទាត់",
|
||||
"notValidated": "Frigate+ API key មិនត្រូវបានរកឃើញ ឬមិនបានផ្ទៀងផ្ទាត់",
|
||||
"desc": "Frigate+ API key អនុញ្ញាតឱ្យមានការរួមបញ្ចូលជាមួយសេវាកម្ម Frigate+។",
|
||||
"plusLink": "អានបន្ថែមអំពី Frigate+"
|
||||
},
|
||||
|
||||
@@ -1373,8 +1373,6 @@
|
||||
},
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API 키",
|
||||
"validated": "Frigate+ API 키가 확인 및 검증되었습니다",
|
||||
"notValidated": "Frigate+ API 키가 감지되지 않았거나 유효하지 않습니다",
|
||||
"desc": "Frigate+ API 키를 통해 Frigate+ 서비스와의 연동을 활성화합니다.",
|
||||
"plusLink": "Frigate+ 자세히 알아보기"
|
||||
},
|
||||
|
||||
@@ -657,8 +657,6 @@
|
||||
"title": "Frigate+ Nustatymai",
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API raktas",
|
||||
"validated": "Frigate+ API raktas aptiktas ir patvirtintas",
|
||||
"notValidated": "Frigate+ API raktas neaptiktas ir nepatvirtintas",
|
||||
"desc": "Frigate+ API raktas įgalina integraciją su Frigate+ paslauga.",
|
||||
"plusLink": "Skaityti daugiau apie Frigate+"
|
||||
},
|
||||
|
||||
@@ -616,9 +616,7 @@
|
||||
},
|
||||
"frigatePlus": {
|
||||
"apiKey": {
|
||||
"notValidated": "Frigate+ API-nøkkel er ikke detektert eller validert",
|
||||
"title": "Frigate+ API-nøkkel",
|
||||
"validated": "Frigate+ API-nøkkel er detektert og validert",
|
||||
"desc": "Frigate+ API-nøkkelen muliggjør integrasjon med Frigate+ tjenesten.",
|
||||
"plusLink": "Les mer om Frigate+"
|
||||
},
|
||||
|
||||
@@ -618,9 +618,7 @@
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API-sleutel",
|
||||
"plusLink": "Lees meer over Frigate+",
|
||||
"validated": "Frigate+ API-sleutel is gedetecteerd en gevalideerd",
|
||||
"desc": "Met de Frigate+ API-sleutel is integratie met de Frigate+ service mogelijk.",
|
||||
"notValidated": "Frigate+ API-sleutel wordt niet gedetecteerd of niet gevalideerd"
|
||||
"desc": "Met de Frigate+ API-sleutel is integratie met de Frigate+ service mogelijk."
|
||||
},
|
||||
"snapshotConfig": {
|
||||
"title": "Snapshot-configuratie",
|
||||
|
||||
@@ -621,9 +621,7 @@
|
||||
"title": "Ustawienia Frigate+",
|
||||
"apiKey": {
|
||||
"title": "Klucz API Frigate+",
|
||||
"validated": "Klucz API Frigate+ został wykryty i zweryfikowany",
|
||||
"plusLink": "Dowiedz się więcej o Frigate+",
|
||||
"notValidated": "Klucz API Frigate+ nie został wykryty lub nie został zweryfikowany",
|
||||
"desc": "Klucz API Frigate+ umożliwia integrację z usługą Frigate+."
|
||||
},
|
||||
"snapshotConfig": {
|
||||
|
||||
@@ -719,8 +719,6 @@
|
||||
"title": "Configurações do Frigate+",
|
||||
"apiKey": {
|
||||
"title": "Chave de API do Frigate+",
|
||||
"validated": "A chave de API do Frigate+ detectada e validada",
|
||||
"notValidated": "Chave de API do Frigate+ não detectada ou não validada",
|
||||
"desc": "A chave de API do Frigate+ habilita a integração com o serviço do Frigate+.",
|
||||
"plusLink": "Leia mais sobre o Frigate+"
|
||||
},
|
||||
|
||||
@@ -173,8 +173,6 @@
|
||||
},
|
||||
"title": "Configurações Frigate+",
|
||||
"apiKey": {
|
||||
"validated": "A chave da API do Frigate+ foi detectada e validada",
|
||||
"notValidated": "A chave da API do Frigate+ não foi detectada ou não foi validada",
|
||||
"desc": "A chave de API do Frigate+ permite a integração com o serviço Frigate+.",
|
||||
"plusLink": "Saiba mais sobre o Frigate+",
|
||||
"title": "Chave de API do Frigate+"
|
||||
|
||||
@@ -715,9 +715,14 @@
|
||||
"apiKey": {
|
||||
"plusLink": "Citește mai multe despre Frigate+",
|
||||
"desc": "Cheia API Frigate+ permite integrarea cu serviciul Frigate+.",
|
||||
"validated": "Cheia API Frigate+ a fost detectată și validată",
|
||||
"title": "Cheie API Frigate+",
|
||||
"notValidated": "Cheia API Frigate+ nu este detectată sau validată"
|
||||
"formatValid": "Cheia API Frigate+ este detectată și corespunde formatului așteptat",
|
||||
"formatInvalid": "Cheia API Frigate+ nu este detectată sau nu corespunde formatului așteptat",
|
||||
"validate": "Validează cu Frigate+",
|
||||
"validating": "Se validează…",
|
||||
"serverValid": "Frigate+ a acceptat această cheie API",
|
||||
"serverInvalid": "Frigate+ a respins această cheie API",
|
||||
"serverUnreachable": "Nu s-a putut contacta Frigate+ pentru a valida această cheie API"
|
||||
},
|
||||
"snapshotConfig": {
|
||||
"title": "Configurare snapshot-uri",
|
||||
|
||||
@@ -631,8 +631,6 @@
|
||||
"title": "Настройки Frigate+",
|
||||
"apiKey": {
|
||||
"title": "Ключ API Frigate+",
|
||||
"validated": "Ключ API Frigate+ найден и проверен",
|
||||
"notValidated": "Ключ API Frigate+ не найден или не проверен",
|
||||
"desc": "Ключ API Frigate+ включает интеграцию с сервисом Frigate+.",
|
||||
"plusLink": "Подробнее про Frigate+"
|
||||
},
|
||||
|
||||
@@ -883,8 +883,6 @@
|
||||
"title": "Nastavenie Frigate+",
|
||||
"apiKey": {
|
||||
"title": "Frigate + API kľúč",
|
||||
"validated": "Frigate + API kľúč je detekovaný a overený",
|
||||
"notValidated": "Frigate + API kľúč nie je detekovaný alebo nie je overený",
|
||||
"desc": "Frigate+ API kľúč umožňuje integráciu s Frigate+ služby.",
|
||||
"plusLink": "Prečítajte si viac o Frigate+"
|
||||
},
|
||||
|
||||
@@ -1142,8 +1142,6 @@
|
||||
},
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API ključ",
|
||||
"validated": "API ključ je zaznan in potrjen",
|
||||
"notValidated": "API ključ ni zaznan ali ni veljaven",
|
||||
"desc": "API ključ omogoča integracijo s storitvijo Frigate+.",
|
||||
"plusLink": "Preberi več o Frigate+"
|
||||
},
|
||||
|
||||
@@ -1 +1,368 @@
|
||||
{}
|
||||
{
|
||||
"time": {
|
||||
"untilForTime": "Do {{time}}",
|
||||
"untilForRestart": "Dok se Frigate ne ponovo pokrene.",
|
||||
"untilRestart": "Do ponovnog pokretanja",
|
||||
"never": "Nikada",
|
||||
"ago": "Pre {{timeAgo}}",
|
||||
"justNow": "Upravo sada",
|
||||
"today": "Danas",
|
||||
"yesterday": "Juče",
|
||||
"last7": "Poslednjih 7 dana",
|
||||
"last14": "Poslednjih 14 dana",
|
||||
"last30": "Poslednjih 30 dana",
|
||||
"thisWeek": "Ove nedelje",
|
||||
"lastWeek": "Prošle nedelje",
|
||||
"thisMonth": "Ovog meseca",
|
||||
"lastMonth": "Prošlog meseca",
|
||||
"5minutes": "5 minuta",
|
||||
"10minutes": "10 minuta",
|
||||
"30minutes": "30 minuta",
|
||||
"1hour": "1 sat",
|
||||
"12hours": "12 sati",
|
||||
"24hours": "24 sata",
|
||||
"custom": "Prilagođeno...",
|
||||
"pm": "popodne",
|
||||
"am": "pre podne",
|
||||
"yr": "{{time}} god.",
|
||||
"year_one": "{{time}} godina",
|
||||
"year_few": "{{time}} godine",
|
||||
"year_other": "{{time}} godina",
|
||||
"mo": "{{time}} mes.",
|
||||
"month_one": "{{time}} mesec",
|
||||
"month_few": "{{time}} meseca",
|
||||
"month_other": "{{time}} meseci",
|
||||
"d": "{{time}} d.",
|
||||
"day_one": "{{time}} dan",
|
||||
"day_few": "{{time}} dana",
|
||||
"day_other": "{{time}} dana",
|
||||
"h": "{{time}} č.",
|
||||
"hour_one": "{{time}} sat",
|
||||
"hour_few": "{{time}} sata",
|
||||
"hour_other": "{{time}} sati",
|
||||
"m": "{{time}} min.",
|
||||
"minute_one": "{{time}} minut",
|
||||
"minute_few": "{{time}} minuta",
|
||||
"minute_other": "{{time}} minuta",
|
||||
"s": "{{time}} s",
|
||||
"second_one": "{{time}} sekunda",
|
||||
"second_few": "{{time}} sekunde",
|
||||
"second_other": "{{time}} sekundi",
|
||||
"formattedTimestamp": {
|
||||
"12hour": "d. MMM, h:mm:ss aaa",
|
||||
"24hour": "d. MMM, HH:mm:ss"
|
||||
},
|
||||
"formattedTimestamp2": {
|
||||
"12hour": "dd.MM. h:mm:ssa",
|
||||
"24hour": "d. 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": "d. MMM yyyy, HH:mm"
|
||||
},
|
||||
"formattedTimestampMonthDay": "d. MMM",
|
||||
"formattedTimestampFilename": {
|
||||
"12hour": "dd-MM-yy-h-mm-ss-a",
|
||||
"24hour": "dd-MM-yy-HH-mm-ss"
|
||||
},
|
||||
"inProgress": "U toku",
|
||||
"invalidStartTime": "Nevažeće vreme početka",
|
||||
"invalidEndTime": "Nevažeće vreme završetka"
|
||||
},
|
||||
"commandMenu": {
|
||||
"action": {
|
||||
"toggleTheme": "Prebaci na svetli ili tamni režim"
|
||||
},
|
||||
"camera": {
|
||||
"review": "Pregled",
|
||||
"live": "Uživo"
|
||||
},
|
||||
"section": {
|
||||
"actions": "Akcije",
|
||||
"settings": "Podešavanja",
|
||||
"cameraGroups": "Grupe kamera",
|
||||
"cameras": "Kamere",
|
||||
"pages": "Stranice",
|
||||
"recent": "Nedavno"
|
||||
},
|
||||
"hint": "{{key}} ili / za otvaranje, Enter za pokretanje",
|
||||
"empty": "Nema rezultata",
|
||||
"placeholder": "Pretražite stranice, kamere, podešavanja i akcije",
|
||||
"description": "Pretražite stranice, kamere, podešavanja i akcije",
|
||||
"title": "Komandni meni"
|
||||
},
|
||||
"credentialField": {
|
||||
"savedPlaceholder": "Sačuvano — ostavite prazno da zadržite trenutno stanje"
|
||||
},
|
||||
"validation_errors": "Greške pri validaciji",
|
||||
"unit": {
|
||||
"speed": {
|
||||
"kph": "km/h",
|
||||
"mph": "mph"
|
||||
},
|
||||
"length": {
|
||||
"feet": "stopa",
|
||||
"meters": "metri"
|
||||
},
|
||||
"data": {
|
||||
"kbps": "kB/s",
|
||||
"mbps": "MB/s",
|
||||
"gbps": "GB/s",
|
||||
"kbph": "kB/sat",
|
||||
"mbph": "MB/sat",
|
||||
"gbph": "GB/sat"
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"back": "Idi nazad",
|
||||
"hide": "Sakrij {{item}}",
|
||||
"show": "Prikaži {{item}}",
|
||||
"ID": "ID",
|
||||
"none": "Ništa",
|
||||
"all": "Sve",
|
||||
"other": "Ostalo"
|
||||
},
|
||||
"list": {
|
||||
"two": "{{0}} i {{1}}",
|
||||
"many": "{{items}} i {{last}}",
|
||||
"separatorWithSpace": ", "
|
||||
},
|
||||
"field": {
|
||||
"optional": "Opciono",
|
||||
"internalID": "Interni ID koji Frigate koristi u konfiguraciji i bazi podataka"
|
||||
},
|
||||
"button": {
|
||||
"add": "Dodaj",
|
||||
"apply": "Primeni",
|
||||
"applying": "Primenjuje se…",
|
||||
"reset": "Resetuj",
|
||||
"undo": "Opozovi",
|
||||
"done": "Završeno",
|
||||
"enabled": "Omogućeno",
|
||||
"enable": "Omogući",
|
||||
"disabled": "Onemogućeno",
|
||||
"disable": "Onemogući",
|
||||
"save": "Sačuvaj",
|
||||
"saving": "Čuvanje…",
|
||||
"cancel": "Otkaži",
|
||||
"close": "Zatvori",
|
||||
"expand": "Proširi",
|
||||
"collapse": "Skupi",
|
||||
"clear": "Očisti",
|
||||
"copy": "Kopiraj",
|
||||
"copiedToClipboard": "Kopirano u privremenu memoriju",
|
||||
"back": "Nazad",
|
||||
"history": "Istorija",
|
||||
"fullscreen": "Ceo ekran",
|
||||
"exitFullscreen": "Izađi iz celog ekrana",
|
||||
"pictureInPicture": "Slika u slici",
|
||||
"twoWayTalk": "Dvosmerna komunikacija",
|
||||
"cameraAudio": "Zvuk kamere",
|
||||
"on": "Uključeno",
|
||||
"off": "Isključeno",
|
||||
"edit": "Izmeni",
|
||||
"copyCoordinates": "Kopiraj koordinate",
|
||||
"delete": "Obriši",
|
||||
"yes": "Da",
|
||||
"no": "Ne",
|
||||
"download": "Preuzmi",
|
||||
"info": "Informacije",
|
||||
"suspended": "Suspendovano",
|
||||
"unsuspended": "Aktiviraj ponovo",
|
||||
"play": "Pusti",
|
||||
"unselect": "Poništi izbor",
|
||||
"export": "Izvezi",
|
||||
"deleteNow": "Obriši odmah",
|
||||
"next": "Sledeće",
|
||||
"continue": "Nastavi",
|
||||
"modified": "Izmenjeno",
|
||||
"overridden": "Nadjačano",
|
||||
"resetToGlobal": "Vrati na globalna podešavanja",
|
||||
"resetToDefault": "Vrati na podrazumevano",
|
||||
"saveAll": "Sačuvaj sve",
|
||||
"savingAll": "Čuvanje svega…",
|
||||
"undoAll": "Opozovi sve",
|
||||
"retry": "Pokušaj ponovo",
|
||||
"reload": "Osveži"
|
||||
},
|
||||
"menu": {
|
||||
"system": "Sistem",
|
||||
"systemMetrics": "Stanje i metrike",
|
||||
"configuration": "Konfiguracija",
|
||||
"systemLogs": "Dnevnik",
|
||||
"profiles": "Profili",
|
||||
"settings": "Podešavanja",
|
||||
"configurationEditor": "Editor konfiguracije",
|
||||
"languages": "Jezici",
|
||||
"language": {
|
||||
"en": "Engleski (English)",
|
||||
"es": "Španski (Español)",
|
||||
"zhCN": "Pojednostavljeni kineski (简体中文)",
|
||||
"zhHant": "Tradicionalni kineski (繁體中文)",
|
||||
"hi": "Hindi (हिन्दी)",
|
||||
"fr": "Francuski (Français)",
|
||||
"ar": "Arapski (العربية)",
|
||||
"pt": "Portugalski (Português)",
|
||||
"ptBR": "Brazilski portugalski (Português brasileiro)",
|
||||
"ru": "Ruski (Русский)",
|
||||
"de": "Nemački (Deutsch)",
|
||||
"ja": "Japanski (日本語)",
|
||||
"tr": "Turski (Türkçe)",
|
||||
"it": "Italijanski (Italiano)",
|
||||
"nl": "Holandski (Nederlands)",
|
||||
"sv": "Švedski (Svenska)",
|
||||
"cs": "Češki (Čeština)",
|
||||
"nb": "Norveški bukmol (Norsk Bokmål)",
|
||||
"ko": "Korejski (한국어)",
|
||||
"vi": "Vijetnamski (Tiếng Việt)",
|
||||
"fa": "Persijski (فارسی)",
|
||||
"pl": "Poljski (Polski)",
|
||||
"uk": "Ukrajinski (Українська)",
|
||||
"be": "Beloruski (Беларуская)",
|
||||
"he": "Hebrejski (עברית)",
|
||||
"el": "Grčki (Ελληνικά)",
|
||||
"ro": "Rumunski (Română)",
|
||||
"hu": "Mađarski (Magyar)",
|
||||
"fi": "Finski (Suomi)",
|
||||
"da": "Danski (Dansk)",
|
||||
"sk": "Slovački (Slovenčina)",
|
||||
"yue": "Kantonski (粵語)",
|
||||
"th": "Tajlandski (ไทย)",
|
||||
"ca": "Katalonski (Català)",
|
||||
"hr": "Hrvatski (Hrvatski)",
|
||||
"bs": "Bosanski (Bosanski)",
|
||||
"sr": "Srpski (Српски)",
|
||||
"sl": "Slovenački (Slovenščina)",
|
||||
"lt": "Litvanski (Lietuvių)",
|
||||
"bg": "Bugarski (Български)",
|
||||
"gl": "Galicijski (Galego)",
|
||||
"id": "Indonežanski (Bahasa Indonesia)",
|
||||
"ur": "Urdu (اردو)",
|
||||
"withSystem": {
|
||||
"label": "Koristi sistemska podešavanja za jezik"
|
||||
}
|
||||
},
|
||||
"appearance": "Izgled",
|
||||
"darkMode": {
|
||||
"label": "Tamni režim",
|
||||
"light": "Svetli",
|
||||
"dark": "Tamni",
|
||||
"withSystem": {
|
||||
"label": "Koristi sistemska podešavanja za svetli ili tamni režim"
|
||||
}
|
||||
},
|
||||
"withSystem": "Sistem",
|
||||
"theme": {
|
||||
"label": "Tema",
|
||||
"blue": "Plava",
|
||||
"green": "Zelena",
|
||||
"nord": "Nord",
|
||||
"red": "Crvena",
|
||||
"highcontrast": "Visok kontrast",
|
||||
"default": "Podrazumevano"
|
||||
},
|
||||
"help": "Pomoć",
|
||||
"documentation": {
|
||||
"title": "Dokumentacija",
|
||||
"label": "Frigate dokumentacija"
|
||||
},
|
||||
"restart": "Ponovo pokreni Frigate",
|
||||
"live": {
|
||||
"title": "Uživo",
|
||||
"allCameras": "Sve kamere",
|
||||
"cameras": {
|
||||
"title": "Kamere",
|
||||
"count_one": "{{count}} kamera",
|
||||
"count_few": "{{count}} kamere",
|
||||
"count_other": "{{count}} kamera"
|
||||
}
|
||||
},
|
||||
"review": "Pregled",
|
||||
"explore": "Istraži",
|
||||
"export": "Izvezi",
|
||||
"actions": "Akcije",
|
||||
"uiPlayground": "Korisničko okruženje za testiranje",
|
||||
"features": "Funkcije",
|
||||
"faceLibrary": "Biblioteka lica",
|
||||
"classification": "Klasifikacija",
|
||||
"chat": "Ćaskanje",
|
||||
"user": {
|
||||
"title": "Korisnik",
|
||||
"account": "Nalog",
|
||||
"current": "Trenutni korisnik: {{user}}",
|
||||
"anonymous": "anoniman",
|
||||
"logout": "Odjavi se",
|
||||
"setPassword": "Postavi lozinku"
|
||||
}
|
||||
},
|
||||
"toast": {
|
||||
"copyUrlToClipboard": "URL je kopiran u privremenu memoriju.",
|
||||
"save": {
|
||||
"title": "Sačuvaj",
|
||||
"error": {
|
||||
"title": "Neuspešno čuvanje promena u konfiguraciji: {{errorMessage}}",
|
||||
"noMessage": "Neuspešno čuvanje promena u konfiguraciji"
|
||||
},
|
||||
"success": "Promene u konfiguraciji su uspešno sačuvane."
|
||||
}
|
||||
},
|
||||
"role": {
|
||||
"title": "Uloga",
|
||||
"admin": "Administrator",
|
||||
"viewer": "Posmatrač",
|
||||
"desc": "Administratori imaju potpun pristup svim funkcijama u Frigate korisničkom interfejsu. Gledaci su ograničeni na gledanje kamera, pregled stavki i istorijskih snimaka u korisničkom interfejsu."
|
||||
},
|
||||
"pagination": {
|
||||
"label": "straničenje",
|
||||
"previous": {
|
||||
"title": "Prethodna",
|
||||
"label": "Idi na prethodnu stranicu"
|
||||
},
|
||||
"next": {
|
||||
"title": "Sledeća",
|
||||
"label": "Idi na sledeću stranicu"
|
||||
},
|
||||
"more": "Više stranica"
|
||||
},
|
||||
"accessDenied": {
|
||||
"documentTitle": "Pristup odbijen - Frigate",
|
||||
"title": "Pristup odbijen",
|
||||
"desc": "Nemate dozvolu za pregled ove stranice."
|
||||
},
|
||||
"notFound": {
|
||||
"documentTitle": "Nije pronađeno - Frigate",
|
||||
"title": "404",
|
||||
"desc": "Stranica nije pronađena"
|
||||
},
|
||||
"error": {
|
||||
"title": "Ova stranica je prestala sa radom",
|
||||
"desc": "Došlo je do neočekivane greške na stranici. Osvežavanje obično rešava problem. Ako se greška ponavlja, kopirajte detalje i priložite ih diskusiji na GitHub-u.",
|
||||
"staleTitle": "Potrebno je osvežavanje",
|
||||
"staleDesc": "Deo aplikacije nije mogao da se učita, što obično znači da je Frigate ažuriran dok je ova kartica bila otvorena. Osvežite stranicu da biste prešli na novu verziju.",
|
||||
"partial": "Deo aplikacije je prestao sa radom.",
|
||||
"copyDetails": "Kopiraj detalje",
|
||||
"copyFailed": "Neuspešno kopiranje detalja u privremenu memoriju"
|
||||
},
|
||||
"selectItem": "Izaberi {{item}}",
|
||||
"readTheDocumentation": "Pročitaj dokumentaciju",
|
||||
"information": {
|
||||
"pixels": "{{area}} px"
|
||||
},
|
||||
"no_items": "Nema elemenata"
|
||||
}
|
||||
|
||||
@@ -1 +1,90 @@
|
||||
{}
|
||||
{
|
||||
"group": {
|
||||
"label": "Grupe kamera",
|
||||
"add": "Dodaj grupu kamera",
|
||||
"showAll": "Prikaži sve grupe kamera",
|
||||
"showLess": "Prikaži manje",
|
||||
"edit": "Izmeni grupu kamera",
|
||||
"editGroups": "Izmeni grupe kamera",
|
||||
"delete": {
|
||||
"label": "Obriši grupu kamera",
|
||||
"confirm": {
|
||||
"title": "Potvrdite brisanje",
|
||||
"desc": "Da li ste sigurni da želite da obrišete grupu kamera <em>{{name}}</em>?"
|
||||
}
|
||||
},
|
||||
"name": {
|
||||
"label": "Naziv",
|
||||
"placeholder": "Unesite naziv…",
|
||||
"errorMessage": {
|
||||
"mustLeastCharacters": "Naziv grupe kamera mora imati najmanje 2 karaktera.",
|
||||
"exists": "Naziv grupe kamera već postoji.",
|
||||
"nameMustNotPeriod": "Naziv grupe kamera ne sme da sadrži tačku.",
|
||||
"invalid": "Nevažeći naziv grupe kamera."
|
||||
}
|
||||
},
|
||||
"cameras": {
|
||||
"label": "Kamere",
|
||||
"desc": "Izaberite kamere za ovu grupu."
|
||||
},
|
||||
"icon": "Ikona",
|
||||
"success": "Grupa kamera ({{name}}) je sačuvana.",
|
||||
"camera": {
|
||||
"birdseye": "Birdseye",
|
||||
"setting": {
|
||||
"label": "Podešavanja strimovanja kamere",
|
||||
"title": "Podešavanja strimovanja za kameru {{cameraName}}",
|
||||
"desc": "Promenite opcije strimovanja uživo za kontrolnu tablu ove grupe kamera. <em>Ova podešavanja su specifična za uređaj/veb-pregledač.</em>",
|
||||
"audioIsAvailable": "Zvuk je dostupan za ovaj strim",
|
||||
"audioIsUnavailable": "Zvuk je nedostupan za ovaj strim",
|
||||
"audio": {
|
||||
"tips": {
|
||||
"title": "Zvuk mora biti poslat sa vaše kamere i konfigurisan u go2rtc-u za ovaj strim."
|
||||
}
|
||||
},
|
||||
"stream": "Strim",
|
||||
"placeholder": "Izaberite strim",
|
||||
"streamMethod": {
|
||||
"label": "Metod strimovanja",
|
||||
"placeholder": "Izaberite metod strimovanja",
|
||||
"method": {
|
||||
"noStreaming": {
|
||||
"label": "Bez strimovanja",
|
||||
"desc": "Slike sa kamere će se osvežavati samo jednom u minuti i neće biti strimovanja uživo."
|
||||
},
|
||||
"smartStreaming": {
|
||||
"label": "Pametno strimovanje (preporučeno)",
|
||||
"desc": "Pametno strimovanje će osvežavati sliku sa vaše kamere jednom u minuti kada nema uočljivih aktivnosti, kako bi se uštedeo protok podataka i resursi. Kada se detektuje aktivnost, prikaz se neprimetno prebacuje na strim uživo."
|
||||
},
|
||||
"continuousStreaming": {
|
||||
"label": "Neprekidno strimovanje",
|
||||
"desc": {
|
||||
"title": "Slika sa kamere će uvek biti strim uživo kada je vidljiva na kontrolnoj tabli, čak i ako se ne detektuje nikakva aktivnost.",
|
||||
"warning": "Neprekidno strimovanje može izazvati visoku potrošnju protoka podataka i probleme sa performansama. Koristite oprezno."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibilityMode": {
|
||||
"label": "Režim kompatibilnosti",
|
||||
"desc": "Omogućite ovu opciju samo ako strim uživo sa vaše kamere prikazuje izobličenja boja (artefakte) i ima dijagonalnu liniju na desnoj strani slike."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"options": {
|
||||
"label": "Podešavanja",
|
||||
"title": "Opcije",
|
||||
"showOptions": "Prikaži opcije",
|
||||
"hideOptions": "Sakrij opcije"
|
||||
},
|
||||
"boundingBox": "Uokvireni prostor",
|
||||
"timestamp": "Vremenska oznaka",
|
||||
"zones": "Zone",
|
||||
"mask": "Maska",
|
||||
"motion": "Pokret",
|
||||
"regions": "Regioni",
|
||||
"paths": "Putanje"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,222 @@
|
||||
{}
|
||||
{
|
||||
"restart": {
|
||||
"title": "Da li ste sigurni da želite da ponovo pokrenete Frigate?",
|
||||
"description": "Ovo će nakratko zaustaviti Frigate dok se ponovo pokreće.",
|
||||
"button": "Ponovo pokreni",
|
||||
"restarting": {
|
||||
"title": "Frigate se ponovo pokreće",
|
||||
"content": "Ova stranica će se ponovo učitati za {{countdown}} sekundi.",
|
||||
"button": "Osveži odmah"
|
||||
}
|
||||
},
|
||||
"explore": {
|
||||
"plus": {
|
||||
"submitToPlus": {
|
||||
"label": "Pošalji na Frigate+",
|
||||
"desc": "Objekti na lokacijama koje želite da izbegnete nisu lažno pozitivni rezultati. Njihovo slanje kao lažno pozitivnih zbuniće model."
|
||||
},
|
||||
"review": {
|
||||
"question": {
|
||||
"label": "Potvrdite ovu oznaku za Frigate Plu",
|
||||
"ask_a": "Da li je ovaj objekat <code>{{label}}</code>?",
|
||||
"ask_an": "Da li je ovaj objekat <code>{{label}}</code>?",
|
||||
"ask_full": "Da li je ovaj objekat <code>{{untranslatedLabel}}</code> ({{translatedLabel}})?"
|
||||
},
|
||||
"state": {
|
||||
"submitted": "Poslato"
|
||||
},
|
||||
"toast": {
|
||||
"error": "Slanje na Frigate+ nije uspelo. Proverite mrežnu vezu i pokušajte ponovo."
|
||||
}
|
||||
}
|
||||
},
|
||||
"video": {
|
||||
"viewInHistory": "Prikaži u istoriji"
|
||||
}
|
||||
},
|
||||
"export": {
|
||||
"name": {
|
||||
"placeholder": "Imenujte izvezeni snimak"
|
||||
},
|
||||
"stream": {
|
||||
"label": "Kvalitet",
|
||||
"auto": "Automatski",
|
||||
"main": "Izvorni",
|
||||
"sub": "Nizak",
|
||||
"autoDesc": "Koristi glavni strim, a u slučaju njegove nedostupnosti prebacuje se na sporedni strim nižeg kvaliteta.",
|
||||
"mainDesc": "Izvozi isključivo glavni strim izvornog kvaliteta. Vremenski periodi u kojima glavni strim nije bio dostupan biće izostavljeni.",
|
||||
"subDesc": "Izvozi isključivo sporedni strim nižeg kvaliteta. Vremenski periodi u kojima sporedni strim nije bio dostupan biće izostavljeni."
|
||||
},
|
||||
"case": {
|
||||
"newCaseOption": "Kreiraj novi slučaj",
|
||||
"newCaseNamePlaceholder": "Naziv novog slučaja",
|
||||
"newCaseDescriptionPlaceholder": "Opis slučaja",
|
||||
"label": "Slučaj",
|
||||
"placeholder": "Izaberite slučaj",
|
||||
"nameRequired": "Naziv slučaja je obavezan"
|
||||
},
|
||||
"select": "Izaberi",
|
||||
"export": "Izvezi",
|
||||
"queueing": "Dodavanje izvoza u red...",
|
||||
"selectOrExport": "Izaberi ili izvezi",
|
||||
"tabs": {
|
||||
"export": "Jedna kamera",
|
||||
"multiCamera": "Više kamera"
|
||||
},
|
||||
"multiCamera": {
|
||||
"timeRange": "Vremenski opseg",
|
||||
"selectFromTimeline": "Izaberite sa vremenske linije",
|
||||
"cameraSelection": "Kamere",
|
||||
"checkingActivity": "Provera aktivnosti kamera...",
|
||||
"cameraSelectionHelp": "Kamere sa praćenim objektima u ovom vremenskom rasponu su unapred izabrane",
|
||||
"searchOrSelectGroup": "Pretražite ili izaberite grupu kamera...",
|
||||
"selectAll": "Izaberi sve kamere",
|
||||
"clearSelection": "Poništi izbor",
|
||||
"selectWithActivity": "Kamere sa praćenim objektima",
|
||||
"selectGroup": "Izaberi grupu",
|
||||
"noMatchingCameras": "Nema kamera koje odgovaraju pretrazi",
|
||||
"selectedCount": "Izabrano: {{selected}} od {{total}}",
|
||||
"noCameras": "Nema dostupnih kamera",
|
||||
"noCamerasSelected": "Izaberite najmanje jednu kameru",
|
||||
"detectionCount_one": "1 praćeni objekat",
|
||||
"detectionCount_few": "{{count}} praćena objekata",
|
||||
"detectionCount_other": "{{count}} praćenih objekata",
|
||||
"nameLabel": "Naziv izvoza",
|
||||
"caseNameDefault": "Izvoz sa više kamera - {{date}}",
|
||||
"namePlaceholder": "Opcioni osnovni naziv za ove izvoze",
|
||||
"queueingButton": "Dodavanje izvoza u red...",
|
||||
"exportButton_one": "Izvezi 1 kameru",
|
||||
"exportButton_few": "Izvezi {{count}} kamere",
|
||||
"exportButton_other": "Izvezi {{count}} kamera"
|
||||
},
|
||||
"time": {
|
||||
"fromTimeline": "Izaberite sa vremenske linije",
|
||||
"lastHour_one": "Poslednji sat",
|
||||
"lastHour_few": "Poslednjih {{count}} sata",
|
||||
"lastHour_other": "Poslednjih {{count}} sati",
|
||||
"custom": "Prilagođeno",
|
||||
"start": {
|
||||
"title": "Vreme početka",
|
||||
"label": "Izaberite vreme početka"
|
||||
},
|
||||
"end": {
|
||||
"title": "Vreme završetka",
|
||||
"label": "Izaberite vreme završetka"
|
||||
}
|
||||
},
|
||||
"multi": {
|
||||
"title_one": "Izvezi 1 pregled",
|
||||
"title_few": "Izvezi {{count}} pregleda",
|
||||
"title_other": "Izvezi {{count}} pregleda",
|
||||
"description": "Izvezite svaki izabrani pregled. Svi izvezeni snimci biće grupisani pod jednim slučajem.",
|
||||
"descriptionNoCase": "Izvezite svaki izabrani pregled.",
|
||||
"caseNamePlaceholder": "Izvoz pregleda - {{date}}",
|
||||
"exportButton_one": "Izvezi 1 pregled",
|
||||
"exportButton_few": "Izvezi {{count}} pregleda",
|
||||
"exportButton_other": "Izvezi {{count}} pregleda",
|
||||
"exportingButton": "Izvoženje...",
|
||||
"toast": {
|
||||
"started_one": "Pokrenut 1 izvoz.",
|
||||
"started_few": "Pokrenuto {{count}} izvoza.",
|
||||
"started_other": "okrenuto {{count}} izvoza.",
|
||||
"partial": "Pokrenuto je {{successful}} od {{total}} izvoza. Neuspešno: {{failedItems}}",
|
||||
"failed": "Pokretanje {{total}} izvoza nije uspelo. Neuspešno: {{failedItems}}"
|
||||
}
|
||||
},
|
||||
"toast": {
|
||||
"success": "Izvoz je uspešno pokrenut. Pogledajte datoteku na stranici sa izvezenim snimcima.",
|
||||
"queued": "Izvoz je dodat u red. Pratite napredak na stranici sa izvezenim snimcima.",
|
||||
"view": "Prikaži",
|
||||
"batchSuccess_one": "Pokrenut 1 izvoz. Otvaranje slučaja...",
|
||||
"batchSuccess_few": "Pokrenuto {{count}} izvoza. Otvaranje slučaja...",
|
||||
"batchSuccess_other": "Pokrenuto {{count}} izvoza. Otvaranje slučaja...",
|
||||
"batchPartial": "Pokrenuto je {{successful}} od {{total}} izvoza. Neuspešne kamere: {{failedCameras}}",
|
||||
"batchFailed": "Pokretanje {{total}} izvoza nije uspelo. Neuspešne kamere: {{failedCameras}}",
|
||||
"batchQueuedSuccess_one": "Dodat 1 izvoz u red.",
|
||||
"batchQueuedSuccess_few": "Dodato {{count}} izvoza u red.",
|
||||
"batchQueuedSuccess_other": "Dodato {{count}} izvoza u red.",
|
||||
"batchQueuedPartial": "Dodato je {{successful}} od {{total}} izvoza u red. Neuspešne kamere: {{failedCameras}}",
|
||||
"batchQueueFailed": "Dodavanje {{total}} izvoza u red nije uspelo. Neuspešne kamere: {{failedCameras}}",
|
||||
"error": {
|
||||
"failed": "Dodavanje izvoza u red nije uspelo: {{error}}",
|
||||
"endTimeMustAfterStartTime": "Vreme završetka mora biti nakon vremena početka",
|
||||
"noValidTimeSelected": "Nije izabran važeći vremenski opseg"
|
||||
}
|
||||
},
|
||||
"fromTimeline": {
|
||||
"saveExport": "Sačuvaj izvezeni snimak",
|
||||
"queueingExport": "Dodavanje izvoza u red...",
|
||||
"previewExport": "Pregledaj izvezeni snimak",
|
||||
"useThisRange": "Koristi ovaj opseg"
|
||||
}
|
||||
},
|
||||
"streaming": {
|
||||
"label": "Strim",
|
||||
"restreaming": {
|
||||
"disabled": "Ponovno strimovanje nije omogućeno za ovu kameru.",
|
||||
"desc": {
|
||||
"title": "Podesite go2rtc za dodatne opcije prikaza uživo i zvuk za ovu kameru."
|
||||
}
|
||||
},
|
||||
"showStats": {
|
||||
"label": "Prikaži statistiku strima",
|
||||
"desc": "Omogućite ovu opciju da biste prikazali statistiku strima kao sloj preko video-izvora kamere."
|
||||
},
|
||||
"debugView": "Prikaz za otklanjanje grešaka"
|
||||
},
|
||||
"search": {
|
||||
"saveSearch": {
|
||||
"label": "Sačuvaj pretragu",
|
||||
"desc": "Unesite naziv za ovu sačuvanu pretragu.",
|
||||
"placeholder": "Unesite naziv za svoju pretragu",
|
||||
"overwrite": "{{searchName}} već postoji. Čuvanje će prepisati postojeću vrednost.",
|
||||
"success": "Pretraga ({{searchName}}) je sačuvana.",
|
||||
"button": {
|
||||
"save": {
|
||||
"label": "Sačuvaj ovu pretragu"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"recording": {
|
||||
"shareTimestamp": {
|
||||
"label": "Deli vremensku oznaku",
|
||||
"title": "Deli vremensku oznaku",
|
||||
"description": "Podelite URL sa vremenskom oznakom trenutne pozicije plejera ili izaberite prilagođenu vremensku oznaku. Napomena: ovo nije javni URL za deljenje i dostupan je samo korisnicima koji imaju pristup Frigate-u i ovoj kameri.",
|
||||
"custom": "Prilagođena vremenska oznaka",
|
||||
"button": "URL za deljenje vremenske oznake",
|
||||
"shareTitle": "Frigate pregled vremenske oznake: {{camera}}"
|
||||
},
|
||||
"confirmDelete": {
|
||||
"title": "Potvrdite brisanje",
|
||||
"desc": {
|
||||
"selected": "Da li ste sigurni da želite da obrišete sav snimljeni video povezan sa ovom stavkom pregleda?<br /><br />Držite taster <em>Shift</em> da biste ubuduće zaobišli ovaj prozor."
|
||||
},
|
||||
"toast": {
|
||||
"success": "Video-snimci povezani sa izabranim stavkama pregleda su uspešno obrisani.",
|
||||
"error": "Neuspešno brisanje: {{error}}"
|
||||
}
|
||||
},
|
||||
"button": {
|
||||
"export": "Izvezi",
|
||||
"markAsReviewed": "Označi kao pregledano",
|
||||
"markAsUnreviewed": "Označi kao nepregledano",
|
||||
"deleteNow": "Obriši odmah",
|
||||
"generateDescription": "Generiši opis"
|
||||
},
|
||||
"genaiDescription": {
|
||||
"toast": {
|
||||
"success": "Zatražen je GenAI opis za ovu stavku pregleda.",
|
||||
"error": "Slanje zahteva za opis nije uspelo: {{error}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"imagePicker": {
|
||||
"selectImage": "Izaberite sličicu praćenog objekta",
|
||||
"unknownLabel": "Sačuvana slika pokretača",
|
||||
"search": {
|
||||
"placeholder": "Pretražite po oznaci ili podoznaci..."
|
||||
},
|
||||
"noImages": "Nema pronađenih sličica za ovu kameru"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,140 @@
|
||||
{}
|
||||
{
|
||||
"filter": "Filtriraj",
|
||||
"classes": {
|
||||
"label": "Klase",
|
||||
"all": {
|
||||
"title": "Sve klase"
|
||||
},
|
||||
"count_one": "{{count}} klasa",
|
||||
"count_other": "{{count}} klase"
|
||||
},
|
||||
"labels": {
|
||||
"label": "Oznake",
|
||||
"all": {
|
||||
"title": "Sve oznake",
|
||||
"short": "Oznake"
|
||||
},
|
||||
"count_one": "{{count}} oznaka",
|
||||
"count_other": "{{count}} oznake"
|
||||
},
|
||||
"zones": {
|
||||
"label": "Zone",
|
||||
"all": {
|
||||
"title": "Sve zone",
|
||||
"short": "Zone"
|
||||
}
|
||||
},
|
||||
"dates": {
|
||||
"selectPreset": "Izaberite unapred podešenu poziciju…",
|
||||
"all": {
|
||||
"title": "Svi datumi",
|
||||
"short": "Datumi"
|
||||
}
|
||||
},
|
||||
"more": "Više filtera",
|
||||
"reset": {
|
||||
"label": "Vrati filtere na podrazumevane vrednosti"
|
||||
},
|
||||
"timeRange": "Vremenski raspon",
|
||||
"subLabels": {
|
||||
"label": "Podoznake",
|
||||
"all": "Sve podoznake"
|
||||
},
|
||||
"attributes": {
|
||||
"label": "Atributi klasifikacije",
|
||||
"all": "Svi atributi"
|
||||
},
|
||||
"score": "Rezultat",
|
||||
"estimatedSpeed": "Procenjena brzina ({{unit}})",
|
||||
"features": {
|
||||
"label": "Funkcije",
|
||||
"hasSnapshot": "Ima snimak",
|
||||
"hasVideoClip": "Ima video-snimak",
|
||||
"submittedToFrigatePlus": {
|
||||
"label": "Poslato na Frigate+",
|
||||
"tips": "Morate prvo filtrirati praćene objekte koji imaju snimak.<br /><br />Praćeni objekti bez snimka ne mogu se poslati na Frigate+."
|
||||
}
|
||||
},
|
||||
"sort": {
|
||||
"label": "Sortiranje",
|
||||
"dateAsc": "Datum (Rastuće)",
|
||||
"dateDesc": "Datum (Opadajuće)",
|
||||
"scoreAsc": "Rezultat objekta (Rastuće)",
|
||||
"scoreDesc": "Rezultat objekta (Opadajuće)",
|
||||
"speedAsc": "Procenjena brzina (Rastuće)",
|
||||
"speedDesc": "Procenjena brzina (Opadajuće)",
|
||||
"relevance": "Relevantnost"
|
||||
},
|
||||
"cameras": {
|
||||
"label": "Filter kamera",
|
||||
"all": {
|
||||
"title": "Sve kamere",
|
||||
"short": "Kamere"
|
||||
}
|
||||
},
|
||||
"review": {
|
||||
"showReviewed": "Prikaži pregledano"
|
||||
},
|
||||
"motion": {
|
||||
"showMotionOnly": "Prikaži samo kretanje"
|
||||
},
|
||||
"explore": {
|
||||
"settings": {
|
||||
"title": "Podešavanja",
|
||||
"defaultView": {
|
||||
"title": "Podrazumevani prikaz",
|
||||
"desc": "Kada nijedan filter nije izabran, prikaži sažetak najnovijih praćenih objekata po oznaci ili prikaži nefiltriranu mrežu.",
|
||||
"summary": "Sažetak",
|
||||
"unfilteredGrid": "Nefiltrirana mreža"
|
||||
},
|
||||
"gridColumns": {
|
||||
"title": "Kolone u mreži",
|
||||
"desc": "Izaberite broj kolona u prikazu mreže."
|
||||
},
|
||||
"searchSource": {
|
||||
"label": "Izvor pretrage",
|
||||
"desc": "Izaberite da li želite da pretražujete sličice (umanjene prikaze) ili opise vaših praćenih objekata.",
|
||||
"options": {
|
||||
"thumbnailImage": "Sličica",
|
||||
"description": "Opis"
|
||||
}
|
||||
}
|
||||
},
|
||||
"date": {
|
||||
"selectDateBy": {
|
||||
"label": "Izaberite datum za filtriranje"
|
||||
}
|
||||
}
|
||||
},
|
||||
"logSettings": {
|
||||
"label": "Filtriraj nivo dnevnika",
|
||||
"filterBySeverity": "Filtriraj dnevnik prema ozbiljnosti",
|
||||
"loading": {
|
||||
"title": "Učitavanje",
|
||||
"desc": "Kada se panel dnevnika pomeri do samog dna, novi zapisi se automatski strimuju čim se dodaju."
|
||||
},
|
||||
"disableLogStreaming": "Onemogući strimovanje dnevnika",
|
||||
"allLogs": "Ceo dnevnik"
|
||||
},
|
||||
"trackedObjectDelete": {
|
||||
"title": "Potvrdite brisanje",
|
||||
"desc": "Brisanjem ovih {{objectLength}} praćenih objekata uklanja se snimak, svi sačuvani vektorski prikazi i svi povezani unosi o životnom ciklusu objekta. Snimljeni materijal ovih praćenih objekata u prikazu istorije <em>NEĆE</em> biti obrisan.<br /><br />Da li ste sigurni da želite da nastavite?<br /><br />Držite taster <em>Shift</em> da biste ubuduće zaobišli ovaj prozor.",
|
||||
"toast": {
|
||||
"success": "Praćeni objekti su uspešno obrisani.",
|
||||
"error": "Neuspešno brisanje praćenih objekata: {{errorMessage}}"
|
||||
}
|
||||
},
|
||||
"zoneMask": {
|
||||
"filterBy": "Filtriraj prema maski zone"
|
||||
},
|
||||
"recognizedLicensePlates": {
|
||||
"title": "Prepoznate registarske tablice",
|
||||
"loadFailed": "Učitavanje prepoznatih registarskih tablica nije uspelo.",
|
||||
"loading": "Učitavanje prepoznatih registarskih tablica…",
|
||||
"placeholder": "Unesite tekst za pretragu tablica…",
|
||||
"noLicensePlatesFound": "Nema pronađenih registarskih tablica.",
|
||||
"selectPlatesFromList": "Izaberite jednu ili više tablica sa liste.",
|
||||
"selectAll": "Izaberi sve",
|
||||
"clearAll": "Poništi sve"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,61 @@
|
||||
{}
|
||||
{
|
||||
"noRecordingsFoundForThisTime": "Nema pronađenih snimaka za ovaj vremenski period",
|
||||
"noPreviewFound": "Pregled nije pronađen",
|
||||
"noPreviewFoundFor": "Pregled nije pronađen za kameru {{cameraName}}",
|
||||
"submitFrigatePlus": {
|
||||
"title": "Pošalji ovaj kadar na Frigate+?",
|
||||
"submit": "Pošalji",
|
||||
"previewError": "Učitavanje predpregleda snimka nije uspelo. Snimak možda nije dostupan u ovom trenutku."
|
||||
},
|
||||
"livePlayerRequiredIOSVersion": "Za ovaj tip strima uživo potreban je iOS 17.1 ili noviji.",
|
||||
"streamOffline": {
|
||||
"title": "Strim je van mreže",
|
||||
"desc": "Nijedan kadar nije primljen na strimu za detekciju <code>detect</code> kamere {{cameraName}}, proverite dnevnik grešaka"
|
||||
},
|
||||
"cameraOff": "Kamera je isključena",
|
||||
"quality": {
|
||||
"auto": "Automatski",
|
||||
"autoLow": "Reprodukcija u niskom kvalitetu (ograničen protok podataka)",
|
||||
"autoLowCodec": "Reprodukcija u niskom kvalitetu (izvorni kvalitet nije podržan u ovom veb-pregledaču)",
|
||||
"autoLowSaveData": "Reprodukcija u niskom kvalitetu (ušteda podataka)",
|
||||
"main": "Izvorni",
|
||||
"sub": "Nizak",
|
||||
"notSupportedBrowser": "Nije podržano u ovom veb-pregledaču",
|
||||
"label": "Kvalitet",
|
||||
"noAudio": "Nema zvuka",
|
||||
"audioRate": "{{rate}} kHz audio",
|
||||
"audioCodecRate": "{{codec}} {{rate}} kHz",
|
||||
"noRecordings": "Nema snimaka u ovom vremenskom opsegu"
|
||||
},
|
||||
"stats": {
|
||||
"streamType": {
|
||||
"title": "Tip strima:",
|
||||
"short": "Tip"
|
||||
},
|
||||
"bandwidth": {
|
||||
"title": "Propusni opseg:",
|
||||
"short": "Propusni opseg"
|
||||
},
|
||||
"totalFrames": "Ukupno kadrova:",
|
||||
"droppedFrames": {
|
||||
"title": "Odbačeni kadrovi:",
|
||||
"short": {
|
||||
"title": "Odbačeno",
|
||||
"value": "{{droppedFrames}} kadrova"
|
||||
}
|
||||
},
|
||||
"decodedFrames": "Dekodirani kadrovi:",
|
||||
"droppedFrameRate": "Brzina odbacivanja kadrova:",
|
||||
"stream": "Strim:",
|
||||
"streamAuto": "{{stream}} (automatski)"
|
||||
},
|
||||
"toast": {
|
||||
"success": {
|
||||
"submittedFrigatePlus": "Kadar je uspešno poslat na Frigate+"
|
||||
},
|
||||
"error": {
|
||||
"submitFrigatePlusFailed": "Slanje kadra na Frigate+ nije uspelo",
|
||||
"playRecordingsFailed": "Reprodukcija snimaka nije uspela (greška {{code}}): {{message}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,40 @@
|
||||
{}
|
||||
{
|
||||
"minimum": "Mora biti najmanje {{limit}}",
|
||||
"maximum": "Mora biti najviše {{limit}}",
|
||||
"exclusiveMinimum": "Mora biti veće od {{limit}}",
|
||||
"exclusiveMaximum": "Mora biti manje od {{limit}}",
|
||||
"minLength": "Mora imati najmanje {{limit}} karakter(a)",
|
||||
"maxLength": "Mora imati najviše {{limit}} karakter(a)",
|
||||
"minItems": "Mora imati najmanje {{limit}} stavki",
|
||||
"maxItems": "Mora imati najviše {{limit}} stavki",
|
||||
"pattern": "Nevažeći format",
|
||||
"required": "Ovo polje je obavezno",
|
||||
"type": "Nevažeći tip vrednosti",
|
||||
"enum": "Mora biti jedna od dozvoljenih vrednosti",
|
||||
"const": "Vrednost se ne poklapa sa očekivanom konstantom",
|
||||
"uniqueItems": "Sve stavke moraju biti jedinstvene",
|
||||
"format": "Nevažeći format",
|
||||
"additionalProperties": "Nepoznato svojstvo nije dozvoljeno",
|
||||
"oneOf": "Mora se podudarati sa tačno jednom od dozvoljenih šema",
|
||||
"anyOf": "Mora se podudarati sa najmanje jednom od dozvoljenih šema",
|
||||
"proxy": {
|
||||
"header_map": {
|
||||
"roleHeaderRequired": "Zaglavlje uloge je obavezno kada su konfigurisana mapiranja uloga."
|
||||
}
|
||||
},
|
||||
"ffmpeg": {
|
||||
"inputs": {
|
||||
"rolesUnique": "Svaka uloga može biti dodeljena samo jednom ulaznom strimu.",
|
||||
"detectRequired": "Najmanje jednom ulaznom strimu mora biti dodeljena uloga „detect“.",
|
||||
"hwaccelDetectOnly": "Samo ulazni strim sa ulogom „detect“ može definisati argumente za hardversko ubrzanje."
|
||||
}
|
||||
},
|
||||
"detect": {
|
||||
"dimensionMustBeEven": "Mora biti paran broj."
|
||||
},
|
||||
"models": {
|
||||
"defaultRequired": "Jedan model mora koristiti podrazumevanu scenu. Bez nje, svaka kamera koja ne izabere scenu neće imati rezervni model na koji može da se osloni.",
|
||||
"sceneDuplicate": "Svaki model mora koristiti različitu scenu.",
|
||||
"sameModel": "Modeli za scenu {{scene}} i scenu {{other}} koriste istu datoteku modela. Pokretanje jednog modela pod više različitih scena samo deli posao detekcije na zasebne detektore, što je sporije nego pokretanje jednog modela sa svim hardverskim resursima navedenim pod njim."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,219 @@
|
||||
{}
|
||||
{
|
||||
"documentTitle": "Klasifikacioni modeli - Frigate",
|
||||
"disabled": "Onemogućeno",
|
||||
"details": {
|
||||
"scoreInfo": "Rezultat predstavlja prosečnu pouzdanost klasifikacije kroz sve detekcije ovog objekta.",
|
||||
"none": "Ništa",
|
||||
"unknown": "Nepoznato"
|
||||
},
|
||||
"button": {
|
||||
"deleteClassificationAttempts": "Obriši klasifikacione slike",
|
||||
"renameCategory": "Preimenuj klasu",
|
||||
"deleteCategory": "Obriši klasu",
|
||||
"deleteImages": "Obriši slike",
|
||||
"trainModel": "Treniraj model",
|
||||
"addClassification": "Dodaj klasifikaciju",
|
||||
"deleteModels": "Obriši modele",
|
||||
"editModel": "Izmeni model"
|
||||
},
|
||||
"tooltip": {
|
||||
"trainingInProgress": "Model se trenutno trenira",
|
||||
"noNewImages": "Nema novih slika za treniranje. Prvo klasifikujte više slika u skupu podataka.",
|
||||
"noChanges": "Nema izmena u skupu podataka od poslednjeg treniranja.",
|
||||
"modelNotReady": "Model nije spreman za treniranje"
|
||||
},
|
||||
"toast": {
|
||||
"success": {
|
||||
"deletedModel_one": "Uspešno je obrisan {{count}} model",
|
||||
"deletedModel_few": "Uspešno je obrisano {{count}} modela",
|
||||
"deletedModel_other": "Uspešno je obrisano {{count}} modela",
|
||||
"categorizedImage": "Slika je uspešno klasifikovana",
|
||||
"reclassifiedImage": "Slika je uspešno ponovo klasifikovana",
|
||||
"trainedModel": "Model je uspešno treniran.",
|
||||
"trainingModel": "Treniranje modela je uspešno pokrenuto.",
|
||||
"updatedModel": "Konfiguracija modela je uspešno ažurirana",
|
||||
"renamedCategory": "Klasa je uspešno preimenovana u {{name}}",
|
||||
"deletedCategory_one": "Obrisan {{count}} klasa",
|
||||
"deletedCategory_few": "Obrisano {{count}} klase",
|
||||
"deletedCategory_other": "Obrisano {{count}} klasa",
|
||||
"deletedImage_one": "Obrisana {{count}} slika",
|
||||
"deletedImage_few": "Obrisano {{count}} slike",
|
||||
"deletedImage_other": "Obrisano {{count}} slika"
|
||||
},
|
||||
"error": {
|
||||
"deleteImageFailed": "Brisanje nije uspelo: {{errorMessage}}",
|
||||
"deleteCategoryFailed": "Brisanje klase nije uspelo: {{errorMessage}}",
|
||||
"deleteModelFailed": "Brisanje modela nije uspelo: {{errorMessage}}",
|
||||
"categorizeFailed": "Kategorizacija slike nije uspela: {{errorMessage}}",
|
||||
"trainingFailed": "Treniranje modela nije uspelo. Proverite Frigate dnevnike za detalje.",
|
||||
"trainingFailedToStart": "Pokretanje treniranja modela nije uspelo: {{errorMessage}}",
|
||||
"updateModelFailed": "Ažuriranje modela nije uspelo: {{errorMessage}}",
|
||||
"renameCategoryFailed": "Preimenovanje klase nije uspelo: {{errorMessage}}",
|
||||
"reclassifyFailed": "Ponovna klasifikacija slike nije uspela: {{errorMessage}}"
|
||||
}
|
||||
},
|
||||
"deleteCategory": {
|
||||
"title": "Obriši klasu",
|
||||
"desc": "Da li ste sigurni da želite da obrišete klasu {{name}}? Ovo će trajno obrisati sve povezane slike i zahtevaće ponovno treniranje modela.",
|
||||
"minClassesTitle": "Nije moguće obrisati klasu",
|
||||
"minClassesDesc": "Klasifikacioni model mora imati najmanje 2 klase. Dodajte drugu klasu pre nego što obrišete ovu."
|
||||
},
|
||||
"deleteModel": {
|
||||
"title": "Obriši klasifikacioni model",
|
||||
"single": "Da li ste sigurni da želite da obrišete {{name}}? Ovo će trajno obrisati sve povezane podatke, uključujući slike i podatke o treniranju. Ova radnja se ne može poništiti.",
|
||||
"desc_one": "Da li ste sigurni da želite da obrišete {{count}} model? Ovo će trajno obrisati sve povezane podatke, uključujući slike i podatke o treniranju. Ova radnja se ne može poništiti.",
|
||||
"desc_few": "Da li ste sigurni da želite da obrišete {{count}} modela? Ovo će trajno obrisati sve povezane podatke, uključujući slike i podatke o treniranju. Ova radnja se ne može poništiti.",
|
||||
"desc_other": "Da li ste sigurni da želite da obrišete {{count}} modela? Ovo će trajno obrisati sve povezane podatke, uključujući slike i podatke o treniranju. Ova radnja se ne može poništiti."
|
||||
},
|
||||
"edit": {
|
||||
"title": "Izmeni klasifikacioni model",
|
||||
"descriptionState": "Izmenite klase za ovaj model klasifikacije stanja. Izmene će zahtevati ponovno treniranje modela.",
|
||||
"descriptionObject": "Izmenite tip objekta i tip klasifikacije za ovaj model klasifikacije objekata.",
|
||||
"enabled": "Omogućeno",
|
||||
"enabledDesc": "Pokrenite ovaj model. Kada je onemogućen, prestaje sa radom i više ne vrši klasifikaciju.",
|
||||
"saveAttempts": "Pokušaji čuvanja",
|
||||
"saveAttemptsDesc": "Broj slika pokušaja klasifikacije koje treba zadržati za korisnički interfejs nedavnih klasifikacija.",
|
||||
"motion": "Pokreni pri kretanju",
|
||||
"motionDesc": "Pokrenite klasifikaciju kada se detektuje kretanje unutar konfigurisanog isecanja kadra.",
|
||||
"interval": "Interval",
|
||||
"intervalDesc": "Broj sekundi između periodičnih pokretanja klasifikacije. Ostavite prazno da bi se pokretala samo pri kretanju.",
|
||||
"intervalPlaceholder": "Bez intervala",
|
||||
"stateClassesInfo": "Model je ažuriran. Ponovo trenirajte model kako bi izmene klasa stupile na snagu.",
|
||||
"errors": {
|
||||
"saveAttemptsInvalid": "Pokušaji čuvanja moraju biti ceo broj 0 ili veći",
|
||||
"intervalInvalid": "Interval mora biti ceo broj veći od 0"
|
||||
}
|
||||
},
|
||||
"deleteDatasetImages": {
|
||||
"title": "Obriši slike iz skupa podataka",
|
||||
"desc_one": "Da li ste sigurni da želite da obrišete {{count}} sliku iz skupa podataka {{dataset}}? Ova radnja se ne može poništiti i zahtevaće ponovno treniranje modela.",
|
||||
"desc_few": "Da li ste sigurni da želite da obrišete {{count}} slike iz skupa podataka {{dataset}}? Ova radnja se ne može poništiti i zahtevaće ponovno treniranje modela.",
|
||||
"desc_other": "Da li ste sigurni da želite da obrišete {{count}} slika iz skupa podataka {{dataset}}? Ova radnja se ne može poništiti i zahtevaće ponovno treniranje modela."
|
||||
},
|
||||
"deleteTrainImages": {
|
||||
"title": "Obriši slike za trening",
|
||||
"desc_one": "Da li ste sigurni da želite da obrišete {{count}} sliku? Ova radnja se ne može poništiti.",
|
||||
"desc_few": "Da li ste sigurni da želite da obrišete {{count}} slike? Ova radnja se ne može poništiti.",
|
||||
"desc_other": "Da li ste sigurni da želite da obrišete {{count}} slika? Ova radnja se ne može poništiti."
|
||||
},
|
||||
"renameCategory": {
|
||||
"title": "Preimenuj klasu",
|
||||
"desc": "Unesite novi naziv za {{name}}. Biće potrebno da ponovo trenirate model kako bi izmena naziva stupila na snagu."
|
||||
},
|
||||
"description": {
|
||||
"invalidName": "Neispravan naziv. Nazivi mogu sadržati samo slova, brojeve, razmake, apostrofe, donje crte i crtice."
|
||||
},
|
||||
"train": {
|
||||
"title": "Nedavne klasifikacije",
|
||||
"titleShort": "Nedavno",
|
||||
"aria": "Izaberite nedavne klasifikacije"
|
||||
},
|
||||
"categories": "Klase",
|
||||
"createCategory": {
|
||||
"new": "Kreiraj novu klasu"
|
||||
},
|
||||
"categorizeImageAs": "Klasifikuj sliku kao:",
|
||||
"categorizeImage": "Klasifikuj sliku",
|
||||
"reclassifyImageAs": "Ponovo klasifikuj sliku kao:",
|
||||
"reclassifyImage": "Ponovo klasifikuj sliku",
|
||||
"menu": {
|
||||
"objects": "Objekti",
|
||||
"states": "Stanja"
|
||||
},
|
||||
"noModels": {
|
||||
"object": {
|
||||
"title": "Nema modela za klasifikaciju objekata",
|
||||
"description": "Kreirajte prilagođeni model za klasifikaciju detektovanih objekata.",
|
||||
"buttonText": "Kreiraj model objekata"
|
||||
},
|
||||
"state": {
|
||||
"title": "Nema modela za klasifikaciju stanja",
|
||||
"description": "Kreirajte prilagođeni model za praćenje i klasifikaciju promena stanja u specifičnim zonama kamera.",
|
||||
"buttonText": "Kreiraj model stanja"
|
||||
}
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Kreiraj novu klasifikaciju",
|
||||
"steps": {
|
||||
"nameAndDefine": "Naziv i definisanje",
|
||||
"stateArea": "Zona stanja",
|
||||
"chooseExamples": "Izaberi primere"
|
||||
},
|
||||
"step1": {
|
||||
"description": "Modeli stanja prate fiksne zone kamera radi uočavanja promena (npr. otvorena/zatvorena vrata). Modeli objekata dodaju klasifikacije detektovanim objektima (npr. poznate životinje, dostavljači, itd.).",
|
||||
"name": "Naziv",
|
||||
"namePlaceholder": "Unesite naziv modela...",
|
||||
"type": "Tip",
|
||||
"typeState": "Stanje",
|
||||
"typeObject": "Objekat",
|
||||
"objectLabel": "Oznaka objekta",
|
||||
"objectLabelPlaceholder": "Izaberite tip objekta...",
|
||||
"classificationType": "Tip klasifikacije",
|
||||
"classificationTypeTip": "Saznajte više o tipovima klasifikacije",
|
||||
"classificationTypeDesc": "Podoznake dodaju dodatni tekst oznaci objekta (npr. 'Osoba: UPS'). Atributi predstavljaju metapodatke pretražive kroz sistem koji se čuvaju odvojeno unutar metapodataka objekta.",
|
||||
"classificationSubLabel": "Podoznaka",
|
||||
"classificationAttribute": "Atribut",
|
||||
"classes": "Klase",
|
||||
"states": "Stanja",
|
||||
"classesTip": "Saznajte više o klasama",
|
||||
"classesStateDesc": "Definišite različita stanja u kojima se zona vaše kamere može nalaziti. Na primer: 'otvoreno' i 'zatvoreno' za garažna vrata.",
|
||||
"classesObjectDesc": "Definišite različite kategorije u koje se detektovani objekti mogu klasifikovati. Na primer: 'dostavljač', 'stanar' (resident), 'stranac' za klasifikaciju osoba.",
|
||||
"classPlaceholder": "Unesite naziv klase...",
|
||||
"errors": {
|
||||
"nameRequired": "Naziv modela je obavezan",
|
||||
"nameLength": "Naziv modela mora imati 64 karaktera ili manje",
|
||||
"nameOnlyNumbers": "Naziv modela ne može sadržati samo brojeve",
|
||||
"classRequired": "Najmanje 1 klasa je obavezna",
|
||||
"classesUnique": "Nazivi klasa moraju biti jedinstveni",
|
||||
"noneNotAllowed": "Klasa 'none' nije dozvoljena",
|
||||
"stateRequiresTwoClasses": "Modeli stanja zahtevaju najmanje 2 klase",
|
||||
"objectLabelRequired": "Molimo izaberite oznaku objekta",
|
||||
"objectTypeRequired": "Molimo izaberite tip klasifikacije"
|
||||
}
|
||||
},
|
||||
"step2": {
|
||||
"description": "Izaberite kamere i definišite zonu za praćenje za svaku kameru. Model će klasifikovati stanje ovih zona.",
|
||||
"cameras": "Kamere",
|
||||
"selectCamera": "Izaberite kameru",
|
||||
"noCameras": "Kliknite na + da dodate kamere",
|
||||
"selectCameraPrompt": "Izaberite kameru sa liste da biste definisali njenu zonu praćenja"
|
||||
},
|
||||
"step3": {
|
||||
"selectImagesPrompt": "Izaberite sve slike sa: {{className}}",
|
||||
"selectImagesDescription": "Kliknite na slike da ih izaberete. Kliknite na Nastavi kada završite sa ovom klasom.",
|
||||
"allImagesRequired_one": "Molimo klasifikujte sve slike. Preostala je još {{count}} slika.",
|
||||
"allImagesRequired_few": "Molimo klasifikujte sve slike. Preostala je još {{count}} slike.",
|
||||
"allImagesRequired_other": "Molimo klasifikujte sve slike. Preostala je još {{count}} slika.",
|
||||
"generating": {
|
||||
"title": "Generisanje uzoraka slika",
|
||||
"description": "Frigate preuzima reprezentativne slike iz vaših snimaka. Ovo može potrajati..."
|
||||
},
|
||||
"training": {
|
||||
"title": "Treniranje modela",
|
||||
"description": "Vaš model se trenira u pozadini. Zatvorite ovaj prozor, a vaš model će početi sa radom čim se treniranje završi."
|
||||
},
|
||||
"retryGenerate": "Pokušaj ponovo generisanje",
|
||||
"noImages": "Nema generisanih uzoraka slika",
|
||||
"classifying": "Klasifikacija i treniranje...",
|
||||
"trainingStarted": "Treniranje je uspešno pokrenuto",
|
||||
"modelCreated": "Model je uspešno kreiran. Koristite pregled „Nedavne klasifikacije“ da dodate slike za stanja koja nedostaju, a zatim trenirajte model.",
|
||||
"errors": {
|
||||
"noCameras": "Nema konfigurisanih kamera",
|
||||
"noObjectLabel": "Nije izabrana oznaka objekta",
|
||||
"generateFailed": "Generisanje primera nije uspelo: {{error}}",
|
||||
"generationFailed": "Generisanje nije uspelo. Molimo pokušajte ponovo.",
|
||||
"classifyFailed": "Klasifikacija slika nije uspela: {{error}}"
|
||||
},
|
||||
"generateSuccess": "Uzorci slika su uspešno generisani",
|
||||
"refreshExamples": "Generiši nove primere",
|
||||
"refreshConfirm": {
|
||||
"title": "Želite li da generišete nove primere?",
|
||||
"description": "Ovo će generisati novi skup slika i poništiti sve izbore, uključujući i sve prethodne klase. Biće potrebno da ponovo izaberete primere za sve klase."
|
||||
},
|
||||
"missingStatesWarning": {
|
||||
"title": "Nedostaju primeri klasa",
|
||||
"description": "Nemaju sve klase primere. Pokušajte da generišete nove primere kako biste pronašli klasu koja nedostaju, ili nastavite i kasnije koristite pregled „Nedavne klasifikacije“ da dodate slike."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,267 @@
|
||||
{}
|
||||
{
|
||||
"documentTitle": "Istraži - Frigate",
|
||||
"generativeAI": "Generativni AI",
|
||||
"exploreMore": "Istražite više objekata tipa {{label}}",
|
||||
"exploreIsUnavailable": {
|
||||
"title": "Opcija „Istraži“ je nedostupna",
|
||||
"embeddingsReindexing": {
|
||||
"context": "Opcija „Istraži“ se može koristiti nakon što se završi ponovno indeksiranje ugnježdenih podataka praćenih objekata.",
|
||||
"startingUp": "Pokretanje…",
|
||||
"estimatedTime": "Procenjeno preostalo vreme:",
|
||||
"finishingShortly": "Uskoro se završava",
|
||||
"step": {
|
||||
"thumbnailsEmbedded": "Sličice su ugnježdeni: ",
|
||||
"descriptionsEmbedded": "Opisi su ugnježdeni: ",
|
||||
"trackedObjectsProcessed": "Praćeni objekti su obrađeni: "
|
||||
}
|
||||
},
|
||||
"downloadingModels": {
|
||||
"context": "Frigate preuzima neophodne modele ugnježdenih podataka kako bi podržao funkciju semantičke pretrage. Ovo može potrajati nekoliko minuta u zavisnosti od brzine vaše mrežne veze.",
|
||||
"setup": {
|
||||
"visionModel": "Vizuelni model",
|
||||
"visionModelFeatureExtractor": "Ekstraktor funkcija vizuelnog modela",
|
||||
"textModel": "Tekstualni model",
|
||||
"textTokenizer": "Tokenizator teksta"
|
||||
},
|
||||
"tips": {
|
||||
"context": "Možda ćete želeti da ponovo indeksirate ugnježdene podatke (embeddings) vaših praćenih objekata kada se modeli preuzmu."
|
||||
},
|
||||
"error": "Došlo je do greške. Proverite Frigate dnevnike."
|
||||
}
|
||||
},
|
||||
"trackedObjectDetails": "Detalji o praćenom objektu",
|
||||
"type": {
|
||||
"details": "detalji",
|
||||
"snapshot": "snimak",
|
||||
"thumbnail": "sličica",
|
||||
"video": "video",
|
||||
"tracking_details": "detalji praćenja"
|
||||
},
|
||||
"trackingDetails": {
|
||||
"title": "Detalji praćenja",
|
||||
"noImageFound": "Nije pronađena slika za ovu vremensku oznaku.",
|
||||
"createObjectMask": "Kreiraj masku objekta",
|
||||
"adjustAnnotationSettings": "Prilagodite podešavanja označavanja",
|
||||
"scrollViewTips": "Kliknite da biste videli značajne trenutke u životnom ciklusu ovog objekta.",
|
||||
"autoTrackingTips": "Pozicije okvira za detekciju biće neprecizne za kamere sa automatskim praćenjem.",
|
||||
"count": "{{first}} od {{second}}",
|
||||
"trackedPoint": "Praćena tačka",
|
||||
"lifecycleItemDesc": {
|
||||
"visible": "detektovano {{label}}",
|
||||
"entered_zone": "{{label}} je ušao u {{zones}}",
|
||||
"active": "{{label}} je postao aktivan",
|
||||
"stationary": "{{label}} je postao stacionaran",
|
||||
"attribute": {
|
||||
"faceOrLicense_plate": "detektovan atribut {{attribute}} za {{label}}",
|
||||
"other": "{{label}} je prepoznat kao {{attribute}}"
|
||||
},
|
||||
"gone": "{{label}} je otišao",
|
||||
"heard": "registrovan zvuk {{label}}",
|
||||
"external": "detektovan {{label}}",
|
||||
"header": {
|
||||
"zones": "Zone",
|
||||
"ratio": "Odnos",
|
||||
"area": "Površina",
|
||||
"score": "Rezultat",
|
||||
"computedScore": "Izračunati rezultat",
|
||||
"topScore": "Najbolji rezultat",
|
||||
"toggleAdvancedScores": "Uključi/isključi napredne rezultate"
|
||||
}
|
||||
},
|
||||
"annotationSettings": {
|
||||
"title": "Podešavanja označavanja",
|
||||
"showAllZones": {
|
||||
"title": "Prikaži sve zone",
|
||||
"desc": "Uvek prikaži zone na kadrovima gde su objekti ušli u zonu."
|
||||
},
|
||||
"offset": {
|
||||
"label": "Pomeraj označavanja",
|
||||
"desc": "Ovi podaci dolaze sa strima za detekciju vaše kamere, ali se prikazuju preko slika sa strima za snimanje. Malo je verovatno da su ova dva strima savršeno sinhronizovana. Kao rezultat toga, okvir za detekciju i video snimak se neće savršeno poklapati. Možete koristiti ovo podešavanje da pomerite anotacije unapred ili unazad u vremenu kako biste ih bolje uskladili sa snimljenim materijalom.",
|
||||
"millisecondsToOffset": "Milisekunde za koje se pomera anotacija detekcije. <em>Podrazumevano: 0</em>",
|
||||
"tips": "Smanjite vrednost ako je reprodukcija videa ispred okvira i tačaka putanje, a povećajte vrednost ako reprodukcija videa kasni za njima. Ova vrednost može biti negativna.",
|
||||
"toast": {
|
||||
"success": "Pomeraj označavanja za {{camera}} je sačuvan u konfiguracionoj datoteci."
|
||||
}
|
||||
}
|
||||
},
|
||||
"carousel": {
|
||||
"previous": "Prethodni slajd",
|
||||
"next": "Sledeći slajd"
|
||||
}
|
||||
},
|
||||
"details": {
|
||||
"item": {
|
||||
"title": "Detalji stavke pregleda",
|
||||
"desc": "Detalji stavke pregleda",
|
||||
"button": {
|
||||
"share": "Podeli ovu stavku pregleda",
|
||||
"viewInExplore": "Prikaži u opciji „Istraži“"
|
||||
},
|
||||
"tips": {
|
||||
"mismatch_one": "{{count}} nedostupan objekat je detektovan i uključen u ovu stavku pregleda. Ti objekti ili nisu ispunili uslove za upozorenje ili detekciju, ili su već očišćeni/obrisani.",
|
||||
"mismatch_few": "{{count}} nedostupana objekta su detektovana i uključena u ovu stavku pregleda. Ti objekti ili nisu ispunili uslove za upozorenje ili detekciju, ili su već očišćeni/obrisani.",
|
||||
"mismatch_other": "{{count}} nedostupanih objekata je detektovano i uključeno u ovu stavku pregleda. Ti objekti ili nisu ispunili uslove za upozorenje ili detekciju, ili su već očišćeni/obrisani.",
|
||||
"hasMissingObjects": "Prilagodite vašu konfiguraciju ako želite da Frigate čuva praćene objekte za sledeće oznake: <em>{{objects}}</em>"
|
||||
},
|
||||
"toast": {
|
||||
"success": {
|
||||
"regenerate": "Zahtevan je novi opis od provajdera {{provider}}. U zavisnosti od brzine vašeg provajdera, ponovno generisanje opisa može potrajati.",
|
||||
"updatedSublabel": "Podoznaka je uspešno ažurirana.",
|
||||
"updatedLPR": "Registarska tablica je uspešno ažurirana.",
|
||||
"updatedAttributes": "Atributi su uspešno ažurirani.",
|
||||
"audioTranscription": "Uspešno je zatražena transkripcija zvuka. U zavisnosti od brzine vašeg Frigate servera, transkripcija može potrajati."
|
||||
},
|
||||
"error": {
|
||||
"regenerate": "Neuspelo pozivanje provajdera {{provider}} za novi opis: {{errorMessage}}",
|
||||
"updatedSublabelFailed": "Neuspelo ažuriranje podoznake: {{errorMessage}}",
|
||||
"updatedLPRFailed": "Neuspelo ažuriranje registarske tablice: {{errorMessage}}",
|
||||
"updatedAttributesFailed": "Neuspelo ažuriranje atributa: {{errorMessage}}",
|
||||
"audioTranscription": "Neuspeli zahtev za transkripciju zvuka: {{errorMessage}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": "Oznaka",
|
||||
"editSubLabel": {
|
||||
"title": "Izmeni podoznaku",
|
||||
"desc": "Unesite novu podoznaku za: {{label}}",
|
||||
"descNoLabel": "Unesite novu podoznaku za ovaj praćeni objekat"
|
||||
},
|
||||
"editLPR": {
|
||||
"title": "Izmeni registarsku tablicu",
|
||||
"desc": "Unesite novu vrednost registarske tablice za: {{label}}",
|
||||
"descNoLabel": "Unesite novu vrednost registarske tablice za ovaj praćeni objekat"
|
||||
},
|
||||
"editAttributes": {
|
||||
"title": "Izmeni atribute",
|
||||
"desc": "Izaberite atribute klasifikacije za: {{label}}"
|
||||
},
|
||||
"snapshotScore": {
|
||||
"label": "Rezultat snimka"
|
||||
},
|
||||
"topScore": {
|
||||
"label": "Najviši rezultat",
|
||||
"info": "Najviši rezultat predstavlja najveću srednju vrednost (medijanu) rezultata za praćeni objekat, pa se može razlikovati od rezultata prikazanog na sličici u rezultatima pretrage."
|
||||
},
|
||||
"score": {
|
||||
"label": "Rezultat"
|
||||
},
|
||||
"recognizedLicensePlate": "Prepoznata registarska tablica",
|
||||
"attributes": "Atributi klasifikacije",
|
||||
"estimatedSpeed": "Procenjena brzina",
|
||||
"objects": "Objekti",
|
||||
"camera": "Kamera",
|
||||
"zones": "Zone",
|
||||
"timestamp": "Vremenska oznaka",
|
||||
"button": {
|
||||
"findSimilar": "Pronađi slično",
|
||||
"regenerate": {
|
||||
"title": "Ponovo generiši",
|
||||
"label": "Ponovo generiši opis praćenog objekta"
|
||||
}
|
||||
},
|
||||
"description": {
|
||||
"label": "Opis",
|
||||
"placeholder": "Opis praćenog objekta",
|
||||
"aiTips": "Frigate neće zatražiti opis od vašeg provajdera generativne veštačke inteligencije dok se životni ciklus praćenog objekta ne završi."
|
||||
},
|
||||
"expandRegenerationMenu": "Proširi meni za ponovno generisanje",
|
||||
"regenerateFromSnapshot": "Ponovo generiši iz snimka",
|
||||
"regenerateFromThumbnails": "Ponovo generiši iz sličica",
|
||||
"tips": {
|
||||
"descriptionSaved": "Opis je uspešno sačuvan",
|
||||
"saveDescriptionFailed": "Neuspelo ažuriranje opisa: {{errorMessage}}"
|
||||
},
|
||||
"title": {
|
||||
"label": "Naslov"
|
||||
},
|
||||
"scoreInfo": "Informacije o rezultatu"
|
||||
},
|
||||
"itemMenu": {
|
||||
"downloadVideo": {
|
||||
"label": "Preuzmi video",
|
||||
"aria": "Preuzmi video"
|
||||
},
|
||||
"downloadSnapshot": {
|
||||
"label": "Preuzmi snimak",
|
||||
"aria": "Preuzmi snimak"
|
||||
},
|
||||
"downloadCleanSnapshot": {
|
||||
"label": "Preuzmi čist snimak",
|
||||
"aria": "Preuzmi čist snimak"
|
||||
},
|
||||
"viewTrackingDetails": {
|
||||
"label": "Prikaži detalje praćenja",
|
||||
"aria": "Prikaži detalje praćenja"
|
||||
},
|
||||
"findSimilar": {
|
||||
"label": "Pronađi slično",
|
||||
"aria": "Pronađi slične praćene objekte"
|
||||
},
|
||||
"addTrigger": {
|
||||
"label": "Dodaj okidač",
|
||||
"aria": "Dodaj okidač za ovaj praćeni objekat"
|
||||
},
|
||||
"audioTranscription": {
|
||||
"label": "Transkribuj",
|
||||
"aria": "Zatraži transkripciju zvuka"
|
||||
},
|
||||
"submitToPlus": {
|
||||
"label": "Pošalji u Frigate+",
|
||||
"aria": "Pošalji u Frigate Plus"
|
||||
},
|
||||
"viewInHistory": {
|
||||
"label": "Prikaži u istoriji",
|
||||
"aria": "Prikaži u istoriji"
|
||||
},
|
||||
"deleteTrackedObject": {
|
||||
"label": "Obriši ovaj praćeni objekat"
|
||||
},
|
||||
"showObjectDetails": {
|
||||
"label": "Prikaži putanju objekta"
|
||||
},
|
||||
"hideObjectDetails": {
|
||||
"label": "Sakrij putanju objekta"
|
||||
},
|
||||
"debugReplay": {
|
||||
"label": "Ponovna reprodukcija za otklanjanje grešaka",
|
||||
"aria": "Prikaži ovaj praćeni objekat u prikazu ponovne reprodukcije za otklanjanje grešaka"
|
||||
},
|
||||
"more": {
|
||||
"aria": "Više"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"confirmDelete": {
|
||||
"title": "Potvrdi brisanje",
|
||||
"desc": "Brisanjem ovog praćenog objekta uklanjaju se snimak, svi sačuvani vektorski prikazi i svi povezani unosi detalja praćenja. Snimljeni video-zapis ovog praćenog objekta u prikazu Istorija <em>NEĆE</em> biti obrisan.<br/><br/>Da li ste sigurni da želite da nastavite?"
|
||||
},
|
||||
"toast": {
|
||||
"error": "Greška pri brisanju ovog praćenog objekta: {{errorMessage}}"
|
||||
}
|
||||
},
|
||||
"noTrackedObjects": "Nije pronađen nijedan praćeni objekat",
|
||||
"fetchingTrackedObjectsFailed": "Greška pri preuzimanju praćenih objekata: {{errorMessage}}",
|
||||
"trackedObjectsCount_one": "{{count}} praćeni objekat ",
|
||||
"trackedObjectsCount_few": "{{count}} praćena objekta ",
|
||||
"trackedObjectsCount_other": "{{count}} praćenih objekata ",
|
||||
"searchResult": {
|
||||
"tooltip": "Podudaranje: {{type}} ({{confidence}}%",
|
||||
"previousTrackedObject": "Prethodni praćeni objekat",
|
||||
"nextTrackedObject": "Sledeći praćeni objekat",
|
||||
"deleteTrackedObject": {
|
||||
"toast": {
|
||||
"success": "Praćeni objekat je uspešno obrisan.",
|
||||
"error": "Neuspelo brisanje praćenog objekta: {{errorMessage}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"aiAnalysis": {
|
||||
"title": "AI analiza"
|
||||
},
|
||||
"concerns": {
|
||||
"label": "Upozorenja"
|
||||
},
|
||||
"objectLifecycle": {
|
||||
"noImageFound": "Nije pronađena slika za ovaj praćeni objekat."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,41 @@
|
||||
{}
|
||||
{
|
||||
"selected_one": "Izabrano: {{count}}",
|
||||
"selected_other": "Izabrano: {{count}}",
|
||||
"documentTitle": "Izvoz - Frigate",
|
||||
"search": "Pretraga",
|
||||
"noExports": "Nije pronađen nijedan izvoz",
|
||||
"headings": {
|
||||
"cases": "Slučajevi",
|
||||
"uncategorizedExports": "Nekategorizovani izvozi"
|
||||
},
|
||||
"deleteExport": {
|
||||
"label": "Obriši izvoz",
|
||||
"desc": "Da li ste sigurni da želite da obrišete izvoz {{exportName}}?"
|
||||
},
|
||||
"editExport": {
|
||||
"title": "Preimenuj izvoz",
|
||||
"desc": "Unesite novi naziv za ovaj izvoz.",
|
||||
"saveExport": "Sačuvaj izvoz"
|
||||
},
|
||||
"tooltip": {
|
||||
"shareExport": "Podeli izvoz",
|
||||
"downloadVideo": "Preuzmi video",
|
||||
"editName": "Izmeni naziv",
|
||||
"deleteExport": "Obriši izvoz",
|
||||
"assignToCase": "Dodaj u slučaj",
|
||||
"removeFromCase": "Ukloni iz slučaja"
|
||||
},
|
||||
"toolbar": {
|
||||
"newCase": "Novi slučaj",
|
||||
"addExport": "Dodaj izvoz",
|
||||
"editCase": "Izmeni slučaj",
|
||||
"deleteCase": "Obriši slučaj"
|
||||
},
|
||||
"toast": {
|
||||
"error": {
|
||||
"renameExportFailed": "Neuspelo preimenovanje izvoza: {{errorMessage}}",
|
||||
"assignCaseFailed": "Neuspelo ažuriranje dodele slučaju: {{errorMessage}}",
|
||||
"caseSaveFailed": "Neuspelo čuvanje slučaja: {{errorMessage}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,12 @@
|
||||
{}
|
||||
{
|
||||
"details": {
|
||||
"unknown": "Nepoznato",
|
||||
"timestamp": "Vremenska oznaka"
|
||||
},
|
||||
"description": {
|
||||
"invalidName": "Neispravan naziv. Nazivi mogu sadržati samo slova, brojeve, razmake, apostrofe, donje crte i crtice."
|
||||
},
|
||||
"train": {
|
||||
"titleShort": "Nedavno"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
{}
|
||||
{
|
||||
"search": "Pretraga"
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +1,380 @@
|
||||
{}
|
||||
{
|
||||
"documentTitle": {
|
||||
"cameras": "Statistika kamera - Frigate",
|
||||
"storage": "Statistika skladišta - Frigate",
|
||||
"general": "Opšta statistika - Frigate",
|
||||
"enrichments": "Statistika poboljšanja - Frigate",
|
||||
"logs": {
|
||||
"frigate": "Dnevnik Frigate sistema - Frigate",
|
||||
"go2rtc": "Go2RTC dnevnik - Frigate",
|
||||
"nginx": "Nginx dnevnik - Frigate",
|
||||
"websocket": "Dnevnik poruka - Frigate"
|
||||
},
|
||||
"health": "Stanje sistema - Frigate"
|
||||
},
|
||||
"title": "Sistem",
|
||||
"metrics": "Sistemska metrika",
|
||||
"showAllTabs": "Prikaži sve kartice",
|
||||
"showLessTabs": "Prikaži manje",
|
||||
"health": {
|
||||
"title": "Stanje",
|
||||
"notices": {
|
||||
"title": "Obaveštenja",
|
||||
"empty": "Vaš Frigate sistem radi ispravno",
|
||||
"acknowledge": "Uvaži",
|
||||
"acknowledgeHint": "Sakrij dok se ne ponovi",
|
||||
"mute": "Utišaj",
|
||||
"muteHint": "Nikada više ne prikazuj ovo",
|
||||
"unmute": "Uključi zvuk",
|
||||
"showAgain": "Prikaži ponovo",
|
||||
"openSettings": "Otvori podešavanja",
|
||||
"openLink": "Otvori vezu / Otvori link",
|
||||
"noMatches": "Nema obaveštenja koja odgovaraju filteru",
|
||||
"hiddenTitle": "Skriveno",
|
||||
"noneHidden": "Nema skrivenih obaveštenja",
|
||||
"showAll": "Prikaži sve ponovo",
|
||||
"showAllTitle": "Prikaži sva skrivena obaveštenja?",
|
||||
"showAllDesc": "Svako potvrđeno i utišano obaveštenje se vraća na listu obaveštenja, uključujući provere konfiguracije i strimova.",
|
||||
"occurred_one": "Dogodilo se {{time}}",
|
||||
"occurred_other": "Poslednji put se dogodilo {{lastTime}} · {{count}} puta od {{time}}",
|
||||
"acknowledgedAt": "Uvaženo {{time}}",
|
||||
"mutedAt": "Utišano {{time}}",
|
||||
"filter": {
|
||||
"showHidden": "Prikaži skriveno",
|
||||
"severity": "Ozbiljnost",
|
||||
"error": "Greška",
|
||||
"warning": "Upozorenje",
|
||||
"info": "Informacija"
|
||||
},
|
||||
"kinds": {
|
||||
"detector_stuck": "Detektor {{detector}} je ponovo pokrenut nakon što je prestao da odgovara",
|
||||
"model_download_failed": "Preuzimanje datoteke {{file}} za model {{model}} nije uspelo: {{error}}",
|
||||
"skipped_detections": "Sistem za detekciju nije uspevao da isprati brzinu i preskočio je {{pct}}% kadrova tokom perioda dužeg od jednog minuta",
|
||||
"ffmpeg_high_cpu": "Zauzeće procesora od strane FFmpeg-a je visoko (prosečno {{cpu}}%)",
|
||||
"detect_high_cpu": "Zauzeće procesora od strane sistema za detekciju je visoko (prosečno {{cpu}}%)",
|
||||
"shm_too_low": "/dev/shm dodeljena memorija (trenutno {{total}} MB) bi trebalo da se poveća na najmanje {{min}} MB",
|
||||
"object_processing_behind": "Obrada praćenih objekata nije uspevala da isprati brzinu, pa su kadrovi sa kamere odbačeni. Proverite iskorišćenost procesora i da li ograničenja procesora ili dodeljivanje jezgara na kontejneru ili virtuelnoj mašini ostavljaju premalo procesorske snage za Frigate",
|
||||
"failed_login_one": "Neuspešan pokušaj prijave za korisnika {{user}}",
|
||||
"failed_login_other": "Neuspešni pokušaji prijave za korisnika {{user}}",
|
||||
"update_available": "Dostupna je verzija Frigate {{version}}",
|
||||
"analytics_prompt": "Razmislite o deljenju anonimne statistike korišćenja kako biste pomogli programerima da unaprede Frigate"
|
||||
},
|
||||
"streamPrefix": "Strim {{index}}: {{message}}",
|
||||
"streamPrefixRestream": "Strim {{index}} (putem go2rtc): {{message}}",
|
||||
"streamProbeFailed": "Analiza strima {{index}} nije uspela: {{error}}",
|
||||
"cameraProbeFailed": "Analiza strimova nije uspela: {{error}}"
|
||||
},
|
||||
"hardware": {
|
||||
"title": "Hardver",
|
||||
"objectDetection": "Detekcija objekata",
|
||||
"hardwareAcceleration": "Hardversko ubrzanje",
|
||||
"enrichments": {
|
||||
"title": "Poboljšanja",
|
||||
"semantic_search": "Semantička pretraga",
|
||||
"face_recognition": "Prepoznavanje lica",
|
||||
"lpr": "Prepoznavanje registarskih tablica",
|
||||
"audio_transcription": "Audio transkripcija"
|
||||
},
|
||||
"cameraConnections": "Veze sa kamerama",
|
||||
"allCamerasExcellent": "Sve kamere imaju odličnu vezu.",
|
||||
"fps": "{{camera}} / {{expected}} fps",
|
||||
"nothingConfigured": "Ništa nije konfigurisano",
|
||||
"allCameras": "Sve kamere",
|
||||
"probeUnavailable": "Hardverska detekcija je nedostupna",
|
||||
"justStarted": "Frigate je upravo pokrenut",
|
||||
"deviceNotFound": "Uređaj {{devices}} nije pronađen na ovom sistemu",
|
||||
"detectorNotRunning": "Proces detektora nije pokrenut",
|
||||
"inferenceVerySlow": "Obrada (inferencija) je veoma spora ({{speed}} ms)",
|
||||
"inferenceSlow": "Obrada (inferencija) je spora ({{speed}} ms)",
|
||||
"inferenceMs": "{{speed}} ms",
|
||||
"customArgs": "Prilagođeni ffmpeg argumenti",
|
||||
"customArgsNotVerified": "Prilagođeni ffmpeg argumenti, neverifikovani",
|
||||
"hwaccelNotConfigured": "Hardversko dekodiranje se ne koristi, ali je {{family}} dostupan. Izaberite ga u ffmpeg podešavanjima",
|
||||
"hwaccelHardwareMissing": "{{family}} je konfigurisan, ali ga hardverska analiza nije prijavila",
|
||||
"unrecognizedDevice": "Nepoznat uređaj za nadjačavanje, neverifikovan",
|
||||
"decoderUsage": "Dekoder: {{usage}}",
|
||||
"remoteProvider": "Udaljeni provajder",
|
||||
"acceleratorMissing": "Konfigurisano za {{device}}, ali nije pronađen kompatibilan akcelerator",
|
||||
"modelNotRunYet": "Model još uvek nije pokrenut; uređaj se verifikuje nakon prve upotrebe",
|
||||
"fellBackToCpu": "Konfigurisano za {{device}}, ali se izvršava na procesoru",
|
||||
"cpuDespiteAccelerator": "Izvršava se na procesoru iako je akcelerator dostupan",
|
||||
"probed": "Analizirano",
|
||||
"probing": "Analiza u toku...",
|
||||
"recheck": "Ponovo proveri hardver",
|
||||
"cameraStreams": "Strimovi kamere",
|
||||
"streamsNotChecked": "Još uvek nije provereno",
|
||||
"streamsChecking": "Provera: {{done}} od {{total}}",
|
||||
"streamsClean": "Nema problema sa strimom",
|
||||
"checked": "Provereno",
|
||||
"runAgain": "Pokreni ponovo",
|
||||
"runStreamChecks": "Pokreni provere strimova",
|
||||
"streamsChecked_one": "Proverena {{count}} kamera",
|
||||
"streamsChecked_other": "Provereno {{count}} kamera",
|
||||
"streamsFlagged_one": "{{count}} sa problemima, navedena pod Obaveštenja",
|
||||
"streamsFlagged_other": "{{count}} sa problemima, navedene pod Obaveštenja"
|
||||
}
|
||||
},
|
||||
"logs": {
|
||||
"websocket": {
|
||||
"label": "Poruke",
|
||||
"pause": "Pauziraj",
|
||||
"resume": "Nastavi",
|
||||
"clear": "Očisti",
|
||||
"filter": {
|
||||
"all": "Sve teme",
|
||||
"topics": "Teme",
|
||||
"events": "Događaji",
|
||||
"reviews": "Pregledi",
|
||||
"classification": "Klasifikacija",
|
||||
"face_recognition": "Prepoznavanje lica",
|
||||
"lpr": "LPR",
|
||||
"camera_activity": "Aktivnost kamere",
|
||||
"system": "Sistem",
|
||||
"camera": "Kamera",
|
||||
"all_cameras": "Sve kamere",
|
||||
"cameras_count_one": "{{count}} kamera",
|
||||
"cameras_count_other": "{{count}} kamere"
|
||||
},
|
||||
"empty": "Još uvek nema zabeleženih poruka",
|
||||
"count_one": "{{count}} poruka",
|
||||
"count_other": "{{count}} poruke",
|
||||
"expanded": {
|
||||
"payload": "Sadržaj poruke"
|
||||
}
|
||||
},
|
||||
"download": {
|
||||
"label": "Preuzmi dnevnik"
|
||||
},
|
||||
"copy": {
|
||||
"label": "Kopiraj u privremenu memoriju",
|
||||
"success": "Dnevnik je kopiran u privremenu memoriju",
|
||||
"error": "Neuspešno kopiranje dnevnika u privremenu memoriju"
|
||||
},
|
||||
"type": {
|
||||
"label": "Tip",
|
||||
"timestamp": "Vremenska oznaka",
|
||||
"tag": "Oznaka",
|
||||
"message": "Poruka"
|
||||
},
|
||||
"tips": "Dnevnik se strimuje sa servera",
|
||||
"toast": {
|
||||
"error": {
|
||||
"fetchingLogsFailed": "Greška pri preuzimanju dnevnika: {{errorMessage}}",
|
||||
"whileStreamingLogs": "Greška tokom strimovanja dnevnika: {{errorMessage}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"general": {
|
||||
"title": "Opšte",
|
||||
"detector": {
|
||||
"title": "Detektori",
|
||||
"inferenceSpeed": "Brzina obrade detektora",
|
||||
"temperature": "Temperatura detektora",
|
||||
"cpuUsage": "Zauzeće procesora od strane detektora",
|
||||
"cpuUsageInformation": "Procesor koji se koristi za pripremu ulaznih i izlaznih podataka za modele detekcije i iz njih. Ova vrednost ne meri iskorišćenost same obrade, čak i ako se koristi grafički procesor ili akcelerator.",
|
||||
"memoryUsage": "Zauzeće memorije od strane detektora"
|
||||
},
|
||||
"hardwareInfo": {
|
||||
"title": "Informacije o hardveru",
|
||||
"gpuUsage": "GPU zauzeće",
|
||||
"gpuMemory": "GPU memorija",
|
||||
"gpuEncoder": "GPU enkoder",
|
||||
"gpuCompute": "GPU obrada / enkodiranje",
|
||||
"gpuDecoder": "GPU dekoder",
|
||||
"gpuTemperature": "GPU temperatura",
|
||||
"gpuInfo": {
|
||||
"vainfoOutput": {
|
||||
"title": "Vainfo izlazni podaci",
|
||||
"returnCode": "Izlazni kod: {{code}}",
|
||||
"processOutput": "Izlazni podaci procesa:",
|
||||
"processError": "Greška u procesu:"
|
||||
},
|
||||
"nvidiaSMIOutput": {
|
||||
"title": "Nvidia SMI izlazni podaci",
|
||||
"name": "Naziv: {{name}}",
|
||||
"driver": "Drajver: {{driver}}",
|
||||
"cudaComputerCapability": "CUDA računarska sposobnost: {{cuda_compute}}",
|
||||
"vbios": "VBios informacije: {{vbios}}"
|
||||
},
|
||||
"closeInfo": {
|
||||
"label": "Zatvori informacije o GPU"
|
||||
},
|
||||
"copyInfo": {
|
||||
"label": "Kopiraj informacije o GPU"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Informacije o GPU su kopirane u privremenu memoriju"
|
||||
}
|
||||
},
|
||||
"npuUsage": "NPU zauzeće",
|
||||
"npuMemory": "NPU memorija",
|
||||
"npuTemperature": "NPU temperatura"
|
||||
},
|
||||
"otherProcesses": {
|
||||
"title": "Ostali procesi",
|
||||
"series": {
|
||||
"audio_detector": "audio detektor",
|
||||
"embeddings": "vektorski prikazi",
|
||||
"review_segment": "segment pregleda",
|
||||
"recording": "snimanje",
|
||||
"go2rtc": "go2rtc"
|
||||
},
|
||||
"processMemoryUsage": "Zauzeće memorije",
|
||||
"processCpuUsage": "Zauzeće CPU"
|
||||
}
|
||||
},
|
||||
"storage": {
|
||||
"recordings": {
|
||||
"title": "Snimci",
|
||||
"tips": "Ova vrednost predstavlja ukupno skladište koje zauzimaju snimci u Frigate bazi podataka. Frigate ne prati zauzeće skladišta za sve datoteke na vašem disku.",
|
||||
"earliestRecording": "Najraniji dostupni snimak:"
|
||||
},
|
||||
"overview": "Pregled",
|
||||
"title": "Skladište",
|
||||
"shm": {
|
||||
"title": "Dodeljena SHM (deljena) memorija",
|
||||
"warning": "Trenutna veličina SHM-a od {{total}} MB je previše mala. Povećajte je na najmanje {{min_shm}} MB.",
|
||||
"frameLifetime": {
|
||||
"title": "Vreme čuvanja kadra",
|
||||
"description": "Svaka kamera ima {{frames}} mesta za kadrove u deljenoj memoriji. Pri najvećem broju kadrova u sekundi (frame rate) te kamere, svaki kadar je dostupan približno {{lifetime}} sekundi pre nego što bude prepisan."
|
||||
}
|
||||
},
|
||||
"cameraStorage": {
|
||||
"title": "Skladište kamera",
|
||||
"camera": "Kamera",
|
||||
"unusedStorageInformation": "Informacije o neiskorišćenom prostoru",
|
||||
"storageUsed": "Skladište",
|
||||
"percentageOfTotalUsed": "Procenat od ukupnog",
|
||||
"bandwidth": "Propusni opseg",
|
||||
"unused": {
|
||||
"title": "Neiskorišćeno",
|
||||
"tips": "Ova vrednost možda neće tačno prikazati slobodan prostor dostupan Frigate-u ako na vašem disku imate sačuvane druge datoteke pored Frigate snimaka. Frigate ne prati zauzeće skladišta izvan svojih snimaka."
|
||||
},
|
||||
"subStream": {
|
||||
"information": "Informacije o skladištu sporednog strima",
|
||||
"tips": "Kamere koje snimaju sporedni strim (sub stream) odvojeno prikazuju zauzeće za izvorni i nizak kvalitet, koristeći iste nazive kao i opcije kvaliteta pri reprodukciji snimaka. Niski kvalitet snimaka ostaje na disku sve dok ne istekne period čuvanja, tako da se ovaj prikaz može i dalje pojavljivati za kameru nakon što je snimanje sporednog strima isključeno."
|
||||
}
|
||||
}
|
||||
},
|
||||
"cameras": {
|
||||
"title": "Kamere",
|
||||
"overview": "Pregled",
|
||||
"info": {
|
||||
"aspectRatio": "Odnos stranica",
|
||||
"cameraProbeInfo": "Informacije o analizi kamere {{camera}}",
|
||||
"streamDataFromFFPROBE": "Podaci o strimu su dobijeni pomoću <code>ffprobe</code>.",
|
||||
"fetching": "Preuzimanje podataka o kameri",
|
||||
"stream": "Strim {{idx}}",
|
||||
"video": "Video:",
|
||||
"codec": "Kodek:",
|
||||
"resolution": "Rezolucija:",
|
||||
"fps": "FPS:",
|
||||
"unknown": "Nepoznato",
|
||||
"audio": "Audio:",
|
||||
"error": "Greška: {{error}}",
|
||||
"tips": {
|
||||
"title": "Informacije o analizi kamere"
|
||||
},
|
||||
"keyframes": {
|
||||
"title": "Analiza ključnih kadrova",
|
||||
"analyzing": "Analiza ključnih kadrova je u toku... preostalo je {{seconds}} sekundi",
|
||||
"stillAnalyzing": "Analiza ključnih kadrova je i dalje u toku...",
|
||||
"recordStream": "Strim za snimanje:",
|
||||
"keyframeCount": "Uočeni ključni kadrovi:",
|
||||
"observedDuration": "Uočeno trajanje:",
|
||||
"gap": "Razmak između ključnih kadrova (min / prosek / maks):",
|
||||
"segmentLength": "Dužina segmenta snimanja:",
|
||||
"ok": "Ključni kadrovi na svakih ~{{seconds}} s, što je dobro za snimanje i reprodukciju.",
|
||||
"warningFixed": "Ključni kadrovi su ravnomerno raspoređeni ali su retki (na svakih ~{{seconds}} s). Snimanje i dalje radi, ali će reprodukcija uživo i premotavanje započinjati sporije. Podesite interval ključnih kadrova (I-frame / keyframe) na kameri tako da odgovara broju kadrova u sekundi.",
|
||||
"warningVariable": "Razmak između ključnih kadrova je neujednačen (od {{minSeconds}} s do {{maxSeconds}} s), što obično znači da je uključen pametni kodek (H.264+/H.265+). Ovo se ne preporučuje.",
|
||||
"errorFixed": "Ključni kadrovi na svakih ~{{seconds}} s su duži od dužine segmenta snimanja ({{segmentTime}} s), pa pojedini segmenti nemaju ključni kadar i neće moći da se reprodukuju. Skratite interval ključnih kadrova (I-frame / keyframe) na kameri tako da odgovara broju kadrova u sekundi (frame rate).",
|
||||
"errorVariable": "Razmaci između ključnih kadrova dostižu ~{{seconds}} s, što je duže od dužine segmenta snimanja ({{segmentTime}} s). Pojedini segmenti neće imati ključni kadar, što prekida reprodukciju. Onemogućite pametni/+ kodek na kameri ili skratite interval ključnih kadrova.",
|
||||
"unknown": "Nije moguće utvrditi razmak između ključnih kadrova.",
|
||||
"recordDisabled": "Snimanje je onemogućeno za ovu kameru."
|
||||
}
|
||||
},
|
||||
"framesAndDetections": "Kadrovi / Detekcije",
|
||||
"noCameras": {
|
||||
"title": "Nema pronađenih kamera"
|
||||
},
|
||||
"label": {
|
||||
"camera": "kamera",
|
||||
"detect": "detekcija",
|
||||
"skipped": "preskočeno",
|
||||
"ffmpeg": "FFmpeg",
|
||||
"capture": "snimanje",
|
||||
"overallFramesPerSecond": "ukupno kadrova u sekundi",
|
||||
"overallDetectionsPerSecond": "ukupno detekcija u sekundi",
|
||||
"overallSkippedDetectionsPerSecond": "ukupno preskočenih detekcija u sekundi",
|
||||
"cameraFfmpeg": "{{camName}} FFmpeg",
|
||||
"cameraCapture": "{{camName}} snimanje",
|
||||
"cameraDetect": "{{camName}} detekcija",
|
||||
"cameraGpu": "{{camName}} GPU",
|
||||
"cameraFramesPerSecond": "{{camName}} kadrova u sekundi",
|
||||
"cameraDetectionsPerSecond": "{{camName}} detekcija u sekundi",
|
||||
"cameraSkippedDetectionsPerSecond": "{{camName}} preskočenih detekcija u sekundi"
|
||||
},
|
||||
"connectionQuality": {
|
||||
"title": "Kvalitet veze",
|
||||
"excellent": "Odličan",
|
||||
"fair": "Zadovoljavajući",
|
||||
"poor": "Loš",
|
||||
"unusable": "Neupotrebljiv",
|
||||
"fps": "FPS",
|
||||
"expectedFps": "Očekivani FPS",
|
||||
"reconnectsLastHour": "Ponovna povezivanja (poslednji sat)",
|
||||
"stallsLastHour": "Zastoji (poslednji sat)"
|
||||
},
|
||||
"toast": {
|
||||
"success": {
|
||||
"copyToClipboard": "Podaci o analizi su kopirani u privremenu memoriju."
|
||||
},
|
||||
"error": {
|
||||
"unableToProbeCamera": "Nije moguće analizirati kameru: {{errorMessage}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"lastRefreshed": "Poslednji put osveženo: ",
|
||||
"stats": {
|
||||
"cameraSkippedDetections": "Kamera {{camera}} preskače detekciju na {{pct}}% kadrova",
|
||||
"healthy": "Sistem ispravn",
|
||||
"systemNotices_one": "{{count}} sistemsko obaveštenje",
|
||||
"systemNotices_other": "{{count}} sistemska obaveštenja",
|
||||
"moreMessages_one": "+{{count}}",
|
||||
"moreMessages_other": "+{{count}}",
|
||||
"reindexingEmbeddings": "Ponovno indeksiranje vektorskih prikaza (završeno {{processed}}%)",
|
||||
"reindexEmbeddingsFailed": "Ponovno indeksiranje vektorskih prikaza nije uspelo, proverite dnevnik",
|
||||
"cameraIsOffline": "Kamera {{camera}} je van mreže",
|
||||
"detectIsSlow": "Detekcija na {{detect}} je spora ({{speed}} ms)",
|
||||
"detectIsVerySlow": "Detekcija na {{detect}} je veoma spora ({{speed}} ms)",
|
||||
"retentionUnmet": "Snimci se brišu pre isteka perioda čuvanja kako bi se oslobodio prostor",
|
||||
"debugReplayActive": "Sesija otklanjanja grešaka i ponovnog puštanja je aktivna"
|
||||
},
|
||||
"enrichments": {
|
||||
"title": "Poboljšanja",
|
||||
"infPerSecond": "Broj obrada u sekundi",
|
||||
"averageInf": "Prosečno vreme obrade",
|
||||
"embeddings": {
|
||||
"image_embedding": "Vektorski prikaz slike",
|
||||
"text_embedding": "Vektorski prikaz teksta",
|
||||
"face_recognition": "Prepoznavanje lica",
|
||||
"plate_recognition": "Prepoznavanje tablica",
|
||||
"image_embedding_speed": "Brzina vektorskog prikaza slike",
|
||||
"face_embedding_speed": "Brzina vektorskog prikaza lica",
|
||||
"face_recognition_speed": "Brzina prepoznavanja lica",
|
||||
"plate_recognition_speed": "Brzina prepoznavanja tablica",
|
||||
"text_embedding_speed": "Brzina vektorskog prikaza teksta",
|
||||
"yolov9_plate_detection_speed": "YOLOv9 brzina detekcije tablica",
|
||||
"yolov9_plate_detection": "YOLOv9 detekcija tablica",
|
||||
"review_description": "Opis stavke pregleda",
|
||||
"review_description_speed": "Brzina opisivanja stavke pregleda",
|
||||
"review_description_events_per_second": "Opis stavke pregleda",
|
||||
"object_description": "Opis objekta",
|
||||
"object_description_speed": "Brzina opisivanja objekta",
|
||||
"object_description_events_per_second": "Opis objekta",
|
||||
"classification": "{{name}} klasifikacija",
|
||||
"classification_speed": "{{name}} brzina klasifikacije",
|
||||
"classification_events_per_second": "{{name}} događaja klasifikacije u sekundi"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1154,8 +1154,6 @@
|
||||
},
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API кључ",
|
||||
"validated": "Frigate+ API кључ је детектован и валидиран",
|
||||
"notValidated": "Frigate+ API кључ није детектован или није валидиран",
|
||||
"desc": "Frigate+ API кључ омогућава интеграцију са Frigate+ сервисом.",
|
||||
"plusLink": "Прочитајте више о Frigate+"
|
||||
},
|
||||
|
||||
@@ -1 +1,28 @@
|
||||
{}
|
||||
{
|
||||
"bicycle": "Bicikl",
|
||||
"car": "Automobil",
|
||||
"motorcycle": "Motocikl",
|
||||
"bus": "Autobus",
|
||||
"train": "Voz",
|
||||
"boat": "Čamac",
|
||||
"bird": "Ptica",
|
||||
"cat": "Mačka",
|
||||
"dog": "Pas",
|
||||
"horse": "Konj",
|
||||
"sheep": "Ovca",
|
||||
"skateboard": "Skejtbord",
|
||||
"door": "Vrata",
|
||||
"mouse": "Miš",
|
||||
"keyboard": "Tastatura",
|
||||
"sink": "Sudopera",
|
||||
"blender": "Blender",
|
||||
"clock": "Sat",
|
||||
"scissors": "Makaze",
|
||||
"hair_dryer": "Fen za kosu",
|
||||
"toothbrush": "Četkica za zube",
|
||||
"vehicle": "Vozilo",
|
||||
"animal": "Životinja",
|
||||
"bark": "Lavež",
|
||||
"goat": "Koza",
|
||||
"camera": "Kamera"
|
||||
}
|
||||
|
||||
@@ -1 +1,16 @@
|
||||
{}
|
||||
{
|
||||
"form": {
|
||||
"user": "Korisničko ime",
|
||||
"password": "Lozinka",
|
||||
"login": "Prijava",
|
||||
"firstTimeLogin": "Pokušavate da se prijavite prvi put? Podaci za prijavu su ispisani u Frigate dnevniku.",
|
||||
"errors": {
|
||||
"usernameRequired": "Korisničko ime je obavezno",
|
||||
"passwordRequired": "Lozinka je obavezna",
|
||||
"rateLimit": "Prekoračeno je ograničenje broja pokušaja. Pokušajte ponovo kasnije.",
|
||||
"loginFailed": "Prijava nije uspela",
|
||||
"unknownError": "Nepoznata greška. Proverite dnevnik.",
|
||||
"webUnknownError": "Nepoznata greška. Proverite dnevnik konzole."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,8 @@
|
||||
{}
|
||||
{
|
||||
"iconPicker": {
|
||||
"selectIcon": "Izaberite ikonu",
|
||||
"search": {
|
||||
"placeholder": "Pretražite ikone…"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,10 @@
|
||||
{}
|
||||
{
|
||||
"button": {
|
||||
"downloadVideo": {
|
||||
"label": "Preuzmi video",
|
||||
"toast": {
|
||||
"success": "Preuzimanje video-snimka iz pregleda je počelo."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1 +1,73 @@
|
||||
{}
|
||||
{
|
||||
"audio": {
|
||||
"global": {
|
||||
"detection": "Globalna detekcija",
|
||||
"sensitivity": "Globalna osetljivost"
|
||||
},
|
||||
"cameras": {
|
||||
"detection": "Detekcija",
|
||||
"sensitivity": "Osetljivost"
|
||||
}
|
||||
},
|
||||
"timestamp_style": {
|
||||
"global": {
|
||||
"appearance": "Globalni izgled"
|
||||
},
|
||||
"cameras": {
|
||||
"appearance": "Izgled"
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"global": {
|
||||
"sensitivity": "Globalna osetljivost",
|
||||
"algorithm": "Globalni algoritam"
|
||||
},
|
||||
"cameras": {
|
||||
"sensitivity": "Osetljivost",
|
||||
"algorithm": "Algoritam"
|
||||
}
|
||||
},
|
||||
"snapshots": {
|
||||
"global": {
|
||||
"display": "Globalni prikaz"
|
||||
},
|
||||
"cameras": {
|
||||
"display": "Prikaz"
|
||||
}
|
||||
},
|
||||
"detect": {
|
||||
"global": {
|
||||
"resolution": "Globalna rezolucija",
|
||||
"tracking": "Globalno praćenje"
|
||||
},
|
||||
"cameras": {
|
||||
"resolution": "Rezolucija",
|
||||
"tracking": "Praćenje"
|
||||
}
|
||||
},
|
||||
"objects": {
|
||||
"global": {
|
||||
"tracking": "Globalno praćenje",
|
||||
"filtering": "Globalno filtriranje"
|
||||
},
|
||||
"cameras": {
|
||||
"tracking": "Praćenje",
|
||||
"filtering": "Filtriranje"
|
||||
}
|
||||
},
|
||||
"record": {
|
||||
"global": {
|
||||
"retention": "Globalno čuvanje",
|
||||
"events": "Globalni događaji"
|
||||
},
|
||||
"cameras": {
|
||||
"retention": "Čuvanje",
|
||||
"events": "Događaji"
|
||||
}
|
||||
},
|
||||
"ffmpeg": {
|
||||
"cameras": {
|
||||
"cameraFfmpeg": "FFmpeg argumenti specifični za kameru"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,131 @@
|
||||
{}
|
||||
{
|
||||
"person": "Osoba",
|
||||
"bicycle": "Bicikl",
|
||||
"car": "Automobil",
|
||||
"motorcycle": "Motocikl",
|
||||
"airplane": "Avion",
|
||||
"bus": "Autobus",
|
||||
"train": "Voz",
|
||||
"boat": "Čamac",
|
||||
"traffic_light": "Semafor",
|
||||
"fire_hydrant": "Protivpožarni hidrant",
|
||||
"street_sign": "Ulični znak",
|
||||
"stop_sign": "Znak STOP",
|
||||
"parking_meter": "Parking metar",
|
||||
"bench": "Klupa",
|
||||
"bird": "Ptica",
|
||||
"cat": "Mačka",
|
||||
"dog": "Pas",
|
||||
"horse": "Konj",
|
||||
"sheep": "Ovca",
|
||||
"cow": "Krava",
|
||||
"elephant": "Slon",
|
||||
"bear": "Medved",
|
||||
"zebra": "Zebra",
|
||||
"giraffe": "Žirafa",
|
||||
"hat": "Šešir",
|
||||
"backpack": "Ranac",
|
||||
"umbrella": "Kišobran",
|
||||
"shoe": "Cipela",
|
||||
"eye_glasses": "Naočare",
|
||||
"handbag": "Torbica",
|
||||
"tie": "Kravata",
|
||||
"suitcase": "Kofer",
|
||||
"frisbee": "Frizbi",
|
||||
"skis": "Skije",
|
||||
"snowboard": "Snoubord",
|
||||
"sports_ball": "Sportska lopta",
|
||||
"kite": "Zmaj",
|
||||
"baseball_bat": "Bezbol palica",
|
||||
"baseball_glove": "Bezbol rukavica",
|
||||
"skateboard": "Skejtbord",
|
||||
"surfboard": "Daska za surfovanje",
|
||||
"tennis_racket": "Teniski reket",
|
||||
"bottle": "Flaša",
|
||||
"plate": "Tanjir",
|
||||
"wine_glass": "Čaša za vino",
|
||||
"cup": "Šolja",
|
||||
"fork": "Viljuška",
|
||||
"knife": "Nož",
|
||||
"spoon": "Kašika",
|
||||
"bowl": "Činija",
|
||||
"banana": "Banana",
|
||||
"apple": "Jabuka",
|
||||
"sandwich": "Sendvič",
|
||||
"orange": "Pomorandža",
|
||||
"broccoli": "Brokoli",
|
||||
"carrot": "Šargarepa",
|
||||
"hot_dog": "Hot-dog",
|
||||
"pizza": "Pica",
|
||||
"donut": "Krofna",
|
||||
"cake": "Kolač",
|
||||
"chair": "Stolica",
|
||||
"couch": "Kauč",
|
||||
"potted_plant": "Saksijska biljka",
|
||||
"bed": "Krevet",
|
||||
"mirror": "Ogledalo",
|
||||
"dining_table": "Trpezarijski sto",
|
||||
"window": "Prozor",
|
||||
"desk": "Radni sto",
|
||||
"toilet": "Toalet",
|
||||
"door": "Vrata",
|
||||
"tv": "Televizor",
|
||||
"laptop": "Laptop",
|
||||
"mouse": "Miš",
|
||||
"remote": "Daljinski upravljač",
|
||||
"keyboard": "Tastatura",
|
||||
"cell_phone": "Mobilni telefon",
|
||||
"microwave": "Mikrotalasna",
|
||||
"oven": "Rerna",
|
||||
"toaster": "Toster",
|
||||
"sink": "Sudopera",
|
||||
"refrigerator": "Frižider",
|
||||
"blender": "Blender",
|
||||
"book": "Knjiga",
|
||||
"clock": "Sat",
|
||||
"vase": "Vaza",
|
||||
"scissors": "Makaze",
|
||||
"teddy_bear": "Plišani medvedić",
|
||||
"hair_dryer": "Fen za kosu",
|
||||
"toothbrush": "Četkica za zube",
|
||||
"hair_brush": "Četka za kosu",
|
||||
"vehicle": "Vozilo",
|
||||
"squirrel": "Veverica",
|
||||
"deer": "Jelen",
|
||||
"animal": "Životinja",
|
||||
"bark": "Lavež",
|
||||
"fox": "Lisica",
|
||||
"goat": "Koza",
|
||||
"rabbit": "Zec",
|
||||
"raccoon": "Rakun",
|
||||
"robot_lawnmower": "Robotska kosilica",
|
||||
"waste_bin": "Kanta za smeće",
|
||||
"on_demand": "Na zahtev",
|
||||
"face": "Lice",
|
||||
"license_plate": "Registarska tablica",
|
||||
"package": "Paket",
|
||||
"bbq_grill": "Roštilj",
|
||||
"amazon": "Amazon",
|
||||
"usps": "USPS",
|
||||
"ups": "UPS",
|
||||
"fedex": "FedEx",
|
||||
"dhl": "DHL",
|
||||
"an_post": "An Post",
|
||||
"purolator": "Purolator",
|
||||
"postnl": "PostNL",
|
||||
"nzpost": "NZPost",
|
||||
"postnord": "PostNord",
|
||||
"gls": "GLS",
|
||||
"dpd": "DPD",
|
||||
"canada_post": "Canada Post",
|
||||
"royal_mail": "Royal Mail",
|
||||
"school_bus": "Školski autobus",
|
||||
"skunk": "Tvor",
|
||||
"kangaroo": "Kengur",
|
||||
"baby": "Beba",
|
||||
"baby_stroller": "Dečja kolica",
|
||||
"rickshaw": "Rikša",
|
||||
"rodent": "Glodar",
|
||||
"possum": "Oposum",
|
||||
"garbage_truck": "Kamion za odvoženje smeća"
|
||||
}
|
||||
|
||||
@@ -1 +1,88 @@
|
||||
{}
|
||||
{
|
||||
"documentTitle": "Ćaskanje - Frigate",
|
||||
"title": "Frigate ćaskanje",
|
||||
"subtitle": "Vaš AI asistent za upravljanje kamerama i uvođenje u detalje",
|
||||
"placeholder": "Pitajte bilo šta...",
|
||||
"error": "Nešto je pošlo po zlu. Pokušajte ponovo.",
|
||||
"processing": "Obrada...",
|
||||
"toolsUsed": "Korišćeno: {{tools}}",
|
||||
"showTools": "Prikaži alate ({{count}})",
|
||||
"hideTools": "Sakrij alate",
|
||||
"call": "Poziv",
|
||||
"result": "Rezultat",
|
||||
"arguments": "Argumenti:",
|
||||
"response": "Odgovor:",
|
||||
"attachment_chip_label": "{{label}} na kameri {{camera}}",
|
||||
"attachment_chip_remove": "Ukloni prilog",
|
||||
"open_in_explore": "Otvori u pretraživaču",
|
||||
"attach_event_aria": "Priloži događaj {{eventId}}",
|
||||
"attachment_picker_paste_label": "Ili nalepite ID događaja",
|
||||
"attachment_picker_attach": "Priloži",
|
||||
"attachment_picker_placeholder": "Priloži događaj",
|
||||
"quick_reply_find_similar": "Pronađi slična uočavanja",
|
||||
"quick_reply_tell_me_more": "Reci mi nešto više o ovome",
|
||||
"quick_reply_when_else": "Kada je još viđeno?",
|
||||
"quick_reply_find_similar_text": "Pronađi slična uočavanja za ovo.",
|
||||
"quick_reply_tell_me_more_text": "Reci mi nešto više o ovome.",
|
||||
"quick_reply_when_else_text": "Kada je još ovo viđeno?",
|
||||
"anchor": "Referenca",
|
||||
"similarity_score": "Sličnost",
|
||||
"no_similar_objects_found": "Nisu pronađeni slični objekti.",
|
||||
"semantic_search_required": "Semantička pretraga mora biti omogućena da bi se pronašli slični objekti.",
|
||||
"send": "Pošalji",
|
||||
"suggested_requests": "Pokušajte da pitate:",
|
||||
"starting_requests": {
|
||||
"show_recent_events": "Prikaži nedavne događaje",
|
||||
"show_camera_status": "Prikaži status kamera",
|
||||
"recap": "Šta se desilo u odsustvu?",
|
||||
"watch_camera": "Prati kameru za aktivnosti"
|
||||
},
|
||||
"starting_requests_prompts": {
|
||||
"show_recent_events": "Prikaži mi nedavne događaje iz poslednjeg sata",
|
||||
"show_camera_status": "Kakav je trenutni status kamera?",
|
||||
"recap": "Šta se desilo u odsustvu?",
|
||||
"watch_camera": "Prati ulazna vrata i javi mi ako se neko pojavi"
|
||||
},
|
||||
"new_chat": "Novo ćaskanje",
|
||||
"settings": {
|
||||
"title": "Podešavanja ćaskanja",
|
||||
"show_stats": {
|
||||
"title": "Prikaži statistiku",
|
||||
"desc": "Prikaži brzinu generisanja i veličinu konteksta za odgovore u ćaskanju.",
|
||||
"while_generating": "Tokom generisanja",
|
||||
"always": "Uvek"
|
||||
},
|
||||
"auto_scroll": {
|
||||
"title": "Automatsko pomeranje ekrana",
|
||||
"desc": "Prati nove poruke kako pristižu."
|
||||
},
|
||||
"always_allow": {
|
||||
"title": "Uvek dozvoljene akcije",
|
||||
"desc": "Akcije koje asistent može da pokrene bez prethodnog traženja dozvole.",
|
||||
"none": "Nijedna",
|
||||
"reset": "Resetuj"
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"context": "{{tokens}} tokena",
|
||||
"tokens_per_second": "{{rate}} t/s"
|
||||
},
|
||||
"reasoning": {
|
||||
"active": "Razmišljanje…",
|
||||
"show": "Prikaži tok razmišljanja",
|
||||
"hide": "Sakrij tok razmišljanja"
|
||||
},
|
||||
"thinking": {
|
||||
"toggle": "Prebaci prikaz razmišljanja"
|
||||
},
|
||||
"approval": {
|
||||
"title": "Odobriti {{tool}}?",
|
||||
"desc": "Ova akcija menja nešto u Frigate-u. Pregledajte detalje pre odobravanja.",
|
||||
"approve": "Odobri",
|
||||
"always_allow": "Uvek dozvoli",
|
||||
"reject": "Odbij",
|
||||
"approved": "Odobreno",
|
||||
"rejected": "Odbijeno",
|
||||
"placeholder": "Odobrite ili odbijte akciju na čekanju da biste nastavili"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,18 @@
|
||||
{}
|
||||
{
|
||||
"documentTitle": "Editor konfiguracije - Frigate",
|
||||
"configEditor": "Editor konfiguracije",
|
||||
"safeConfigEditor": "Editor konfiguracije (Bezbedan režim)",
|
||||
"safeModeDescription": "Frigate je u bezbednom režimu zbog greške u validaciji konfiguracije.",
|
||||
"copyConfig": "Kopiraj konfiguraciju",
|
||||
"saveAndRestart": "Sačuvaj i ponovo pokreni",
|
||||
"saveOnly": "Samo sačuvaj",
|
||||
"confirm": "Izaći bez čuvanja?",
|
||||
"toast": {
|
||||
"success": {
|
||||
"copyToClipboard": "Konfiguracija je kopirana u privremenu memoriju."
|
||||
},
|
||||
"error": {
|
||||
"savingError": "Greška pri čuvanju konfiguracije"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,96 @@
|
||||
{}
|
||||
{
|
||||
"alerts": "Upozorenja",
|
||||
"detections": "Detekcije",
|
||||
"motion": {
|
||||
"label": "Kretanje",
|
||||
"only": "Samo kretanje"
|
||||
},
|
||||
"allCameras": "Sve kamere",
|
||||
"empty": {
|
||||
"alert": "Nema upozorenja za pregled",
|
||||
"detection": "Nema detekcija za pregled",
|
||||
"motion": "Nisu pronađeni podaci o kretanju",
|
||||
"recordingsDisabled": {
|
||||
"title": "Snimanje mora biti omogućeno",
|
||||
"description": "Stavke za pregled se mogu kreirati za kameru samo kada je snimanje omogućeno za tu kameru."
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"label": "Vremenska linija",
|
||||
"aria": "Izaberite vremensku liniju"
|
||||
},
|
||||
"zoomIn": "Uveličaj",
|
||||
"zoomOut": "Umanji",
|
||||
"subOnlyQuality": "U ovom vremenskom opsegu dostupni su samo snimci nižeg kvaliteta",
|
||||
"events": {
|
||||
"label": "Događaji",
|
||||
"aria": "Izaberite događaje",
|
||||
"noFoundForTimePeriod": "Nema pronađenih događaja za ovaj vremenski period."
|
||||
},
|
||||
"detail": {
|
||||
"label": "Detalj",
|
||||
"noDataFound": "Nema detaljnih podataka za pregled",
|
||||
"aria": "Uključi/isključi detaljan prikaz",
|
||||
"trackedObject_one": "{{count}} objekat",
|
||||
"trackedObject_other": "{{count}} objekata",
|
||||
"noObjectDetailData": "Nema dostupnih detaljnih podataka o objektu.",
|
||||
"settings": "Podešavanja detaljnog prikaza",
|
||||
"alwaysExpandActive": {
|
||||
"title": "Uvek proširi aktivno",
|
||||
"desc": "Uvek proširi detalje o objektu za aktivnu stavku pregleda kada su dostupni."
|
||||
}
|
||||
},
|
||||
"objectTrack": {
|
||||
"trackedPoint": "Praćena tačka",
|
||||
"clickToSeek": "Kliknite da premotate na ovo vreme"
|
||||
},
|
||||
"documentTitle": "Pregled - Frigate",
|
||||
"recordings": {
|
||||
"documentTitle": "Snimci - Frigate",
|
||||
"invalidSharedLink": "Nije moguće otvoriti vezu ka snimku sa vremenskom oznakom zbog greške u parsiranju.",
|
||||
"invalidSharedCamera": "Nije moguće otvoriti vezu ka snimku sa vremenskom oznakom zbog nepoznate ili neovlašćene kamere."
|
||||
},
|
||||
"calendarFilter": {
|
||||
"last24Hours": "Poslednja 24 sata"
|
||||
},
|
||||
"markAsReviewed": "Označi kao pregledano",
|
||||
"markTheseItemsAsReviewed": "Označi ove stavke kao pregledane",
|
||||
"newReviewItems": {
|
||||
"label": "Prikaži nove stavke za pregled",
|
||||
"button": "Nove stavke za pregled"
|
||||
},
|
||||
"selected_one": "Izabrano: {{count}}",
|
||||
"selected_other": "Izabrano: {{count}}",
|
||||
"select_all": "Sve",
|
||||
"camera": "Kamera",
|
||||
"detected": "detektovano",
|
||||
"normalActivity": "Normalno",
|
||||
"needsReview": "Zahteva pregled",
|
||||
"securityConcern": "Bezbednosni problem",
|
||||
"motionSearch": {
|
||||
"menuItem": "Pretraga kretanja",
|
||||
"openMenu": "Opcije kamere"
|
||||
},
|
||||
"motionPreviews": {
|
||||
"menuItem": "Prikaži preglede kretanja",
|
||||
"title": "Pregledi kretanja: {{camera}}",
|
||||
"mobileSettingsTitle": "Podešavanja pregleda kretanja",
|
||||
"mobileSettingsDesc": "Prilagodite brzinu reprodukcije, zatamnjenje i isecanje, i izaberite datum za pregled video zapisa koji sadrže samo kretanje.",
|
||||
"dim": "Zatamnjenje",
|
||||
"dimAria": "Prilagodite intenzitet zatamnjenja",
|
||||
"dimDesc": "Povećajte zatamnjenje da biste povećali vidljivost oblasti sa kretanjem.",
|
||||
"speed": "Brzina",
|
||||
"speedAria": "Izaberite brzinu reprodukcije pregleda",
|
||||
"speedDesc": "Izaberite koliko brzo se reprodukuju video zapisi pregleda.",
|
||||
"back": "Nazad",
|
||||
"empty": "Nema dostupnih pregleda",
|
||||
"noPreview": "Pregled nije dostupan",
|
||||
"seekAria": "Premotajte plejer za kameru {{camera}} na {{time}}",
|
||||
"filter": "Filter",
|
||||
"filterDesc": "Izaberite oblasti da biste prikazali samo video zapise sa kretanjem u tim regionima.",
|
||||
"filterClear": "Očisti",
|
||||
"crop": "Iseci prema filteru",
|
||||
"cropAria": "Uključi/isključi isecanje pregleda na filtrirane oblasti",
|
||||
"cropDesc": "Zumirajte preglede na izabrane oblasti filtera umesto prikazivanja celog kadra."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,12 @@
|
||||
{}
|
||||
{
|
||||
"filter": "Filtriraj",
|
||||
"export": "Izvezi",
|
||||
"calendar": "Kalendar",
|
||||
"filters": "Filteri",
|
||||
"toast": {
|
||||
"error": {
|
||||
"noValidTimeSelected": "Nije izabran važeći vremenski raspon",
|
||||
"endTimeMustAfterStartTime": "Vreme završetka mora biti nakon vremena početka"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -648,11 +648,9 @@
|
||||
"frigatePlus": {
|
||||
"title": "Frigate+-inställningar",
|
||||
"apiKey": {
|
||||
"notValidated": "Frigate+-API-nyckeln kunde inte identifieras eller valideras",
|
||||
"desc": "Frigate+ API-nyckeln möjliggör integration med Frigate+-tjänsten.",
|
||||
"plusLink": "Läs mer om Frigate+",
|
||||
"title": "Frigate+ API-nyckel",
|
||||
"validated": "Frigate+-API-nyckeln har identifierats och validerats"
|
||||
"title": "Frigate+ API-nyckel"
|
||||
},
|
||||
"snapshotConfig": {
|
||||
"title": "Konfiguration av ögonblicksbilder",
|
||||
|
||||
@@ -671,10 +671,15 @@
|
||||
"title": "Frigate+ Ayarları",
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API Anahtarı",
|
||||
"validated": "Frigate+ API anahtarınız algılandı ve doğrulandı",
|
||||
"plusLink": "Frigate+ hakkında daha fazla bilgi edinin",
|
||||
"notValidated": "Frigate+ API anahtarı algılanmadı veya doğrulanmadı",
|
||||
"desc": "Frigate+ API anahtarı, Frigate+ hizmetiyle entegrasyonu sağlar."
|
||||
"desc": "Frigate+ API anahtarı, Frigate+ hizmetiyle entegrasyonu sağlar.",
|
||||
"formatValid": "Frigate+ API anahtarı algılandı ve beklenen biçime uyuyor",
|
||||
"formatInvalid": "Frigate+ API anahtarı algılanmadı veya beklenen biçime uymuyor",
|
||||
"validate": "Frigate+ ile doğrula",
|
||||
"validating": "Doğrulanıyor…",
|
||||
"serverValid": "Frigate+ bu API anahtarını kabul etti",
|
||||
"serverInvalid": "Frigate+ bu API anahtarını reddetti",
|
||||
"serverUnreachable": "Bu API anahtarını doğrulamak için Frigate+'ya ulaşılamadı"
|
||||
},
|
||||
"snapshotConfig": {
|
||||
"title": "Anlık Fotoğraf Yapılandırması",
|
||||
|
||||
@@ -312,9 +312,7 @@
|
||||
},
|
||||
"apiKey": {
|
||||
"desc": "Ключ API Frigate+ забезпечує інтеграцію з сервісом Frigate+.",
|
||||
"notValidated": "Ключ API Frigate+ не виявлено або не перевірено",
|
||||
"title": "Ключ API Фрегат+",
|
||||
"validated": "Ключ API Frigate+ виявлено та перевірено",
|
||||
"plusLink": "Дізнайтеся більше про Фрегат+"
|
||||
},
|
||||
"restart_required": "Потрібно перезавантаження (модель Frigate+ змінена)",
|
||||
|
||||
@@ -68,8 +68,6 @@
|
||||
"title": "Cài đặt Frigate+",
|
||||
"apiKey": {
|
||||
"title": "Khóa API Frigate+",
|
||||
"validated": "Khóa API Frigate+ đã được phát hiện và xác thực",
|
||||
"notValidated": "Khóa API Frigate+ không được phát hiện hoặc chưa được xác thực",
|
||||
"desc": "Khóa API Frigate+ cho phép tích hợp với dịch vụ Frigate+.",
|
||||
"plusLink": "Đọc thêm về Frigate+"
|
||||
},
|
||||
|
||||
@@ -512,8 +512,6 @@
|
||||
"title": "Frigate+設定",
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API金鑰",
|
||||
"validated": "已偵測並驗證Frigate+ API金鑰",
|
||||
"notValidated": "未偵測到Frigate+ API金鑰或驗證失敗",
|
||||
"desc": "Frigate+ API金鑰可啟用與Frigate+服務的整合功能。",
|
||||
"plusLink": "了解更多Frigate+資料"
|
||||
},
|
||||
|
||||
@@ -70,7 +70,8 @@
|
||||
"inProgress": "进行中",
|
||||
"invalidStartTime": "无效的开始时间",
|
||||
"invalidEndTime": "无效的结束时间",
|
||||
"never": "从不"
|
||||
"never": "从不",
|
||||
"custom": "自定义…"
|
||||
},
|
||||
"unit": {
|
||||
"speed": {
|
||||
@@ -115,10 +116,10 @@
|
||||
"apply": "应用",
|
||||
"reset": "重置",
|
||||
"done": "完成",
|
||||
"enabled": "启用",
|
||||
"enable": "启用",
|
||||
"disabled": "禁用",
|
||||
"disable": "禁用",
|
||||
"enabled": "开启",
|
||||
"enable": "开启",
|
||||
"disabled": "关闭",
|
||||
"disable": "关闭",
|
||||
"save": "保存",
|
||||
"saving": "保存中…",
|
||||
"cancel": "取消",
|
||||
@@ -146,7 +147,7 @@
|
||||
"deleteNow": "立即删除",
|
||||
"next": "下一个",
|
||||
"cameraAudio": "摄像头音频",
|
||||
"twoWayTalk": "双向对话",
|
||||
"twoWayTalk": "双向对讲",
|
||||
"continue": "继续",
|
||||
"add": "添加",
|
||||
"applying": "应用中…",
|
||||
@@ -293,7 +294,7 @@
|
||||
"accessDenied": {
|
||||
"documentTitle": "没有权限 - Frigate",
|
||||
"title": "没有权限",
|
||||
"desc": "您没有权限查看此页面。"
|
||||
"desc": "你没有权限查看此页面。"
|
||||
},
|
||||
"notFound": {
|
||||
"documentTitle": "没有找到页面 - Frigate",
|
||||
@@ -329,6 +330,25 @@
|
||||
"copyFailed": "无法复制详情到剪切板"
|
||||
},
|
||||
"commandMenu": {
|
||||
"title": "命令菜单"
|
||||
"title": "命令菜单",
|
||||
"description": "搜索页面、摄像头、设置项和操作",
|
||||
"placeholder": "搜索页面、摄像头、设置项和操作",
|
||||
"empty": "未匹配",
|
||||
"section": {
|
||||
"recent": "最近",
|
||||
"pages": "页面",
|
||||
"cameras": "摄像头",
|
||||
"cameraGroups": "摄像头组",
|
||||
"settings": "设置",
|
||||
"actions": "行为"
|
||||
},
|
||||
"camera": {
|
||||
"live": "实时监控",
|
||||
"review": "核查"
|
||||
},
|
||||
"action": {
|
||||
"toggleTheme": "切换浅色或深色模式"
|
||||
},
|
||||
"hint": "按 {{key}} 或 / 打开,按回车运行"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,7 +81,8 @@
|
||||
"placeholder": "选择合集",
|
||||
"newCaseOption": "创建新合集",
|
||||
"newCaseNamePlaceholder": "新合集名称",
|
||||
"newCaseDescriptionPlaceholder": "合集描述"
|
||||
"newCaseDescriptionPlaceholder": "合集描述",
|
||||
"nameRequired": "合集名称为必填项"
|
||||
},
|
||||
"queueing": "正在加入导出队列…",
|
||||
"tabs": {
|
||||
@@ -106,7 +107,9 @@
|
||||
"selectWithActivity": "包含追踪目标的摄像头",
|
||||
"selectGroup": "选择组",
|
||||
"noMatchingCameras": "没有匹配搜索的摄像头",
|
||||
"selectedCount": "{{selected}} / {{total}} 个"
|
||||
"selectedCount": "{{selected}} / {{total}} 个",
|
||||
"noCamerasSelected": "选择至少一个摄像头",
|
||||
"caseNameDefault": "多个摄像头导出 - {{date}}"
|
||||
},
|
||||
"multi": {
|
||||
"title_other": "导出 {{count}} 个核查",
|
||||
@@ -120,6 +123,15 @@
|
||||
"partial": "已启动 {{total}} 个导出,其中 {{successful}} 个成功。失败项:{{failedItems}}",
|
||||
"failed": "启动导出失败(共 {{total}} 个)。失败项:{{failedItems}}"
|
||||
}
|
||||
},
|
||||
"stream": {
|
||||
"label": "质量",
|
||||
"auto": "自动",
|
||||
"main": "原画",
|
||||
"sub": "低",
|
||||
"autoDesc": "使用主流,在主流不可用时回退到较低质量的子流。",
|
||||
"mainDesc": "仅导出原画画质的主流。主流不可用时的时间范围将缺失。",
|
||||
"subDesc": "仅导出低画质子流。子流不可用时的时间范围将缺失。"
|
||||
}
|
||||
},
|
||||
"streaming": {
|
||||
@@ -165,7 +177,8 @@
|
||||
"export": "导出",
|
||||
"markAsReviewed": "标记为已核查",
|
||||
"deleteNow": "立即删除",
|
||||
"markAsUnreviewed": "标记为未核查"
|
||||
"markAsUnreviewed": "标记为未核查",
|
||||
"generateDescription": "生成描述"
|
||||
},
|
||||
"shareTimestamp": {
|
||||
"label": "分享该时间片段",
|
||||
@@ -174,6 +187,12 @@
|
||||
"custom": "自定义时间",
|
||||
"button": "分享时间片段地址",
|
||||
"shareTitle": "Frigate 核查时间:{{camera}}"
|
||||
},
|
||||
"genaiDescription": {
|
||||
"toast": {
|
||||
"success": "已为该核查项请求生成式 AI 描述。",
|
||||
"error": "请求描述失败:{{error}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"imagePicker": {
|
||||
|
||||
@@ -30,15 +30,32 @@
|
||||
}
|
||||
},
|
||||
"decodedFrames": "解码帧数:",
|
||||
"droppedFrameRate": "丢帧率:"
|
||||
"droppedFrameRate": "丢帧率:",
|
||||
"stream": "视频流:",
|
||||
"streamAuto": "{{stream}} (自动)"
|
||||
},
|
||||
"toast": {
|
||||
"success": {
|
||||
"submittedFrigatePlus": "已成功提交帧到 Frigate+"
|
||||
},
|
||||
"error": {
|
||||
"submitFrigatePlusFailed": "提交帧到 Frigate+ 失败"
|
||||
"submitFrigatePlusFailed": "提交帧到 Frigate+ 失败",
|
||||
"playRecordingsFailed": "播放录制失败(错误代码 {{code}}):{{message}}"
|
||||
}
|
||||
},
|
||||
"cameraOff": "摄像头已关闭"
|
||||
"cameraOff": "摄像头已关闭",
|
||||
"quality": {
|
||||
"auto": "自动",
|
||||
"autoLow": "播放低质量画面(带宽受限)",
|
||||
"autoLowCodec": "播放低质量画面(该浏览器不支持原画)",
|
||||
"autoLowSaveData": "播放低质量画面(节省带宽)",
|
||||
"main": "原画",
|
||||
"sub": "低画质",
|
||||
"notSupportedBrowser": "不支持该浏览器",
|
||||
"label": "画质",
|
||||
"noAudio": "无音频",
|
||||
"audioRate": "{{rate}} kHz 音频",
|
||||
"audioCodecRate": "{{codec}}{{rate}} kHz",
|
||||
"noRecordings": "该时间段内无录制"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,10 @@
|
||||
"enabled_in_config": {
|
||||
"label": "原始音频状态",
|
||||
"description": "指示原始静态配置文件中是否开启了音频检测。"
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "自定义音频 labelmap",
|
||||
"description": "覆盖或重新映射条目以合并到标准音频标签映射中。"
|
||||
}
|
||||
},
|
||||
"audio_transcription": {
|
||||
@@ -59,8 +63,8 @@
|
||||
"label": "原始转写状态"
|
||||
},
|
||||
"live_enabled": {
|
||||
"label": "实时监控转写",
|
||||
"description": "在接收到音频时开启实时监控持续转写。"
|
||||
"label": "实时转录",
|
||||
"description": "在接收到音频时进行实时流式转录。"
|
||||
}
|
||||
},
|
||||
"birdseye": {
|
||||
@@ -73,6 +77,10 @@
|
||||
"order": {
|
||||
"label": "排序位置",
|
||||
"description": "用于控制摄像头在鸟瞰视图布局中排序位置的数值。"
|
||||
},
|
||||
"modes": {
|
||||
"label": "活动类型",
|
||||
"description": "鸟瞰图中摄像头的活动类型。"
|
||||
}
|
||||
},
|
||||
"detect": {
|
||||
@@ -92,7 +100,7 @@
|
||||
},
|
||||
"fps": {
|
||||
"label": "检测帧率",
|
||||
"description": "检测时希望使用的帧率;数值越低,CPU 占用越小(推荐值为 5,仅在追踪极高速运动的目标时才设置更高数值,最高不建议超过 10)。"
|
||||
"description": "检测时希望使用的帧率;数值越低,CPU 占用越小(推荐值为 5,仅在追踪移动速度极快的目标时才设置更高数值,最高不建议超过 10)。"
|
||||
},
|
||||
"min_initialized": {
|
||||
"label": "最小初始化帧数",
|
||||
@@ -133,6 +141,10 @@
|
||||
"annotation_offset": {
|
||||
"label": "标记偏移量",
|
||||
"description": "检测标记的时间偏移量(毫秒),用于让时间轴上的检测框与录像画面更精准对齐;可设置为正数或负数。"
|
||||
},
|
||||
"scene": {
|
||||
"label": "检测场景",
|
||||
"description": "该摄像头所查看的环境,用于选择在其中运行的模型配置。设置为“默认”的摄像头将运行配置为“默认”场景的模型。"
|
||||
}
|
||||
},
|
||||
"face_recognition": {
|
||||
@@ -176,6 +188,10 @@
|
||||
"record": {
|
||||
"label": "录制输出参数",
|
||||
"description": "录制功能视频流的默认输出参数。"
|
||||
},
|
||||
"record_sub": {
|
||||
"label": "子流录制输出参数",
|
||||
"description": "子流录制功能视频流输出参数。如果未设置,将使用录制流输出参数。"
|
||||
}
|
||||
},
|
||||
"retry_interval": {
|
||||
@@ -184,11 +200,11 @@
|
||||
},
|
||||
"apple_compatibility": {
|
||||
"label": "Apple 兼容性",
|
||||
"description": "录制 H.265 视频时启用 HEVC 标记,以提升对 Apple 设备播放的兼容性。"
|
||||
"description": "录制 H.265 视频时开启 HEVC 标记,以提升对 Apple 设备播放的兼容性。"
|
||||
},
|
||||
"gpu": {
|
||||
"label": "GPU 索引",
|
||||
"description": "在启用硬件加速时,默认使用的 GPU 索引。"
|
||||
"description": "在开启硬件加速时,默认使用的 GPU 索引。"
|
||||
},
|
||||
"inputs": {
|
||||
"label": "摄像头输入视频流",
|
||||
@@ -263,9 +279,13 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始通知状态",
|
||||
"description": "指示原始静态配置中是否启用了通知。"
|
||||
"description": "指示原始静态配置中是否开启了通知。"
|
||||
},
|
||||
"description": "为此摄像头启用和控制通知的设置。"
|
||||
"description": "为此摄像头启用和控制通知的设置。",
|
||||
"ttl": {
|
||||
"label": "通知有效期",
|
||||
"description": "设备无法连接时,推送服务会如何处理警报期间发送的通知。“立即”会马上投递,投递失败就放弃;“可靠”会在最长 30 秒内持续重试。警报结束时发送的通知始终会保留最多一小时。"
|
||||
}
|
||||
},
|
||||
"live": {
|
||||
"label": "实时监控观看",
|
||||
@@ -281,7 +301,31 @@
|
||||
"label": "实时监控质量",
|
||||
"description": "jsmpeg 流的编码质量(1 最高,31 最低)。"
|
||||
},
|
||||
"description": "用于控制实时流选择、分辨率和质量的网页页面设置。"
|
||||
"description": "用于控制实时流选择、分辨率和质量的网页页面设置。",
|
||||
"transcode": {
|
||||
"label": "转码流",
|
||||
"description": "由 go2rtc 按需转码的低画质实时监控流。",
|
||||
"enabled": {
|
||||
"label": "开启转码流",
|
||||
"description": "添加低画质实时监控流,在有人观看实时监控时由 go2rtc 实时转码生成。"
|
||||
},
|
||||
"source": {
|
||||
"label": "源视频流",
|
||||
"description": "go2rtc 流转码。默认为第一个实时监控流。"
|
||||
},
|
||||
"qualities": {
|
||||
"label": "画质",
|
||||
"description": "每个画质都增加一个转码流。",
|
||||
"height": {
|
||||
"label": "高度",
|
||||
"description": "画面输出高度像素,宽度将遵循源宽高比自动计算。"
|
||||
},
|
||||
"bitrate": {
|
||||
"label": "码率",
|
||||
"description": "目标及最大视频码率(kbps)。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "画面变动检测",
|
||||
@@ -311,11 +355,11 @@
|
||||
},
|
||||
"delta_alpha": {
|
||||
"label": "变化量权重",
|
||||
"description": "该值用于调节帧间差异计算时的混合比例,影响运动检测的灵敏度。"
|
||||
"description": "该值用于调节帧间差异计算时的混合比例,影响画面变动检测的灵敏度。"
|
||||
},
|
||||
"frame_alpha": {
|
||||
"label": "背景更新速度",
|
||||
"description": "该值在运动检测前对画面进行预处理,控制帧混合程度,影响后续检测的输入质量。"
|
||||
"description": "该值在画面变动检测前对画面进行预处理,控制帧混合程度,影响后续检测的输入质量。"
|
||||
},
|
||||
"frame_height": {
|
||||
"label": "画面高度",
|
||||
@@ -331,7 +375,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始画面变动状态",
|
||||
"description": "指示原始静态配置中是否启用了画面变动检测。"
|
||||
"description": "指示原始静态配置中是否开启了画面变动检测。"
|
||||
},
|
||||
"raw_mask": {
|
||||
"label": "原始遮罩"
|
||||
@@ -432,7 +476,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原配置生成式 AI 状态",
|
||||
"description": "表示在原始静态配置中是否已启用生成式 AI。"
|
||||
"description": "表示在原始静态配置中是否已开启生成式 AI。"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -535,9 +579,57 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始录像状态",
|
||||
"description": "指示原始静态配置中是否启用了录像。"
|
||||
"description": "指示原始静态配置中是否开启了录像。"
|
||||
},
|
||||
"description": "此摄像头的录像和保留设置。"
|
||||
"description": "此摄像头的录像和保留设置。",
|
||||
"sub": {
|
||||
"label": "子流录制中",
|
||||
"description": "录制第二条低画质流的设置。",
|
||||
"enabled": {
|
||||
"label": "开启子流录制",
|
||||
"description": "开启第二路低画质视频流的录制,以支持自适应画质回放并延长录像保留时间。"
|
||||
},
|
||||
"continuous": {
|
||||
"label": "子视频流连续保留",
|
||||
"description": "保留子视频流录制的天数,无论是否有追踪目标或画面变动。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留录制的天数。"
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "子视频流画面变动保留",
|
||||
"description": "触发画面变动时保留子视频流录制的天数。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留录制的天数。"
|
||||
}
|
||||
},
|
||||
"alerts": {
|
||||
"label": "子视频流警报保留",
|
||||
"description": "警报类子视频流录制的保留设置。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留检测事件录制的天数。"
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:全部(保留所有片段)、画面变动(保留画面变动片段)或 活动目标(保留画面中出现活动目标的片段)。"
|
||||
}
|
||||
},
|
||||
"detections": {
|
||||
"label": "子视频流检测保留",
|
||||
"description": "子视频流中检测事件的录像保留设置。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "检测事件的录像保留天数。"
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:全部(保存所有片段)、画面变动(保存有画面变动的片段)或活动目标(保存有活动目标的片段)。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"review": {
|
||||
"label": "核查",
|
||||
@@ -558,7 +650,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始警报状态",
|
||||
"description": "追踪原始静态配置中是否启用了警报。"
|
||||
"description": "追踪原始静态配置中是否开启了警报。"
|
||||
},
|
||||
"cutoff_time": {
|
||||
"label": "警报截止时间",
|
||||
@@ -586,7 +678,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始检测状态",
|
||||
"description": "追踪原始静态配置中是否启用了检测。"
|
||||
"description": "追踪原始静态配置中是否开启了检测。"
|
||||
}
|
||||
},
|
||||
"genai": {
|
||||
@@ -606,7 +698,7 @@
|
||||
},
|
||||
"image_source": {
|
||||
"label": "核查图像来源",
|
||||
"description": "发送给生成式 AI 的画面来源(“预览” 或 “录制”);“录制”将使用更高质量的画面帧,但会消耗更多的 token。"
|
||||
"description": "发送给生成式 AI 的画面来源(“预览”或“录制”);“录制”会使用更高画质的画面帧,但会消耗更多 token。"
|
||||
},
|
||||
"additional_concerns": {
|
||||
"label": "额外关注事项",
|
||||
@@ -618,7 +710,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原配置生成式 AI 状态",
|
||||
"description": "记录在静态配置中最初是否已启用生成式 AI 核查功能。"
|
||||
"description": "记录在静态配置中最初是否已开启生成式 AI 核查功能。"
|
||||
},
|
||||
"preferred_language": {
|
||||
"label": "首选语言",
|
||||
@@ -627,6 +719,14 @@
|
||||
"activity_context_prompt": {
|
||||
"label": "活动上下文提示",
|
||||
"description": "自定义提示词,用于说明可疑行为与非可疑行为的界定,为生成式 AI 生成摘要提供上下文依据。"
|
||||
},
|
||||
"frame_mode": {
|
||||
"label": "画面帧模式",
|
||||
"description": "向模型呈现画面帧的方式。“画面帧”会先发送提示词,再发送画面帧,适合能自行把握画面顺序的模型。“带标注的画面帧”会为每一帧添加标注,并穿插来自目标追踪的说明,适合容易跟丢重复或反向动作的模型。"
|
||||
},
|
||||
"response_style": {
|
||||
"label": "回复风格",
|
||||
"description": "生成核查描述时使用的写作风格预设。预设会调整面向用户的标题、摘要和场景描述的语气与详细程度;“默认”会保持内置提示词不变。"
|
||||
}
|
||||
},
|
||||
"description": "控制此摄像头的警报、检测和生成式 AI 核查总结的设置,这些设置会被界面与存储功能使用。"
|
||||
@@ -722,7 +822,7 @@
|
||||
},
|
||||
"enabled": {
|
||||
"label": "开启此触发器",
|
||||
"description": "启用或禁用此语义搜索触发器。"
|
||||
"description": "开启或关闭此语义搜索触发器。"
|
||||
},
|
||||
"type": {
|
||||
"label": "触发器类型",
|
||||
@@ -783,15 +883,15 @@
|
||||
"description": "ONVIF 身份验证的密码。"
|
||||
},
|
||||
"tls_insecure": {
|
||||
"label": "禁用 TLS 验证",
|
||||
"description": "跳过 TLS 验证并禁用 ONVIF 的摘要认证(不安全;仅用于安全网络)。"
|
||||
"label": "关闭 TLS 验证",
|
||||
"description": "跳过 TLS 验证并关闭 ONVIF 的摘要认证(不安全;仅用于安全网络)。"
|
||||
},
|
||||
"autotracking": {
|
||||
"label": "自动追踪",
|
||||
"description": "使用 PTZ 摄像头移动自动追踪移动目标并使其保持在画面中心。",
|
||||
"enabled": {
|
||||
"label": "开启自动追踪",
|
||||
"description": "启用或禁用检测目标的自动 PTZ 摄像头追踪。"
|
||||
"description": "开启或关闭检测目标的自动 PTZ 摄像头追踪。"
|
||||
},
|
||||
"calibrate_on_startup": {
|
||||
"label": "启动时校准",
|
||||
@@ -827,7 +927,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始自动追踪状态",
|
||||
"description": "用于追踪配置中是否启用自动追踪的内部字段。"
|
||||
"description": "用于追踪配置中是否开启自动追踪的内部字段。"
|
||||
}
|
||||
},
|
||||
"ignore_time_mismatch": {
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
"label": "音频检测",
|
||||
"enabled": {
|
||||
"label": "开启音频检测",
|
||||
"description": "为所有摄像头启用或禁用音频事件检测;可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭音频事件检测;可按摄像头覆盖。"
|
||||
},
|
||||
"max_not_heard": {
|
||||
"label": "结束超时",
|
||||
@@ -57,12 +57,16 @@
|
||||
"enabled_in_config": {
|
||||
"label": "原始音频状态",
|
||||
"description": "指示原始静态配置文件中是否开启了音频检测。"
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "自定义音频 labelmap",
|
||||
"description": "覆盖或重新映射条目以合并到标准音频标签映射中。"
|
||||
}
|
||||
},
|
||||
"auth": {
|
||||
"cookie_secure": {
|
||||
"label": "安全 Cookie 标志",
|
||||
"description": "在身份验证 Cookie 上设置安全标志;使用 TLS 时应启用此选项。"
|
||||
"description": "在身份验证 Cookie 上设置安全标志;使用 TLS 时应开启此选项。"
|
||||
},
|
||||
"label": "身份验证",
|
||||
"description": "身份验证和会话相关设置,包括 Cookie 和速率限制选项。",
|
||||
@@ -104,19 +108,19 @@
|
||||
},
|
||||
"admin_first_time_login": {
|
||||
"label": "管理员首次登录标志",
|
||||
"description": "启用后,UI 可能会在登录页面显示帮助链接,告知用户如何在管理员密码重置后登录。 "
|
||||
"description": "开启后,UI 可能会在登录页面显示帮助链接,告知用户如何在管理员密码重置后登录。 "
|
||||
}
|
||||
},
|
||||
"audio_transcription": {
|
||||
"label": "音频转录",
|
||||
"description": "用于事件和实时字幕的实时和语音音频转录设置。",
|
||||
"live_enabled": {
|
||||
"label": "实时监控转写",
|
||||
"description": "在接收到音频时开启实时监控持续转写。"
|
||||
"label": "实时转录",
|
||||
"description": "在接收到音频时进行实时流式转录。"
|
||||
},
|
||||
"enabled": {
|
||||
"label": "开启音频转录",
|
||||
"description": "为所有摄像头启用或禁用自动音频转录;可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭自动音频转录;可按摄像头覆盖。"
|
||||
},
|
||||
"language": {
|
||||
"label": "转录语言",
|
||||
@@ -129,6 +133,10 @@
|
||||
"model_size": {
|
||||
"label": "模型大小",
|
||||
"description": "用于离线音频事件转录的模型大小。"
|
||||
},
|
||||
"model": {
|
||||
"label": "音频转录模型或生成式 AI 服务商名称",
|
||||
"description": "转录后端:'whisper' 表示 Frigate 内置的本地模型,也可以填写具备 transcribe 角色的生成式 AI 服务商名称。"
|
||||
}
|
||||
},
|
||||
"birdseye": {
|
||||
@@ -144,7 +152,7 @@
|
||||
},
|
||||
"restream": {
|
||||
"label": "转发 RTSP",
|
||||
"description": "将鸟瞰图输出作为 RTSP 流重新转发;启用此功能将使鸟瞰图持续运行。"
|
||||
"description": "将鸟瞰图输出作为 RTSP 流重新转发;开启此功能将使鸟瞰图持续运行。"
|
||||
},
|
||||
"width": {
|
||||
"label": "宽度",
|
||||
@@ -176,7 +184,11 @@
|
||||
},
|
||||
"idle_heartbeat_fps": {
|
||||
"label": "空闲心跳 FPS",
|
||||
"description": "空闲时重新发送最后一个合成鸟瞰帧的每秒帧数;设为 0 则禁用。"
|
||||
"description": "空闲时重新发送最后一个合成鸟瞰帧的每秒帧数;设为 0 则关闭。"
|
||||
},
|
||||
"modes": {
|
||||
"label": "活动类型",
|
||||
"description": "鸟瞰图中摄像头的活动类型。"
|
||||
}
|
||||
},
|
||||
"detect": {
|
||||
@@ -184,7 +196,7 @@
|
||||
"description": "用于运行目标检测、初始化追踪器的检测模块设置。",
|
||||
"enabled": {
|
||||
"label": "开启目标检测",
|
||||
"description": "为所有摄像头启用或禁用目标检测,可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭目标检测,可按摄像头覆盖。"
|
||||
},
|
||||
"height": {
|
||||
"label": "检测画面高度",
|
||||
@@ -196,7 +208,7 @@
|
||||
},
|
||||
"fps": {
|
||||
"label": "检测帧率",
|
||||
"description": "检测时希望使用的帧率;数值越低,CPU 占用越小(推荐值为 5,仅在追踪极高速运动的目标时才设置更高数值,最高不建议超过 10)。"
|
||||
"description": "检测时希望使用的帧率;数值越低,CPU 占用越小(推荐值为 5,仅在追踪移动速度极快的目标时才设置更高数值,最高不建议超过 10)。"
|
||||
},
|
||||
"min_initialized": {
|
||||
"label": "最小初始化帧数",
|
||||
@@ -237,13 +249,17 @@
|
||||
"annotation_offset": {
|
||||
"label": "标记偏移量",
|
||||
"description": "检测标记的时间偏移量(毫秒),用于让时间轴上的检测框与录像画面更精准对齐;可设置为正数或负数。"
|
||||
},
|
||||
"scene": {
|
||||
"label": "检测场景",
|
||||
"description": "该摄像头所查看的环境,用于选择在其中运行的模型配置。设置为“默认”的摄像头将运行配置为“默认”场景的模型。"
|
||||
}
|
||||
},
|
||||
"face_recognition": {
|
||||
"label": "人脸识别",
|
||||
"enabled": {
|
||||
"label": "开启人脸识别",
|
||||
"description": "为所有摄像头启用或禁用人脸识别;可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭人脸识别;可按摄像头覆盖。"
|
||||
},
|
||||
"min_area": {
|
||||
"label": "最小人脸区域",
|
||||
@@ -312,6 +328,10 @@
|
||||
"record": {
|
||||
"label": "录制输出参数",
|
||||
"description": "录制功能视频流的默认输出参数。"
|
||||
},
|
||||
"record_sub": {
|
||||
"label": "子流录制输出参数",
|
||||
"description": "子流录制功能视频流输出参数。如果未设置,将使用录制流输出参数。"
|
||||
}
|
||||
},
|
||||
"retry_interval": {
|
||||
@@ -320,11 +340,11 @@
|
||||
},
|
||||
"apple_compatibility": {
|
||||
"label": "Apple 兼容性",
|
||||
"description": "录制 H.265 视频时启用 HEVC 标记,以提升对 Apple 设备播放的兼容性。"
|
||||
"description": "录制 H.265 视频时开启 HEVC 标记,以提升对 Apple 设备播放的兼容性。"
|
||||
},
|
||||
"gpu": {
|
||||
"label": "GPU 索引",
|
||||
"description": "在启用硬件加速时,默认使用的 GPU 索引。"
|
||||
"description": "在开启硬件加速时,默认使用的 GPU 索引。"
|
||||
},
|
||||
"inputs": {
|
||||
"label": "摄像头输入视频流",
|
||||
@@ -368,7 +388,7 @@
|
||||
"description": "连接到 MQTT 代理并发布遥测数据、快照和事件详情的设置。",
|
||||
"enabled": {
|
||||
"label": "开启 MQTT",
|
||||
"description": "启用或禁用 MQTT 集成,用于状态、事件和快照。"
|
||||
"description": "开启或关闭 MQTT 集成,用于状态、事件和快照。"
|
||||
},
|
||||
"host": {
|
||||
"label": "MQTT 主机",
|
||||
@@ -421,10 +441,10 @@
|
||||
},
|
||||
"notifications": {
|
||||
"label": "通知",
|
||||
"description": "为所有摄像头启用和控制通知的设置;可按摄像头覆盖。",
|
||||
"description": "用于为所有摄像头开启通知并进行控制的设置;可按摄像头覆盖。",
|
||||
"enabled": {
|
||||
"label": "开启通知",
|
||||
"description": "为所有摄像头启用或禁用通知;可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭通知;可按摄像头覆盖。"
|
||||
},
|
||||
"email": {
|
||||
"label": "通知邮箱",
|
||||
@@ -436,18 +456,22 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始通知状态",
|
||||
"description": "指示原始静态配置中是否启用了通知。"
|
||||
"description": "指示原始静态配置中是否开启了通知。"
|
||||
},
|
||||
"ttl": {
|
||||
"label": "通知有效期",
|
||||
"description": "设备无法连接时,推送服务会如何处理警报期间发送的通知。“立即”会马上投递,投递失败就放弃;“可靠”会在最长 30 秒内持续重试。警报结束时发送的通知始终会保留最多一小时。"
|
||||
}
|
||||
},
|
||||
"networking": {
|
||||
"label": "网络",
|
||||
"description": "网络相关设置,如 Frigate 端点的 IPv6 启用。",
|
||||
"description": "网络相关设置,例如 Frigate 端点的 IPv6 支持。",
|
||||
"ipv6": {
|
||||
"label": "IPv6 配置",
|
||||
"description": "Frigate 网络服务的 IPv6 特定设置。",
|
||||
"enabled": {
|
||||
"label": "开启 IPv6",
|
||||
"description": "在适用的情况下为 Frigate 服务(API 和 UI)启用 IPv6 支持。"
|
||||
"description": "在适用的情况下为 Frigate 服务(API 和 UI)开启 IPv6 支持。"
|
||||
}
|
||||
},
|
||||
"listen": {
|
||||
@@ -508,18 +532,18 @@
|
||||
},
|
||||
"stats": {
|
||||
"label": "系统统计",
|
||||
"description": "用于启用/禁用各种系统和 GPU 统计信息收集的选项。",
|
||||
"description": "用于开启/关闭各种系统和 GPU 统计信息收集的选项。",
|
||||
"amd_gpu_stats": {
|
||||
"label": "AMD GPU 统计",
|
||||
"description": "如果存在 AMD GPU,则启用 AMD GPU 统计信息收集。"
|
||||
"description": "如果存在 AMD GPU,则开启 AMD GPU 统计信息收集。"
|
||||
},
|
||||
"intel_gpu_stats": {
|
||||
"label": "Intel GPU 统计",
|
||||
"description": "如果存在 Intel GPU,则启用 Intel GPU 统计信息收集。"
|
||||
"description": "如果存在 Intel GPU,则开启 Intel GPU 统计信息收集。"
|
||||
},
|
||||
"network_bandwidth": {
|
||||
"label": "网络带宽",
|
||||
"description": "为摄像头 ffmpeg 进程和检测器启用按进程网络带宽监控(需要权限)。"
|
||||
"description": "为摄像头 ffmpeg 进程和检测器开启按进程网络带宽监控(需要权限)。"
|
||||
},
|
||||
"intel_gpu_device": {
|
||||
"label": "Intel GPU 设备",
|
||||
@@ -528,7 +552,11 @@
|
||||
},
|
||||
"version_check": {
|
||||
"label": "版本检查",
|
||||
"description": "启用出站检查以检测是否有更新版本的 Frigate 可用。"
|
||||
"description": "开启出站检查以检测是否有更新版本的 Frigate 可用。"
|
||||
},
|
||||
"analytics": {
|
||||
"label": "分享匿名使用统计",
|
||||
"description": "每天发送一份匿名使用报告,帮助 Frigate 维护者决定要支持哪些功能。开启前不会发送任何内容。"
|
||||
}
|
||||
},
|
||||
"tls": {
|
||||
@@ -601,6 +629,30 @@
|
||||
"quality": {
|
||||
"label": "实时监控质量",
|
||||
"description": "jsmpeg 流的编码质量(1 最高,31 最低)。"
|
||||
},
|
||||
"transcode": {
|
||||
"label": "转码流",
|
||||
"description": "由 go2rtc 按需转码的低画质实时监控流。",
|
||||
"enabled": {
|
||||
"label": "开启转码流",
|
||||
"description": "添加低画质实时监控流,在有人观看实时监控时由 go2rtc 实时转码生成。"
|
||||
},
|
||||
"source": {
|
||||
"label": "源视频流",
|
||||
"description": "go2rtc 流转码。默认为第一个实时监控流。"
|
||||
},
|
||||
"qualities": {
|
||||
"label": "画质",
|
||||
"description": "每个画质都增加一个转码流。",
|
||||
"height": {
|
||||
"label": "高度",
|
||||
"description": "画面输出高度像素,宽度将遵循源宽高比自动计算。"
|
||||
},
|
||||
"bitrate": {
|
||||
"label": "码率",
|
||||
"description": "目标及最大视频码率(kbps)。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
@@ -608,7 +660,7 @@
|
||||
"description": "默认情况下,画面变动检测配置统一应用于各摄像头,除非对特定摄像头单独进行自定义。",
|
||||
"enabled": {
|
||||
"label": "开启画面变动检测",
|
||||
"description": "为所有摄像头启用或禁用画面变动检测。可以给指定摄像头单独覆盖此设置。"
|
||||
"description": "为所有摄像头开启或关闭画面变动检测。可以给指定摄像头单独覆盖此设置。"
|
||||
},
|
||||
"threshold": {
|
||||
"label": "画面变动阈值",
|
||||
@@ -632,11 +684,11 @@
|
||||
},
|
||||
"delta_alpha": {
|
||||
"label": "变化量权重",
|
||||
"description": "该值用于调节帧间差异计算时的混合比例,影响运动检测的灵敏度。"
|
||||
"description": "该值用于调节帧间差异计算时的混合比例,影响画面变动检测的灵敏度。"
|
||||
},
|
||||
"frame_alpha": {
|
||||
"label": "背景更新速度",
|
||||
"description": "该值在运动检测前对画面进行预处理,控制帧混合程度,影响后续检测的输入质量。"
|
||||
"description": "该值在画面变动检测前对画面进行预处理,控制帧混合程度,影响后续检测的输入质量。"
|
||||
},
|
||||
"frame_height": {
|
||||
"label": "画面高度",
|
||||
@@ -652,7 +704,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始画面变动状态",
|
||||
"description": "指示原始静态配置中是否启用了画面变动检测。"
|
||||
"description": "指示原始静态配置中是否开启了画面变动检测。"
|
||||
},
|
||||
"raw_mask": {
|
||||
"label": "原始遮罩"
|
||||
@@ -752,7 +804,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原配置生成式 AI 状态",
|
||||
"description": "表示在原始静态配置中是否已启用生成式 AI。"
|
||||
"description": "表示在原始静态配置中是否已开启生成式 AI。"
|
||||
}
|
||||
},
|
||||
"filters_attribute": {
|
||||
@@ -796,7 +848,7 @@
|
||||
"description": "应用于摄像头的录像和保留设置,除非按摄像头覆盖。",
|
||||
"enabled": {
|
||||
"label": "开启录像",
|
||||
"description": "为所有摄像头启用或禁用录像;可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭录像;可按摄像头覆盖。"
|
||||
},
|
||||
"expire_interval": {
|
||||
"label": "录像清理间隔",
|
||||
@@ -891,7 +943,55 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始录像状态",
|
||||
"description": "指示原始静态配置中是否启用了录像。"
|
||||
"description": "指示原始静态配置中是否开启了录像。"
|
||||
},
|
||||
"sub": {
|
||||
"label": "子流录制中",
|
||||
"description": "录制第二条低画质流的设置。",
|
||||
"enabled": {
|
||||
"label": "开启子流录制",
|
||||
"description": "开启第二路低画质视频流的录制,以支持自适应画质回放并延长录像保留时间。"
|
||||
},
|
||||
"continuous": {
|
||||
"label": "子视频流连续保留",
|
||||
"description": "保留子视频流录制的天数,无论是否有追踪目标或画面变动。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留录制的天数。"
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "子视频流画面变动保留",
|
||||
"description": "触发画面变动时保留子视频流录制的天数。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留录制的天数。"
|
||||
}
|
||||
},
|
||||
"alerts": {
|
||||
"label": "子视频流警报保留",
|
||||
"description": "警报类子视频流录制的保留设置。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "保留检测事件录制的天数。"
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:全部(保留所有片段)、画面变动(保留画面变动片段)或 活动目标(保留画面中出现活动目标的片段)。"
|
||||
}
|
||||
},
|
||||
"detections": {
|
||||
"label": "子视频流检测保留",
|
||||
"description": "子视频流中检测事件的录像保留设置。",
|
||||
"days": {
|
||||
"label": "保留天数",
|
||||
"description": "检测事件的录像保留天数。"
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:全部(保存所有片段)、画面变动(保存有画面变动的片段)或活动目标(保存有活动目标的片段)。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"review": {
|
||||
@@ -902,7 +1002,7 @@
|
||||
"description": "哪些追踪目标生成警报以及如何保留警报的设置。",
|
||||
"enabled": {
|
||||
"label": "开启警报",
|
||||
"description": "为所有摄像头启用或禁用警报生成;可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭警报生成;可按摄像头覆盖。"
|
||||
},
|
||||
"labels": {
|
||||
"label": "警报标签",
|
||||
@@ -914,7 +1014,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始警报状态",
|
||||
"description": "追踪原始静态配置中是否启用了警报。"
|
||||
"description": "追踪原始静态配置中是否开启了警报。"
|
||||
},
|
||||
"cutoff_time": {
|
||||
"label": "警报截止时间",
|
||||
@@ -926,7 +1026,7 @@
|
||||
"description": "用于设置哪些追踪目标会生成检测记录(非警报类),以及检测记录的保留方式。",
|
||||
"enabled": {
|
||||
"label": "开启检测",
|
||||
"description": "为所有摄像头启用或禁用检测事件;可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭检测事件;可按摄像头覆盖。"
|
||||
},
|
||||
"labels": {
|
||||
"label": "检测标签",
|
||||
@@ -942,7 +1042,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始检测状态",
|
||||
"description": "追踪原始静态配置中是否启用了检测。"
|
||||
"description": "追踪原始静态配置中是否开启了检测。"
|
||||
}
|
||||
},
|
||||
"genai": {
|
||||
@@ -962,7 +1062,7 @@
|
||||
},
|
||||
"image_source": {
|
||||
"label": "核查图像来源",
|
||||
"description": "发送给生成式 AI 的画面来源(“预览” 或 “录制”);“录制”将使用更高质量的画面帧,但会消耗更多的 token。"
|
||||
"description": "发送给生成式 AI 的画面来源(“预览”或“录制”);“录制”会使用更高画质的画面帧,但会消耗更多 token。"
|
||||
},
|
||||
"additional_concerns": {
|
||||
"label": "额外关注事项",
|
||||
@@ -974,7 +1074,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原配置生成式 AI 状态",
|
||||
"description": "记录在静态配置中最初是否已启用生成式 AI 核查功能。"
|
||||
"description": "记录在静态配置中最初是否已开启生成式 AI 核查功能。"
|
||||
},
|
||||
"preferred_language": {
|
||||
"label": "首选语言",
|
||||
@@ -983,6 +1083,14 @@
|
||||
"activity_context_prompt": {
|
||||
"label": "活动上下文提示",
|
||||
"description": "自定义提示词,用于说明可疑行为与非可疑行为的界定,为生成式 AI 生成摘要提供上下文依据。"
|
||||
},
|
||||
"frame_mode": {
|
||||
"label": "画面帧模式",
|
||||
"description": "向模型呈现画面帧的方式。“画面帧”会先发送提示词,再发送画面帧,适合能自行把握画面顺序的模型。“带标注的画面帧”会为每一帧添加标注,并穿插来自目标追踪的说明,适合容易跟丢重复或反向动作的模型。"
|
||||
},
|
||||
"response_style": {
|
||||
"label": "回复风格",
|
||||
"description": "生成核查描述时使用的写作风格预设。预设会调整面向用户的标题、摘要和场景描述的语气与详细程度;“默认”会保持内置提示词不变。"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -991,7 +1099,7 @@
|
||||
"description": "所有摄像头的追踪目标 API 快照设置;可摄像头单独配置覆盖全局配置。",
|
||||
"enabled": {
|
||||
"label": "开启快照",
|
||||
"description": "为所有摄像头启用或禁用保存快照;可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭保存快照;可按摄像头覆盖。"
|
||||
},
|
||||
"timestamp": {
|
||||
"label": "时间戳叠加",
|
||||
@@ -1074,7 +1182,7 @@
|
||||
"description": "鸟类分类模型特定的设置。",
|
||||
"enabled": {
|
||||
"label": "鸟类分类",
|
||||
"description": "启用或禁用鸟类分类。"
|
||||
"description": "开启或关闭鸟类分类。"
|
||||
},
|
||||
"threshold": {
|
||||
"label": "最小分数",
|
||||
@@ -1086,7 +1194,7 @@
|
||||
"description": "用于目标或状态检测的自定义分类模型配置。",
|
||||
"enabled": {
|
||||
"label": "开启模型",
|
||||
"description": "启用或禁用自定义分类模型。"
|
||||
"description": "开启或关闭自定义分类模型。"
|
||||
},
|
||||
"name": {
|
||||
"label": "模型名称",
|
||||
@@ -1121,7 +1229,7 @@
|
||||
},
|
||||
"motion": {
|
||||
"label": "画面变动时运行",
|
||||
"description": "启用后,当在指定裁剪区域内检测到画面变动时进行分类。"
|
||||
"description": "开启后,当在指定裁剪区域内检测到画面变动时进行分类。"
|
||||
},
|
||||
"interval": {
|
||||
"label": "分类间隔",
|
||||
@@ -1135,7 +1243,7 @@
|
||||
"description": "用于构建和查询目标嵌入以查找相似项的语义搜索设置。",
|
||||
"enabled": {
|
||||
"label": "开启语义搜索",
|
||||
"description": "启用或禁用语义搜索功能。"
|
||||
"description": "开启或关闭语义搜索功能。"
|
||||
},
|
||||
"reindex": {
|
||||
"label": "启动时重建索引",
|
||||
@@ -1162,7 +1270,7 @@
|
||||
},
|
||||
"enabled": {
|
||||
"label": "开启此触发器",
|
||||
"description": "启用或禁用此语义搜索触发器。"
|
||||
"description": "开启或关闭此语义搜索触发器。"
|
||||
},
|
||||
"type": {
|
||||
"label": "触发器类型",
|
||||
@@ -1187,7 +1295,7 @@
|
||||
"description": "车牌识别设置,包括检测阈值、格式化和已知车牌。",
|
||||
"enabled": {
|
||||
"label": "开启车牌识别",
|
||||
"description": "为所有摄像头启用或禁用车牌识别;可按摄像头覆盖。"
|
||||
"description": "为所有摄像头开启或关闭车牌识别;可按摄像头覆盖。"
|
||||
},
|
||||
"model_size": {
|
||||
"label": "模型大小",
|
||||
@@ -1219,7 +1327,7 @@
|
||||
},
|
||||
"known_plates": {
|
||||
"label": "已知车牌",
|
||||
"description": "要特别追踪或报警的车牌或正则表达式列表。"
|
||||
"description": "要特别追踪或发出警报的车牌或正则表达式列表。"
|
||||
},
|
||||
"enhancement": {
|
||||
"label": "增强级别",
|
||||
@@ -1269,7 +1377,7 @@
|
||||
"description": "MQTT 图像发布设置。",
|
||||
"enabled": {
|
||||
"label": "发送图像",
|
||||
"description": "为此摄像头启用将目标快照图像发布到 MQTT 主题。"
|
||||
"description": "为此摄像头开启将目标快照发布到 MQTT 主题。"
|
||||
},
|
||||
"timestamp": {
|
||||
"label": "添加时间戳",
|
||||
@@ -1332,15 +1440,15 @@
|
||||
"description": "ONVIF 身份验证的密码。"
|
||||
},
|
||||
"tls_insecure": {
|
||||
"label": "禁用 TLS 验证",
|
||||
"description": "跳过 TLS 验证并禁用 ONVIF 的摘要认证(不安全;仅用于安全网络)。"
|
||||
"label": "关闭 TLS 验证",
|
||||
"description": "跳过 TLS 验证并关闭 ONVIF 的摘要认证(不安全;仅用于安全网络)。"
|
||||
},
|
||||
"autotracking": {
|
||||
"label": "自动追踪",
|
||||
"description": "使用 PTZ 摄像头移动自动追踪移动目标并使其保持在画面中心。",
|
||||
"enabled": {
|
||||
"label": "开启自动追踪",
|
||||
"description": "启用或禁用检测目标的自动 PTZ 摄像头追踪。"
|
||||
"description": "开启或关闭检测目标的自动 PTZ 摄像头追踪。"
|
||||
},
|
||||
"calibrate_on_startup": {
|
||||
"label": "启动时校准",
|
||||
@@ -1376,7 +1484,7 @@
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始自动追踪状态",
|
||||
"description": "用于追踪配置中是否启用自动追踪的内部字段。"
|
||||
"description": "用于追踪配置中是否开启自动追踪的内部字段。"
|
||||
}
|
||||
},
|
||||
"ignore_time_mismatch": {
|
||||
@@ -1397,7 +1505,59 @@
|
||||
}
|
||||
},
|
||||
"active_profile": {
|
||||
"label": "激活配置模板",
|
||||
"description": "当前激活的配置模板名称。仅在运行时使用,不会写入 YAML 配置文件中。"
|
||||
"label": "当前配置模板",
|
||||
"description": "当前使用的配置模板名称。仅在运行时使用,不会写入 YAML 配置文件中。"
|
||||
},
|
||||
"models": {
|
||||
"label": "检测模型",
|
||||
"description": "目标检测模型以及每个模型运行的硬件。摄像头会将自己的 detect.scene 与模型的场景匹配来选择模型,匹配不到时使用“默认”模型。",
|
||||
"scene": {
|
||||
"label": "模型场景",
|
||||
"description": "此模型适用的摄像头环境名称,例如“热成像”。摄像头通过将 detect.scene 设为匹配的值来选择模型;未设置场景的摄像头会使用“默认”模型。"
|
||||
},
|
||||
"devices": {
|
||||
"label": "检测硬件",
|
||||
"description": "此模型运行的硬件,格式为 '<detector>' 或 '<detector>:<device>'(例如 'edgetpu:pci:0' 或 'openvino:GPU')。同一设备列出多次会在其上运行更多推理进程。"
|
||||
},
|
||||
"path": {
|
||||
"label": "自定义目标检测模型路径",
|
||||
"description": "自定义检测模型文件的路径(Frigate+ 模型则使用 plus://<model_id>)。"
|
||||
},
|
||||
"labelmap_path": {
|
||||
"label": "自定义目标检测器的标签映射",
|
||||
"description": "标签映射文件的路径,用于将检测器的数字类别映射为字符串标签。"
|
||||
},
|
||||
"width": {
|
||||
"label": "目标检测模型输入宽度",
|
||||
"description": "模型输入张量的宽度(像素)。"
|
||||
},
|
||||
"height": {
|
||||
"label": "目标检测模型输入高度",
|
||||
"description": "模型输入张量的高度(像素)。"
|
||||
},
|
||||
"labelmap": {
|
||||
"label": "标签映射自定义",
|
||||
"description": "要合并到标准标签映射中的覆盖或重映射条目。"
|
||||
},
|
||||
"attributes_map": {
|
||||
"label": "目标标签与属性标签的映射",
|
||||
"description": "目标标签到属性标签的映射,用于附加元数据(例如 'car' -> ['license_plate'])。"
|
||||
},
|
||||
"input_tensor": {
|
||||
"label": "模型输入张量格式",
|
||||
"description": "模型期望的张量格式:'nhwc' 或 'nchw'。"
|
||||
},
|
||||
"input_pixel_format": {
|
||||
"label": "模型输入像素格式",
|
||||
"description": "模型期望的像素色彩空间:'rgb'、'bgr' 或 'yuv'。"
|
||||
},
|
||||
"input_dtype": {
|
||||
"label": "模型输入数据类型",
|
||||
"description": "模型输入张量的数据类型(例如 'float32')。"
|
||||
},
|
||||
"model_type": {
|
||||
"label": "目标检测模型类型",
|
||||
"description": "检测器模型架构类型(ssd、yolox、yolonas、yolo-generic、rfdetr、dfine),部分检测器会用它进行优化。"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,5 +31,10 @@
|
||||
},
|
||||
"detect": {
|
||||
"dimensionMustBeEven": "必须是偶数。"
|
||||
},
|
||||
"models": {
|
||||
"defaultRequired": "必须有一个模型使用默认场景。否则,未选择场景的摄像头将没有可回退的模型。",
|
||||
"sceneDuplicate": "每个模型都必须使用不同的场景。",
|
||||
"sameModel": "{{scene}} 和 {{other}} 模型使用同一个模型文件。让一个模型在多个场景下运行,只会把检测任务拆到多个检测器上,比一个模型列出全部硬件更慢。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
"anchor": "来源",
|
||||
"similarity_score": "相似度",
|
||||
"no_similar_objects_found": "未找到相似目标。",
|
||||
"semantic_search_required": "必须启用语义搜索才能查找相似目标。",
|
||||
"semantic_search_required": "必须开启语义搜索才能查找相似目标。",
|
||||
"send": "发送",
|
||||
"suggested_requests": "尝试问问:",
|
||||
"starting_requests_prompts": {
|
||||
@@ -55,6 +55,12 @@
|
||||
"auto_scroll": {
|
||||
"title": "自动滚动",
|
||||
"desc": "自动滚动到最新消息。"
|
||||
},
|
||||
"always_allow": {
|
||||
"title": "始终允许的操作",
|
||||
"desc": "助手无需询问即可执行的操作。",
|
||||
"none": "无",
|
||||
"reset": "重置"
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
@@ -68,5 +74,15 @@
|
||||
},
|
||||
"thinking": {
|
||||
"toggle": "切换思考"
|
||||
},
|
||||
"approval": {
|
||||
"title": "允许 {{tool}} 吗?",
|
||||
"desc": "此操作会更改 Frigate 中的内容。请先查看详情,再决定是否允许。",
|
||||
"approve": "允许",
|
||||
"always_allow": "始终允许",
|
||||
"reject": "拒绝",
|
||||
"approved": "已允许",
|
||||
"rejected": "已拒绝",
|
||||
"placeholder": "允许或拒绝待处理的操作后才能继续"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,5 +91,6 @@
|
||||
"crop": "裁剪至筛选区域",
|
||||
"cropAria": "切换预览画面裁剪到筛选区域",
|
||||
"cropDesc": "只预览筛选区域,而不是显示整个画面。"
|
||||
}
|
||||
},
|
||||
"subOnlyQuality": "在此时间范围内,只有低画质录制可用"
|
||||
}
|
||||
|
||||
@@ -63,7 +63,8 @@
|
||||
"copying": "复制中",
|
||||
"encoding": "编码中",
|
||||
"encodingRetry": "重试编码中",
|
||||
"finalizing": "正在完成"
|
||||
"finalizing": "正在完成",
|
||||
"merging": "合并"
|
||||
},
|
||||
"caseView": {
|
||||
"noDescription": "没有描述",
|
||||
|
||||
@@ -5,8 +5,13 @@
|
||||
"documentTitle.withCamera": "{{camera}} - 实时监控 - Frigate",
|
||||
"lowBandwidthMode": "低带宽模式",
|
||||
"twoWayTalk": {
|
||||
"enable": "开启实时对话",
|
||||
"disable": "关闭实时通话"
|
||||
"enable": "开启双向对讲",
|
||||
"disable": "关闭双向对讲",
|
||||
"requiresWebRTC": "双向对讲需要 WebRTC,但当前不可用",
|
||||
"error": {
|
||||
"microphone": "双向对讲无法访问你的麦克风",
|
||||
"refused": "双向对讲启动失败。详情请查看浏览器控制台。"
|
||||
}
|
||||
},
|
||||
"cameraAudio": {
|
||||
"enable": "开启音频输出",
|
||||
@@ -17,7 +22,7 @@
|
||||
"clickMove": {
|
||||
"label": "点击画面以使摄像头居中",
|
||||
"enable": "开启点击移动",
|
||||
"disable": "禁用点击移动",
|
||||
"disable": "关闭点击移动",
|
||||
"enableWithZoom": "开启点击移动 / 拖动缩放功能"
|
||||
},
|
||||
"left": {
|
||||
@@ -82,7 +87,7 @@
|
||||
"disable": "关闭音频检测"
|
||||
},
|
||||
"autotracking": {
|
||||
"enable": "启用自动追踪",
|
||||
"enable": "开启自动追踪",
|
||||
"disable": "关闭自动追踪"
|
||||
},
|
||||
"streamStats": {
|
||||
@@ -94,17 +99,17 @@
|
||||
"tips": "根据此摄像头的录像存储设置,可以下载即时快照或手动触发事件记录。",
|
||||
"playInBackground": {
|
||||
"label": "后台播放",
|
||||
"desc": "启用此选项可在播放器隐藏时继续视频流播放。"
|
||||
"desc": "开启此选项可在播放器隐藏时继续视频流播放。"
|
||||
},
|
||||
"showStats": {
|
||||
"label": "显示统计信息",
|
||||
"desc": "启用此选项可在摄像头画面上叠加显示视频流统计信息。"
|
||||
"desc": "开启此选项可在摄像头画面上叠加显示视频流统计信息。"
|
||||
},
|
||||
"debugView": "调试视图",
|
||||
"start": "开始手动按需录制",
|
||||
"started": "已启用手动按需录制。",
|
||||
"started": "已开启手动按需录制。",
|
||||
"failedToStart": "启动手动录制失败。",
|
||||
"recordDisabledTips": "由于此摄像头的配置中禁用了录制或对其进行了限制,将只会保存快照。",
|
||||
"recordDisabledTips": "由于此摄像头的配置中关闭了录制或对其进行了限制,将只会保存快照。",
|
||||
"end": "停止手动按需录制",
|
||||
"ended": "已完成手动按需录制。",
|
||||
"failedToEnd": "停止手动录制失败。"
|
||||
@@ -125,20 +130,60 @@
|
||||
"unavailable": "此视频流不支持音频传输"
|
||||
},
|
||||
"twoWayTalk": {
|
||||
"tips": "您的设备必须支持此功能,并且必须配置 WebRTC 以支持双向对讲。",
|
||||
"tips": "你的设备必须支持此功能,并且必须配置 WebRTC 以支持双向对讲。",
|
||||
"available": "此视频流支持双向对讲",
|
||||
"unavailable": "此视频流不支持双向对讲"
|
||||
},
|
||||
"lowBandwidth": {
|
||||
"tips": "由于缓冲或视频流错误,实时视图处于低带宽模式。",
|
||||
"resetStream": "重置视频流"
|
||||
"tips": "由于缓冲或视频流错误,实时监控处于低带宽模式。",
|
||||
"resetStream": "重置视频流",
|
||||
"force": {
|
||||
"label": "强制使用低带宽模式",
|
||||
"desc": "始终播放 Frigate 内置的低带宽视频流,而不是选定的视频流。任何网络下都能用,但画质较低且没有声音。"
|
||||
}
|
||||
},
|
||||
"playInBackground": {
|
||||
"label": "后台播放",
|
||||
"tips": "启用此选项可在播放器隐藏时继续视频流播放。"
|
||||
"tips": "开启此选项可在播放器隐藏时继续视频流播放。"
|
||||
},
|
||||
"debug": {
|
||||
"picker": "调试模式下无法切换视频流。调试将始终使用检测(detect)功能的视频流。"
|
||||
"picker": "调试模式下无法切换视频流。调试将始终使用检测(detect)功能的视频流。",
|
||||
"technology": "调试模式下无法选择视频流传输技术。"
|
||||
},
|
||||
"auto": {
|
||||
"label": "自动",
|
||||
"tips": "根据网络状况自动切换视频流",
|
||||
"selected": "自动 · {{stream}}",
|
||||
"floorLabel": "低带宽",
|
||||
"retry": "尝试最高画质",
|
||||
"reason": {
|
||||
"bandwidth": "当前网络跟不上更高画质的视频流,正在播放 {{stream}}",
|
||||
"codec": "当前浏览器无法播放更高画质的视频流,正在播放 {{stream}}",
|
||||
"saveData": "因为开启了省流量模式,正在播放 {{stream}}",
|
||||
"floor": "所有视频流都跟不上,正在播放低带宽画面"
|
||||
}
|
||||
},
|
||||
"mode": "视频流传输技术",
|
||||
"technology": {
|
||||
"description": "选择你偏好的视频流传输技术。播放或网络出错时,Frigate 仍可能回退到低带宽模式。",
|
||||
"name": {
|
||||
"mse": "MSE",
|
||||
"webrtc": "WebRTC",
|
||||
"jsmpeg": "JSMpeg"
|
||||
},
|
||||
"tips": {
|
||||
"mse": "推荐的默认选项,兼容性好,播放流畅",
|
||||
"webrtc": "需要额外配置,而且并非所有设备都支持"
|
||||
},
|
||||
"unavailable": {
|
||||
"browser": "你的浏览器不支持 WebRTC。",
|
||||
"not-configured": "要开启此功能,请在 go2rtc → webrtc → candidates 中添加本服务器的 IP:8555。",
|
||||
"notConfiguredOptional": "可选:不配置也能正常查看实时监控。WebRTC 主要用于双向对讲。",
|
||||
"unreachable": "WebRTC 无法连接。请检查 8555 端口是否可访问,以及 STUN/TURN 服务器配置是否正确。",
|
||||
"video-codec": "此视频流的视频编码格式在当前浏览器中不受 WebRTC 支持。",
|
||||
"audio-codec": "此视频流的音频编码格式不受 WebRTC 支持。请使用 go2rtc 转码为 opus 或 G.711。",
|
||||
"checking": "正在检查 WebRTC 是否可用…"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cameraSettings": {
|
||||
@@ -169,7 +214,7 @@
|
||||
"exitEdit": "退出编辑"
|
||||
},
|
||||
"transcription": {
|
||||
"enable": "启用实时音频转录",
|
||||
"enable": "开启实时音频转录",
|
||||
"disable": "关闭实时音频转录"
|
||||
},
|
||||
"noCameras": {
|
||||
|
||||
@@ -55,7 +55,9 @@
|
||||
"invalidTimeRange": "结束时间必须在开始时间之后",
|
||||
"searchFailed": "搜索失败:{{message}}",
|
||||
"polygonTooSmall": "多边形至少需要 3 个顶点",
|
||||
"unknown": "未知错误"
|
||||
"unknown": "未知错误",
|
||||
"alreadyRunning": "你已有一个画面变动搜索正在进行中,请等待其完成或取消它。",
|
||||
"tooManySearches": "正在进行的画面变动搜索较多,请等待其中一个完成后再试。"
|
||||
},
|
||||
"changePercentage": "{{percentage}}% 已变化",
|
||||
"metrics": {
|
||||
|
||||
@@ -106,11 +106,11 @@
|
||||
"title": "实时监控面板",
|
||||
"automaticLiveView": {
|
||||
"label": "自动实时预览",
|
||||
"desc": "检测到画面活动时将自动切换至该摄像头实时画面。禁用此选项会导致实时监控页面的摄像头图像每分钟只更新一次。"
|
||||
"desc": "检测到画面活动时将自动切换至该摄像头实时画面。关闭此选项会导致实时监控页面的摄像头图像每分钟只更新一次。"
|
||||
},
|
||||
"playAlertVideos": {
|
||||
"label": "播放警报视频",
|
||||
"desc": "默认情况下,实时监控页面上的最新警报会以一小段循环视频的形式进行播放。禁用此选项将仅显示浏览器本地缓存的静态图片。"
|
||||
"desc": "默认情况下,实时监控页面上的最新警报会以一小段循环视频的形式进行播放。关闭此选项将仅显示浏览器本地缓存的静态图片。"
|
||||
},
|
||||
"displayCameraNames": {
|
||||
"label": "始终显示摄像头名称",
|
||||
@@ -119,17 +119,24 @@
|
||||
"liveFallbackTimeout": {
|
||||
"label": "实时监控播放器回退超时",
|
||||
"desc": "当摄像头的高清实时监控流不可用时,将在此时间后回退到低带宽模式。默认值:3秒。"
|
||||
},
|
||||
"naturalAspectLayout": {
|
||||
"label": "使用原始画面比例",
|
||||
"desc": "在摄像头组实时监控面板中,按每个摄像头自身的原始画面比例调整卡片大小。关闭后,摄像头会统一使用标准的宽屏、横屏或竖屏卡片形状。",
|
||||
"descNote": "开启或关闭此设置会清除所有摄像头组实时监控面板中保存的布局,之后需要重新手动调整。"
|
||||
}
|
||||
},
|
||||
"storedLayouts": {
|
||||
"title": "存储监控面板布局",
|
||||
"desc": "可以在监控面板调整或拖动摄像头的布局。这些设置将保存在浏览器的本地存储中。",
|
||||
"clearAll": "清除所有布局"
|
||||
"clearAll": "清除所有布局",
|
||||
"clearConfirm": "这会清除当前浏览器中所有摄像头组保存的布局。此操作无法撤销。"
|
||||
},
|
||||
"cameraGroupStreaming": {
|
||||
"title": "摄像头组视频流设置",
|
||||
"desc": "每个摄像头组的视频流设置将保存在浏览器的本地存储中。",
|
||||
"clearAll": "清除所有视频流设置"
|
||||
"clearAll": "清除所有视频流设置",
|
||||
"clearConfirm": "这会清除当前浏览器中所有摄像头组的视频流设置。此操作无法撤销。"
|
||||
},
|
||||
"recordingsViewer": {
|
||||
"title": "回放查看",
|
||||
@@ -150,11 +157,43 @@
|
||||
"toast": {
|
||||
"success": {
|
||||
"clearStoredLayout": "已清除 {{cameraName}} 的存储布局",
|
||||
"clearStreamingSettings": "已清除所有摄像头组的视频流设置。"
|
||||
"clearStreamingSettings": "已清除所有摄像头组的视频流设置。",
|
||||
"exportUiSettings": "设置已导出",
|
||||
"importUiSettings": "设置已导入"
|
||||
},
|
||||
"error": {
|
||||
"clearStoredLayoutFailed": "清除存储布局失败:{{errorMessage}}",
|
||||
"clearStreamingSettingsFailed": "清除视频流设置失败:{{errorMessage}}"
|
||||
"clearStreamingSettingsFailed": "清除视频流设置失败:{{errorMessage}}",
|
||||
"exportUiSettingsFailed": "导出设置失败",
|
||||
"importNothingToApply": "导入设置失败:文件中没有可应用的设置",
|
||||
"importInvalidJson": "导入设置失败:文件不是有效的 JSON",
|
||||
"importWrongType": "导入设置失败:文件不是 Frigate 导出的设置",
|
||||
"importUnsupportedVersion": "导入设置失败:此文件需要更新版本的 Frigate",
|
||||
"importInvalidSchema": "导入设置失败:文件格式不正确",
|
||||
"importUiSettingsFailed": "导入设置失败"
|
||||
}
|
||||
},
|
||||
"backupRestore": {
|
||||
"title": "备份与恢复",
|
||||
"transfer": {
|
||||
"label": "设备设置文件",
|
||||
"desc": "摄像头组布局、视频流设置和界面偏好设置保存在浏览器中。将它们导出为文件,即可备份或迁移到其他设备。",
|
||||
"export": "导出设置",
|
||||
"import": "导入设置"
|
||||
},
|
||||
"importDialog": {
|
||||
"title": "导入设置",
|
||||
"desc": "选择要从此文件应用的内容。导入完成后,Frigate 会重新加载。",
|
||||
"exportedFrom": "由 Frigate 配置版本 {{version}} 于 {{date}} 导出",
|
||||
"layouts_other": "摄像头组布局({{count}} 个组)",
|
||||
"layoutsPhone": "手机上不会导入摄像头组布局,手机始终使用标准网格。",
|
||||
"layoutsModeOn": "这些布局按摄像头画面比例设置卡片尺寸,因此导入后也会开启“使用原始画面比例”。",
|
||||
"layoutsModeOff": "这些布局使用标准卡片尺寸,因此导入后也会关闭“使用原始画面比例”。",
|
||||
"streaming_other": "视频流设置({{count}} 个摄像头)",
|
||||
"preferences_other": "界面偏好设置({{count}} 项)",
|
||||
"unknownGroups_other": "摄像头组 {{groups}} 不在当前服务器上,其设置会保存但不会使用。",
|
||||
"unknownCameras_other": "摄像头 {{cameras}} 不在当前服务器上,其视频流设置将被忽略。",
|
||||
"confirm": "导入"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -203,8 +242,8 @@
|
||||
"label": "清除所有点"
|
||||
},
|
||||
"snapPoints": {
|
||||
"true": "启用点对齐",
|
||||
"false": "禁用点对齐"
|
||||
"true": "开启点对齐",
|
||||
"false": "关闭点对齐"
|
||||
},
|
||||
"delete": {
|
||||
"title": "确认删除",
|
||||
@@ -272,7 +311,7 @@
|
||||
"allObjects": "所有目标/物体",
|
||||
"speedEstimation": {
|
||||
"title": "速度估算",
|
||||
"desc": "启用此区域内物体的速度估算。该区域必须恰好包含 4 个点。",
|
||||
"desc": "开启此区域内物体的速度估算。该区域必须恰好包含 4 个点。",
|
||||
"lineBDistance": "B线距离({{unit}})",
|
||||
"lineCDistance": "C线距离({{unit}})",
|
||||
"lineDDistance": "D线距离({{unit}})",
|
||||
@@ -283,7 +322,7 @@
|
||||
"desc": "指定物体在此区域内被视为有效的最低速度。",
|
||||
"toast": {
|
||||
"error": {
|
||||
"pointLengthError": "此区域的速度估算已禁用。启用速度估算的区域必须恰好包含 4 个点。",
|
||||
"pointLengthError": "此区域的速度估算已关闭。开启速度估算的区域必须恰好包含 4 个点。",
|
||||
"loiteringTimeError": "徘徊时间大于 0 的区域不应与速度估算一起使用。"
|
||||
}
|
||||
}
|
||||
@@ -293,7 +332,7 @@
|
||||
},
|
||||
"enabled": {
|
||||
"title": "开启",
|
||||
"description": "指示该区域在配置文件中是否处于激活并启用的状态。若被停用,则无法通过 MQTT 启用。禁用的区域在运行时会被忽略。"
|
||||
"description": "指示该区域在配置文件中是否处于激活并开启的状态。若被关闭,则无法通过 MQTT 开启。已关闭的区域在运行时会被忽略。"
|
||||
}
|
||||
},
|
||||
"motionMasks": {
|
||||
@@ -359,11 +398,11 @@
|
||||
"restart_required": "需要重启(遮罩与区域已修改)",
|
||||
"motionMaskLabel": "画面变动遮罩 {{number}}",
|
||||
"objectMaskLabel": "目标/物体遮罩 {{number}}",
|
||||
"disabledInConfig": "该项目已在配置文件中被禁用",
|
||||
"disabledInConfig": "该项目已在配置文件中关闭",
|
||||
"masks": {
|
||||
"enabled": {
|
||||
"title": "开启",
|
||||
"description": "指示该遮罩在配置文件中是否处于激活并启用的状态。若被禁用,则无法通过 MQTT 启用。禁用的遮罩在运行时会被忽略。"
|
||||
"description": "指示该遮罩在配置文件中是否处于激活并开启的状态。若被关闭,则无法通过 MQTT 开启。已关闭的遮罩在运行时会被忽略。"
|
||||
}
|
||||
},
|
||||
"profileBase": "(基础)",
|
||||
@@ -386,7 +425,7 @@
|
||||
},
|
||||
"improveContrast": {
|
||||
"title": "提高对比度",
|
||||
"desc": "提高较暗场景的对比度。<em>默认值:启用</em>"
|
||||
"desc": "提高较暗场景的对比度。<em>默认值:开启</em>"
|
||||
},
|
||||
"toast": {
|
||||
"success": "画面变动设置已保存。"
|
||||
@@ -405,7 +444,7 @@
|
||||
"desc": "将在被追踪的目标周围显示边界框",
|
||||
"colors": {
|
||||
"label": "目标边界框颜色定义",
|
||||
"info": "<li>启用后,将会为每个目标的标签分配不同的颜色</li><li>深蓝色细线代表该目标或物体在当前时间点未被检测到</li><li>灰色细线代表检测到的目标或物体静止不动</li><li>粗线表示在启动自动追踪时,该目标为自动追踪的主体</li>"
|
||||
"info": "<li>开启后,将会为每个目标的标签分配不同的颜色</li><li>深蓝色细线代表该目标或物体在当前时间点未被检测到</li><li>灰色细线代表检测到的目标或物体静止不动</li><li>粗线表示在启动自动追踪时,该目标为自动追踪的主体</li>"
|
||||
}
|
||||
},
|
||||
"timestamp": {
|
||||
@@ -433,7 +472,7 @@
|
||||
"objectShapeFilterDrawing": {
|
||||
"title": "允许绘制“目标形状过滤器”",
|
||||
"desc": "在图像上绘制矩形,以查看区域和比例详细信息",
|
||||
"tips": "启用此选项,能够在摄像头画面上绘制矩形,将显示其区域和比例。你可以通过使用这些值在配置中设置目标形状过滤器的参数。",
|
||||
"tips": "开启此选项,能够在摄像头画面上绘制矩形,将显示其区域和比例。你可以通过使用这些值在配置中设置目标形状过滤器的参数。",
|
||||
"score": "分数",
|
||||
"ratio": "比例",
|
||||
"area": "区域"
|
||||
@@ -456,7 +495,8 @@
|
||||
"title": "用户",
|
||||
"management": {
|
||||
"title": "用户管理",
|
||||
"desc": "管理此 Frigate 实例的用户账户。"
|
||||
"desc": "管理此 Frigate 实例的用户账户。",
|
||||
"authDisabled": "内置身份验证已关闭。这些账户只在开启身份验证后用于登录。"
|
||||
},
|
||||
"addUser": "添加用户",
|
||||
"updatePassword": "修改密码",
|
||||
@@ -524,7 +564,8 @@
|
||||
"title": "创建新用户",
|
||||
"desc": "创建一个新用户账户,并指定一个权限组以控制访问 Frigate 页面的权限。",
|
||||
"usernameOnlyInclude": "用户名只能包含字母、数字和 _",
|
||||
"confirmPassword": "请确认你的密码"
|
||||
"confirmPassword": "请确认你的密码",
|
||||
"usernameOnlyDots": "用户名不能只由句点组成"
|
||||
},
|
||||
"deleteUser": {
|
||||
"title": "删除该用户",
|
||||
@@ -562,7 +603,7 @@
|
||||
"title": "通知",
|
||||
"notificationSettings": {
|
||||
"title": "通知设置",
|
||||
"desc": "Frigate 在浏览器中运行或作为 PWA 安装时,可以原生向您的设备发送推送通知。"
|
||||
"desc": "Frigate 在浏览器中运行或作为 PWA 安装时,可以原生向你的设备发送推送通知。"
|
||||
},
|
||||
"globalSettings": {
|
||||
"title": "全局设置",
|
||||
@@ -580,13 +621,13 @@
|
||||
"cameras": {
|
||||
"title": "摄像头",
|
||||
"noCameras": "没有可用的摄像头",
|
||||
"desc": "选择要启用通知的摄像头。"
|
||||
"desc": "选择要开启通知的摄像头。"
|
||||
},
|
||||
"deviceSpecific": "设备专用设置",
|
||||
"registerDevice": "注册该设备",
|
||||
"unregisterDevice": "取消注册该设备",
|
||||
"sendTestNotification": "发送测试通知",
|
||||
"active": "通知已启用",
|
||||
"active": "通知已开启",
|
||||
"suspended": "通知已暂停 {{time}}",
|
||||
"suspendTime": {
|
||||
"5minutes": "暂停 5 分钟",
|
||||
@@ -596,7 +637,8 @@
|
||||
"12hours": "暂停 12 小时",
|
||||
"24hours": "暂停 24 小时",
|
||||
"untilRestart": "暂停直到重启",
|
||||
"suspend": "暂停"
|
||||
"suspend": "暂停",
|
||||
"custom": "暂停至…"
|
||||
},
|
||||
"cancelSuspension": "取消暂停",
|
||||
"toast": {
|
||||
@@ -609,16 +651,27 @@
|
||||
}
|
||||
},
|
||||
"unsavedRegistrations": "未保存通知注册",
|
||||
"unsavedChanges": "未保存通知设置更改"
|
||||
"unsavedChanges": "未保存通知设置更改",
|
||||
"customSuspension": {
|
||||
"title": "自定义暂停时间",
|
||||
"description": "暂停此摄像头的通知,直到所选时间。",
|
||||
"untilLabel": "暂停至",
|
||||
"invalidTime": "请选择未来的时间。"
|
||||
}
|
||||
},
|
||||
"frigatePlus": {
|
||||
"title": "Frigate+ 设置",
|
||||
"apiKey": {
|
||||
"title": "Frigate+ API 密钥",
|
||||
"validated": "Frigate+ API 密钥已检测并验证通过",
|
||||
"notValidated": "未检测到 Frigate+ API 密钥或验证未通过",
|
||||
"desc": "Frigate+ API 密钥用于启用与 Frigate+ 服务的集成。",
|
||||
"plusLink": "了解更多关于 Frigate+"
|
||||
"desc": "Frigate+ API 密钥用于连接 Frigate+ 服务。",
|
||||
"plusLink": "了解更多关于 Frigate+",
|
||||
"formatValid": "已检测到 Frigate+ API 密钥,且格式符合要求",
|
||||
"formatInvalid": "未检测到 Frigate+ API 密钥,或格式不符合要求",
|
||||
"validate": "向 Frigate+ 验证",
|
||||
"validating": "验证中…",
|
||||
"serverValid": "Frigate+ 已接受此 API 密钥",
|
||||
"serverInvalid": "Frigate+ 拒绝了这个 API 密钥",
|
||||
"serverUnreachable": "无法连接 Frigate+ 来验证此 API 密钥"
|
||||
},
|
||||
"snapshotConfig": {
|
||||
"title": "快照配置",
|
||||
@@ -640,7 +693,7 @@
|
||||
"error": "加载模型信息失败",
|
||||
"availableModels": "可用 Frigate+ 模型",
|
||||
"loadingAvailableModels": "正在加载可用模型…",
|
||||
"modelSelect": "您可以在Frigate+上选择可用的模型。请注意,只能选择与当前检测器配置兼容的模型。",
|
||||
"modelSelect": "你可以在Frigate+上选择可用的模型。请注意,只能选择与当前检测器配置兼容的模型。",
|
||||
"plusModelType": {
|
||||
"baseModel": "基础模型",
|
||||
"userModel": "定向调优"
|
||||
@@ -652,7 +705,8 @@
|
||||
"ariaLabel": "按类型筛选模型",
|
||||
"baseModels": "基础模型",
|
||||
"fineTunedModels": "微调过的模型"
|
||||
}
|
||||
},
|
||||
"showIncompatible": "显示不兼容的模型"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Frigate+ 设置已保存。请重启 Frigate 以应用更改。",
|
||||
@@ -680,7 +734,7 @@
|
||||
"desc": "重建索引将为所有追踪的目标重新生成特征向量信息。该过程将在后台进行,期间可能会使 CPU 满载,所需时间取决于追踪目标的数量。",
|
||||
"label": "立即重建索引",
|
||||
"confirmTitle": "确认重建索引",
|
||||
"confirmDesc": "确定要为所有追踪目标重建特征向量索引信息吗?此过程将在后台进行,但可能会导致CPU满载并耗费较长时间。您可以在 浏览 页面查看进度。",
|
||||
"confirmDesc": "确定要为所有追踪目标重建特征向量索引信息吗?此过程将在后台进行,但可能会导致CPU满载并耗费较长时间。你可以在 浏览 页面查看进度。",
|
||||
"confirmButton": "重建索引",
|
||||
"success": "重建索引已成功启动。",
|
||||
"alreadyInProgress": "重建索引已在执行中。",
|
||||
@@ -699,7 +753,7 @@
|
||||
}
|
||||
},
|
||||
"title": "语义搜索",
|
||||
"desc": "Frigate 中的语义搜索功能将能够让你通过图片、用户自定义的文本描述,或自动生成的文本描述等方式在核查项目中查找目标/物体。"
|
||||
"desc": "Frigate 中的语义搜索功能将能够让你通过图片、用户自定义的文本描述,或自动生成的文本描述等方式在核查项中查找目标/物体。"
|
||||
},
|
||||
"licensePlateRecognition": {
|
||||
"desc": "Frigate 可以识别车辆的车牌,并自动将检测到的字符添加到 识别的车牌(recognized_license_plate)字段中,或将已知车牌对应的名称作为子标签添加到该车辆目标中。该功能常用于识别驶入车道的车辆车牌或经过街道的车辆车牌。",
|
||||
@@ -828,7 +882,7 @@
|
||||
}
|
||||
},
|
||||
"semanticSearch": {
|
||||
"desc": "必须启用语义搜索功能才能使用触发器。"
|
||||
"desc": "必须开启语义搜索功能才能使用触发器。"
|
||||
},
|
||||
"wizard": {
|
||||
"title": "创建触发器",
|
||||
@@ -860,7 +914,8 @@
|
||||
"actions": "操作",
|
||||
"noRoles": "没有找到自定义权限组。",
|
||||
"editCameras": "编辑摄像头",
|
||||
"deleteRole": "删除权限组"
|
||||
"deleteRole": "删除权限组",
|
||||
"cameraCount_other": "{{count}} 个摄像头"
|
||||
},
|
||||
"toast": {
|
||||
"success": {
|
||||
@@ -954,7 +1009,8 @@
|
||||
"nameLength": "摄像头名称要少于64个字符",
|
||||
"invalidCharacters": "摄像头名称内有不允许使用的字符",
|
||||
"nameExists": "该摄像头名称已存在",
|
||||
"customUrlRtspRequired": "自定义 URL 必须以“rtsp://”或“rtsps://”开头;对于非 RTSP 协议的摄像头流,需手动添加至配置文件。"
|
||||
"customUrlRtspRequired": "自定义 URL 必须以“rtsp://”或“rtsps://”开头;对于非 RTSP 协议的摄像头流,需手动添加至配置文件。",
|
||||
"onvifPortInvalid": "ONVIF 端口必须是 1 到 65535 之间的整数"
|
||||
},
|
||||
"connectionSettings": "连接设置",
|
||||
"detectionMethod": "视频流检测方法",
|
||||
@@ -964,12 +1020,12 @@
|
||||
"detectionMethodDescription": "如果摄像头支持 ONVIF 协议,将使用该协议探测摄像头,以自动获取摄像头视频流地址;若不支持,也可手动选择摄像头品牌来使用预设地址。如需输入自定义RTSP地址,请选择“手动选择”并选择“其他”选项。",
|
||||
"onvifPortDescription": "对于支持ONVIF协议的摄像头,该端口通常为80或8080。",
|
||||
"useDigestAuth": "使用摘要认证",
|
||||
"useDigestAuthDescription": "为 ONVIF 协议启用 HTTP 摘要认证。部分摄像头可能需要专用的 ONVIF 用户名/密码,而非默认的 admin 账户。"
|
||||
"useDigestAuthDescription": "为 ONVIF 协议开启 HTTP 摘要认证。部分摄像头可能需要专用的 ONVIF 用户名/密码,而非默认的 admin 账户。"
|
||||
},
|
||||
"step2": {
|
||||
"description": "将根据你选择的检测方式,将会自动查找摄像头可用流配置,或进行手动配置。",
|
||||
"testSuccess": "视频流测试成功!",
|
||||
"testFailed": "连接测试失败,请检查您的输入后重试。",
|
||||
"testFailed": "连接测试失败,请检查你的输入后重试。",
|
||||
"testFailedTitle": "测试失败",
|
||||
"connected": "已连接",
|
||||
"notConnected": "未连接",
|
||||
@@ -989,7 +1045,7 @@
|
||||
"manufacturer": "制造商",
|
||||
"model": "型号",
|
||||
"firmware": "固件",
|
||||
"profiles": "配置文件",
|
||||
"profiles": "配置模板",
|
||||
"ptzSupport": "支持 PTZ",
|
||||
"autotrackingSupport": "支持自动追踪",
|
||||
"presets": "预设配置",
|
||||
@@ -1041,11 +1097,26 @@
|
||||
"title": "视频流功能",
|
||||
"detect": "用于目标检测的主码流。",
|
||||
"record": "根据配置设置保存视频流片段。",
|
||||
"audio": "用于音频检测的音视频流。"
|
||||
"audio": "用于音频检测的音视频流。",
|
||||
"record_sub": "用于自适应播放和延长保留时间的低画质录像(通常是摄像头的子视频流)。"
|
||||
},
|
||||
"featuresPopover": {
|
||||
"title": "视频流功能特性",
|
||||
"description": "使用 go2rtc 中继转流功能,减少与摄像头的网络连接数,提升效率。"
|
||||
},
|
||||
"appleCompatibility": {
|
||||
"title": "改善 Apple 设备上的播放效果",
|
||||
"description": "如果你会在 Safari 或 iPhone、iPad、Mac 上查看录像,请开启此选项。"
|
||||
},
|
||||
"ptz": {
|
||||
"title": "开启 PTZ 控制",
|
||||
"detectedNote": "已通过 ONVIF 检测到 PTZ 支持。如果这是一台 PTZ 摄像头,开启此选项后即可在页面上控制摄像头的平移、俯仰和变焦。",
|
||||
"connectionDetails": "ONVIF 连接信息",
|
||||
"host": "ONVIF 主机",
|
||||
"port": "ONVIF 端口",
|
||||
"username": "ONVIF 用户名",
|
||||
"password": "ONVIF 密码",
|
||||
"hostRequiredWarning": "开启 PTZ 控制后,必须填写 ONVIF 主机和端口。"
|
||||
}
|
||||
},
|
||||
"step4": {
|
||||
@@ -1067,13 +1138,13 @@
|
||||
"estimatedBandwidth": "预估带宽",
|
||||
"roles": "功能",
|
||||
"ffmpegModule": "使用视频流兼容模式",
|
||||
"ffmpegModuleDescription": "若多次尝试后仍无法加载视频流,可尝试启用此功能。启用后,Frigate 将通过 go2rtc 调用 ffmpeg 模块。这可能会提升与部分摄像头视频流的兼容性。",
|
||||
"ffmpegModuleDescription": "若多次尝试后仍无法加载视频流,可尝试开启此功能。开启后,Frigate 将通过 go2rtc 调用 ffmpeg 模块。这可能会提升与部分摄像头视频流的兼容性。",
|
||||
"none": "无",
|
||||
"error": "错误",
|
||||
"streamValidated": "视频流 {{number}} 验证成功",
|
||||
"streamValidationFailed": "视频流 {{number}} 验证失败",
|
||||
"saveAndApply": "保存新摄像头",
|
||||
"saveError": "配置无效,请检查您的设置。",
|
||||
"saveError": "配置无效,请检查你的设置。",
|
||||
"issues": {
|
||||
"title": "视频流验证",
|
||||
"videoCodecGood": "视频编解码器为 {{codec}}。",
|
||||
@@ -1085,14 +1156,14 @@
|
||||
"audioCodecRequired": "要实现音频检测功能,必须要有音频流。",
|
||||
"restreamingWarning": "为录制流开启“减少与摄像头的连接数”可能会略微增加 CPU 使用率。",
|
||||
"brands": {
|
||||
"reolink-rtsp": "不建议使用 Reolink 的 RTSP 协议。请在摄像头后台设置中启用 HTTP协议,并重新启动向导。",
|
||||
"reolink-http": "Reolink HTTP 视频流应该使用 FFmpeg 以获得更好的兼容性,为此视频流启用“使用流兼容模式”。"
|
||||
"reolink-rtsp": "不建议使用 Reolink 的 RTSP 协议。请在摄像头后台设置中开启 HTTP协议,并重新启动向导。",
|
||||
"reolink-http": "Reolink HTTP 视频流应该使用 FFmpeg 以获得更好的兼容性,为此视频流开启“使用流兼容模式”。"
|
||||
},
|
||||
"dahua": {
|
||||
"substreamWarning": "子码流1当前被锁定为低分辨率。多数大华、安讯士、EmpireTech品牌的摄像头都支持额外的子码流,这些子码流需要在摄像头设置中手动启用。如果你的设备支持,建议你检查并使用这些高分辨率子码流。"
|
||||
"substreamWarning": "子码流1当前被锁定为低分辨率。多数大华、安讯士、EmpireTech品牌的摄像头都支持额外的子码流,这些子码流需要在摄像头设置中手动开启。如果你的设备支持,建议你检查并使用这些高分辨率子码流。"
|
||||
},
|
||||
"hikvision": {
|
||||
"substreamWarning": "子码流1当前被锁定为低分辨率。多数海康威视的摄像头都支持额外的子码流,这些子码流需要在摄像头设置中手动启用。如果你的设备支持,建议你检查并使用这些高分辨率子码流。"
|
||||
"substreamWarning": "子码流1当前被锁定为低分辨率。多数海康威视的摄像头都支持额外的子码流,这些子码流需要在摄像头设置中手动开启。如果你的设备支持,建议你检查并使用这些高分辨率子码流。"
|
||||
},
|
||||
"resolutionUnknown": "无法检测此视频流的分辨率。你需要在设置或配置文件中手动指定检测分辨率。"
|
||||
}
|
||||
@@ -1106,7 +1177,7 @@
|
||||
"backToSettings": "返回摄像头设置",
|
||||
"streams": {
|
||||
"title": "摄像头状态和详细信息",
|
||||
"enableSuccess": "已启用 {{cameraName}}。请重启 Frigate 以应用。",
|
||||
"enableSuccess": "已开启 {{cameraName}}。请重启 Frigate 以应用。",
|
||||
"reorderHandle": "拖动以重新排序",
|
||||
"saving": "保存中…",
|
||||
"saved": "已保存",
|
||||
@@ -1117,7 +1188,7 @@
|
||||
"friendlyNameLabel": "显示名称",
|
||||
"friendlyNameHelp": "在 Frigate 页面中显示此摄像头的友好名称。留空以使用摄像头 ID。",
|
||||
"webuiUrlLabel": "摄像头管理后台 URL",
|
||||
"webuiUrlHelp": "从调试页面中直接访问摄像头管理网页界面。留空以禁用链接。",
|
||||
"webuiUrlHelp": "从调试页面中直接访问摄像头管理网页界面。留空则不显示链接。",
|
||||
"webuiUrlInvalid": "必须是有效的 URL(例如:https://example.com)。",
|
||||
"dashboardLabel": "在实时监控面板上显示",
|
||||
"dashboardHelp": "在实时监控面板显示该摄像头,在分组等其他位置仍可见。",
|
||||
@@ -1125,8 +1196,8 @@
|
||||
"reviewHelp": "在核查页面展示该摄像头,包括在筛选列表、画面变动核查以及历史视图。"
|
||||
},
|
||||
"label": "摄像头状态",
|
||||
"description": "设置各摄像头运行状态<br /><br /><strong>开启</strong>:正常处理视频流<br /><strong>关闭</strong>:临时暂停处理,重启后状态不保留<br /><strong>停用</strong>:停止处理并保存配置,重新启用需重启程序<br /><br /><em>备注:停用操作不会影响 go2rtc 转流功能</em><br /><br />拖动控件调整摄像头界面显示顺序,排序效果同步应用于实时面板及摄像头选择下拉栏。",
|
||||
"disabledSubheading": "配置中禁用",
|
||||
"description": "设置各摄像头运行状态<br /><br /><strong>开启</strong>:正常处理视频流<br /><strong>关闭</strong>:临时暂停处理,重启后状态不保留<br /><strong>停用</strong>:停止处理并保存配置,重新开启需重启程序<br /><br /><em>备注:停用操作不会影响 go2rtc 转流功能</em><br /><br />拖动控件调整摄像头界面显示顺序,排序效果同步应用于实时面板及摄像头选择下拉栏。",
|
||||
"disabledSubheading": "配置中已关闭",
|
||||
"status": {
|
||||
"on": "开",
|
||||
"off": "关",
|
||||
@@ -1166,7 +1237,7 @@
|
||||
"deleteCamera": "删除摄像头",
|
||||
"deleteCameraDialog": {
|
||||
"title": "删除摄像头",
|
||||
"description": "删除摄像头将永久移除该摄像头的所有录像、跟踪目标以及配置。任何与该摄像头关联的 go2rtc 流可能仍需手动删除。",
|
||||
"description": "删除摄像头将永久移除该摄像头的所有录像、追踪目标以及配置。任何与该摄像头关联的 go2rtc 流可能仍需手动删除。",
|
||||
"selectPlaceholder": "选择摄像头…",
|
||||
"confirmTitle": "你确定吗?",
|
||||
"confirmWarning": "删除 <strong>{{cameraName}}</strong> 后将无法撤销。",
|
||||
@@ -1178,7 +1249,7 @@
|
||||
"profiles": {
|
||||
"title": "配置模板的摄像头覆盖项",
|
||||
"selectLabel": "选择配置模板",
|
||||
"description": "配置启用配置文件时开启或关闭的摄像头。设置为“继承”的摄像头会沿用它原本的默认状态。",
|
||||
"description": "设置切换配置模板时开启或关闭的摄像头。设置为“继承”的摄像头会保持原本的默认状态。",
|
||||
"inherit": "继承",
|
||||
"on": "开",
|
||||
"off": "关"
|
||||
@@ -1191,7 +1262,7 @@
|
||||
"dedicatedLpr": "车牌识别专用",
|
||||
"saveSuccess": "已更新 {{cameraName}} 的摄像头类型,请重启 Frigate 以使更改生效。"
|
||||
},
|
||||
"description": "添加、编辑和删除摄像头,控制每个摄像头的状态,并配置每个配置文件和摄像头类型的覆盖设置。要配置视频流、检测、画面变动和其他特定于摄像头的设置,请在“摄像头配置”下选择相关功能。",
|
||||
"description": "添加、编辑和删除摄像头,控制每个摄像头的状态,并配置每个配置模板和摄像头类型的覆盖设置。要配置视频流、检测、画面变动和其他特定于摄像头的设置,请在“摄像头配置”下选择相关功能。",
|
||||
"clone": {
|
||||
"sectionTitle": "复制设置",
|
||||
"sectionDescription": "将摄像头的配置复制到另一台摄像头或新摄像头上。",
|
||||
@@ -1227,7 +1298,7 @@
|
||||
"spatial": "空间设置",
|
||||
"streams": "视频流",
|
||||
"spatialWarningTitle": "分辨率不一致",
|
||||
"spatialWarning": "源摄像头 {{srcCamera}} 的检测分辨率 ({{srcWidth}}×{{srcHeight}}) 与以下摄像头存在差异:{{cameras}}。在这些摄像头上,多边形(检测区域)可能无法准确对齐。这些默认选项当前处于关闭状态;如果启用,将按原样进行复制。",
|
||||
"spatialWarning": "源摄像头 {{srcCamera}} 的检测分辨率 ({{srcWidth}}×{{srcHeight}}) 与以下摄像头存在差异:{{cameras}}。在这些摄像头上,多边形(检测区域)可能无法准确对齐。这些默认选项当前处于关闭状态;如果开启,将按原样进行复制。",
|
||||
"restartHint": "需要重启",
|
||||
"items": {
|
||||
"record": "录制",
|
||||
@@ -1278,23 +1349,23 @@
|
||||
"cameraReview": {
|
||||
"title": "摄像头核查设置",
|
||||
"object_descriptions": {
|
||||
"title": "生成式AI目标描述",
|
||||
"desc": "临时启用或禁用此摄像头的 生成式AI目标描述 功能,直到 Frigate 重启。禁用后,系统将不再请求该摄像头追踪目标和物体的AI生成描述。"
|
||||
"title": "生成式 AI 目标描述",
|
||||
"desc": "临时开启或关闭此摄像头的“生成式 AI 目标描述”功能,直到 Frigate 重启。关闭后,系统将不再为该摄像头的追踪目标请求 AI 生成的描述。"
|
||||
},
|
||||
"review_descriptions": {
|
||||
"title": "生成式 AI 核查总结",
|
||||
"desc": "临时开关该摄像头的 生成式 AI 核查总结 功能,直到 Frigate 重启。禁用后,系统将不再请求 AI 生成该摄像头核查项目的总结。"
|
||||
"title": "生成式 AI 核查描述",
|
||||
"desc": "临时开启或关闭此摄像头的“生成式 AI 核查描述”功能,直到 Frigate 重启。关闭后,系统将不再为该摄像头的核查项请求 AI 生成的描述。"
|
||||
},
|
||||
"review": {
|
||||
"title": "核查",
|
||||
"desc": "临时开关该摄像头的警报与检测项生成功能,直到 Frigate 重启后恢复。禁用期间,系统将不再生成新的核查项目。 ",
|
||||
"desc": "临时开启或关闭此摄像头的警报和检测,直到 Frigate 重启。关闭期间,系统将不再生成新的核查项。 ",
|
||||
"alerts": "警报 ",
|
||||
"detections": "检测 "
|
||||
},
|
||||
"reviewClassification": {
|
||||
"title": "核查分类",
|
||||
"desc": "Frigate 将核查项的严重程度分为“警报”和“检测”两个等级。默认情况下,所有的<strong>人</strong>、<strong>汽车</strong> 目标都将视为警报。你可以通过修改配置文件配置区域来细分。",
|
||||
"noDefinedZones": "此摄像头未设置任何监控区。",
|
||||
"desc": "Frigate 将核查项的严重程度分为“警报”和“检测”两个等级。默认情况下,所有的 <em>人</em>、<em>汽车</em> 目标都将视为警报。你可以通过修改配置文件中的区域设置来细分。",
|
||||
"noDefinedZones": "此摄像头未定义任何区域。",
|
||||
"objectAlertsTips": "所有 {{alertsLabels}} 类目标或物体在 {{cameraName}} 下都将视为警报。",
|
||||
"zoneObjectAlertsTips": "所有 {{alertsLabels}} 类目标或物体在 {{cameraName}} 下的 {{zone}} 区域内都将视为警报。",
|
||||
"objectDetectionsTips": "所有在摄像头 {{cameraName}} 上,检测到的 {{detectionsLabels}} 目标或物体,无论它位于哪个区,都将显示为检测。",
|
||||
@@ -1329,7 +1400,7 @@
|
||||
"reset": "重置"
|
||||
},
|
||||
"profile": {
|
||||
"label": "配置"
|
||||
"label": "配置模板"
|
||||
}
|
||||
},
|
||||
"configForm": {
|
||||
@@ -1424,8 +1495,11 @@
|
||||
"preset-record-generic-audio-aac": "录制(通用并将音频转码为 AAC)",
|
||||
"preset-record-mjpeg": "录制 - MJPEG 流摄像头",
|
||||
"preset-record-jpeg": "录制 - JPEG 流摄像头",
|
||||
"preset-record-ubiquiti": "录制 - 优必飞摄像头"
|
||||
}
|
||||
"preset-record-ubiquiti": "录制 - 优必飞摄像头",
|
||||
"preset-apple-silicon-h264": "Apple Silicon(H.264)",
|
||||
"preset-apple-silicon-h265": "Apple Silicon(H.265)"
|
||||
},
|
||||
"sameAsRecord": "与录制输出参数相同"
|
||||
},
|
||||
"cameraInputs": {
|
||||
"itemTitle": "视频流 {{index}}",
|
||||
@@ -1474,8 +1548,11 @@
|
||||
"options": {
|
||||
"detect": "检测",
|
||||
"record": "录制",
|
||||
"audio": "音频"
|
||||
}
|
||||
"audio": "音频",
|
||||
"record_sub": "录制(子视频流)"
|
||||
},
|
||||
"roleInUse": "已分配给其他视频流",
|
||||
"recordSubConflict": "同一路视频流不能同时拥有 record 和 record_sub 功能"
|
||||
},
|
||||
"review": {
|
||||
"title": "核查设置"
|
||||
@@ -1510,7 +1587,8 @@
|
||||
"options": {
|
||||
"embeddings": "嵌入(Embedding)",
|
||||
"descriptions": "描述生成",
|
||||
"chat": "聊天对话"
|
||||
"chat": "聊天对话",
|
||||
"transcribe": "音频转录"
|
||||
}
|
||||
},
|
||||
"semanticSearchModel": {
|
||||
@@ -1535,7 +1613,12 @@
|
||||
},
|
||||
"knownPlates": {
|
||||
"namePlaceholder": "例如:老婆的车",
|
||||
"platePlaceholder": "车牌号或正则表达式"
|
||||
"platePlaceholder": "车牌号或正则表达式",
|
||||
"assignedTo": "已分配给 {{name}}",
|
||||
"detected": "已检测到的车牌",
|
||||
"noneDetected": "尚未检测到车牌",
|
||||
"search": "搜索或输入车牌",
|
||||
"useCustom": "使用“{{value}}”"
|
||||
},
|
||||
"semanticSearchModelSize": {
|
||||
"notApplicable": "不适用于生成式 AI 提供者"
|
||||
@@ -1549,7 +1632,15 @@
|
||||
"noGo2rtcStreams": "没有 go2rtc 视频流配置",
|
||||
"availableStreams": "可用的视频流",
|
||||
"useCustom": "使用“{{value}}”",
|
||||
"addStream": "添加视频流"
|
||||
"addStream": "添加视频流",
|
||||
"reorderHandle": "拖动调整顺序",
|
||||
"transcodedBadge": "已转码",
|
||||
"autoOrder": "自动排序",
|
||||
"autoOrderTips": "测量每路视频流的码率,并按从高到低排序",
|
||||
"measuring": "测量中…",
|
||||
"rate": "{{kbps}} kbps",
|
||||
"rateSet": "{{kbps}} kbps(已设置)",
|
||||
"rateFailed": "无法测量"
|
||||
},
|
||||
"ptzPresets": {
|
||||
"placeholder": "选择或输入预设…",
|
||||
@@ -1560,7 +1651,38 @@
|
||||
},
|
||||
"defaultRole": {
|
||||
"admin": "管理员",
|
||||
"viewer": "成员"
|
||||
"viewer": "成员",
|
||||
"none": "无(拒绝访问)"
|
||||
},
|
||||
"liveTranscode": {
|
||||
"title": "转码视频流",
|
||||
"description": "添加画质较低的视频流,有人观看时由 go2rtc 实时转码。",
|
||||
"unavailable": "转码视频流需要有一路 go2rtc 视频流作为来源。请先在 go2rtc 视频流中添加一路。",
|
||||
"enable": "开启转码视频流",
|
||||
"source": "源视频流",
|
||||
"height": "高度",
|
||||
"heightOption": "{{height}}p",
|
||||
"bitrate": "码率(kbps)",
|
||||
"addQuality": "添加画质",
|
||||
"removeQuality": "删除画质"
|
||||
},
|
||||
"birdseyeModes": {
|
||||
"summary": "已选择 {{count}} 项",
|
||||
"options": {
|
||||
"continuous": "持续",
|
||||
"motion": "画面变动",
|
||||
"all_objects": "所有目标",
|
||||
"alerts": "警报",
|
||||
"detections": "检测"
|
||||
}
|
||||
},
|
||||
"audioTranscriptionModel": {
|
||||
"placeholder": "选择模型…",
|
||||
"builtIn": "内置模型",
|
||||
"genaiProviders": "生成式 AI 服务商"
|
||||
},
|
||||
"audioTranscriptionModelSize": {
|
||||
"notApplicable": "生成式 AI 服务商不适用"
|
||||
}
|
||||
},
|
||||
"cameraConfig": {
|
||||
@@ -1577,7 +1699,7 @@
|
||||
"title": "维护",
|
||||
"sync": {
|
||||
"title": "媒体同步",
|
||||
"desc": "Frigate 会根据您的保留配置定期清理媒体文件。出现少量孤立文件是正常现象。使用此功能可以删除磁盘上不再被数据库引用的孤立媒体文件。",
|
||||
"desc": "Frigate 会根据你的保留配置定期清理媒体文件。出现少量孤立文件是正常现象。使用此功能可以删除磁盘上不再被数据库引用的孤立媒体文件。",
|
||||
"started": "媒体同步已启动。",
|
||||
"alreadyRunning": "同步任务已在运行中",
|
||||
"error": "启动同步失败",
|
||||
@@ -1597,7 +1719,7 @@
|
||||
"forceDesc": "绕过安全阈值,即使删除超过 50% 的文件也完成同步。",
|
||||
"running": "同步运行中…",
|
||||
"start": "开始同步",
|
||||
"inProgress": "同步正在进行中。此页面已禁用。",
|
||||
"inProgress": "同步正在进行中。此页面暂不可用。",
|
||||
"status": {
|
||||
"queued": "已排队",
|
||||
"running": "运行中",
|
||||
@@ -1611,7 +1733,9 @@
|
||||
"orphansDeleted": "已删除孤立文件",
|
||||
"aborted": "已中止。删除操作将超过安全阈值。",
|
||||
"error": "错误",
|
||||
"totals": "总计"
|
||||
"totals": "总计",
|
||||
"spaceToReclaim": "可释放空间",
|
||||
"spaceReclaimed": "已释放空间"
|
||||
},
|
||||
"event_snapshots": "追踪目标快照",
|
||||
"event_thumbnails": "追踪目标缩略图",
|
||||
@@ -1653,9 +1777,10 @@
|
||||
"saveAllSuccess_other": "所有 {{count}} 个部分保存成功。",
|
||||
"saveAllPartial_other": "已保存 {{successCount}} / {{totalCount}} 个部分。{{failCount}} 个失败。",
|
||||
"saveAllFailure": "保存所有部分失败。",
|
||||
"saveAllSuccessRestartRequired_other": "成功保存 {{count}} 个部分。重启 Frigate 以生效。"
|
||||
"saveAllSuccessRestartRequired_other": "成功保存 {{count}} 个部分。重启 Frigate 以生效。",
|
||||
"go2rtcSyncFailed": "已保存,但无法更新 go2rtc。请重启 Frigate 以应用更改。"
|
||||
},
|
||||
"unsavedChanges": "您有未保存的更改",
|
||||
"unsavedChanges": "你有未保存的更改",
|
||||
"confirmReset": "确认重置",
|
||||
"resetToDefaultDescription": "这将把此部分的所有设置重置为默认值。此操作无法撤销。",
|
||||
"resetToGlobalDescription": "这将把此部分的设置重置为全局默认值。此操作无法撤销。",
|
||||
@@ -1669,21 +1794,24 @@
|
||||
"tooltip_other": "{{count}} 个摄像头在此项中存在单独配置,点击查看详情。",
|
||||
"heading_other": "此全局设置项下有 {{count}} 个摄像头存在自定义单独配置。",
|
||||
"othersField_other": "其余 {{count}} 个",
|
||||
"profilePrefix": "{{profile}} 配置方案:{{fields}}"
|
||||
"profilePrefix": "{{profile}} 配置模板:{{fields}}"
|
||||
},
|
||||
"overriddenGlobalHeading_other": "该摄像头已覆盖全局配置中的 {{count}} 项设置:",
|
||||
"overriddenGlobalNoDeltas": "该摄像头已覆盖全局配置,但所有配置项数值均无差异。",
|
||||
"overriddenBaseConfigHeading_other": "{{profile}} 配置模板已覆盖基础配置中的 {{count}} 项设置:",
|
||||
"overriddenBaseConfigNoDeltas": "{{profile}} 配置模板已覆盖该板块,但各项参数与基础配置完全一致无差异。"
|
||||
"overriddenBaseConfigNoDeltas": "{{profile}} 配置模板已覆盖该板块,但各项参数与基础配置完全一致无差异。",
|
||||
"overriddenLive": "已覆盖(实时)",
|
||||
"overriddenLiveTooltip": "此摄像头实际运行的值与配置中保存的值不同,这里显示的是配置中保存的值。实时监控、MQTT 或正在使用的配置模板都可能在 Frigate 运行期间改变它。",
|
||||
"overriddenLiveValue": "当前运行值:{{value}}"
|
||||
},
|
||||
"profiles": {
|
||||
"title": "配置模板",
|
||||
"activeProfile": "激活配置模板",
|
||||
"noActiveProfile": "无激活的配置模板",
|
||||
"activeProfile": "当前配置模板",
|
||||
"noActiveProfile": "没有开启的配置模板",
|
||||
"active": "激活",
|
||||
"activated": "配置模板 {{profile}} 已激活",
|
||||
"activateFailed": "配置模板设置失败",
|
||||
"deactivated": "配置模板已停用",
|
||||
"activated": "配置模板 {{profile}} 已开启",
|
||||
"activateFailed": "配置模板切换失败",
|
||||
"deactivated": "配置模板已关闭",
|
||||
"noProfiles": "未定义任何配置模板。",
|
||||
"noOverrides": "无覆盖项",
|
||||
"cameraCount_other": "{{count}} 个摄像头",
|
||||
@@ -1697,25 +1825,25 @@
|
||||
"nameInvalid": "仅允许使用小写字母、数字和下划线",
|
||||
"nameDuplicate": "已存在同名配置模板",
|
||||
"columnCamera": "摄像头",
|
||||
"columnOverrides": "配置文件覆盖",
|
||||
"columnOverrides": "配置模板覆盖",
|
||||
"error": {
|
||||
"mustBeAtLeastTwoCharacters": "至少需要 2 个字符",
|
||||
"mustNotContainPeriod": "不得包含英文句号(\".\")",
|
||||
"alreadyExists": "已存在使用此 ID 的配置文件"
|
||||
"alreadyExists": "已存在使用此 ID 的配置模板"
|
||||
},
|
||||
"renameProfile": "重命名配置文件",
|
||||
"renameSuccess": "已将配置文件重命名为 “{{profile}}”",
|
||||
"deleteProfile": "删除配置文件",
|
||||
"deleteProfileConfirm": "确定要为所有摄像头删除配置文件“{{profile}}”吗?该步骤无法撤销。",
|
||||
"deleteSuccess": "配置文件“{{profile}}”已删除",
|
||||
"createSuccess": "配置文件“{{profile}}”已创建",
|
||||
"removeOverride": "移除配置文件覆盖",
|
||||
"renameProfile": "重命名配置模板",
|
||||
"renameSuccess": "已将配置模板重命名为“{{profile}}”",
|
||||
"deleteProfile": "删除配置模板",
|
||||
"deleteProfileConfirm": "确定要为所有摄像头删除配置模板“{{profile}}”吗?该步骤无法撤销。",
|
||||
"deleteSuccess": "配置模板“{{profile}}”已删除",
|
||||
"createSuccess": "配置模板“{{profile}}”已创建",
|
||||
"removeOverride": "移除配置模板覆盖",
|
||||
"deleteSection": "删除节点覆盖",
|
||||
"deleteSectionConfirm": "是否要移除摄像机 {{camera}} 上针对配置文件 {{profile}} 的 {{section}} 覆盖设置?",
|
||||
"deleteSectionConfirm": "是否要移除摄像头 {{camera}} 上针对配置模板 {{profile}} 的 {{section}} 覆盖设置?",
|
||||
"deleteSectionSuccess": "已移除 {{profile}} 的 {{section}} 覆盖设置",
|
||||
"enableSwitch": "开启配置模板",
|
||||
"enabledDescription": "配置文件功能已启用。请在下方创建新的配置文件,进入摄像头配置页面进行修改并保存,修改即可生效。",
|
||||
"disabledDescription": "配置文件功能可以让你创建一组带名称的摄像头自定义参数(比如布防、离家、夜间模式),并随时切换启用。"
|
||||
"enabledDescription": "配置模板功能已开启。请在下方创建新的配置模板,进入摄像头配置页面进行修改并保存,修改即可生效。",
|
||||
"disabledDescription": "配置模板功能可以让你创建一组带名称的摄像头自定义参数(比如布防、离家、夜间模式),并随时开启或关闭。"
|
||||
},
|
||||
"timestampPosition": {
|
||||
"tl": "左上角",
|
||||
@@ -1787,10 +1915,13 @@
|
||||
},
|
||||
"configMessages": {
|
||||
"review": {
|
||||
"recordDisabled": "录制已禁用,不会生成核查记录项。",
|
||||
"detectDisabled": "目标检测已禁用。核查记录需要依靠检测到的目标来对警报和检测事件进行分类。",
|
||||
"recordDisabled": "录制已关闭,不会生成核查项。",
|
||||
"detectDisabled": "目标检测已关闭。核查项需要检测到的目标来区分警报和检测事件。",
|
||||
"allNonAlertDetections": "所有非警报类活动都将被记录为检测事件。",
|
||||
"genaiImageSourceRecordingsRecordDisabled": "图像源虽然设置为“录制”,但录制功能已关闭。Frigate 将自动降级使用预览图片。"
|
||||
"genaiImageSourceRecordingsRecordDisabled": "图像源设置为“录制”,但录制功能已关闭。Frigate 将回退使用预览图片。",
|
||||
"recordRuntimeDisabled": "配置中已开启录制,但此摄像头当前关闭了录制,因此不会生成核查项。请到摄像头的实时监控页面重新开启,或检查是否有正在使用的配置模板把它关闭了。",
|
||||
"detectRuntimeDisabled": "配置中已开启目标检测,但此摄像头当前关闭了目标检测。核查项需要检测到的目标来区分警报和检测事件。请到摄像头的实时监控页面重新开启,或检查是否有正在使用的配置模板把它关闭了。",
|
||||
"genaiImageSourceRecordingsRecordRuntimeDisabled": "图像源设置为“录制”,但此摄像头当前关闭了录制,尽管配置中已开启录制。Frigate 将回退使用预览图片。"
|
||||
},
|
||||
"lpr": {
|
||||
"vehicleNotTracked": "车牌识别需要先追踪到车辆才能工作。请在该摄像头的检测目标中添加“汽车”或其他类型的车辆目标。",
|
||||
@@ -1798,20 +1929,24 @@
|
||||
"modelSizeLarge": "大型模型针对多行格式车牌做了优化。小型模型的性能优于大型模型,而且只有小型模型才能支持中文车牌。除非你所在地区使用多行车牌格式,否则建议使用小型模型。"
|
||||
},
|
||||
"audio": {
|
||||
"noAudioRole": "暂无任何流已开启音频(audio)功能(role)。必须在视频流上启用音频功能,音频检测才能正常工作。"
|
||||
"noAudioRole": "没有任何视频流开启音频(audio)功能(role)。必须在视频流上开启音频功能,音频检测才能正常工作。"
|
||||
},
|
||||
"audioTranscription": {
|
||||
"audioDetectionDisabled": "该摄像头未开启音频检测功能。音频转录需要先开启音频检测。"
|
||||
"audioDetectionDisabled": "该摄像头未开启音频检测功能。音频转录需要先开启音频检测。",
|
||||
"audioDetectionRuntimeDisabled": "配置中已开启音频检测,但此摄像头当前关闭了音频检测,因此音频转录不会运行。请到摄像头的实时监控页面重新开启,或检查是否有正在使用的配置模板把它关闭了。",
|
||||
"genaiProviderSelected": "已选择生成式 AI 服务商,因此设备和模型大小设置会被忽略。"
|
||||
},
|
||||
"detect": {
|
||||
"fpsGreaterThanFive": "不建议设置检测帧率高于 5,数值设置过高可能引发性能问题,且不会带来任何增益。",
|
||||
"disabled": "目标检测已禁用。快照、回放条目以及人脸识别、车牌识别、生成式 AI 等增强功能都将无法使用。",
|
||||
"disabled": "目标检测已关闭。快照、核查项以及人脸识别、车牌识别、生成式 AI 等增强功能都将无法使用。",
|
||||
"resolutionShouldBeMultipleOfFour": "为了获得最佳效果,检测的宽度和高度应该是4的倍数。其他偶数值可能会在检测流中产生视觉伪影或轻微失真。",
|
||||
"aspectRatioMismatch": "你输入的宽度和高度与当前检测分辨率的不匹配,这可能会导致图像被拉伸或变形。",
|
||||
"maxFramesSet": "设置最大帧数将会覆盖默认行为,并且禁用静态物体追踪。只有很少的情况下需要这个功能,请谨慎使用。",
|
||||
"maxFramesSet": "设置最大帧数将会覆盖默认行为,并且关闭静态物体追踪。只有很少的情况下需要这个功能,请谨慎使用。",
|
||||
"squareResolution": "方形的检测分辨率比较少见。检测宽度和高度应该与你摄像头的画面比例一致(例如 16:9),而不是跟目标检测模型的输入尺寸一致。画面比例不匹配可能会拉伸图像,从而降低检测准确率。",
|
||||
"resolutionHigh": "这个检测分辨率高于推荐值,可能会增加资源占用,但不一定提升检测准确率。对于大多数摄像头,建议使用 1080p 或更低的检测分辨率。",
|
||||
"globalResolutionMultipleCameras": "在配置了多个摄像头同时还设置了全局检测分辨率。除非所有摄像头都使用相同的分辨率和画面比例,否则应该为每个摄像头单独设置检测宽度和高度,使其匹配各自摄像头的原生画面比例。"
|
||||
"globalResolutionMultipleCameras": "在配置了多个摄像头同时还设置了全局检测分辨率。除非所有摄像头都使用相同的分辨率和画面比例,否则应该为每个摄像头单独设置检测宽度和高度,使其匹配各自摄像头的原生画面比例。",
|
||||
"runtimeDisabled": "配置中已开启目标检测,但此摄像头当前关闭了目标检测。在从摄像头的实时监控页面重新开启之前,或在正在使用的配置模板不再关闭它之前,快照、核查项以及人脸识别、车牌识别和生成式 AI 等增强功能都不会工作。",
|
||||
"sceneWithoutModel": "此场景没有配置检测模型,因此此摄像头会回退到默认模型。为此场景添加一个模型,就能让摄像头使用自己的模型。"
|
||||
},
|
||||
"faceRecognition": {
|
||||
"globalDisabled": "必须开启人脸识别增强功能,此摄像头的人脸识别相关功能才能正常使用。",
|
||||
@@ -1819,10 +1954,13 @@
|
||||
"modelSizeLarge": "大型模型需要 GPU 或 NPU 才能运行正常。仅使用 CPU 的设备请选用小型模型。"
|
||||
},
|
||||
"record": {
|
||||
"noRecordRole": "暂无任何视频流已配置录制功能,录制功能将无法正常工作。"
|
||||
"noRecordRole": "暂无任何视频流已配置录制功能,录制功能将无法正常工作。",
|
||||
"noRecordSubRole": "没有任何视频流配置 record_sub 功能,子视频流录制将无法工作。",
|
||||
"profileBaseDisabled": "此摄像头的基础配置已关闭录制,因此在配置模板中开启录制不会生效。请在基础配置中开启录制,改用配置模板来关闭录制。"
|
||||
},
|
||||
"snapshots": {
|
||||
"detectDisabled": "目标检测已禁用。快照是根据追踪到的目标生成的,因此将不会创建快照。"
|
||||
"detectDisabled": "目标检测已关闭。快照是根据追踪到的目标生成的,因此将不会创建快照。",
|
||||
"detectRuntimeDisabled": "配置中已开启目标检测,但此摄像头当前关闭了目标检测,因此不会创建快照。请到摄像头的实时监控页面重新开启,或检查是否有正在使用的配置模板把它关闭了。"
|
||||
},
|
||||
"objects": {
|
||||
"genaiNoDescriptionsProvider": "必须配置具备“描述”功能的生成式 AI 服务商,才能自动生成事件描述。"
|
||||
@@ -1840,6 +1978,17 @@
|
||||
"model": {
|
||||
"optimizedFor320": "Frigate 针对了 320x320 的模型进行优化,这是大多数设置的最佳选择。640x640 模型速度较慢,仅在特定场景下有帮助。",
|
||||
"inputDimensionsNotDetectResolution": "模型输入的宽度和高度是目标检测模型的输入尺寸,而不是你摄像头的检测分辨率。它们应该与你正在使用的模型的尺寸相匹配,通常是一个方形尺寸,如320x320或640x640。"
|
||||
},
|
||||
"live": {
|
||||
"noGo2rtcStream": "此摄像头的实时监控正在使用基础播放器,帧率较低且没有声音。为此摄像头设置一路 go2rtc 视频流,可以获得更流畅的画面和声音。"
|
||||
},
|
||||
"notifications": {
|
||||
"profileBaseDisabled": "没有任何摄像头在基础配置中开启通知,因此在配置模板中开启通知不会生效。请至少为一个摄像头的基础配置开启通知。",
|
||||
"ttlDelay": "通知最多可能延迟 30 秒到达,并且即使核查项已经结束,仍会链接到实时监控。"
|
||||
},
|
||||
"birdseye": {
|
||||
"objectTrackingDetectDisabled": "鸟瞰图包含追踪目标,但此摄像头已关闭目标检测。此摄像头不会出现在鸟瞰图中。",
|
||||
"objectTrackingDetectRuntimeDisabled": "鸟瞰图包含追踪目标,但此摄像头当前关闭了目标检测,尽管配置中已开启目标检测。在从摄像头的实时监控页面重新开启之前,或在正在使用的配置模板不再关闭它之前,此摄像头不会出现在鸟瞰图中。"
|
||||
}
|
||||
},
|
||||
"birdseye": {
|
||||
@@ -1866,6 +2015,10 @@
|
||||
"imageSource": {
|
||||
"recordings": "录制",
|
||||
"previews": "预览"
|
||||
},
|
||||
"frameMode": {
|
||||
"frames": "画面帧",
|
||||
"annotated_frames": "带标注的画面帧"
|
||||
}
|
||||
},
|
||||
"logger": {
|
||||
@@ -1895,7 +2048,50 @@
|
||||
},
|
||||
"menuDot": {
|
||||
"overrideGlobal": "这一部分覆盖了全局配置",
|
||||
"overrideProfile": "本节被 {{profile}} 配置文件覆盖",
|
||||
"overrideProfile": "本节被配置模板 {{profile}} 覆盖",
|
||||
"unsaved": "这一部分有未保存的更改"
|
||||
},
|
||||
"analyticsPreview": {
|
||||
"show": "预览报告",
|
||||
"desc": "Frigate 在开启分享期间每天发送一次此报告。报告中绝不会包含摄像头名称、区域、标签或地址。",
|
||||
"error": "无法生成预览"
|
||||
},
|
||||
"notificationTtl": {
|
||||
"immediate": "立即",
|
||||
"reliable": "可靠"
|
||||
},
|
||||
"detectionModels": {
|
||||
"title": "检测模型",
|
||||
"description": "配置目标检测模型以及每个模型运行的硬件。只有当部分摄像头需要单独训练的模型(例如热成像摄像头)时,才需要为某个场景添加模型。摄像头会在自己的检测设置中按场景选择模型。",
|
||||
"addModel": "添加模型",
|
||||
"cameras_other": "{{count}} 个摄像头",
|
||||
"scene": {
|
||||
"label": "场景",
|
||||
"placeholder": "例如:热成像",
|
||||
"description": "此模型适用的摄像头环境名称。摄像头会在检测设置中把场景设为相同的值来选择模型;未设置场景的摄像头会使用默认模型。场景用于运行不同的模型,而不是把一个模型拆到多块硬件上,因为使用同一个模型文件的模型会合并。"
|
||||
},
|
||||
"scenes": {
|
||||
"default": "默认"
|
||||
},
|
||||
"hardware": {
|
||||
"label": "硬件",
|
||||
"placeholder": "选择硬件",
|
||||
"loading": "正在查找检测硬件…",
|
||||
"none": "未选择硬件",
|
||||
"claimedBy": "被 {{scene}} 使用",
|
||||
"detectorCount": "检测器数量",
|
||||
"countRecommended_other": "推荐用于 {{count}} 个摄像头",
|
||||
"unrecognized": "此模型配置的硬件在当前系统中未找到:{{devices}}",
|
||||
"description": "此模型运行检测所使用的硬件。",
|
||||
"detectorCountDescription": "在此硬件上运行多少个检测进程。检测器越多,能同时处理的摄像头越多,但会占用更多设备内存。",
|
||||
"unitsDescription": "每个单元都会运行自己的检测进程。无法共享的单元(例如 Coral)只能供一个模型使用。"
|
||||
},
|
||||
"tabs": {
|
||||
"plus": "Frigate+",
|
||||
"custom": "自定义模型"
|
||||
},
|
||||
"plusModel": {
|
||||
"noModelSelected": "选择 Frigate+ 模型"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
"go2rtc": "Go2RTC 日志 - Frigate",
|
||||
"nginx": "Nginx 日志 - Frigate",
|
||||
"websocket": "消息日志 - Frigate"
|
||||
}
|
||||
},
|
||||
"health": "运行状况 - Frigate"
|
||||
},
|
||||
"title": "系统",
|
||||
"metrics": "系统指标",
|
||||
@@ -57,7 +58,7 @@
|
||||
"clear": "清除",
|
||||
"empty": "未捕获到消息",
|
||||
"expanded": {
|
||||
"payload": "Payload"
|
||||
"payload": "消息内容"
|
||||
},
|
||||
"count_one": "{{count}} 条消息",
|
||||
"count_other": "{{count}} 条消息"
|
||||
@@ -139,7 +140,11 @@
|
||||
"bandwidth": "带宽",
|
||||
"unused": {
|
||||
"title": "未使用",
|
||||
"tips": "如果您的驱动器上存储了除 Frigate 录制内容之外的其他文件,该值可能无法准确反映 Frigate 可用的剩余空间。Frigate 不会追踪录制内容以外的存储使用情况。"
|
||||
"tips": "如果你的驱动器上存储了除 Frigate 录制内容之外的其他文件,该值可能无法准确反映 Frigate 可用的剩余空间。Frigate 不会追踪录制内容以外的存储使用情况。"
|
||||
},
|
||||
"subStream": {
|
||||
"information": "子视频流存储信息",
|
||||
"tips": "录制子视频流的摄像头会分别显示“原画”和“低画质”的占用空间,名称与录像回放中的画质选项一致。低画质录像会一直保留在磁盘上,直到超过保留期限,因此即使关闭了子视频流录制,这里仍可能显示这类占用。"
|
||||
}
|
||||
},
|
||||
"shm": {
|
||||
@@ -181,7 +186,11 @@
|
||||
"segmentLength": "录制片段长度:",
|
||||
"ok": "每 {{seconds}} 秒取一帧,适用于录制和回放。",
|
||||
"unknown": "无法确定关键帧间隔。",
|
||||
"recordDisabled": "此摄像头的录制功能已禁用。"
|
||||
"recordDisabled": "此摄像头的录制功能已关闭。",
|
||||
"warningFixed": "关键帧间隔均匀但过于稀疏(约每 {{seconds}} 秒一次)。录制仍可正常工作,但实时回放和拖动进度会启动得更慢。请将摄像头的 I 帧(关键帧)间隔设置为与帧率匹配。",
|
||||
"warningVariable": "关键帧间隔不一致({{minSeconds}} 秒到 {{maxSeconds}} 秒),通常说明开启了智能编码(H.264+/H.265+)。不建议这样设置。",
|
||||
"errorFixed": "关键帧间隔约为每 {{seconds}} 秒一次,比录像片段长度({{segmentTime}} 秒)还长,因此部分片段没有关键帧,无法回放。请缩短摄像头的 I 帧(关键帧)间隔,使其与帧率匹配。",
|
||||
"errorVariable": "关键帧间隔最大可达约 {{seconds}} 秒,比录像片段长度({{segmentTime}} 秒)还长。部分片段会没有关键帧,导致无法回放。请关闭摄像头上的智能编码(H.264+/H.265+),或缩短关键帧间隔。"
|
||||
}
|
||||
},
|
||||
"framesAndDetections": "帧数/检测次数",
|
||||
@@ -232,7 +241,14 @@
|
||||
"detectIsSlow": "{{detect}} 运行缓慢({{speed}}毫秒)",
|
||||
"detectIsVerySlow": "{{detect}} 运行非常缓慢({{speed}}毫秒)",
|
||||
"cameraIsOffline": "{{camera}} 已离线",
|
||||
"debugReplayActive": "调试回放会话正在进行"
|
||||
"debugReplayActive": "调试回放会话正在进行",
|
||||
"cameraSkippedDetections": "{{camera}} 有 {{pct}}% 的画面帧没有进行检测",
|
||||
"systemNotices_other": "{{count}} 条系统提示",
|
||||
"moreMessages_other": "+{{count}}",
|
||||
"reindexEmbeddingsFailed": "重新索引嵌入失败,请查看日志",
|
||||
"retentionUnmet": "为了释放空间,录像会在保留期限结束前被删除",
|
||||
"systemNotices_one": "{{count}} 条系统消息",
|
||||
"moreMessages_one": "+ {{count}}"
|
||||
},
|
||||
"enrichments": {
|
||||
"title": "增强功能",
|
||||
@@ -260,5 +276,105 @@
|
||||
"classification_events_per_second": "{{name}} 的每秒分类速度"
|
||||
},
|
||||
"averageInf": "平均推理时间"
|
||||
},
|
||||
"showAllTabs": "显示全部标签页",
|
||||
"showLessTabs": "收起",
|
||||
"health": {
|
||||
"title": "运行状况",
|
||||
"notices": {
|
||||
"title": "系统提示",
|
||||
"empty": "你的 Frigate 运行正常",
|
||||
"acknowledge": "确认",
|
||||
"acknowledgeHint": "再次出现前不再显示",
|
||||
"mute": "忽略",
|
||||
"muteHint": "不再显示此提示",
|
||||
"unmute": "取消忽略",
|
||||
"showAgain": "重新显示",
|
||||
"openSettings": "打开设置",
|
||||
"openLink": "打开链接",
|
||||
"noMatches": "没有符合筛选条件的系统提示",
|
||||
"hiddenTitle": "已隐藏",
|
||||
"noneHidden": "没有已隐藏的系统提示",
|
||||
"showAll": "全部重新显示",
|
||||
"showAllTitle": "重新显示所有已隐藏的系统提示?",
|
||||
"showAllDesc": "所有已确认和已忽略的系统提示都会重新出现在提示列表中,包括配置和视频流检查。",
|
||||
"occurred_other": "上次出现于 {{lastTime}} · 自 {{time}} 起共 {{count}} 次",
|
||||
"acknowledgedAt": "已于 {{time}} 确认",
|
||||
"mutedAt": "已于 {{time}} 忽略",
|
||||
"filter": {
|
||||
"showHidden": "显示已隐藏",
|
||||
"severity": "级别",
|
||||
"error": "错误",
|
||||
"warning": "警告",
|
||||
"info": "信息"
|
||||
},
|
||||
"kinds": {
|
||||
"detector_stuck": "检测器 {{detector}} 停止响应后已重启",
|
||||
"model_download_failed": "为 {{model}} 下载 {{file}} 失败:{{error}}",
|
||||
"skipped_detections": "检测速度跟不上,超过一分钟跳过了 {{pct}}% 的画面帧",
|
||||
"ffmpeg_high_cpu": "FFmpeg CPU 使用率过高(平均 {{cpu}}%)",
|
||||
"detect_high_cpu": "检测 CPU 使用率过高(平均 {{cpu}}%)",
|
||||
"shm_too_low": "请将 /dev/shm 分配({{total}} MB)至少增加到 {{min}} MB",
|
||||
"object_processing_behind": "追踪目标处理速度跟不上,导致摄像头画面帧被丢弃。请检查 CPU 使用情况,以及容器或虚拟机的 CPU 限制或绑核是否让 Frigate 可用 CPU 太少",
|
||||
"failed_login_other": "{{user}} 的多次登录尝试失败",
|
||||
"update_available": "Frigate {{version}} 已发布",
|
||||
"analytics_prompt": "考虑分享匿名使用统计,帮助开发者改进 Frigate",
|
||||
"failed_login_one": "尝试登录 {{user}} 失败"
|
||||
},
|
||||
"streamPrefix": "视频流 {{index}}:{{message}}",
|
||||
"streamPrefixRestream": "视频流 {{index}}(通过 go2rtc):{{message}}",
|
||||
"streamProbeFailed": "无法探测视频流 {{index}}:{{error}}",
|
||||
"cameraProbeFailed": "无法探测视频流:{{error}}",
|
||||
"occurred_one": "发生于 {{time}}"
|
||||
},
|
||||
"hardware": {
|
||||
"title": "硬件",
|
||||
"objectDetection": "目标检测",
|
||||
"hardwareAcceleration": "硬件加速",
|
||||
"enrichments": {
|
||||
"title": "增强功能",
|
||||
"semantic_search": "语义搜索",
|
||||
"face_recognition": "人脸识别",
|
||||
"lpr": "车牌识别",
|
||||
"audio_transcription": "音频转录"
|
||||
},
|
||||
"cameraConnections": "摄像头连接",
|
||||
"allCamerasExcellent": "所有摄像头的连接都很好。",
|
||||
"fps": "{{camera}} / {{expected}} 帧/秒",
|
||||
"nothingConfigured": "未配置",
|
||||
"allCameras": "所有摄像头",
|
||||
"probeUnavailable": "无法检测硬件",
|
||||
"justStarted": "Frigate 刚刚启动",
|
||||
"deviceNotFound": "当前系统中未找到 {{devices}}",
|
||||
"detectorNotRunning": "检测器进程未运行",
|
||||
"inferenceVerySlow": "推理速度非常慢({{speed}} 毫秒)",
|
||||
"inferenceSlow": "推理速度较慢({{speed}} 毫秒)",
|
||||
"inferenceMs": "{{speed}} 毫秒",
|
||||
"customArgs": "自定义 FFmpeg 参数",
|
||||
"customArgsNotVerified": "自定义 FFmpeg 参数(未验证)",
|
||||
"hwaccelNotConfigured": "当前没有使用硬件解码,但可以使用 {{family}}。请在 FFmpeg 设置中选择它",
|
||||
"hwaccelHardwareMissing": "已配置 {{family}},但硬件检测没有报告它",
|
||||
"unrecognizedDevice": "无法识别的设备覆盖项,未验证",
|
||||
"decoderUsage": "解码器 {{usage}}",
|
||||
"remoteProvider": "远程服务商",
|
||||
"acceleratorMissing": "已配置 {{device}},但未找到兼容的加速器",
|
||||
"modelNotRunYet": "模型尚未运行,首次使用后会验证设备",
|
||||
"fellBackToCpu": "已配置 {{device}},但正在使用 CPU 运行",
|
||||
"cpuDespiteAccelerator": "有可用的加速器,但正在使用 CPU 运行",
|
||||
"probed": "已检测",
|
||||
"probing": "检测中…",
|
||||
"recheck": "重新检查硬件",
|
||||
"cameraStreams": "摄像头视频流",
|
||||
"streamsNotChecked": "尚未检查",
|
||||
"streamsChecking": "正在检查 {{done}} / {{total}}",
|
||||
"streamsClean": "没有视频流问题",
|
||||
"checked": "已检查",
|
||||
"runAgain": "重新运行",
|
||||
"runStreamChecks": "运行视频流检查",
|
||||
"streamsChecked_other": "已检查 {{count}} 个摄像头",
|
||||
"streamsFlagged_other": "{{count}} 个有问题,已列在“系统提示”中",
|
||||
"streamsChecked_one": "已检查 {{count}} 个摄像头",
|
||||
"streamsFlagged_one": "{{count}} 项存在问题,已列在\"通知\"下方"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"yodeling": "約德爾唱法",
|
||||
"chant": "誦經",
|
||||
"mantra": "咒語",
|
||||
"camera": "相機",
|
||||
"camera": "攝影機",
|
||||
"motorcycle": "機車",
|
||||
"bus": "公車",
|
||||
"train": "火車",
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
"s": "{{time}} 秒",
|
||||
"second_other": "{{time}} 秒",
|
||||
"formattedTimestamp": {
|
||||
"12hour": "M 月 d 日 ah:mm:ss",
|
||||
"12hour": "M 月 d 日 a h:mm:ss",
|
||||
"24hour": "M 月 d 日 HH:mm:ss"
|
||||
},
|
||||
"formattedTimestamp2": {
|
||||
@@ -51,21 +51,21 @@
|
||||
"24hour": "HH:mm:ss"
|
||||
},
|
||||
"formattedTimestampMonthDayHourMinute": {
|
||||
"12hour": "M 月 d 日 ah:mm",
|
||||
"12hour": "M 月 d 日 a h:mm",
|
||||
"24hour": "M 月 d 日 HH:mm"
|
||||
},
|
||||
"formattedTimestampMonthDayYear": {
|
||||
"12hour": "yy 年 MM 月 dd 日",
|
||||
"12hour": "yyyy 年 MM 月 dd 日",
|
||||
"24hour": "yyyy 年 MM 月 dd 日"
|
||||
},
|
||||
"formattedTimestampMonthDayYearHourMinute": {
|
||||
"12hour": "yyyy 年 M 月 d 日 ah:mm",
|
||||
"12hour": "yyyy 年 M 月 d 日 a h:mm",
|
||||
"24hour": "yyyy 年 M 月 d 日 HH:mm"
|
||||
},
|
||||
"formattedTimestampMonthDay": "M 月 d 日",
|
||||
"formattedTimestampFilename": {
|
||||
"12hour": "yy 年 MM 月 dd 日 h 時 mm 分 ss 秒",
|
||||
"24hour": "yy 年 MM 月 dd 日 HH 時 mm 分 ss 秒"
|
||||
"12hour": "yy-MM-dd-h-mm-ss-a",
|
||||
"24hour": "yy-MM-dd-HH-mm-ss"
|
||||
},
|
||||
"inProgress": "處理中",
|
||||
"invalidStartTime": "無效的起始時間",
|
||||
@@ -118,7 +118,7 @@
|
||||
"exitFullscreen": "退出全螢幕",
|
||||
"pictureInPicture": "子母畫面",
|
||||
"twoWayTalk": "雙向通話",
|
||||
"cameraAudio": "鏡頭音訊",
|
||||
"cameraAudio": "攝影機音訊",
|
||||
"on": "開",
|
||||
"off": "關",
|
||||
"edit": "編輯",
|
||||
@@ -134,7 +134,7 @@
|
||||
"unselect": "取消選取",
|
||||
"export": "匯出",
|
||||
"deleteNow": "立即刪除",
|
||||
"next": "繼續",
|
||||
"next": "下一步",
|
||||
"continue": "繼續",
|
||||
"add": "新增",
|
||||
"applying": "應用中…",
|
||||
@@ -142,7 +142,7 @@
|
||||
"copiedToClipboard": "已複製到剪貼簿",
|
||||
"modified": "已修改",
|
||||
"overridden": "已覆蓋",
|
||||
"resetToGlobal": "重設為全域性",
|
||||
"resetToGlobal": "重設為全域設定",
|
||||
"resetToDefault": "重設為預設",
|
||||
"saveAll": "儲存全部",
|
||||
"savingAll": "儲存全部中…",
|
||||
@@ -232,13 +232,13 @@
|
||||
"restart": "重新啟動 Frigate",
|
||||
"live": {
|
||||
"title": "即時影像",
|
||||
"allCameras": "所有鏡頭",
|
||||
"allCameras": "所有攝影機",
|
||||
"cameras": {
|
||||
"title": "鏡頭",
|
||||
"count_other": "{{count}} 個鏡頭"
|
||||
"title": "攝影機",
|
||||
"count_other": "{{count}} 個攝影機"
|
||||
}
|
||||
},
|
||||
"review": "審核",
|
||||
"review": "審閱",
|
||||
"explore": "瀏覽",
|
||||
"export": "匯出",
|
||||
"uiPlayground": "UI 測試區",
|
||||
@@ -272,7 +272,7 @@
|
||||
"title": "角色",
|
||||
"admin": "管理員",
|
||||
"viewer": "檢視者",
|
||||
"desc": "管理員可以存取 Frigate UI 的全部功能。檢視者僅能查看鏡頭影像、審核物件及歷史紀錄。"
|
||||
"desc": "管理員可以存取 Frigate UI 的全部功能。檢視者僅能查看攝影機影像、審閱項目及歷史紀錄。"
|
||||
},
|
||||
"pagination": {
|
||||
"label": "分頁",
|
||||
|
||||
@@ -1,41 +1,41 @@
|
||||
{
|
||||
"group": {
|
||||
"label": "攝影機群組",
|
||||
"add": "新增鏡頭群組",
|
||||
"edit": "編輯鏡頭群組",
|
||||
"add": "新增攝影機群組",
|
||||
"edit": "編輯攝影機群組",
|
||||
"delete": {
|
||||
"label": "刪除鏡頭群組",
|
||||
"label": "刪除攝影機群組",
|
||||
"confirm": {
|
||||
"title": "確認刪除",
|
||||
"desc": "你確定要刪除鏡頭群組 <em>{{name}}</em> 嗎?"
|
||||
"desc": "你確定要刪除攝影機群組 <em>{{name}}</em> 嗎?"
|
||||
}
|
||||
},
|
||||
"name": {
|
||||
"errorMessage": {
|
||||
"mustLeastCharacters": "鏡頭群組名稱需至少包含兩個字元。",
|
||||
"exists": "鏡頭群組名稱已存在。",
|
||||
"nameMustNotPeriod": "鏡頭群組名稱不可包含點(.)。",
|
||||
"invalid": "無效的鏡頭群組名稱。"
|
||||
"mustLeastCharacters": "攝影機群組名稱需至少包含兩個字元。",
|
||||
"exists": "攝影機群組名稱已存在。",
|
||||
"nameMustNotPeriod": "攝影機群組名稱不可包含點(.)。",
|
||||
"invalid": "無效的攝影機群組名稱。"
|
||||
},
|
||||
"label": "名稱",
|
||||
"placeholder": "請輸入名稱…"
|
||||
},
|
||||
"cameras": {
|
||||
"label": "鏡頭",
|
||||
"label": "攝影機",
|
||||
"desc": "選擇欲新增至群組的攝影機。"
|
||||
},
|
||||
"icon": "圖示",
|
||||
"success": "鏡頭群組({{name}})已儲存。",
|
||||
"success": "攝影機群組({{name}})已儲存。",
|
||||
"camera": {
|
||||
"setting": {
|
||||
"label": "鏡頭串流設定",
|
||||
"label": "攝影機串流設定",
|
||||
"title": "{{cameraName}} 串流設定",
|
||||
"desc": "變更此攝影機群組儀錶板的串流選項。<em>這些設定是裝置/瀏覽器專屬的。</em>",
|
||||
"audioIsAvailable": "此串流有提供音訊",
|
||||
"audioIsUnavailable": "此串流不提供音訊",
|
||||
"audio": {
|
||||
"tips": {
|
||||
"title": "此串流必須從你的鏡頭輸出音訊並在 go2rtc 中設定。"
|
||||
"title": "此串流必須從你的攝影機輸出音訊並在 go2rtc 中設定。"
|
||||
}
|
||||
},
|
||||
"stream": "串流",
|
||||
@@ -50,12 +50,12 @@
|
||||
},
|
||||
"smartStreaming": {
|
||||
"label": "智慧串流(建議)",
|
||||
"desc": "智慧串流在沒有偵測到活動時會每分鐘只更新一次鏡頭影像以節約頻寬及資源。並在偵測到活動時切換為即時串流。"
|
||||
"desc": "智慧串流在沒有偵測到活動時會每分鐘只更新一次攝影機影像以節約頻寬及資源。並在偵測到活動時切換為即時串流。"
|
||||
},
|
||||
"continuousStreaming": {
|
||||
"label": "持續串流",
|
||||
"desc": {
|
||||
"title": "即使為偵測到任何活動,鏡頭影像在處於畫面中時會保持即時串流。",
|
||||
"title": "即使未偵測到任何活動,攝影機影像在處於畫面中時會保持即時串流。",
|
||||
"warning": "持續串流可能會佔用較高的頻寬並且可能會對效能造成影響,請謹慎使用。"
|
||||
}
|
||||
}
|
||||
@@ -63,14 +63,14 @@
|
||||
},
|
||||
"compatibilityMode": {
|
||||
"label": "相容模式",
|
||||
"desc": "只有在鏡頭的串流影像中出現色彩異常及右側有斜線時才啟用此選項。"
|
||||
"desc": "只有在攝影機的串流影像中出現色彩異常及右側有斜線時才啟用此選項。"
|
||||
}
|
||||
},
|
||||
"birdseye": "鳥瞰"
|
||||
},
|
||||
"showAll": "顯示所有鏡頭群組",
|
||||
"showAll": "顯示所有攝影機群組",
|
||||
"showLess": "顯示更少",
|
||||
"editGroups": "編輯鏡頭群組"
|
||||
"editGroups": "編輯攝影機群組"
|
||||
},
|
||||
"debug": {
|
||||
"options": {
|
||||
@@ -79,7 +79,7 @@
|
||||
"showOptions": "顯示選項",
|
||||
"hideOptions": "隱藏選項"
|
||||
},
|
||||
"boundingBox": "定界框",
|
||||
"boundingBox": "邊界框",
|
||||
"timestamp": "時間戳",
|
||||
"zones": "區域",
|
||||
"mask": "遮罩",
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
"export": "匯出",
|
||||
"selectOrExport": "選擇或匯出",
|
||||
"toast": {
|
||||
"success": "成功開始匯出。至 /exports 頁查看匯出資料。",
|
||||
"success": "成功開始匯出。請在匯出頁面檢視檔案。",
|
||||
"error": {
|
||||
"failed": "匯出失敗:{{error}}",
|
||||
"endTimeMustAfterStartTime": "結束時間必須要在開始時間之後",
|
||||
@@ -66,7 +66,7 @@
|
||||
"batchSuccess_other": "已開始 {{count}} 個匯出,正在開啟案件。",
|
||||
"batchPartial": "已開始 {{total}} 個匯出中的 {{successful}} 個。失敗的攝影機:{{failedCameras}}",
|
||||
"batchFailed": "啟動匯出失敗(共 {{total}} 個)。失敗的攝影機:{{failedCameras}}",
|
||||
"batchQueuedSuccess_other": "已排隊 {{count}} 個匯出,正在開啟案件。",
|
||||
"batchQueuedSuccess_other": "已排隊 {{count}} 個匯出。",
|
||||
"batchQueuedPartial": "已將 {{total}} 個匯出中的 {{successful}} 個加入佇列。失敗的攝影機:{{failedCameras}}",
|
||||
"batchQueueFailed": "未能將 {{total}} 個匯出加入佇列。失敗的攝影機:{{failedCameras}}"
|
||||
},
|
||||
@@ -92,10 +92,10 @@
|
||||
"timeRange": "時間範圍",
|
||||
"selectFromTimeline": "從時間軸選擇",
|
||||
"cameraSelection": "攝影機",
|
||||
"cameraSelectionHelp": "在此時間範圍內具有追蹤目標的攝影機會被預先選中",
|
||||
"cameraSelectionHelp": "在此時間範圍內具有追蹤物件的攝影機會被預先選中",
|
||||
"checkingActivity": "正在檢查攝影機活動…",
|
||||
"noCameras": "沒有可用的攝影機",
|
||||
"detectionCount_other": "{{count}} 個追蹤目標",
|
||||
"detectionCount_other": "{{count}} 個追蹤物件",
|
||||
"nameLabel": "匯出名稱",
|
||||
"namePlaceholder": "這些匯出檔案的可選基礎名稱",
|
||||
"queueingButton": "正在加入匯出佇列…",
|
||||
@@ -116,7 +116,7 @@
|
||||
"exportButton_other": "匯出 {{count}} 個審閱",
|
||||
"exportingButton": "匯出中…",
|
||||
"toast": {
|
||||
"started_other": "已開始 {{count}} 個匯出。正在開啟案件。",
|
||||
"started_other": "已開始 {{count}} 個匯出。",
|
||||
"partial": "已啟動 {{total}} 個匯出,其中 {{successful}} 個成功。失敗項:{{failedItems}}",
|
||||
"failed": "啟動匯出失敗(共 {{total}} 個)。失敗項:{{failedItems}}"
|
||||
}
|
||||
@@ -125,14 +125,14 @@
|
||||
"streaming": {
|
||||
"label": "串流",
|
||||
"restreaming": {
|
||||
"disabled": "此鏡頭並未啟用串流重導向。",
|
||||
"disabled": "此攝影機並未啟用串流重導向。",
|
||||
"desc": {
|
||||
"title": "設定 go2rtc 以啟用更多此鏡頭的預覽選項及音訊。"
|
||||
"title": "設定 go2rtc 以啟用更多此攝影機的預覽選項及音訊。"
|
||||
}
|
||||
},
|
||||
"showStats": {
|
||||
"label": "顯示串流統計資料",
|
||||
"desc": "啟用此選項以在鏡頭畫面上顯示串流統計資料。"
|
||||
"desc": "啟用此選項以在攝影機畫面上顯示串流統計資料。"
|
||||
},
|
||||
"debugView": "除錯檢視"
|
||||
},
|
||||
@@ -154,18 +154,18 @@
|
||||
"confirmDelete": {
|
||||
"title": "確認刪除",
|
||||
"desc": {
|
||||
"selected": "您確定要刪除所有與此審查項目相關的錄影檔案嗎?<br /><br />按住 <em>Shift</em> 鍵可在未來跳過此確認步驟。"
|
||||
"selected": "您確定要刪除所有與此審閱項目相關的錄影檔案嗎?<br /><br />按住 <em>Shift</em> 鍵可在未來跳過此確認步驟。"
|
||||
},
|
||||
"toast": {
|
||||
"success": "已成功刪除與選擇的審核物件有關的影片片段。",
|
||||
"success": "已成功刪除與選擇的審閱項目有關的影片片段。",
|
||||
"error": "刪除失敗:{{error}}"
|
||||
}
|
||||
},
|
||||
"button": {
|
||||
"export": "匯出",
|
||||
"markAsReviewed": "標記為已審核",
|
||||
"markAsReviewed": "標記為已審閱",
|
||||
"deleteNow": "立即刪除",
|
||||
"markAsUnreviewed": "標記為未審核"
|
||||
"markAsUnreviewed": "標記為未審閱"
|
||||
},
|
||||
"shareTimestamp": {
|
||||
"label": "分享該時間片段",
|
||||
|
||||
@@ -36,11 +36,11 @@
|
||||
"estimatedSpeed": "估計速度({{unit}})",
|
||||
"features": {
|
||||
"label": "特徵",
|
||||
"hasSnapshot": "包含截圖",
|
||||
"hasSnapshot": "包含快照",
|
||||
"hasVideoClip": "包含影片片段",
|
||||
"submittedToFrigatePlus": {
|
||||
"label": "已提交至 Frigate+",
|
||||
"tips": "你必須先過濾出包含截圖的追蹤物件。<br /><br />無法提交不包含截圖的追蹤物件至 Frigate+。"
|
||||
"tips": "你必須先過濾出包含快照的追蹤物件。<br /><br />無法提交不包含快照的追蹤物件至 Frigate+。"
|
||||
}
|
||||
},
|
||||
"sort": {
|
||||
@@ -54,14 +54,14 @@
|
||||
"relevance": "相關性"
|
||||
},
|
||||
"cameras": {
|
||||
"label": "鏡頭過濾",
|
||||
"label": "攝影機過濾",
|
||||
"all": {
|
||||
"title": "所有鏡頭",
|
||||
"short": "鏡頭"
|
||||
"title": "所有攝影機",
|
||||
"short": "攝影機"
|
||||
}
|
||||
},
|
||||
"review": {
|
||||
"showReviewed": "顯示已審核的內容"
|
||||
"showReviewed": "顯示已審閱的內容"
|
||||
},
|
||||
"motion": {
|
||||
"showMotionOnly": "僅顯示有移動的內容"
|
||||
@@ -81,9 +81,9 @@
|
||||
},
|
||||
"searchSource": {
|
||||
"label": "搜尋來源",
|
||||
"desc": "選擇搜尋追蹤物件的截圖或是說明。",
|
||||
"desc": "選擇搜尋追蹤物件的縮圖或是說明。",
|
||||
"options": {
|
||||
"thumbnailImage": "截圖",
|
||||
"thumbnailImage": "縮圖",
|
||||
"description": "說明"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"downloadVideo": {
|
||||
"label": "下載影片",
|
||||
"toast": {
|
||||
"success": "你的審查項目影片已開始下載。"
|
||||
"success": "你的審閱項目影片已開始下載。"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
"decodedFrames": "已解碼幀數:",
|
||||
"droppedFrameRate": "掉幀率:"
|
||||
},
|
||||
"livePlayerRequiredIOSVersion": "此串流類型需要 IOS 17.1 或以上版本。",
|
||||
"livePlayerRequiredIOSVersion": "此串流類型需要 iOS 17.1 或以上版本。",
|
||||
"toast": {
|
||||
"success": {
|
||||
"submittedFrigatePlus": "成功提交畫面至 Frigate+"
|
||||
|
||||
@@ -33,10 +33,10 @@
|
||||
},
|
||||
"filters": {
|
||||
"label": "音訊過濾器",
|
||||
"description": "按音訊型別的過濾器設定,如用於減少誤報的置信度閾值。",
|
||||
"description": "按音訊類型的過濾器設定,如用於減少誤報的信心度臨界值。",
|
||||
"threshold": {
|
||||
"label": "最低音訊置信度",
|
||||
"description": "音訊事件被計入的最低置信度閾值。"
|
||||
"label": "最低音訊信心度",
|
||||
"description": "音訊事件被計入的最低信心度臨界值。"
|
||||
}
|
||||
},
|
||||
"enabled_in_config": {
|
||||
@@ -50,34 +50,34 @@
|
||||
},
|
||||
"mqtt": {
|
||||
"label": "MQTT",
|
||||
"description": "MQTT 影像釋出設定。",
|
||||
"description": "MQTT 影像發布設定。",
|
||||
"enabled": {
|
||||
"label": "傳送影像",
|
||||
"description": "為此攝影機啟用向 MQTT 主題釋出目標影像快照。"
|
||||
"description": "為此攝影機啟用向 MQTT 主題發布物件影像快照。"
|
||||
},
|
||||
"timestamp": {
|
||||
"label": "新增時間戳",
|
||||
"description": "在釋出到 MQTT 的影像上疊加時間戳。"
|
||||
"description": "在發布到 MQTT 的影像上疊加時間戳。"
|
||||
},
|
||||
"bounding_box": {
|
||||
"label": "新增邊界框",
|
||||
"description": "在透過 MQTT 釋出的影像上繪製邊界框。"
|
||||
"description": "在透過 MQTT 發布的影像上繪製邊界框。"
|
||||
},
|
||||
"crop": {
|
||||
"label": "裁剪影像",
|
||||
"description": "將釋出到 MQTT 的影像裁剪到偵測到的目標邊界框。"
|
||||
"description": "將發布到 MQTT 的影像裁剪到偵測到的物件邊界框。"
|
||||
},
|
||||
"height": {
|
||||
"label": "影像高度",
|
||||
"description": "透過 MQTT 釋出的影像的調整高度(像素)。"
|
||||
"description": "透過 MQTT 發布的影像的調整高度(像素)。"
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "必需區域",
|
||||
"description": "目標必須進入才能釋出 MQTT 影像的區域。"
|
||||
"description": "物件必須進入才能發布 MQTT 影像的區域。"
|
||||
},
|
||||
"quality": {
|
||||
"label": "JPEG 品質",
|
||||
"description": "釋出到 MQTT 的影像的 JPEG 品質(0-100)。"
|
||||
"description": "發布到 MQTT 的影像的 JPEG 品質(0-100)。"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
@@ -88,7 +88,7 @@
|
||||
},
|
||||
"email": {
|
||||
"label": "通知電子信箱",
|
||||
"description": "用於推送通知或某些通知提供商要求的電子信箱位址。"
|
||||
"description": "用於推送通知或某些通知提供商要求的電子信箱地址。"
|
||||
},
|
||||
"cooldown": {
|
||||
"label": "冷卻時間",
|
||||
@@ -102,74 +102,74 @@
|
||||
},
|
||||
"birdseye": {
|
||||
"label": "鳥瞰圖",
|
||||
"description": "將多路攝影機畫面合併為統一佈局的鳥瞰合成檢視設定。",
|
||||
"description": "將多臺攝影機畫面合併為統一版面的鳥瞰合成檢視設定。",
|
||||
"enabled": {
|
||||
"label": "開啟鳥瞰圖",
|
||||
"description": "開啟或關閉鳥瞰圖功能。"
|
||||
},
|
||||
"order": {
|
||||
"label": "排序位置",
|
||||
"description": "用於控制攝影機在鳥瞰檢視佈局中排序位置的數值。"
|
||||
"description": "用於控制攝影機在鳥瞰檢視版面中排序位置的數值。"
|
||||
}
|
||||
},
|
||||
"detect": {
|
||||
"label": "目標偵測",
|
||||
"description": "用於執行目標偵測、初始化追蹤器的偵測模組設定。",
|
||||
"label": "物件偵測",
|
||||
"description": "用於執行物件偵測、初始化追蹤器的偵測模組設定。",
|
||||
"enabled": {
|
||||
"label": "開啟目標偵測",
|
||||
"description": "開啟或關閉該攝影機的目標偵測。"
|
||||
"label": "開啟物件偵測",
|
||||
"description": "開啟或關閉該攝影機的物件偵測。"
|
||||
},
|
||||
"height": {
|
||||
"label": "偵測畫面高度",
|
||||
"description": "用於配置偵測流的畫面高度(像素);留空則使用原始影片流解析度。"
|
||||
"description": "用於配置偵測流的畫面高度(像素);留空則使用原始影片串流解析度。"
|
||||
},
|
||||
"width": {
|
||||
"label": "偵測畫面寬度",
|
||||
"description": "用於配置偵測流的畫面寬度(像素);留空則使用原始影片流解析度。"
|
||||
"description": "用於配置偵測流的畫面寬度(像素);留空則使用原始影片串流解析度。"
|
||||
},
|
||||
"fps": {
|
||||
"label": "偵測幀率",
|
||||
"description": "偵測時希望使用的幀率;數值越低,CPU 佔用越小(推薦值為 5,僅在追蹤極高速運動的目標時才設定更高數值,最高不建議超過 10)。"
|
||||
"description": "偵測時希望使用的幀率;數值越低,CPU 佔用越小(推薦值為 5,僅在追蹤極高速運動的物件時才設定更高數值,最高不建議超過 10)。"
|
||||
},
|
||||
"min_initialized": {
|
||||
"label": "最小初始化幀數",
|
||||
"description": "建立追蹤目標前,需要連續偵測到目標的次數。數值越大,錯誤觸發的追蹤越少。預設值為幀率除以 2。"
|
||||
"description": "建立追蹤物件前,需要連續偵測到物件的次數。數值越大,錯誤觸發的追蹤越少。預設值為幀率除以 2。"
|
||||
},
|
||||
"max_disappeared": {
|
||||
"label": "最大消失幀數",
|
||||
"description": "追蹤目標在連續多少幀未被偵測到時,將被判定為已消失。"
|
||||
"description": "追蹤物件在連續多少幀未被偵測到時,將被判定為已消失。"
|
||||
},
|
||||
"stationary": {
|
||||
"label": "靜止目標配置",
|
||||
"description": "用於偵測和管理長時間靜止目標的相關設定。",
|
||||
"label": "靜止物件配置",
|
||||
"description": "用於偵測和管理長時間靜止物件的相關設定。",
|
||||
"interval": {
|
||||
"label": "靜止間隔",
|
||||
"description": "設定每隔多少幀執行一次偵測,用於確認目標是否處於靜止狀態。"
|
||||
"description": "設定每隔多少幀執行一次偵測,用於確認物件是否處於靜止狀態。"
|
||||
},
|
||||
"threshold": {
|
||||
"label": "靜止閾值",
|
||||
"description": "目標需要連續多少幀位置不變,才會被標記為靜止狀態。"
|
||||
"label": "靜止臨界值",
|
||||
"description": "物件需要連續多少幀位置不變,才會被標記為靜止狀態。"
|
||||
},
|
||||
"max_frames": {
|
||||
"label": "最大幀數",
|
||||
"description": "限制靜止目標最大追蹤時長(以幀數為單位),超過將會停止追蹤。",
|
||||
"description": "限制靜止物件最大追蹤時長(以幀數為單位),超過將會停止追蹤。",
|
||||
"default": {
|
||||
"label": "預設最大幀數",
|
||||
"description": "停止追蹤前,用於追蹤靜止目標的預設最大幀數。"
|
||||
"description": "停止追蹤前,用於追蹤靜止物件的預設最大幀數。"
|
||||
},
|
||||
"objects": {
|
||||
"label": "目標最大幀數",
|
||||
"description": "可對不同型別目標分別設定靜止追蹤的最大幀數(覆蓋全域性設定)。"
|
||||
"label": "物件最大幀數",
|
||||
"description": "可對不同類型物件分別設定靜止追蹤的最大幀數(覆蓋全域設定)。"
|
||||
}
|
||||
},
|
||||
"classifier": {
|
||||
"label": "開啟視覺分類器",
|
||||
"description": "使用視覺分類器,即使偵測框有輕微抖動,也能準確判斷物體是否為靜止。"
|
||||
"description": "使用視覺分類器,即使邊界框有輕微抖動,也能準確判斷物件是否為靜止。"
|
||||
}
|
||||
},
|
||||
"annotation_offset": {
|
||||
"label": "標記偏移量",
|
||||
"description": "偵測標記的時間偏移量(毫秒),用於讓時間軸上的偵測框與錄影畫面更精準對齊;可設定為正數或負數。"
|
||||
"description": "偵測標記的時間偏移量(毫秒),用於讓時間軸上的邊界框與錄影畫面更精準對齊;可設定為正數或負數。"
|
||||
}
|
||||
},
|
||||
"ffmpeg": {
|
||||
@@ -177,11 +177,11 @@
|
||||
"description": "FFmpeg 編解碼相關設定,包含可執行檔案路徑、命令列引數、硬體加速選項,以及按不同功能劃分的輸出引數。",
|
||||
"path": {
|
||||
"label": "FFmpeg 路徑",
|
||||
"description": "要使用的 FFmpeg 可執行檔案路徑,或版本別名(如 \"5.0\" 或 \"7.0\")。"
|
||||
"description": "要使用的 FFmpeg 可執行檔案路徑,或版本別名(\"7.0\" 或 \"8.0\")。"
|
||||
},
|
||||
"global_args": {
|
||||
"label": "FFmpeg 全域性引數",
|
||||
"description": "傳遞給 FFmpeg 程序的全域性引數。"
|
||||
"label": "FFmpeg 全域引數",
|
||||
"description": "傳遞給 FFmpeg 程序的全域引數。"
|
||||
},
|
||||
"hwaccel_args": {
|
||||
"label": "硬體加速引數",
|
||||
@@ -189,23 +189,23 @@
|
||||
},
|
||||
"input_args": {
|
||||
"label": "輸入引數",
|
||||
"description": "應用於 FFmpeg 輸入影片流的輸入引數。"
|
||||
"description": "應用於 FFmpeg 輸入影片串流的輸入引數。"
|
||||
},
|
||||
"output_args": {
|
||||
"label": "輸出引數",
|
||||
"description": "用於不同 FFmpeg 功能(如偵測、錄製)的預設輸出引數。",
|
||||
"detect": {
|
||||
"label": "偵測輸出引數",
|
||||
"description": "偵測功能影片流的預設輸出引數。"
|
||||
"description": "偵測功能影片串流的預設輸出引數。"
|
||||
},
|
||||
"record": {
|
||||
"label": "錄製輸出引數",
|
||||
"description": "錄製功能影片流的預設輸出引數。"
|
||||
"description": "錄製功能影片串流的預設輸出引數。"
|
||||
}
|
||||
},
|
||||
"retry_interval": {
|
||||
"label": "FFmpeg 重試時間",
|
||||
"description": "攝影機影片流異常斷開後,重新連線前的等待時間。預設為 10 秒。"
|
||||
"description": "攝影機影片串流異常斷開後,重新連線前的等待時間。預設為 10 秒。"
|
||||
},
|
||||
"apple_compatibility": {
|
||||
"label": "Apple 相容性",
|
||||
@@ -216,7 +216,7 @@
|
||||
"description": "在啟用硬體加速時,預設使用的 GPU 索引。"
|
||||
},
|
||||
"inputs": {
|
||||
"label": "攝影機輸入影片流",
|
||||
"label": "攝影機輸入影片串流",
|
||||
"description": "該攝影機的所有輸入流配置清單(包含路徑和功能)。",
|
||||
"path": {
|
||||
"label": "輸入路徑",
|
||||
@@ -224,19 +224,19 @@
|
||||
},
|
||||
"roles": {
|
||||
"label": "輸入流功能",
|
||||
"description": "定義該影片流的功能。"
|
||||
"description": "定義該影片串流的功能。"
|
||||
},
|
||||
"global_args": {
|
||||
"label": "FFmpeg 全域性引數",
|
||||
"description": "該輸入影片流使用的 FFmpeg 全域性通用引數。"
|
||||
"label": "FFmpeg 全域引數",
|
||||
"description": "該輸入影片串流使用的 FFmpeg 全域引數。"
|
||||
},
|
||||
"hwaccel_args": {
|
||||
"label": "硬體加速引數",
|
||||
"description": "該輸入影片流的硬體加速引數。"
|
||||
"description": "該輸入影片串流的硬體加速引數。"
|
||||
},
|
||||
"input_args": {
|
||||
"label": "輸入引數",
|
||||
"description": "該影片流特定的輸入引數。"
|
||||
"description": "該影片串流特定的輸入引數。"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -244,7 +244,7 @@
|
||||
"label": "即時監控觀看",
|
||||
"streams": {
|
||||
"label": "即時監控流名稱",
|
||||
"description": "配置的流名稱到用於即時監控播放的 restream/go2rtc 名稱的對映。"
|
||||
"description": "配置的流名稱到用於即時監控播放的 restream/go2rtc 名稱的對應。"
|
||||
},
|
||||
"height": {
|
||||
"label": "即時監控高度",
|
||||
@@ -257,77 +257,77 @@
|
||||
"description": "用於控制即時流選擇、解析度和品質的網頁頁面設定。"
|
||||
},
|
||||
"motion": {
|
||||
"label": "畫面變動偵測",
|
||||
"label": "移動偵測",
|
||||
"enabled": {
|
||||
"label": "開啟畫面變動偵測",
|
||||
"description": "開啟或關閉此攝影機的畫面變動偵測。"
|
||||
"label": "開啟移動偵測",
|
||||
"description": "開啟或關閉此攝影機的移動偵測。"
|
||||
},
|
||||
"threshold": {
|
||||
"label": "畫面變動閾值",
|
||||
"description": "畫面變動偵測器使用的像素差異閾值;數值越高靈敏度越低(範圍 1-255)。"
|
||||
"label": "移動臨界值",
|
||||
"description": "移動偵測器使用的像素差異臨界值;數值越高靈敏度越低(範圍 1-255)。"
|
||||
},
|
||||
"lightning_threshold": {
|
||||
"label": "閃電閾值",
|
||||
"description": "用於偵測和忽略短暫閃電閃爍的閾值(數值越低越敏感,範圍 0.3 到 1.0)。這不會完全阻止畫面變動偵測;只是當超過閾值時偵測器會停止分析額外的幀。在此類事件期間仍會建立基於畫面變動的錄影。"
|
||||
"label": "閃電臨界值",
|
||||
"description": "用於偵測和忽略短暫閃電閃爍的臨界值(數值越低越敏感,範圍 0.3 到 1.0)。這不會完全阻止移動偵測;只是當超過臨界值時偵測器會停止分析額外的幀。在此類事件期間仍會建立基於移動的錄影。"
|
||||
},
|
||||
"skip_motion_threshold": {
|
||||
"label": "跳過畫面變動閾值",
|
||||
"description": "如果單幀中畫面變化超過此比例,偵測器將判定為無畫面變動並立即重新校準。這可以節省 CPU 並減少閃電、風暴等情況下的誤報,但也可能會錯過真正的事件,如 PTZ 攝影機自動追蹤目標。你需要權衡取捨:是否犧牲少量錄製片段,換取更少無效影片與更低的誤檢。保持為空即可關閉該功能。"
|
||||
"label": "跳過移動臨界值",
|
||||
"description": "如果單幀中畫面變化超過此比例,偵測器將判定為無移動並立即重新校準。這可以節省 CPU 並減少閃電、風暴等情況下的誤報,但也可能會錯過真正的事件,如 PTZ 攝影機自動追蹤物件。你需要權衡取捨:是否犧牲少量錄製片段,換取更少無效影片與更低的誤檢。保持為空即可關閉該功能。"
|
||||
},
|
||||
"improve_contrast": {
|
||||
"label": "改善對比度",
|
||||
"description": "在畫面變動分析之前對幀應用對比度改善以幫助偵測。"
|
||||
"description": "在移動分析之前對幀應用對比度改善以幫助偵測。"
|
||||
},
|
||||
"contour_area": {
|
||||
"label": "輪廓區域",
|
||||
"description": "畫面變動輪廓被計入所需的最小輪廓區域(像素)。"
|
||||
"description": "移動輪廓被計入所需的最小輪廓區域(像素)。"
|
||||
},
|
||||
"delta_alpha": {
|
||||
"label": "Delta alpha",
|
||||
"description": "用於畫面變動計算的幀差異中使用的 alpha 混合因子。"
|
||||
"description": "用於移動計算的幀差異中使用的 alpha 混合因子。"
|
||||
},
|
||||
"frame_alpha": {
|
||||
"label": "畫面 alpha 通道",
|
||||
"description": "畫面變動預處理時混合畫面所使用的 alpha 值。"
|
||||
"description": "移動預處理時混合畫面所使用的 alpha 值。"
|
||||
},
|
||||
"frame_height": {
|
||||
"label": "畫面高度",
|
||||
"description": "計算畫面變動時縮放畫面的高度(像素)。"
|
||||
"description": "計算移動時縮放畫面的高度(像素)。"
|
||||
},
|
||||
"mask": {
|
||||
"label": "遮罩座標",
|
||||
"description": "定義用於包含/排除區域的畫面變動遮罩多邊形的有序 x,y 座標。"
|
||||
"description": "定義用於包含/排除區域的移動遮罩多邊形的有序 x,y 座標。"
|
||||
},
|
||||
"mqtt_off_delay": {
|
||||
"label": "MQTT 關閉延遲",
|
||||
"description": "在釋出 MQTT 'off' 狀態之前,最後一次畫面變動後等待的秒數。"
|
||||
"description": "在發布 MQTT 'off' 狀態之前,最後一次移動後等待的秒數。"
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始畫面變動狀態",
|
||||
"description": "指示原始靜態配置中是否啟用了畫面變動偵測。"
|
||||
"label": "原始移動狀態",
|
||||
"description": "指示原始靜態配置中是否啟用了移動偵測。"
|
||||
},
|
||||
"raw_mask": {
|
||||
"label": "原始遮罩"
|
||||
},
|
||||
"description": "此攝影機的預設畫面變動偵測設定。"
|
||||
"description": "此攝影機的預設移動偵測設定。"
|
||||
},
|
||||
"objects": {
|
||||
"label": "目標",
|
||||
"description": "目標追蹤預設設定,包括要追蹤的標籤和按目標的過濾器。",
|
||||
"label": "物件",
|
||||
"description": "物件追蹤預設設定,包括要追蹤的標籤和按物件的過濾器。",
|
||||
"track": {
|
||||
"label": "要追蹤的目標",
|
||||
"description": "此攝影機要追蹤的目標標籤清單。"
|
||||
"label": "要追蹤的物件",
|
||||
"description": "此攝影機要追蹤的物件標籤清單。"
|
||||
},
|
||||
"filters": {
|
||||
"label": "目標過濾器",
|
||||
"description": "應用於偵測到的目標以減少誤報的過濾器(區域、比例、置信度)。",
|
||||
"label": "物件過濾器",
|
||||
"description": "應用於偵測到的物件以減少誤報的過濾器(區域、比例、信心度)。",
|
||||
"min_area": {
|
||||
"label": "最小目標區域",
|
||||
"description": "此目標型別所需的最小邊界框區域(像素或百分比)。可以是像素(整數)或百分比(0.000001 到 0.99 之間的浮點數)。"
|
||||
"label": "最小物件區域",
|
||||
"description": "此物件類型所需的最小邊界框區域(像素或百分比)。可以是像素(整數)或百分比(0.000001 到 0.99 之間的浮點數)。"
|
||||
},
|
||||
"max_area": {
|
||||
"label": "最大目標區域",
|
||||
"description": "此目標型別允許的最大邊界框區域(像素或百分比)。可以是像素(整數)或百分比(0.000001 到 0.99 之間的浮點數)。"
|
||||
"label": "最大物件區域",
|
||||
"description": "此物件類型允許的最大邊界框區域(像素或百分比)。可以是像素(整數)或百分比(0.000001 到 0.99 之間的浮點數)。"
|
||||
},
|
||||
"min_ratio": {
|
||||
"label": "最小縱橫比",
|
||||
@@ -338,12 +338,12 @@
|
||||
"description": "邊界框允許的最大寬高比。"
|
||||
},
|
||||
"threshold": {
|
||||
"label": "置信度閾值",
|
||||
"description": "目標被視為真正陽性所需的平均偵測置信度閾值。"
|
||||
"label": "信心度臨界值",
|
||||
"description": "物件被視為正確偵測(True Positive)所需的平均偵測信心度臨界值。"
|
||||
},
|
||||
"min_score": {
|
||||
"label": "最小置信度",
|
||||
"description": "目標被計入所需的最小單幀偵測置信度。"
|
||||
"label": "最小信心度",
|
||||
"description": "物件被計入所需的最小單幀偵測信心度。"
|
||||
},
|
||||
"mask": {
|
||||
"label": "過濾器遮罩",
|
||||
@@ -354,38 +354,38 @@
|
||||
}
|
||||
},
|
||||
"mask": {
|
||||
"label": "目標遮罩",
|
||||
"description": "用於防止在指定區域進行目標偵測的遮罩多邊形。"
|
||||
"label": "物件遮罩",
|
||||
"description": "用於防止在指定區域進行物件偵測的遮罩多邊形。"
|
||||
},
|
||||
"raw_mask": {
|
||||
"label": "原始遮罩"
|
||||
},
|
||||
"genai": {
|
||||
"label": "生成式 AI 目標配置",
|
||||
"description": "用於傳送畫面給生成式 AI 進行生成和描述追蹤目標的選項。",
|
||||
"label": "生成式 AI 物件配置",
|
||||
"description": "用於傳送畫面給生成式 AI 進行生成和描述追蹤物件的選項。",
|
||||
"enabled": {
|
||||
"label": "開啟生成式 AI",
|
||||
"description": "預設開啟生成式 AI 生成追蹤目標的描述。"
|
||||
"description": "預設開啟生成式 AI 生成追蹤物件的描述。"
|
||||
},
|
||||
"use_snapshot": {
|
||||
"label": "使用快照",
|
||||
"description": "使用目標快照而不是縮圖給生成式 AI 進行描述生成。"
|
||||
"description": "使用物件快照而不是縮圖給生成式 AI 進行描述生成。"
|
||||
},
|
||||
"prompt": {
|
||||
"label": "字幕提示",
|
||||
"description": "使用生成式 AI 生成描述時使用的預設提示模板。"
|
||||
},
|
||||
"object_prompts": {
|
||||
"label": "目標提示",
|
||||
"description": "按目標設定提示詞,讓生成式 AI 對不同標籤的輸出進行自訂。"
|
||||
"label": "物件提示",
|
||||
"description": "按物件設定提示詞,讓生成式 AI 對不同標籤的輸出進行自訂。"
|
||||
},
|
||||
"objects": {
|
||||
"label": "生成式 AI 目標",
|
||||
"description": "預設傳送給生成式 AI 的目標標籤清單。"
|
||||
"label": "生成式 AI 物件",
|
||||
"description": "預設傳送給生成式 AI 的物件標籤清單。"
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "必需區域",
|
||||
"description": "目標必須進入這些區域,才會觸發生成式 AI 描述生成。"
|
||||
"description": "物件必須進入這些區域,才會觸發生成式 AI 描述生成。"
|
||||
},
|
||||
"debug_save_thumbnails": {
|
||||
"label": "儲存縮圖",
|
||||
@@ -396,11 +396,11 @@
|
||||
"description": "定義畫面幀應在何時傳送給生成式 AI(如偵測結束時、更新後等)。",
|
||||
"tracked_object_end": {
|
||||
"label": "結束時傳送",
|
||||
"description": "目標追蹤結束時向生成式 AI 傳送請求。"
|
||||
"description": "物件追蹤結束時向生成式 AI 傳送請求。"
|
||||
},
|
||||
"after_significant_updates": {
|
||||
"label": "生成式 AI 提前觸發",
|
||||
"description": "在追蹤目標發生指定次數的重要變化後,向生成式 AI 傳送請求。"
|
||||
"description": "在追蹤物件發生指定次數的重要變化後,向生成式 AI 傳送請求。"
|
||||
}
|
||||
},
|
||||
"enabled_in_config": {
|
||||
@@ -421,15 +421,15 @@
|
||||
},
|
||||
"continuous": {
|
||||
"label": "持續保留",
|
||||
"description": "無論是否有追蹤目標或動作,保留錄影的天數。如果只想保留警報和偵測的錄影,請設定為 0。",
|
||||
"description": "無論是否有追蹤物件或移動,保留錄影的天數。如果只想保留警報和偵測的錄影,請設定為 0。",
|
||||
"days": {
|
||||
"label": "保留天數",
|
||||
"description": "保留錄影的天數。"
|
||||
}
|
||||
},
|
||||
"motion": {
|
||||
"label": "動作保留",
|
||||
"description": "無論是否有追蹤目標,由動作觸發的錄影保留天數。如果只想保留警報和偵測的錄影,請設定為 0。",
|
||||
"label": "移動保留",
|
||||
"description": "無論是否有追蹤物件,由移動觸發的錄影保留天數。如果只想保留警報和偵測的錄影,請設定為 0。",
|
||||
"days": {
|
||||
"label": "保留天數",
|
||||
"description": "保留錄影的天數。"
|
||||
@@ -455,7 +455,7 @@
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:all(儲存所有片段)、motion(儲存有動作的片段)或 active_objects(儲存有活動目標的片段)。"
|
||||
"description": "保留模式:all(儲存所有片段)、motion(儲存有移動的片段)或 active_objects(儲存有活動物件的片段)。"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -479,7 +479,7 @@
|
||||
},
|
||||
"mode": {
|
||||
"label": "保留模式",
|
||||
"description": "保留模式:all(儲存所有片段)、motion(儲存有動作的片段)或 active_objects(儲存有活動目標的片段)。"
|
||||
"description": "保留模式:all(儲存所有片段)、motion(儲存有移動的片段)或 active_objects(儲存有活動物件的片段)。"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -516,18 +516,18 @@
|
||||
"label": "審閱",
|
||||
"alerts": {
|
||||
"label": "警報配置",
|
||||
"description": "哪些追蹤目標生成警報以及如何保留警報的設定。",
|
||||
"description": "哪些追蹤物件生成警報以及如何保留警報的設定。",
|
||||
"enabled": {
|
||||
"label": "開啟警報",
|
||||
"description": "開啟或關閉此攝影機的警報生成。"
|
||||
},
|
||||
"labels": {
|
||||
"label": "警報標籤",
|
||||
"description": "符合警報條件的目標標籤清單(例如:car、person)。"
|
||||
"description": "符合警報條件的物件標籤清單(例如:car、person)。"
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "必需區域",
|
||||
"description": "目標必須進入才能被視為警報的區域;留空則允許任何區域。"
|
||||
"description": "物件必須進入才能被視為警報的區域;留空則允許任何區域。"
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始警報狀態",
|
||||
@@ -540,18 +540,18 @@
|
||||
},
|
||||
"detections": {
|
||||
"label": "偵測配置",
|
||||
"description": "用於設定哪些追蹤目標會生成偵測記錄(非警報類),以及偵測記錄的保留方式。",
|
||||
"description": "用於設定哪些追蹤物件會生成偵測記錄(非警報類),以及偵測記錄的保留方式。",
|
||||
"enabled": {
|
||||
"label": "開啟偵測",
|
||||
"description": "開啟或關閉此攝影機的偵測事件。"
|
||||
},
|
||||
"labels": {
|
||||
"label": "偵測標籤",
|
||||
"description": "符合偵測事件條件的目標標籤清單。"
|
||||
"description": "符合偵測事件條件的物件標籤清單。"
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "必需區域",
|
||||
"description": "目標必須進入才能被視為偵測的區域;留空則允許任何區域。"
|
||||
"description": "物件必須進入才能被視為偵測的區域;留空則允許任何區域。"
|
||||
},
|
||||
"cutoff_time": {
|
||||
"label": "偵測截止時間",
|
||||
@@ -616,15 +616,15 @@
|
||||
},
|
||||
"bounding_box": {
|
||||
"label": "邊界框疊加",
|
||||
"description": "在 API 生成的快照上繪製追蹤目標的邊界框。"
|
||||
"description": "在 API 生成的快照上繪製追蹤物件的邊界框。"
|
||||
},
|
||||
"crop": {
|
||||
"label": "裁剪快照",
|
||||
"description": "在 API 生成的快照裁剪到偵測到的目標邊界框。"
|
||||
"description": "在 API 生成的快照裁剪到偵測到的物件邊界框。"
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "必需區域",
|
||||
"description": "目標必須進入才能儲存快照的區域。"
|
||||
"description": "物件必須進入才能儲存快照的區域。"
|
||||
},
|
||||
"height": {
|
||||
"label": "快照高度",
|
||||
@@ -632,21 +632,21 @@
|
||||
},
|
||||
"retain": {
|
||||
"label": "快照保留",
|
||||
"description": "快照的保留設定,包括預設天數和按目標覆蓋。",
|
||||
"description": "快照的保留設定,包括預設天數和按物件覆蓋。",
|
||||
"default": {
|
||||
"label": "預設保留",
|
||||
"description": "保留快照的預設天數。"
|
||||
},
|
||||
"objects": {
|
||||
"label": "目標保留",
|
||||
"description": "按目標覆蓋的快照保留天數。"
|
||||
"label": "物件保留",
|
||||
"description": "按物件覆蓋的快照保留天數。"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "快照品質",
|
||||
"description": "儲存快照的編碼品質(0-100)。"
|
||||
},
|
||||
"description": "此攝影機的追蹤目標 API 快照設定。"
|
||||
"description": "此攝影機的追蹤物件 API 快照設定。"
|
||||
},
|
||||
"timestamp_style": {
|
||||
"label": "時間戳樣式",
|
||||
@@ -656,7 +656,7 @@
|
||||
},
|
||||
"format": {
|
||||
"label": "時間戳格式",
|
||||
"description": "用於時間戳的日期時間格式字串(Python 日期時間格式程式碼)。"
|
||||
"description": "用於時間戳的日期時間格式字串(Python 日期時間格式代碼)。"
|
||||
},
|
||||
"color": {
|
||||
"label": "時間戳顏色",
|
||||
@@ -682,7 +682,7 @@
|
||||
"label": "時間戳效果",
|
||||
"description": "時間戳文字的視覺效果(none、solid、shadow)。"
|
||||
},
|
||||
"description": "應用於錄影和快照的即時監控流中時間戳的樣式選項。"
|
||||
"description": "套用於快照與除錯檢視的時間戳記樣式選項。"
|
||||
},
|
||||
"audio_transcription": {
|
||||
"label": "音訊轉錄",
|
||||
@@ -713,15 +713,15 @@
|
||||
"description": "啟用或停用此語意搜尋觸發器。"
|
||||
},
|
||||
"type": {
|
||||
"label": "觸發器型別",
|
||||
"label": "觸發器類型",
|
||||
"description": "觸發器類型:「thumbnail」(與影像相符)或「description」(與文字相符)。"
|
||||
},
|
||||
"data": {
|
||||
"label": "觸發器內容",
|
||||
"description": "要與追蹤目標相符的文字片語或縮圖 ID。"
|
||||
"description": "要與追蹤物件相符的文字片語或縮圖 ID。"
|
||||
},
|
||||
"threshold": {
|
||||
"label": "觸發器閾值",
|
||||
"label": "觸發器臨界值",
|
||||
"description": "啟用此觸發器所需的最小相似度分數(0-1)。"
|
||||
},
|
||||
"actions": {
|
||||
@@ -729,7 +729,7 @@
|
||||
"description": "觸發器相符時要執行的操作清單(通知、sub_label、屬性)。"
|
||||
}
|
||||
},
|
||||
"description": "語意搜尋設定,用於構建和查詢目標嵌入以查詢相似項目。"
|
||||
"description": "語意搜尋設定,用於構建和查詢物件嵌入以查詢相似項目。"
|
||||
},
|
||||
"face_recognition": {
|
||||
"label": "人臉辨識",
|
||||
@@ -745,7 +745,7 @@
|
||||
},
|
||||
"lpr": {
|
||||
"label": "車牌辨識",
|
||||
"description": "車牌辨識設定,包括偵測閾值、格式化和已知車牌。",
|
||||
"description": "車牌辨識設定,包括偵測臨界值、格式化和已知車牌。",
|
||||
"enabled": {
|
||||
"label": "開啟車牌辨識",
|
||||
"description": "在此攝影機上啟用或停用車牌辨識。"
|
||||
@@ -772,7 +772,7 @@
|
||||
"description": "此攝影機的 ONVIF 連線和 PTZ 自動追蹤設定。",
|
||||
"host": {
|
||||
"label": "ONVIF 主機",
|
||||
"description": "此攝影機 ONVIF 服務的主機(和可選協議)。"
|
||||
"description": "此攝影機 ONVIF 服務的主機(和可選協定)。"
|
||||
},
|
||||
"port": {
|
||||
"label": "ONVIF 埠",
|
||||
@@ -796,37 +796,37 @@
|
||||
},
|
||||
"autotracking": {
|
||||
"label": "自動追蹤",
|
||||
"description": "使用 PTZ 攝影機移動自動追蹤移動目標並使其保持在畫面中心。",
|
||||
"description": "使用 PTZ 攝影機移動自動追蹤移動物件並使其保持在畫面中心。",
|
||||
"enabled": {
|
||||
"label": "開啟自動追蹤",
|
||||
"description": "啟用或停用偵測目標的自動 PTZ 攝影機追蹤。"
|
||||
"description": "啟用或停用偵測物件的自動 PTZ 攝影機追蹤。"
|
||||
},
|
||||
"calibrate_on_startup": {
|
||||
"label": "啟動時校準",
|
||||
"description": "在啟動時測量 PTZ 電機速度以提高追蹤精度。Frigate 將在校準後用 movement_weights 更新配置。"
|
||||
"description": "在啟動時測量 PTZ 馬達速度以提高追蹤精度。Frigate 將在校準後用 movement_weights 更新配置。"
|
||||
},
|
||||
"zooming": {
|
||||
"label": "變焦模式",
|
||||
"description": "控制變焦行為:disabled(僅平移/傾斜)、absolute(最相容)或 relative(同時平移/傾斜/變焦)。"
|
||||
"description": "控制變焦行為:停用(僅平移/傾斜)、絕對位置(最相容)或相對位置(同時平移/傾斜/變焦)。"
|
||||
},
|
||||
"zoom_factor": {
|
||||
"label": "變焦因子",
|
||||
"description": "控制追蹤目標的變焦級別。數值越低保持更多場景可見;數值越高放大更近但可能失去追蹤。數值範圍 0.1 到 0.75。"
|
||||
"description": "控制追蹤物件的變焦級別。數值越低保持更多場景可見;數值越高放大更近但可能失去追蹤。數值範圍 0.1 到 0.75。"
|
||||
},
|
||||
"track": {
|
||||
"label": "追蹤目標",
|
||||
"description": "應觸發自動追蹤的目標型別清單。"
|
||||
"label": "追蹤物件",
|
||||
"description": "應觸發自動追蹤的物件類型清單。"
|
||||
},
|
||||
"required_zones": {
|
||||
"label": "必需區域",
|
||||
"description": "目標必須進入這些區域之一才能開始自動追蹤。"
|
||||
"description": "物件必須進入這些區域之一才能開始自動追蹤。"
|
||||
},
|
||||
"return_preset": {
|
||||
"label": "返回預設",
|
||||
"description": "追蹤結束後返回的攝影機韌體中配置的 ONVIF 預設名稱。"
|
||||
},
|
||||
"timeout": {
|
||||
"label": "返回超時",
|
||||
"label": "返回逾時",
|
||||
"description": "失去追蹤後等待多少秒後將攝影機返回到預設位置。"
|
||||
},
|
||||
"movement_weights": {
|
||||
@@ -839,41 +839,41 @@
|
||||
}
|
||||
},
|
||||
"ignore_time_mismatch": {
|
||||
"label": "忽略時間不匹配",
|
||||
"label": "忽略時間不相符",
|
||||
"description": "忽略 ONVIF 通訊中攝影機和 Frigate 伺服器之間的時間同步差異。"
|
||||
}
|
||||
},
|
||||
"best_image_timeout": {
|
||||
"label": "最佳影像超時",
|
||||
"description": "等待具有最高置信度分數的影像的時間。"
|
||||
"label": "最佳影像逾時",
|
||||
"description": "等待具有最高信心度分數的影像的時間。"
|
||||
},
|
||||
"type": {
|
||||
"label": "攝影機型別",
|
||||
"description": "攝影機型別"
|
||||
"label": "攝影機類型",
|
||||
"description": "攝影機類型"
|
||||
},
|
||||
"ui": {
|
||||
"label": "攝影機介面",
|
||||
"description": "此攝影機在頁面中的顯示順序和可見性。顯示順序僅影響預設儀表板。如需更精細的控制,請使用「攝影機組」。",
|
||||
"description": "此攝影機在頁面中的顯示順序和可見度。顯示順序僅影響預設儀錶板。如需更精細的控制,請使用「攝影機組」。",
|
||||
"order": {
|
||||
"label": "UI 順序",
|
||||
"description": "用於在頁面中排序攝影機的順序(只會影響預設儀表板和清單);數值越大則在越後面。"
|
||||
"description": "用於在頁面中排序攝影機的順序(只會影響預設儀錶板和清單);數值越大則在越後面。"
|
||||
},
|
||||
"dashboard": {
|
||||
"label": "在即時儀表板上顯示",
|
||||
"description": "切換此攝影機在 Frigate 頁面的所有位置是否可見。停用此項將需要手動編輯配置才能在頁面中再次檢視此攝影機。"
|
||||
"label": "在即時儀錶板上顯示",
|
||||
"description": "切換此攝影機是否顯示在預設的「所有攝影機」即時監控面板上。此攝影機在使用者介面的其他所有位置(包括攝影機群組與設定)仍可正常使用。"
|
||||
},
|
||||
"review": {
|
||||
"label": "在Review中顯示",
|
||||
"description": "切換此攝影機在Rewiew中是否可見 (包含Review 頁面、該攝影機的過濾器、移動檢視、歷史畫面)。"
|
||||
"label": "在審閱中顯示",
|
||||
"description": "切換此攝影機在審閱中是否顯示(包含審閱頁面及其攝影機篩選器、移動審閱和歷史檢視)。"
|
||||
}
|
||||
},
|
||||
"webui_url": {
|
||||
"label": "攝影機 URL",
|
||||
"description": "從系統頁面直接存取攝影機管理後臺的 URL"
|
||||
"description": "從系統頁面直接存取攝影機管理後台的 URL"
|
||||
},
|
||||
"zones": {
|
||||
"label": "區域",
|
||||
"description": "區域允許您定義幀的特定區域,以便確定目標是否在特定區域內。",
|
||||
"description": "區域允許您定義幀的特定區域,以便確定物件是否在特定區域內。",
|
||||
"friendly_name": {
|
||||
"label": "區域名稱",
|
||||
"description": "區域的友好名稱,顯示在 Frigate UI 中。如果未設定,將使用區域名稱的格式化版本。"
|
||||
@@ -883,18 +883,18 @@
|
||||
"description": "開啟或關閉此區域。停用的區域在執行時將被忽略。"
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "保持區域原始狀態的跟蹤。"
|
||||
"label": "保持區域原始狀態的追蹤。"
|
||||
},
|
||||
"filters": {
|
||||
"label": "區域過濾器",
|
||||
"description": "應用於此區域內目標的過濾器。用於減少誤報或限制哪些目標被認為存在於區域內。",
|
||||
"description": "應用於此區域內物件的過濾器。用於減少誤報或限制哪些物件被認為存在於區域內。",
|
||||
"min_area": {
|
||||
"label": "最小目標區域",
|
||||
"description": "此目標型別所需的最小邊界框區域(像素或百分比)。可以是像素(整數)或百分比(0.000001 到 0.99 之間的浮點數)。"
|
||||
"label": "最小物件區域",
|
||||
"description": "此物件類型所需的最小邊界框區域(像素或百分比)。可以是像素(整數)或百分比(0.000001 到 0.99 之間的浮點數)。"
|
||||
},
|
||||
"max_area": {
|
||||
"label": "最大目標區域",
|
||||
"description": "此目標型別允許的最大邊界框區域(像素或百分比)。可以是像素(整數)或百分比(0.000001 到 0.99 之間的浮點數)。"
|
||||
"label": "最大物件區域",
|
||||
"description": "此物件類型允許的最大邊界框區域(像素或百分比)。可以是像素(整數)或百分比(0.000001 到 0.99 之間的浮點數)。"
|
||||
},
|
||||
"min_ratio": {
|
||||
"label": "最小縱橫比",
|
||||
@@ -905,12 +905,12 @@
|
||||
"description": "邊界框允許的最大寬高比。"
|
||||
},
|
||||
"threshold": {
|
||||
"label": "置信度閾值",
|
||||
"description": "目標被視為真正陽性所需的平均偵測置信度閾值。"
|
||||
"label": "信心度臨界值",
|
||||
"description": "物件被視為正確偵測(True Positive)所需的平均偵測信心度臨界值。"
|
||||
},
|
||||
"min_score": {
|
||||
"label": "最小置信度",
|
||||
"description": "目標被計入所需的最小單幀偵測置信度。"
|
||||
"label": "最小信心度",
|
||||
"description": "物件被計入所需的最小單幀偵測信心度。"
|
||||
},
|
||||
"mask": {
|
||||
"label": "過濾器遮罩",
|
||||
@@ -930,23 +930,23 @@
|
||||
},
|
||||
"inertia": {
|
||||
"label": "慣性幀數",
|
||||
"description": "目標必須在區域內被連續偵測多少幀才能被認為存在。有助於過濾掉短暫偵測。"
|
||||
"description": "物件必須在區域內被連續偵測多少幀才能被認為存在。有助於過濾掉短暫偵測。"
|
||||
},
|
||||
"loitering_time": {
|
||||
"label": "徘徊秒數",
|
||||
"description": "目標必須在區域內停留多少秒才能被視為徘徊。設定為 0 可停用徘徊偵測。"
|
||||
"description": "物件必須在區域內停留多少秒才能被視為徘徊。設定為 0 可停用徘徊偵測。"
|
||||
},
|
||||
"speed_threshold": {
|
||||
"label": "最小速度",
|
||||
"description": "目標被認為存在於區域所需的最小速度(如果設定了距離,則為真實世界單位)。用於基於速度的區域觸發器。"
|
||||
"description": "物件被認為存在於區域所需的最小速度(如果設定了距離,則為真實世界單位)。用於基於速度的區域觸發器。"
|
||||
},
|
||||
"objects": {
|
||||
"label": "觸發目標",
|
||||
"description": "可以觸發此區域的目標型別清單(來自標籤對映)。可以是字串或字串清單。如果為空,則考慮所有目標。"
|
||||
"label": "觸發物件",
|
||||
"description": "可以觸發此區域的物件類型清單(來自標籤對應)。可以是字串或字串清單。如果為空,則考慮所有物件。"
|
||||
}
|
||||
},
|
||||
"enabled_in_config": {
|
||||
"label": "原始攝影機狀態",
|
||||
"description": "保持攝影機的原始狀態跟蹤。"
|
||||
"description": "保持攝影機的原始狀態追蹤。"
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user