Compare commits

..

22 Commits

Author SHA1 Message Date
Weblate (bot)
c4fe2e54b5
Merge 838de36ac0 into 7e83d5de90 2026-06-04 01:44:11 +02:00
Hosted Weblate
838de36ac0
Added translation using Weblate (Zuni)
Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Added translation using Weblate (Zuni)

Co-authored-by: Firas <firas.amm@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2026-06-02 07:50:17 +02:00
Hosted Weblate
cfd71bccf7
Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (473 of 473 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (1171 of 1171 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (53 of 53 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/config-cameras/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/nb_NO/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-settings
2026-06-02 07:50:17 +02:00
Hosted Weblate
da432a6677
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (807 of 807 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (473 of 473 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1268 of 1268 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 94.6% (1196 of 1263 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1195 of 1195 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1186 of 1186 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1183 of 1183 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1181 of 1181 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (53 of 53 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1176 of 1176 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/components-player/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/zh_Hans/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/common
Translation: Frigate NVR/components-player
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-motionSearch
Translation: Frigate NVR/views-settings
2026-06-02 07:50:17 +02:00
Hosted Weblate
e340f8d23c
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.5% (237 of 238 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (26 of 26 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KelvinKueh <kelvin.kueh@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/zh_Hant/
Translation: Frigate NVR/common
Translation: Frigate NVR/components-player
2026-06-02 07:50:17 +02:00
Hosted Weblate
6f21b12c02
Translated using Weblate (Uzbek)
Currently translated at 0.3% (2 of 501 strings)

Co-authored-by: Hamza Foziljonov <hamza.uztranslator@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/uz/
Translation: Frigate NVR/audio
2026-06-02 07:50:17 +02:00
Hosted Weblate
2978592ca1
Translated using Weblate (Khmer (Central))
Currently translated at 0.9% (5 of 501 strings)

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Added translation using Weblate (Khmer (Central))

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: reanyouda <mr.reanyouda@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/km/
Translation: Frigate NVR/audio
2026-06-02 07:50:17 +02:00
Hosted Weblate
18c7377228
Translated using Weblate (French)
Currently translated at 67.0% (850 of 1268 strings)

Translated using Weblate (French)

Currently translated at 85.1% (86 of 101 strings)

Translated using Weblate (French)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (French)

Currently translated at 82.1% (83 of 101 strings)

Co-authored-by: Gloup <emeric.denis@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: LeBuzzy <bwinster2@outlook.com>
Co-authored-by: Lorent Felix <comloren@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/views-settings/fr/
Translation: Frigate NVR/common
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/views-settings
2026-06-02 07:50:16 +02:00
Hosted Weblate
072a832afb
Translated using Weblate (Spanish)
Currently translated at 100.0% (807 of 807 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (473 of 473 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (1268 of 1268 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (1263 of 1263 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (1263 of 1263 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Spanish)

Currently translated at 99.2% (1253 of 1263 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (1186 of 1186 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (1183 of 1183 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (1181 of 1181 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (1176 of 1176 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jjavin <javiernovoa@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/es/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/es/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/es/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/es/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/es/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/es/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/es/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/es/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/es/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/common
Translation: Frigate NVR/components-player
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-motionSearch
Translation: Frigate NVR/views-settings
2026-06-02 07:50:16 +02:00
Hosted Weblate
9bfc2a371a
Translated using Weblate (Dutch)
Currently translated at 83.9% (397 of 473 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (127 of 127 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Dutch)

Currently translated at 97.9% (794 of 811 strings)

Translated using Weblate (Dutch)

Currently translated at 93.7% (224 of 239 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (Dutch)

Currently translated at 92.8% (221 of 238 strings)

Translated using Weblate (Dutch)

Currently translated at 98.0% (1148 of 1171 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Hosted Weblate user 151476 <marijndekker3@gmail.com>
Co-authored-by: Hosted Weblate user 151476 <micel@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-camera/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/nl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/nl/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/common
Translation: Frigate NVR/components-camera
Translation: Frigate NVR/components-player
Translation: Frigate NVR/objects
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-facelibrary
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-settings
2026-06-02 07:50:16 +02:00
Hosted Weblate
054c6f5ff1
Translated using Weblate (Indonesian)
Currently translated at 5.0% (24 of 473 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (127 of 127 strings)

Translated using Weblate (Indonesian)

Currently translated at 1.8% (15 of 811 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (501 of 501 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (64 of 64 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (59 of 59 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (45 of 45 strings)

Translated using Weblate (Indonesian)

Currently translated at 86.6% (52 of 60 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (175 of 175 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (49 of 49 strings)

Translated using Weblate (Indonesian)

Currently translated at 59.3% (38 of 64 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (86 of 86 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (501 of 501 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (1176 of 1176 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Indonesian)

Currently translated at 30.7% (39 of 127 strings)

Co-authored-by: Arif Budiman <arifpedia@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Joseph K <o.joseph.k@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-search/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/id/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/id/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/audio
Translation: Frigate NVR/common
Translation: Frigate NVR/objects
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-replay
Translation: Frigate NVR/views-search
Translation: Frigate NVR/views-settings
Translation: Frigate NVR/views-system
2026-06-02 07:50:16 +02:00
Hosted Weblate
c08752a5b2
Translated using Weblate (Arabic)
Currently translated at 28.3% (142 of 501 strings)

Translated using Weblate (Arabic)

Currently translated at 18.8% (24 of 127 strings)

Co-authored-by: Firas <firas.amm@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/ar/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/ar/
Translation: Frigate NVR/audio
Translation: Frigate NVR/objects
2026-06-02 07:50:16 +02:00
Hosted Weblate
468729230d
Translated using Weblate (Italian)
Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Italian)

Currently translated at 26.4% (125 of 473 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (1195 of 1195 strings)

Translated using Weblate (Italian)

Currently translated at 28.3% (230 of 811 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Italian)

Currently translated at 26.2% (124 of 473 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Italian)

Currently translated at 28.2% (229 of 811 strings)

Translated using Weblate (Italian)

Currently translated at 28.1% (228 of 811 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (1183 of 1183 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Italian)

Currently translated at 26.0% (123 of 473 strings)

Co-authored-by: Frank_ai <cyberpez.ai@gmail.com>
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/components-player/it/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/it/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/it/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/it/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/it/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/it/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/it/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/common
Translation: Frigate NVR/components-player
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-settings
2026-06-02 07:50:16 +02:00
Hosted Weblate
30ae1c45d5
Translated using Weblate (Polish)
Currently translated at 100.0% (501 of 501 strings)

Translated using Weblate (Polish)

Currently translated at 94.1% (224 of 238 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: magnumek <m4gnumek@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/pl/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/pl/
Translation: Frigate NVR/audio
Translation: Frigate NVR/common
2026-06-02 07:50:16 +02:00
Hosted Weblate
07d1b975af
Translated using Weblate (Catalan)
Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (473 of 473 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (1268 of 1268 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (807 of 807 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (1263 of 1263 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (45 of 45 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (1263 of 1263 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (1195 of 1195 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (1186 of 1186 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (1183 of 1183 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (175 of 175 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (1181 of 1181 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (1176 of 1176 strings)

Co-authored-by: Eduardo Pastor Fernández <123eduardoneko123@gmail.com>
Co-authored-by: Gerard Ricart Castells <gerard.ricart@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/components-player/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/ca/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/ca/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/common
Translation: Frigate NVR/components-player
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-explore
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-06-02 07:50:15 +02:00
Hosted Weblate
5b00724106
Translated using Weblate (Japanese)
Currently translated at 100.0% (1263 of 1263 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (473 of 473 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (1263 of 1263 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Japanese)

Currently translated at 93.9% (1186 of 1263 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (10 of 10 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (501 of 501 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (175 of 175 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (59 of 59 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (101 of 101 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (1186 of 1186 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (127 of 127 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (64 of 64 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (473 of 473 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (86 of 86 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (25 of 25 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (74 of 74 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (45 of 45 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: alpha <etc@alpha-line.org>
Co-authored-by: yhi264 <yhiraki@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-auth/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-camera/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-filter/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-groups/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/objects/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-events/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-exports/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/ja/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/ja/
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-player
Translation: Frigate NVR/objects
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-classificationmodel
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-replay
Translation: Frigate NVR/views-settings
Translation: Frigate NVR/views-system
2026-06-02 07:50:15 +02:00
Hosted Weblate
faf87b3688
Translated using Weblate (Ukrainian)
Currently translated at 93.0% (120 of 129 strings)

Translated using Weblate (Ukrainian)

Currently translated at 77.7% (136 of 175 strings)

Translated using Weblate (Ukrainian)

Currently translated at 54.9% (649 of 1181 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (101 of 101 strings)

Translated using Weblate (Ukrainian)

Currently translated at 92.2% (119 of 129 strings)

Translated using Weblate (Ukrainian)

Currently translated at 96.1% (25 of 26 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (Ukrainian)

Currently translated at 54.7% (644 of 1176 strings)

Translated using Weblate (Ukrainian)

Currently translated at 90.0% (91 of 101 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ivabil <ivanbilych@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/uk/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-camera/uk/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/uk/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/uk/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/uk/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/uk/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/uk/
Translation: Frigate NVR/common
Translation: Frigate NVR/components-camera
Translation: Frigate NVR/components-dialog
Translation: Frigate NVR/components-player
Translation: Frigate NVR/views-classificationmodel
Translation: Frigate NVR/views-settings
Translation: Frigate NVR/views-system
2026-06-02 07:50:15 +02:00
Hosted Weblate
957666ab3d
Translated using Weblate (Romanian)
Currently translated at 100.0% (1263 of 1263 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (1263 of 1263 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (1186 of 1186 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (1183 of 1183 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (53 of 53 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (1176 of 1176 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (238 of 238 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/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/ro/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/ro/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/ro/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/ro/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/ro/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/ro/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/ro/
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/common
Translation: Frigate NVR/components-player
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-explore
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-settings
2026-06-02 07:50:15 +02:00
Hosted Weblate
8f48ff2baa
Translated using Weblate (Estonian)
Currently translated at 35.0% (21 of 60 strings)

Translated using Weblate (Estonian)

Currently translated at 2.5% (12 of 473 strings)

Translated using Weblate (Estonian)

Currently translated at 13.9% (18 of 129 strings)

Translated using Weblate (Estonian)

Currently translated at 41.3% (60 of 145 strings)

Translated using Weblate (Estonian)

Currently translated at 18.5% (234 of 1263 strings)

Translated using Weblate (Estonian)

Currently translated at 1.8% (15 of 811 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (49 of 49 strings)

Translated using Weblate (Estonian)

Currently translated at 14.8% (8 of 54 strings)

Translated using Weblate (Estonian)

Currently translated at 11.4% (20 of 175 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (Estonian)

Currently translated at 26.6% (12 of 45 strings)

Translated using Weblate (Estonian)

Currently translated at 3.3% (2 of 59 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (Estonian)

Currently translated at 1.6% (8 of 473 strings)

Translated using Weblate (Estonian)

Currently translated at 0.3% (3 of 811 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/components-player/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-classificationmodel/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-explore/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-facelibrary/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-replay/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-search/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/et/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-system/et/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/common
Translation: Frigate NVR/components-player
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-classificationmodel
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-06-02 07:50:15 +02:00
Hosted Weblate
1c47117dcf
Translated using Weblate (German)
Currently translated at 100.0% (807 of 807 strings)

Translated using Weblate (German)

Currently translated at 100.0% (473 of 473 strings)

Translated using Weblate (German)

Currently translated at 100.0% (1268 of 1268 strings)

Translated using Weblate (German)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (German)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (German)

Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (German)

Currently translated at 95.6% (1208 of 1263 strings)

Translated using Weblate (German)

Currently translated at 100.0% (100 of 100 strings)

Translated using Weblate (German)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (German)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (German)

Currently translated at 100.0% (23 of 23 strings)

Translated using Weblate (German)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (German)

Currently translated at 100.0% (473 of 473 strings)

Translated using Weblate (German)

Currently translated at 99.5% (1178 of 1183 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Sebastian Sie <sebastian.neuplanitz@googlemail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/de/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-player/de/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-cameras/de/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-global/de/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/config-validation/de/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-chat/de/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-live/de/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-motionsearch/de/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/views-settings/de/
Translation: Frigate NVR/Config - Cameras
Translation: Frigate NVR/Config - Global
Translation: Frigate NVR/Config - Validation
Translation: Frigate NVR/common
Translation: Frigate NVR/components-player
Translation: Frigate NVR/views-chat
Translation: Frigate NVR/views-live
Translation: Frigate NVR/views-motionSearch
Translation: Frigate NVR/views-settings
2026-06-02 07:50:15 +02:00
Hosted Weblate
1dd1ef9589
Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.5% (238 of 239 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 80.1% (81 of 101 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (499 of 501 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.3% (234 of 238 strings)

Co-authored-by: AmilcarNetto <amilcar.netto@gmail.com>
Co-authored-by: Geraldo Fensterseifer Júnior <gerafenster@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/audio/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/common/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-camera/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/pt_BR/
Translation: Frigate NVR/audio
Translation: Frigate NVR/common
Translation: Frigate NVR/components-camera
Translation: Frigate NVR/components-dialog
2026-06-02 07:50:14 +02:00
Hosted Weblate
d9f27dcdeb
Translated using Weblate (Turkish)
Currently translated at 88.1% (89 of 101 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Turhan Munis <turhan.munis@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/frigate-nvr/components-dialog/tr/
Translation: Frigate NVR/components-dialog
2026-06-02 07:50:14 +02:00
56 changed files with 209 additions and 1999 deletions

View File

@ -147,13 +147,6 @@ auth:
# NOTE: changing this value will not automatically update password hashes, you
# will need to change each user password for it to apply
hash_iterations: 600000
# Optional: Map roles to the list of cameras each role can access (default: none)
# NOTE: An empty list grants the role access to all cameras. Roles defined here can be
# referenced by proxy header role mapping or assigned to native users.
roles:
my_custom_role:
- front_door
- back_yard
# Optional: model modifications
# NOTE: The default values are for the EdgeTPU detector.
@ -173,9 +166,6 @@ model:
# Required: Object detection model input tensor format
# Valid values are nhwc or nchw (default: shown below)
input_tensor: nhwc
# Optional: Data type of the model input tensor
# Valid values are float, float_denorm, or int (default: shown below)
input_dtype: int
# Required: Object detection model type, currently only used with the OpenVINO detector
# Valid values are ssd, yolox, yolonas (default: shown below)
model_type: ssd
@ -206,8 +196,6 @@ audio:
# - 500 - medium sensitivity
# - 1000 - low sensitivity
min_volume: 500
# Optional: Number of threads to use for audio detection (default: shown below)
num_threads: 2
# Optional: Types of audio to listen for (default: shown below)
listen:
- bark
@ -481,8 +469,6 @@ review:
- Animals in the garden
# Optional: Preferred response language (default: English)
preferred_language: English
# Optional: Save thumbnails sent to the GenAI provider for review/debugging purposes (default: shown below)
debug_save_thumbnails: False
# Optional: Motion configuration
# NOTE: Can be overridden at the camera level
@ -514,8 +500,6 @@ motion:
# - 30 - medium sensitivity
# - 50 - low sensitivity
contour_area: 10
# Optional: Alpha blending factor used in frame differencing for motion calculation (default: shown below)
delta_alpha: 0.2
# Optional: Alpha value passed to cv2.accumulateWeighted when averaging frames to determine the background (default: shown below)
# Higher values mean the current frame impacts the average a lot, and a new object will be averaged into the background faster.
# Low values will cause things like moving shadows to be detected as motion for longer.
@ -588,8 +572,6 @@ record:
timelapse_args: "-vf setpts=0.04*PTS -r 30"
# Optional: Global hardware acceleration settings for timelapse exports. (default: inherit)
hwaccel_args: auto
# Optional: Maximum number of export jobs to process at the same time (default: shown below)
max_concurrent: 3
# Optional: Recording Preview Settings
preview:
# Optional: Quality of recording preview (default: shown below).
@ -656,11 +638,6 @@ snapshots:
retain:
# Required: Default retention days (default: shown below)
default: 10
# Optional: Mode for retention. (default: shown below)
# all - save all snapshots regardless of activity
# motion - save snapshots for any detected motion
# active_objects - save snapshots for active/moving objects
mode: motion
# Optional: Per object retention days
objects:
person: 15
@ -737,42 +714,28 @@ lpr:
enhancement: 0
# Optional: Save plate images to /media/frigate/clips/lpr for debugging purposes (default: shown below)
debug_save_plates: False
# Optional: List of regex replacement rules to normalize detected plates before matching (default: none)
replace_rules:
# Required: regex pattern to match in the detected plate
- pattern: "O"
# Required: string to replace the matched pattern with
replacement: "0"
# Optional: List of regex replacement rules to normalize detected plates (default: shown below)
replace_rules: {}
# Optional: Configuration for AI / LLM providers
# Optional: Configuration for AI / LLM provider
# WARNING: Depending on the provider, this will send thumbnails over the internet
# to Google or OpenAI's LLMs to generate descriptions. GenAI features can be configured at
# the camera level to enhance privacy for indoor cameras.
# NOTE: genai is a map of named providers. Each key is a name you choose for the provider,
# and each role (chat, descriptions, embeddings) may be assigned to exactly one provider.
genai:
# Required: name of the provider (chosen by you, used to reference it elsewhere)
my_provider:
# Required: Provider must be one of ollama, openai, azure_openai, gemini, or llamacpp
provider: ollama
# Required if provider is ollama. May also be used for an OpenAI API compatible backend with the openai provider.
base_url: http://localhost::11434
# Required if gemini or openai
api_key: "{FRIGATE_GENAI_API_KEY}"
# Required: The model to use with the provider.
model: gemini-1.5-flash
# Optional: Roles this provider handles (default: shown below)
# Each role (chat, descriptions, embeddings) must be assigned to exactly one provider.
roles:
- chat
- descriptions
- embeddings
# Optional additional args to pass to the GenAI Provider (default: None)
provider_options:
keep_alive: -1
# Optional: Options to pass during inference calls (default: {})
runtime_options:
temperature: 0.7
# Required: Provider must be one of ollama, gemini, or openai
provider: ollama
# Required if provider is ollama. May also be used for an OpenAI API compatible backend with the openai provider.
base_url: http://localhost::11434
# Required if gemini or openai
api_key: "{FRIGATE_GENAI_API_KEY}"
# Required: The model to use with the provider.
model: gemini-1.5-flash
# Optional additional args to pass to the GenAI Provider (default: None)
provider_options:
keep_alive: -1
# Optional: Options to pass during inference calls (default: {})
runtime_options:
temperature: 0.7
# Optional: Configuration for audio transcription
# NOTE: only the enabled option can be overridden at the camera level
@ -945,9 +908,6 @@ cameras:
inertia: 3
# Optional: Number of seconds that an object must loiter to be considered in the zone (default: shown below)
loitering_time: 0
# Optional: Minimum speed required for an object to be considered present in the zone (default: none)
# In real-world units if distances are set. Used for speed-based zone triggers.
speed_threshold: 2.5
# Optional: List of objects that can trigger this zone (default: all tracked objects)
objects:
- person
@ -985,9 +945,6 @@ cameras:
order: 0
# Optional: Whether or not to show the camera in the Frigate UI (default: shown below)
dashboard: True
# Optional: Whether this camera is visible in review (the review page and its camera
# filter, motion review, and the history view) (default: shown below)
review: True
# Optional: connect to ONVIF camera
# to enable PTZ controls.

View File

@ -15,9 +15,6 @@ from frigate.util.rknn_converter import auto_convert_model, is_rknn_compatible
logger = logging.getLogger(__name__)
# Process-wide lock serializing all OpenVINO compile/inference calls
_OPENVINO_LOCK = threading.Lock()
def is_arm64_platform() -> bool:
"""Check if we're running on an ARM platform."""
@ -329,17 +326,19 @@ class OpenVINOModelRunner(BaseModelRunner):
except Exception as e:
logger.debug(f"NPU_TURBO not supported by driver: {e}")
# Compile model under the shared lock
with _OPENVINO_LOCK:
self.compiled_model = self.ov_core.compile_model(
model=model_path, device_name=device
)
# Create reusable inference request
self.infer_request = self.compiled_model.create_infer_request()
# Compile model
self.compiled_model = self.ov_core.compile_model(
model=model_path, device_name=device
)
# Create reusable inference request
self.infer_request = self.compiled_model.create_infer_request()
self.input_tensor: ov.Tensor | None = None
# Thread lock to prevent concurrent inference (needed for JinaV2 which shares
# one runner between text and vision embeddings called from different threads)
self._inference_lock = threading.Lock()
if not self.complex_model:
try:
input_shape = self.compiled_model.inputs[0].get_shape()
@ -383,11 +382,9 @@ class OpenVINOModelRunner(BaseModelRunner):
Returns:
List of output tensors
"""
# Shared lock serializes inference across every OpenVINO runner in this
# process — both the shared-runner JinaV2 case (genai text thread +
# embeddings vision thread) and distinct runners running on separate
# threads (e.g. the ArcFace face-model build vs the LPR detector).
with _OPENVINO_LOCK:
# Lock prevents concurrent access to infer_request
# Needed for JinaV2: genai thread (text) + embeddings thread (vision)
with self._inference_lock:
from frigate.embeddings.types import EnrichmentModelTypeEnum
if self.model_type in [EnrichmentModelTypeEnum.arcface.value]:

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/images/branding/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>Frigate</title>
<link
rel="apple-touch-icon"

View File

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/images/branding/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Frigate</title>
<link
rel="apple-touch-icon"

View File

@ -265,98 +265,5 @@
"stomach_rumble": "Къркорене на стомах",
"heartbeat": "Сърцебиене",
"scream": "Вик",
"snicker": "Хихикане",
"chant": "Скандиране",
"synthetic_singing": "Синтетично Пеене",
"grunt": "Грухтене",
"wheeze": "Хриптене",
"gasp": "Издихание",
"snort": "Смъркане",
"heart_murmur": "Сърдечен Шум",
"cheering": "Радостни Викове",
"yip": "Джавкане",
"howl": "Вой",
"bow_wow": "Кучешки Вой",
"growling": "Ръмжене",
"whimper_dog": "Кучешко Скимтене",
"caterwaul": "Мяукане",
"clip_clop": "Копита",
"cattle": "Добитък",
"bleat": "Блеене",
"fowl": "Домашни Птици",
"honk": "Бибиткане",
"chirp": "Пиукане",
"squawk": "Кряскане/Грачене",
"patter": "Ромолене/Потупване",
"rattle": "Тракане",
"tapping": "Потупване",
"strum": "Звук от струни",
"zither": "Цитра",
"harpsichord": "Клавесин",
"snare_drum": "Малко барабанче",
"rimshot": "Римшот",
"bass_drum": "Голям барабан",
"hi_hat": "Фус",
"wood_block": "Парче дърво",
"electronic_dance_music": "Електронна денс музика",
"music_of_bollywood": "Музика от Боливут",
"traditional_music": "Традиционна Музика",
"soundtrack_music": "Саундтрак музика",
"lullaby": "Приспивна песен",
"video_game_music": "Музика от компютърна игра",
"christmas_music": "Коледна музика",
"dance_music": "Денс музика",
"wedding_music": "Сватбена музика",
"happy_music": "Радостна музика",
"sad_music": "Тъжна музика",
"tender_music": "Нежна музика",
"exciting_music": "Вълнуваща музика",
"angry_music": "Яростна музика",
"scary_music": "Страшна музика",
"wind": "Вятър",
"rustling_leaves": "Шумолящи листа",
"wind_noise": "Шум от вятър",
"rain_on_surface": "Дъжд на повърхност",
"crackle": "Пукане",
"emergency_vehicle": "Кола на спешна помощ",
"engine_knocking": "Чукане от двигател",
"cupboard_open_or_close": "Отваряне или затваряне на шкаф",
"sink": "Мивка",
"bathtub": "Вана",
"hair_dryer": "Сешоар",
"toilet_flush": "Пускане на вода в тоалетна",
"toothbrush": "Четка за зъби",
"electric_toothbrush": "Електрическа четка за зъби",
"vacuum_cleaner": "Прахосмукачка",
"zipper": "Цип",
"keys_jangling": "Дрънкане на ключове",
"coin": "Монета",
"scissors": "Ножица",
"electric_shaver": "Електрическа самобръсначка",
"shuffling_cards": "Разбъркване на карти",
"typing": "Пишене",
"typewriter": "Пишеща машина",
"computer_keyboard": "Клавиатура",
"writing": "Писане на ръка",
"alarm": "Аларма",
"telephone": "Телефон",
"telephone_bell_ringing": "Камбанен звук от телефон",
"ringtone": "Мелодия за звънене",
"telephone_dialing": "Набиране на телефон",
"dial_tone": "Набиране на цифра на телефон",
"busy_signal": "Сигнал заето",
"alarm_clock": "Алармен часовник",
"siren": "Сирена",
"civil_defense_siren": "Сирена на гражданска защита",
"buzzer": "Бъзър",
"smoke_detector": "Детектор за пушек",
"fire_alarm": "Пожарна аларма",
"whistle": "Свиркане",
"steam_whistle": "Парна свирка",
"mechanisms": "Механизми",
"clock": "Часовник",
"tick": "",
"tick-tock": "Тиктакане",
"gears": "Зъбни колела",
"sewing_machine": "Шиеща машина"
"snicker": "Хихикане"
}

View File

@ -19,10 +19,5 @@
"skateboard": "Скейтборд",
"door": "Врата",
"blender": "Блендер",
"person": "Човек",
"sink": "Мивка",
"hair_dryer": "Сешоар",
"toothbrush": "Четка за зъби",
"scissors": "Ножица",
"clock": "Часовник"
"person": "Човек"
}

View File

@ -866,10 +866,6 @@
"dashboard": {
"label": "Mostra a l'interfície d'usuari",
"description": "Estableix si aquesta càmera és visible a tot arreu a la interfície d'usuari de la Frigate. Desactivar això requerirà editar manualment la configuració per tornar a veure aquesta càmera a la interfície d'usuari."
},
"review": {
"label": "Mostra en la revisió",
"description": "Alterna si aquesta càmera és visible a la revisió (la pàgina de revisió i el seu filtre de càmera, la revisió de moviment i la vista de l'historial)."
}
},
"webui_url": {

View File

@ -2337,10 +2337,6 @@
"dashboard": {
"label": "Mostra a la interfície",
"description": "Estableix si aquesta càmera és visible a tot arreu a la interfície d'usuari de Frigate. Desactivar això requerirà editar manualment la configuració per tornar a veure aquesta càmera a la interfície d'usuari."
},
"review": {
"label": "Mostra en la revisió",
"description": "Alterna si aquesta càmera és visible a la revisió (la pàgina de revisió i el seu filtre de càmera, la revisió de moviment i la vista de l'historial)."
}
},
"profiles": {

View File

@ -1323,16 +1323,12 @@
"details": {
"edit": "Edita els detalls de la càmera",
"title": "Edita els detalls de la càmera",
"description": "Actualitza el nom de visualització, l'URL extern i la visibilitat utilitzada per a aquesta càmera a tota la interfície d'usuari de la Fragata.",
"description": "Actualitzeu el nom de la pantalla i l'URL extern utilitzat per a aquesta càmera a tota la interfície d'usuari de Frigate.",
"friendlyNameLabel": "Nom a mostrar",
"friendlyNameHelp": "Nom amistós que es mostra per a aquesta càmera a tota la interfície d'usuari de Frigate. Deixeu-ho en blanc per utilitzar l'ID de la càmera.",
"webuiUrlLabel": "URL de la interfície web de la càmera",
"webuiUrlHelp": "URL per a visitar la interfície d'usuari web de la càmera directament des de la vista de depuració. Deixeu-ho en blanc per desactivar l'enllaç.",
"webuiUrlInvalid": "Ha de ser un URL vàlid (p. ex., https://example.com).",
"dashboardLabel": "Mostra al tauler en directe",
"dashboardHelp": "Mostra aquesta càmera al Tauler en viu.",
"reviewLabel": "Mostra a la ressenya",
"reviewHelp": "Mostra aquesta càmera a Revisió, incloent el filtre de càmera, la revisió de moviment i la vista de l'historial."
"webuiUrlInvalid": "Ha de ser un URL vàlid (p. ex., https://example.com)."
},
"label": "Estat de la càmera",
"description": "Estableix l'estat operatiu de cada càmera.<br /><br /><strong>A</strong>: els fluxos es processen normalment.<br /><strong>Off</strong>: pausa temporalment el processament. No persisteix a través de reinicis de Frigate.<br /><strong>Inhabilitat</strong>: deixa de processar i desa el canvi a la configuració. Es requereix un reinici per a tornar a habilitar una càmera inhabilitada.<br /><br /><em>Nota: La inhabilitació no afecta els restreams de go2rtc.</em><br /><br />Arrossegueu l'ansa per a reordenar les càmeres actives a mesura que apareguin a tota la interfície d'usuari, inclosos els desplegables de selecció de quadres en viu i de càmera.",

View File

@ -2,10 +2,7 @@
"group": {
"label": "Camera Groups",
"add": "Add Camera Group",
"showAll": "Show all camera groups",
"showLess": "Show less",
"edit": "Edit Camera Group",
"editGroups": "Edit Camera Groups",
"delete": {
"label": "Delete Camera Group",
"confirm": {

View File

@ -1908,11 +1908,7 @@
"fpsGreaterThanFive": "Setting the detect FPS higher than 5 is not recommended. Higher values may cause performance issues and will not provide any benefit.",
"disabled": "Object detection is disabled. Snapshots, review items, and enrichments such as face recognition, license plate recognition, and Generative AI will not function.",
"resolutionShouldBeMultipleOfFour": "For best results, detect width and height should be multiples of 4. Other even values may produce visual artifacts or slight distortion in the detect stream.",
"aspectRatioMismatch": "The width and height you've entered don't match the aspect ratio of your current detect resolution. This may produce a stretched or distorted image.",
"maxFramesSet": "Setting max frames overrides default behavior and disables stationary object tracking. There are very few situations where this is needed, use with caution.",
"squareResolution": "A square detect resolution is unusual. The detect width and height should match your camera's aspect ratio (for example, 16:9), not the dimensions of the object detection model. A mismatched aspect ratio can stretch the image and reduce detection accuracy.",
"resolutionHigh": "This detect resolution is higher than recommended and may cause increased resource usage without improving detection accuracy. A detect resolution at or below 1080p is recommended for most cameras.",
"globalResolutionMultipleCameras": "A global detect resolution is set while multiple cameras are configured. Unless all cameras share the same resolution and aspect ratio, the detect width and height should be defined per camera to match each camera's native aspect ratio."
"aspectRatioMismatch": "The width and height you've entered don't match the aspect ratio of your current detect resolution. This may produce a stretched or distorted image."
},
"objects": {
"genaiNoDescriptionsProvider": "You must configure a GenAI provider with the 'descriptions' role for descriptions to be generated."

View File

@ -71,7 +71,7 @@
"endTimeMustAfterStartTime": "La hora de finalización debe ser posterior a la hora de inicio"
},
"success": "Exportación iniciada con éxito. Ver el archivo en la página exportaciones.",
"view": "Vista",
"view": "Ver",
"queued": "Exportación en cola. Consulta el progreso en la página de exportaciones.",
"batchSuccess_one": "Se inició 1 exportación. Abriendo el caso ahora.",
"batchSuccess_many": "Se iniciaron {{count}} exportaciones. Abriendo el caso ahora.",
@ -101,7 +101,7 @@
},
"queueing": "Poniendo la exportación en cola…",
"tabs": {
"export": "Una Cámara",
"export": "Cámara única",
"multiCamera": "Multicámara"
},
"multiCamera": {

View File

@ -1,6 +1,6 @@
{
"name": {
"label": "Nombre de Cámara",
"label": "Nombre de cámara",
"description": "El nombre de la cámara es necesario"
},
"enabled": {
@ -28,19 +28,19 @@
},
"filters": {
"label": "Filtros de audio",
"description": "Ajustes de filtro por tipo de audio, como umbrales de confianza utilizados para reducir los falsos positivos.",
"description": "Ajustes de filtrado por tipo de audio, como umbrales de confianza utilizados para reducir los falsos positivos.",
"threshold": {
"label": "Confianza mínima de audio",
"description": "Umbral mínimo de confianza para que se cuente el evento de audio."
}
},
"enabled_in_config": {
"description": "Indica si la detección de audio estaba habilitada originalmente en el archivo de configuración estático.",
"label": "Estado de audio original"
"description": "Indica si la detección de audio estaba habilitada originalmente en el archivo de configuración estática.",
"label": "Estado original del audio"
},
"num_threads": {
"label": "Hilos de detección",
"description": "Número de hilos a usar para procesamiento de detección de audio."
"description": "Número de hilos que se utilizarán para el procesamiento de la detección de audio."
}
},
"friendly_name": {
@ -349,10 +349,10 @@
}
},
"audio_transcription": {
"description": "Configuración para la transcripción de audio en directo y de voz utilizada para eventos y subtítulos en directo.",
"description": "Configuración para la transcripción de audio en vivo y de voz, utilizada para eventos y subtítulos en tiempo real.",
"enabled": {
"label": "Habilitar transcripción",
"description": "Habilitar o deshabilitar la transcripción de eventos de audio activados manualmente."
"description": "Activar o desactivar la transcripción de eventos de audio activados manualmente."
},
"label": "Transcripción de audio",
"enabled_in_config": {
@ -360,7 +360,7 @@
},
"live_enabled": {
"label": "Transcripción en directo",
"description": "Habilitar la transcripción en directo del audio a medida que se recibe."
"description": "Activar la transcripción en directo del audio a medida que se recibe."
}
},
"motion": {
@ -608,10 +608,6 @@
"order": {
"label": "Orden en la interfaz",
"description": "Orden numérico usado para ordenar la cámara en la interfaz (panel predeterminado y listas); los números más altos aparecen más tarde."
},
"review": {
"label": "Mostrar en Revisión",
"description": "Activa o desactiva si esta cámara es visible en Revisión (la página de Revisión y su filtro de cámaras, la revisión de movimiento y la vista de historial)."
}
},
"live": {
@ -724,7 +720,7 @@
},
"birdseye": {
"description": "Configuración para la vista compuesta Birdseye, que combina las transmisiones de múltiples cámaras en una sola vista.",
"label": "Birdseye",
"label": "Vista general",
"enabled": {
"label": "Habilitar Birdseye",
"description": "Habilita o deshabilita la función de vista Birdseye."

View File

@ -43,19 +43,19 @@
},
"filters": {
"label": "Filtros de audio",
"description": "Ajustes de filtro por tipo de audio, como umbrales de confianza utilizados para reducir los falsos positivos.",
"description": "Ajustes de filtrado por tipo de audio, como umbrales de confianza utilizados para reducir los falsos positivos.",
"threshold": {
"label": "Confianza mínima de audio",
"description": "Umbral mínimo de confianza para que se cuente el evento de audio."
}
},
"enabled_in_config": {
"description": "Indica si la detección de audio estaba habilitada originalmente en el archivo de configuración estático.",
"label": "Estado de audio original"
"description": "Indica si la detección de audio estaba habilitada originalmente en el archivo de configuración estática.",
"label": "Estado original del audio"
},
"num_threads": {
"label": "Hilos de detección",
"description": "Número de hilos a usar para procesamiento de detección de audio."
"description": "Número de hilos que se utilizarán para el procesamiento de la detección de audio."
},
"description": "Ajustes para la detección de eventos basada en audio en todas las cámaras; se pueden sobrescribir por cámara."
},
@ -696,7 +696,7 @@
}
},
"audio_transcription": {
"description": "Configuración para la transcripción de audio en directo y de voz utilizada para eventos y subtítulos en directo.",
"description": "Configuración para la transcripción de audio en vivo y de voz, utilizada para eventos y subtítulos en tiempo real.",
"language": {
"description": "Código de idioma utilizado para la transcripción/traducción (por ejemplo, 'es' para Español). Consulte https://whisper-api.com/docs/languages/ para ver los códigos de idioma compatibles.",
"label": "Idioma de transcripción"
@ -708,7 +708,7 @@
"label": "Transcripción de audio",
"live_enabled": {
"label": "Transcripción en directo",
"description": "Habilitar la transcripción en directo del audio a medida que se recibe."
"description": "Activar la transcripción en directo del audio a medida que se recibe."
},
"device": {
"label": "Dispositivo de transcripción",
@ -1010,10 +1010,6 @@
"order": {
"label": "Orden en la interfaz",
"description": "Orden numérico usado para ordenar la cámara en la interfaz (panel predeterminado y listas); los números más altos aparecen más tarde."
},
"review": {
"label": "Mostrar en Revisión",
"description": "Activa o desactiva si esta cámara se muestra en Revisión (la página de Revisión y su filtro de cámaras, la revisión de movimiento y la vista de historial)."
}
},
"live": {
@ -1194,7 +1190,7 @@
"description": "Factor de escala usado por el calculador de diseño (rango de 1.0 a 5.0)."
}
},
"label": "Birdseye",
"label": "Vista general",
"enabled": {
"label": "Habilitar Birdseye",
"description": "Habilita o deshabilita la función de vista Birdseye."

View File

@ -36,14 +36,14 @@
"trainingFailed": "El entrenamiento del modelo ha fallado. Revisa los registros de Frigate para más detalles.",
"updateModelFailed": "Fallo al actualizar modelo: {{errorMessage}}",
"trainingFailedToStart": "No se pudo iniciar el entrenamiento del modelo: {{errorMessage}}",
"renameCategoryFailed": "Fallo al renombrar la clase:{{errorMessage}}",
"renameCategoryFailed": "Falló el renombrado de la clase: {{errorMessage}}",
"reclassifyFailed": "Error al reclasificar la imagen: {{errorMessage}}"
}
},
"deleteCategory": {
"title": "Borrar Clase",
"desc": "¿Esta seguro de que quiere borrar la clase {{name}}? Esto borrará permanentemente todas las imágenes asociadas y requerirá reentrenar el modelo.",
"minClassesTitle": "No se puede borrar la clase",
"minClassesTitle": "No se puede Borrar la Clase",
"minClassesDesc": "Un modelo de clasificación debe tener al menos 2 clases. Añade otra clase antes de borrar esta."
},
"deleteModel": {
@ -66,7 +66,7 @@
"noNewImages": "No hay imágenes nuevas para entrenar. Clasifica antes más imágenes del conjunto de datos."
},
"details": {
"scoreInfo": "La puntuación representa la confianza promedio de la clasificación en todas las detecciones de este objeto.",
"scoreInfo": "La puntuación representa la confianza media de clasificación en todas las detecciones de este objeto.",
"unknown": "Desconocido",
"none": "Ninguno"
},
@ -166,7 +166,7 @@
"desc_other": "¿Está seguro de que quiere eliminar {{count}} imágenes de {{dataset}}? Esta acción no puede ser deshecha y requerirá reentrenar el modelo."
},
"deleteTrainImages": {
"title": "Borrar imágenes de entrenamiento",
"title": "Borrar Imágenes de Entrenamiento",
"desc_one": "¿Está seguro de que quiere eliminar {{count}} imagen? Esta acción no puede ser deshecha.",
"desc_many": "¿Está seguro de que quiere eliminar {{count}} imágenes? Esta acción no puede ser deshecha.",
"desc_other": "¿Está seguro de que quiere eliminar {{count}} imágenes? Esta acción no puede ser deshecha."

View File

@ -14,5 +14,5 @@
"documentTitle": "Editor de Configuración - Frigate",
"confirm": "¿Salir sin guardar?",
"safeConfigEditor": "Editor de Configuración (Modo Seguro)",
"safeModeDescription": "Frigate se encuentra en modo seguro debido a un error de validación en la configuración."
"safeModeDescription": "Frigate esta en modo seguro debido a un error en la validación de la configuración."
}

View File

@ -208,7 +208,7 @@
},
"addTrigger": {
"label": "Añadir disparador",
"aria": "Añadir disparador para este objeto rastreado"
"aria": "Añadir disparador para el objeto seguido"
},
"downloadCleanSnapshot": {
"label": "Descargue instantánea limpia",
@ -273,8 +273,8 @@
"count": "{{first}} de {{second}}",
"lifecycleItemDesc": {
"visible": "{{label}} detectado",
"active": "{{label}} está activo",
"stationary": "{{label}} se volvió estacionario",
"active": "{{label}} ha sido activado/a",
"stationary": "{{label}} se volvió estacionaria",
"attribute": {
"faceOrLicense_plate": "{{attribute}} detectado para {{label}}",
"other": "{{label}} reconocido como {{attribute}}"

View File

@ -13,7 +13,7 @@
"toast": {
"error": {
"renameExportFailed": "No se pudo renombrar la exportación: {{errorMessage}}",
"assignCaseFailed": "No se pudo actualizar la asignación al caso: {{errorMessage}}",
"assignCaseFailed": "Fallo en la actualización de la asignación de caso: {{errorMessage}}",
"caseSaveFailed": "No se pudo guardar el caso: {{errorMessage}}",
"caseDeleteFailed": "No se pudo eliminar el caso: {{errorMessage}}"
}
@ -25,11 +25,11 @@
"editName": "Editar nombre",
"deleteExport": "Eliminar exportación",
"assignToCase": "Añadir al caso",
"removeFromCase": "Eliminar del caso"
"removeFromCase": "Remover del contenedor"
},
"headings": {
"cases": "Casos",
"uncategorizedExports": "Exportaciones sin categorización"
"uncategorizedExports": "Exportaciones sin Categorizar"
},
"caseDialog": {
"title": "Añadir al caso",
@ -40,7 +40,7 @@
"descriptionLabel": "Descripción"
},
"toolbar": {
"addExport": "Agregar exportación",
"addExport": "Añadir Exportación",
"newCase": "Nuevo caso",
"editCase": "Editar caso",
"deleteCase": "Eliminar caso"

View File

@ -44,11 +44,11 @@
"settings": {
"title": "Ajustes de búsqueda",
"parallelMode": "Modo paralelo",
"parallelModeDesc": "Analiza varios intervalos de grabación al mismo tiempo (más rápido, pero utiliza más recursos de decodificación)",
"parallelModeDesc": "Analiza varios segmentos de grabación al mismo tiempo (más rápido, pero consume significativamente más CPU)",
"threshold": "Umbral de sensibilidad",
"thresholdDesc": "Los valores más bajos detectan cambios más pequeños (1-255)",
"minArea": "Área mínima de cambio",
"minAreaDesc": "Tamaño mínimo de una única región en movimiento, expresado como porcentaje de la región de interés",
"minAreaDesc": "Porcentaje mínimo de la región de interés que debe cambiar para considerarse significativo",
"frameSkip": "Salto de fotogramas",
"frameSkipDesc": "Procesa cada N fotogramas. Establécelo según la tasa de FPS de tu cámara para procesar un fotograma por segundo (p. ej., 5 para una cámara de 5 FPS, 30 para una cámara de 30 FPS). Los valores más altos serán más rápidos, pero pueden omitir eventos de movimiento breves.",
"maxResults": "Resultados máximos",
@ -74,9 +74,6 @@
"framesDecoded": "Fotogramas decodificados",
"wallTime": "Tiempo de búsqueda",
"segmentErrors": "Errores de segmento",
"seconds": "{{seconds}} s",
"minutesSeconds": "{{minutes}}m {{seconds}}s",
"scanSummary": "{{segments}} segmentos · {{time}}"
},
"scanning": "Escaneando {{time}}"
"seconds": "{{seconds}} s"
}
}

View File

@ -1301,16 +1301,12 @@
"details": {
"edit": "Editar detalles de la cámara",
"title": "Editar detalles de la cámara",
"description": "Actualiza el nombre visible, la URL externa y la visibilidad usados para esta cámara en toda la interfaz de Frigate.",
"description": "Actualiza el nombre visible y la URL externa usados para esta cámara en toda la interfaz de Frigate.",
"friendlyNameLabel": "Nombre visible",
"friendlyNameHelp": "Nombre descriptivo que se muestra para esta cámara en toda la interfaz de Frigate. Déjalo en blanco para usar el ID de la cámara.",
"webuiUrlLabel": "URL de la interfaz web de la cámara",
"webuiUrlHelp": "URL para acceder directamente a la interfaz web de la cámara desde la vista de depuración. Déjala en blanco para deshabilitar el enlace.",
"webuiUrlInvalid": "Debe ser una URL válida (p. ej., https://ejemplo.com).",
"dashboardLabel": "Mostrar en el panel En directo",
"dashboardHelp": "Mostrar esta cámara en el panel en directo.",
"reviewLabel": "Mostrar en Revisión",
"reviewHelp": "Mostrar esta cámara en Revisión, incluido el filtro de cámaras, la revisión de movimiento y la vista de historial."
"webuiUrlInvalid": "Debe ser una URL válida (p. ej., https://ejemplo.com)."
},
"label": "Estado de la cámara",
"description": "Set the operating state for each camera. <br /><br /><strong>On</strong>: las transmisiones se procesan con normalidad.<br /><strong>Off</strong>: pausa temporalmente el procesamiento. No persiste tras reinicios de Frigate.<br /><strong>Disabled</strong>: detiene el procesamiento y guarda el cambio en tu configuración. Es necesario reiniciar para volver a activar una cámara desactivada.<br /><br /><em>Note: Desactivar no afecta a las retransmisiones de go2rtc.</em><br /><br />Arrastra el asa para reordenar las cámaras activas tal como aparecen en toda la interfaz, incluido el panel de Live y los menús desplegables de selección de cámara.",

View File

@ -67,10 +67,7 @@
"desc": "Vali kaamerad selle grupi jaoks."
},
"icon": "Ikoon",
"success": "Kaameragrupp ({{name}}) on salvestatud.",
"showAll": "Näita kõiki kaameragruppe",
"showLess": "Näita vähem",
"editGroups": "Muuda kaameragruppe"
"success": "Kaameragrupp ({{name}}) on salvestatud."
},
"debug": {
"options": {

View File

@ -172,10 +172,7 @@
},
"max_frames": {
"label": "Fotogrammi massimi",
"description": "Limita la durata del tracciamento degli oggetti statici prima che vengano scartati.",
"default": {
"description": "Numero massimo predefinito di fotogrammi per seguire un oggetto stazionario prima di interrompere la ripresa."
}
"description": "Limita la durata del tracciamento degli oggetti statici prima che vengano scartati."
}
}
},

View File

@ -302,10 +302,7 @@
},
"max_frames": {
"label": "Fotogrammi massimi",
"description": "Limita la durata del tracciamento degli oggetti statici prima che vengano scartati.",
"default": {
"description": "Numero massimo predefinito di fotogrammi per seguire un oggetto stazionario prima di interrompere la ripresa."
}
"description": "Limita la durata del tracciamento degli oggetti statici prima che vengano scartati."
}
}
},

View File

@ -21,7 +21,7 @@
"markTheseItemsAsReviewed": "Segna questi elementi come visti",
"markAsReviewed": "Segna come visto",
"documentTitle": "Revisiona - Frigate",
"allCameras": "Tutte le telecamere",
"allCameras": "Tutte le camere",
"timeline": {
"label": "Linea temporale"
},

View File

@ -26,9 +26,7 @@
"points_many": "{{count}} punti",
"points_other": "{{count}} punti",
"undo": "Annulla ultimo punto",
"reset": "Reimposta poligono",
"drawMode": "Disegna",
"moveMode": "Sposta"
"reset": "Reimposta poligono"
},
"motionHeatmapLabel": "Mappa di calore del movimento",
"dialog": {
@ -44,11 +42,11 @@
"settings": {
"title": "Impostazioni di ricerca",
"parallelMode": "Modalità parallela",
"parallelModeDesc": "Esegui la scansione simultanea di più intervalli di registrazione (più veloce; utilizza più risorse di decodifica)",
"parallelModeDesc": "Scansiona più segmenti di registrazione contemporaneamente (più veloce, ma richiede un utilizzo della CPU significativamente maggiore)",
"threshold": "Soglia di sensibilità",
"thresholdDesc": "Valori più bassi indicano cambiamenti minori (1-255)",
"minArea": "Area di cambio minimo",
"minAreaDesc": "Dimensione minima di una singola regione mobile, espressa in percentuale della regione di interesse",
"minAreaDesc": "Percentuale minima della regione di interesse che deve cambiare per essere considerata significativa",
"frameSkip": "Salta fotogrammi",
"frameSkipDesc": "Elabora ogni N-esimo fotogramma. Imposta questo valore sulla frequenza dei fotogrammi della tua telecamera per elaborare un fotogramma al secondo (ad esempio, 5 per una telecamera a 5 FPS, 30 per una telecamera a 30 FPS). Valori più alti saranno più veloci, ma potrebbero perdere eventi di movimento brevi.",
"maxResults": "Risultati massimi",
@ -74,9 +72,6 @@
"framesDecoded": "Fotogrammi decodificati",
"wallTime": "Tempo di ricerca",
"segmentErrors": "Errori di segmento",
"seconds": "{{seconds}}s",
"minutesSeconds": "{{minutes}}m {{seconds}}s",
"scanSummary": "{{segments}} segmenti · {{time}}"
},
"scanning": "Scansione {{time}}"
"seconds": "{{seconds}}s"
}
}

View File

@ -810,8 +810,7 @@
"notificationUnavailable": {
"desc": "Le notifiche push web richiedono un contesto sicuro (<code>https://...</code>). Questa è una limitazione del browser. Accedi a Frigate in modo sicuro per utilizzare le notifiche.",
"documentation": "Leggi la documentazione",
"title": "Notifiche non disponibili",
"descPwa": "Su iOS, le notifiche push web sono disponibili solo se Frigate è installato sulla schermata Home. Apri il menu <strong>Condividi</strong>, scegli <strong>Aggiungi alla schermata Home</strong>, quindi apri Frigate dalla nuova icona per registrare questo dispositivo per le notifiche."
"title": "Notifiche non disponibili"
},
"deviceSpecific": "Impostazioni specifiche del dispositivo",
"toast": {
@ -1258,7 +1257,7 @@
"brands": {
"reolink-rtsp": "Reolink RTSP non è consigliato. Abilita HTTP nelle impostazioni del firmware della telecamera e riavvia la procedura guidata."
},
"customUrlRtspRequired": "Gli URL personalizzati devono iniziare con \"rtsp://\" o \"rtsps://\". La configurazione manuale è necessaria per i flussi video non RTSP."
"customUrlRtspRequired": "Gli URL personalizzati devono iniziare con \"rtsp://\". Per i flussi di telecamere non RTSP è richiesta la configurazione manuale."
},
"docs": {
"reolink": "https://docs.frigate.video/configuration/camera_specific.html#reolink-cameras"
@ -1424,16 +1423,12 @@
"details": {
"edit": "Modifica i dettagli della telecamera",
"title": "Modifica i dettagli della telecamera",
"description": "Aggiorna il nome visualizzato, l'URL esterno e la visibilità utilizzati per questa telecamera nell'interfaccia utente di Frigate.",
"description": "Aggiorna il nome visualizzato e l'URL esterno utilizzati per questa telecamera nell'interfaccia utente di Frigate.",
"friendlyNameLabel": "Nome da visualizzare",
"friendlyNameHelp": "Nome descrittivo visualizzato per questa telecamera nell'interfaccia utente di Frigate. Lasciare vuoto per utilizzare l'ID della telecamera.",
"webuiUrlLabel": "URL dell'interfaccia web della telecamera",
"webuiUrlHelp": "URL per accedere direttamente all'interfaccia web della telecamera dalla vista Correzioni. Lasciare vuoto per disabilitare il collegamento.",
"webuiUrlInvalid": "Deve essere un URL valido (ad esempio, https://esempio.com).",
"dashboardLabel": "Mostra nella schermata Dal vivo",
"dashboardHelp": "Mostra questa telecamera nella schermata Dal vivo.",
"reviewLabel": "Mostra in Revisiona",
"reviewHelp": "Mostra questa telecamera in Revisiona, incluso il filtro della telecamera, la revisione del movimento e la visualizzazione della cronologia."
"webuiUrlInvalid": "Deve essere un URL valido (ad esempio, https://esempio.com)."
},
"label": "Stato della telecamera",
"description": "Imposta lo stato operativo per ciascuna telecamera.<br /><br /><strong>Accesa</strong>: i flussi vengono elaborati normalmente.<br /><strong>Spenta</strong>: mette temporaneamente in pausa l'elaborazione. Non viene mantenuta dopo il riavvio di Frigate.<br /><strong>Disabilitata</strong>: interrompe l'elaborazione e salva la modifica nella configurazione. È necessario riavviare Frigate per riattivare una telecamera disabilitata.<br /><br /><em>Nota: la disabilitazione non influisce sulle ritrasmissioni go2rtc.</em><br /><br />Trascina la maniglia per riordinare le telecamere attive nell'interfaccia utente, inclusi il pannello di controllo Dal vivo e i menu a tendina di selezione della telecamera.",
@ -1504,94 +1499,6 @@
"normal": "Normale",
"dedicatedLpr": "LPR dedicata",
"saveSuccess": "Tipo di telecamera aggiornato per {{cameraName}}. Riavviare Frigate per applicare le modifiche."
},
"clone": {
"sectionTitle": "Clona impostazioni",
"button": "Clona impostazioni",
"sectionDescription": "Copia la configurazione da una telecamera ad un'altra telecamera o a una nuova.",
"title": "Clona impostazioni della telecamera",
"description": "Copia la configurazione di una telecamera su una o altre telecamere o su una nuova telecamera. L'identità (nome, nome descrittivo, URL dell'interfaccia web, ordine di visualizzazione) non viene mai copiata.",
"source": {
"label": "Telecamera sorgente",
"placeholder": "Seleziona una telecamera sorgente",
"required": "Seleziona una telecamera sorgente"
},
"target": {
"legend": "Destinazione",
"newRadio": "Nuova telecamera",
"newNameLabel": "Nome telecamera",
"newNamePlaceholder": "p.es., porta_posteriore o Porta Posteriore",
"newNameRequired": "Il nome della telecamera è obbligatorio",
"newNameInvalid": "Nome della telecamera non valido",
"newNameCollision": "Esiste già una telecamera con questo nome",
"newStreamsForced": "I flussi video vengono sempre copiati per ogni nuova telecamera.",
"existingCamerasRadio": "Telecamere esistenti",
"allCameras": "Tutte le telecamere",
"existingPlaceholder": "Seleziona almeno una telecamera",
"existingDisabled": "Nessun'altra telecamera da copiare"
},
"categories": {
"legend": "Impostazioni da clonare",
"description": "Scegli quali impostazioni copiare dalla telecamera sorgente.",
"selectAll": "Seleziona tutto",
"selectNone": "Nessuna selezione",
"resetDefaults": "Ripristina le impostazioni predefinite",
"general": "Generale",
"spatial": "Impostazioni spaziali",
"streams": "Flussi",
"spatialWarningTitle": "Risoluzione non coincidente",
"spatialWarning": "La risoluzione di rilevamento della telecamera sorgente {{srcCamera}} ({{srcWidth}}×{{srcHeight}}) è diversa da quella di {{cameras}}. I poligoni potrebbero non allinearsi su queste telecamere. Queste impostazioni predefinite sono disattivate; abilitale per copiare così come sono.",
"restartHint": "Riavvio richiesto",
"items": {
"record": "Registrazione",
"snapshots": "Istantanee",
"review": "Revisiona",
"motion": "Rilevamento movimento",
"objects": "Oggetti",
"audio": "Rilevamento audio",
"audio_transcription": "Trascrizione audio",
"notifications": "Notifiche",
"birdseye": "Birdseye",
"mqtt": "MQTT",
"timestamp_style": "Stile orario",
"onvif": "ONVIF",
"lpr": "Riconoscimento targhe",
"face_recognition": "Riconoscimento facciale",
"semantic_search": "Ricerca semantica",
"genai": "IA Generativa",
"type": "Tipo di telecamera (normale / dedicata al riconoscimento targhe)",
"profiles": "Profili",
"detect": "Rileva le dimensioni",
"zones": "Zone",
"motion_mask": "Maschere di movimento",
"object_masks": "Maschere di oggetti",
"ffmpeg_live": "URL e ruoli del flusso"
}
},
"footer": {
"changeCount_one": "{{count}} modifica verrà applicata",
"changeCount_many": "{{count}} modifiche verranno applicate",
"changeCount_other": "{{count}} modifiche verranno applicate",
"restartNeeded": "Per alcune modifiche sarà necessario riavviare il sistema.",
"liveOnly": "Tutte le modifiche verranno applicate immediatamente, senza bisogno di riavviare il sistema.",
"submit": "Clona",
"submitting": "Clonazione…"
},
"toast": {
"success": "Impostazioni copiate in {{cameraName}}",
"successWithRestart": "Impostazioni copiate in {{cameraName}}. Riavvia Frigate per applicare tutte le modifiche.",
"successMulti_one": "Impostazioni copiate su {{count}} telecamera",
"successMulti_many": "Impostazioni copiate su {{count}} telecamere",
"successMulti_other": "Impostazioni copiate su {{count}} telecamere",
"successMultiWithRestart_one": "Impostazioni copiate su {{count}} telecamera. Riavvia Frigate per applicare tutte le modifiche.",
"successMultiWithRestart_many": "Impostazioni copiate su {{count}} telecamere. Riavvia Frigate per applicare tutte le modifiche.",
"successMultiWithRestart_other": "Impostazioni copiate su {{count}} telecamere. Riavvia Frigate per applicare tutte le modifiche.",
"partialFailure": "{{successCount}} sezioni applicate; '{{failedSection}}' non riuscita: {{errorMessage}}",
"partialFailureMulti": "Copiato su {{successCount}} telecamera(e); errore per {{failed}}: {{errorMessage}}",
"newCameraPartialFailure": "La telecamera {{cameraName}} è stata creata, ma alcune impostazioni non sono state copiate: {{errorMessage}}",
"sourceMissing": "La telecamera sorgente non esiste più",
"submitError": "Impossibile clonare la telecamera: {{errorMessage}}"
}
}
},
"button": {
@ -1672,8 +1579,7 @@
"renameStream": "Rinomina flusso",
"renameStreamDesc": "Inserisci un nuovo nome per questo flusso. Rinominare un flusso potrebbe causare problemi alle telecamere o ad altri flussi che lo referenziano tramite il suo nome.",
"newStreamName": "Nuovo nome del flusso",
"streamNumber": "Flusso {{index}}",
"sourceNumber": "Sorgente {{index}}"
"streamNumber": "Flusso {{index}}"
},
"configForm": {
"sections": {
@ -1886,17 +1792,6 @@
"availableStreams": "Flussi disponibili",
"useCustom": "Utilizza \"{{value}}\"",
"addStream": "Aggiungi flusso"
},
"ptzPresets": {
"placeholder": "Seleziona o inserisci un valore preimpostato...",
"search": "Cerca o inserisci un valore preimpostato...",
"noPresets": "Nessun valore preimpostato disponibile",
"available": "Preimpostazioni della telecamera",
"useCustom": "Utilizza \"{{value}}\""
},
"defaultRole": {
"admin": "Amministratore",
"viewer": "Visualizzatore"
}
},
"globalConfig": {
@ -2179,9 +2074,6 @@
},
"semanticSearch": {
"jinav2SmallModelSize": "Il modello 'piccolo' Jina V2 presenta elevati consumi di RAM e di inferenza. Si consiglia il modello 'grande' con GPU dedicata."
},
"onvif": {
"autotrackingNoZones": "Il tracciamento automatico richiede almeno una zona. Definisci una zona per questa telecamera in Maschere/Zone, quindi impostala come zona obbligatoria qui sotto."
}
},
"saveAllPreview": {

View File

@ -702,7 +702,7 @@
"label": "タイムスタンプエフェクト",
"description": "タイムスタンプ文字の視覚効果 (none, solid, shadow)。"
},
"description": "スナップショットおよびデバッグビューに適用されるタイムスタンプの表示設定。"
"description": "録画とスナップショットの映像内に表示されるタイムスタンプのスタイル設定。"
},
"semantic_search": {
"label": "セマンティック検索",

View File

@ -416,7 +416,7 @@
},
"default_role": {
"label": "デフォルトロール",
"description": "ロールマッピングが適用されない場合に、プロキシ認証されたユーザーに割り当てられるデフォルトロール。"
"description": "ロールマッピングが適用されない場合に、プロキシ認証ユーザーに割り当てるデフォルトロールadmin または viewer。"
},
"separator": {
"label": "区切り文字",

View File

@ -27,9 +27,7 @@
"polygonControls": {
"points_other": "{{count}} ポイント",
"undo": "直前のポイントを元に戻す",
"reset": "ポリゴンをリセット",
"drawMode": "描画",
"moveMode": "移動"
"reset": "ポリゴンをリセット"
},
"motionHeatmapLabel": "モーションヒートマップ",
"timeRange": {
@ -40,11 +38,11 @@
"settings": {
"title": "検索設定",
"parallelMode": "並列モード",
"parallelModeDesc": "複数の録画範囲を同時にスキャンする(処理が高速化されますが、デコードリソースをより多く消費します)",
"parallelModeDesc": "複数の録画セグメントを同時にスキャンします(高速ですが CPU 負荷が大幅に増加します)",
"threshold": "感度しきい値",
"thresholdDesc": "値を小さくするとより小さな変化も検知します (1-255)",
"minArea": "最小変化面積",
"minAreaDesc": "単一移動領域の最小サイズ(関心領域に対するパーセンテージ)",
"minAreaDesc": "有意な変化と判定するために必要な関心領域内の最小変化割合",
"frameSkip": "フレームスキップ",
"frameSkipDesc": "N フレームごとに処理します。カメラのフレームレートと同じ値にすると 1 秒あたり 1 フレーム処理されます(例: 5 FPS のカメラなら 5、30 FPS なら 30。値を大きくすると高速になりますが、短時間のモーションを取りこぼす可能性があります。",
"maxResults": "最大結果数",
@ -70,9 +68,6 @@
"framesDecoded": "デコードしたフレーム",
"wallTime": "検索時間",
"segmentErrors": "セグメントエラー",
"seconds": "{{seconds}} 秒",
"minutesSeconds": "{{minutes}} 分 {{seconds}} 秒",
"scanSummary": "{{segments}} セグメント · {{time}}"
},
"scanning": "スキャン中 {{time}}"
"seconds": "{{seconds}} 秒"
}
}

View File

@ -766,8 +766,7 @@
},
"notificationUnavailable": {
"title": "通知は利用できません",
"desc": "Web プッシュ通知にはセキュアコンテキスト(<code>https://…</code>)が必要です。これはブラウザの制限です。通知を利用するには、セキュアに Frigate へアクセスしてください。",
"descPwa": "iOSでは、Frigateをホーム画面に追加した場合にのみ、Webプッシュ通知を利用できます。<strong>共有</strong>メニューを開き、<strong>ホーム画面に追加</strong>を選択してから、新しいアイコンからFrigateを起動し、このデバイスを通知対象として登録してください。"
"desc": "Web プッシュ通知にはセキュアコンテキスト(<code>https://…</code>)が必要です。これはブラウザの制限です。通知を利用するには、セキュアに Frigate へアクセスしてください。"
},
"globalSettings": {
"title": "グローバル設定",
@ -1131,7 +1130,7 @@
"brands": {
"reolink-rtsp": "Reolink の RTSP は推奨されません。カメラ設定で http を有効にし、カメラウィザードを再起動することを推奨します。"
},
"customUrlRtspRequired": "カスタムURLは「rtsp://」または「rtsps://」で始まる必要があります。RTSP以外のカメラストリームについては、手動での設定が必要です。"
"customUrlRtspRequired": "カスタム URL は「rtsp://」で始まる必要があります。非 RTSP カメラ ストリームの場合は手動構成が必要です。"
},
"docs": {
"reolink": "https://docs.frigate.video/configuration/camera_specific.html#reolink-cameras"
@ -1822,17 +1821,6 @@
"availableStreams": "利用可能なストリーム",
"useCustom": "\"{{value}}\"を使用",
"addStream": "ストリームを追加"
},
"ptzPresets": {
"placeholder": "プリセットを選択または入力してください...",
"search": "検索またはプリセットを入力してください...",
"noPresets": "プリセットはありません",
"available": "カメラプリセット",
"useCustom": "\"{{value}}\" を使用してください"
},
"defaultRole": {
"admin": "管理者",
"viewer": "閲覧者"
}
},
"globalConfig": {
@ -1961,8 +1949,7 @@
"addVideoCodec": "ビデオコーデックを追加",
"addAudioCodec": "音声コーデックを追加",
"removeCodec": "コーデックを削除"
},
"sourceNumber": "ソース {{index}}"
}
},
"birdseye": {
"trackingMode": {
@ -2084,9 +2071,6 @@
},
"semanticSearch": {
"jinav2SmallModelSize": "Jina V2 モデルの「small」サイズは RAM と推論コストが高くなります。専用 GPU と「large」モデルの組み合わせを推奨します。"
},
"onvif": {
"autotrackingNoZones": "オートトラッキング機能を使用するには、少なくとも1つのゾーンが必要です。「マスク / ゾーン」でこのカメラ用のゾーンを定義し、以下でそれを必須ゾーンとして設定してください。"
}
}
}

View File

@ -162,12 +162,7 @@
"undo": "Cofnij",
"copiedToClipboard": "Skopiowano do schowka",
"modified": "Zmodyfikowane",
"overridden": "Nadpisany",
"resetToDefault": "Przywróć do domyślnych",
"saveAll": "Zapisz wszystkie",
"savingAll": "Zapisywanie wszystkich…",
"undoAll": "Cofnij wszystko",
"retry": "Powtórz"
"overridden": "Nadpisany"
},
"menu": {
"system": "System",
@ -218,9 +213,7 @@
"gl": "Galego (Galicyjski)",
"id": "Bahasa Indonesia (Indonezyjski)",
"ur": "اردو (Urdu)",
"hr": "Hrvatski (Chorwacki)",
"zhHant": "繁體中文 (Chiński Tradycyjny)",
"bs": "Bosanski (Bośniacki)"
"hr": "Hrvatski (Chorwacki)"
},
"appearance": "Wygląd",
"darkMode": {

View File

@ -77,18 +77,6 @@
"fromTimeline": {
"saveExport": "Zapisz Eksport",
"previewExport": "Podgląd Eksportu"
},
"multiCamera": {
"timeRange": "Zakres czasu",
"selectFromTimeline": "Wybierz z osi czasu",
"cameraSelection": "Kamery",
"cameraSelectionHelp": "Kamery ze śledzonymi obiektami w tym przedziale czasowym są wstępnie wybierane",
"checkingActivity": "Sprawdzanie aktywności kamery...",
"noCameras": "Brak dostępnych kamer",
"detectionCount_one": "{{count}} śledzony obiekt",
"detectionCount_few": "{{count}} śledzone obiekty",
"detectionCount_many": "{{count}} śledzonych obiektów",
"nameLabel": "Wyeksportuj nazwę"
}
},
"recording": {

View File

@ -148,15 +148,15 @@
"exportButton_other": "Exportă {{count}} de camere"
},
"multi": {
"title_one": "Exportă o revizuire",
"title_few": "Exportă {{count}} revizuiri",
"title_other": "Exportă {{count}} de revizuiri",
"description": "Exportă fiecare revizuire selectată. Toate exporturile vor fi grupate sub un singur caz.",
"descriptionNoCase": "Exportă fiecare revizuire selectată.",
"caseNamePlaceholder": "Export revizuiri - {{date}}",
"exportButton_one": "Exportă o revizuire",
"exportButton_few": "Exportă {{count}} revizuiri",
"exportButton_other": "Exportă {{count}} de revizuiri",
"title_one": "Exportă 1 recenzie",
"title_few": "Exportă {{count}} recenzii",
"title_other": "Exportă {{count}} de recenzii",
"description": "Exportă fiecare recenzie selectată. Toate exporturile vor fi grupate sub un singur caz.",
"descriptionNoCase": "Exportă fiecare recenzie selectată.",
"caseNamePlaceholder": "Export recenzie - {{date}}",
"exportButton_one": "Exportă 1 recenzie",
"exportButton_few": "Exportă {{count}} recenzii",
"exportButton_other": "Exportă {{count}} de recenzii",
"exportingButton": "Se exportă...",
"toast": {
"started_one": "A început 1 export. Se deschide cazul acum.",

View File

@ -686,7 +686,7 @@
},
"timestamp_style": {
"label": "Stil timestamp",
"description": "Opțiuni de stilizare pentru marcajele de timp aplicate snapshot-urilor și vizualizării Debug.",
"description": "Opțiuni de stilizare pentru timestamp-ul din flux, aplicate înregistrărilor și snapshot-urilor.",
"position": {
"label": "Poziție timestamp",
"description": "Unde apare data/ora pe imagine (stânga-sus/dreapta-sus etc.)."
@ -866,10 +866,6 @@
"dashboard": {
"label": "Arată în interfață",
"description": "Comută vizibilitatea acestei camere peste tot în interfața Frigate. Dezactivarea acestei opțiuni va necesita editarea manuală a configurației pentru a vedea din nou camera în interfață."
},
"review": {
"label": "Arată în Revizuire",
"description": "Comută dacă această cameră este vizibilă în Rrevizuire (pagina de revizuire și filtrul ei de camere, revizuirea mișcărilor și vizualizarea istoricului)."
}
},
"webui_url": {

View File

@ -1174,7 +1174,7 @@
},
"default_role": {
"label": "Rol implicit",
"description": "Rolul implicit atribuit utilizatorilor autentificați prin proxy când nu se aplică nicio mapare de rol."
"description": "Rolul implicit atribuit utilizatorilor autentificați prin proxy când nu se aplică nicio mapare de rol (admin sau viewer)."
},
"separator": {
"label": "Caracter separator",
@ -2337,10 +2337,6 @@
"dashboard": {
"label": "Arată în interfață",
"description": "Comută dacă această cameră este vizibilă peste tot în interfața Frigate. Dezactivarea acestei opțiuni va necesita editarea manuală a config-ului pentru a vedea din nou camera în interfață."
},
"review": {
"label": "Arată în Revizuire",
"description": "Comută dacă această cameră este vizibilă în Revizuire (pagina de revizuire și filtrul ei de camere, revizuirea mișcărilor și vizualizarea istoricului)."
}
},
"profiles": {

View File

@ -26,9 +26,7 @@
"points_few": "{{count}} puncte",
"points_other": "{{count}} de puncte",
"undo": "Anulează ultimul punct",
"reset": "Resetează poligonul",
"moveMode": "Mută",
"drawMode": "Desenează"
"reset": "Resetează poligonul"
},
"motionHeatmapLabel": "Harta termică a mișcării",
"dialog": {
@ -44,11 +42,11 @@
"settings": {
"title": "Setări de căutare",
"parallelMode": "Mod paralel",
"parallelModeDesc": "Scanează mai multe intervale de înregistrare în același timp (mai rapid; utilizează mai multe resurse de decodare)",
"parallelModeDesc": "Scanează mai multe segmente de înregistrare în același timp (mai rapid, dar consumă semnificativ mai mult procesorul)",
"threshold": "Prag de sensibilitate",
"thresholdDesc": "Valorile mai mici detectează schimbări mai mici (1-255)",
"minArea": "Arie minimă de schimbare",
"minAreaDesc": "Dimensiunea minimă a unei singure regiuni în mișcare, ca procent din regiunea de interes",
"minAreaDesc": "Procentul minim din regiunea de interes care trebuie să se schimbe pentru a fi considerat semnificativ",
"frameSkip": "Omitere cadre",
"frameSkipDesc": "Procesează fiecare al N-lea cadru. Setează asta la rata de cadre a camerei tale pentru a procesa un cadru pe secundă (ex. 5 pentru o cameră de 5 FPS, 30 pentru o cameră de 30 FPS). Valorile mai mari vor fi mai rapide, dar pot rata evenimente scurte de mișcare.",
"maxResults": "Rezultate maxime",
@ -74,9 +72,6 @@
"framesDecoded": "Cadre decodate",
"wallTime": "Timp de căutare",
"segmentErrors": "Erori segment",
"seconds": "{{seconds}}s",
"minutesSeconds": "{{minutes}}m {{seconds}}s",
"scanSummary": "{{segments}} segmente · {{time}}"
},
"scanning": "Scanare {{time}}"
"seconds": "{{seconds}}s"
}
}

View File

@ -32,7 +32,7 @@
"triggers": "Declanșatori",
"roles": "Roluri",
"cameraManagement": "Gestionare cameră",
"cameraReview": "Revizuire",
"cameraReview": "Recenzie",
"general": "General",
"globalConfig": "Configurație globală",
"system": "Sistem",
@ -44,7 +44,7 @@
"globalFfmpeg": "FFmpeg",
"globalMotion": "Detecție mișcare",
"globalObjects": "Obiecte",
"globalReview": "Revizuire",
"globalReview": "Recenzie",
"globalAudioEvents": "Detecție audio",
"globalLivePlayback": "Redare live",
"globalTimestampStyle": "Stil timestamp",
@ -74,7 +74,7 @@
"cameraSnapshots": "Snapshot-uri",
"cameraMotion": "Detecție mișcare",
"cameraObjects": "Obiecte",
"cameraConfigReview": "Revizuire",
"cameraConfigReview": "Recenzie",
"cameraAudioEvents": "Detecție audio",
"cameraAudioTranscription": "Transcriere audio",
"cameraNotifications": "Notificări",
@ -147,7 +147,7 @@
"title": "Calendar",
"firstWeekday": {
"label": "Prima zi a săptămânii",
"desc": "Ziua cu care încep săptămânile în calendarul de revizuire.",
"desc": "Ziua cu care încep săptămânile în calendarul de recenzii.",
"sunday": "Duminică",
"monday": "Luni"
}
@ -592,7 +592,7 @@
"admin": "Administrator",
"adminDesc": "Acces complet la toate funcțiile.",
"viewer": "Vizualizator",
"viewerDesc": "Limitat la tablouri de bord Live, Revizuire, Explorare și Exporturi.",
"viewerDesc": "Limitat la tablouri de bord Live, Recenzii, Explorare și Exporturi.",
"customDesc": "Rol personalizat cu acces la camere specifice."
},
"select": "Selectează un rol",
@ -712,8 +712,7 @@
"notificationUnavailable": {
"documentation": "Citește documentația",
"desc": "Notificările push web necesită un context securizat (<code>https://…</code>). Aceasta este o limitare a browserului. Accesează Frigate în mod securizat pentru a utiliza notificările.",
"title": "Notificări Indisponibile",
"descPwa": "Pe iOS, notificările web push sunt disponibile doar când Frigate este instalat pe ecranul principal. Deschide meniul <strong>Partajare</strong>, alege <strong>Adaugă pe ecranul principal</strong>, apoi deschide Frigate din noua pictogramă pentru a înregistra acest dispozitiv pentru notificări."
"title": "Notificări Indisponibile"
},
"cameras": {
"title": "Camere",
@ -1325,16 +1324,12 @@
"details": {
"edit": "Editează detaliile camerei",
"title": "Editează detaliile camerei",
"description": "Actualizează numele de afișare, URL-ul extern și vizibilitatea folosite pentru această cameră în tot UI-ul Frigate.",
"description": "Actualizează numele afișat și URL-ul extern utilizate pentru această cameră în întreaga interfață Frigate.",
"friendlyNameLabel": "Nume afișat",
"friendlyNameHelp": "Numele prietenos afișat pentru această cameră în întreaga interfață Frigate. Lasă gol pentru a utiliza ID-ul camerei.",
"webuiUrlLabel": "URL-ul interfeței web a camerei",
"webuiUrlHelp": "URL pentru a vizita interfața web a camerei direct din vizualizarea Depanare (Debug). Lasă gol pentru a dezactiva linkul.",
"webuiUrlInvalid": "Trebuie să fie un URL valid (de exemplu, https://exemplu.com).",
"dashboardLabel": "Arată pe dashboard-ul Live",
"reviewLabel": "Arată în Revizuire",
"dashboardHelp": "Arată această cameră pe dashboard-ul Live.",
"reviewHelp": "Arată această cameră în revizuiri, inclusiv filtrul de camere, revizuirea mișcărilor și vizualizarea istoricului."
"webuiUrlInvalid": "Trebuie să fie un URL valid (de exemplu, https://exemplu.com)."
},
"label": "Stare cameră",
"description": "Setează starea de funcționare pentru fiecare cameră.<br /><br /><strong>Pornit</strong>: stream-urile sunt procesate normal.<br /><strong>Oprit</strong>: pune temporar pe pauză procesarea. Nu se menține după repornirile Frigate.<br /><strong>Dezactivat</strong>: oprește procesarea și salvează modificarea în configurația ta. Este necesară o repornire pentru a reactiva o cameră dezactivată.<br /><br /><em>Notă: Dezactivarea nu afectează restream-urile go2rtc.</em><br /><br />Trage de mâner pentru a reordona camerele active așa cum apar în interfață, inclusiv în panoul Live și în meniurile drop-down de selecție a camerei.",
@ -1835,17 +1830,6 @@
"availableStreams": "Stream-uri disponibile",
"useCustom": "Folosește \"{{value}}\"",
"addStream": "Adaugă stream"
},
"ptzPresets": {
"placeholder": "Selectați sau introduceți o presetare...",
"search": "Căutați sau introduceți o presetare...",
"available": "Presetări cameră",
"noPresets": "Nu sunt presetări disponibile",
"useCustom": "Folosește \"{{value}}\""
},
"defaultRole": {
"admin": "Administrator",
"viewer": "Vizualizator"
}
},
"globalConfig": {
@ -2011,8 +1995,7 @@
"addAudioCodec": "Adaugă codec audio",
"removeCodec": "Elimină codecul"
},
"streamNumber": "Stream {{index}}",
"sourceNumber": "Sursă {{index}}"
"streamNumber": "Stream {{index}}"
},
"timestampPosition": {
"tl": "Sus stânga",
@ -2078,9 +2061,6 @@
},
"semanticSearch": {
"jinav2SmallModelSize": "Dimensiunea 'small' cu modelul Jina V2 are un cost ridicat de RAM și inferență. Modelul 'large' cu un GPU dedicat este recomandat."
},
"onvif": {
"autotrackingNoZones": "Autotracking-ul necesită cel puțin o zonă. Definește o zonă pentru această cameră în Măști / Zone, apoi seteaz-o ca zonă obligatorie mai jos."
}
},
"birdseye": {

View File

@ -68,7 +68,7 @@
"series": {
"go2rtc": "go2rtc",
"recording": "înregistrare",
"review_segment": "segment revizuire",
"review_segment": "segment recenzie",
"embeddings": "înglobări",
"audio_detector": "detector audio"
}
@ -172,9 +172,9 @@
"yolov9_plate_detection_speed": "Viteză Detecție Numere YOLOv9",
"text_embedding_speed": "Viteză înglobări de text",
"yolov9_plate_detection": "Detecție Numere YOLOv9",
"review_description": "Descriere revizuire",
"review_description_speed": "Viteză descriere revizuire",
"review_description_events_per_second": "Descriere revizuire",
"review_description": "Descriere Recenzie",
"review_description_speed": "Viteză Descriere Recenzie",
"review_description_events_per_second": "Descriere Recenzie",
"object_description": "Descriere Obiect",
"object_description_speed": "Viteză Descriere Obiect",
"object_description_events_per_second": "Descriere Obiect",

View File

@ -114,12 +114,7 @@
"download": "Ladda ner",
"info": "Info",
"export": "Exportera",
"continue": "Fortsätta",
"add": "Lägg till",
"applying": "Verkställer…",
"undo": "Ångra",
"copiedToClipboard": "Kopieras till urklipp",
"modified": "Modifiera"
"continue": "Fortsätta"
},
"menu": {
"language": {

View File

@ -858,10 +858,6 @@
"dashboard": {
"label": "在页面中显示",
"description": "切换此摄像头在 Frigate 页面的所有位置是否可见。禁用此项将需要手动编辑配置才能在页面中再次查看此摄像头。"
},
"review": {
"label": "在核查中显示",
"description": "切换该摄像头是否在核查页面可见(包含核查页、摄像头筛选栏、画面变动核查与历史视图)。"
}
},
"best_image_timeout": {

View File

@ -2213,10 +2213,6 @@
"dashboard": {
"label": "在页面中显示",
"description": "切换此摄像头在 Frigate 页面中是否可见。禁用后需要手动编辑配置才能再次在页面中查看此摄像头。"
},
"review": {
"label": "在核查中显示",
"description": "切换该摄像头是否在核查页面可见(包含核查页、摄像头筛选栏、画面变动核查与历史视图)。"
}
},
"onvif": {

View File

@ -40,11 +40,11 @@
"settings": {
"title": "搜索设置",
"parallelMode": "并行模式",
"parallelModeDesc": "同时扫描多个录制片段(速度更快,将使用更多解码资源",
"parallelModeDesc": "同时扫描多个录制片段(速度更快,但 CPU 占用会显著升高",
"threshold": "灵敏度阈值",
"thresholdDesc": "数值越低,可检测到越小的变化(取值范围 1-255",
"minArea": "最小变化区域",
"minAreaDesc": "单个移动区域的最小尺寸,占目标区域的百分比",
"minAreaDesc": "最小感兴趣区域变化占比,达到该比例才会判定为有效变动",
"frameSkip": "帧跳过",
"frameSkipDesc": "每隔 N 帧进行一次处理。将该值设置为摄像头的帧率即可实现每秒处理一帧画面例如5 帧 / 秒的摄像头设为 530 帧 / 秒的摄像头设为 30。数值越高处理速度越快但有可能遗漏短时移动侦测事件。",
"maxResults": "最大结果数",
@ -70,9 +70,6 @@
"framesDecoded": "画面已解码",
"wallTime": "搜索时间",
"segmentErrors": "片段异常",
"seconds": "{{seconds}} 秒",
"minutesSeconds": "{{minutes}}分 {{seconds}}秒",
"scanSummary": "{{segments}} 分段 · {{time}}"
},
"scanning": "扫描中 {{time}}"
"seconds": "{{seconds}} 秒"
}
}

View File

@ -1381,16 +1381,12 @@
"details": {
"edit": "编辑摄像头细节",
"title": "编辑摄像头细节",
"description": "更新此摄像头在 Frigate 页面中使用的显示名称、外部设置 URL 地址和是否可见。",
"description": "更新此摄像头在 Frigate 页面中使用的显示名称和外部设置 URL 地址。",
"friendlyNameLabel": "显示名称",
"friendlyNameHelp": "在 Frigate 页面中显示此摄像头的友好名称。留空以使用摄像头 ID。",
"webuiUrlLabel": "摄像头管理后台 URL",
"webuiUrlHelp": "从调试页面中直接访问摄像头管理网页界面。留空以禁用链接。",
"webuiUrlInvalid": "必须是有效的 URL例如https://example.com。",
"dashboardLabel": "在实时监控面板上显示",
"dashboardHelp": "在实时监控面板显示该摄像头。",
"reviewLabel": "在核查中显示",
"reviewHelp": "在核查页面展示该摄像头,包括在筛选列表、画面变动核查以及历史视图。"
"webuiUrlInvalid": "必须是有效的 URL例如https://example.com。"
},
"label": "摄像头状态",
"description": "设置各摄像头运行状态<br /><br /><strong>开启</strong>:正常处理视频流<br /><strong>关闭</strong>:临时暂停处理,重启后状态不保留<br /><strong>停用</strong>:停止处理并保存配置,重新启用需重启程序<br /><br /><em>备注:停用操作不会影响 go2rtc 转流功能</em><br /><br />拖动控件调整摄像头界面显示顺序,排序效果同步应用于实时面板及摄像头选择下拉栏。",

View File

@ -78,9 +78,7 @@ function DefaultAppView() {
className={cn(
"absolute right-0 top-0 overflow-hidden",
isMobile
? isPWA
? "bottom-[calc(3rem+env(safe-area-inset-bottom))] left-0 pt-[env(safe-area-inset-top)] md:bottom-[calc(4rem+env(safe-area-inset-bottom))] landscape:pl-[env(safe-area-inset-left)] landscape:pr-[env(safe-area-inset-right)]"
: "bottom-12 left-0 md:bottom-16"
? `bottom-${isPWA ? 16 : 12} left-0 md:bottom-16 landscape:bottom-14 landscape:md:bottom-16`
: "bottom-8 left-[52px]",
)}
>

View File

@ -15,13 +15,13 @@ const severityVariantMap: Record<
function SeverityIcon({ severity }: { severity: string }) {
switch (severity) {
case "info":
return <LuInfo className="size-4 shrink-0" />;
return <LuInfo className="size-4" />;
case "warning":
return <LuTriangleAlert className="size-4 shrink-0" />;
return <LuTriangleAlert className="size-4" />;
case "error":
return <LuCircleAlert className="size-4 shrink-0" />;
return <LuCircleAlert className="size-4" />;
default:
return <LuInfo className="size-4 shrink-0" />;
return <LuInfo className="size-4" />;
}
}

View File

@ -18,11 +18,11 @@ const severityVariantMap: Record<
function SeverityIcon({ severity }: { severity: MessageSeverity }) {
switch (severity) {
case "info":
return <LuInfo className="size-4 shrink-0" />;
return <LuInfo className="size-4" />;
case "warning":
return <LuTriangleAlert className="size-4 shrink-0" />;
return <LuTriangleAlert className="size-4" />;
case "error":
return <LuCircleAlert className="size-4 shrink-0" />;
return <LuCircleAlert className="size-4" />;
}
}

View File

@ -11,12 +11,8 @@ const detect: SectionConfigOverrides = {
condition: (ctx) =>
ctx.level === "camera" && ctx.formData?.enabled === false,
},
],
fieldMessages: [
{
key: "detect-resolution-not-multiple-of-four",
field: "width",
position: "before",
messageKey: "configMessages.detect.resolutionShouldBeMultipleOfFour",
severity: "warning",
condition: (ctx) => {
@ -27,59 +23,8 @@ const detect: SectionConfigOverrides = {
return isEvenButNotFour(width) || isEvenButNotFour(height);
},
},
{
key: "detect-global-resolution-multiple-cameras",
field: "width",
position: "before",
messageKey: "configMessages.detect.globalResolutionMultipleCameras",
severity: "info",
condition: (ctx) => {
if (ctx.level !== "global") return false;
const width = ctx.formData?.width as number | null | undefined;
const height = ctx.formData?.height as number | null | undefined;
if (typeof width !== "number" && typeof height !== "number") {
return false;
}
const cameraCount = Object.keys(ctx.fullConfig?.cameras ?? {}).length;
return cameraCount > 1;
},
},
{
key: "detect-resolution-high",
field: "width",
position: "before",
messageKey: "configMessages.detect.resolutionHigh",
severity: "warning",
condition: (ctx) => {
const width = ctx.formData?.width as number | null | undefined;
const height = ctx.formData?.height as number | null | undefined;
if (typeof width !== "number" || typeof height !== "number") {
return false;
}
return Math.min(width, height) > 1080;
},
},
{
key: "detect-square-resolution",
field: "width",
position: "before",
messageKey: "configMessages.detect.squareResolution",
severity: "warning",
condition: (ctx) => {
const width = ctx.formData?.width as number | null | undefined;
const height = ctx.formData?.height as number | null | undefined;
return (
typeof width === "number" &&
typeof height === "number" &&
width > 0 &&
width === height
);
},
},
{
key: "detect-aspect-ratio-mismatch",
field: "width",
position: "before",
messageKey: "configMessages.detect.aspectRatioMismatch",
severity: "warning",
condition: (ctx) => {
@ -110,6 +55,8 @@ const detect: SectionConfigOverrides = {
return Math.abs(newRatio - savedRatio) > 0.01;
},
},
],
fieldMessages: [
{
key: "fps-greater-than-five",
field: "fps",
@ -124,31 +71,6 @@ const detect: SectionConfigOverrides = {
return detectFps != null && streamFps != null && detectFps > 5;
},
},
{
key: "max-frames-set",
field: "stationary.max_frames",
messageKey: "configMessages.detect.maxFramesSet",
severity: "warning",
position: "after",
condition: (ctx) => {
const stationary = ctx.formData?.stationary as
| {
max_frames?: {
default?: number | null;
objects?: Record<string, number>;
} | null;
}
| null
| undefined;
const maxFrames = stationary?.max_frames;
if (!maxFrames) return false;
return (
typeof maxFrames.default === "number" ||
(maxFrames.objects != null &&
Object.keys(maxFrames.objects).length > 0)
);
},
},
],
fieldOrder: [
"enabled",
@ -159,9 +81,9 @@ const detect: SectionConfigOverrides = {
"max_disappeared",
"annotation_offset",
"stationary",
"stationary.interval",
"stationary.threshold",
"stationary.max_frames",
"interval",
"threshold",
"max_frames",
],
restartRequired: [],
fieldGroups: {
@ -207,6 +129,9 @@ const detect: SectionConfigOverrides = {
"max_disappeared",
"annotation_offset",
"stationary",
"interval",
"threshold",
"max_frames",
],
advancedFields: [],
},

View File

@ -8,17 +8,7 @@ import { isDesktop, isMobile } from "react-device-detect";
import useSWR from "swr";
import { MdHome } from "react-icons/md";
import { Button, buttonVariants } from "../ui/button";
import {
useCallback,
useEffect,
useLayoutEffect,
useMemo,
useRef,
useState,
} from "react";
import { AnimatePresence, motion } from "framer-motion";
import { HiDotsHorizontal } from "react-icons/hi";
import { IoClose } from "react-icons/io5";
import { useCallback, useEffect, useMemo, useState } from "react";
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip";
import { LuPencil, LuPlus } from "react-icons/lu";
import {
@ -66,6 +56,7 @@ import { z } from "zod";
import { Toaster } from "@/components/ui/sonner";
import { toast } from "sonner";
import ActivityIndicator from "../indicators/activity-indicator";
import { ScrollArea, ScrollBar } from "../ui/scroll-area";
import { useUserPersistence } from "@/hooks/use-user-persistence";
import { TooltipPortal } from "@radix-ui/react-tooltip";
import { cn } from "@/lib/utils";
@ -154,142 +145,7 @@ export function CameraGroupSelector({ className }: CameraGroupSelectorProps) {
const [addGroup, setAddGroup] = useState(false);
// mobile overflow reveal - the group strip sits left of the logo and is
// clipped (not scrollable) when there are too many groups, so render only
// the buttons that fully fit and surface a kebab next to the last visible
// one that expands a panel revealing all of them
const [expanded, setExpanded] = useState(false);
// null => all buttons fit, render them all with no kebab; a number => only
// that many fit alongside the kebab
const [visibleCount, setVisibleCount] = useState<number | null>(null);
const wrapperRef = useRef<HTMLDivElement | null>(null);
const measureRef = useRef<HTMLDivElement | null>(null);
useLayoutEffect(() => {
if (isDesktop) {
return;
}
const wrapper = wrapperRef.current;
const measure = measureRef.current;
if (!wrapper || !measure) {
return;
}
const gap = 8; // gap-2 between buttons in the strip
const wrapperGap = 4; // gap-1 between the strip and the kebab
const compute = () => {
const buttons = Array.from(measure.children) as HTMLElement[];
if (buttons.length === 0) {
return;
}
// the trailing child of the measurement row is a kebab clone
const kebab = buttons[buttons.length - 1];
const groupButtons = buttons.slice(0, -1);
const available = wrapper.clientWidth;
const fullWidth =
groupButtons.reduce((sum, el) => sum + el.offsetWidth, 0) +
Math.max(groupButtons.length - 1, 0) * gap;
if (fullWidth <= available) {
setVisibleCount(null);
return;
}
const budget = available - kebab.offsetWidth - wrapperGap;
let used = 0;
let count = 0;
for (const el of groupButtons) {
const next = (count === 0 ? 0 : gap) + el.offsetWidth;
if (used + next <= budget) {
used += next;
count += 1;
} else {
break;
}
}
setVisibleCount(Math.max(count, 1));
};
compute();
const observer = new ResizeObserver(compute);
observer.observe(wrapper);
return () => observer.disconnect();
}, [groups, isAdmin]);
const groupButtons = (afterSelect?: () => void) => {
const buttons = [
<Button
key="default-group"
className={cn(
"shrink-0",
group == "default"
? "bg-blue-900 bg-opacity-60 text-selected focus:bg-blue-900 focus:bg-opacity-60"
: "bg-secondary text-secondary-foreground",
)}
aria-label={t("menu.live.allCameras", { ns: "common" })}
size="sm"
onClick={() => {
if (group) {
setGroup("default", true);
}
afterSelect?.();
}}
>
<MdHome className="size-5" />
</Button>,
...groups.map(([name, config]) => (
<Button
key={name}
className={cn(
"shrink-0",
group == name
? "bg-blue-900 bg-opacity-60 text-selected focus:bg-blue-900 focus:bg-opacity-60"
: "bg-secondary text-secondary-foreground",
)}
aria-label={t("group.label")}
size="sm"
onClick={() => {
setGroup(name, group != "default");
afterSelect?.();
}}
>
{config && config.icon && isValidIconName(config.icon) && (
<IconRenderer icon={LuIcons[config.icon]} className="size-5" />
)}
</Button>
)),
];
if (isAdmin) {
buttons.push(
<Button
key="add-group"
className="shrink-0 bg-secondary text-muted-foreground"
aria-label={t("group.add")}
size="sm"
onClick={() => {
setAddGroup(true);
afterSelect?.();
}}
>
<LuPencil className="size-5 text-primary-variant" />
</Button>,
);
}
return buttons;
};
const Scroller = isMobile ? ScrollArea : "div";
return (
<>
@ -302,11 +158,12 @@ export function CameraGroupSelector({ className }: CameraGroupSelectorProps) {
deleteGroup={deleteGroup}
isAdmin={isAdmin}
/>
{isDesktop ? (
<Scroller className={`${isMobile ? "whitespace-nowrap" : ""}`}>
<div
className={cn(
"flex flex-col items-center justify-start gap-2",
"flex items-center justify-start gap-2",
className,
isDesktop ? "flex-col" : "whitespace-nowrap",
)}
>
<Tooltip open={tooltip == "default"}>
@ -320,8 +177,8 @@ export function CameraGroupSelector({ className }: CameraGroupSelectorProps) {
aria-label={t("menu.live.allCameras", { ns: "common" })}
size="xs"
onClick={() => (group ? setGroup("default", true) : null)}
onMouseEnter={() => showTooltip("default")}
onMouseLeave={() => showTooltip(undefined)}
onMouseEnter={() => (isDesktop ? showTooltip("default") : null)}
onMouseLeave={() => (isDesktop ? showTooltip(undefined) : null)}
>
<MdHome className="size-4" />
</Button>
@ -345,8 +202,10 @@ export function CameraGroupSelector({ className }: CameraGroupSelectorProps) {
aria-label={t("group.label")}
size="xs"
onClick={() => setGroup(name, group != "default")}
onMouseEnter={() => showTooltip(name)}
onMouseLeave={() => showTooltip(undefined)}
onMouseEnter={() => (isDesktop ? showTooltip(name) : null)}
onMouseLeave={() =>
isDesktop ? showTooltip(undefined) : null
}
>
{config && config.icon && isValidIconName(config.icon) && (
<IconRenderer
@ -366,97 +225,18 @@ export function CameraGroupSelector({ className }: CameraGroupSelectorProps) {
})}
{isAdmin && (
<Tooltip open={tooltip == "edit"}>
<TooltipTrigger asChild>
<Button
className="bg-secondary text-muted-foreground"
aria-label={t("group.editGroups")}
size="xs"
onClick={() => setAddGroup(true)}
onMouseEnter={() => showTooltip("edit")}
onMouseLeave={() => showTooltip(undefined)}
>
<LuPencil className="size-4 text-primary-variant" />
</Button>
</TooltipTrigger>
<TooltipPortal>
<TooltipContent side="right">
{t("group.editGroups")}
</TooltipContent>
</TooltipPortal>
</Tooltip>
)}
</div>
) : (
<div
ref={wrapperRef}
className={cn("flex min-w-0 items-center gap-1", className)}
>
<div className="flex min-w-0 items-center gap-2 overflow-hidden whitespace-nowrap">
{visibleCount == null
? groupButtons()
: groupButtons().slice(0, visibleCount)}
</div>
{visibleCount != null && (
<Button
variant="ghost"
size="sm"
className="shrink-0 px-2 text-secondary-foreground"
aria-label={t("group.showAll")}
onClick={() => setExpanded(true)}
className="bg-secondary text-muted-foreground"
aria-label={t("group.add")}
size="xs"
onClick={() => setAddGroup(true)}
>
<HiDotsHorizontal className="size-5" />
<LuPlus className="size-4 text-primary" />
</Button>
)}
{/* invisible row used only to measure natural button widths so we
can render exactly the buttons that fully fit */}
<div
className="pointer-events-none absolute left-0 top-0 h-0 w-0 overflow-hidden"
aria-hidden
inert
>
<div ref={measureRef} className="flex w-max items-center gap-2">
{groupButtons()}
<Button variant="ghost" size="sm" className="px-2">
<HiDotsHorizontal className="size-5" />
</Button>
</div>
</div>
{expanded && (
<div
className="fixed inset-0 z-20"
onClick={() => setExpanded(false)}
/>
)}
<AnimatePresence>
{expanded && (
<motion.div
key="group-overlay"
className="absolute inset-x-0 top-0 z-30 bg-background py-1 shadow-lg"
initial={{ clipPath: "inset(0 100% 0 0)" }}
animate={{ clipPath: "inset(0 0% 0 0)" }}
exit={{ clipPath: "inset(0 100% 0 0)" }}
transition={{ duration: 0.2, ease: "easeInOut" }}
>
<div className="flex flex-wrap items-center gap-2">
{groupButtons(() => setExpanded(false))}
<Button
variant="ghost"
size="sm"
className="ml-auto shrink-0 px-2 text-secondary-foreground"
aria-label={t("group.showLess")}
onClick={() => setExpanded(false)}
>
<IoClose className="size-5" />
</Button>
</div>
</motion.div>
)}
</AnimatePresence>
{isMobile && <ScrollBar orientation="horizontal" className="h-0" />}
</div>
)}
</Scroller>
</>
);
}

View File

@ -6,9 +6,9 @@ export function LiveGridIcon({ layout }: LiveIconProps) {
return (
<div className="flex size-full flex-col gap-0.5 overflow-hidden rounded-md">
<div
className={`w-full flex-1 ${layout == "grid" ? "bg-selected" : "bg-muted-foreground"}`}
className={`h-1 w-full ${layout == "grid" ? "bg-selected" : "bg-muted-foreground"}`}
/>
<div className="flex w-full flex-1 gap-0.5">
<div className="flex h-1 w-full gap-0.5">
<div
className={`w-full ${layout == "grid" ? "bg-selected" : "bg-muted-foreground"}`}
/>
@ -16,7 +16,7 @@ export function LiveGridIcon({ layout }: LiveIconProps) {
className={`w-full ${layout == "grid" ? "bg-selected" : "bg-muted-foreground"}`}
/>
</div>
<div className="flex w-full flex-1 gap-0.5">
<div className="flex h-1 w-full gap-0.5">
<div
className={`w-full ${layout == "grid" ? "bg-selected" : "bg-muted-foreground"}`}
/>

View File

@ -82,13 +82,9 @@ import { MdCategory } from "react-icons/md";
type GeneralSettingsProps = {
className?: string;
large?: boolean;
};
export default function GeneralSettings({
className,
large,
}: GeneralSettingsProps) {
export default function GeneralSettings({ className }: GeneralSettingsProps) {
const { t } = useTranslation(["common", "views/settings"]);
const { getLocaleDocUrl } = useDocDomain();
const { data: profile } = useSWR("profile");
@ -229,13 +225,10 @@ export default function GeneralSettings({
isDesktop
? "cursor-pointer rounded-lg bg-secondary text-secondary-foreground hover:bg-muted"
: "text-secondary-foreground",
large && "size-12",
className,
)}
>
<LuSettings
className={cn("md:m-[6px]", large ? "size-6" : "size-5")}
/>
<LuSettings className="size-5 md:m-[6px]" />
</div>
</TooltipTrigger>
<TooltipPortal>

View File

@ -146,10 +146,9 @@ export function MobilePageContent({
<motion.div
ref={containerRef}
className={cn(
"fixed inset-0 z-50 bg-background",
isPWA
? "mb-[calc(3rem+env(safe-area-inset-bottom))] md:mb-[calc(4rem+env(safe-area-inset-bottom))]"
: "mb-12 md:mb-16",
"fixed inset-0 z-50 mb-12 bg-background",
isPWA && "mb-16",
"landscape:mb-14 landscape:md:mb-16",
className,
)}
initial={{ x: "100%" }}

View File

@ -4,14 +4,7 @@ import { Drawer, DrawerContent, DrawerTrigger } from "../ui/drawer";
import useSWR from "swr";
import { FrigateStats } from "@/types/stats";
import { useEmbeddingsReindexProgress, useFrigateStats } from "@/api/ws";
import {
useContext,
useEffect,
useLayoutEffect,
useMemo,
useRef,
useState,
} from "react";
import { useContext, useEffect, useMemo } from "react";
import useStats from "@/hooks/use-stats";
import GeneralSettings from "../menu/GeneralSettings";
import useNavigation from "@/hooks/use-navigation";
@ -21,82 +14,36 @@ import {
} from "@/context/statusbar-provider";
import { Link } from "react-router-dom";
import { cn } from "@/lib/utils";
import { isMobile } from "react-device-detect";
import { isIOS, isMobile } from "react-device-detect";
import { isPWA } from "@/utils/isPWA";
import { useTranslation } from "react-i18next";
function Bottombar() {
const navItems = useNavigation("secondary");
// Render 48px touch targets when they fit with even spacing, otherwise fall
// back to the compact size. Measured against the live bar width and icon
// count (which varies with enabled nav items and the status alert).
const containerRef = useRef<HTMLDivElement | null>(null);
const [large, setLarge] = useState(false);
useLayoutEffect(() => {
const el = containerRef.current;
if (!el) {
return;
}
const TARGET = 48; // standard bottom-nav touch target (px)
const MIN_GAP = 8; // minimum spacing between targets (px)
const compute = () => {
const count = el.children.length;
if (count === 0) {
return;
}
const needed = count * TARGET + Math.max(count - 1, 0) * MIN_GAP;
setLarge(needed <= el.clientWidth);
};
compute();
const resize = new ResizeObserver(compute);
resize.observe(el);
// recompute when items are added/removed (e.g. the status alert appears)
const mutation = new MutationObserver(compute);
mutation.observe(el, { childList: true });
return () => {
resize.disconnect();
mutation.disconnect();
};
}, [navItems]);
return (
<div
ref={containerRef}
className={cn(
"absolute inset-x-4 bottom-0 flex h-16 flex-row items-center justify-between",
isMobile &&
(isPWA
? "h-[calc(3rem+env(safe-area-inset-bottom))] pb-[env(safe-area-inset-bottom)] md:h-[calc(4rem+env(safe-area-inset-bottom))]"
: "h-12 md:h-16 md:pb-2"),
"absolute inset-x-4 bottom-0 flex h-16 flex-row justify-between",
isPWA && isIOS
? "portrait:items-start portrait:pt-1 landscape:items-center"
: "items-center",
isMobile && !isPWA && "h-12 md:h-16",
)}
>
{navItems.map((item) => (
<NavItem
key={item.id}
large={large}
className="p-2"
item={item}
Icon={item.icon}
/>
<NavItem key={item.id} className="p-2" item={item} Icon={item.icon} />
))}
<GeneralSettings large={large} className="p-2" />
<StatusAlertNav large={large} className="p-2" />
<GeneralSettings className="p-2" />
<StatusAlertNav className="p-2" />
</div>
);
}
type StatusAlertNavProps = {
className?: string;
large?: boolean;
};
function StatusAlertNav({ className, large }: StatusAlertNavProps) {
function StatusAlertNav({ className }: StatusAlertNavProps) {
const { t } = useTranslation(["views/system"]);
const { data: initialStats } = useSWR<FrigateStats>("stats", {
revalidateOnFocus: false,
@ -158,18 +105,8 @@ function StatusAlertNav({ className, large }: StatusAlertNavProps) {
return (
<Drawer>
<DrawerTrigger asChild>
<div
className={cn(
"flex flex-col items-center justify-center p-2",
large && "size-12",
)}
>
<IoIosWarning
className={cn(
"text-danger md:m-[6px]",
large ? "size-6" : "size-5",
)}
/>
<div className="p-2">
<IoIosWarning className="size-5 text-danger md:m-[6px]" />
</div>
</DrawerTrigger>
<DrawerContent

View File

@ -27,7 +27,6 @@ type NavItemProps = {
item: NavData;
Icon: IconType;
onClick?: () => void;
large?: boolean;
};
export default function NavItem({
@ -35,7 +34,6 @@ export default function NavItem({
item,
Icon,
onClick,
large,
}: NavItemProps) {
const { t } = useTranslation(["common"]);
if (item.enabled == false) {
@ -50,12 +48,11 @@ export default function NavItem({
cn(
"flex flex-col items-center justify-center rounded-lg p-[6px]",
className,
large && "size-12",
variants[item.variant ?? "primary"][isActive ? "active" : "inactive"],
)
}
>
<Icon className={large ? "size-6" : "size-5"} />
<Icon className="size-5" />
</NavLink>
);

View File

@ -2,6 +2,8 @@ import * as React from "react";
import { Drawer as DrawerPrimitive } from "vaul";
import { cn } from "@/lib/utils";
import { isPWA } from "@/utils/isPWA";
import { isIOS } from "react-device-detect";
const Drawer = ({
shouldScaleBackground = true,
@ -41,9 +43,10 @@ const DrawerContent = React.forwardRef<
<DrawerPrimitive.Content
ref={ref}
className={cn(
"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border border-b-0 bg-background",
"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background",
className,
"pb-[calc(0.25rem+env(safe-area-inset-bottom))]",
isIOS && isPWA && "pb-5",
isIOS && !isPWA && "md:pb-5",
)}
{...props}
>

View File

@ -404,38 +404,34 @@ export default function LiveDashboardView({
{isMobile && (
<div className="relative flex h-11 items-center justify-between">
<Logo className="absolute inset-x-1/2 h-8 -translate-x-1/2" />
<div className="w-[45%]">
<div className="max-w-[45%]">
<CameraGroupSelector />
</div>
{(!cameraGroup || cameraGroup == "default" || isMobileOnly) && (
<div className="flex items-center gap-1">
<Button
className={
className={`p-1 ${
mobileLayout == "grid"
? "bg-blue-900 bg-opacity-60 focus:bg-blue-900 focus:bg-opacity-60"
: "bg-secondary"
}
}`}
aria-label="Use mobile grid layout"
size="sm"
size="xs"
onClick={() => setMobileLayout("grid")}
>
<div className="size-5">
<LiveGridIcon layout={mobileLayout} />
</div>
<LiveGridIcon layout={mobileLayout} />
</Button>
<Button
className={
className={`p-1 ${
mobileLayout == "list"
? "bg-blue-900 bg-opacity-60 focus:bg-blue-900 focus:bg-opacity-60"
: "bg-secondary"
}
}`}
aria-label="Use mobile list layout"
size="sm"
size="xs"
onClick={() => setMobileLayout("list")}
>
<div className="size-5">
<LiveListIcon layout={mobileLayout} />
</div>
<LiveListIcon layout={mobileLayout} />
</Button>
</div>
)}
@ -443,21 +439,18 @@ export default function LiveDashboardView({
<div className="flex items-center gap-1">
<Button
className={cn(
"p-1",
isEditMode
? "bg-selected text-primary"
: "bg-secondary text-secondary-foreground",
)}
aria-label="Enter layout editing mode"
size="sm"
size="xs"
onClick={() =>
setIsEditMode((prevIsEditMode) => !prevIsEditMode)
}
>
{isEditMode ? (
<IoClose className="size-5" />
) : (
<LuLayoutDashboard className="size-5" />
)}
{isEditMode ? <IoClose /> : <LuLayoutDashboard />}
</Button>
</div>
)}