Compare commits

...
30 Commits
Author SHA1 Message Date
Dermot Duffy 77a66e75c6 Fix Content-Type for webp, png, and jpeg files in /clips/ (#24208) 2026-09-06 13:32:44 -06:00
Josh Hawkins 4ac92dac72 Sync PWA status bar theme-color with resolved app theme (#24203)
* sync PWA status bar theme-color with resolved app theme

* update tags on login page too

* track system theme preference

* revert
2026-09-05 15:57:39 -06:00
6ceb370abb Translated using Weblate (Korean)
Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (474 of 474 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (141 of 141 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (50 of 50 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (10 of 10 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (86 of 86 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (500 of 500 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (500 of 500 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (86 of 86 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (474 of 474 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (2 of 2 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (50 of 50 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (500 of 500 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (6 of 6 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (141 of 141 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (46 of 46 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (10 of 10 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (185 of 185 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (74 of 74 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (10 of 10 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (49 of 49 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (67 of 67 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (25 of 25 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (26 of 26 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ecomen <skymbj@naver.com>
Co-authored-by: sinfancy <yujsjs@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-auth/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-camera/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-filter/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-icons/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-groups/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-configeditor/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-recording/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-search/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/ko/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/ko/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Groups
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/audio
Translation: Frigate NVR/common
Translation: Frigate NVR/components-auth
Translation: Frigate NVR/components-camera
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/components-filter
Translation: Frigate NVR/components-icons
Translation: Frigate NVR/components-player
Translation: Frigate NVR/objects
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-configeditor
Translation: Frigate NVR/views-events
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-exports
Translation: Frigate NVR/views-facelibrary
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-motionSearch
Translation: Frigate NVR/views-recording
Translation: Frigate NVR/views-replay
Translation: Frigate NVR/views-search
Translation: Frigate NVR/views-settings
Translation: Frigate NVR/views-system
2026-09-05 06:33:55 -05:00
Hosted WeblateandJonatan Nyberg dfefc5a64b Translated using Weblate (Swedish)
Currently translated at 64.6% (517 of 800 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (474 of 474 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jonatan Nyberg <nickwick@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/sv/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/sv/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
2026-09-05 06:33:55 -05:00
97dec9d046 Translated using Weblate (Hungarian)
Currently translated at 7.3% (35 of 474 strings)

Translated using Weblate (Hungarian)

Currently translated at 97.0% (485 of 500 strings)

Translated using Weblate (Hungarian)

Currently translated at 97.0% (485 of 500 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Laszlo Bana <banalac@yahoo.com>
Co-authored-by: Martin Rácz <raczmartinroland@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/hu/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/hu/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/audio
2026-09-05 06:33:55 -05:00
Hosted Weblateandcantarol CR ffcadb440e Translated using Weblate (Portuguese)
Currently translated at 57.4% (62 of 108 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.8% (499 of 500 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: cantarol CR <cr1996@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/pt/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/pt/
Translation: Frigate NVR/audio
Translation: Frigate NVR/components-dialog
2026-09-05 06:33:55 -05:00
Hosted Weblateandwkornilow a381a88b29 Translated using Weblate (Ukrainian)
Currently translated at 4.3% (35 of 800 strings)

Translated using Weblate (Ukrainian)

Currently translated at 9.7% (46 of 474 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: wkornilow <the.wkornilow@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/uk/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/uk/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
2026-09-05 06:33:55 -05:00
Nicolas Mowen 9e74adf812 Guard against memory allocation in graph capture (#24192) 2026-09-04 09:13:30 -06:00
Josh Hawkins 287fc42404 Miscellaneous fixes (#24172)
* fix frigate+ submission state bleeding onto the next tracked object

* add Korean

* fix tests
2026-09-03 06:44:18 -05:00
jlobue10andClaude Fable 5 b4d5035b79 Docs: fix Synaptics default model path and warn about v4l2m2m kernel Oops on GT-BE19000AI (#24008)
* Docs: fix Synaptics default model path in object detector docs

The model is installed at /synaptics/mobilenet.synap by docker/synaptics/Dockerfile,
matching the config examples in the same section.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Docs: warn about kernel Oops with v4l2m2m hwaccel on ASUS GT-BE19000AI

Enabling the recommended h264_v4l2m2m hwaccel args on the GT-BE19000AI AI
board (SL1680, firmware kernel 5.15.140) triggers a LIST_POISON dereference
Oops in the vendor vpu driver during decoder teardown, requiring a reboot.
Observed and captured on real hardware. Also fixes a Synaptics typo.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Docs: drop GT-BE19000AI hwaccel warning per review

Remove the device-specific v4l2m2m kernel Oops warning as requested by
maintainer review; upstream/vendor gotchas are not documented here. The
Synaptics typo fix and model path correction remain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 10:39:30 -05:00
Hosted WeblateandOverTheHillsAndFarAway 7497ef7506 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (46 of 46 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (49 of 49 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (6 of 6 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: OverTheHillsAndFarAway <prosjektx@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-recording/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-search/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/nb_NO/
Translation: Frigate NVR/common
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/views-motionSearch
Translation: Frigate NVR/views-recording
Translation: Frigate NVR/views-replay
Translation: Frigate NVR/views-search
Translation: Frigate NVR/views-settings
2026-09-02 08:24:47 -06:00
Hosted WeblateandGuoQing Liu 0d5038c7a0 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (67 of 67 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: GuoQing Liu <842607283@qq.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/zh_Hans/
Translation: Frigate NVR/common
Translation: Frigate NVR/views-events
Translation: Frigate NVR/views-settings
2026-09-02 08:24:47 -06:00
c71939acc2 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (46 of 46 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (474 of 474 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (141 of 141 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (185 of 185 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (50 of 50 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (10 of 10 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (46 of 46 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (474 of 474 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (141 of 141 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (185 of 185 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (67 of 67 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (500 of 500 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (46 of 46 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (49 of 49 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (67 of 67 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (10 of 10 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (500 of 500 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: windasd <me@windasd.tw>
Co-authored-by: 蘭蘭露 <flandrescarlettw@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-auth/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-camera/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-configeditor/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-search/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/zh_Hant/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/audio
Translation: Frigate NVR/common
Translation: Frigate NVR/components-auth
Translation: Frigate NVR/components-camera
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/components-player
Translation: Frigate NVR/objects
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-configeditor
Translation: Frigate NVR/views-events
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-facelibrary
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-motionSearch
Translation: Frigate NVR/views-replay
Translation: Frigate NVR/views-search
Translation: Frigate NVR/views-settings
Translation: Frigate NVR/views-system
2026-09-02 08:24:47 -06:00
Hosted Weblateandecomen e983825781 Translated using Weblate (Korean)
Currently translated at 87.4% (437 of 500 strings)

Translated using Weblate (Korean)

Currently translated at 85.6% (428 of 500 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ecomen <skymbj@naver.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/ko/
Translation: Frigate NVR/audio
2026-09-02 08:24:47 -06:00
Hosted WeblateandThomas DAGET 25681444d4 Translated using Weblate (French)
Currently translated at 21.3% (171 of 800 strings)

Translated using Weblate (French)

Currently translated at 59.7% (283 of 474 strings)

Translated using Weblate (French)

Currently translated at 65.4% (847 of 1295 strings)

Translated using Weblate (French)

Currently translated at 30.2% (26 of 86 strings)

Translated using Weblate (French)

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (French)

Currently translated at 99.1% (238 of 240 strings)

Translated using Weblate (French)

Currently translated at 18.3% (147 of 800 strings)

Translated using Weblate (French)

Currently translated at 54.8% (260 of 474 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Thomas DAGET <tdaget@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/fr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/fr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/fr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/fr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/fr/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/fr/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/common
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/views-exports
Translation: Frigate NVR/views-settings
2026-09-02 08:24:47 -06:00
Hosted WeblateandAkos 47d25254e9 Translated using Weblate (Indonesian)
Currently translated at 59.4% (44 of 74 strings)

Translated using Weblate (Indonesian)

Currently translated at 94.4% (102 of 108 strings)

Co-authored-by: Akos <asep.tmt@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-filter/id/
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/components-filter
2026-09-02 08:24:47 -06:00
Hosted WeblateandAkus 3e6d60fcac Added translation using Weblate (Azerbaijani)
Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Added translation using Weblate (Azerbaijani)

Update translation files

Updated by "Squash Git commits" add-on in Weblate.

Co-authored-by: Akus <orxanrecebov05@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/
Translation: Frigate NVR/common
2026-09-02 08:24:47 -06:00
Hosted WeblateandGringo 77d6b0540d Translated using Weblate (Italian)
Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: Gringo <ita.translations@tiscali.it>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/it/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/it/
Translation: Frigate NVR/common
Translation: Frigate NVR/views-settings
2026-09-02 08:24:47 -06:00
Hosted WeblateandMieszko Stelmach 632af09f73 Translated using Weblate (Polish)
Currently translated at 100.0% (46 of 46 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (474 of 474 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (141 of 141 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (185 of 185 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (86 of 86 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (67 of 67 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mieszko Stelmach <mieszko.stelmach@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/pl/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/common
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/objects
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-events
Translation: Frigate NVR/views-exports
Translation: Frigate NVR/views-facelibrary
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-motionSearch
Translation: Frigate NVR/views-replay
Translation: Frigate NVR/views-settings
Translation: Frigate NVR/views-system
2026-09-02 08:24:47 -06:00
Hosted WeblateandEduardo Pastor Fernández 10eb677e4c Translated using Weblate (Catalan)
Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: Eduardo Pastor Fernández <123eduardoneko123@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/ca/
Translation: Frigate NVR/common
Translation: Frigate NVR/views-settings
2026-09-02 08:24:47 -06:00
Hosted WeblateandUladz Maltsau bc3e4a0b35 Translated using Weblate (Belarusian)
Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Uladz Maltsau <wldyslw@icloud.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/be/
Translation: Frigate NVR/common
2026-09-02 08:24:47 -06:00
Hosted Weblateandlukasig 08a13d955e Translated using Weblate (Romanian)
Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: lukasig <lukasig@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/ro/
Translation: Frigate NVR/common
2026-09-02 08:24:47 -06:00
Hosted WeblateandPriit Jõerüüt ac16decf05 Translated using Weblate (Estonian)
Currently translated at 30.8% (399 of 1295 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/et/
Translation: Frigate NVR/common
Translation: Frigate NVR/views-settings
2026-09-02 08:24:47 -06:00
Hosted WeblateandViktor Stier 6e106854e4 Translated using Weblate (German)
Currently translated at 100.0% (1295 of 1295 strings)

Translated using Weblate (German)

Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Viktor Stier <viktor-stier@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/de/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/de/
Translation: Frigate NVR/common
Translation: Frigate NVR/views-settings
2026-09-02 08:24:47 -06:00
Hosted Weblateandதமிழ்நேரம் c6688c8ce7 Translated using Weblate (Tamil)
Currently translated at 1.6% (1 of 60 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (Tamil)

Currently translated at 5.0% (25 of 500 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/ta/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/ta/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/ta/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/ta/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/ta/
Translation: Frigate NVR/audio
Translation: Frigate NVR/objects
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-facelibrary
Translation: Frigate NVR/views-live
2026-09-02 08:24:47 -06:00
Hosted WeblateandMaBeniu 149362c77f Translated using Weblate (Lithuanian)
Currently translated at 1.2% (10 of 800 strings)

Translated using Weblate (Lithuanian)

Currently translated at 2.5% (12 of 474 strings)

Translated using Weblate (Lithuanian)

Currently translated at 42.8% (555 of 1295 strings)

Translated using Weblate (Lithuanian)

Currently translated at 100.0% (6 of 6 strings)

Translated using Weblate (Lithuanian)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Lithuanian)

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (Lithuanian)

Currently translated at 100.0% (240 of 240 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: MaBeniu <runnerm@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/lt/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/lt/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/lt/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/lt/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/lt/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-recording/lt/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/lt/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/common
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-recording
Translation: Frigate NVR/views-settings
2026-09-02 08:24:47 -06:00
Nicolas Mowen 2117b58aba Adjust audio striping (#24161) 2026-09-02 07:29:46 -06:00
Josh Hawkins a529656a90 Fix jumping timeline handles in debug replay range selection (#24158)
* fix jumping timeline handles in debug replay range selection

The timeline mirrored the export range into local state that was never reset when the range cleared, so starting a second selection after cancelling one left the stale mirror disagreeing with the new range. The sync effect and the draggable position effect then rewrote each other's values every commit until React hit its update limit. The handles now write the range directly.

* add mobile test
2026-09-01 20:17:29 -05:00
Nicolas Mowen c1b56b51b0 Backport 0.19 iOS HLS fixes (#24147) 2026-08-31 12:17:56 -05:00
Josh Hawkins d37dff1b49 Docs update (#24131)
* fix incorrect backchannel docs

`#backchannel=0` is a native rtsp source param, not an ffmpeg one, and the troubleshooting warning had it listed as ffmpeg-only. Any `#` modifier on a bare `rtsp://` source turns the backchannel off unless the URL explicitly contains `#backchannel=1`, so a dedicated two-way talk stream can't carry `#video=h264` or anything else.

* add rotation faq
2026-08-29 07:01:11 -06:00
164 changed files with 11616 additions and 2051 deletions

No files matched your search

@@ -150,7 +150,9 @@ http {
include auth_request.conf;
types {
video/mp4 mp4;
image/jpeg jpg;
image/jpeg jpg jpeg;
image/png png;
image/webp webp;
}
expires 7d;
+1 -1
View File
@@ -1100,7 +1100,7 @@ synaptics:
- key: ssd
label: SSD MobileNet
recommended: true
download: A synap model is provided in the container at `/mobilenet.synap` and is used by this detector type by default. The model comes from the [Synap-release Github](https://github.com/synaptics-astra/synap-release/tree/v1.5.0/models/dolphin/object_detection/coco/model/mobilenet224_full80).
download: A synap model is provided in the container at `/synaptics/mobilenet.synap` and is used by this detector type by default. The model comes from the [Synap-release Github](https://github.com/synaptics-astra/synap-release/tree/v1.5.0/models/dolphin/object_detection/coco/model/mobilenet224_full80).
ui: |-
Navigate to **Settings > System > Detectors and model** and select **Synaptics** from the detector type dropdown and click **Add**. Then on the same page, in the **Custom Model** tab, configure:
@@ -498,7 +498,7 @@ cameras:
## Synaptics
Hardware accelerated video de-/encoding is supported on Synpatics SL-series SoC.
Hardware accelerated video de-/encoding is supported on Synaptics SL-series SoC.
### Prerequisites
+1 -1
View File
@@ -291,7 +291,7 @@ For advanced use cases, the [custom export HTTP API](../integrations/api/export-
POST /export/custom/{camera_name}/start/{start_time}/end/{end_time}
```
The request body accepts `ffmpeg_input_args` and `ffmpeg_output_args` to control encoding, frame rate, filters, and other FFmpeg options. If neither is provided, Frigate defaults to time-lapse output settings (25x speed, 30 FPS).
The request body accepts `ffmpeg_input_args` and `ffmpeg_output_args` to control encoding, frame rate, filters, and other FFmpeg options. If neither is provided, Frigate defaults to time-lapse output settings (25x speed, 30 FPS) with audio removed (`-an`). When providing your own `ffmpeg_input_args`, include `-an` if you want audio stripped from the export.
The following example exports a time-lapse at 60x speed with 25 FPS:
+3 -1
View File
@@ -197,7 +197,7 @@ For cameras that support two-way talk, go2rtc will automatically establish an au
To prevent this, you must configure two separate stream instances:
1. One stream instance with `#backchannel=0` for Frigate's viewing, recording, and detection (prevents go2rtc from establishing the blocking backchannel)
2. A second stream instance without `#backchannel=0` for two-way talk functionality (can be used by Frigate's WebRTC viewer or other applications)
2. A second stream instance with no `#` parameters at all for two-way talk functionality (can be used by Frigate's WebRTC viewer or other applications)
Configuration example:
@@ -215,6 +215,8 @@ In this configuration:
- `front_door` stream is used by Frigate for viewing, recording, and detection. The `#backchannel=0` parameter prevents go2rtc from establishing the audio output backchannel, so it won't block two-way talk access.
- `front_door_twoway` stream is used for two-way talk functionality. This stream can be used by Frigate's WebRTC viewer when two-way talk is enabled, or by other applications (like Home Assistant Advanced Camera Card) that need access to the camera's audio output channel.
Any `#` parameter on a bare `rtsp://` source disables the backchannel unless the URL explicitly contains `#backchannel=1`. A two-way talk stream with something like `#video=h264` on it silently loses two-way audio, and Frigate will report that two-way talk is unavailable for that stream.
## Security: Restricted Stream Sources
For security reasons, the `echo:`, `expr:`, and `exec:` stream sources are disabled by default in go2rtc. These sources allow arbitrary command execution and can pose security risks if misconfigured.
+14
View File
@@ -39,6 +39,20 @@ To do this efficiently the following setup is required:
When this is done correctly, the GPU will do the decoding and scaling which will result in a small increase in CPU usage but with better results.
### How can I rotate my camera's video feed?
Rotation is best done in the camera's firmware settings (usually called rotate, flip, or corridor mode) so the video arrives already rotated and no extra processing is needed. Check there first.
If your camera does not support rotation, go2rtc's ffmpeg module can rotate the stream with the `#rotate` parameter (`90`, `180`, `270`, or `-90`), but this is not recommended: rotation requires transcoding (re-encoding) the video, which significantly increases CPU usage, especially for high resolution streams.
```yaml
go2rtc:
streams:
my_camera: "ffmpeg:rtsp://user:password@192.168.1.10:554/stream#video=h264#hardware#rotate=90"
```
Point the camera's inputs at the restream as described in the [restream docs](/configuration/restream.md), and swap `detect -> width` and `detect -> height` to match the rotated resolution.
### My mjpeg stream or snapshots look green and crazy
This almost always means that the width/height defined for your camera are not correct. Double check the resolution with VLC or another player. Also make sure you don't have the width and height values backwards.
+4 -2
View File
@@ -78,7 +78,9 @@ go2rtc:
:::warning
The `#`-modifiers (`#video=`, `#audio=`, `#hardware`, `#backchannel=0`, …) **only take effect on a source that is prefixed with `ffmpeg:`**. Adding them to a bare `rtsp://…#audio=opus` source does nothing: go2rtc ignores them. Likewise, when a source references another stream by name (e.g. `ffmpeg:back#audio=aac`), the name must match the stream key **exactly** (it is case sensitive), or the transcode is silently never produced. This is the single most common configuration mistake. In the Frigate UI, the **Use compatibility mode (ffmpeg)** toggle adds the `ffmpeg:` prefix for you.
The transcoding modifiers (`#video=`, `#audio=`, `#hardware`, …) **only take effect on a source that is prefixed with `ffmpeg:`**. Adding them to a bare `rtsp://…#audio=opus` source does nothing: go2rtc ignores them. Likewise, when a source references another stream by name (e.g. `ffmpeg:back#audio=aac`), the name must match the stream key **exactly** (it is case sensitive), or the transcode is silently never produced. This is the single most common configuration mistake. In the Frigate UI, the **Use compatibility mode (ffmpeg)** toggle adds the `ffmpeg:` prefix for you.
A bare `rtsp://` source reads a different set of modifiers: `#backchannel=`, `#media=`, `#timeout=`, and `#transport=`. These do nothing on an `ffmpeg:` source. Adding **any** modifier to a bare `rtsp://` source also disables the camera's backchannel unless the URL explicitly contains `#backchannel=1`, so a stream dedicated to two-way talk should carry no modifiers at all.
:::
@@ -153,7 +155,7 @@ WebRTC is only attempted when MSE fails or when using a camera's two-way talk fe
- **Codec mismatch**: WebRTC cannot carry H.265 or AAC. The stream backing the WebRTC view must provide Opus (or PCMA/PCMU) audio and H.264 video. Add an `ffmpeg:back#audio=opus` source as shown above.
- **Port `8555` not reachable, or no candidates set**: WebRTC needs port `8555` (both TCP and UDP) open and a reachable candidate advertised. On Docker installs running on a custom/overlay network, go2rtc may advertise unreachable container IPs as ICE candidates; setting `webrtc.filters.candidates: []` and supplying only your host's LAN IP resolves this. See [WebRTC extra configuration](/configuration/live#webrtc-extra-configuration).
- **Two-way talk** additionally requires a secure context (HTTPS or the authenticated port `8971`, because browsers block microphone access on plain HTTP). The camera's RTSP backchannel must also be handled correctly: go2rtc seizes the backchannel by default, which blocks two-way audio for other consumers and can inject static. Disable it on the primary stream with `#backchannel=0` and use a separate dedicated stream for talk, as documented in [preventing go2rtc from blocking two-way audio](/configuration/restream#two-way-talk-restream).
- **Two-way talk** additionally requires a secure context (HTTPS or the authenticated port `8971`, because browsers block microphone access on plain HTTP). The camera's RTSP backchannel must also be handled correctly: go2rtc seizes the backchannel by default, which blocks two-way audio for other consumers and can inject static. Disable it on the primary stream with `#backchannel=0` and use a separate dedicated stream for talk, carrying no `#` modifiers of any kind, as documented in [preventing go2rtc from blocking two-way audio](/configuration/restream#two-way-talk-restream).
## High CPU usage
+2 -1
View File
@@ -69,6 +69,7 @@ from frigate.jobs.export import (
from frigate.models import Export, ExportCase, Previews, Recordings
from frigate.record.export import (
DEFAULT_TIME_LAPSE_FFMPEG_ARGS,
DEFAULT_TIME_LAPSE_FFMPEG_INPUT_ARGS,
ChaptersEnum,
PlaybackSourceEnum,
validate_ffmpeg_args,
@@ -1012,7 +1013,7 @@ def export_recording_custom(
# Set default values if not provided (timelapse defaults)
if ffmpeg_input_args is None:
ffmpeg_input_args = ""
ffmpeg_input_args = DEFAULT_TIME_LAPSE_FFMPEG_INPUT_ARGS
if ffmpeg_output_args is None:
ffmpeg_output_args = DEFAULT_TIME_LAPSE_FFMPEG_ARGS
+37 -26
View File
@@ -199,15 +199,20 @@ class CudaGraphRunner(BaseModelRunner):
EnrichmentModelTypeEnum.yolov9_license_plate.value,
]
# ORT performs two regular runs before it starts capturing, but on some
# driver / cuDNN combinations the arena still has to extend on the run that
# captures, and cudaMalloc is not allowed during capture. Running with
# capture disabled first keeps those allocations outside of the capture.
GRAPH_FREE_WARMUP_RUNS = 2
def __init__(self, session: ort.InferenceSession, cuda_device_id: int):
self._session = session
self._cuda_device_id = cuda_device_id
self._captured = False
self._prepared = False
self._io_binding: ort.IOBinding | None = None
self._input_name: str | None = None
self._output_names: list[str] | None = None
self._input_ortvalue: ort.OrtValue | None = None
self._output_ortvalues: ort.OrtValue | None = None
def get_input_names(self) -> list[str]:
"""Get input names for the model."""
@@ -217,35 +222,41 @@ class CudaGraphRunner(BaseModelRunner):
"""Get the input width of the model."""
return self._session.get_inputs()[0].shape[3]
def _prepare(self, input_name: str, tensor_input: np.ndarray) -> None:
"""Bind CUDA buffers and warm the session up with capture disabled."""
self._io_binding = self._session.io_binding()
self._input_name = input_name
self._output_names = [o.name for o in self._session.get_outputs()]
self._input_ortvalue = ort.OrtValue.ortvalue_from_numpy(
tensor_input, "cuda", self._cuda_device_id
)
self._io_binding.bind_ortvalue_input(self._input_name, self._input_ortvalue)
for name in self._output_names:
# Bind outputs to CUDA and allow ORT to allocate appropriately
self._io_binding.bind_output(name, "cuda", self._cuda_device_id)
# gpu_graph_id -1 disables capture and replay for the run
warmup_options = ort.RunOptions()
warmup_options.add_run_config_entry("gpu_graph_id", "-1")
for _ in range(self.GRAPH_FREE_WARMUP_RUNS):
self._session.run_with_iobinding(self._io_binding, warmup_options)
self._prepared = True
def run(self, input: dict[str, Any]):
# Extract the single tensor input (assuming one input)
input_name = list(input.keys())[0]
tensor_input = input[input_name]
tensor_input = np.ascontiguousarray(tensor_input)
tensor_input = np.ascontiguousarray(input[input_name])
if not self._captured:
# Prepare IOBinding with CUDA buffers and let ORT allocate outputs on device
self._io_binding = self._session.io_binding()
self._input_name = input_name
self._output_names = [o.name for o in self._session.get_outputs()]
if not self._prepared:
self._prepare(input_name, tensor_input)
else:
# Replay using updated input
self._input_ortvalue.update_inplace(tensor_input)
self._input_ortvalue = ort.OrtValue.ortvalue_from_numpy(
tensor_input, "cuda", self._cuda_device_id
)
self._io_binding.bind_ortvalue_input(self._input_name, self._input_ortvalue)
for name in self._output_names:
# Bind outputs to CUDA and allow ORT to allocate appropriately
self._io_binding.bind_output(name, "cuda", self._cuda_device_id)
# First IOBinding run to allocate, execute, and capture CUDA Graph
ro = ort.RunOptions()
self._session.run_with_iobinding(self._io_binding, ro)
self._captured = True
return self._io_binding.copy_outputs_to_cpu()
# Replay using updated input, copy results to CPU
self._input_ortvalue.update_inplace(tensor_input)
ro = ort.RunOptions()
self._session.run_with_iobinding(self._io_binding, ro)
return self._io_binding.copy_outputs_to_cpu()
+3 -2
View File
@@ -36,8 +36,9 @@ from frigate.util.time import is_current_hour
logger = logging.getLogger(__name__)
DEFAULT_TIME_LAPSE_FFMPEG_INPUT_ARGS = "-an"
DEFAULT_TIME_LAPSE_FFMPEG_ARGS = "-vf setpts=0.04*PTS -r 30"
TIMELAPSE_DATA_INPUT_ARGS = "-an -skip_frame nokey"
TIMELAPSE_DATA_INPUT_ARGS = "-skip_frame nokey"
# Matches the setpts factor used in timelapse exports (e.g. setpts=0.04*PTS).
# Captures the floating-point factor so we can scale expected duration.
@@ -737,7 +738,7 @@ class RecordingExporter(threading.Thread):
parse_preset_hardware_acceleration_encode(
self.config.ffmpeg.ffmpeg_path,
hwaccel_args,
f"{self.ffmpeg_input_args} -an {ffmpeg_input}".strip(),
f"{self.ffmpeg_input_args} {ffmpeg_input}".strip(),
f"{self.ffmpeg_output_args} -movflags +faststart".strip(),
EncodeTypeEnum.timelapse,
)
+48 -1
View File
@@ -1,10 +1,15 @@
"""Tests for ONNX Runtime session option selection."""
import unittest
from unittest.mock import MagicMock, patch
import numpy as np
import onnxruntime as ort
from frigate.detectors.detection_runners import get_ort_session_options
from frigate.detectors.detection_runners import (
CudaGraphRunner,
get_ort_session_options,
)
from frigate.detectors.detector_config import ModelTypeEnum
from frigate.embeddings.types import EnrichmentModelTypeEnum
@@ -39,3 +44,45 @@ class TestGetOrtSessionOptions(unittest.TestCase):
]:
with self.subTest(model_type=model_type):
self.assertIsNone(get_ort_session_options(model_type))
class TestCudaGraphRunner(unittest.TestCase):
"""CUDA graph capture fails if the arena has to allocate during capture, so
the session is warmed up with capture disabled before the first real run."""
def setUp(self):
self.session = MagicMock()
self.session.get_outputs.return_value = [MagicMock(name="output")]
self.io_binding = self.session.io_binding.return_value
self.input = {"images": np.zeros((1, 3, 320, 320), np.float32)}
def _annotations(self) -> list[str | None]:
"""Graph annotation id passed with each run, None when unset."""
annotations = []
for call in self.session.run_with_iobinding.call_args_list:
try:
annotations.append(call.args[1].get_run_config_entry("gpu_graph_id"))
except RuntimeError:
annotations.append(None)
return annotations
def test_first_run_warms_up_with_capture_disabled(self):
with patch.object(ort.OrtValue, "ortvalue_from_numpy"):
CudaGraphRunner(self.session, 0).run(self.input)
self.assertEqual(
self._annotations(),
["-1"] * CudaGraphRunner.GRAPH_FREE_WARMUP_RUNS + [None],
)
def test_later_runs_allow_capture(self):
with patch.object(ort.OrtValue, "ortvalue_from_numpy"):
runner = CudaGraphRunner(self.session, 0)
runner.run(self.input)
self.session.run_with_iobinding.reset_mock()
runner.run(self.input)
self.assertEqual(self._annotations(), [None])
runner._input_ortvalue.update_inplace.assert_called_once()
+4 -1
View File
@@ -54,8 +54,11 @@ export class FrigateApp {
});
await this.ws.install(this.page);
await this.media.install();
await this.api.install(overrides);
// media goes last so its per-event routes win over the broader
// `**/api/events**` list route, which otherwise answers thumbnail and
// snapshot requests with the events JSON
await this.media.install();
}
/** Navigate to a page. Always call installDefaults() first. */
+3
View File
@@ -52,6 +52,9 @@ function deepMerge<T extends Record<string, unknown>>(
export const BASE_CONFIG = {
...configSnapshot,
version: "0.15.0-test",
// injected by the /config endpoint rather than the Pydantic model, so it
// is absent from the snapshot
plus: { enabled: false },
cameras: {
...configSnapshot.cameras,
front_door: {
+3 -2
View File
@@ -249,8 +249,9 @@ export class MediaMocker {
}),
);
// Event thumbnails
await this.page.route("**/api/events/*/thumbnail.jpg**", (route) =>
// Event thumbnails. The explore grid and detail dialog request .webp,
// everything else requests .jpg.
await this.page.route("**/api/events/*/thumbnail.{jpg,webp}**", (route) =>
route.fulfill({
contentType: "image/png",
body: PLACEHOLDER_PNG,
+68
View File
@@ -263,3 +263,71 @@ test.describe("Explore — mobile @high @mobile", () => {
await expect(searchInput).toBeFocused();
});
});
// ---------------------------------------------------------------------------
// Frigate+ submission — desktop only
// The detail dialog's previous/next arrows only render on desktop.
// ---------------------------------------------------------------------------
test.describe("Explore — Frigate+ submission (desktop) @high", () => {
test.skip(
({ frigateApp }) => frigateApp.isMobile,
"Detail dialog navigation arrows are desktop-only",
);
test("in-flight submission does not mark the next tracked object as submitted", async ({
frigateApp,
}) => {
await frigateApp.installDefaults({ config: { plus: { enabled: true } } });
const page = frigateApp.page;
// Hold the submission open so it is still in flight while the user moves
// on to the next tracked object.
let releaseSubmission: () => void = () => {};
const submissionHeld = new Promise<void>((resolve) => {
releaseSubmission = resolve;
});
let submissions = 0;
await page.route("**/api/events/*/plus", async (route) => {
submissions += 1;
await submissionHeld;
await route.fulfill({ json: { success: true } });
});
await frigateApp.goto("/explore?labels=person");
const firstResult = page.locator("[data-start]").first();
await expect(firstResult).toBeVisible({ timeout: 10_000 });
await firstResult.click();
// The label being confirmed is rendered in a <code> tag inside the
// "Is this object a <label>?" question.
const dialog = page.getByRole("dialog");
await expect(dialog.locator("code")).toHaveText("person");
await dialog.getByRole("button", { name: "Yes", exact: true }).click();
await expect.poll(() => submissions, { timeout: 5_000 }).toBe(1);
await page.getByRole("button", { name: "Next tracked object" }).click();
await expect(dialog.locator("code")).toHaveText("car");
const submissionLanded = page.waitForResponse(/\/api\/events\/.*\/plus/);
releaseSubmission();
await submissionLanded;
// two frames is enough for React to flush the response handler's state
// updates, so the assertions below can't pass by racing ahead of them
await page.evaluate(
() =>
new Promise((resolve) =>
requestAnimationFrame(() => requestAnimationFrame(resolve)),
),
);
// The car was never submitted, so its question must be untouched.
expect(submissions).toBe(1);
await expect(dialog.getByText("Submitted")).toHaveCount(0);
await expect(
dialog.getByRole("button", { name: "Yes", exact: true }),
).toBeVisible();
});
});
+207
View File
@@ -0,0 +1,207 @@
/**
* Debug Replay range selection from History -- HIGH tier.
*
* Covers the "Select from Timeline" flow that Debug Replay shares with
* Export. The other half of the same report, a loading spinner latched
* after Cancel, needs real media: the vod mock serves an empty playlist.
*/
import { test, expect, type FrigateApp } from "../fixtures/frigate-test";
// the selection is seeded around the playback position, so land near the
// live edge
const playbackTime = Math.floor(Date.now() / 1000) - 300;
async function openRecordingView(frigateApp: FrigateApp) {
// The recording view pulls these while the timeline renders; the preview
// server 500s on them, which the error collector would flag.
await frigateApp.page.route("**/api/*/recordings**", (route) =>
route.fulfill({ json: [] }),
);
await frigateApp.page.route("**/api/recordings/unavailable**", (route) =>
route.fulfill({ json: [] }),
);
// inert here; the 0.19 recording view fetches coverage and needs an
// object, so this has to follow the broad recordings route to win
await frigateApp.page.route("**/api/*/recordings/coverage**", (route) =>
route.fulfill({
json: {
spans: [
{
start_time: playbackTime - 3600,
end_time: playbackTime + 600,
streams: ["main"],
},
],
codecs_compatible: true,
streams: {
main: {
video_codec: "h264",
audio_rate: null,
audio_codec: null,
has_audio: false,
bitrate: 2_000_000,
},
},
},
}),
);
await frigateApp.goto(`/review?timestamp=front_door_${playbackTime}`);
}
// desktop reaches Debug Replay through the Actions menu, mobile through
// the settings drawer; both render the same form
async function openDebugReplayForm(frigateApp: FrigateApp) {
if (frigateApp.isMobile) {
await frigateApp.page
.getByRole("button", { name: /filters/i })
.first()
.click({ timeout: 15_000 });
await frigateApp.page
.getByRole("button", { name: /^debug replay$/i })
.click();
} else {
await frigateApp.page
.getByRole("button", { name: /actions/i })
.click({ timeout: 15_000 });
await frigateApp.page
.getByRole("menuitem", { name: /debug replay/i })
.click();
}
const form = frigateApp.page.getByRole("dialog");
await expect(form).toBeVisible({ timeout: 5_000 });
return form;
}
async function selectRangeFromTimeline(frigateApp: FrigateApp) {
const form = await openDebugReplayForm(frigateApp);
await form.getByText("From Timeline").click();
await form.getByRole("button", { name: "Select", exact: true }).click();
await expect(form).toBeHidden({ timeout: 5_000 });
await expect(frigateApp.page.locator(".export-start")).toHaveText(
/\d{1,2}:\d{2}/,
{ timeout: 5_000 },
);
}
// moving the playhead between the two selections is what makes the second
// range differ from the first
async function reselectRange(frigateApp: FrigateApp) {
await selectRangeFromTimeline(frigateApp);
await frigateApp.page
.getByRole("button", { name: /^cancel$/i })
.click({ timeout: 5_000 });
await expect(frigateApp.page.locator(".export-start")).toHaveCount(0);
const segments = frigateApp.page.locator(".segment[data-segment-id]");
const count = await segments.count();
await segments.nth(Math.min(20, count - 1)).click({ force: true });
await selectRangeFromTimeline(frigateApp);
}
// the loop flipped this label between the two ranges ~25 times a second
async function countHandleLabelChanges(frigateApp: FrigateApp) {
return frigateApp.page.evaluate(async () => {
const handle = document.querySelector(".export-start");
if (!handle) {
return -1;
}
let changes = 0;
let last = handle.textContent;
const observer = new MutationObserver(() => {
if (handle.textContent !== last) {
changes += 1;
last = handle.textContent;
}
});
observer.observe(handle, {
subtree: true,
childList: true,
characterData: true,
});
await new Promise((resolve) => setTimeout(resolve, 1500));
observer.disconnect();
return changes;
});
}
test.describe("Debug Replay from History @high", () => {
test("a reselected range lands once and stays put", async ({
frigateApp,
}) => {
if (frigateApp.isMobile) {
test.skip();
return;
}
const pageErrors: string[] = [];
frigateApp.page.on("pageerror", (err) => pageErrors.push(err.message));
await frigateApp.installDefaults();
await openRecordingView(frigateApp);
await reselectRange(frigateApp);
expect(await countHandleLabelChanges(frigateApp)).toBe(0);
expect(
pageErrors.filter((message) => /Maximum update depth/i.test(message)),
).toHaveLength(0);
});
test("dragging a handle after a reselect moves it", async ({
frigateApp,
}) => {
if (frigateApp.isMobile) {
test.skip();
return;
}
await frigateApp.installDefaults();
await openRecordingView(frigateApp);
await reselectRange(frigateApp);
const start = frigateApp.page.locator(".export-start");
const before = (await start.textContent()) ?? "";
const box = await start.boundingBox();
if (!box) {
throw new Error("export start handle has no bounding box");
}
const x = box.x + box.width / 2;
const y = box.y + box.height / 2;
await frigateApp.page.mouse.move(x, y);
await frigateApp.page.mouse.down();
await frigateApp.page.mouse.move(x, y - 90, { steps: 12 });
await frigateApp.page.mouse.up();
await expect(start).not.toHaveText(before, { timeout: 5_000 });
});
});
test.describe("Debug Replay from History — mobile @high @mobile", () => {
test("a reselected range lands once and stays put", async ({
frigateApp,
}) => {
if (!frigateApp.isMobile) {
test.skip();
return;
}
const pageErrors: string[] = [];
frigateApp.page.on("pageerror", (err) => pageErrors.push(err.message));
await frigateApp.installDefaults();
await openRecordingView(frigateApp);
await reselectRange(frigateApp);
expect(await countHandleLabelChanges(frigateApp)).toBe(0);
expect(
pageErrors.filter((message) => /Maximum update depth/i.test(message)),
).toHaveLength(0);
});
});
+1
View File
@@ -27,6 +27,7 @@
<link rel="mask-icon" href="/images/branding/favicon.svg" color="#3b82f7" />
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)" />
<meta name="theme-color" content="#000000" media="(prefers-color-scheme: dark)" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
</head>
<body>
<div id="root"></div>
+1
View File
@@ -27,6 +27,7 @@
<link rel="mask-icon" href="/images/branding/favicon.svg" color="#3b82f7" />
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)" />
<meta name="theme-color" content="#000000" media="(prefers-color-scheme: dark)" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
</head>
<body>
<div id="root"></div>
+1
View File
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
+2 -1
View File
@@ -224,7 +224,8 @@
"ur": "اردو (урду)",
"withSystem": {
"label": "Выкарыстоўваць мову з налад сістэмы"
}
},
"be": "Беларуская"
},
"appearance": "Выгляд",
"darkMode": {
+2 -1
View File
@@ -51,7 +51,8 @@
"ur": "اردو (Urdú)",
"hr": "Hrvatski (croat)",
"bs": "Bosanski (Bosni)",
"zhHant": "繁體中文 (Xinès Tradicional)"
"zhHant": "繁體中文 (Xinès Tradicional)",
"be": "Беларуская (belarús)"
},
"system": "Sistema",
"systemMetrics": "Mètriques del sistema",
+1 -1
View File
@@ -2076,7 +2076,7 @@
},
"lpr": {
"globalDisabled": "L'enriquiment de reconeixement de matrícules ha d'estar habilitat perquè les funcions LPR funcionin en aquesta càmera.",
"vehicleNotTracked": "El reconeixement de la matrícula requereix que es faci un seguiment del 'cotxe' o de la 'motocicleta'.",
"vehicleNotTracked": "El reconeixement de la matrícula requereix un seguiment del vehicle. Habilita el 'cotxe' o un altre tipus de vehicle en Objectes per a aquesta càmera.",
"modelSizeLarge": "El model 'gran' està optimitzat per a matrícules multilínies. El model 'petit' proporciona un millor rendiment sobre 'gran' i s'ha d'utilitzar tret que la vostra regió utilitzi formats de placa multilínia."
},
"record": {
+2 -1
View File
@@ -194,7 +194,8 @@
"id": "Bahasa Indonesia (Indonesisch)",
"hr": "Hrvatski (Kroatisch)",
"bs": "Bosanski (Bosnisch)",
"zhHant": "Traditional Chinese"
"zhHant": "Traditional Chinese",
"be": "Беларуская (Belarussisch)"
},
"appearance": "Erscheinung",
"theme": {
+1 -1
View File
@@ -2116,7 +2116,7 @@
},
"lpr": {
"globalDisabled": "Die Erweiterung zur Kennzeichenerkennung muss aktiviert sein, damit die LPR-Funktionen bei dieser Kamera funktionieren.",
"vehicleNotTracked": "Für die Kennzeichenerkennung muss entweder „Auto“ oder „Motorrad“ erfasst werden. Aktivieren Sie „Auto oder „Motorrad“ unter „Objekte für diese Kamera.",
"vehicleNotTracked": "Die Kennzeichenerkennung erfordert, dass ein Fahrzeug verfolgt wird. Aktiviere Auto oder einen anderen Fahrzeugtyp in den Objekten für diese Kamera.",
"modelSizeLarge": "Das „große“ Modell ist für mehrzeilige Kennzeichen optimiert. Das „kleine“ Modell bietet eine bessere Leistung als das „große“ und sollte verwendet werden, sofern in Ihrer Region keine mehrzeiligen Kennzeichenformate verwendet werden."
},
"record": {
+2 -1
View File
@@ -142,7 +142,8 @@
"ur": "اردو (urdu keel)",
"hr": "Hrvatski (horvaadi keel)",
"bs": "Bosanski (bosnia keel)",
"zhHant": "繁體中文 (hiina keel traditsiooniliste hieroglüüfidega)"
"zhHant": "繁體中文 (hiina keel traditsiooniliste hieroglüüfidega)",
"be": "Беларуская (valgevene keel)"
},
"system": "Süsteem",
"systemMetrics": "Süsteemi meetrika",
+65 -1
View File
@@ -622,7 +622,11 @@
"disabled": "Objektide tuvastamine on lülitatud välja. Hetkepildid, läbivaatamisele kuuluvad objektid ja täiendavad funktsioonid, nagu näotuvastus, sõidukite numbrimärkide tuvastus ja generatiivne tehisintellekt, ei tööta."
},
"lpr": {
"vehicleNotTracked": "Sõidukite numbrimärkide tuvastus eeldab, et auto või mootorratas on jälgitav. Lülita menüüst Objektid sell kaamera jaoks sisse valikud „auto“ või „mootorratas“."
"vehicleNotTracked": "Sõidukite numbrimärkide tuvastus eeldab, et sõiduk on jälgitav. Lülita menüüst Objektid selle kaamera jaoks sisse valik „auto“ või muu sõiduki tüüp."
},
"review": {
"recordDisabled": "Salvestamine on lülitatud välja, ülevaatamseks mõeldud objektid jäävad loomata.",
"detectDisabled": "Objektide tuvastus on lülitatud välja. Ülevaatamisobjektid vajavad tuvastatud objekte, et hoiatusi ja tuvastusi kategooriatesse jaotada."
}
},
"button": {
@@ -650,5 +654,65 @@
"label": "Uus väärtus",
"reset": "Lähtesta"
}
},
"onvif": {
"autotracking": {
"zooming": {
"disabled": "Pole kasutusel",
"absolute": "Absoluutne",
"relative": "Suhteline"
}
},
"profileAuto": "Automaatne",
"profileLoading": "Laadin profiile..."
},
"modelSize": {
"small": "Väike",
"large": "Suur"
},
"logger": {
"logLevel": {
"debug": "Silumisteated",
"info": "Infoteated",
"warning": "Hoiatused",
"error": "Veateated",
"critical": "Kriitilise teated"
}
},
"birdseye": {
"cameraOrder": {
"reorderHandle": "Järjekorra muutmiseks lohista",
"saving": "Salvestan…",
"saved": "Salvestatud"
}
},
"retainMode": {
"all": "Kõik",
"motion": "Liikumine",
"active_objects": "Aktiivsed objektid"
},
"previewQuality": {
"very_high": "Väga kõrge",
"high": "Kõrge",
"medium": "Keskmine",
"low": "Madal",
"very_low": "Väga madal"
},
"ui": {
"timeFormat": {
"browser": "Brauser",
"12hour": "12 tundi",
"24hour": "24 tundi"
},
"unitSystem": {
"metric": "Meetermõõdustik",
"imperial": "Inglise mõõdustik"
}
},
"review": {
"imageSource": {
"recordings": "Salvestused",
"previews": "Eelvaated"
}
}
}
+1 -1
View File
@@ -140,7 +140,7 @@
"saveAll": "Tout enregistrer",
"savingAll": "Enregistrement de tout en cours…",
"undoAll": "Tout annuler",
"applying": "Enregistrement…",
"applying": "Enregistrement …",
"retry": "Réessayer"
},
"menu": {
+1 -1
View File
@@ -146,7 +146,7 @@
"toast": {
"started_one": "Un export a démarré. Ouverture du dossier en cours.",
"started_many": "{{count}} exports ont démarré. Ouverture du dossier en cours.",
"started_other": "{{count}} exports ont démarré. Ouverture du dossier en cours",
"started_other": "{{count}} exports ont démarré. Ouverture du dossier en cours.",
"startedNoCase_one": "Un export a démarré.",
"startedNoCase_many": "{{count}} exports ont démarré.",
"startedNoCase_other": "{{count}} exports ont démarré.",
+60 -1
View File
@@ -493,6 +493,9 @@
"max_concurrent": {
"label": "Nombre maximum d'exports simultanés",
"description": "Nombre maximum de tâches d'exportation à effectuer en même temps."
},
"chapters": {
"label": "Métadonnées des chapitres à incorporer dans les enregistrements exportés"
}
},
"preview": {
@@ -500,7 +503,8 @@
"quality": {
"label": "Prévisualisation qualité",
"description": "Niveau de qualité des prévisualisations (très_bas, bas, moyen, haut, très_haut)."
}
},
"description": "Réglages de la qualité des aperçus d'enregistrement montrés dans l'interface utilisateur."
},
"enabled_in_config": {
"label": "État original de l'enregistrement",
@@ -522,6 +526,61 @@
},
"required_zones": {
"label": "Zones requises"
},
"enabled_in_config": {
"label": "État des alertes originales",
"description": "Vérifie si les alertes étaient initialement activées dans la configuration statique."
},
"cutoff_time": {
"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."
}
},
"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",
"description": "Activer ou désactiver les événements de détection pour cette caméra."
},
"labels": {
"label": "Étiquettes de détection",
"description": "Liste des étiquettes d'objets qui correspondent à des événements de détection."
},
"required_zones": {
"label": "Zones obligatoires",
"description": "Zones dans lesquelles un objet doit pénétrer pour être considéré comme une détection; laisser vide pour autoriser nimporte quelle zone."
},
"cutoff_time": {
"label": "Délai limite de détection",
"description": "Nombre de secondes à attendre après l'absence d'activité susceptible de déclencher une détection avant d'interrompre celle-ci."
},
"enabled_in_config": {
"label": "État initial des détections",
"description": "Vérifie si les détections étaient activées initialement dans la configuration statique."
}
},
"genai": {
"label": "Configuration de l'IA générative",
"description": "Contrôle l'utilisation de l'IA générative pour la production de descriptions et de résumés des éléments d'évaluation.",
"enabled": {
"label": "Activer les descriptions de l'IA générative",
"description": "Activer ou désactiver les descriptions et les résumés générés par l'IA générative pour les éléments à examiner."
},
"alerts": {
"label": "Activer l'IA générative pour les alertes",
"description": "Utilisez l'IA générative pour générer des descriptions pour les éléments d'alerte."
},
"detections": {
"label": "Activer l'IA générative pour les détections",
"description": "Utilisez l'IA générative pour générer des descriptions pour les éléments de détection."
},
"image_source": {
"label": "Source de l'image de la revue",
"description": "Source des images envoyées à l'IA générative (« aperçu » ou « enregistrements »); « enregistrements » utilise des images de meilleure qualité mais plus de jetons d'IA."
},
"additional_concerns": {
"label": "Autres préoccupations"
}
}
}
+63 -2
View File
@@ -199,7 +199,10 @@
}
},
"audio_transcription": {
"label": "Transcription audio"
"label": "Transcription audio",
"enabled": {
"label": "Activer la transcription audio"
}
},
"audio": {
"label": "Détection audio",
@@ -313,6 +316,9 @@
"max_concurrent": {
"label": "Nombre maximum d'exports simultanés",
"description": "Nombre maximum de tâches d'exportation à effectuer en même temps."
},
"chapters": {
"label": "Métadonnées des chapitres à incorporer dans les enregistrements exportés"
}
},
"preview": {
@@ -320,7 +326,8 @@
"quality": {
"label": "Prévisualisation qualité",
"description": "Niveau de qualité des prévisualisations (très_bas, bas, moyen, haut, très_haut)."
}
},
"description": "Réglages de la qualité des aperçus d'enregistrement montrés dans l'interface utilisateur."
},
"enabled_in_config": {
"label": "État original de l'enregistrement",
@@ -340,6 +347,60 @@
},
"required_zones": {
"label": "Zones requises"
},
"enabled_in_config": {
"label": "État des alertes originales",
"description": "Vérifie si les alertes étaient initialement activées dans la configuration statique."
},
"cutoff_time": {
"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."
}
},
"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"
},
"labels": {
"label": "Étiquettes de détection",
"description": "Liste des étiquettes d'objets qui correspondent à des événements de détection."
},
"required_zones": {
"label": "Zones obligatoires",
"description": "Zones dans lesquelles un objet doit pénétrer pour être considéré comme une détection; laisser vide pour autoriser nimporte quelle zone."
},
"cutoff_time": {
"label": "Délai limite de détection",
"description": "Nombre de secondes à attendre après l'absence d'activité susceptible de déclencher une détection avant d'interrompre celle-ci."
},
"enabled_in_config": {
"label": "État initial des détections",
"description": "Vérifie si les détections étaient activées initialement dans la configuration statique."
}
},
"genai": {
"label": "Configuration de l'IA générative",
"description": "Contrôle l'utilisation de l'IA générative pour la production de descriptions et de résumés des éléments d'évaluation.",
"enabled": {
"label": "Activer les descriptions de l'IA générative",
"description": "Activer ou désactiver les descriptions et les résumés générés par l'IA générative pour les éléments à examiner."
},
"alerts": {
"label": "Activer l'IA générative pour les alertes",
"description": "Utilisez l'IA générative pour générer des descriptions pour les éléments d'alerte."
},
"detections": {
"label": "Activer l'IA générative pour les détections",
"description": "Utilisez l'IA générative pour générer des descriptions pour les éléments de détection."
},
"image_source": {
"label": "Source de l'image de la revue",
"description": "Source des images envoyées à l'IA générative (« aperçu » ou « enregistrements »); « enregistrements » utilise des images de meilleure qualité mais plus de jetons d'IA."
},
"additional_concerns": {
"label": "Autres préoccupations"
}
}
}
+1 -1
View File
@@ -37,7 +37,7 @@
"descriptionLabel": "Description"
},
"deleteCase": {
"desc": "Êtes-vous sûr de vouloir supprimer {{caseName}}?",
"desc": "Êtes-vous sûr de vouloir supprimer {{caseName}}?",
"descKeepExports": "Les exports seront disponibles comme exports non catégorisés.",
"deleteExports": "Supprimer aussi les exports"
}
+6 -5
View File
@@ -16,7 +16,8 @@
"globalConfig": "Configuration globale - Frigate",
"cameraConfig": "Configuration de la caméra - Frigate",
"maintenance": "Maintenance - Frigate",
"profiles": "Profils - Frigate"
"profiles": "Profils - Frigate",
"detectorsAndModel": "Détecteurs et modèle - Frigate"
},
"menu": {
"ui": "Interface utilisateur",
@@ -90,7 +91,7 @@
"maintenance": "Maintenance",
"uiSettings": "Paramètres IU",
"profiles": "Profils",
"systemGo2rtcStreams": "Streams go2rtc"
"systemGo2rtcStreams": "Flux go2rtc"
},
"dialog": {
"unsavedChanges": {
@@ -1363,9 +1364,9 @@
"deleteCameraDialog": {
"title": "Supprimer la caméra",
"description": "Supprimer la caméra va supprimer de façon permanente les enregistrements, les objets suivis, et la configuration de la caméra. Tous les streams go2rtc associés à la caméra devront être supprimés manuellement.",
"selectPlaceholder": "Choisir une caméra...",
"confirmTitle": "Êtes-vous sûr?",
"confirmWarning": "Supprimer <strong>\n{{cameraName}}\n</strong> ne peut être annulé.",
"selectPlaceholder": "Choisir une caméra",
"confirmTitle": "Êtes-vous certain?",
"confirmWarning": "La suppression de la caméra <strong>{{cameraName}}</strong> ne peut être annulé.",
"deleteExports": "Supprimer aussi les exports de cette caméra",
"confirmButton": "Suppression permanente",
"success": "Caméra {{cameraName}} supprimée avec succès",
+29 -1
View File
@@ -455,5 +455,33 @@
"basketball_bounce": "Kosárlabda pattogás",
"sine_wave": "Szinusz hullám",
"echo": "Visszhang",
"cacophony": "Kakófónia"
"cacophony": "Kakófónia",
"squish": "Facsarás",
"drip": "Csöpögés",
"pour": "Öntés",
"fill": "Töltödés",
"spray": "permet",
"pump": "Pumpál",
"boiling": "Forr",
"sonar": "hanglokátor",
"whoosh": "suhogás",
"electronic_tuner": "Elektronikus hangoló",
"effects_unit": "Effektmodul",
"chorus_effect": "Kórus-effektus",
"bang": "Bumm",
"slap": "Pofon",
"whack": "Pofon",
"breaking": "Törés",
"whip": "Ostor",
"tearing": "Szakadás",
"ping": "Pattan",
"ding": "Csing",
"squeal": "Visítás",
"creak": "Nyikorgás",
"rustle": "Suhogás",
"whir": "Zúgás",
"shofar": "Sófar",
"clatter": "csörgés",
"sizzle": "Sistergés",
"sidetone": "Mellékhang"
}
@@ -75,5 +75,10 @@
"enabled": {
"label": "Hangról szövegre alakítás engedélyezése"
}
},
"zones": {
"speed_threshold": {
"label": "Minimum sebesség"
}
}
}
+14 -4
View File
@@ -65,7 +65,8 @@
"batchQueuedSuccess_other": "{{count}} ekspor antrian.",
"batchQueueFailed": "Gagal mengantrekan {{total}} ekspor. Kamera yang gagal: {{failedCameras}}",
"error": {
"failed": "Ekspor gagal mengantri: {{error}}"
"failed": "Ekspor gagal mengantri: {{error}}",
"noValidTimeSelected": "Rentang waktu yang dipilih tidak valid"
}
},
"case": {
@@ -114,7 +115,13 @@
"exportingButton": "Mengekspor...",
"caseNamePlaceholder": "Ekspor tinjauan - {{date}}"
},
"queueing": "Mengantrekan Ekspor..."
"queueing": "Mengantrekan Ekspor...",
"fromTimeline": {
"saveExport": "Simpan ektraksi",
"queueingExport": "Antrean Ekspor...",
"previewExport": "Pratinjau Ekspor",
"useThisRange": "Gunakan Rentang Ini"
}
},
"search": {
"saveSearch": {
@@ -138,7 +145,8 @@
}
},
"showStats": {
"label": "Tampilkan statistik streaming"
"label": "Tampilkan statistik streaming",
"desc": "Aktifkan opsi ini untuk menampilkan statistik streaming sebagai overlay pada tampilan kamera."
},
"debugView": "Tampilan Debug"
},
@@ -147,7 +155,9 @@
"label": "Bagikan Cap Waktu",
"title": "Bagikan Cap Waktu",
"custom": "Cap Waktu Kustom",
"button": "Bagikan URL Cap Waktu"
"button": "Bagikan URL Cap Waktu",
"description": "Bagikan URL bertanda waktu sesuai posisi pemutar saat ini atau pilih tanda waktu kustom. Perlu dicatat bahwa ini bukan URL bagikan publik dan hanya dapat diakses oleh pengguna yang memiliki akses ke Frigate dan kamera ini.",
"shareTitle": "Pratinjau Penunjuk Waktu Frigate : {{camera}}"
},
"confirmDelete": {
"title": "Konfirmasi Penghapusan",
+33 -2
View File
@@ -47,11 +47,42 @@
"score": "Skor",
"estimatedSpeed": "Perkiraan Kecepatan {{unit}}",
"features": {
"label": "Fitur"
"label": "Fitur",
"hasSnapshot": "Memiliki Cuplikan",
"hasVideoClip": "Memiliki Klip Video",
"submittedToFrigatePlus": {
"label": "Dikirim ke Frigate+"
}
},
"cameras": {
"all": {
"short": "Kamera"
"short": "Kamera",
"title": "Semua Kamera"
},
"label": "Filter Kamera"
},
"sort": {
"label": "Urutkan",
"dateAsc": "Tanggal (Terlama)",
"dateDesc": "Tanggal (Terbaru)",
"scoreAsc": "Skor Objek (Terendah)",
"scoreDesc": "Skor Objek (Tertinggi)",
"speedAsc": "Estimasi Kecepatan (Terendah)",
"speedDesc": "Estimasi Kecepatan (Tercepat)",
"relevance": "Relevansi"
},
"review": {
"showReviewed": "Tunjukan Pratinjau"
},
"motion": {
"showMotionOnly": "Hanya Tampilkan Gerakan"
},
"explore": {
"settings": {
"title": "Pengaturan",
"defaultView": {
"title": "Tampilan Default"
}
}
}
}
+2 -1
View File
@@ -223,7 +223,8 @@
"ur": "اردو (Urdu)",
"hr": "Hrvatski (Croato)",
"bs": "Bosanski (Bosniaco)",
"zhHant": "繁體中文 (Cinese Tradizionale)"
"zhHant": "繁體中文 (Cinese Tradizionale)",
"be": "Беларуская (Bielorusso)"
},
"darkMode": {
"label": "Modalità scura",
+1 -1
View File
@@ -2182,7 +2182,7 @@
},
"lpr": {
"globalDisabled": "Per il corretto funzionamento delle funzioni LPR (riconoscimento targhe) su questa telecamera, è necessario abilitare la funzione di arricchimento del riconoscimento delle targhe.",
"vehicleNotTracked": "Il riconoscimento della targa richiede che venga tracciato 'automobile' o 'moto'. Abilita 'automobile' o 'moto' nella sezione oggetti per questa telecamera.",
"vehicleNotTracked": "Il riconoscimento della targa richiede che il veicolo sia tracciato. Abilita 'auto' o un altro tipo di veicolo nella sezione Oggetti per questa telecamera.",
"modelSizeLarge": "Il modello 'grande' è ottimizzato per le targhe multilinea. Il modello 'piccolo' offre prestazioni migliori rispetto al modello 'grande' e dovrebbe essere utilizzato a meno che nella vostra regione non siano in vigore formati di targa multilinea."
},
"record": {
+291 -217
View File
@@ -2,16 +2,16 @@
"crying": "울음",
"snoring": "코골이",
"singing": "노래",
"yell": "비명",
"yell": "고함",
"speech": "음성",
"babbling": "옹알이",
"bicycle": "자전거",
"a_capella": "아카펠라",
"accelerating": "가속",
"accelerating": "가속",
"accordion": "아코디언",
"acoustic_guitar": "기타",
"car": "차",
"motorcycle": "원동기",
"acoustic_guitar": "어쿠스틱 기타",
"car": "승용차",
"motorcycle": "오토바이",
"bus": "버스",
"train": "기차",
"boat": "보트",
@@ -22,26 +22,26 @@
"sheep": "양",
"skateboard": "스케이트보드",
"door": "문",
"mouse": "마우스",
"mouse": "생쥐",
"keyboard": "키보드",
"sink": "싱크대",
"blender": "블렌더",
"blender": "믹서기",
"clock": "시계",
"scissors": "가위",
"hair_dryer": "헤어 드라이어",
"hair_dryer": "헤어드라이어",
"toothbrush": "칫솔",
"vehicle": "탈 것",
"vehicle": "탈것",
"animal": "동물",
"bark": "짖는 소리",
"goat": "염소",
"bellow": "포효",
"whoop": "환",
"bellow": "큰 외침",
"whoop": "환",
"whispering": "속삭임",
"laughter": "웃음",
"snicker": "낄낄 웃음",
"snicker": "낄낄거림",
"sigh": "한숨",
"choir": "합창",
"yodeling": "요들",
"yodeling": "요들",
"chant": "성가",
"mantra": "만트라",
"child_singing": "어린이 노래",
@@ -55,271 +55,271 @@
"wheeze": "헐떡임",
"gasp": "헐떡임",
"pant": "거친숨",
"snort": "코골이",
"snort": "코웃음",
"cough": "기침",
"throat_clearing": "목 는 소리",
"throat_clearing": "목 가다듬는 소리",
"sneeze": "재채기",
"sniff": "훌쩍",
"sniff": "훌쩍",
"run": "달리기",
"shuffle": "임의 재생",
"shuffle": "발 끄는 소리",
"footsteps": "발소리",
"chewing": "씹는 소리",
"biting": "는 소리",
"gargling": "가글",
"stomach_rumble": "배 꼬르륵",
"biting": "깨무는 소리",
"gargling": "가글 소리",
"stomach_rumble": "배 꼬르륵 소리",
"burping": "트림",
"camera": "카메라",
"hiccup": "딸꾹질",
"fart": "방귀",
"hands": "손",
"hands": "손 소리",
"finger_snapping": "손가락 튕기기",
"clapping": "박수",
"heartbeat": "심장 박동",
"heart_murmur": "심장 잡음",
"cheering": "환호",
"applause": "환호",
"applause": "박수갈채",
"chatter": "수다",
"crowd": "군중",
"crowd": "군중 소리",
"children_playing": "놀고 있는 아이들",
"pets": "반려동물",
"yip": "깽깽거림",
"howl": "하울링",
"bow_wow": "짖는 소리",
"bow_wow": "멍멍",
"growling": "으르렁거림",
"whimper_dog": "낑낑거림",
"purr": "가르릉거림",
"purr": "골골송",
"meow": "야옹",
"hiss": "하악질",
"caterwaul": "발정기 울음",
"caterwaul": "발정기 고양이 울음",
"livestock": "가축",
"clip_clop": "딸깍딸깍",
"clip_clop": "다각다각 소리",
"neigh": "말 울음소리",
"cattle": "소",
"moo": "음메",
"cowbell": "워낭 소리",
"pig": "돼지",
"oink": "꿀꿀거림",
"bleat": "메에",
"fowl": "",
"oink": "꿀꿀",
"bleat": "매애",
"fowl": "조류",
"chicken": "닭",
"cluck": "닭 울음소리",
"cock_a_doodle_doo": "꼬꼬댁",
"cluck": "꼬꼬댁",
"cock_a_doodle_doo": "꼬끼오",
"turkey": "칠면조",
"gobble": "칠면조 울음소리",
"duck": "오리",
"quack": "오리 울음소리",
"quack": "꽥꽥",
"goose": "거위",
"honk": "거위 울음소리",
"wild_animals": "야생 동물",
"roaring_cats": "맹수 포효",
"roaring_cats": "맹수 포효",
"roar": "포효",
"chirp": "새 울음소리",
"squawk": "지저귐",
"chirp": "새 지저귐",
"squawk": "새의 큰 울음소리",
"pigeon": "비둘기",
"coo": "비둘기 울음소리",
"coo": "구구",
"crow": "까마귀",
"caw": "까마귀 울음소리",
"caw": "까악까악",
"owl": "부엉이",
"hoot": "부엉이 울음소리",
"flapping_wings": "날갯짓",
"flapping_wings": "날갯짓 소리",
"bicycle_bell": "자전거 벨",
"tuning_fork": "소리굽쇠",
"chime": "차임벨",
"wind_chime": "풍경",
"wind_chime": "풍경 소리",
"harmonica": "하모니카",
"steel_guitar": "스틸 기타",
"tapping": "두드림",
"strum": "기타 스트로크",
"tapping": "태핑",
"strum": "스트로크",
"banjo": "밴조",
"sitar": "시타르",
"mandolin": "만돌린",
"zither": "지더",
"zither": "치터",
"ukulele": "우쿨렐레",
"lawn_mower": "잔디깎이",
"chainsaw": "전기톱",
"medium_engine": "중형 엔진",
"heavy_engine": "대형 엔진",
"engine_knocking": "엔진 노킹",
"engine_starting": "엔진 시동",
"idling": "공회전",
"alarm": "알람",
"telephone": "전화",
"telephone_bell_ringing": "전화 소리",
"medium_engine": "중형 엔진 소리",
"heavy_engine": "대형 엔진 소리",
"engine_knocking": "엔진 노킹",
"engine_starting": "시동 소리",
"idling": "공회전 소리",
"alarm": "경보",
"telephone": "전화",
"telephone_bell_ringing": "전화벨 울리는 소리",
"ringtone": "벨소리",
"telephone_dialing": "전화 다이얼",
"telephone_dialing": "전화 다이얼 누르는 소리",
"dial_tone": "발신음",
"cash_register": "금전 등록기",
"cash_register": "계산대 소리",
"printer": "프린터",
"single-lens_reflex_camera": "카메라 셔터",
"tools": "도구들",
"hammer": "망치",
"jackhammer": "착암기",
"sawing": "톱질",
"filing": "연마",
"sanding": "사포질",
"power_tool": "전동 도구",
"drill": "드릴",
"explosion": "폭발",
"gunshot": "총소리",
"machine_gun": "기관총",
"fusillade": "연속 총성",
"artillery_fire": "포격",
"cap_gun": "화약 총",
"fireworks": "불꽃놀이",
"firecracker": "폭죽",
"car_alarm": "차 경보",
"power_windows": "전동 창문",
"single-lens_reflex_camera": "DSLR 셔터",
"tools": "공구 소리",
"hammer": "망치질 소리",
"jackhammer": "착암기 소리",
"sawing": "톱질 소리",
"filing": "줄질 소리",
"sanding": "사포질 소리",
"power_tool": "전동 공구 소리",
"drill": "드릴 소리",
"explosion": "폭발",
"gunshot": "총",
"machine_gun": "기관총 소리",
"fusillade": "일제 사격 소리",
"artillery_fire": "포격 소리",
"cap_gun": "화약총 소리",
"fireworks": "폭죽 터지는 소리",
"firecracker": "폭죽 소리",
"car_alarm": "자동차 경보",
"power_windows": "전동 파워 윈도우 소리",
"dogs": "개",
"rats": "쥐",
"insect": "벌래",
"rats": "쥐",
"insect": "곤충",
"mosquito": "모기",
"fly": "파리",
"fly": "날벌레",
"frog": "개구리",
"snake": "뱀",
"music": "음악",
"musical_instrument": "악기",
"guitar": "기타",
"electric_guitar": "전기기타",
"electric_guitar": "일렉트릭 기타",
"bass_guitar": "베이스 기타",
"piano": "피아노",
"electric_piano": "전자 피아노",
"organ": "오르간",
"drum_kit": "드럼 키트",
"drum": "드럼",
"maraca": "마라카",
"maraca": "마라카",
"marimba": "마림바",
"orchestra": "오케스트라",
"trumpet": "트럼펫",
"trombone": "트본",
"trombone": "트본",
"violin": "바이올린",
"cello": "첼로",
"flute": "플루트",
"saxophone": "소폰",
"saxophone": "소폰",
"clarinet": "클라리넷",
"harp": "하프",
"bell": "벨",
"jingle_bell": "징글 벨",
"jingle_bell": "방울 소리",
"bagpipes": "백파이프",
"pop_music": "팝뮤직",
"hip_hop_music": "힙팝 뮤직",
"pop_music": "팝 음악",
"hip_hop_music": "힙합 음악",
"beatboxing": "비트박스",
"rock_music": "록 뮤직",
"rock_music": "록 음악",
"punk_rock": "펑크 록",
"rock_and_roll": "록엔 롤",
"rock_and_roll": "로큰롤",
"rhythm_and_blues": "R&B",
"soul_music": "소울 뮤직",
"swing_music": "스윙 뮤직",
"bluegrass": "블루그스",
"jazz": "즈",
"soul_music": "소울 음악",
"swing_music": "스윙 음악",
"bluegrass": "블루그스",
"jazz": "즈",
"disco": "디스코",
"classical_music": "클식 음악",
"classical_music": "클식 음악",
"opera": "오페라",
"techno": "테크노",
"electronic_dance_music": "Electronic Dance Music(EDM)",
"blues": "블루",
"music_for_children": "유아동 음악",
"electronic_dance_music": "EDM",
"blues": "블루",
"music_for_children": "어린이 음악",
"background_music": "배경음악(BGM)",
"soundtrack_music": "사운드트렉 음악",
"soundtrack_music": "사운드트",
"lullaby": "자장가",
"christmas_music": "크리스마스 음악",
"steam": "증기",
"fire": "화재",
"christmas_music": "크리스마스 캐럴",
"steam": "증기 소리",
"fire": "불소리",
"motorboat": "모터보트",
"ship": "선박",
"motor_vehicle": "자동차",
"race_car": "경주용 자동차",
"race_car": "레이싱 카",
"truck": "트럭",
"air_brake": "에어 브레이크",
"reversing_beeps": "후진 경음",
"ice_cream_truck": "아이스크림 트럭",
"reversing_beeps": "후진 경음",
"ice_cream_truck": "아이스크림 트럭 음악",
"emergency_vehicle": "긴급 차량",
"police_car": "경찰차",
"ambulance": "구급차",
"fire_engine": "소방차",
"rail_transport": "철도 운송",
"railroad_car": "철도 차량",
"rail_transport": "철도",
"railroad_car": "기차 칸",
"subway": "지하철",
"aircraft": "비행기",
"aircraft_engine": "항공기 엔진",
"jet_engine": "제트 엔진",
"propeller": "프로펠러",
"aircraft": "항공기",
"aircraft_engine": "항공기 엔진 소리",
"jet_engine": "제트 엔진 소리",
"propeller": "프로펠러 소리",
"helicopter": "헬리콥터",
"fixed-wing_aircraft": "고정익 항공기",
"engine": "엔진",
"light_engine": "라이트 엔진",
"fixed-wing_aircraft": "고정익 비행기",
"engine": "엔진 소리",
"light_engine": "소형 엔진 소리",
"doorbell": "초인종",
"ding-dong": "딩동",
"sliding_door": "슬라이딩 도어",
"knock": "노크",
"tap": "",
"cupboard_open_or_close": "찬장 열기 또는 닫기",
"drawer_open_or_close": "서랍 열기 또는 닫기",
"microwave_oven": "전자 레인지",
"sliding_door": "미닫이문",
"knock": "노크 소리",
"tap": "두드리는 소리",
"cupboard_open_or_close": "찬장 여닫는 소리",
"drawer_open_or_close": "서랍 여닫는 소리",
"microwave_oven": "전자레인지",
"water_tap": "수도꼭지",
"bathtub": "목욕통",
"toilet_flush": "변기 물내",
"electric_toothbrush": "전동 솔",
"vacuum_cleaner": "진공 청소기",
"zipper": "지퍼",
"coin": "동전",
"electric_shaver": "전면도기",
"typing": "타이핑",
"bathtub": "욕조",
"toilet_flush": "변기 물내리는 소리",
"electric_toothbrush": "전동 솔",
"vacuum_cleaner": "진공청소기",
"zipper": "지퍼 여닫는 소리",
"coin": "동전 부딪치는 소리",
"electric_shaver": "전면도기",
"typing": "타자 소리",
"typewriter": "타자기",
"computer_keyboard": "컴퓨터 키보드",
"alarm_clock": "알람 시계",
"siren": "사이렌",
"civil_defense_siren": "민방위 경보 사이렌",
"civil_defense_siren": "민방위 경보",
"buzzer": "버저",
"fire_alarm": "화재 경보(기)",
"whistle": "휘슬",
"ratchet": "라쳇",
"tick": "",
"tick-tock": "틱톡",
"gears": "기어",
"pulleys": "도르래",
"sewing_machine": "미싱기",
"air_conditioning": "A/C",
"eruption": "분화",
"boom": "",
"wood": "나무",
"splinter": "가시",
"glass": "유리",
"silence": "침묵",
"sound_effect": "효과 음",
"environmental_noise": "환경 소음",
"fire_alarm": "화재경보",
"whistle": "호루라기",
"ratchet": "라쳇 소리",
"tick": "똑딱 소리",
"tick-tock": "똑딱똑딱",
"gears": "톱니바퀴 소리",
"pulleys": "도르래 소리",
"sewing_machine": "재봉틀",
"air_conditioning": "에어컨 소리",
"eruption": "분화 소리",
"boom": "쿵 하는 소리",
"wood": "나무 부딪치는 소리",
"splinter": "나무 쪼개지는 소리",
"glass": "유리 소리",
"silence": "무음",
"sound_effect": "효과음",
"environmental_noise": "주변 환경 소음",
"white_noise": "백색 소음",
"pink_noise": "핑크 노이즈",
"television": "텔레비젼(TV)",
"radio": "라디오",
"splash": "스플레쉬",
"spray": "스프레이",
"pump": "펌프",
"arrow": "화살",
"electronic_tuner": "전자 튜너",
"smash": "스메쉬",
"clicking": "클릭킹",
"television": "텔레비전 소리",
"radio": "라디오 소리",
"splash": "첨벙거리는 소리",
"spray": "스프레이 분사음",
"pump": "펌프 소리",
"arrow": "화살 날아가는 소리",
"electronic_tuner": "전자 조율기",
"smash": "박살 나는 소리",
"clicking": "딸깍거리는 소리",
"noise": "소음",
"mains_hum": "험 노이즈",
"outside": "외",
"mains_hum": "전원 험 노이즈",
"outside": "외",
"reggae": "레게",
"french_horn": "프렌치 호른",
"traffic_noise": "교통 소음",
"rain": "",
"raindrop": "빗방울",
"rain_on_surface": "표면에 ",
"stream": "개울 하천",
"wedding_music": "웨딩 음악",
"harmonic": "하모닉",
"ocean": "오션",
"vibration": "진동",
"new-age_music": "뉴 에이지 음악",
"rain": "빗소리",
"raindrop": "빗방울 소리",
"rain_on_surface": "표면에 떨어지는 빗소리",
"stream": "개울물 소리",
"wedding_music": "결혼식 음악",
"harmonic": "하모닉",
"ocean": "바다 소리",
"vibration": "진동",
"new-age_music": "뉴에이지 음악",
"tubular_bells": "튜블러 벨",
"middle_eastern_music": "중동 음악",
"mechanical_fan": "기계식 팬",
"angry_music": "앵그리 뮤직",
"rattle": "방울",
"water": "물",
"waterfall": "폭포",
"mechanical_fan": "선풍기 소리",
"angry_music": "격렬한 음악",
"rattle": "덜그럭거리는 소리",
"water": "물소리",
"waterfall": "폭포 소리",
"music_of_asia": "아시아 음악",
"brass_instrument": "금관악기",
"folk_music": "포크 음악",
@@ -334,95 +334,169 @@
"flamenco": "플라멩코",
"bass_drum": "베이스 드럼",
"thunderstorm": "뇌우",
"thunder": "우뢰",
"thunder": "천둥",
"vibraphone": "비브라폰",
"synthesizer": "신디사이저",
"smoke_detector": "연기 감지기",
"busy_signal": "통화 중 신호",
"shuffling_cards": "카드 섞",
"train_whistle": "기차 경적 소리",
"busy_signal": "통화 중 신호",
"shuffling_cards": "카드 섞는 소리",
"train_whistle": "기차 호루라기 소리",
"traditional_music": "전통 음악",
"independent_music": "인디 음악",
"song": "노래",
"theme_music": "테마 음악",
"house_music": "하우스 뮤직",
"beep": "삑",
"ping": "핑",
"dance_music": "트랜스 음악",
"whale_vocalization": "고래 울음소리",
"house_music": "하우스 음악",
"beep": "삑 소리",
"ping": "핑 소리",
"dance_music": "스 음악",
"whale_vocalization": "고래 소리",
"music_of_bollywood": "볼리우드 음악",
"ska": "스카(Ska)",
"ska": "스카",
"train_horn": "기차 경적",
"wind_instrument": "관악기",
"funk": "펑키 재즈",
"glockenspiel": "카리용",
"waves": "파도",
"tabla": "판자",
"ding": "딩",
"chorus_effect": "코러스 효과",
"basketball_bounce": "농구공 튕김",
"funk": "펑",
"glockenspiel": "글로켄슈필",
"waves": "파도 소리",
"tabla": "타블라",
"ding": "딩동 소리",
"chorus_effect": "코러스 이펙트",
"basketball_bounce": "농구공 튀기는 소리",
"air_horn": "에어혼",
"hi_hat": "하이햇",
"cacophony": "불협화음",
"cacophony": "불협화음 소음",
"drum_machine": "드럼 머신",
"drum_and_bass": "드럼 앤 베이스",
"drum_roll": "드럼 롤",
"echo": "에코",
"heavy_metal": "헤비메탈",
"progressive_rock": "프로그레시브 록",
"cricket": "크리켓(귀뚜라미)",
"music_of_latin_america": "라틴 아메리카 음악",
"cricket": "귀뚜라미",
"music_of_latin_america": "라틴 음악",
"sampler": "샘플러",
"hammond_organ": "해먼드 오르간",
"theremin": "테레민",
"shofar": "쇼파르",
"mechanisms": "메커니즘",
"pulse": "펄스",
"liquid": "액체",
"squish": "으깨다",
"effects_unit": "이펙트 유닛",
"shofar": "쇼파르(양각 나팔)",
"mechanisms": "기계 장치",
"pulse": "펄스",
"liquid": "액체 소리",
"squish": "질척거리는 소리",
"effects_unit": "이펙",
"christian_music": "기독교 음악",
"gospel_music": "가스펠 음악",
"gospel_music": "가스펠",
"dubstep": "덥스텝",
"double_bass": "더블베이스 (콘트라베이스)",
"wind": "바람",
"wood_block": "나무 블록",
"double_bass": "콘트라베이스",
"wind": "바람 소리",
"wood_block": "우드블록",
"country": "컨트리 음악",
"cutlery": "식기류",
"cutlery": "수저 부딪치는 소리",
"afrobeat": "아프로비트",
"trance_music": "트랜스 음악",
"percussion": "타악기",
"electronic_music": "전자 음악",
"hum": "",
"zing": "",
"boing": "보잉",
"crunch": "크런치",
"sine_wave": "사인파",
"gurgling": "꿀꺽꿀꺽",
"hum": "웅웅거리는 험 노이즈",
"zing": "핑 날아가는 소리",
"boing": "용수철 뿅 소리",
"crunch": "바삭거리는 소리",
"sine_wave": "사인파",
"gurgling": "졸졸 흐르는 소리",
"electronic_organ": "전자 오르간",
"grunge": "그런지",
"pizzicato": "꼬집다",
"pizzicato": "피치카토",
"carnatic_music": "카르나틱 음악",
"cymbal": "심벌즈",
"harpsichord": "하프시코드",
"plucked_string_instrument": "뜯어서 연주하는 현악기",
"happy_music": "행복한 음악",
"plucked_string_instrument": "현악기",
"happy_music": "밝은 음악",
"rustling_leaves": "바스락거리는 나뭇잎",
"wind_noise": "바람 소리",
"wind_noise": "풍절음",
"tire_squeal": "타이어 마찰음",
"buzz": "버저 소리",
"foghorn": "포그혼",
"buzz": "윙윙거리는 소리",
"foghorn": "무무표지(안개 경적)",
"vocal_music": "보컬 음악",
"chirp_tone": "짹짹거리는 소리",
"plop": "퐁당",
"keys_jangling": "딸랑거리는 열쇠 꾸러미",
"chirp_tone": "전자 짹짹음",
"plop": "퐁당 소리",
"keys_jangling": "열쇠 흔들리는 소리",
"didgeridoo": "디저리두",
"tender_music": "Tender 음악",
"tender_music": "부드러운 음악",
"electronica": "일렉트로니카",
"exciting_music": "신나는 음악",
"bang": "쾅",
"slap": "슬랩",
"video_game_music": "비디오 게임 음악",
"sad_music": "Sad 음악",
"scary_music": "스카이 음악"
"bang": "쾅 소리",
"slap": "찰싹 때리는 소리",
"video_game_music": "게임 음악",
"sad_music": "슬픈 음악",
"scary_music": "공포 음악",
"squeal": "끼익 비명/마찰음",
"clatter": "달그락거리는 소리",
"sidetone": "측음",
"slosh": "출렁거리는 소리",
"sonar": "소나(음파 탐지기)",
"patter": "톡톡 두드리는 소리",
"inside": "실내",
"rimshot": "림샷",
"dishes": "식기 달그락거리는 소리",
"crack": "쩍 갈라지는 소리",
"burst": "파열음",
"croak": "개구리 울음소리",
"gong": "징",
"steelpan": "스틸팬",
"bowed_string_instrument": "찰현악기",
"string_section": "현악 섹션",
"church_bell": "교회 종소리",
"singing_bowl": "싱잉볼",
"scratching": "스크래칭",
"psychedelic_rock": "사이케델릭 록",
"crackle": "타닥거리는 소리",
"sailboat": "돛단배",
"rowboat": "노 젓는 배",
"toot": "빵빵 소리",
"skidding": "미끄러지는 소리",
"car_passing_by": "지나가는 차 소리",
"train_wheels_squealing": "기차 바퀴 마찰음",
"dental_drill's_drill": "치과용 드릴",
"slam": "쾅 닫는 소리",
"squeak": "찍찍거리는 소리",
"chopping": "도마 칼질 소리",
"frying": "튀기는 소리",
"writing": "글씨 쓰는 소리",
"steam_whistle": "증기 호각",
"chop": "장작 패는 소리",
"chink": "짤랑거리는 소리",
"shatter": "유리 와장창 깨지는 소리",
"static": "지지직거리는 잡음",
"field_recording": "현장 녹음 소리",
"scream": "외마디 비명",
"chird": "새소리",
"change_ringing": "타종 소리",
"drip": "똑똑 떨어지는 소리",
"pour": "콸콸 붓는 소리",
"trickle": "졸졸 흐르는 소리",
"gush": "솟구치는 소리",
"fill": "물 차오르는 소리",
"stir": "휘젓는 소리",
"boiling": "보글보글 끓는 소리",
"whoosh": "쉭 지나가는 소리",
"thump": "털썩 하는 소리",
"thunk": "퍽 하는 소리",
"whack": "탁 치는 소리",
"breaking": "부서지는 소리",
"bouncing": "통통 튀는 소리",
"whip": "채찍 소리",
"flap": "펄럭이는 소리",
"scratch": "긁는 소리",
"scrape": "끼익 긁히는 소리",
"rub": "문지르는 소리",
"roll": "데굴데굴 굴러가는 소리",
"crushing": "으스러지는 소리",
"crumpling": "구겨지는 소리",
"tearing": "찢어지는 소리",
"clang": "쨍그랑 소리",
"creak": "삐걱거리는 소리",
"rustle": "바스락거리는 소리",
"whir": "붕붕거리는 소리",
"sizzle": "지글지글 소리",
"clickety_clack": "덜컹덜컹 소리",
"rumble": "우르릉거리는 소리",
"reverberation": "잔향음",
"distortion": "왜곡(디스토션)",
"throbbing": "두근거리는 맥박음"
}
+67 -61
View File
@@ -2,39 +2,39 @@
"readTheDocumentation": "문서 읽기",
"time": {
"untilForTime": "{{time}}까지",
"untilForRestart": "Frigate가 재시작될 때 까지.",
"untilForRestart": "Frigate가 재시작될 때까지.",
"10minutes": "10분",
"12hours": "12시간",
"1hour": "1시간",
"24hours": "24시간",
"30minutes": "30분",
"5minutes": "5분",
"untilRestart": "재시작 될 때까지",
"untilRestart": "재시작될 때까지",
"ago": "{{timeAgo}} 전",
"justNow": "방금",
"justNow": "방금",
"today": "오늘",
"yesterday": "어제",
"last7": "최근 7일",
"last14": "최근 14일",
"last30": "최근 30일",
"thisWeek": "이번 주",
"lastWeek": "저번 주",
"lastWeek": "지난 주",
"thisMonth": "이번 달",
"lastMonth": "저번 달",
"lastMonth": "지난 달",
"pm": "오후",
"am": "오전",
"yr": "{{time}}년",
"year_other": "{{time}} 년",
"mo": "{{time}}월",
"month_other": "{{time}} 월",
"year_other": "{{time}}년",
"mo": "{{time}}월",
"month_other": "{{time}}월",
"d": "{{time}}일",
"day_other": "{{time}} 일",
"h": "{{time}}시",
"hour_other": "{{time}} 시",
"day_other": "{{time}}일",
"h": "{{time}}시",
"hour_other": "{{time}}시",
"m": "{{time}}분",
"minute_other": "{{time}} 분",
"minute_other": "{{time}}분",
"s": "{{time}}초",
"second_other": "{{time}} 초",
"second_other": "{{time}}초",
"formattedTimestamp": {
"12hour": "MMM d, h:mm:ss aaa",
"24hour": "MMM d, HH:mm:ss"
@@ -68,7 +68,7 @@
"12hour": "MM-dd-yy-h-mm-ss-a",
"24hour": "MM-dd-yy-HH-mm-ss"
},
"never": "한 번도 없음",
"never": "안 함",
"inProgress": "진행 중",
"invalidStartTime": "잘못된 시작 시간",
"invalidEndTime": "잘못된 종료 시간"
@@ -76,25 +76,25 @@
"notFound": {
"title": "404",
"documentTitle": "찾을 수 없음 - Frigate",
"desc": "페이지 찾을 수 없"
"desc": "페이지 찾을 수 없습니다"
},
"accessDenied": {
"title": "접근 거부",
"documentTitle": "접근 거부 - Frigate",
"desc": "이 페이지 접근 권한이 없습니다."
"desc": "이 페이지를 볼 수 있는 권한이 없습니다."
},
"menu": {
"user": {
"account": "계정",
"title": "사용자",
"current": "현재 사용자:{{user}}",
"current": "현재 사용자: {{user}}",
"anonymous": "익명",
"logout": "로그아웃",
"setPassword": "비밀번호 설정"
},
"system": "시스템",
"systemMetrics": "시스템 지표",
"configuration": "설정",
"configuration": "설정 구성",
"systemLogs": "시스템 로그",
"settings": "설정",
"configurationEditor": "설정 편집기",
@@ -103,7 +103,7 @@
"en": "English (영어)",
"es": "Español (스페인어)",
"zhCN": "简体中文 (중국어 간체)",
"hi": "हिन्दी (힌어)",
"hi": "हिन्दी (힌어)",
"fr": "Français (프랑스어)",
"ar": "العربية (아랍어)",
"pt": "Português (포르투갈어)",
@@ -117,7 +117,7 @@
"sv": "Svenska (스웨덴어)",
"cs": "Čeština (체코어)",
"nb": "Norsk Bokmål (노르웨이어 보크몰)",
"ko": "한국어",
"ko": "한국어 (Korean)",
"vi": "Tiếng Việt (베트남어)",
"fa": "فارسی (페르시아어)",
"pl": "Polski (폴란드어)",
@@ -126,7 +126,7 @@
"el": "Ελληνικά (그리스어)",
"ro": "Română (루마니아어)",
"hu": "Magyar (헝가리어)",
"fi": "Suomi (Finnish)",
"fi": "Suomi (핀란드어)",
"da": "Dansk (덴마크어)",
"sk": "Slovenčina (슬로바키아어)",
"yue": "粵語 (광둥어)",
@@ -140,9 +140,12 @@
"id": "Bahasa Indonesia (인도네시아어)",
"ur": "اردو (우르두어)",
"withSystem": {
"label": "시스템 설정 언어 사용"
"label": "시스템 언어 설정 사용"
},
"hr": "Hrvatski (크로아티아어)"
"hr": "Hrvatski (크로아티아어)",
"zhHant": "繁體中文 (중국어 번체)",
"be": "Беларуская (벨라루스어)",
"bs": "Bosanski (보스니아어)"
},
"appearance": "화면 설정",
"darkMode": {
@@ -150,17 +153,17 @@
"light": "라이트",
"dark": "다크",
"withSystem": {
"label": "시스템 설정에 따라 설정"
"label": "시스템 설정에 따라 라이트/다크 모드 전환"
}
},
"withSystem": "시스템",
"theme": {
"label": "테마",
"blue": "파랑",
"green": "녹색",
"green": "초록",
"nord": "노드 (Nord)",
"red": "빨강",
"highcontrast": "고 대비",
"highcontrast": "고대비",
"default": "기본값"
},
"help": "도움말",
@@ -174,17 +177,17 @@
"allCameras": "모든 카메라",
"cameras": {
"title": "카메라",
"count_other": "{{count}} 카메라"
"count_other": "{{count}} 카메라"
}
},
"review": "다시보기",
"explore": "탐색",
"export": "내보내기",
"uiPlayground": "UI 실험실",
"uiPlayground": "UI 플레이그라운드",
"faceLibrary": "얼굴 라이브러리",
"classification": "분류",
"chat": "채팅",
"actions": "작",
"actions": "작",
"profiles": "프로필",
"features": "기능"
},
@@ -210,14 +213,14 @@
"back": "뒤로",
"hide": "{{item}} 숨기기",
"show": "{{item}} 표시",
"ID": "아이디",
"ID": "ID",
"none": "없음",
"all": "전체",
"other": "그 외"
"other": "기타"
},
"button": {
"apply": "적용",
"reset": "리셋",
"reset": "재설정",
"done": "완료",
"enabled": "활성화됨",
"enable": "활성화",
@@ -229,38 +232,38 @@
"close": "닫기",
"copy": "복사",
"back": "뒤로",
"history": "히스토리",
"history": "기록",
"fullscreen": "전체화면",
"exitFullscreen": "전체화면 나가기",
"pictureInPicture": "화면 속 화면",
"twoWayTalk": "양방향 말하기",
"exitFullscreen": "전체화면 종료",
"pictureInPicture": "화면 속 화면 (PIP)",
"twoWayTalk": "양방향 대화",
"cameraAudio": "카메라 오디오",
"on": "켜",
"off": "끄기",
"edit": "편집",
"copyCoordinates": "코디네이트 복사",
"on": "켜",
"off": "꺼짐",
"edit": "수정",
"copyCoordinates": "좌표 복사",
"delete": "삭제",
"yes": "예",
"no": "아니오",
"download": "다운로드",
"info": "정보",
"suspended": "일시 지됨",
"suspended": "일시 지됨",
"unsuspended": "재개",
"play": "재생",
"unselect": "선택 해제",
"export": "내보내기",
"deleteNow": "바로 삭제하기",
"deleteNow": "지금 삭제",
"next": "다음",
"add": "추가",
"undo": "실행 취소",
"copiedToClipboard": "클립보드에 복사",
"continue": "계속하기",
"copiedToClipboard": "클립보드에 복사",
"continue": "계속",
"modified": "수정됨",
"overridden": "재정의됨",
"resetToGlobal": "글로벌 설정으로 재설정",
"resetToDefault": "기본값으로 재설정",
"resetToGlobal": "전역 설정으로 초기화",
"resetToDefault": "기본값으로 초기화",
"saveAll": "모두 저장",
"savingAll": "모두 저장 중. …",
"savingAll": "모두 저장 중…",
"undoAll": "모두 실행 취소",
"applying": "적용 중…",
"retry": "재시도"
@@ -270,8 +273,8 @@
"save": {
"title": "저장",
"error": {
"title": "설정 저장 실패: {{errorMessage}}",
"noMessage": "설정 저장 실패했습니다"
"title": "설정 변경 저장 실패: {{errorMessage}}",
"noMessage": "설정 변경 저장 실패했습니다"
},
"success": "설정 변경이 성공적으로 저장되었습니다."
}
@@ -279,34 +282,37 @@
"role": {
"title": "역할",
"admin": "관리자",
"viewer": "감시자",
"desc": "관리자는 Frigate UI 모든 접근 권한이 있습니다. 감시자는 카메라 감시, 돌아보기, 과거 영상 조회만 가능합니다."
"viewer": "뷰어",
"desc": "관리자는 Frigate UI 모든 기능에 대한 전체 접근 권한을 가집니다. 뷰어는 카메라 실시간 화면, 다시보기 항목, 이전 녹화 영상 조회만 가능합니다."
},
"pagination": {
"label": "페이지 번호",
"label": "페이지 매김",
"previous": {
"title": "이전",
"label": "이전 페이지"
"label": "이전 페이지로 이동"
},
"next": {
"title": "다음",
"label": "다음 페이지"
"label": "다음 페이지로 이동"
},
"more": "더 많은 페이지"
"more": "페이지 더보기"
},
"selectItem": "{{item}} 선택",
"information": {
"pixels": "{{area}}px"
},
"list": {
"two": "{{0}} {{1}}",
"many": "{{items}} 그리고 {{last}}",
"two": "{{0}} {{1}}",
"many": "{{items}} {{last}}",
"separatorWithSpace": ", "
},
"field": {
"optional": "선택",
"internalID": "Frigate 내부 ID는 구성 및 데이터베이스에서 사용됩니다"
"optional": "선택 사항",
"internalID": "Frigate 설정 및 데이터베이스에서 사용되는 내부 ID"
},
"no_items": "내역 없음",
"validation_errors": "검증 오류"
"no_items": "항목 없음",
"validation_errors": "유효성 검사 오류",
"credentialField": {
"savedPlaceholder": "저장됨 — 현재 값을 유지하려면 비워 두세요"
}
}
+8 -8
View File
@@ -1,16 +1,16 @@
{
"form": {
"user": "사용자",
"user": "사용자 이름",
"password": "비밀번호",
"login": "로그인",
"errors": {
"usernameRequired": "사용자명은 필수입니다",
"passwordRequired": "비밀번호는 필수입니다",
"rateLimit": "너무 많이 시도했습니다. 다음에 다시 시도하세요.",
"loginFailed": "로그인 실패",
"unknownError": "알려지지 않은 에러. 로그를 확인하세요.",
"webUnknownError": "알려지지 않은 에러. 콘솔 로그를 확인하세요."
"usernameRequired": "사용자 이름을 입력해야 합니다",
"passwordRequired": "비밀번호를 입력해야 합니다",
"rateLimit": "요청 횟수 제한을 초과했습니다. 잠시 후 다시 시도하세요.",
"loginFailed": "로그인 실패했습니다",
"unknownError": "알 수 없는 오류가 발생했습니다. 로그를 확인하세요.",
"webUnknownError": "알 수 없는 오류가 발생했습니다. 콘솔 로그를 확인하세요."
},
"firstTimeLogin": "처음 로그인하시나요? 로그인 정보는 Frigate 로그에 있습니다."
"firstTimeLogin": "처음 로그인하시나요? 초기 로그인 정보는 Frigate 로그에 출력되어 있습니다."
}
}
+29 -26
View File
@@ -2,86 +2,89 @@
"group": {
"label": "카메라 그룹",
"add": "카메라 그룹 추가",
"edit": "카메라 그룹 편집",
"edit": "카메라 그룹 수정",
"delete": {
"label": "카메라 그룹 삭제",
"confirm": {
"title": "삭제 확인",
"desc": "정말로 카메라 그룹을 삭제하시겠습니까 <em>{{name}}</em>?"
"desc": "정말로 <em>{{name}}</em> 카메라 그룹을 삭제하시겠습니까?"
}
},
"name": {
"label": "이름",
"placeholder": "이름을 입력하세요…",
"errorMessage": {
"mustLeastCharacters": "카메라 그룹 이름은 최소 2자 이상 써야합니다.",
"mustLeastCharacters": "카메라 그룹 이름은 최소 2자 이상이어야 합니다.",
"exists": "이미 존재하는 카메라 그룹 이름입니다.",
"nameMustNotPeriod": "카메라 그룹 이름에 마침표(.)를 넣을 수 없습니다.",
"invalid": "설정 불가능한 카메라 그룹 이름."
"nameMustNotPeriod": "카메라 그룹 이름에 마침표(.)를 포함할 수 없습니다.",
"invalid": "유효하지 않은 카메라 그룹 이름입니다."
}
},
"cameras": {
"label": "카메라",
"desc": "이 그룹에 넣을 카메라 선택하."
"desc": "이 그룹에 포함할 카메라 선택하세요."
},
"icon": "아이콘",
"success": "카메라 그룹 {{name}} 저장되었습니다.",
"success": "카메라 그룹({{name}})이(가) 저장되었습니다.",
"camera": {
"birdseye": "버드아이",
"setting": {
"label": "카메라 스트리밍 설정",
"title": "{{cameraName}} 스트리밍 설정",
"desc": "카메라 그룹 대시보드의 실시간 스트리밍 옵션을 변경하세요. <em>이 설정은 기기/브라우저에 따라 다릅니다.</em>",
"audioIsAvailable": "이 카메라는 오디오 기능을 사용할 수 있습니다",
"audioIsUnavailable": "이 카메라는 오디오 기능을 사용할 수 없습니다",
"desc": "카메라 그룹 대시보드의 실시간 스트리밍 옵션을 변경합니다. <em>이 설정은 기기브라우저별로 개별 적용됩니다.</em>",
"audioIsAvailable": "이 스트림에서 오디오 기능을 사용할 수 있습니다",
"audioIsUnavailable": "이 스트림에서는 오디오 기능을 사용할 수 없습니다",
"audio": {
"tips": {
"title": "오디오를 출력하려면 카메라 지원하거나 go2rtc에서 설정해야합니다."
"title": "오디오를 출력하려면 카메라 자체에서 오디오를 지원하 go2rtc에 해당 스트림이 설정되어 있어야 합니다."
}
},
"stream": "스트림",
"placeholder": "스트림 선택",
"streamMethod": {
"label": "스트리밍 방식",
"placeholder": "스트리밍 방식 선택",
"placeholder": "스트리밍 방식 선택하세요",
"method": {
"noStreaming": {
"label": "스트리밍 없음",
"desc": "카메라 이미지 1분에 한 번만 보여지며 라이브 스트리밍은 지 않습니다."
"desc": "카메라 이미지 1분에 한 번갱신되며 실시간 스트리밍은 작동하지 않습니다."
},
"smartStreaming": {
"label": "스마트 스트리밍 (추천함)",
"desc": "스마트 스트리밍은 감지되는 활동이 없을 때 대역폭과 자원을 절약하기 위해 1분마다 한 번 카메라 이미지를 업데이트합니다. 동이 감지되면, 이미지는 자동으로 라이브 스트림으로 원활하게 전환됩니다."
"label": "스마트 스트리밍 (권장)",
"desc": "대역폭과 시스템 자원을 절약하기 위해 감지된 동작이 없을 때는 1분마다 이미지를 갱신합니다. 동이 감지되면 자동으로 매끄럽게 라이브 스트림으로 전환됩니다."
},
"continuousStreaming": {
"label": "지속적 스트리밍",
"label": "지속적 스트리밍",
"desc": {
"title": "동이 감지되지 않더라도 카메라 이미지가 대시보드에서 항상 실시간 스트림됩니다.",
"warning": "지속적 스트리밍은 높은 대역폭 사용과 퍼포먼스 이슈를 발생할 수 있습니다. 사용에 주의해주세요."
"title": "동이 감지되지 않더라도 대시보드에 카메라 화면이 표시될 때 항상 실시간 스트림으로 재생됩니다.",
"warning": "지속적 스트리밍은 네트워크 대역폭 사용량이 증가하고 성능 저하를 유발할 수 있으므로 주의하여 사용하세요."
}
}
}
},
"compatibilityMode": {
"label": "호환 모드",
"desc": "이 옵션은 카메라 라이브 스트림 화면 색상 왜곡 되었거나 이미지 오른쪽에 대각선이 나타날때만 사용하세요."
"desc": "카메라 라이브 스트림 화면 색상 왜곡이 있거나 화면 우측에 대각선이 나타나는 경우에만 이 옵션을 활성화하세요."
}
}
}
},
"showAll": "모든 카메라 그룹 표시",
"showLess": "간략히 표시",
"editGroups": "카메라 그룹 관리"
},
"debug": {
"options": {
"label": "설정",
"title": "옵션",
"showOptions": "옵션 보기",
"showOptions": "옵션 표시",
"hideOptions": "옵션 숨기기"
},
"boundingBox": "감지 영역 상자",
"timestamp": "시간 기록",
"boundingBox": "바운딩 박스 (객체 감지 영역)",
"timestamp": "타임스탬프",
"zones": "구역 (Zones)",
"mask": "마스크",
"motion": "움직임",
"mask": "마스크 (Mask)",
"motion": "움직임 감지 (Motion)",
"regions": "영역 (Regions)",
"paths": "경로"
"paths": "이동 경로 (Paths)"
}
}
+101 -38
View File
@@ -1,41 +1,44 @@
{
"restart": {
"title": "Frigate을 정말로 다시 시작할까요?",
"title": "Frigate을 정말로 다시 시작하시겠습니까?",
"button": "재시작",
"restarting": {
"title": "Frigate 재시작 중입니다",
"content": "이 페이지는 {{countdown}} 뒤에 새로 고침 됩니다.",
"button": "강제 재시작"
"title": "Frigate 재시작 중",
"content": "이 페이지는 {{countdown}}초 후에 자동으로 새로고침됩니다.",
"button": "지금 즉시 새로고침"
},
"description": "이 작업은 Frigate가 재시작 되는 동안 잠시 작동이됩니다."
"description": "재시작하는 동안 Frigate 동작이 일시적으로됩니다."
},
"explore": {
"plus": {
"submitToPlus": {
"label": "Frigate+에 등록하기",
"desc": "제외하려는 위치에서 감지된 객체는 '오감지(False Positive)'가 아닙니다. 이를 오감지로 제출하면 모델 학습에 혼선을 줄 수 있습니다."
"desc": "감지를 제외하려는 위치에 있는 객체는 오감지(False Positive)가 아닙니다. 이를 오감지로 제출하면 모델 학습에 혼선을 줄 수 있습니다."
},
"review": {
"question": {
"label": "Frigate +에 이 레이블 등록하기",
"ask_a": "이 것은 <code>{{label}}</code> 인가요?",
"ask_an": "이 것은 <code>{{label}}</code> 인가요?",
"ask_full": "이 것은 <code>{{untranslatedLabel}}</code> ({{translatedLabel}}) 인가요?"
"label": "Frigate+용 레이블 확인",
"ask_a": "이 객체가 <code>{{label}}</code> 맞습니까?",
"ask_an": "이 객체가 <code>{{label}}</code> 맞습니까?",
"ask_full": "이 객체가 <code>{{untranslatedLabel}}</code> ({{translatedLabel}}) 맞습니까?"
},
"state": {
"submitted": "제출됨"
},
"toast": {
"error": "Frigate+ 제출에 실패했습니다. 네트워크 연결을 확인하고 다시 시도하세요."
}
}
},
"video": {
"viewInHistory": "히스토리 보기"
"viewInHistory": "기록에서 보기"
}
},
"export": {
"time": {
"fromTimeline": "타임라인에서 선택하기",
"lastHour_other": "지난 {{count}} 시간­",
"custom": "커스텀",
"fromTimeline": "타임라인에서 선택",
"lastHour_other": "지난 {{count}}시간",
"custom": "사용자 지정",
"start": {
"title": "시작 시간",
"label": "시작 시간 선택"
@@ -46,53 +49,105 @@
}
},
"name": {
"placeholder": "내보내기 이름"
"placeholder": "내보내기 이름 지정"
},
"select": "선택",
"export": "내보내기",
"selectOrExport": "선택 또는 내보내기",
"toast": {
"success": "내보내기가 성공적으로 시작되었습니다. 내보내기 페이지에서 파일을 보실 수 있습니다.",
"success": "내보내기가 성공적으로 시작되었습니다. 내보내기 페이지에서 파일을 확인하세요.",
"error": {
"failed": "내보내기 시작 실패:{{error}}",
"endTimeMustAfterStartTime": "종료 시간은 시작 시간보다 뒤에 있어야합니다",
"noVaildTimeSelected": "유효한 시간 범위가 선택되지 않았습니다"
"failed": "내보내기 대기열 등록 실패: {{error}}",
"endTimeMustAfterStartTime": "종료 시간은 시작 시간 이후여야 합니다",
"noVaildTimeSelected": "유효한 시간 범위가 선택되지 않았습니다",
"noValidTimeSelected": "유효한 시간 범위가 선택되지 않았습니다"
},
"view": "보기"
"view": "보기",
"queued": "내보내기가 대기열에 등록되었습니다. 진행 상황은 내보내기 페이지에서 확인하세요.",
"batchSuccess_other": "내보내기 {{count}}건을 시작했습니다. 케이스를 여는 중입니다.",
"batchPartial": "{{total}}건 중 {{successful}}건의 내보내기를 시작했습니다. 실패한 카메라: {{failedCameras}}",
"batchFailed": "{{total}}건의 내보내기 시작에 실패했습니다. 실패한 카메라: {{failedCameras}}",
"batchQueuedSuccess_other": "내보내기 {{count}}건을 대기열에 추가했습니다.",
"batchQueuedPartial": "{{total}}건 중 {{successful}}건의 내보내기를 대기열에 추가했습니다. 실패한 카메라: {{failedCameras}}",
"batchQueueFailed": "{{total}}건의 내보내기 대기열 등록에 실패했습니다. 실패한 카메라: {{failedCameras}}"
},
"fromTimeline": {
"saveExport": "내보내기 저장",
"previewExport": "내보내기 미리보기"
"previewExport": "내보내기 미리보기",
"queueingExport": "내보내기 대기열 등록 중...",
"useThisRange": "이 범위 사용"
},
"case": {
"label": "유형",
"placeholder": "유형 선택"
"label": "케이스",
"placeholder": "케이스 선택",
"newCaseOption": "새 케이스 생성",
"newCaseNamePlaceholder": "새 케이스 이름",
"newCaseDescriptionPlaceholder": "케이스 설명",
"nonAdminHelp": "이 내보내기를 위한 새 케이스가 생성됩니다."
},
"queueing": "내보내기 대기열 추가 중...",
"tabs": {
"export": "단일 카메라",
"multiCamera": "다중 카메라"
},
"multiCamera": {
"timeRange": "시간 범위",
"selectFromTimeline": "타임라인에서 선택",
"cameraSelection": "카메라",
"cameraSelectionHelp": "해당 시간 범위에 추적된 객체가 있는 카메라가 기본 선택됩니다",
"searchOrSelectGroup": "검색 또는 카메라 그룹 선택...",
"selectAll": "모든 카메라 선택",
"clearSelection": "선택 해제",
"selectWithActivity": "추적된 객체가 있는 카메라",
"selectGroup": "그룹 선택",
"noMatchingCameras": "일치하는 카메라가 없습니다",
"selectedCount": "{{selected}} / {{total}}대 선택됨",
"checkingActivity": "카메라 활동 확인 중...",
"noCameras": "사용 가능한 카메라가 없습니다",
"detectionCount_other": "추적된 객체 {{count}}개",
"nameLabel": "내보내기 이름",
"namePlaceholder": "내보내기에 사용할 기본 이름 (선택 사항)",
"queueingButton": "내보내기 대기열 추가 중...",
"exportButton_other": "카메라 {{count}}대 내보내기"
},
"multi": {
"title_other": "다시보기 {{count}}건 내보내기",
"description": "선택한 각 다시보기를 내보냅니다. 모든 내보내기 항목은 단일 케이스로 묶입니다.",
"descriptionNoCase": "선택한 각 다시보기를 내보냅니다.",
"caseNamePlaceholder": "다시보기 내보내기 - {{date}}",
"exportButton_other": "다시보기 {{count}}건 내보내기",
"exportingButton": "내보내는 중...",
"toast": {
"started_other": "내보내기 {{count}}건을 시작했습니다.",
"partial": "{{total}}건 중 {{successful}}건의 내보내기를 시작했습니다. 실패 항목: {{failedItems}}",
"failed": "{{total}}건의 내보내기 시작에 실패했습니다. 실패 항목: {{failedItems}}"
}
}
},
"streaming": {
"label": "스트림",
"restreaming": {
"disabled": "이 카메라는 재 스트리밍이 지 않습니다.",
"disabled": "이 카메라는 재스트리밍이 활성화되어 있지 않습니다.",
"desc": {
"title": "이 카메라를 위해 추가적인 라이브 뷰 옵션 오디오 go2rtc에서 설정하세요."
"title": "추가 라이브 뷰 옵션 오디오 기능을 사용하려면 go2rtc 설정을 진행하세요."
}
},
"showStats": {
"label": "스트림 통계 보기",
"desc": "이 옵션을 활성화하면 스트림 통계가 카메라 피드에 나타납니다."
"label": "스트림 통계 표시",
"desc": "카메라 피드 위에 실시간 스트림 통계 정보를 오버레이로 표시합니다."
},
"debugView": "디버그 뷰"
},
"search": {
"saveSearch": {
"label": "검색 저장",
"desc": "저장 검색 이름을 지정해주세요.",
"placeholder": "검색 이름 입력하기",
"overwrite": "{{searchName}} (이/가) 이미 존재합니다. 을 덮어 씌웁니다.",
"success": "{{searchName}} 검색이 저장되었습니다.",
"label": "검색 조건 저장",
"desc": "저장 검색 조건의 이름을 입력하세요.",
"placeholder": "검색 이름 입력",
"overwrite": "'{{searchName}}'이(가) 이미 존재합니다. 저장 시 기존 항목을 덮어니다.",
"success": "검색 조건({{searchName}})이 저장되었습니다.",
"button": {
"save": {
"label": "이 검색 저장하기"
"label": "이 검색 조건 저장"
}
}
}
@@ -101,26 +156,34 @@
"confirmDelete": {
"title": "삭제 확인",
"desc": {
"selected": "이 리뷰 항목과 관련된 모든 녹화 영상을 삭제하시겠습니까?<br /><br />다음에 이 팝업을 건너뛰려면 <em>Shift</em> 키를 누르고 삭제하세요."
"selected": "이 다시보기 항목과 연결된 모든 녹화 영상을 삭제하시겠습니까?<br /><br />이후 확인 창을 건너뛰려면 <em>Shift</em> 키를 누른 상태로 클릭하세요."
},
"toast": {
"success": "선택한 리뷰 항목과 관련영상 파일이 성공적으로 삭제되었습니다.",
"success": "선택한 다시보기 항목과 연결된 영상이 성공적으로 삭제되었습니다.",
"error": "삭제 실패: {{error}}"
}
},
"button": {
"export": "내보내기",
"markAsReviewed": "검토 완료로 표시",
"markAsUnreviewed": "검토 안 함 표시",
"markAsUnreviewed": "검토 상태로 표시",
"deleteNow": "지금 삭제"
},
"shareTimestamp": {
"label": "타임스탬프 공유",
"title": "타임스탬프 공유",
"description": "현재 재생 위치가 포함된 URL을 공유하거나 특정 타임스탬프를 지정합니다. 이 URL은 공개 링크가 아니며 Frigate 및 해당 카메라 접근 권한이 있는 사용자만 접근할 수 있습니다.",
"custom": "사용자 지정 타임스탬프",
"button": "타임스탬프 URL 공유",
"shareTitle": "Frigate 다시보기 타임스탬프: {{camera}}"
}
},
"imagePicker": {
"selectImage": "추적된 객체의 썸네일을 선택하세요",
"unknownLabel": "저장된 트리거 이미지",
"search": {
"placeholder": "레이블 또는 서브 레이블로 검색..."
"placeholder": "레이블 또는 하위 레이블로 검색..."
},
"noImages": "표시할 썸네일이 없습니다"
"noImages": "이 카메라에 등록된 썸네일이 없습니다"
}
}
+108 -11
View File
@@ -1,7 +1,7 @@
{
"filter": "필터",
"labels": {
"label": "레이블",
"label": "레이블 (Labels)",
"all": {
"title": "모든 레이블",
"short": "레이블"
@@ -10,34 +10,131 @@
"count_other": "레이블 {{count}}개"
},
"zones": {
"label": "구역",
"label": "구역 (Zones)",
"all": {
"title": "모든 구역",
"short": "구역"
}
},
"dates": {
"selectPreset": "프리셋 선택…",
"selectPreset": "사전 설정 선택…",
"all": {
"title": "모든 날짜",
"short": "날짜"
}
},
"timeRange": "시간 구역",
"timeRange": "시간 범위",
"subLabels": {
"label": "서브 레이블",
"all": "모든 서브 레이블"
"label": "하위 레이블",
"all": "모든 하위 레이블"
},
"more": "더 많은 필터",
"more": "추가 필터",
"classes": {
"label": "분류",
"label": "분류 (Classes)",
"all": {
"title": "모든 분류"
},
"count_one": "{{count}}개 클래스",
"count_other": "{{count}}개 클래스"
"count_one": "분류 {{count}}개",
"count_other": "분류 {{count}}개"
},
"reset": {
"label": "기본값으로 필터 초기화"
"label": "필터를 기본값으로 초기화"
},
"attributes": {
"label": "분류 속성",
"all": "모든 속성"
},
"score": "신뢰도 점수",
"estimatedSpeed": "예상 속도 ({{unit}})",
"features": {
"label": "특징",
"hasSnapshot": "스냅샷 있음",
"hasVideoClip": "비디오 클립 있음",
"submittedToFrigatePlus": {
"label": "Frigate+에 제출됨",
"tips": "먼저 스냅샷이 있는 추적 객체로 필터링해야 합니다.<br /><br />스냅샷이 없는 추적 객체는 Frigate+에 제출할 수 없습니다."
}
},
"sort": {
"label": "정렬",
"dateAsc": "날짜 (오름차순)",
"dateDesc": "날짜 (내림차순)",
"scoreAsc": "객체 점수 (오름차순)",
"scoreDesc": "객체 점수 (내림차순)",
"speedAsc": "예상 속도 (오름차순)",
"speedDesc": "예상 속도 (내림차순)",
"relevance": "관련성"
},
"cameras": {
"label": "카메라 필터",
"all": {
"title": "모든 카메라",
"short": "카메라"
}
},
"review": {
"showReviewed": "검토 완료된 항목 표시"
},
"motion": {
"showMotionOnly": "움직임만 표시"
},
"explore": {
"settings": {
"title": "설정",
"defaultView": {
"title": "기본 보기",
"desc": "선택된 필터가 없을 때 레이블별 가장 최근 추적 객체의 요약을 표시하거나 필터링되지 않은 격자(Grid)로 표시합니다.",
"summary": "요약 보기",
"unfilteredGrid": "전체 격자 보기"
},
"gridColumns": {
"title": "격자 열 개수",
"desc": "격자 보기에서 표시할 열(Column) 개수를 선택하세요."
},
"searchSource": {
"label": "검색 대상",
"desc": "추적된 객체의 썸네일 이미지로 검색할지 설명 텍스트로 검색할지 선택하세요.",
"options": {
"thumbnailImage": "썸네일 이미지",
"description": "설명"
}
}
},
"date": {
"selectDateBy": {
"label": "필터링할 날짜 선택"
}
}
},
"logSettings": {
"label": "로그 레벨 필터",
"filterBySeverity": "심각도별 로그 필터링",
"loading": {
"title": "로딩 중",
"desc": "로그 창을 맨 아래로 스크롤하면 새로운 로그가 추가될 때 자동으로 스트리밍됩니다."
},
"disableLogStreaming": "로그 스트리밍 비활성화",
"allLogs": "모든 로그"
},
"trackedObjectDelete": {
"title": "삭제 확인",
"desc": "이 {{objectLength}}개의 추적 객체를 삭제하면 스냅샷, 저장된 임베딩 및 연결된 모든 객체 수명주기 항목이 제거됩니다. 기록 보기의 녹화 영상은 삭제되지 <em>않습니다</em>.<br /><br />정말로 계속 진행하시겠습니까?<br /><br />이후 확인 창을 건너뛰려면 <em>Shift</em> 키를 누른 상태로 클릭하세요.",
"toast": {
"success": "추적 객체가 성공적으로 삭제되었습니다.",
"error": "추적 객체 삭제 실패: {{errorMessage}}"
}
},
"zoneMask": {
"filterBy": "구역 마스크별 필터"
},
"recognizedLicensePlates": {
"title": "인식된 차량 번호판",
"loadFailed": "인식된 번호판 목록을 불러오지 못했습니다.",
"loading": "인식된 번호판 목록 불러오는 중…",
"placeholder": "번호판 검색어 입력…",
"noLicensePlatesFound": "발견된 번호판이 없습니다.",
"selectPlatesFromList": "목록에서 하나 이상의 번호판을 선택하세요.",
"selectAll": "모두 선택",
"clearAll": "모두 지우기"
}
}
+2 -2
View File
@@ -1,8 +1,8 @@
{
"iconPicker": {
"selectIcon": "아이콘 선택해주세요",
"selectIcon": "아이콘 선택",
"search": {
"placeholder": "아이콘 검색…"
"placeholder": "아이콘 검색…"
}
}
}
+16 -15
View File
@@ -2,7 +2,7 @@
"submitFrigatePlus": {
"submit": "제출",
"title": "이 프레임을 Frigate+에 제출하시겠습니까?",
"previewError": "스냅샷 미리보기를 불러올 수 없습니다. 현재 녹화 영상을 사용할 수 없 수 있습니다."
"previewError": "스냅샷 미리보기를 불러올 수 없습니다. 해당 시점의 녹화 영상을 사용할 수 없는 상태일 수 있습니다."
},
"stats": {
"bandwidth": {
@@ -12,10 +12,10 @@
"latency": {
"short": {
"title": "지연",
"value": "{{seconds}} 초"
"value": "{{seconds}}초"
},
"title": "지연:",
"value": "{{seconds}} 초"
"title": "지연 시간:",
"value": "{{seconds}}초"
},
"streamType": {
"short": "종류",
@@ -25,28 +25,29 @@
"droppedFrames": {
"title": "손실 프레임:",
"short": {
"title": "손실",
"value": "{{droppedFrames}} 프레임"
"title": "손실",
"value": "{{droppedFrames}}프레임"
}
},
"decodedFrames": "복원된 프레임:",
"decodedFrames": "디코딩된 프레임:",
"droppedFrameRate": "프레임 손실률:"
},
"noRecordingsFoundForThisTime": " 시간대에는 녹화본이 없습니다",
"noPreviewFound": "미리 보기를 찾을 수 없습니다",
"noPreviewFoundFor": "{{cameraName}} 미리보기를 찾을 수 없습니다",
"livePlayerRequiredIOSVersion": "이 라이브 스트림 방식은 iOS 17.1 이거나 높은 버전이 필요합니다.",
"noRecordingsFoundForThisTime": "해당 시간대에 저장된 녹화 영상이 없습니다",
"noPreviewFound": "미리보기를 찾을 수 없습니다",
"noPreviewFoundFor": "{{cameraName}} 카메라의 미리보기를 찾을 수 없습니다",
"livePlayerRequiredIOSVersion": "이 실시간 스트림 유형을 사용하려면 iOS 17.1 이 버전이 필요합니다.",
"streamOffline": {
"title": "스트림 오프라인",
"desc": "{{cameraName}} 카메라 <code>감지(detect)</code> 스트림의 프레임을 얻지 못했습니다. 에러 로그를 확인하세요"
"desc": "{{cameraName}} 카메라 <code>detect</code> 스트림에서 수신된 프레임이 없습니다. 오류 로그를 확인하세요"
},
"cameraDisabled": "카메라를 이용할 수 없습니다",
"toast": {
"success": {
"submittedFrigatePlus": "Frigate+에 프레임 성공적으로 제출습니다"
"submittedFrigatePlus": "Frigate+에 프레임 성공적으로 제출습니다"
},
"error": {
"submitFrigatePlusFailed": "Frigate+에 프레임을 보내지 못했습니다"
"submitFrigatePlusFailed": "Frigate+에 프레임을 제출하지 못했습니다"
}
}
},
"cameraOff": "카메라가 꺼져 있습니다"
}
+906 -13
View File
@@ -10,10 +10,10 @@
},
"enabled": {
"label": "활성화됨",
"description": "활성화"
"description": "활성화 여부"
},
"audio": {
"label": "오디오 이벤트",
"label": "오디오 감지",
"description": "이 카메라의 오디오 기반 이벤트 감지 설정입니다.",
"enabled": {
"label": "오디오 감지 활성화",
@@ -25,39 +25,932 @@
},
"min_volume": {
"label": "최소 볼륨",
"description": "오디오 감지를 실행하는 데 필요한 최소 RMS 볼륨 임계값으로, 낮을수록 민감도가 높아집니다(예: 200 높음, 500 보통, 1000 낮음)."
"description": "오디오 감지를 실행하는 데 필요한 최소 RMS 볼륨 임계값입니다. 낮을수록 민감도가 높아집니다 (예: 200 높음, 500 보통, 1000 낮음)."
},
"listen": {
"label": "청취 유형",
"description": "감지할 오디오 이벤트 유형 목록입니다(예: bark, fire_alarm, scream, speech, yell)."
"label": "감지 대상 소리",
"description": "감지할 오디오 이벤트 유형 목록입니다 (예: bark, fire_alarm, speech, yell)."
},
"filters": {
"label": "오디오 필터",
"description": "오지를 줄이기 위해 사용되는 신뢰도 임계값과 같은 오디오 유형별 필터 설정입니다."
"description": "오지를 줄이기 위 신뢰도 임계값 오디오 유형별 필터 설정입니다.",
"threshold": {
"label": "최소 오디오 신뢰도",
"description": "오디오 이벤트로 카운트되기 위한 최소 신뢰도 임계값입니다."
}
},
"enabled_in_config": {
"label": "원래 오디오 상태"
"label": "초기 오디오 상태",
"description": "정적 설정 파일에서 오디오 감지가 기본 활성화되어 있었는지 여부를 나타냅니다."
},
"num_threads": {
"label": "감지 스레드 수",
"description": "오디오 감지 처리에 사용할 스레드 수입니다."
}
},
"mqtt": {
"label": "MQTT"
"label": "MQTT",
"description": "MQTT 이미지 발행 설정입니다.",
"enabled": {
"label": "이미지 전송",
"description": "이 카메라의 객체 이미지 스냅샷을 MQTT 토픽으로 발행하도록 활성화합니다."
},
"timestamp": {
"label": "타임스탬프 추가",
"description": "MQTT로 발행되는 이미지에 타임스탬프를 덧씌웁니다."
},
"bounding_box": {
"label": "바운딩 박스 추가",
"description": "MQTT로 발행되는 이미지에 바운딩 박스를 그립니다."
},
"crop": {
"label": "이미지 크롭",
"description": "MQTT로 발행되는 이미지를 감지된 객체의 바운딩 박스 크기로 잘라냅니다."
},
"height": {
"label": "이미지 높이",
"description": "MQTT로 발행되는 이미지를 리사이즈할 높이(픽셀)입니다."
},
"required_zones": {
"label": "필수 구역",
"description": "MQTT 이미지가 발행되기 위해 객체가 진입해야 하는 구역입니다."
},
"quality": {
"label": "JPEG 품질",
"description": "MQTT로 발행되는 이미지의 JPEG 압축 품질입니다 (0~100)."
}
},
"notifications": {
"label": "알림",
"enabled": {
"label": "알림 활성화"
"label": "알림 활성화",
"description": "이 카메라의 알림 기능을 활성화하거나 비활성화합니다."
},
"email": {
"label": "알림 이메일",
"label": "알림 수신 이메일",
"description": "푸시 알림에 사용되거나 특정 알림 제공업체에서 요구하는 이메일 주소입니다."
},
"cooldown": {
"label": "알림 재발송 대기 시간",
"description": "수신자에게 스팸 메일을 보내는 것을 방지하기 위해 알림 재발송 대기시간(초)을 설정합니다."
"description": "수신자에게 알림이 연속 도배되는 것을 방지하기 위 대기 시간(초)니다."
},
"enabled_in_config": {
"label": "초기 알림 활성 상태",
"description": "초기 구성에서 알림이 활성화되었는지 여부를 나타냅니다."
"label": "초기 알림 상태",
"description": "초기 정적 구성에서 알림이 활성화되어 있었는지 여부를 나타냅니다."
},
"description": "이 카메라의 알림을 활성화하고 제어하기 위한 설정입니다."
},
"zones": {
"label": "구역 (Zones)",
"description": "프레임의 특정 영역을 정의하여 객체가 해당 영역 내에 있는지 여부를 판정할 수 있도록 합니다.",
"friendly_name": {
"label": "구역 별칭",
"description": "Frigate UI에 표시될 구역 이름입니다. 지정하지 않으면 구역 고유 식별자 이름이 사용됩니다."
},
"enabled": {
"label": "활성화됨",
"description": "이 구역을 활성화하거나 비활성화합니다. 비활성화된 구역은 런타임에 무시됩니다."
},
"enabled_in_config": {
"label": "구역의 초기 상태를 추적합니다."
},
"filters": {
"label": "구역 필터",
"description": "이 구역 내의 객체에 적용할 필터입니다. 오탐지를 줄이거나 구역 내 진입으로 인정할 객체 조건을 제한하는 데 사용됩니다.",
"min_area": {
"label": "최소 객체 면적",
"description": "이 객체 유형에 필요한 최소 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다."
},
"max_area": {
"label": "최대 객체 면적",
"description": "이 객체 유형에 허용되는 최대 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다."
},
"min_ratio": {
"label": "최소 가로세로 비율",
"description": "바운딩 박스에 요구되는 최소 너비/높이 비율입니다."
},
"max_ratio": {
"label": "최대 가로세로 비율",
"description": "바운딩 박스에 허용되는 최대 너비/높이 비율입니다."
},
"threshold": {
"label": "신뢰도 임계값",
"description": "객체를 실제 탐지로 인정하기 위해 요구되는 평균 감지 신뢰도 임계값입니다."
},
"min_score": {
"label": "최소 신뢰도",
"description": "객체로 카운트되기 위해 필요한 단일 프레임 최소 감지 신뢰도입니다."
},
"mask": {
"label": "필터 마스크",
"description": "프레임 내에서 이 필터가 적용될 다각형 좌표입니다."
},
"raw_mask": {
"label": "원시 마스크"
}
},
"coordinates": {
"label": "좌표",
"description": "구역 영역을 정의하는 다각형 좌표입니다. 쉼표로 구분된 문자열 또는 좌표 문자열 목록일 수 있습니다. 좌표는 상대값(0~1) 또는 절대값(레거시)이어야 합니다."
},
"distances": {
"label": "실제 거리",
"description": "속도 또는 거리 계산에 사용되는 구역 사각형 각 변의 실제 거리값(선택 사항)입니다. 설정할 경우 정확히 4개의 값이어야 합니다."
},
"inertia": {
"label": "관성 프레임",
"description": "구역 내에 있는 것으로 인정하기 위해 객체가 연속으로 감지되어야 하는 프레임 수입니다. 순간적인 일시적 오탐을 걸러내는 데 유용합니다."
},
"loitering_time": {
"label": "배회 감지 시간(초)",
"description": "객체가 구역 내에 머무르고 있는 것으로 간주할 시간(초)입니다. 배회 감지를 비활성화하려면 0으로 설정하세요."
},
"speed_threshold": {
"label": "최소 이동 속도",
"description": "구역 내에 존재하는 것으로 인정되기 위해 객체에 요구되는 최소 속도(거리 설정 시 실제 단위 기준)입니다. 속도 기반 구역 트리거에 사용됩니다."
},
"objects": {
"label": "트리거 대상 객체",
"description": "이 구역을 작동시킬 수 있는 객체 유형 목록(labelmap 기준)입니다. 비워 두면 모든 객체에 대해 작동합니다."
}
},
"audio_transcription": {
"label": "오디오 텍스트 변환 (STT)",
"description": "이벤트 및 실시간 자막 처리에 사용되는 실시간 음성 전사 설정입니다.",
"enabled": {
"label": "텍스트 변환 활성화",
"description": "수동으로 트리거된 오디오 이벤트의 텍스트 변환을 활성화하거나 비활성화합니다."
},
"enabled_in_config": {
"label": "초기 텍스트 변환 상태"
},
"live_enabled": {
"label": "실시간 텍스트 변환",
"description": "수신되는 오디오에 대한 실시간 스트리밍 텍스트 변환을 활성화합니다."
}
},
"birdseye": {
"label": "버드아이 (Birdseye)",
"description": "여러 카메라 피드를 단일 레이아웃으로 합성하는 버드아이 뷰 설정입니다.",
"enabled": {
"label": "버드아이 활성화",
"description": "버드아이 뷰 기능을 활성화하거나 비활성화합니다."
},
"mode": {
"label": "추적 모드",
"description": "카메라를 버드아이에 포함하는 기준 모드: 'objects', 'motion', 또는 'continuous'."
},
"order": {
"label": "표시 순서",
"description": "버드아이 레이아웃 내에서 카메라 배치 순서를 제어하는 숫자입니다."
}
},
"detect": {
"label": "객체 감지",
"description": "객체 감지를 실행하고 트래커를 초기화하는 데 사용되는 detect 역할 설정입니다.",
"enabled": {
"label": "객체 감지 활성화",
"description": "이 카메라의 객체 감지를 활성화하거나 비활성화합니다."
},
"height": {
"label": "감지 높이",
"description": "감지 스트림에 사용할 프레임 높이(픽셀)입니다. 비워 두면 원본 스트림 해상도를 사용합니다."
},
"width": {
"label": "감지 너비",
"description": "감지 스트림에 사용할 프레임 너비(픽셀)입니다. 비워 두면 원본 스트림 해상도를 사용합니다."
},
"fps": {
"label": "감지 FPS",
"description": "감지를 실행할 목표 초당 프레임 수입니다. 낮을수록 CPU 사용량이 감소합니다 (권장값은 5이며, 매우 빠른 물체를 추적할 때만 최대 10까지 권장)."
},
"min_initialized": {
"label": "최소 초기화 프레임",
"description": "추적 객체를 생성하기 전 연속 감지되어야 하는 프레임 수입니다. 값을 높이면 오탐 초기화를 줄일 수 있습니다 (기본값: fps / 2)."
},
"max_disappeared": {
"label": "최대 사라짐 프레임",
"description": "추적 중인 객체가 시야에서 완전히 사라진 것으로 판단하기까지 감지되지 않는 프레임 수입니다."
},
"stationary": {
"label": "정지 객체 설정",
"description": "일정 시간 정지해 있는 객체를 감지하고 관리하기 위한 설정입니다.",
"interval": {
"label": "정지 확인 주기",
"description": "정지 객체임을 재확인하기 위해 감지 검사를 실행하는 간격(프레임 단위)입니다."
},
"threshold": {
"label": "정지 임계값",
"description": "객체를 정지 상태로 분류하기 위해 위치 이동이 없어야 하는 프레임 수입니다."
},
"max_frames": {
"label": "최대 추적 프레임",
"description": "정지 객체를 폐기하기 전까지 추적할 최대 프레임 한도입니다.",
"default": {
"label": "기본 최대 프레임",
"description": "추적을 중단하기 전 정지 객체를 추적할 기본 최대 프레임 수입니다."
},
"objects": {
"label": "객체별 최대 프레임",
"description": "정지 객체를 추적할 객체 유형별 최대 프레임 수 재정의 설정입니다."
}
},
"classifier": {
"label": "시각적 분류기 활성화",
"description": "바운딩 박스가 미세하게 흔들려도 시각적 분류기를 사용해 실제로 정지된 객체인지 확인합니다."
}
},
"annotation_offset": {
"label": "어노테이션 오프셋",
"description": "녹화 영상과 타임라인 바운딩 박스의 싱크를 맞추기 위해 감지 어노테이션을 전후로 이동할 밀리초(ms) 단위 시간입니다 (양수 또는 음수 가능)."
}
},
"face_recognition": {
"label": "얼굴 인식",
"description": "이 카메라의 얼굴 감지 및 인식 설정입니다.",
"enabled": {
"label": "얼굴 인식 활성화",
"description": "얼굴 인식을 활성화하거나 비활성화합니다."
},
"min_area": {
"label": "최소 얼굴 크기",
"description": "인식을 시도하기 위해 필요한 감지된 얼굴 박스의 최소 면적(픽셀)입니다."
}
},
"ffmpeg": {
"label": "스트림 (FFmpeg)",
"description": "카메라 스트림 입력 및 바이너리 경로, 인수, 하드웨어 가속, 역할별 출력 인수를 포함한 FFmpeg 설정입니다.",
"path": {
"label": "FFmpeg 경로",
"description": "사용할 FFmpeg 바이너리 경로 또는 버전 별칭(\"7.0\" 또는 \"8.0\")입니다."
},
"global_args": {
"label": "FFmpeg 글로벌 인수",
"description": "FFmpeg 프로세스 전역에 전달할 공통 인수입니다."
},
"hwaccel_args": {
"label": "하드웨어 가속 인수",
"description": "FFmpeg 하드웨어 가속 인수입니다. 하드웨어 환경에 맞는 프리셋 사용을 권장합니다."
},
"input_args": {
"label": "입력 인수",
"description": "FFmpeg 입력 스트림에 적용할 인수입니다."
},
"output_args": {
"label": "출력 인수",
"description": "detect, record 등 서로 다른 FFmpeg 역할에 사용할 기본 출력 인수입니다.",
"detect": {
"label": "감지(detect) 출력 인수",
"description": "detect 역할 스트림에 적용할 기본 출력 인수입니다."
},
"record": {
"label": "녹화(record) 출력 인수",
"description": "record 역할 스트림에 적용할 기본 출력 인수입니다."
}
},
"retry_interval": {
"label": "FFmpeg 재연결 대기 시간",
"description": "카메라 스트림 연결 실패 시 재연결을 시도하기까지 대기할 시간(초)입니다 (기본값: 10)."
},
"apple_compatibility": {
"label": "Apple 호환성",
"description": "H.265 녹화 시 Apple 기기 플레이어와의 호환성을 위해 HEVC 태깅을 활성화합니다."
},
"gpu": {
"label": "GPU 인덱스",
"description": "하드웨어 가속에 사용할 기본 GPU 번호(인덱스)입니다."
},
"inputs": {
"label": "카메라 입력 스트림",
"description": "이 카메라에 설정된 입력 스트림 정의(경로 및 역할) 목록입니다.",
"path": {
"label": "입력 경로",
"description": "카메라 입력 스트림 URL 또는 디바이스 경로입니다."
},
"roles": {
"label": "입력 역할",
"description": "이 입력 스트림에 할당할 역할입니다."
},
"global_args": {
"label": "FFmpeg 글로벌 인수",
"description": "이 입력 스트림에만 적용할 FFmpeg 글로벌 인수입니다."
},
"hwaccel_args": {
"label": "하드웨어 가속 인수",
"description": "이 입력 스트림에만 적용할 하드웨어 가속 인수입니다."
},
"input_args": {
"label": "입력 인수",
"description": "이 스트림에만 개별 적용할 입력 인수입니다."
}
}
},
"live": {
"label": "실시간 재생",
"description": "웹 UI에서 실시간 스트림 선택, 해상도 및 화질을 제어하기 위한 설정입니다.",
"streams": {
"label": "실시간 스트림 이름",
"description": "실시간 재생에 사용할 restream/go2rtc 이름과 설정된 스트림 이름의 매핑입니다."
},
"height": {
"label": "실시간 재생 높이",
"description": "웹 UI에서 jsmpeg 실시간 스트림을 렌더링할 높이(픽셀)입니다 (감지 스트림 높이 이하)."
},
"quality": {
"label": "실시간 품질",
"description": "jsmpeg 스트림의 인코딩 품질입니다 (1 최고 품질, 31 최저 품질)."
}
},
"lpr": {
"label": "차량 번호판 인식",
"description": "감지 임계값, 포맷, 등록된 번호판 등을 포함한 차량 번호판 인식 설정입니다.",
"enabled": {
"label": "LPR 활성화",
"description": "이 카메라에서 LPR 기능을 활성화하거나 비활성화합니다."
},
"expire_time": {
"label": "만료 시간(초)",
"description": "시야에서 사라진 번호판이 트래커에서 만료되기까지의 시간(초)입니다 (전용 LPR 카메라 전용)."
},
"min_area": {
"label": "최소 번호판 크기",
"description": "인식을 시도하기 위해 필요한 최소 번호판 면적(픽셀)입니다."
},
"enhancement": {
"label": "이미지 보정 레벨",
"description": "OCR 수행 전 번호판 크롭 이미지에 적용할 보정 강도(0~10)입니다 (값이 높다고 항상 인식률이 좋아지지는 않으며, 5 초과는 야간 전용이므로 주의해야 합니다)."
}
},
"motion": {
"label": "움직임 감지",
"description": "이 카메라의 기본 움직임 감지 설정입니다.",
"enabled": {
"label": "움직임 감지 활성화",
"description": "이 카메라의 움직임 감지를 활성화하거나 비활성화합니다."
},
"threshold": {
"label": "움직임 임계값",
"description": "움직임 감지기가 사용하는 픽셀 차이 임계값입니다. 값이 클수록 민감도가 낮아집니다 (범위: 1~255)."
},
"lightning_threshold": {
"label": "번개/빛 변화 임계값",
"description": "순간적인 조명 변화나 번개를 감지하여 무시하기 위한 임계값입니다 (낮을수록 민감하며 0.3~1.0 사이 값). 움직임 감지 자체를 완전히 끄는 것이 아니라 임계값을 초과할 때 추가 프레임 분석을 일시 중단하는 것이며, 이 동안에도 움직임 기반 녹화는 정상 생성됩니다."
},
"skip_motion_threshold": {
"label": "움직임 건너뛰기 임계값",
"description": "0.0~1.0 사이로 설정 시 단일 프레임에서 이 비율 이상의 화면이 바뀌면 움직임 박스를 생성하지 않고 즉시 재보정합니다. 폭풍이나 번개 시 CPU를 절약하고 오탐을 줄일 수 있지만, PTZ 카메라 자동 추적과 같은 실제 이벤트를 놓칠 수 있습니다. 사용하지 않으려면 설정하지 마세요(None)."
},
"improve_contrast": {
"label": "대비 향상",
"description": "움직임 분석 전 프레임 대비를 향상하여 감지 성능을 보조합니다."
},
"contour_area": {
"label": "윤곽선 면적",
"description": "움직임 윤곽선으로 인정되기 위한 최소 픽셀 면적입니다."
},
"delta_alpha": {
"label": "델타 알파",
"description": "움직임 계산 시 프레임 차분화에 사용할 알파 블렌딩 계수입니다."
},
"frame_alpha": {
"label": "프레임 알파",
"description": "움직임 전처리용 프레임 블렌딩에 사용할 알파 값입니다."
},
"frame_height": {
"label": "프레임 높이",
"description": "움직임 연산 시 프레임을 리사이즈할 높이(픽셀)입니다."
},
"mask": {
"label": "마스크 좌표",
"description": "움직임 감지 영역을 포함하거나 제외하기 위해 다각형을 정의하는 정렬된 x,y 좌표입니다."
},
"mqtt_off_delay": {
"label": "MQTT 꺼짐 지연",
"description": "마지막 움직임이 감지된 후 MQTT에 'off' 상태를 발행하기까지 대기할 시간(초)입니다."
},
"enabled_in_config": {
"label": "초기 움직임 상태",
"description": "초기 정적 설정 파일에서 움직임 감지가 활성화되어 있었는지 여부를 나타냅니다."
},
"raw_mask": {
"label": "원시 마스크"
}
},
"objects": {
"label": "객체",
"description": "추적할 레이블 목록과 객체별 필터를 포함한 기본 객체 추적 설정입니다.",
"track": {
"label": "추적 대상 객체",
"description": "이 카메라에서 추적할 객체 레이블 목록입니다."
},
"filters": {
"label": "객체 필터",
"description": "오탐지를 줄이기 위해 감지된 객체에 적용할 필터 설정(면적, 비율, 신뢰도)입니다.",
"min_area": {
"label": "최소 객체 면적",
"description": "이 객체 유형에 필요한 최소 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다."
},
"max_area": {
"label": "최대 객체 면적",
"description": "이 객체 유형에 허용되는 최대 바운딩 박스 면적입니다. 픽셀 수(정수) 또는 비율(0.000001~0.99 사이의 실수)로 지정할 수 있습니다."
},
"min_ratio": {
"label": "최소 가로세로 비율",
"description": "바운딩 박스에 요구되는 최소 너비/높이 비율입니다."
},
"max_ratio": {
"label": "최대 가로세로 비율",
"description": "바운딩 박스에 허용되는 최대 너비/높이 비율입니다."
},
"threshold": {
"label": "신뢰도 임계값",
"description": "객체를 실제 탐지로 인정하기 위해 요구되는 평균 감지 신뢰도 임계값입니다."
},
"min_score": {
"label": "최소 신뢰도",
"description": "객체로 카운트되기 위해 필요한 단일 프레임 최소 감지 신뢰도입니다."
},
"mask": {
"label": "필터 마스크",
"description": "프레임 내에서 이 필터가 적용될 다각형 좌표입니다."
},
"raw_mask": {
"label": "원시 마스크"
}
},
"mask": {
"label": "객체 마스크",
"description": "지정된 영역에서 객체 감지를 방지하기 위한 마스크 다각형입니다."
},
"raw_mask": {
"label": "원시 마스크"
},
"genai": {
"label": "생성형 AI (GenAI) 객체 설정",
"description": "추적된 객체를 설명하고 분석용 프레임을 전송하기 위한 GenAI 옵션입니다.",
"enabled": {
"label": "GenAI 활성화",
"description": "기본적으로 추적된 객체에 대한 GenAI 설명 생성을 활성화합니다."
},
"use_snapshot": {
"label": "스냅샷 사용",
"description": "GenAI 설명 생성 시 썸네일 대신 객체 스냅샷을 사용합니다."
},
"prompt": {
"label": "캡션 프롬프트",
"description": "GenAI로 설명을 생성할 때 사용할 기본 프롬프트 템플릿입니다."
},
"object_prompts": {
"label": "객체별 프롬프트",
"description": "특정 레이블에 대한 GenAI 결과를 맞춤화하기 위한 객체별 개별 프롬프트입니다."
},
"objects": {
"label": "GenAI 대상 객체",
"description": "기본적으로 GenAI로 전송할 객체 레이블 목록입니다."
},
"required_zones": {
"label": "필수 구역",
"description": "GenAI 설명 생성 대상이 되기 위해 객체가 반드시 진입해야 하는 구역입니다."
},
"debug_save_thumbnails": {
"label": "썸네일 저장",
"description": "디버깅 및 검토를 위해 GenAI로 전송된 썸네일을 저장합니다."
},
"send_triggers": {
"label": "GenAI 전송 트리거",
"description": "프레임을 GenAI로 전송할 시점(추적 종료 시, 주요 업데이트 후 등)을 정의합니다.",
"tracked_object_end": {
"label": "종료 시 전송",
"description": "추적 객체의 동작이 종료되었을 때 GenAI에 요청을 보냅니다."
},
"after_significant_updates": {
"label": "조기 GenAI 트리거",
"description": "추적 객체에 지정된 횟수만큼 주요 변화가 발생한 후 조기에 GenAI 요청을 보냅니다."
}
},
"enabled_in_config": {
"label": "초기 GenAI 상태",
"description": "초기 정적 설정에서 GenAI가 활성화되었는지 여부를 나타냅니다."
}
}
},
"record": {
"label": "녹화",
"description": "이 카메라의 녹화 및 보관 주기 설정입니다.",
"enabled": {
"label": "녹화 활성화",
"description": "이 카메라의 녹화를 활성화하거나 비활성화합니다."
},
"expire_interval": {
"label": "녹화 파일 정리 주기",
"description": "만료된 녹화 세그먼트를 삭제하는 정리 작업 간격(분)입니다."
},
"continuous": {
"label": "상시 녹화 보관",
"description": "객체 추적이나 움직임 여부와 상관없이 녹화본을 보관할 일수입니다. 알림이나 감지 이벤트만 보관하려면 0으로 설정하세요.",
"days": {
"label": "보관 일수",
"description": "녹화본 보관 일수입니다."
}
},
"motion": {
"label": "움직임 녹화 보관",
"description": "추적 객체가 없더라도 움직임에 의해 트리거된 녹화본을 보관할 일수입니다. 알림이나 감지 이벤트만 보관하려면 0으로 설정하세요.",
"days": {
"label": "보관 일수",
"description": "녹화본 보관 일수입니다."
}
},
"detections": {
"label": "감지 녹화 보관",
"description": "이벤트 전/후 버퍼 캡처 시간을 포함한 감지 이벤트의 녹화 보관 설정입니다.",
"pre_capture": {
"label": "사전 캡처 시간",
"description": "감지 이벤트 시작 전 녹화에 포함할 시간(초)입니다."
},
"post_capture": {
"label": "사후 캡처 시간",
"description": "감지 이벤트 종료 후 녹화에 포함할 시간(초)입니다."
},
"retain": {
"label": "이벤트 보관",
"description": "감지 이벤트 녹화본의 보관 설정입니다.",
"days": {
"label": "보관 일수",
"description": "감지 이벤트 녹화본을 보관할 일수입니다."
},
"mode": {
"label": "보관 모드",
"description": "보관 모드: all(모든 구간 저장), motion(움직임이 있는 구간 저장), active_objects(활동 중인 객체가 있는 구간 저장)."
}
}
},
"alerts": {
"label": "알림 녹화 보관",
"description": "이벤트 전/후 버퍼 캡처 시간을 포함한 알림 이벤트의 녹화 보관 설정입니다.",
"pre_capture": {
"label": "사전 캡처 시간",
"description": "알림 이벤트 시작 전 녹화에 포함할 시간(초)입니다."
},
"post_capture": {
"label": "사후 캡처 시간",
"description": "알림 이벤트 종료 후 녹화에 포함할 시간(초)입니다."
},
"retain": {
"label": "이벤트 보관",
"description": "알림 이벤트 녹화본의 보관 설정입니다.",
"days": {
"label": "보관 일수",
"description": "알림 이벤트 녹화본을 보관할 일수입니다."
},
"mode": {
"label": "보관 모드",
"description": "보관 모드: all(모든 구간 저장), motion(움직임이 있는 구간 저장), active_objects(활동 중인 객체가 있는 구간 저장)."
}
}
},
"export": {
"label": "내보내기 설정",
"description": "타임랩스 및 하드웨어 가속 등 녹화본 내보내기 시 적용할 설정입니다.",
"hwaccel_args": {
"label": "내보내기 하드웨어 가속 인수",
"description": "내보내기 및 트랜스코딩 작업에 사용할 하드웨어 가속 인수입니다."
},
"max_concurrent": {
"label": "최대 동시 내보내기 수",
"description": "동시에 처리할 수 있는 최대 내보내기 작업 수입니다."
},
"chapters": {
"label": "내보낸 녹화 영상에 삽입할 챕터 메타데이터"
}
},
"preview": {
"label": "미리보기 설정",
"description": "UI에 표시되는 녹화 미리보기의 화질을 제어하는 설정입니다.",
"quality": {
"label": "미리보기 화질",
"description": "미리보기 화질 레벨 (very_low, low, medium, high, very_high)."
}
},
"enabled_in_config": {
"label": "초기 녹화 상태",
"description": "초기 정적 구성에서 녹화가 활성화되어 있었는지 여부를 나타냅니다."
}
},
"review": {
"label": "다시보기",
"description": "UI 및 저장소에서 사용하는 알림, 감지 및 GenAI 요약을 제어하는 설정입니다.",
"alerts": {
"label": "알림 설정",
"description": "어떤 추적 객체가 알림을 생성하고 알림을 어떻게 보관할지 결정하는 설정입니다.",
"enabled": {
"label": "알림 활성화",
"description": "이 카메라의 알림 생성을 활성화하거나 비활성화합니다."
},
"labels": {
"label": "알림 대상 레이블",
"description": "알림을 트리거할 객체 레이블 목록입니다 (예: car, person)."
},
"required_zones": {
"label": "필수 구역",
"description": "알림으로 분류되기 위해 객체가 진입해야 하는 구역입니다. 모든 구역을 허용하려면 비워 두세요."
},
"enabled_in_config": {
"label": "초기 알림 상태",
"description": "정적 설정에서 알림이 원래 활성화되어 있었는지 여부를 추적합니다."
},
"cutoff_time": {
"label": "알림 종료 대기 시간",
"description": "알림 유발 활동이 멈춘 후 알림을 공식 종료하기까지 대기할 시간(초)입니다."
}
},
"detections": {
"label": "감지 이벤트 설정",
"description": "어떤 추적 객체가 일반 감지(알림 제외) 이벤트를 생성하고 어떻게 보관할지 결정하는 설정입니다.",
"enabled": {
"label": "감지 이벤트 활성화",
"description": "이 카메라의 감지 이벤트를 활성화하거나 비활성화합니다."
},
"labels": {
"label": "감지 대상 레이블",
"description": "일반 감지 이벤트로 인정할 객체 레이블 목록입니다."
},
"required_zones": {
"label": "필수 구역",
"description": "감지 이벤트로 처리되기 위해 객체가 진입해야 하는 구역입니다. 모든 구역을 허용하려면 비워 두세요."
},
"cutoff_time": {
"label": "감지 종료 대기 시간",
"description": "감지 유발 활동이 멈춘 후 이벤트를 공식 종료하기까지 대기할 시간(초)입니다."
},
"enabled_in_config": {
"label": "초기 감지 상태",
"description": "정적 설정에서 감지 이벤트가 원래 활성화되어 있었는지 여부를 추적합니다."
}
},
"genai": {
"label": "GenAI 다시보기 설정",
"description": "다시보기 항목의 설명과 요약을 생성하기 위한 생성형 AI 사용을 제어합니다.",
"enabled": {
"label": "GenAI 설명 활성화",
"description": "다시보기 항목에 대한 GenAI 기반 설명 및 요약 생성을 활성화하거나 비활성화합니다."
},
"alerts": {
"label": "알림에 GenAI 활성화",
"description": "알림 항목에 대해 GenAI로 설명을 생성합니다."
},
"detections": {
"label": "감지에 GenAI 활성화",
"description": "감지 항목에 대해 GenAI로 설명을 생성합니다."
},
"image_source": {
"label": "다시보기 이미지 소스",
"description": "GenAI로 전송할 이미지 소스 ('preview' 또는 'recordings'). 'recordings'는 화질이 더 높지만 토큰 사용량이 증가합니다."
},
"additional_concerns": {
"label": "추가 주의 사항",
"description": "이 카메라의 활동을 평가할 때 GenAI가 고려해야 할 추가 주의 사항이나 참고 사항 목록입니다."
},
"debug_save_thumbnails": {
"label": "썸네일 저장",
"description": "디버깅 및 검토를 위해 GenAI 제공업체로 전송된 썸네일을 저장합니다."
},
"enabled_in_config": {
"label": "초기 GenAI 상태",
"description": "정적 설정에서 GenAI 다시보기가 원래 활성화되어 있었는지 여부를 추적합니다."
},
"preferred_language": {
"label": "선호 언어",
"description": "GenAI가 생성할 응답에 요청할 선호 언어입니다."
},
"activity_context_prompt": {
"label": "활동 맥락 프롬프트",
"description": "GenAI 요약에 맥락을 제공하기 위해 어떤 활동이 의심스럽거나 정상적인지 설명하는 커스텀 프롬프트입니다."
}
}
},
"semantic_search": {
"label": "시맨틱(의미 기반) 검색",
"description": "유사한 항목을 찾기 위해 객체 임베딩을 구축하고 쿼리하는 시맨틱 검색 설정입니다.",
"triggers": {
"label": "트리거",
"description": "카메라별 시맨틱 검색 트리거를 위한 동작 및 매칭 기준입니다.",
"friendly_name": {
"label": "트리거 별칭",
"description": "UI에 표시될 이 트리거의 친숙한 이름(선택 사항)입니다."
},
"enabled": {
"label": "트리거 활성화",
"description": "이 시맨틱 검색 트리거를 활성화하거나 비활성화합니다."
},
"type": {
"label": "트리거 유형",
"description": "트리거 유형: 'thumbnail'(이미지 비교) 또는 'description'(텍스트 비교)."
},
"data": {
"label": "트리거 내용",
"description": "추적 객체와 매칭할 텍스트 문구 또는 썸네일 ID입니다."
},
"threshold": {
"label": "트리거 임계값",
"description": "이 트리거를 작동시키기 위해 요구되는 최소 유사도 점수(0~1)입니다."
},
"actions": {
"label": "트리거 동작",
"description": "트리거가 매칭되었을 때 실행할 동작 목록입니다 (notification, sub_label, attribute)."
}
}
},
"snapshots": {
"label": "스냅샷",
"description": "이 카메라에서 API로 생성되는 추적 객체 스냅샷 설정입니다.",
"enabled": {
"label": "스냅샷 활성화",
"description": "이 카메라의 스냅샷 저장을 활성화하거나 비활성화합니다."
},
"timestamp": {
"label": "타임스탬프 오버레이",
"description": "API 스냅샷에 타임스탬프를 덧씌워 표시합니다."
},
"bounding_box": {
"label": "바운딩 박스 오버레이",
"description": "API 스냅샷에 추적 객체의 바운딩 박스를 그립니다."
},
"crop": {
"label": "스냅샷 크롭",
"description": "API 스냅샷을 감지된 객체의 바운딩 박스 크기로 잘라냅니다."
},
"required_zones": {
"label": "필수 구역",
"description": "스냅샷을 저장하기 위해 객체가 반드시 진입해야 하는 구역입니다."
},
"height": {
"label": "스냅샷 높이",
"description": "API 스냅샷을 리사이즈할 높이(픽셀)입니다. 비워 두면 원본 크기를 유지합니다."
},
"retain": {
"label": "스냅샷 보관",
"description": "기본 보관 일수 및 객체별 재정의를 포함한 스냅샷 보관 설정입니다.",
"default": {
"label": "기본 보관 일수",
"description": "스냅샷을 보관할 기본 일수입니다."
},
"objects": {
"label": "객체별 보관 일수",
"description": "스냅샷 보관 일수를 객체 유형별로 개별 재정의합니다."
}
},
"quality": {
"label": "스냅샷 화질",
"description": "저장할 스냅샷의 인코딩 품질입니다 (0~100)."
}
},
"timestamp_style": {
"label": "타임스탬프 스타일",
"description": "스냅샷 및 디버그 뷰에 적용되는 타임스탬프 텍스트 스타일 옵션입니다.",
"position": {
"label": "타임스탬프 위치",
"description": "이미지 내 타임스탬프 위치 (tl: 좌상단, tr: 우상단, bl: 좌하단, br: 우하단)."
},
"format": {
"label": "타임스탬프 형식",
"description": "타임스탬프 표시에 사용할 날짜/시간 형식 문자열입니다 (Python datetime 포맷 코드)."
},
"color": {
"label": "타임스탬프 색상",
"description": "타임스탬프 텍스트의 RGB 색상값입니다 (모든 값은 0~255).",
"red": {
"label": "빨강 (Red)",
"description": "타임스탬프 색상의 빨간색 성분 (0-255)."
},
"green": {
"label": "초록 (Green)",
"description": "타임스탬프 색상의 초록색 성분 (0-255)."
},
"blue": {
"label": "파랑 (Blue)",
"description": "타임스탬프 색상의 파란색 성분 (0-255)."
}
},
"thickness": {
"label": "타임스탬프 두께",
"description": "타임스탬프 글자의 선 두께입니다."
},
"effect": {
"label": "타임스탬프 효과",
"description": "타임스탬프 텍스트에 적용할 시각 효과입니다 (none, solid, shadow)."
}
},
"best_image_timeout": {
"label": "최적 이미지 대기 시간",
"description": "가장 높은 신뢰도 점수를 가진 최적 이미지를 선별하기 위해 대기할 시간입니다."
},
"onvif": {
"label": "ONVIF",
"description": "이 카메라의 ONVIF 연결 및 PTZ 자동 추적 설정입니다.",
"host": {
"label": "ONVIF 호스트",
"description": "이 카메라의 ONVIF 서비스 호스트 주소(및 선택적 프로토콜 스키마)입니다."
},
"port": {
"label": "ONVIF 포트",
"description": "ONVIF 서비스 포트 번호입니다."
},
"user": {
"label": "ONVIF 사용자 이름",
"description": "ONVIF 인증에 사용할 사용자 이름입니다 (일부 기기는 관리자 계정이 필요함)."
},
"password": {
"label": "ONVIF 비밀번호",
"description": "ONVIF 인증 비밀번호입니다."
},
"tls_insecure": {
"label": "TLS 검증 비활성화",
"description": "ONVIF 통신 시 TLS 인증서 검증을 건너뛰고 Digest 인증을 끕니다 (안전하지 않으므로 신뢰할 수 있는 네트워크에서만 사용하세요)."
},
"profile": {
"label": "ONVIF 프로필",
"description": "PTZ 제어에 사용할 특정 ONVIF 미디어 프로필의 토큰 또는 이름입니다. 지정하지 않으면 유효한 PTZ 구성이 있는 첫 번째 프로필이 자동 선택됩니다."
},
"autotracking": {
"label": "자동 추적 (Autotracking)",
"description": "PTZ 카메라를 움직여 움직이는 객체를 프레임 중앙에 자동으로 추적하고 유지합니다.",
"enabled": {
"label": "자동 추적 활성화",
"description": "감지된 객체에 대한 PTZ 카메라의 자동 추적을 활성화하거나 비활성화합니다."
},
"calibrate_on_startup": {
"label": "시작 시 모터 캘리브레이션",
"description": "추적 정확도를 향상하기 위해 부팅 시 PTZ 모터 속도를 측정합니다. 보정 완료 후 Frigate가 movement_weights 값을 자동으로 업데이트합니다."
},
"zooming": {
"label": "줌 모드",
"description": "줌 동작 제어: disabled(팬/틸트만 사용), absolute(가장 안정적인 호환성), relative(팬/틸트/줌 동시 작동)."
},
"zoom_factor": {
"label": "줌 배율",
"description": "추적 중인 객체의 확대 수준을 제어합니다. 값이 낮으면 주변 시야를 넓게 유지하고, 높으면 대상을 가깝게 확대하지만 추적을 놓칠 위험이 있습니다 (0.1~0.75 사이 값)."
},
"track": {
"label": "추적 대상 객체",
"description": "자동 추적을 작동시킬 객체 유형 목록입니다."
},
"required_zones": {
"label": "필수 구역",
"description": "자동 추적이 시작되기 위해 객체가 먼저 진입해야 하는 구역입니다."
},
"return_preset": {
"label": "복귀 프리셋",
"description": "추적이 끝난 후 카메라가 돌아갈 펌웨어상의 ONVIF 프리셋 이름입니다."
},
"timeout": {
"label": "복귀 대기 시간",
"description": "객체를 놓친 후 카메라가 프리셋 위치로 복귀하기까지 대기할 시간(초)입니다."
},
"movement_weights": {
"label": "이동 가중치",
"description": "카메라 캘리브레이션을 통해 자동 생성된 보정값입니다. 수동으로 수정하지 마세요."
},
"enabled_in_config": {
"label": "초기 자동 추적 상태",
"description": "설정에서 자동 추적이 활성화되어 있었는지 여부를 추적하는 내부 필드입니다."
}
},
"ignore_time_mismatch": {
"label": "시간 불일치 무시",
"description": "ONVIF 통신 시 카메라와 Frigate 서버 간의 시간 동기화 차이를 무시합니다."
}
},
"type": {
"label": "카메라 유형",
"description": "카메라 유형"
},
"ui": {
"label": "카메라 UI",
"description": "UI에서 이 카메라의 표시 순서와 가시성을 제어합니다. 순서는 기본 대시보드에 영향을 미칩니다. 더 세부적인 설정은 카메라 그룹을 사용하세요.",
"order": {
"label": "UI 순서",
"description": "기본 대시보드 및 목록에서 카메라를 정렬하는 데 사용되는 숫자 순서입니다 (큰 숫자일수록 뒤에 표시됨)."
},
"dashboard": {
"label": "실시간 대시보드에 표시",
"description": "기본 '모든 카메라' 실시간 대시보드에 이 카메라를 표시할지 여부를 전환합니다. 비활성화해도 카메라 그룹이나 설정 등 UI의 다른 곳에서는 계속 접근할 수 있습니다."
},
"review": {
"label": "다시보기에 표시",
"description": "다시보기 페이지(카메라 필터, 모션 검토 및 기록 뷰 포함)에서 이 카메라를 표시할지 여부를 전환합니다."
}
},
"webui_url": {
"label": "카메라 관리 URL",
"description": "시스템 페이지에서 카메라 웹 관리 페이지로 바로 연결되는 URL입니다"
},
"profiles": {
"label": "프로필",
"description": "런타임 중에 활성화할 수 있는 부분 재정의를 포함한 명명된 설정 프로필입니다."
},
"enabled_in_config": {
"label": "초기 카메라 상태",
"description": "카메라의 원래 구성 상태를 추적합니다."
}
}
File diff suppressed because it is too large. Load diff
+19 -3
View File
@@ -1,8 +1,8 @@
{
"audio": {
"global": {
"detection": "전 감지",
"sensitivity": "전 민감도"
"detection": "전 감지",
"sensitivity": "전 민감도"
},
"cameras": {
"detection": "감지",
@@ -51,7 +51,23 @@
"filtering": "전역 필터링"
},
"cameras": {
"tracking": "추적"
"tracking": "추적",
"filtering": "필터링"
}
},
"record": {
"global": {
"retention": "전역 보관",
"events": "전역 이벤트"
},
"cameras": {
"retention": "보관",
"events": "이벤트"
}
},
"ffmpeg": {
"cameras": {
"cameraFfmpeg": "카메라별 FFmpeg 인수"
}
}
}
+21 -18
View File
@@ -1,32 +1,35 @@
{
"minimum": "최소 {{limit}} 이상",
"maximum": "최대 {{limit}} 이하",
"exclusiveMinimum": "최소 {{limit}} 초과",
"exclusiveMaximum": "최대 {{limit}} 미만",
"minLength": "{{limit}}자 이상이어야 합니다",
"maxLength": "{{limit}}자 이하여야 합니다",
"minItems": "{{limit}}개 이상이어야 합니다",
"maxItems": "{{limit}}개 이하여야 합니다",
"pattern": "잘못된 형식",
"required": "이 항목은 필수 입력 사항입니다",
"type": "잘못된 유형입니다",
"minimum": "{{limit}} 이상이어야 합니다",
"maximum": "{{limit}} 이하여야 합니다",
"exclusiveMinimum": "{{limit}} 초과여야 합니다",
"exclusiveMaximum": "{{limit}} 미만이어야 합니다",
"minLength": "최소 {{limit}}자 이상이어야 합니다",
"maxLength": "최대 {{limit}}자 이하여야 합니다",
"minItems": "최소 {{limit}}개 항목이 있어야 합니다",
"maxItems": "최대 {{limit}}개 항목까지 가능합니다",
"pattern": "잘못된 형식입니다",
"required": "이 항목은 필수입니다",
"type": "유효하지 않은 값 형식입니다",
"enum": "허용된 값 중 하나여야 합니다",
"const": "값이 예상된 상수 일치하지 않습니다",
"const": "예상된 상수 값과 일치하지 않습니다",
"uniqueItems": "모든 항목은 고유해야 합니다",
"format": "잘못된 형식",
"format": "유효하지 않은 형식입니다",
"additionalProperties": "알 수 없는 속성은 허용되지 않습니다",
"oneOf": "허용된 형식 중 하나와 일치해야 합니다",
"anyOf": "허용된 형식 중 최소 하나와 일치해야 합니다",
"oneOf": "허용된 스키마 중 정확히 하나와 일치해야 합니다",
"anyOf": "허용된 스키마 중 최소 하나와 일치해야 합니다",
"proxy": {
"header_map": {
"roleHeaderRequired": "역할 매핑이 설정된 경우 역할 헤더(Role header)가 필수입니다."
"roleHeaderRequired": "역할 매핑이 구성된 경우 역할 헤더가 필수입니다."
}
},
"ffmpeg": {
"inputs": {
"rolesUnique": "각 역할은 하나의 입력 스트림에만 할당할 수 있습니다.",
"detectRequired": "최소 하나의 입력 스트림에 'detect' 역할이 할당되어야 합니다.",
"hwaccelDetectOnly": "하드웨어 가속 설정은 'detect' 스트림에서만 가능합니다."
"detectRequired": "최소 하나의 입력 스트림에 'detect' 역할을 지정해야 합니다.",
"hwaccelDetectOnly": "하드웨어 가속 인수(hwaccel_args)는 detect 역할을 가진 입력 스트림에서만 정의할 수 있습니다."
}
},
"detect": {
"dimensionMustBeEven": "짝수여야 합니다."
}
}
+37 -26
View File
@@ -1,8 +1,8 @@
{
"person": "사람",
"bicycle": "자전거",
"car": "차",
"motorcycle": "원동기",
"car": "승용차",
"motorcycle": "오토바이",
"airplane": "비행기",
"bus": "버스",
"train": "기차",
@@ -24,31 +24,31 @@
"zebra": "얼룩말",
"giraffe": "기린",
"hat": "모자",
"backpack": "백팩",
"backpack": "배낭",
"umbrella": "우산",
"shoe": "신발",
"eye_glasses": "안경",
"handbag": "핸드백",
"tie": "타이",
"suitcase": "슈트케이스",
"frisbee": "프리스비",
"tie": "타이",
"suitcase": "여행 가방",
"frisbee": "프리스비(원반)",
"skis": "스키",
"snowboard": "스노우보드",
"sports_ball": "스포츠 볼",
"sports_ball": "",
"kite": "연",
"baseball_bat": "야구 방망이",
"baseball_glove": "야구 글브",
"baseball_glove": "야구 글브",
"skateboard": "스케이트보드",
"surfboard": "서핑보드",
"tennis_racket": "테니스 라켓",
"bottle": "병",
"plate": "번호판",
"plate": "접시",
"wine_glass": "와인잔",
"cup": "컵",
"fork": "포크",
"knife": "칼",
"spoon": "숟가락",
"bowl": "보울",
"bowl": "그릇",
"banana": "바나나",
"apple": "사과",
"sandwich": "샌드위치",
@@ -67,29 +67,29 @@
"dining_table": "식탁",
"window": "창문",
"desk": "책상",
"toilet": "화장실",
"toilet": "변기",
"door": "문",
"tv": "TV",
"laptop": "랩탑",
"mouse": "마우스",
"remote": "리모",
"laptop": "노트북",
"mouse": "생쥐",
"remote": "리모",
"keyboard": "키보드",
"cell_phone": "휴대",
"cell_phone": "휴대전화",
"microwave": "전자레인지",
"oven": "오븐",
"toaster": "토스터",
"toaster": "토스터",
"sink": "싱크대",
"refrigerator": "냉장고",
"blender": "블렌더",
"blender": "믹서기",
"book": "책",
"clock": "시계",
"vase": "꽃병",
"scissors": "가위",
"teddy_bear": "테디베어",
"hair_dryer": "헤어 드라이어",
"teddy_bear": "곰 인형",
"hair_dryer": "헤어드라이어",
"toothbrush": "칫솔",
"hair_brush": "",
"vehicle": "탈 것",
"hair_brush": "헤어브러시",
"vehicle": "탈것",
"squirrel": "다람쥐",
"deer": "사슴",
"animal": "동물",
@@ -98,17 +98,17 @@
"goat": "염소",
"rabbit": "토끼",
"raccoon": "라쿤",
"robot_lawnmower": "로봇 잔디깎",
"robot_lawnmower": "로봇 잔디깎",
"waste_bin": "쓰레기통",
"on_demand": "수동",
"on_demand": "수동 감지",
"face": "얼굴",
"license_plate": "차량 번호판",
"package": "패키지",
"package": "택배 상자",
"bbq_grill": "바베큐 그릴",
"amazon": "Amazon",
"usps": "USPS",
"ups": "UPS",
"fedex": "FedEx",
"fedex": "페덱스",
"dhl": "DHL",
"an_post": "An Post",
"purolator": "Purolator",
@@ -116,5 +116,16 @@
"nzpost": "NZPost",
"postnord": "PostNord",
"gls": "GLS",
"dpd": "DPD"
"dpd": "DPD",
"canada_post": "Canada Post",
"royal_mail": "Royal Mail",
"school_bus": "스쿨버스",
"skunk": "스컹크",
"kangaroo": "캥거루",
"baby": "아기",
"baby_stroller": "유모차",
"rickshaw": "인력거",
"rodent": "설치류",
"possum": "주머니쥐",
"garbage_truck": "청소차"
}
+72 -1
View File
@@ -1 +1,72 @@
{}
{
"documentTitle": "채팅 - Frigate",
"title": "Frigate 채팅",
"subtitle": "카메라 관리 및 인사이트 분석을 돕는 AI 어시스턴트입니다",
"placeholder": "무엇이든 물어보세요...",
"error": "문제가 발생했습니다. 다시 시도해 주세요.",
"processing": "처리 중입니다...",
"toolsUsed": "사용된 도구: {{tools}}",
"showTools": "도구 보기 ({{count}}개)",
"hideTools": "도구 숨기기",
"call": "호출",
"result": "결과",
"arguments": "인수:",
"response": "응답:",
"attachment_chip_label": "{{camera}}의 {{label}}",
"attachment_chip_remove": "첨부 파일 삭제",
"open_in_explore": "탐색에서 열기",
"attach_event_aria": "{{eventId}} 이벤트 첨부",
"attachment_picker_paste_label": "또는 이벤트 ID를 붙여넣으세요",
"attachment_picker_attach": "첨부하기",
"attachment_picker_placeholder": "이벤트를 첨부해 주세요",
"quick_reply_find_similar": "유사한 감지 기록 찾기",
"quick_reply_tell_me_more": "자세한 설명 요청",
"quick_reply_when_else": "다른 시간대 감지 확인",
"quick_reply_find_similar_text": "이와 유사한 감지 기록을 찾아주세요.",
"quick_reply_tell_me_more_text": "이 내용에 대해 더 자세히 알려주세요.",
"quick_reply_when_else_text": "이 대상이 다른 때에 또 감지된 적이 있나요?",
"anchor": "참조",
"similarity_score": "유사도",
"no_similar_objects_found": "유사한 객체를 찾을 수 없습니다.",
"semantic_search_required": "유사한 객체를 찾으려면 시맨틱 검색(Semantic search) 기능이 활성화되어 있어야 합니다.",
"send": "전송",
"suggested_requests": "다음과 같이 질문해 보세요:",
"starting_requests": {
"show_recent_events": "최근 이벤트 표시",
"show_camera_status": "카메라 상태 확인",
"recap": "부재 중 발생한 이벤트 요약",
"watch_camera": "카메라 활동 감시"
},
"starting_requests_prompts": {
"show_recent_events": "최근 1시간 동안 발생한 이벤트를 보여주세요",
"show_camera_status": "현재 카메라 상태는 어떤가요?",
"recap": "제가 자리를 비운 사이에 어떤 일이 있었나요?",
"watch_camera": "현관문을 주시하고 누군가 나타나면 저에게 알려주세요"
},
"new_chat": "새 채팅",
"settings": {
"title": "채팅 설정",
"show_stats": {
"title": "통계 표시",
"desc": "채팅 응답의 토큰 생성 속도 및 컨텍스트 크기를 표시합니다.",
"while_generating": "생성 중에만 표시",
"always": "항상 표시"
},
"auto_scroll": {
"title": "자동 스크롤",
"desc": "새 메시지가 도착하면 화면을 자동으로 아래로 이동합니다."
}
},
"stats": {
"context": "{{tokens}} 토큰",
"tokens_per_second": "{{rate}} t/s"
},
"reasoning": {
"active": "추론 중입니다…",
"show": "추론 과정 보기",
"hide": "추론 과정 숨기기"
},
"thinking": {
"toggle": "생각 과정 전환"
}
}
@@ -1,7 +1,7 @@
{
"documentTitle": "분류 모델 - Frigate",
"details": {
"scoreInfo": "점수는 해당 객체에 대한 모든 탐지 결과의 평균 분류 신뢰도를 나타냅니다.",
"scoreInfo": "점수는 객체에 대해 감지된 모든 결과의 평균 분류 신뢰도를 나타냅니다.",
"none": "없음",
"unknown": "알 수 없음"
},
@@ -10,26 +10,196 @@
"renameCategory": "클래스 이름 변경",
"deleteCategory": "클래스 삭제",
"deleteImages": "이미지 삭제",
"trainModel": "모델 훈련",
"trainModel": "모델 학습",
"addClassification": "분류 추가",
"deleteModels": "모델 삭제",
"editModel": "모델 편집"
"editModel": "모델 수정"
},
"tooltip": {
"trainingInProgress": "모델이 현재 학습 중입니다",
"noNewImages": "훈련할 새 이미지가 없습니다. 먼저 데이터셋에서 더 많은 이미지를 분류하세요.",
"noChanges": "마지막 훈련 이후 데이터셋에 변경 사항이 없습니다.",
"modelNotReady": "모델이 훈련 준비가 되지 않았습니다"
"trainingInProgress": "모델 학습이 진행 중입니다",
"noNewImages": "학습할 새 이미지가 없습니다. 데이터셋에서 이미지를 먼저 분류하세요.",
"noChanges": "마지막 학습 이후 데이터셋에 변경 사항이 없습니다.",
"modelNotReady": "모델이 학습할 준비가 되지 않았습니다"
},
"toast": {
"success": {
"deletedModel_other": "{{count}}개 모델을 성공적으로 삭제했습니다",
"categorizedImage": "이미지 분류 성공",
"reclassifiedImage": "이미지 재분류 성공",
"trainedModel": "모델 훈련 완료."
"deletedModel_other": "모델 {{count}}개 성공적으로 삭제했습니다",
"categorizedImage": "이미지를 성공적으로 분류했습니다",
"reclassifiedImage": "이미지를 성공적으로 재분류했습니다",
"trainedModel": "모델 학습을 성공적으로 완료했습니다.",
"trainingModel": "모델 학습을 성공적으로 시작했습니다.",
"updatedModel": "모델 설정을 성공적으로 업데이트했습니다",
"renamedCategory": "클래스 이름을 '{{name}}'(으)로 성공적으로 변경했습니다",
"deletedCategory_other": "클래스 {{count}}개를 삭제했습니다",
"deletedImage_other": "이미지 {{count}}장을 삭제했습니다"
},
"error": {
"deleteImageFailed": "삭제 실패: {{errorMessage}}",
"deleteCategoryFailed": "클래스 삭제 실패: {{errorMessage}}",
"deleteModelFailed": "모델 삭제 실패: {{errorMessage}}",
"categorizeFailed": "이미지 분류 실패: {{errorMessage}}",
"trainingFailed": "모델 학습에 실패했습니다. 자세한 내용은 Frigate 로그를 확인하세요.",
"trainingFailedToStart": "모델 학습 시작 실패: {{errorMessage}}",
"updateModelFailed": "모델 업데이트 실패: {{errorMessage}}",
"renameCategoryFailed": "클래스 이름 변경 실패: {{errorMessage}}",
"reclassifyFailed": "이미지 재분류 실패: {{errorMessage}}"
}
},
"train": {
"titleShort": "최근"
"titleShort": "최근",
"title": "최근 분류",
"aria": "최근 분류 선택"
},
"disabled": "비활성화됨",
"deleteCategory": {
"title": "클래스 삭제",
"desc": "정말로 '{{name}}' 클래스를 삭제하시겠습니까? 연결된 모든 이미지가 영구적으로 삭제되며 모델을 다시 학습해야 합니다.",
"minClassesTitle": "클래스를 삭제할 수 없음",
"minClassesDesc": "분류 모델은 최소 2개 이상의 클래스가 필요합니다. 이 클래스를 삭제하기 전에 다른 클래스를 추가하세요."
},
"deleteModel": {
"title": "분류 모델 삭제",
"single": "정말로 '{{name}}' 모델을 삭제하시겠습니까? 이미지 및 학습 데이터를 포함한 모든 연결된 데이터가 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다.",
"desc_other": "정말로 모델 {{count}}개를 삭제하시겠습니까? 이미지 및 학습 데이터를 포함한 모든 연결된 데이터가 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다."
},
"edit": {
"title": "분류 모델 수정",
"descriptionState": "이 상태 분류 모델의 클래스를 수정합니다. 변경 사항을 적용하려면 모델을 다시 학습해야 합니다.",
"descriptionObject": "이 객체 분류 모델의 객체 유형 및 분류 유형을 수정합니다.",
"enabled": "활성화됨",
"enabledDesc": "이 모델을 실행합니다. 비활성화하면 모델 실행이 중단되고 더 이상 분류 작업을 수행하지 않습니다.",
"saveAttempts": "시도 기록 저장 수",
"saveAttemptsDesc": "최근 분류 UI에 유지할 분류 시도 이미지의 개수입니다.",
"motion": "움직임 감지 시 실행",
"motionDesc": "설정된 크롭 영역 내에서 움직임이 감지될 때 분류를 실행합니다.",
"interval": "주기",
"intervalDesc": "주기적 분류 실행 간격(초)입니다. 움직임 감지 시에만 실행하려면 비워 두세요.",
"intervalPlaceholder": "주기 없음",
"stateClassesInfo": "모델이 업데이트되었습니다. 클래스 변경 사항을 적용하려면 모델을 다시 학습하세요.",
"errors": {
"saveAttemptsInvalid": "시도 기록 저장 수는 0 이상의 정수여야 합니다",
"intervalInvalid": "주기는 0보다 큰 정수여야 합니다"
}
},
"deleteDatasetImages": {
"title": "데이터셋 이미지 삭제",
"desc_other": "정말로 {{dataset}}에서 이미지 {{count}}장을 삭제하시겠습니까? 이 작업은 되돌릴 수 없으며 모델을 다시 학습해야 합니다."
},
"deleteTrainImages": {
"title": "학습 이미지 삭제",
"desc_other": "정말로 이미지 {{count}}장을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."
},
"renameCategory": {
"title": "클래스 이름 변경",
"desc": "'{{name}}'의 새 이름을 입력하세요. 이름 변경 사항을 적용하려면 모델을 다시 학습해야 합니다."
},
"description": {
"invalidName": "유효하지 않은 이름입니다. 이름에는 문자, 숫자, 공백, 아포스트로피('), 밑줄(_), 하이픈(-)만 포함할 수 있습니다."
},
"categories": "클래스",
"createCategory": {
"new": "새 클래스 만들기"
},
"categorizeImageAs": "이미지를 다음으로 분류:",
"categorizeImage": "이미지 분류",
"reclassifyImageAs": "이미지를 다음으로 재분류:",
"reclassifyImage": "이미지 재분류",
"menu": {
"objects": "객체",
"states": "상태"
},
"noModels": {
"object": {
"title": "객체 분류 모델 없음",
"description": "감지된 객체를 분류하기 위한 커스텀 모델을 생성하세요.",
"buttonText": "객체 모델 생성"
},
"state": {
"title": "상태 분류 모델 없음",
"description": "특정 카메라 영역의 상태 변화를 모니터링하고 분류하기 위한 커스텀 모델을 생성하세요.",
"buttonText": "상태 모델 생성"
}
},
"wizard": {
"title": "새 분류 생성",
"steps": {
"nameAndDefine": "이름 및 정의",
"stateArea": "상태 영역",
"chooseExamples": "예시 선택"
},
"step1": {
"description": "상태 모델은 고정된 카메라 영역의 변화(예: 문 열림/닫힘)를 모니터링합니다. 객체 모델은 감지된 객체에 세부 분류(예: 특정 동물, 배달원 등)를 추가합니다.",
"name": "이름",
"namePlaceholder": "모델 이름 입력...",
"type": "유형",
"typeState": "상태",
"typeObject": "객체",
"objectLabel": "객체 레이블",
"objectLabelPlaceholder": "객체 유형 선택...",
"classificationType": "분류 유형",
"classificationTypeTip": "분류 유형 자세히 알아보기",
"classificationTypeDesc": "하위 레이블은 객체 레이블에 추가 텍스트를 부여합니다 (예: 'Person: UPS'). 속성은 객체 메타데이터에 별도로 저장되는 검색 가능한 메타데이터입니다.",
"classificationSubLabel": "하위 레이블",
"classificationAttribute": "속성",
"classes": "클래스",
"states": "상태",
"classesTip": "클래스 자세히 알아보기",
"classesStateDesc": "카메라 영역이 가질 수 있는 서로 다른 상태를 정의합니다. 예를 들어 차고 문의 경우 'open'과 'closed'입니다.",
"classesObjectDesc": "감지된 객체를 분류할 서로 다른 범주를 정의합니다. 예를 들어 사람 분류의 경우 'delivery_person', 'resident', 'stranger'입니다.",
"classPlaceholder": "클래스 이름 입력...",
"errors": {
"nameRequired": "모델 이름은 필수입니다",
"nameLength": "모델 이름은 64자 이하여야 합니다",
"nameOnlyNumbers": "모델 이름은 숫자로만 구성될 수 없습니다",
"classRequired": "최소 1개 이상의 클래스가 필요합니다",
"classesUnique": "클래스 이름은 중복될 수 없습니다",
"noneNotAllowed": "'none' 클래스는 사용할 수 없습니다",
"stateRequiresTwoClasses": "상태 모델은 최소 2개 이상의 클래스가 필요합니다",
"objectLabelRequired": "객체 레이블을 선택하세요",
"objectTypeRequired": "분류 유형을 선택하세요"
}
},
"step2": {
"description": "카메라를 선택하고 각 카메라별로 모니터링할 영역을 지정하세요. 모델이 해당 영역의 상태를 분류합니다.",
"cameras": "카메라",
"selectCamera": "카메라 선택",
"noCameras": "+ 버튼을 눌러 카메라를 추가하세요",
"selectCameraPrompt": "목록에서 카메라를 선택하여 모니터링 영역을 설정하세요"
},
"step3": {
"selectImagesPrompt": "다음과 일치하는 모든 이미지를 선택하세요: {{className}}",
"selectImagesDescription": "이미지를 클릭하여 선택하세요. 이 클래스에 대한 선택을 마쳤으면 계속을 클릭하세요.",
"allImagesRequired_other": "모든 이미지를 분류해 주세요. 남은 이미지: {{count}}장.",
"generating": {
"title": "샘플 이미지 생성 중",
"description": "Frigate이 녹화 영상에서 대표 이미지를 추출하고 있습니다. 잠시만 기다려 주세요..."
},
"training": {
"title": "모델 학습 중",
"description": "백그라운드에서 모델을 학습하고 있습니다. 이 대화 상자를 닫아도 되며, 학습이 완료되는 즉시 모델이 실행됩니다."
},
"retryGenerate": "생성 재시도",
"noImages": "생성된 샘플 이미지가 없습니다",
"classifying": "분류 및 학습 진행 중...",
"trainingStarted": "학습이 성공적으로 시작되었습니다",
"modelCreated": "모델이 성공적으로 생성되었습니다. '최근 분류' 보기에서 누락된 상태의 이미지를 추가한 후 모델을 학습시키세요.",
"errors": {
"noCameras": "설정된 카메라가 없습니다",
"noObjectLabel": "선택된 객체 레이블이 없습니다",
"generateFailed": "예시 생성 실패: {{error}}",
"generationFailed": "생성에 실패했습니다. 다시 시도해 주세요.",
"classifyFailed": "이미지 분류 실패: {{error}}"
},
"generateSuccess": "샘플 이미지를 성공적으로 생성했습니다",
"refreshExamples": "새로운 예시 생성",
"refreshConfirm": {
"title": "새로운 예시를 생성하시겠습니까?",
"description": "새 이미지 세트가 생성되며 이전 클래스를 포함한 모든 선택 항목이 지워집니다. 모든 클래스에 대해 예시를 다시 선택해야 합니다."
},
"missingStatesWarning": {
"title": "클래스 예시 누락",
"description": "모든 클래스에 예시가 존재하는 것은 아닙니다. 새로운 예시를 생성하여 누락된 클래스를 찾거나, 계속 진행한 후 '최근 분류' 보기에서 나중에 이미지를 추가하세요."
}
}
}
}
@@ -2,17 +2,17 @@
"documentTitle": "설정 편집기 - Frigate",
"configEditor": "설정 편집기",
"safeConfigEditor": "설정 편집기 (안전 모드)",
"safeModeDescription": "설정 오류로 인해 Frigate가 안전 모드로 전환되었습니다.",
"safeModeDescription": "설정 유효성 검사 오류로 인해 Frigate가 안전 모드로 실행 중입니다.",
"copyConfig": "설정 복사",
"saveAndRestart": "저장 & 재시작",
"saveAndRestart": "저장 재시작",
"saveOnly": "저장만 하기",
"confirm": "저장 없이 나갈까요?",
"confirm": "저장하지 않고 종료하시겠습니까?",
"toast": {
"success": {
"copyToClipboard": "설정이 클립보드에 저장되었습니다."
"copyToClipboard": "설정이 클립보드에 복사되었습니다."
},
"error": {
"savingError": "설정 저장 오류"
"savingError": "설정 저장 중 오류가 발생했습니다"
}
}
}
+64 -27
View File
@@ -1,18 +1,18 @@
{
"alerts": "경보",
"detections": "대상 감지",
"alerts": "알림",
"detections": "감지",
"motion": {
"label": "움직임 감지",
"only": "움직임 감지만"
"label": "움직임",
"only": "움직임만"
},
"allCameras": "모든 카메라",
"empty": {
"alert": "다시 볼 '경보' 영상이 없습니다",
"detection": "다시 볼 '대상 감지' 영상이 없습니다",
"motion": "움직임 감지 데이터가 없습니다",
"alert": "검토할 알림이 없습니다",
"detection": "검토할 감지 내역이 없습니다",
"motion": "움직임 데이터가 없습니다",
"recordingsDisabled": {
"title": "녹화가 활성화되어야 합니다",
"description": "다시 보기 항목은 해당 카메라에서 녹화가 활성화된 경우에만 카메라에 대해 생성 수 있습니다."
"title": "녹화가 활성화되어 있어야 합니다",
"description": "해당 카메라 녹화 기능이 활성화되어 있어야 다시보기 항목이 생성 수 있습니다."
}
},
"timeline": {
@@ -22,39 +22,76 @@
"events": {
"label": "이벤트",
"aria": "이벤트 선택",
"noFoundForTimePeriod": "이 시간대에 이벤트가 없습니다."
"noFoundForTimePeriod": "해당 기간에 발생한 이벤트가 없습니다."
},
"detail": {
"noDataFound": "다시 볼 상세 데이터가 없습니다",
"aria": "상세 보기",
"trackedObject_one": "추적 대상",
"trackedObject_other": "추적 대상",
"noObjectDetailData": "상세 보기 데이터가 없습니다.",
"label": "세부 정보"
"noDataFound": "검토할 세부 정보 데이터가 없습니다",
"aria": "세부 정보 보기 전환",
"trackedObject_one": "객체 {{count}}개",
"trackedObject_other": "객체 {{count}}개",
"noObjectDetailData": "사용 가능한 객체 세부 정보가 없습니다.",
"label": "세부 정보",
"settings": "세부 정보 보기 설정",
"alwaysExpandActive": {
"title": "활성 항목 항상 펼치기",
"desc": "사용 가능한 경우 활성 다시보기 항목의 객체 세부 정보를 항상 펼쳐서 표시합니다."
}
},
"objectTrack": {
"trackedPoint": "추적 포인트",
"clickToSeek": "이 시점으로 이동"
"trackedPoint": "추적 지점",
"clickToSeek": "이 시간대로 이동하려면 클릭하세요"
},
"documentTitle": "다시 보기 - Frigate",
"documentTitle": "다시보기 - Frigate",
"recordings": {
"documentTitle": "녹화 - Frigate"
"documentTitle": "녹화 - Frigate",
"invalidSharedLink": "파싱 오류로 인해 타임스탬프 녹화 링크를 열 수 없습니다.",
"invalidSharedCamera": "알 수 없거나 권한이 없는 카메라이므로 타임스탬프 녹화 링크를 열 수 없습니다."
},
"calendarFilter": {
"last24Hours": "최근 24시간"
},
"markAsReviewed": "'다시 봤음'으로 표시",
"markTheseItemsAsReviewed": "이 영상들을 '다시 봤음'으로 표시",
"markAsReviewed": "검토 완료로 표시",
"markTheseItemsAsReviewed": "이 항목들을 검토 완료로 표시",
"newReviewItems": {
"label": "새로운 '다시 보기' 영상 보기",
"button": "새로운 '다시 보기' 영상"
"label": "새로운 다시보기 항목 보기",
"button": "검토할 새 항목"
},
"selected_one": "{{count}} 선택됨",
"selected_other": "{{count}} 선택됨",
"selected_one": "{{count}} 선택됨",
"selected_other": "{{count}} 선택됨",
"camera": "카메라",
"detected": "감지됨",
"suspiciousActivity": "수상한 행동",
"threateningActivity": "위협적인 행동",
"zoomIn": "확대",
"zoomOut": "축소"
"zoomOut": "축소",
"select_all": "전체",
"normalActivity": "정상 활동",
"needsReview": "검토 필요",
"securityConcern": "보안 주의",
"motionSearch": {
"menuItem": "움직임 검색",
"openMenu": "카메라 옵션"
},
"motionPreviews": {
"menuItem": "움직임 미리보기 보기",
"title": "움직임 미리보기: {{camera}}",
"mobileSettingsTitle": "움직임 미리보기 설정",
"mobileSettingsDesc": "재생 속도, 어둡기(Dim), 자르기(Crop)를 조절하고 움직임 전용 클립을 검토할 날짜를 선택하세요.",
"dim": "어둡기",
"dimAria": "어둡기 강도 조절",
"dimDesc": "배경 어둡기를 높여 움직임 영역의 가시성을 높입니다.",
"speed": "재생 속도",
"speedAria": "미리보기 재생 속도 선택",
"speedDesc": "미리보기 클립의 재생 속도를 선택하세요.",
"back": "뒤로",
"empty": "사용 가능한 미리보기가 없습니다",
"noPreview": "미리보기를 사용할 수 없습니다",
"seekAria": "{{camera}} 플레이어를 {{time}} 위치로 이동",
"filter": "필터",
"filterDesc": "선택한 영역에 움직임이 있는 클립만 표시합니다.",
"filterClear": "초기화",
"crop": "필터 영역으로 확대",
"cropAria": "미리보기를 필터 영역으로 자르기 전환",
"cropDesc": "전체 화면 대신 선택한 필터 영역으로 미리보기를 확대합니다."
}
}
+236 -12
View File
@@ -1,39 +1,263 @@
{
"documentTitle": "탐색 - Frigate",
"generativeAI": "생성형 AI",
"exploreMore": "{{label}} 더 많은 감지 대상 탐색하기",
"exploreMore": "더 많은 {{label}} 객체 탐색",
"exploreIsUnavailable": {
"title": "탐색을 사용할 수 없습니다",
"title": "탐색 기능을 사용할 수 없",
"embeddingsReindexing": {
"context": "추적 객체 임베딩 색인 재구성이 완료된 후 '탐색' 기능을 사용할 수 있습니다.",
"context": "추적 객체 임베딩 색인이 완료된 후 탐색 기능을 사용할 수 있습니다.",
"startingUp": "시작 중…",
"estimatedTime": "예상 남은시간:",
"estimatedTime": "예상 남은 시간:",
"finishingShortly": "곧 완료됩니다",
"step": {
"thumbnailsEmbedded": "처리된 썸네일: ",
"descriptionsEmbedded": "처리된 설명: ",
"trackedObjectsProcessed": "처리된 추적 감지: "
"thumbnailsEmbedded": "임베딩된 썸네일: ",
"descriptionsEmbedded": "임베딩된 설명: ",
"trackedObjectsProcessed": "처리된 추적 객체: "
}
},
"downloadingModels": {
"context": "Frigate 시맨틱 검색 기능을 지원하기 위해 필요한 임베딩 모델을 다운로드하고 있습니다. 네트워크 연결 속도에 따라 몇 분 정도 소요될 수 있습니다.",
"context": "Frigate 시맨틱 검색 기능을 지원하기 위해 필요한 임베딩 모델을 다운로드하고 있습니다. 네트워크 연결 속도에 따라 몇 분 정도 걸릴 수 있습니다.",
"setup": {
"visionModel": "비전 모델",
"visionModelFeatureExtractor": "비전 모델 특징 추출기",
"textModel": "Text model",
"textModel": "텍스트 모델",
"textTokenizer": "텍스트 토크나이저"
},
"tips": {
"context": "모델 다운로드된 후 추적 객체의 임베딩을 색인 재구성하는 것이 좋습니다."
"context": "모델 다운로드가 완료되면 추적 객체의 임베딩을 다시 색인하는 것이 좋습니다."
},
"error": "오류가 발생했습니다. Frigate 로그를 확인하세요."
}
},
"details": {
"timestamp": "시간 기록"
"timestamp": "타임스탬프",
"item": {
"title": "다시보기 항목 세부 정보",
"desc": "다시보기 항목 세부 정보",
"button": {
"share": "이 다시보기 항목 공유",
"viewInExplore": "탐색에서 보기"
},
"tips": {
"mismatch_other": "사용할 수 없는 객체 {{count}}개가 감지되어 이 다시보기 항목에 포함되었습니다. 해당 객체는 알림 또는 감지 기준을 충족하지 못했거나 이미 정리/삭제되었습니다.",
"hasMissingObjects": "다음 레이블에 대해 Frigate이 추적 객체를 저장하도록 하려면 설정을 조정하세요: <em>{{objects}}</em>"
},
"toast": {
"success": {
"regenerate": "{{provider}}에 새로운 설명을 요청했습니다. 제공업체의 처리 속도에 따라 새 설명을 다시 생성하는 데 시간이 걸릴 수 있습니다.",
"updatedSublabel": "하위 레이블을 성공적으로 업데이트했습니다.",
"updatedLPR": "차량 번호판을 성공적으로 업데이트했습니다.",
"updatedAttributes": "속성을 성공적으로 업데이트했습니다.",
"audioTranscription": "오디오 텍스트 변환을 성공적으로 요청했습니다. Frigate 서버 성능에 따라 변환이 완료되기까지 시간이 걸릴 수 있습니다."
},
"error": {
"regenerate": "{{provider}}에 새 설명 요청 실패: {{errorMessage}}",
"updatedSublabelFailed": "하위 레이블 업데이트 실패: {{errorMessage}}",
"updatedLPRFailed": "차량 번호판 업데이트 실패: {{errorMessage}}",
"updatedAttributesFailed": "속성 업데이트 실패: {{errorMessage}}",
"audioTranscription": "오디오 텍스트 변환 요청 실패: {{errorMessage}}"
}
}
},
"label": "레이블",
"editSubLabel": {
"title": "하위 레이블 수정",
"desc": "이 {{label}}의 새 하위 레이블 입력",
"descNoLabel": "이 추적 객체의 새 하위 레이블 입력"
},
"editLPR": {
"title": "차량 번호판 수정",
"desc": "이 {{label}}의 새 번호판 번호 입력",
"descNoLabel": "이 추적 객체의 새 번호판 번호 입력"
},
"editAttributes": {
"title": "속성 수정",
"desc": "이 {{label}}의 분류 속성 선택"
},
"snapshotScore": {
"label": "스냅샷 점수"
},
"topScore": {
"label": "최고 점수",
"info": "최고 점수는 추적 객체의 가장 높은 중간값(median) 점수이므로 검색 결과 썸네일에 표시된 점수와 다를 수 있습니다."
},
"score": {
"label": "신뢰도 점수"
},
"recognizedLicensePlate": "인식된 차량 번호판",
"attributes": "분류 속성",
"estimatedSpeed": "예상 속도",
"objects": "객체",
"camera": "카메라",
"zones": "구역",
"button": {
"findSimilar": "유사 항목 찾기",
"regenerate": {
"title": "다시 생성",
"label": "추적 객체 설명 다시 생성"
}
},
"description": {
"label": "설명",
"placeholder": "추적된 객체에 대한 설명",
"aiTips": "Frigate은 추적 객체의 수명주기가 완전히 끝날 때까지 생성형 AI 제공업체에 설명을 요청하지 않습니다."
},
"expandRegenerationMenu": "설명 재생성 메뉴 펼치기",
"regenerateFromSnapshot": "스냅샷 기반으로 다시 생성",
"regenerateFromThumbnails": "썸네일 기반으로 다시 생성",
"tips": {
"descriptionSaved": "설명을 성공적으로 저장했습니다",
"saveDescriptionFailed": "설명 업데이트 실패: {{errorMessage}}"
},
"title": {
"label": "제목"
},
"scoreInfo": "점수 정보"
},
"trackedObjectDetails": "추적 객체 세부 정보",
"type": {
"details": "세부 정보"
"details": "세부 정보",
"snapshot": "스냅샷",
"thumbnail": "썸네일",
"video": "동영상",
"tracking_details": "추적 세부 정보"
},
"trackingDetails": {
"title": "추적 세부 정보",
"noImageFound": "이 타임스탬프의 이미지를 찾을 수 없습니다.",
"createObjectMask": "객체 마스크 생성",
"adjustAnnotationSettings": "어노테이션 설정 조정",
"scrollViewTips": "이 객체 수명주기의 주요 순간을 보려면 클릭하세요.",
"autoTrackingTips": "자동 추적 카메라의 경우 바운딩 박스 위치가 부정확할 수 있습니다.",
"count": "{{second}}개 중 {{first}}",
"trackedPoint": "추적 지점",
"lifecycleItemDesc": {
"visible": "{{label}} 감지됨",
"entered_zone": "{{label}}이(가) {{zones}}에 진입함",
"active": "{{label}}이(가) 활동 상태로 전환됨",
"stationary": "{{label}}이(가) 정지 상태로 전환됨",
"attribute": {
"faceOrLicense_plate": "{{label}}의 {{attribute}} 감지됨",
"other": "{{label}}이(가) {{attribute}}(으)로 인식됨"
},
"gone": "{{label}}이(가) 사라짐",
"heard": "{{label}} 소리 감지됨",
"external": "{{label}} 감지됨",
"header": {
"zones": "구역",
"ratio": "비율",
"area": "면적",
"score": "점수",
"computedScore": "계산된 점수",
"topScore": "최고 점수",
"toggleAdvancedScores": "고급 점수 전환"
}
},
"annotationSettings": {
"title": "어노테이션 설정",
"showAllZones": {
"title": "모든 구역 표시",
"desc": "객체가 특정 구역에 진입한 프레임에서 항상 모든 구역을 표시합니다."
},
"offset": {
"label": "어노테이션 오프셋",
"desc": "이 데이터는 카메라의 감지(detect) 피드에서 생성되지만 녹화(record) 피드의 영상 위에 덧씌워집니다. 두 스트림이 완벽히 동기화되지 않을 수 있어 바운딩 박스와 녹화 영상이 정확히 일치하지 않을 수 있습니다. 이 설정을 사용하여 어노테이션을 시간상 앞뒤로 이동해 녹화 영상과의 싱크를 맞출 수 있습니다.",
"millisecondsToOffset": "감지 어노테이션을 오프셋할 밀리초(ms) 단위 시간입니다. <em>기본값: 0</em>",
"tips": "영상 재생이 박스 및 이동 경로 지점보다 앞서면 값을 낮추고, 영상 재생이 뒤처지면 값을 높이세요. 음수 값도 가능합니다.",
"toast": {
"success": "{{camera}} 카메라의 어노테이션 오프셋이 설정 파일에 저장되었습니다."
}
}
},
"carousel": {
"previous": "이전 슬라이드",
"next": "다음 슬라이드"
}
},
"itemMenu": {
"downloadVideo": {
"label": "동영상 다운로드",
"aria": "동영상 다운로드"
},
"downloadSnapshot": {
"label": "스냅샷 다운로드",
"aria": "스냅샷 다운로드"
},
"downloadCleanSnapshot": {
"label": "클린 스냅샷(박스 제외) 다운로드",
"aria": "클린 스냅샷 다운로드"
},
"viewTrackingDetails": {
"label": "추적 세부 정보 보기",
"aria": "추적 세부 정보 표시"
},
"findSimilar": {
"label": "유사 항목 찾기",
"aria": "유사한 추적 객체 찾기"
},
"addTrigger": {
"label": "트리거 추가",
"aria": "이 추적 객체에 대한 트리거 추가"
},
"audioTranscription": {
"label": "음성 변환",
"aria": "오디오 텍스트 변환 요청"
},
"submitToPlus": {
"label": "Frigate+에 제출",
"aria": "Frigate Plus에 제출"
},
"viewInHistory": {
"label": "기록에서 보기",
"aria": "기록에서 보기"
},
"deleteTrackedObject": {
"label": "이 추적 객체 삭제"
},
"showObjectDetails": {
"label": "객체 이동 경로 표시"
},
"hideObjectDetails": {
"label": "객체 이동 경로 숨기기"
},
"debugReplay": {
"label": "디버그 리플레이",
"aria": "디버그 리플레이 보기에서 이 추적 객체 보기"
},
"more": {
"aria": "더보기"
}
},
"dialog": {
"confirmDelete": {
"title": "삭제 확인",
"desc": "이 추적 객체를 삭제하면 스냅샷, 저장된 임베딩 및 연결된 모든 추적 세부 정보 항목이 제거됩니다. 기록 보기의 녹화 영상은 삭제되지 <em>않습니다</em>.<br /><br />정말로 계속 진행하시겠습니까?"
},
"toast": {
"error": "이 추적 객체 삭제 중 오류 발생: {{errorMessage}}"
}
},
"noTrackedObjects": "추적된 객체를 찾을 수 없음",
"fetchingTrackedObjectsFailed": "추적 객체 불러오기 오류: {{errorMessage}}",
"trackedObjectsCount_other": "추적된 객체 {{count}}개 ",
"searchResult": {
"tooltip": "{{type}} 기준 {{confidence}}% 일치",
"previousTrackedObject": "이전 추적 객체",
"nextTrackedObject": "다음 추적 객체",
"deleteTrackedObject": {
"toast": {
"success": "추적 객체가 성공적으로 삭제되었습니다.",
"error": "추적 객체 삭제 실패: {{errorMessage}}"
}
}
},
"aiAnalysis": {
"title": "AI 분석"
},
"concerns": {
"label": "주의 사항"
},
"objectLifecycle": {
"noImageFound": "이 추적 객체에 대한 이미지를 찾을 수 없습니다."
}
}
+101 -9
View File
@@ -1,11 +1,11 @@
{
"documentTitle": "내보내기 - Frigate",
"search": "검색",
"noExports": "내보내기가 없습니다",
"noExports": "내보내기 항목을 찾을 수 없음",
"deleteExport": {
"label": "내보내기 삭제"
},
"deleteExport.desc": "{{exportName}}을 지우시겠습니까?",
"deleteExport.desc": "정말로 {{exportName}} 항목을 삭제하시겠습니까?",
"editExport": {
"title": "내보내기 이름 변경",
"desc": "이 내보내기의 새 이름을 입력하세요.",
@@ -13,24 +13,116 @@
},
"toast": {
"error": {
"renameExportFailed": "내보내기 이름 변경 실패했습니다: {{errorMessage}}",
"assignCaseFailed": "케이스 할당 업데이트 실패: {{errorMessage}}"
"renameExportFailed": "내보내기 이름 변경 실패: {{errorMessage}}",
"assignCaseFailed": "케이스 지정 업데이트 실패: {{errorMessage}}",
"caseSaveFailed": "케이스 저장 실패: {{errorMessage}}",
"caseDeleteFailed": "케이스 삭제 실패: {{errorMessage}}"
}
},
"headings": {
"uncategorizedExports": "분류되지 않은 내보내기",
"uncategorizedExports": "분류 내보내기",
"cases": "케이스"
},
"tooltip": {
"shareExport": "내보내기 공유",
"downloadVideo": "동영상 다운로드",
"editName": "이름 편집",
"editName": "이름 수정",
"deleteExport": "내보내기 삭제",
"assignToCase": "케이스에 추가"
"assignToCase": "케이스에 추가",
"removeFromCase": "케이스에서 지우기"
},
"caseDialog": {
"title": "케이스에 추가",
"description": "기존 케이스를 선택하거나 새 케이스를 만드세요.",
"selectLabel": "케이스"
"description": "기존 케이스를 선택하거나 새 케이스를 생성하세요.",
"selectLabel": "케이스",
"newCaseOption": "새 케이스 생성",
"nameLabel": "케이스 이름",
"descriptionLabel": "설명"
},
"selected_one": "{{count}}개 선택됨",
"selected_other": "{{count}}개 선택됨",
"toolbar": {
"newCase": "새 케이스",
"addExport": "내보내기 추가",
"editCase": "케이스 수정",
"deleteCase": "케이스 지우기"
},
"deleteCase": {
"label": "케이스 삭제",
"desc": "정말로 {{caseName}} 케이스를 삭제하시겠습니까?",
"descKeepExports": "내보내기 파일들은 미분류 내보내기로 계속 유지됩니다.",
"descDeleteExports": "이 케이스에 포함된 모든 내보내기 파일이 영구적으로 삭제됩니다.",
"deleteExports": "내보내기 파일도 함께 삭제"
},
"caseCard": {
"emptyCase": "아직 내보내기 항목이 없습니다"
},
"jobCard": {
"defaultName": "{{camera}} 내보내기",
"queued": "대기 중",
"running": "실행 중",
"preparing": "준비 중",
"copying": "복사 중",
"encoding": "인코딩 중",
"encodingRetry": "인코딩 재시도 중",
"finalizing": "마무리 중"
},
"caseView": {
"noDescription": "설명 없음",
"createdAt": "{{value}} 생성됨",
"exportCount_one": "내보내기 1건",
"exportCount_other": "내보내기 {{count}}건",
"cameraCount_one": "카메라 1대",
"cameraCount_other": "카메라 {{count}}대",
"showMore": "더보기",
"showLess": "간략히 보기",
"emptyTitle": "이 케이스가 비어 있습니다",
"emptyDescription": "케이스를 정리하려면 기존의 미분류 내보내기 항목을 추가하세요.",
"emptyDescriptionNoExports": "추가할 수 있는 미분류 내보내기 항목이 아직 없습니다."
},
"caseEditor": {
"createTitle": "케이스 생성",
"editTitle": "케이스 수정",
"namePlaceholder": "케이스 이름",
"descriptionPlaceholder": "이 케이스에 대한 메모나 컨텍스트 추가"
},
"addExportDialog": {
"title": "{{caseName}}에 내보내기 추가",
"searchPlaceholder": "미분류 내보내기 검색",
"empty": "검색 결과와 일치하는 미분류 내보내기가 없습니다.",
"addButton_one": "내보내기 1건 추가",
"addButton_other": "내보내기 {{count}}건 추가",
"adding": "추가 중..."
},
"bulkActions": {
"addToCase": "케이스에 추가",
"moveToCase": "케이스로 이동",
"removeFromCase": "케이스에서 제거",
"delete": "삭제",
"deleteNow": "지금 삭제"
},
"bulkDelete": {
"title": "내보내기 일괄 삭제",
"desc_one": "정말로 내보내기 {{count}}건을 삭제하시겠습니까?",
"desc_other": "정말로 내보내기 {{count}}건을 삭제하시겠습니까?"
},
"bulkRemoveFromCase": {
"title": "케이스에서 제거",
"desc_one": "이 케이스에서 내보내기 {{count}}건을 제거하시겠습니까?",
"desc_other": "이 케이스에서 내보내기 {{count}}건을 제거하시겠습니까?",
"descKeepExports": "내보내기 파일이 미분류 상태로 이동됩니다.",
"descDeleteExports": "내보내기 파일이 영구적으로 삭제됩니다.",
"deleteExports": "대신 내보내기 파일 영구 삭제"
},
"bulkToast": {
"success": {
"delete": "내보내기 항목을 성공적으로 삭제했습니다",
"reassign": "케이스 지정을 성공적으로 업데이트했습니다",
"remove": "케이스에서 내보내기 항목을 성공적으로 제거했습니다"
},
"error": {
"deleteFailed": "내보내기 삭제 실패: {{errorMessage}}",
"reassignFailed": "케이스 지정 업데이트 실패: {{errorMessage}}"
}
}
}
+54 -42
View File
@@ -1,92 +1,104 @@
{
"description": {
"placeholder": "이 모음집의 이름 입력해주세요",
"addFace": "안면인식 라이브러리에서 첫 사진을 업로드해 새로운 컬렉션을 만들어보세요.",
"invalidName": "잘못된 이름입니다. 이름 문자, 숫자, 공백, 따옴표 ('), 밑줄 (_), 그리고 붙임표 (-)만 포함이 가능합니다.",
"nameCannotContainHash": "이름에 # 포함할 수 없습니다."
"placeholder": "이 컬렉션의 이름 입력",
"addFace": "첫 번째 이미지를 업로드하여 얼굴 라이브러리에 새 컬렉션을 추가하세요.",
"invalidName": "유효하지 않은 이름입니다. 이름에는 문자, 숫자, 공백, 아포스트로피('), 밑줄(_), 하이픈(-)만 포함할 수 있습니다.",
"nameCannotContainHash": "이름에 # 기호를 포함할 수 없습니다."
},
"details": {
"person": "사람",
"subLabelScore": "보조 레이블 신뢰도",
"face": "얼굴 상세정보",
"timestamp": "시간 기록",
"timestamp": "타임스탬프",
"unknown": "알 수 없음",
"scoreInfo": "점수는 각 이미지에서 얼굴 크기 가중치로 적용하여 모든 얼굴 점수의 평균을 낸 값입니다."
"scoreInfo": "점수는 각 이미지에서 얼굴이 차지하는 크기 가중치를 부여한 모든 얼굴 점수의 가중 평균입니다."
},
"selectItem": "{{item}} 선택",
"documentTitle": "얼굴 라이브러리 - Frigate",
"uploadFaceImage": {
"title": "얼굴 사진 올리기",
"desc": "얼굴을 스캔하 {{pageToggle}}에 포함하기 위해 이미지를 업로드하세요"
"title": "얼굴 이미지 업로드",
"desc": "얼굴을 스캔하 {{pageToggle}}에 추가할 이미지를 업로드하세요"
},
"collections": "모음집",
"collections": "컬렉션",
"createFaceLibrary": {
"title": "모음집 만들기",
"desc": "새로운 모음집 만들기",
"new": "새 얼굴 만들기",
"nextSteps": "강력한 기반을 구축하려면:<li>최근 인식 탭을 사용하여 감지된 각 사람의 이미지를 선택하고 학습세요.</li><li>최상의 결과를 위해 정면 이미지에 집중하고, 각도가 있는 얼굴이 촬영된 이미지는 학습에 사용하지 마세요.</li></ul>"
"new": "새 얼굴 등록",
"nextSteps": "정확도를 높이기 위한 권장 사항:<li>'최근 인식' 탭을 사용하여 감지된 인물별 이미지를 선택하고 학습시키세요.</li><li>최상의 결과를 위해 정면을 바라보는 사진 위주로 등록하고, 각도가 틀어진 얼굴 이미지는 피하세요.</li></ul>"
},
"steps": {
"faceName": "얼굴 이름 입력",
"uploadFace": "얼굴 사진 올리기",
"uploadFace": "얼굴 이미지 업로드",
"nextSteps": "다음 단계",
"description": {
"uploadFace": "정면을 향한 {{name}}의 얼굴이 보이는 이미지를 업로드하세요. 이미지를 얼굴만 자를 필요는 없습니다."
"uploadFace": "{{name}}의 얼굴이 정면에서 보이는 이미지를 업로드하세요. 얼굴 부분만 따로 크롭하지 않아도 됩니다."
}
},
"train": {
"title": "최근 인식",
"aria": "최근 인식 선택",
"titleShort": "최근"
"titleShort": "최근",
"empty": "최근 얼굴 인식 시도 내역이 없습니다",
"emptyNoLibrary": {
"title": "얼굴 업로드",
"description": "얼굴 인식 기능이 작동하려면 라이브러리에 최소 한 개 이상의 얼굴을 등록해야 합니다."
}
},
"selectFace": "얼굴 선택",
"deleteFaceLibrary": {
"title": "이름 삭제"
"title": "이름 삭제",
"desc": "정말로 '{{name}}' 컬렉션을 삭제하시겠습니까? 연결된 모든 얼굴이 영구적으로 삭제됩니다."
},
"deleteFaceAttempts": {
"title": "얼굴 삭제"
"title": "얼굴 삭제",
"desc_other": "정말로 얼굴 {{count}}개를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."
},
"renameFace": {
"title": "얼굴 이름 바꾸기",
"desc": "{{name}}의 새 이름을 입력하세요"
"title": "얼굴 이름 변경",
"desc": "'{{name}}'의 새 이름을 입력하세요"
},
"button": {
"deleteFaceAttempts": "얼굴 삭제",
"addFace": "얼굴 추가",
"renameFace": "얼굴 이름 바꾸기",
"renameFace": "얼굴 이름 변경",
"deleteFace": "얼굴 삭제",
"uploadImage": "이미지 올리기",
"reprocessFace": "얼굴 재조정"
"uploadImage": "이미지 업로드",
"reprocessFace": "얼굴 재처리"
},
"imageEntry": {
"validation": {
"selectImage": "이미지 파일을 선택해주세요."
"selectImage": "이미지 파일을 선택해 주세요."
},
"dropActive": "여기에 이미지 놓…",
"dropInstructions": "이미지를 끌어다 놓거나 여기에 붙여넣으세요. 선택할 수도 있습니다.",
"maxSize": "최대 용량: {{size}}MB"
"dropActive": "여기에 이미지으세요…",
"dropInstructions": "이미지를 여기로 드래그 앤 드롭하거나 붙여넣기, 또는 클릭하여 선택하세요",
"maxSize": "최대 크기: {{size}}MB"
},
"nofaces": "얼굴을 찾을 수 없습니다",
"nofaces": "사용 가능한 얼굴 없음",
"pixels": "{{area}}px",
"trainFaceAs": "얼굴을 다음과 같이 훈련하기:",
"trainFace": "얼굴 훈련하기",
"trainFaceAs": "다음으로 얼굴 학습:",
"trainFace": "얼굴 학습",
"toast": {
"success": {
"uploadedImage": "이미지 업로드에 성공했습니다.",
"addFaceLibrary": "{{name}} 을 성공적으로 얼굴 라이브러리에 추가했습니다!",
"deletedFace_other": "{{count}} 얼굴을 성공적으로 삭제했습니다.",
"renamedFace": "얼굴 이름을 {{name}}로 성공적으로 바꿨습니다",
"trainedFace": "얼굴 훈련을 성공적으로 마쳤습니다.",
"updatedFaceScore": "{{name}} 얼굴 점수 업데이트 성공 {{score}}."
"uploadedImage": "이미지를 성공적으로 업로드했습니다.",
"addFaceLibrary": "'{{name}}'이(가) 얼굴 라이브러리에 성공적으로 추가되었습니다!",
"deletedFace_other": "얼굴 {{count}}개를 성공적으로 삭제했습니다.",
"renamedFace": "얼굴 이름을 '{{name}}'(으)로 성공적으로 변경했습니다",
"trainedFace": "얼굴 학습을 성공적으로 완료했습니다.",
"updatedFaceScore": "얼굴 점수를 '{{name}}' ({{score}})(으)로 성공적으로 업데이트했습니다.",
"deletedName_other": "얼굴 {{count}}개를 성공적으로 삭제했습니다.",
"reclassifiedFace": "얼굴 재분류를 성공적으로 완료했습니다."
},
"error": {
"uploadingImageFailed": "이미지 업로드 실패:{{errorMessage}}",
"addFaceLibraryFailed": "얼굴 이름 설정 실패:{{errorMessage}}",
"deleteFaceFailed": "삭제 실패:{{errorMessage}}",
"deleteNameFailed": "이름 삭제 실패:{{errorMessage}}",
"renameFaceFailed": "이름 바꾸기 실패:{{errorMessage}}",
"trainFailed": "훈련 실패:{{errorMessage}}",
"updateFaceScoreFailed": "얼굴 신뢰도 업데이트 실패:{{errorMessage}}"
"uploadingImageFailed": "이미지 업로드 실패: {{errorMessage}}",
"addFaceLibraryFailed": "얼굴 이름 설정 실패: {{errorMessage}}",
"deleteFaceFailed": "삭제 실패: {{errorMessage}}",
"deleteNameFailed": "이름 삭제 실패: {{errorMessage}}",
"renameFaceFailed": "얼굴 이름 변경 실패: {{errorMessage}}",
"trainFailed": "학습 실패: {{errorMessage}}",
"updateFaceScoreFailed": "얼굴 점수 업데이트 실패: {{errorMessage}}",
"reclassifyFailed": "얼굴 재분류 실패: {{errorMessage}}"
}
}
},
"reclassifyFaceAs": "다음으로 얼굴 재분류:",
"reclassifyFace": "얼굴 재분류"
}
+71 -65
View File
@@ -1,22 +1,24 @@
{
"documentTitle": "실시간 보기 - Frigate",
"documentTitle.withCamera": "{{camera}} - 실시간 보기 - Frigate",
"documentTitle": {
"default": "실시간 - Frigate"
},
"documentTitle.withCamera": "{{camera}} - 실시간 - Frigate",
"lowBandwidthMode": "저대역폭 모드",
"twoWayTalk": {
"enable": "양방향 말하기 활성화",
"disable": "양방향 말하기 비활성화"
"enable": "양방향 대화 켜기",
"disable": "양방향 대화 끄기"
},
"cameraAudio": {
"enable": "카메라 오디오 활성화",
"disable": "카메라 오디오 비활성화"
"enable": "카메라 오디오 켜기",
"disable": "카메라 오디오 끄기"
},
"ptz": {
"move": {
"clickMove": {
"label": "클릭해서 카메라 중앙 배치",
"enable": "클릭해서 움직이기 기능 활성화",
"disable": "클릭해서 움직이기 기능 비활성화",
"enableWithZoom": "클릭하여 이동 / 드래그하여 확대 활성화"
"label": "화면을 클릭하여 카메라 중앙 맞추기",
"enable": "클릭 이동 활성화",
"disable": "클릭 이동 비활성화",
"enableWithZoom": "클릭 이동 / 드래그 활성화"
},
"left": {
"label": "PTZ 카메라 왼쪽으로 이동"
@@ -41,158 +43,162 @@
},
"focus": {
"in": {
"label": "PTZ 카메라 포커스 인"
"label": "PTZ 카메라 초점 당기기"
},
"out": {
"label": "PTZ 카메라 포커스 아웃"
"label": "PTZ 카메라 초점 밀기"
}
},
"frame": {
"center": {
"label": "클릭해서 PTZ 카메라 중앙 배치"
"label": "화면을 클릭하여 PTZ 카메라 중앙 맞추기"
}
},
"presets": "PTZ 카메라 프리셋"
},
"camera": {
"enable": "카메라 활성화",
"disable": "카메라 비활성화"
"disable": "카메라 비활성화",
"turnOn": "카메라 켜기",
"turnOff": "카메라 끄기"
},
"muteCameras": {
"enable": "모든 카메라 음소거",
"disable": "모든 카메라 음소거 해제"
},
"detect": {
"enable": "감지 활성화",
"disable": "감지 비활성화"
"enable": "감지(Detect) 켜기",
"disable": "감지(Detect) 끄기"
},
"recording": {
"enable": "녹화 활성화",
"disable": "녹화 비활성화"
"enable": "녹화 켜기",
"disable": "녹화 끄기",
"disabledInConfig": "이 카메라의 녹화를 활성화하려면 먼저 설정에서 켜야 합니다."
},
"snapshots": {
"enable": "스냅샷 활성화",
"disable": "스냅샷 비활성화"
"enable": "스냅샷 켜기",
"disable": "스냅샷 끄기"
},
"audioDetect": {
"enable": "오디오 감지 활성화",
"disable": "오디오 감지 비활성화"
"enable": "오디오 감지 켜기",
"disable": "오디오 감지 끄기"
},
"transcription": {
"enable": "실시간 오디오 자막 활성화",
"disable": "실시간 오디오 자막 비활성화"
"enable": "실시간 음성 전사 켜기",
"disable": "실시간 음성 전사 끄기"
},
"autotracking": {
"enable": "자동 추적 활성화",
"disable": "자동 추적 비활성화"
"enable": "자동 추적 켜기",
"disable": "자동 추적 끄기"
},
"streamStats": {
"enable": "스트림 통계 보기",
"disable": "스트림 통계 숨기기"
},
"manualRecording": {
"title": "수동 녹화",
"tips": "이 카메라의 녹화 보관 설정에 따라 인스턴트 스냅샷을 다운로드하거나 수동 녹화를 시작할 수 있습니다.",
"title": "수동 감지/녹화",
"tips": "즉시 스냅샷을 다운로드하거나 이 카메라의 녹화 보관 설정을 기반으로 수동 이벤트를 시작니다.",
"playInBackground": {
"label": "백그라운드에서 재생",
"desc": "이 옵션을 활성화하면 플레이어가 숨겨져도 계속 스트리밍됩니다."
"desc": "플레이어가 화면에서 가려져 있을 때도 스트리밍을 계속 유지합니다."
},
"showStats": {
"label": "통계 보기",
"desc": "이 옵션을 활성화하면 카메라 피드에 스트림 통계가 나타납니다."
"label": "통계 표시",
"desc": "카메라 피드 위에 실시간 스트림 통계 정보를 오버레이로 표시합니다."
},
"debugView": "디버그 보기",
"debugView": "디버그 ",
"start": "수동 녹화 시작",
"started": "수동 녹화 시작되었습니다.",
"failedToStart": "수동 녹화 시작 실패했습니다.",
"recordDisabledTips": "이 카메라 설정에서 녹화가 비활성화 되었거나 제한되어 있어 스냅샷만 저장됩니다.",
"started": "수동 녹화 시작습니다.",
"failedToStart": "수동 녹화 시작 실패했습니다.",
"recordDisabledTips": "이 카메라 설정에서 녹화가 비활성화되었거나 제한되어 있어 스냅샷만 저장됩니다.",
"end": "수동 녹화 종료",
"ended": "수동 녹화 종료되었습니다.",
"failedToEnd": "수동 녹화 종료 실패했습니다."
"ended": "수동 녹화 종료습니다.",
"failedToEnd": "수동 녹화 종료 실패했습니다."
},
"streamingSettings": "스트리밍 설정",
"notifications": "알림",
"audio": "오디오",
"suspend": {
"forTime": "일시지 시간: "
"forTime": "일시지 시간: "
},
"stream": {
"title": "스트림",
"audio": {
"available": "이 스트림에서 오디오 사용할 수 있습니다",
"unavailable": "이 스트림에서 오디오 사용할 수 없습니다",
"available": "이 스트림에서 오디오 기능을 사용할 수 있습니다",
"unavailable": "이 스트림에서 오디오 기능을 사용할 수 없습니다",
"tips": {
"title": "이 스트림에서 오디오를 사용하려면 카메라에서 오디오를 출력하고 go2rtc에서 설정해야 합니다."
"title": "오디오를 출력하려면 카메라에서 오디오를 지원하고 go2rtc에 해당 스트림이 설정되어 있어야 합니다."
}
},
"debug": {
"picker": "디버그 모드에 스트림 모드를 선택할 수 없습니다. 디버그 뷰에서는 항상 감지(Detect) 역할로 설정한 스트림을 사용합니다."
"picker": "디버그 모드에서는 스트림 선택할 수 없습니다. 디버그 뷰는 항상 detect 역할이 할당된 스트림을 사용합니다."
},
"twoWayTalk": {
"tips": "양방향 말하기 기능을 사용하려면 기기에서 기능을 지원해야하며 WebRTC 설정해야합니다.",
"available": "이 기기는 양방향 말하기 기능을 사용할 수 있습니다",
"unavailable": "이 기기는 양방향 말하기 기능을 사용할 수 없습니다"
"tips": "기기에서 해당 기능을 지원해야 하며 양방향 대화를 위해 WebRTC 설정되어 있어야 합니다.",
"available": "이 스트림에서 양방향 대화를 사용할 수 있습니다",
"unavailable": "이 스트림에서는 양방향 대화를 사용할 수 없습니다"
},
"lowBandwidth": {
"tips": "버퍼링 또는 스트림 오류로 실시간 화면 저대역폭 모드로 변경되었습니다.",
"resetStream": "스트림 리셋"
"tips": "버퍼링 또는 스트림 오류로 인해 실시간 화면 저대역폭 모드로 전환되었습니다.",
"resetStream": "스트림 초기화"
},
"playInBackground": {
"label": "백그라운드에서 재생",
"tips": "이 옵션을 활성화하면 플레이어가 숨겨져도 스트리밍이 지속됩니다."
"tips": "플레이어가 화면에서 가려져 있을 때도 스트리밍을 계속 유지합니다."
}
},
"cameraSettings": {
"title": "{{camera}} 설정",
"cameraEnabled": "카메라 활성화",
"objectDetection": "대상 감지",
"objectDetection": "객체 감지",
"recording": "녹화",
"snapshots": "스냅샷",
"audioDetection": "오디오 감지",
"transcription": "오디오 자막",
"autotracking": "자동 추적"
"transcription": "오디오 텍스트 변환",
"autotracking": "자동 추적",
"camera": "카메라"
},
"history": {
"label": "이전 영상 보기"
"label": "과거 녹화 영상 보기"
},
"effectiveRetainMode": {
"modes": {
"all": "전체",
"motion": "움직임 감지",
"active_objects": "활성 대상"
"motion": "움직임",
"active_objects": "활동 중인 객체"
},
"notAllTips": "{{source}} 녹화 보관 설정이 <code>mode: {{effectiveRetainMode}}</code>로 되어 있어, 이 수동 녹화는 {{effectiveRetainModeName}}이(가) 있는 구간만 저장됩니다."
},
"editLayout": {
"label": "레이아웃 편집",
"group": {
"label": "카메라 그룹 편집"
"label": "카메라 그룹 수정"
},
"exitEdit": "편집 종료"
},
"noCameras": {
"title": "설정된 카메라 없음",
"description": "카메라를 연결 시작하세요.",
"description": "Frigate에 카메라를 연결하여 시작하세요.",
"buttonText": "카메라 추가",
"restricted": {
"title": "연결된 카메라 없음",
"description": "이 그룹의 카메라를 볼 권한이 없습니다."
"title": "사용 가능한 카메라 없음",
"description": "이 그룹의 카메라를 볼 수 있는 권한이 없습니다."
},
"default": {
"title": "설정된 카메라 없음",
"description": "카메라를 연결하여 Frigate을 시작하세요.",
"description": "Frigate에 카메라를 연결하여 시작하세요.",
"buttonText": "카메라 추가"
},
"group": {
"title": "그룹 카메라 없음",
"description": "이 그룹에 할당되거나 활성화된 카메라가 없습니다.",
"title": "그룹 카메라 없음",
"description": "이 카메라 그룹에 할당되거나 활성화된 카메라가 없습니다.",
"buttonText": "그룹 관리"
}
},
"snapshot": {
"takeSnapshot": "인스턴트 스냅샷 다운로드",
"noVideoSource": "스냅샷을 비디오 소스가 없습니다.",
"captureFailed": "스냅샷 캡쳐를 하지 못했습니다.",
"downloadStarted": "스냅샷 다운로드가 시작습니다."
"takeSnapshot": "즉시 스냅샷 다운로드",
"noVideoSource": "스냅샷을 캡처할 비디오 소스가 없습니다.",
"captureFailed": "스냅샷 캡처에 실패했습니다.",
"downloadStarted": "스냅샷 다운로드가 시작되었습니다."
}
}
+76 -1
View File
@@ -1 +1,76 @@
{}
{
"documentTitle": "움직임 검색 - Frigate",
"title": "움직임 검색",
"description": "다각형을 그려 관심 영역(ROI)을 지정하고, 해당 영역 내에서 움직임 변화를 검색할 시간 범위를 지정하세요.",
"selectCamera": "움직임 검색을 불러오는 중입니다",
"startSearch": "검색 시작",
"searchStarted": "검색이 시작되었습니다",
"searchCancelled": "검색이 취소되었습니다",
"cancelSearch": "취소",
"searching": "검색 진행 중입니다.",
"scanning": "{{time}} 스캔 중",
"searchComplete": "검색 완료",
"noResultsYet": "선택한 영역의 움직임 변화를 찾으려면 검색을 실행하세요",
"noChangesFound": "선택한 영역에서 감지된 픽셀 변화가 없습니다",
"changesFound_other": "움직임 변화 {{count}}건 발견",
"framesProcessed": "{{count}}개 프레임 처리됨",
"jumpToTime": "이 시간대로 이동",
"results": "결과",
"showSegmentHeatmap": "히트맵",
"newSearch": "새 검색",
"clearResults": "결과 지우기",
"clearROI": "다각형 지우기",
"polygonControls": {
"points_other": "점 {{count}}개",
"undo": "마지막 점 취소",
"reset": "다각형 초기화",
"drawMode": "그리기",
"moveMode": "이동"
},
"motionHeatmapLabel": "움직임 히트맵",
"dialog": {
"title": "움직임 검색",
"cameraLabel": "카메라",
"previewAlt": "{{camera}} 카메라 미리보기"
},
"timeRange": {
"title": "검색 범위",
"start": "시작 시간",
"end": "종료 시간"
},
"settings": {
"title": "검색 설정",
"parallelMode": "병렬 모드",
"parallelModeDesc": "여러 녹화 구간을 동시에 스캔합니다 (더 빠르지만 디코딩 자원을 더 많이 소모함)",
"threshold": "민감도 임계값",
"thresholdDesc": "값이 낮을수록 더 미세한 변화를 감지합니다 (1-255)",
"minArea": "최소 변화 면적",
"minAreaDesc": "단일 움직임 영역의 최소 크기(관심 영역 대비 백분율)",
"maxResults": "최대 결과 수",
"maxResultsDesc": "일치하는 타임스탬프가 이 개수에 도달하면 검색을 중단합니다"
},
"errors": {
"noCamera": "카메라를 선택해 주세요",
"noROI": "관심 영역(ROI)을 그려 주세요",
"noTimeRange": "시간 범위를 선택해 주세요",
"invalidTimeRange": "종료 시간은 시작 시간 이후여야 합니다",
"searchFailed": "검색 실패: {{message}}",
"polygonTooSmall": "다각형은 최소 3개 이상의 점이 필요합니다",
"unknown": "알 수 없는 오류"
},
"changePercentage": "{{percentage}}% 변화됨",
"metrics": {
"title": "검색 지표",
"segmentsScanned": "스캔한 세그먼트",
"segmentsProcessed": "처리됨",
"segmentsSkippedInactive": "건너뜀 (활동 없음)",
"segmentsSkippedHeatmap": "건너뜀 (ROI 겹침 없음)",
"fallbackFullRange": "전체 범위 폴백 스캔",
"framesDecoded": "디코딩된 프레임",
"wallTime": "검색 소요 시간",
"segmentErrors": "세그먼트 오류",
"seconds": "{{seconds}}초",
"minutesSeconds": "{{minutes}}분 {{seconds}}초",
"scanSummary": "{{segments}}개 세그먼트 · {{time}}"
}
}
+3 -3
View File
@@ -1,12 +1,12 @@
{
"filter": "필터",
"export": "내보내기",
"calendar": "날짜",
"calendar": "달력",
"filters": "필터",
"toast": {
"error": {
"noValidTimeSelected": "올바른 시간 범위 선택하세요",
"endTimeMustAfterStartTime": "종료 시간은 시작 시간보다 뒤에 있어야합니다"
"noValidTimeSelected": "유효한 시간 범위 선택되지 않았습니다",
"endTimeMustAfterStartTime": "종료 시간은 시작 시간 이후여야 합니다"
}
}
}
+60 -1
View File
@@ -1 +1,60 @@
{}
{
"title": "디버그 리플레이",
"description": "디버깅을 위해 카메라 녹화본을 다시 재생합니다. 객체 목록에는 감지된 객체의 시간 지연 요약이 표시되며, 메시지 탭에는 리플레이 영상에 대한 Frigate 내부 메시지 스트림이 표시됩니다.",
"websocket_messages": "메시지",
"dialog": {
"title": "디버그 리플레이 시작",
"description": "객체 감지 및 추적 문제 디버깅을 위해 지난 녹화본을 반복 재생하는 임시 리플레이 카메라를 생성합니다. 리플레이 카메라는 원본 카메라와 동일한 감지 설정을 가집니다. 시작할 시간 범위를 선택하세요.",
"camera": "원본 카메라",
"timeRange": "시간 범위",
"preset": {
"1m": "최근 1분",
"5m": "최근 5분",
"timeline": "타임라인에서 선택",
"custom": "사용자 정의"
},
"startButton": "리플레이 시작",
"selectFromTimeline": "선택",
"starting": "리플레이 시작 중...",
"startLabel": "시작",
"endLabel": "종료",
"toast": {
"error": "디버그 리플레이 시작 실패: {{error}}",
"alreadyActive": "이미 활성화된 리플레이 세션이 있습니다",
"noRecordings": "선택한 시간 범위에서 녹화본을 찾을 수 없습니다",
"stopError": "디버그 리플레이 중지 실패: {{error}}",
"goToReplay": "리플레이로 이동"
}
},
"page": {
"noSession": "활성화된 디버그 리플레이 세션 없음",
"noSessionDesc": "기록(History) 보기 툴바에서 작업(Actions) 버튼을 클릭하고 '디버그 리플레이'를 선택하여 시작하세요.",
"goToRecordings": "기록으로 이동",
"preparingClip": "클립 준비 중…",
"preparingClipDesc": "Frigate이 선택한 시간 범위의 녹화본을 이어 붙이는 중입니다. 긴 시간 범위의 경우 약 1분 정도 소요될 수 있습니다.",
"startingCamera": "디버그 리플레이 시작 중…",
"startError": {
"title": "디버그 리플레이 시작 실패",
"back": "기록으로 돌아가기"
},
"sourceCamera": "원본 카메라",
"replayCamera": "리플레이 카메라",
"initializingReplay": "디버그 리플레이 초기화 중...",
"stoppingReplay": "디버그 리플레이 중지 중...",
"stopReplay": "리플레이 중지",
"confirmStop": {
"title": "디버그 리플레이를 중지하시겠습니까?",
"description": "세션이 중지되고 모든 임시 데이터가 정리됩니다. 계속하시겠습니까?",
"confirm": "리플레이 중지",
"cancel": "취소"
},
"activity": "활동",
"objects": "객체 목록",
"audioDetections": "오디오 감지",
"noActivity": "감지된 활동 없음",
"activeTracking": "활성 추적 중",
"noActiveTracking": "활성 추적 없음",
"configuration": "설정",
"configurationDesc": "디버그 리플레이 카메라의 움직임 감지 및 객체 추적 설정을 미세 조정합니다. Frigate 설정 파일에는 변경 사항이 저장되지 않습니다."
}
}
+52 -7
View File
@@ -1,14 +1,14 @@
{
"search": "검색",
"savedSearches": "저장된 검색",
"savedSearches": "저장된 검색 조건",
"button": {
"clear": "검색 초기화",
"save": "검색 저장",
"clear": "검색어 지우기",
"save": "검색 조건 저장",
"filterInformation": "필터 정보",
"delete": "저장된 검색 삭제",
"filterActive": "필터 활성화됨"
"delete": "저장된 검색 조건 삭제",
"filterActive": "필터 적용됨"
},
"searchFor": "{{inputValue}} 검색",
"searchFor": "'{{inputValue}}' 검색",
"trackedObjectId": "추적 객체 ID",
"filter": {
"label": {
@@ -22,7 +22,52 @@
"before": "이전",
"after": "이후",
"min_score": "최소 점수",
"max_score": "최대 점수"
"max_score": "최대 점수",
"min_speed": "최소 속도",
"max_speed": "최대 속도",
"recognized_license_plate": "인식된 차량 번호판",
"has_clip": "비디오 클립 있음",
"has_snapshot": "스냅샷 있음"
},
"searchType": {
"thumbnail": "썸네일",
"description": "설명"
},
"toast": {
"error": {
"beforeDateBeLaterAfter": "'이전(before)' 날짜는 '이후(after)' 날짜보다 뒤여야 합니다.",
"afterDatebeEarlierBefore": "'이후(after)' 날짜는 '이전(before)' 날짜보다 앞서야 합니다.",
"minScoreMustBeLessOrEqualMaxScore": "'최소 점수'는 '최대 점수'보다 작거나 같아야 합니다.",
"maxScoreMustBeGreaterOrEqualMinScore": "'최대 점수'는 '최소 점수'보다 크거나 같아야 합니다.",
"minSpeedMustBeLessOrEqualMaxSpeed": "'최소 속도'는 '최대 속도'보다 작거나 같아야 합니다.",
"maxSpeedMustBeGreaterOrEqualMinSpeed": "'최대 속도'는 '최소 속도'보다 크거나 같아야 합니다."
}
},
"tips": {
"title": "텍스트 필터 사용 방법",
"desc": {
"text": "필터를 사용하면 검색 결과를 좁힐 수 있습니다. 입력창에서 다음과 같이 사용하세요:",
"step1": "필터 키 이름 뒤에 콜론을 입력합니다 (예: \"cameras:\").",
"step2": "추천 목록에서 값을 선택하거나 직접 입력합니다.",
"step3": "필터 사이에 공백을 두어 여러 개의 필터를 연속으로 사용할 수 있습니다.",
"step4": "날짜 필터(before:, after:)는 {{DateFormat}} 형식을 사용합니다.",
"step5": "시간 범위 필터는 {{exampleTime}} 형식을 사용합니다.",
"step6": "필터 옆의 'x'를 클릭하여 필터를 제거합니다.",
"exampleLabel": "예시:"
}
},
"header": {
"currentFilterType": "필터 값",
"noFilters": "필터",
"activeFilters": "적용된 필터"
}
},
"similaritySearch": {
"title": "유사도 검색",
"active": "유사도 검색 활성 상태",
"clear": "유사도 검색 초기화"
},
"placeholder": {
"search": "검색…"
}
}
File diff suppressed because it is too large. Load diff
+150 -91
View File
@@ -1,198 +1,247 @@
{
"documentTitle": {
"cameras": "카메라 통계 - Frigate",
"storage": "저장 통계 - Frigate",
"general": "기본 통계 - Frigate",
"enrichments": "데이터 보강 통계 - Frigate",
"storage": "저장 공간 통계 - Frigate",
"general": "일반 통계 - Frigate",
"enrichments": "확장 기능 통계 - Frigate",
"logs": {
"frigate": "Frigate 로그 -Frigate",
"frigate": "Frigate 로그 - Frigate",
"go2rtc": "Go2RTC 로그 - Frigate",
"nginx": "Nginx 로그 - Frigate",
"websocket": "메지 로그 - Frigate"
"websocket": "메지 로그 - Frigate"
}
},
"title": "시스템",
"metrics": "시스템 통계",
"metrics": "시스템 지표",
"logs": {
"download": {
"label": "다운로드 로그"
"label": "로그 다운로드"
},
"copy": {
"label": "클립보드에 복사하기",
"success": "클립보드에 로그가 복사되었습니다",
"error": "클립보드에 로그를 저장할 수 없습니다"
"label": "클립보드에 복사",
"success": "로그를 클립보드에 복사했습니다",
"error": "로그를 클립보드에 복사할 수 없습니다"
},
"type": {
"label": "타입",
"timestamp": "시간 기록",
"label": "유형",
"timestamp": "타임스탬프",
"tag": "태그",
"message": "메시지"
},
"tips": "서버에서 로그 스트리밍 중",
"tips": "서버에서 로그가 실시간 스트리밍 중입니다",
"toast": {
"error": {
"fetchingLogsFailed": "로그 가져오기 오류: {{errorMessage}}",
"whileStreamingLogs": "스크리밍 로그 중 오류: {{errorMessage}}"
"whileStreamingLogs": "로그 스트리밍 중 오류 발생: {{errorMessage}}"
}
},
"websocket": {
"label": "메지",
"pause": "일시중지",
"resume": "재개",
"clear": "우기",
"label": "메지",
"pause": "일시 중지",
"resume": "다시 시작",
"clear": "우기",
"filter": {
"all": "전체 항목",
"topics": "항목",
"all": "모든 토픽",
"topics": "토픽",
"events": "이벤트",
"reviews": "리뷰",
"reviews": "다시보기",
"classification": "분류",
"face_recognition": "얼굴 인식",
"lpr": "번호판 인식",
"lpr": "차량 번호판 인식 (LPR)",
"system": "시스템",
"camera": "카메라",
"all_cameras": "모든 카메라",
"cameras_count_one": "{{count}} 카메라",
"cameras_count_other": "{{count}} 카메라"
"cameras_count_one": "카메라 {{count}}",
"cameras_count_other": "카메라 {{count}}대",
"camera_activity": "카메라 활동"
},
"empty": "수된 메시지 없음",
"count_one": "{{count}} 메세지",
"count_other": "{{count}} 메세지"
"empty": "수된 메시지가 아직 없습니다",
"count_one": "메시지 {{count}}",
"count_other": "메시지 {{count}}개",
"expanded": {
"payload": "페이로드"
}
}
},
"general": {
"title": "기본",
"title": "일반",
"detector": {
"title": "감지기",
"inferenceSpeed": "감지 추론 속도",
"inferenceSpeed": "감지 추론 속도",
"temperature": "감지기 온도",
"cpuUsage": "감지기 CPU 사용",
"memoryUsage": "감지기 메모리 사용",
"cpuUsageInformation": "감지 모델로 데이터를 입력/출력하기 위한 전처리 과정에서 사용되는 CPU 사용량입니다. GPU 가속기를 사용하는 경우에도 추론 자체의 사용량은 포함되지 않습니다."
"cpuUsage": "감지기 CPU 사용",
"memoryUsage": "감지기 메모리 사용",
"cpuUsageInformation": "감지 모델과의 입출력 데이터를 준비하는 데 사용 CPU 리소스입니다. GPU 또는 전용 가속기를 사용하더라도 추론 연산 자체의 사용량은 측정되지 않습니다."
},
"hardwareInfo": {
"title": "하드웨어 정보",
"gpuUsage": "GPU 사용",
"gpuUsage": "GPU 사용",
"gpuMemory": "GPU 메모리",
"gpuEncoder": "GPU 인코더",
"gpuDecoder": "GPU 디코더",
"gpuInfo": {
"vainfoOutput": {
"title": "Vainfo 출력",
"title": "Vainfo 출력 결과",
"processOutput": "프로세스 출력:",
"processError": "프로세스 오류:",
"returnCode": "리턴 코드:{{code}}"
"returnCode": "반환 코드: {{code}}"
},
"nvidiaSMIOutput": {
"title": "Nvidia SMI 출력",
"name": "이름:{{name}}",
"driver": "드라이버:{{driver}}",
"cudaComputerCapability": "CUDA Compute Capability:{{cuda_compute}}",
"vbios": "VBios Info: {{vbios}}"
"title": "Nvidia SMI 출력 결과",
"name": "이름: {{name}}",
"driver": "드라이버: {{driver}}",
"cudaComputerCapability": "CUDA 연산 능력: {{cuda_compute}}",
"vbios": "VBIOS 정보: {{vbios}}"
},
"copyInfo": {
"label": "GPU 정보 복사"
},
"toast": {
"success": "GPU 정보 클립보드에 복사되었습니다"
"success": "GPU 정보 클립보드에 복사습니다"
},
"closeInfo": {
"label": "GPU 정보 닫기"
}
},
"npuUsage": "NPU 사용",
"npuMemory": "NPU 메모리"
"npuUsage": "NPU 사용",
"npuMemory": "NPU 메모리",
"gpuCompute": "GPU 연산 / 인코딩",
"gpuTemperature": "GPU 온도",
"npuTemperature": "NPU 온도"
},
"otherProcesses": {
"title": "다른 프로세스",
"processCpuUsage": "사용중인 CPU 사용",
"processMemoryUsage": "사용중인 메모리 사용"
"title": "기타 프로세스",
"processCpuUsage": "프로세스 CPU 사용",
"processMemoryUsage": "프로세스 메모리 사용",
"series": {
"go2rtc": "go2rtc",
"recording": "녹화",
"review_segment": "다시보기 세그먼트",
"embeddings": "임베딩",
"audio_detector": "오디오 감지기"
}
}
},
"storage": {
"title": "스토리지",
"overview": "전체 현황",
"title": "저장 공간",
"overview": "개요",
"recordings": {
"title": "녹화",
"tips": "이 값은 Frigate 데이터베이스 녹화 영상이 사용 중인 전체 저장 공간니다. Frigate 디스크 내 다른 파일들의 저장 공간은 추적하지 않습니다.",
"earliestRecording": "가장 오래된 녹화 영상:"
"title": "녹화 파일",
"tips": "이 수치는 Frigate 데이터베이스에 기록된 녹화 파일이 사용하는 총 저장 공간을 나타냅니다. Frigate 디스크 상의 모든 파일에 대한 사용량을 추적하지 않습니다.",
"earliestRecording": "가장 오래된 녹화 시점:"
},
"cameraStorage": {
"title": "카메라 저장",
"title": "카메라 저장 공간",
"camera": "카메라",
"unusedStorageInformation": "미사용 저장소 정보",
"storageUsed": "용량",
"percentageOfTotalUsed": "전체 대비 비율",
"unusedStorageInformation": "여유 공간 정보",
"storageUsed": "저장 공간",
"percentageOfTotalUsed": "전체 대비 사용 비율",
"bandwidth": "대역폭",
"unused": {
"title": "미사용",
"tips": "드라이브에 Frigate 녹화 영상 외에 다른 파일이 저장되어 있는 경우,값은 Frigate에서 실제 사용 가능한 여유 공간 정확히 나타내지 않을 수 있습니다. Frigate는 녹화 영상 외의 저장 공간 사용량을 추적하지 않습니다."
"title": "여유 공간",
"tips": "드라이브에 Frigate 녹화 외에 다른 파일이 저장되어 있는 경우 이 수치가 Frigate에서 사용 가능한 실제 여유 공간 정확히 일치하지 않을 수 있습니다. Frigate은 자체 녹화본의 저장 공간 사용량을 추적하지 않습니다."
}
},
"shm": {
"title": "SHM (공유 메모리) 할당",
"warning": "현재 SHM 사이즈가 {{total}}MB 너무 습니다. 최소 {{min_shm}}MB 이상려주세요."
"title": "공유 메모리 (SHM) 할당",
"warning": "현재 공유 메모리 크기({{total}}MB)가 너무 습니다. 최소 {{min_shm}}MB 이상으로 늘려주세요.",
"frameLifetime": {
"title": "프레임 유지 시간",
"description": "각 카메라는 공유 메모리에 {{frames}}개의 프레임 슬롯을 가집니다. 가장 빠른 카메라의 프레임 속도를 기준으로, 각 프레임은 덮어쓰기 전까지 약 {{lifetime}}초 동안 유지됩니다."
}
}
},
"cameras": {
"title": "카메라",
"overview": "전체 현황",
"overview": "개요",
"info": {
"aspectRatio": "종횡비",
"fetching": "카메라 데이터 수집 중",
"aspectRatio": "화면비",
"fetching": "카메라 데이터 가져오는 중",
"stream": "스트림 {{idx}}",
"streamDataFromFFPROBE": "스트림 데이터는 <code>ffprobe</code>에서 받습니다.",
"streamDataFromFFPROBE": "스트림 데이터는 <code>ffprobe</code>를 통해 가져옵니다.",
"video": "비디오:",
"codec": "코덱:",
"resolution": "해상도:",
"fps": "FPS:",
"unknown": "알 수 없음",
"audio": "오디오:",
"error": "오류:{{error}}",
"cameraProbeInfo": "{{camera}} 카메라 장치 정보",
"error": "오류: {{error}}",
"cameraProbeInfo": "{{camera}} 카메라 탐색 정보",
"tips": {
"title": "카메라 장치 정보"
"title": "카메라 탐색 정보"
},
"keyframes": {
"title": "키프레임 분석",
"analyzing": "키프레임 분석 중... {{seconds}}초 남음",
"stillAnalyzing": "키프레임을 계속 분석하고 있습니다...",
"recordStream": "녹화 스트림:",
"keyframeCount": "감지된 키프레임 수:",
"observedDuration": "측정 기간:",
"gap": "키프레임 간격 (최소 / 평균 / 최대):",
"segmentLength": "녹화 세그먼트 길이:",
"ok": "키프레임이 약 {{seconds}}초마다 배치되어 녹화 및 재생에 적합합니다.",
"warning": "키프레임 간격이 불규칙하거나 멉니다(최대 간격 약 {{seconds}}초). 스마트 코덱(H.264+/H.265+)일 가능성이 높으며 권장되지 않습니다.",
"error": "키프레임 간격(약 {{seconds}}초)이 녹화 세그먼트 길이({{segmentTime}}초)를 초과합니다. 일부 세그먼트에 키프레임이 없어 재생에 문제가 발생할 수 있습니다. 카메라에서 스마트/+ 코덱을 끄거나 키프레임 간격을 줄이세요.",
"unknown": "키프레임 간격을 확인할 수 없습니다.",
"recordDisabled": "이 카메라의 녹화 기능이 비활성화되어 있습니다."
}
},
"framesAndDetections": "프레임 / 감지 (Detections)",
"framesAndDetections": "프레임 / 감지",
"label": {
"camera": "카메라",
"detect": "감지",
"skipped": "건너뜀",
"ffmpeg": "FFmpeg",
"capture": "캡",
"overallFramesPerSecond": "전체 초당 프레임",
"overallDetectionsPerSecond": "전체 초당 감지",
"overallSkippedDetectionsPerSecond": "전체 초당 건너뛴 감지",
"capture": "캡",
"overallFramesPerSecond": "전체 초당 프레임",
"overallDetectionsPerSecond": "전체 초당 감지",
"overallSkippedDetectionsPerSecond": "전체 초당 건너뛴 감지",
"cameraFfmpeg": "{{camName}} FFmpeg",
"cameraCapture": "{{camName}} 캡",
"cameraCapture": "{{camName}} 캡",
"cameraDetect": "{{camName}} 감지",
"cameraFramesPerSecond": "{{camName}} 초당 프레임",
"cameraDetectionsPerSecond": "{{camName}} 초당 감지",
"cameraSkippedDetectionsPerSecond": "{{camName}} 초당 건너뛴 감지"
"cameraFramesPerSecond": "{{camName}} 초당 프레임",
"cameraDetectionsPerSecond": "{{camName}} 초당 감지",
"cameraSkippedDetectionsPerSecond": "{{camName}} 초당 건너뛴 감지 수",
"cameraGpu": "{{camName}} GPU"
},
"toast": {
"success": {
"copyToClipboard": "데이터 정보가 클립보드에 복사되었습니다."
"copyToClipboard": "탐색 데이터를 클립보드에 복사습니다."
},
"error": {
"unableToProbeCamera": "카메라 정보 알 수 없음: {{errorMessage}}"
"unableToProbeCamera": "카메라를 탐색할 수 없음: {{errorMessage}}"
}
},
"noCameras": {
"title": "발견된 카메라 없음"
},
"connectionQuality": {
"title": "연결 상태",
"excellent": "매우 좋음",
"fair": "보통",
"poor": "불안정",
"unusable": "사용 불가",
"fps": "FPS",
"expectedFps": "예상 FPS",
"reconnectsLastHour": "재연결 횟수 (최근 1시간)",
"stallsLastHour": "지연/끊김 횟수 (최근 1시간)"
}
},
"lastRefreshed": "마지막 새로고침: ",
"lastRefreshed": "마지막 갱신: ",
"stats": {
"ffmpegHighCpuUsage": "{{camera}} FFmpeg CPU 사용량이 높습니다 ({{ffmpegAvg}}%)",
"detectHighCpuUsage": "{{camera}} 감지 CPU 사용량이 높습니다 ({{detectAvg}}%)",
"healthy": "시스템 상",
"reindexingEmbeddings": "검색 데이터 재정리 중 ({{processed}}% 완료)",
"cameraIsOffline": "{{camera}} 오프라인입니다",
"detectIsSlow": "{{detect}} (이/가) 느립니다 ({{speed}} ms)",
"detectIsVerySlow": "{{detect}} (이/가) 매우 느립니다 ({{speed}} ms)",
"shmTooLow": "/dev/shm 할당량({{total}} MB) 최소 {{min}} MB 이상 증가시켜야합니다."
"ffmpegHighCpuUsage": "{{camera}} 카메라의 FFmpeg CPU 사용량이 높습니다 ({{ffmpegAvg}}%)",
"detectHighCpuUsage": "{{camera}} 카메라의 감지(detect) CPU 사용량이 높습니다 ({{detectAvg}}%)",
"healthy": "시스템 상태가 양호합니다",
"reindexingEmbeddings": "임베딩 재색인 중 ({{processed}}% 완료)",
"cameraIsOffline": "{{camera}} 카메라가 오프라인 상태입니다",
"detectIsSlow": "{{detect}} 처리가 느립니다 ({{speed}}ms)",
"detectIsVerySlow": "{{detect}} 처리가 매우 느립니다 ({{speed}}ms)",
"shmTooLow": "/dev/shm 할당량({{total}}MB) 최소 {{min}}MB 이상으로 늘려야 합니다.",
"debugReplayActive": "디버그 리플레이 세션이 실행 중입니다"
},
"enrichments": {
"title": "데이터 보강",
"infPerSecond": "초당 추론 속도",
"title": "확장 기능",
"infPerSecond": "초당 추론 횟수",
"embeddings": {
"image_embedding": "이미지 임베딩",
"text_embedding": "텍스트 임베딩",
@@ -203,8 +252,18 @@
"face_recognition_speed": "얼굴 인식 속도",
"plate_recognition_speed": "번호판 인식 속도",
"text_embedding_speed": "텍스트 임베딩 속도",
"yolov9_plate_detection_speed": "YOLOv9 플레이트 감지 속도",
"yolov9_plate_detection": "YOLOv9 플레이트 감지"
}
"yolov9_plate_detection_speed": "YOLOv9 번호판 감지 속도",
"yolov9_plate_detection": "YOLOv9 번호판 감지",
"review_description": "다시보기 설명",
"review_description_speed": "다시보기 설명 생성 속도",
"review_description_events_per_second": "다시보기 설명",
"object_description": "객체 설명",
"object_description_speed": "객체 설명 생성 속도",
"object_description_events_per_second": "객체 설명",
"classification": "{{name}} 분류",
"classification_speed": "{{name}} 분류 속도",
"classification_events_per_second": "{{name}} 초당 분류 이벤트 수"
},
"averageInf": "평균 추론 시간"
}
}
+4 -3
View File
@@ -214,7 +214,8 @@
"ur": "Urdu",
"zhHant": "Tradicinė Kinijos",
"hr": "Kroatų",
"bs": "Bosnių"
"bs": "Bosnių",
"be": "Baltarusų"
},
"appearance": "Išvaizda",
"darkMode": {
@@ -252,8 +253,8 @@
}
},
"review": "Peržiūros",
"explore": "Iškoti",
"export": "Išrašas",
"explore": "Ieškoti",
"export": "Išrašai",
"faceLibrary": "Veidų Biblioteka",
"user": {
"title": "Vartotojas",
+1 -1
View File
@@ -74,7 +74,7 @@
"placeholder": "Pavadinti išrašą"
},
"select": "Pasirinkti",
"export": "Išrašas",
"export": "Išrašai",
"selectOrExport": "Pasirinkti ar sukurti išrašą",
"toast": {
"success": "Sėkmingai pradėtas Išrašų kūrimas. Peržiūrėkite išrašų puslapyje.",
+4 -1
View File
@@ -1,7 +1,7 @@
{
"record": {
"export": {
"label": "Išrašų konfiguracija",
"label": "Išrašo konfiguracija",
"description": "Nustatymai naudojami kuriant įrašų išrašus tokie kaip timelaps ir hardware acceleration.",
"hwaccel_args": {
"label": "Išrašų hwaccel args",
@@ -23,5 +23,8 @@
"label": "Įjungti RNA",
"description": "Įjungti ar išjungti RNA šiai kamerai."
}
},
"enabled": {
"label": "Įjungta"
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"record": {
"export": {
"label": "Išrašų konfiguracija",
"label": "Išrašo konfiguracija",
"description": "Nustatymai naudojami kuriant įrašų išrašus tokie kaip timelaps ir hardware acceleration.",
"hwaccel_args": {
"label": "Išrašų hwaccel args",
+2 -2
View File
@@ -228,8 +228,8 @@
"label": "Slėpti objektų kelią"
},
"downloadCleanSnapshot": {
"label": "Atsisiųsti švarią nuotrauką",
"aria": "Atsisiųsti švarią nuotrauką"
"label": "Atsisiųsti nuotrauką",
"aria": "Atsisiųsti nuotrauką"
},
"viewTrackingDetails": {
"label": "Žiūrėti sekimo detales",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"filter": "Filtras",
"export": "Išrašas",
"export": "Išrašai",
"calendar": "Kalendorius",
"filters": "Filtrai",
"toast": {
+9 -1
View File
@@ -1010,11 +1010,19 @@
"cameraManagement": {
"deleteCameraDialog": {
"deleteExports": "Taip pat ištrinti išrašus šiai kamerai"
},
"streams": {
"saved": "Išsaugota"
}
},
"maintenance": {
"sync": {
"exports": "Išrašai"
"exports": "Išrašus"
}
},
"birdseye": {
"cameraOrder": {
"saved": "Išsaugota"
}
}
}
+2 -1
View File
@@ -218,7 +218,8 @@
"ur": "اردو (Urdu)",
"hr": "Hrvatski (Kroatisk)",
"bs": "Bosanski (Bosnisk)",
"zhHant": "繁體中文 (Tradisjonell kinesisk)"
"zhHant": "繁體中文 (Tradisjonell kinesisk)",
"be": "Беларуская (Belarusisk)"
},
"appearance": "Utseende",
"darkMode": {
Loaded 100 of 164 files, more files were not shown because too many files have changed in this diff. Show more