Compare commits

..

223 Commits

Author SHA1 Message Date
Owen Schwartz 0ef7c2f2ce New translations en-us.json (French)
[ci skip]
2026-06-09 16:57:26 -07:00
Owen Schwartz cbaa0e36d8 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-09 16:57:24 -07:00
Owen Schwartz 2d313df3af New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-09 16:57:22 -07:00
Owen Schwartz 9fba2e08b0 New translations en-us.json (Turkish)
[ci skip]
2026-06-09 16:57:21 -07:00
Owen Schwartz 26f770b426 New translations en-us.json (Russian)
[ci skip]
2026-06-09 16:57:19 -07:00
Owen Schwartz 6dad20bff0 New translations en-us.json (Portuguese)
[ci skip]
2026-06-09 16:57:17 -07:00
Owen Schwartz 957760ad49 New translations en-us.json (Polish)
[ci skip]
2026-06-09 16:57:15 -07:00
Owen Schwartz 6eefa224eb New translations en-us.json (Dutch)
[ci skip]
2026-06-09 16:57:14 -07:00
Owen Schwartz 80ee00923b New translations en-us.json (Korean)
[ci skip]
2026-06-09 16:57:12 -07:00
Owen Schwartz 8383d20d48 New translations en-us.json (Italian)
[ci skip]
2026-06-09 16:57:10 -07:00
Owen Schwartz dad9fba602 New translations en-us.json (German)
[ci skip]
2026-06-09 16:57:08 -07:00
Owen Schwartz bfb0596414 New translations en-us.json (Czech)
[ci skip]
2026-06-09 16:57:07 -07:00
Owen Schwartz 2511f9f819 New translations en-us.json (Bulgarian)
[ci skip]
2026-06-09 16:57:05 -07:00
Owen Schwartz ac6a90f61a New translations en-us.json (Spanish)
[ci skip]
2026-06-09 16:57:03 -07:00
Owen Schwartz 3d5669208e New translations en-us.json (French)
[ci skip]
2026-06-09 15:36:15 -07:00
Owen Schwartz f0443173cc New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-09 15:36:14 -07:00
Owen Schwartz af07692fbf New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-09 15:36:12 -07:00
Owen Schwartz 11276c02cd New translations en-us.json (Turkish)
[ci skip]
2026-06-09 15:36:10 -07:00
Owen Schwartz 1be4e93849 New translations en-us.json (Russian)
[ci skip]
2026-06-09 15:36:08 -07:00
Owen Schwartz 6ab41c9c5a New translations en-us.json (Portuguese)
[ci skip]
2026-06-09 15:36:06 -07:00
Owen Schwartz a5355390a3 New translations en-us.json (Polish)
[ci skip]
2026-06-09 15:36:04 -07:00
Owen Schwartz 5daab3d0be New translations en-us.json (Dutch)
[ci skip]
2026-06-09 15:36:02 -07:00
Owen Schwartz 5364e2f419 New translations en-us.json (Korean)
[ci skip]
2026-06-09 15:36:00 -07:00
Owen Schwartz a63c1acf00 New translations en-us.json (Italian)
[ci skip]
2026-06-09 15:35:58 -07:00
Owen Schwartz 1ca442fc90 New translations en-us.json (German)
[ci skip]
2026-06-09 15:35:56 -07:00
Owen Schwartz 5f9b0d9f3c New translations en-us.json (Czech)
[ci skip]
2026-06-09 15:35:54 -07:00
Owen Schwartz 230fc39b66 New translations en-us.json (Bulgarian)
[ci skip]
2026-06-09 15:35:52 -07:00
Owen Schwartz 1cbe8a914c New translations en-us.json (Spanish)
[ci skip]
2026-06-09 15:35:50 -07:00
Owen Schwartz 0b22ccfda3 New translations en-us.json (French)
[ci skip]
2026-06-08 16:08:49 -07:00
Owen Schwartz e5a3b93f58 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-08 16:08:47 -07:00
Owen Schwartz 7a403b3deb New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-08 16:08:46 -07:00
Owen Schwartz 1e968acede New translations en-us.json (Turkish)
[ci skip]
2026-06-08 16:08:44 -07:00
Owen Schwartz 5d4a1ffd73 New translations en-us.json (Russian)
[ci skip]
2026-06-08 16:08:42 -07:00
Owen Schwartz 501770bee0 New translations en-us.json (Portuguese)
[ci skip]
2026-06-08 16:08:40 -07:00
Owen Schwartz 247f19ce4e New translations en-us.json (Polish)
[ci skip]
2026-06-08 16:08:38 -07:00
Owen Schwartz 2ad41154b3 New translations en-us.json (Dutch)
[ci skip]
2026-06-08 16:08:36 -07:00
Owen Schwartz 8a59930886 New translations en-us.json (Korean)
[ci skip]
2026-06-08 16:08:35 -07:00
Owen Schwartz 02a6959e3e New translations en-us.json (Italian)
[ci skip]
2026-06-08 16:08:33 -07:00
Owen Schwartz e6f476dbf5 New translations en-us.json (German)
[ci skip]
2026-06-08 16:08:31 -07:00
Owen Schwartz 7837578672 New translations en-us.json (Czech)
[ci skip]
2026-06-08 16:08:29 -07:00
Owen Schwartz c603acacd7 New translations en-us.json (Bulgarian)
[ci skip]
2026-06-08 16:08:27 -07:00
Owen Schwartz 021857c738 New translations en-us.json (Spanish)
[ci skip]
2026-06-08 16:08:25 -07:00
Owen Schwartz b96fe34e83 New translations en-us.json (French)
[ci skip]
2026-06-08 14:42:11 -07:00
Owen Schwartz acda39d27a New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-08 14:42:09 -07:00
Owen Schwartz 068b7f3217 New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-08 14:42:07 -07:00
Owen Schwartz f3f1d8a161 New translations en-us.json (Turkish)
[ci skip]
2026-06-08 14:42:05 -07:00
Owen Schwartz 9edb126594 New translations en-us.json (Russian)
[ci skip]
2026-06-08 14:42:03 -07:00
Owen Schwartz 1b8b231c69 New translations en-us.json (Portuguese)
[ci skip]
2026-06-08 14:42:01 -07:00
Owen Schwartz c7e27976c0 New translations en-us.json (Polish)
[ci skip]
2026-06-08 14:41:59 -07:00
Owen Schwartz b795021014 New translations en-us.json (Dutch)
[ci skip]
2026-06-08 14:41:57 -07:00
Owen Schwartz 58d0f55480 New translations en-us.json (Korean)
[ci skip]
2026-06-08 14:41:56 -07:00
Owen Schwartz f99df78f26 New translations en-us.json (Italian)
[ci skip]
2026-06-08 14:41:54 -07:00
Owen Schwartz 2af68672a8 New translations en-us.json (German)
[ci skip]
2026-06-08 14:41:52 -07:00
Owen Schwartz 985aba5e67 New translations en-us.json (Czech)
[ci skip]
2026-06-08 14:41:50 -07:00
Owen Schwartz 8329a2d6d9 New translations en-us.json (Bulgarian)
[ci skip]
2026-06-08 14:41:48 -07:00
Owen Schwartz da4559b28f New translations en-us.json (Spanish)
[ci skip]
2026-06-08 14:41:46 -07:00
Owen Schwartz 1e9c2b5bfd New translations en-us.json (French)
[ci skip]
2026-06-08 12:14:10 -07:00
Owen Schwartz b5f5e2fa03 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-08 12:14:08 -07:00
Owen Schwartz 7748a07308 New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-08 12:14:06 -07:00
Owen Schwartz ed79c98115 New translations en-us.json (Turkish)
[ci skip]
2026-06-08 12:14:04 -07:00
Owen Schwartz afc582dd81 New translations en-us.json (Russian)
[ci skip]
2026-06-08 12:14:02 -07:00
Owen Schwartz 2c93b004bc New translations en-us.json (Portuguese)
[ci skip]
2026-06-08 12:13:59 -07:00
Owen Schwartz 2c9b812ba2 New translations en-us.json (Polish)
[ci skip]
2026-06-08 12:13:56 -07:00
Owen Schwartz c714e4fc9c New translations en-us.json (Dutch)
[ci skip]
2026-06-08 12:13:54 -07:00
Owen Schwartz f6274fb789 New translations en-us.json (Korean)
[ci skip]
2026-06-08 12:13:52 -07:00
Owen Schwartz 2409165bfd New translations en-us.json (Italian)
[ci skip]
2026-06-08 12:13:50 -07:00
Owen Schwartz d52ae1f5e1 New translations en-us.json (German)
[ci skip]
2026-06-08 12:13:47 -07:00
Owen Schwartz f69d41ebc3 New translations en-us.json (Czech)
[ci skip]
2026-06-08 12:13:45 -07:00
Owen Schwartz 99a7dfa2e2 New translations en-us.json (Bulgarian)
[ci skip]
2026-06-08 12:13:43 -07:00
Owen Schwartz 4ba08ba9ae New translations en-us.json (Spanish)
[ci skip]
2026-06-08 12:13:41 -07:00
Owen Schwartz 8a83be49ee New translations en-us.json (French)
[ci skip]
2026-06-08 11:01:56 -07:00
Owen Schwartz f3a96f3db8 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-08 11:01:54 -07:00
Owen Schwartz b5dd8b2598 New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-08 11:01:52 -07:00
Owen Schwartz abf3f3b0da New translations en-us.json (Turkish)
[ci skip]
2026-06-08 11:01:49 -07:00
Owen Schwartz a44a762f64 New translations en-us.json (Russian)
[ci skip]
2026-06-08 11:01:47 -07:00
Owen Schwartz 259711990c New translations en-us.json (Portuguese)
[ci skip]
2026-06-08 11:01:45 -07:00
Owen Schwartz 58ff29700b New translations en-us.json (Polish)
[ci skip]
2026-06-08 11:01:43 -07:00
Owen Schwartz 6a4923a11d New translations en-us.json (Dutch)
[ci skip]
2026-06-08 11:01:40 -07:00
Owen Schwartz 1b7c6629ad New translations en-us.json (Korean)
[ci skip]
2026-06-08 11:01:38 -07:00
Owen Schwartz be3f9819ac New translations en-us.json (Italian)
[ci skip]
2026-06-08 11:01:36 -07:00
Owen Schwartz 57c50dfc4c New translations en-us.json (German)
[ci skip]
2026-06-08 11:01:34 -07:00
Owen Schwartz e89dce930b New translations en-us.json (Czech)
[ci skip]
2026-06-08 11:01:32 -07:00
Owen Schwartz 423dfd683f New translations en-us.json (Bulgarian)
[ci skip]
2026-06-08 11:01:30 -07:00
Owen Schwartz 806ec75a2b New translations en-us.json (Spanish)
[ci skip]
2026-06-08 11:01:28 -07:00
Owen Schwartz 03fa092e9e New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-06 12:41:18 -07:00
Owen Schwartz 7631555f00 New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-06 12:41:16 -07:00
Owen Schwartz 297fb8f020 New translations en-us.json (Turkish)
[ci skip]
2026-06-06 12:41:15 -07:00
Owen Schwartz d11a76bbef New translations en-us.json (Russian)
[ci skip]
2026-06-06 12:41:13 -07:00
Owen Schwartz 1323c11db9 New translations en-us.json (Portuguese)
[ci skip]
2026-06-06 12:41:11 -07:00
Owen Schwartz 6bbaad9fa2 New translations en-us.json (Polish)
[ci skip]
2026-06-06 12:41:09 -07:00
Owen Schwartz 1c2508013e New translations en-us.json (Dutch)
[ci skip]
2026-06-06 12:41:08 -07:00
Owen Schwartz 7e76c27b19 New translations en-us.json (French)
[ci skip]
2026-06-06 12:41:06 -07:00
Owen Schwartz 210b00db05 New translations en-us.json (Korean)
[ci skip]
2026-06-06 12:41:04 -07:00
Owen Schwartz 9e71dd1c17 New translations en-us.json (Italian)
[ci skip]
2026-06-06 12:41:02 -07:00
Owen Schwartz cd8e16cab1 New translations en-us.json (German)
[ci skip]
2026-06-06 12:41:01 -07:00
Owen Schwartz e943ed33fc New translations en-us.json (Czech)
[ci skip]
2026-06-06 12:40:59 -07:00
Owen Schwartz f0f03c9da9 New translations en-us.json (Bulgarian)
[ci skip]
2026-06-06 12:40:57 -07:00
Owen Schwartz b6fae4299e New translations en-us.json (Spanish)
[ci skip]
2026-06-06 12:40:55 -07:00
Owen Schwartz 206a448752 New translations en-us.json (French)
[ci skip]
2026-06-05 14:57:47 -07:00
Owen Schwartz 29aae19cd5 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-05 14:57:45 -07:00
Owen Schwartz 6ea6d7ac0d New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-05 14:57:43 -07:00
Owen Schwartz a8bb5c2972 New translations en-us.json (Turkish)
[ci skip]
2026-06-05 14:57:42 -07:00
Owen Schwartz f1aa919b17 New translations en-us.json (Russian)
[ci skip]
2026-06-05 14:57:40 -07:00
Owen Schwartz 07196a2ae4 New translations en-us.json (Portuguese)
[ci skip]
2026-06-05 14:57:38 -07:00
Owen Schwartz 1cdfb3e765 New translations en-us.json (Polish)
[ci skip]
2026-06-05 14:57:36 -07:00
Owen Schwartz 751e295620 New translations en-us.json (Dutch)
[ci skip]
2026-06-05 14:57:34 -07:00
Owen Schwartz f9d2c77b6c New translations en-us.json (Korean)
[ci skip]
2026-06-05 14:57:33 -07:00
Owen Schwartz 78726e42ad New translations en-us.json (Italian)
[ci skip]
2026-06-05 14:57:31 -07:00
Owen Schwartz 2af8ed695e New translations en-us.json (German)
[ci skip]
2026-06-05 14:57:29 -07:00
Owen Schwartz bf9c68b8de New translations en-us.json (Czech)
[ci skip]
2026-06-05 14:57:27 -07:00
Owen Schwartz a39a71c0af New translations en-us.json (Bulgarian)
[ci skip]
2026-06-05 14:57:26 -07:00
Owen Schwartz e5dc402a7e New translations en-us.json (Spanish)
[ci skip]
2026-06-05 14:57:24 -07:00
Owen Schwartz ce99fa18b4 New translations en-us.json (French)
[ci skip]
2026-06-05 12:49:01 -07:00
Owen Schwartz 265a51d22d New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-05 12:48:59 -07:00
Owen Schwartz 0d06192e3e New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-05 12:48:57 -07:00
Owen Schwartz 875c0acab7 New translations en-us.json (Turkish)
[ci skip]
2026-06-05 12:48:55 -07:00
Owen Schwartz e9b214c3f3 New translations en-us.json (Russian)
[ci skip]
2026-06-05 12:48:53 -07:00
Owen Schwartz 372d6d685f New translations en-us.json (Portuguese)
[ci skip]
2026-06-05 12:48:51 -07:00
Owen Schwartz 0d09a63e81 New translations en-us.json (Polish)
[ci skip]
2026-06-05 12:48:50 -07:00
Owen Schwartz cb8605656c New translations en-us.json (Dutch)
[ci skip]
2026-06-05 12:48:48 -07:00
Owen Schwartz 774147e8d2 New translations en-us.json (Korean)
[ci skip]
2026-06-05 12:48:46 -07:00
Owen Schwartz 3b13557f72 New translations en-us.json (Italian)
[ci skip]
2026-06-05 12:48:44 -07:00
Owen Schwartz 906d15a2cf New translations en-us.json (German)
[ci skip]
2026-06-05 12:48:42 -07:00
Owen Schwartz 0a465ebbc9 New translations en-us.json (Czech)
[ci skip]
2026-06-05 12:48:41 -07:00
Owen Schwartz f99a823e11 New translations en-us.json (Bulgarian)
[ci skip]
2026-06-05 12:48:39 -07:00
Owen Schwartz 550bacf7ad New translations en-us.json (Spanish)
[ci skip]
2026-06-05 12:48:37 -07:00
Owen Schwartz f6746d7e13 New translations en-us.json (French)
[ci skip]
2026-06-05 11:51:33 -07:00
Owen Schwartz e8b8234274 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-05 11:51:31 -07:00
Owen Schwartz 52709c04dc New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-05 11:51:29 -07:00
Owen Schwartz 80d522bba6 New translations en-us.json (Turkish)
[ci skip]
2026-06-05 11:51:28 -07:00
Owen Schwartz 899ffc89f0 New translations en-us.json (Russian)
[ci skip]
2026-06-05 11:51:26 -07:00
Owen Schwartz 69dd2513eb New translations en-us.json (Portuguese)
[ci skip]
2026-06-05 11:51:24 -07:00
Owen Schwartz f691dae8f8 New translations en-us.json (Polish)
[ci skip]
2026-06-05 11:51:22 -07:00
Owen Schwartz 36421e4216 New translations en-us.json (Dutch)
[ci skip]
2026-06-05 11:51:20 -07:00
Owen Schwartz 7032feacbc New translations en-us.json (Korean)
[ci skip]
2026-06-05 11:51:18 -07:00
Owen Schwartz 56dc24440f New translations en-us.json (Italian)
[ci skip]
2026-06-05 11:51:16 -07:00
Owen Schwartz 24d94bebb5 New translations en-us.json (German)
[ci skip]
2026-06-05 11:51:14 -07:00
Owen Schwartz 901eea6ea1 New translations en-us.json (Czech)
[ci skip]
2026-06-05 11:51:12 -07:00
Owen Schwartz eac4b7cf67 New translations en-us.json (Bulgarian)
[ci skip]
2026-06-05 11:51:10 -07:00
Owen Schwartz c887b5cf32 New translations en-us.json (Spanish)
[ci skip]
2026-06-05 11:51:09 -07:00
Owen Schwartz 907012ee9b New translations en-us.json (French)
[ci skip]
2026-06-04 22:48:06 -07:00
Owen Schwartz c28e7cebf1 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-04 22:48:04 -07:00
Owen Schwartz 810abf6526 New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-04 22:48:02 -07:00
Owen Schwartz 7103d32902 New translations en-us.json (Turkish)
[ci skip]
2026-06-04 22:48:00 -07:00
Owen Schwartz 0014e55247 New translations en-us.json (Russian)
[ci skip]
2026-06-04 22:47:58 -07:00
Owen Schwartz 364d65ed00 New translations en-us.json (Portuguese)
[ci skip]
2026-06-04 22:47:57 -07:00
Owen Schwartz 2869227667 New translations en-us.json (Polish)
[ci skip]
2026-06-04 22:47:55 -07:00
Owen Schwartz 935be5fe14 New translations en-us.json (Dutch)
[ci skip]
2026-06-04 22:47:53 -07:00
Owen Schwartz babe85094b New translations en-us.json (Korean)
[ci skip]
2026-06-04 22:47:52 -07:00
Owen Schwartz 00c02a5092 New translations en-us.json (Italian)
[ci skip]
2026-06-04 22:47:50 -07:00
Owen Schwartz fe2dc2f260 New translations en-us.json (German)
[ci skip]
2026-06-04 22:47:48 -07:00
Owen Schwartz a008291eba New translations en-us.json (Czech)
[ci skip]
2026-06-04 22:47:46 -07:00
Owen Schwartz 87ab601e6d New translations en-us.json (Bulgarian)
[ci skip]
2026-06-04 22:47:44 -07:00
Owen Schwartz a25d64a18e New translations en-us.json (Spanish)
[ci skip]
2026-06-04 22:47:43 -07:00
Owen Schwartz 05afeb60cd New translations en-us.json (French)
[ci skip]
2026-06-04 21:52:17 -07:00
Owen Schwartz d89d595735 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-04 21:52:16 -07:00
Owen Schwartz ef3c6f2533 New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-04 21:52:14 -07:00
Owen Schwartz a8759b223f New translations en-us.json (Turkish)
[ci skip]
2026-06-04 21:52:12 -07:00
Owen Schwartz 4e8802ea10 New translations en-us.json (Russian)
[ci skip]
2026-06-04 21:52:10 -07:00
Owen Schwartz 3d0882a9bb New translations en-us.json (Portuguese)
[ci skip]
2026-06-04 21:52:08 -07:00
Owen Schwartz c23927fd65 New translations en-us.json (Polish)
[ci skip]
2026-06-04 21:52:07 -07:00
Owen Schwartz c3c2a7182a New translations en-us.json (Dutch)
[ci skip]
2026-06-04 21:52:05 -07:00
Owen Schwartz ac03fc9b6a New translations en-us.json (Korean)
[ci skip]
2026-06-04 21:52:03 -07:00
Owen Schwartz f9a26d0c3c New translations en-us.json (Italian)
[ci skip]
2026-06-04 21:52:02 -07:00
Owen Schwartz e631cafdf9 New translations en-us.json (German)
[ci skip]
2026-06-04 21:52:00 -07:00
Owen Schwartz 29a716b0cb New translations en-us.json (Czech)
[ci skip]
2026-06-04 21:51:58 -07:00
Owen Schwartz 9da1d05b9a New translations en-us.json (Bulgarian)
[ci skip]
2026-06-04 21:51:57 -07:00
Owen Schwartz 47e9ceed16 New translations en-us.json (Spanish)
[ci skip]
2026-06-04 21:51:55 -07:00
Owen Schwartz c29b80dafd New translations en-us.json (French)
[ci skip]
2026-06-04 19:38:46 -07:00
Owen Schwartz a741922672 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-04 19:38:44 -07:00
Owen Schwartz 93ab8c344b New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-04 19:38:42 -07:00
Owen Schwartz b39ef73874 New translations en-us.json (Turkish)
[ci skip]
2026-06-04 19:38:41 -07:00
Owen Schwartz 604dc7bb61 New translations en-us.json (Russian)
[ci skip]
2026-06-04 19:38:39 -07:00
Owen Schwartz 8cd0e85818 New translations en-us.json (Portuguese)
[ci skip]
2026-06-04 19:38:37 -07:00
Owen Schwartz e7026c40fd New translations en-us.json (Polish)
[ci skip]
2026-06-04 19:38:35 -07:00
Owen Schwartz 9335f1a7a6 New translations en-us.json (Dutch)
[ci skip]
2026-06-04 19:38:33 -07:00
Owen Schwartz 0827d666e2 New translations en-us.json (Korean)
[ci skip]
2026-06-04 19:38:32 -07:00
Owen Schwartz 84a7a0edf0 New translations en-us.json (Italian)
[ci skip]
2026-06-04 19:38:30 -07:00
Owen Schwartz 344650a97f New translations en-us.json (German)
[ci skip]
2026-06-04 19:38:28 -07:00
Owen Schwartz 5b5e45765e New translations en-us.json (Czech)
[ci skip]
2026-06-04 19:38:26 -07:00
Owen Schwartz 1b02367adb New translations en-us.json (Bulgarian)
[ci skip]
2026-06-04 19:38:25 -07:00
Owen Schwartz f44b3260e2 New translations en-us.json (Spanish)
[ci skip]
2026-06-04 19:38:23 -07:00
Owen Schwartz 96825687fa New translations en-us.json (French)
[ci skip]
2026-06-04 17:52:08 -07:00
Owen Schwartz 33ee7e11ad New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-04 17:52:07 -07:00
Owen Schwartz bc67bc69a2 New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-04 17:52:05 -07:00
Owen Schwartz 8028c04789 New translations en-us.json (Turkish)
[ci skip]
2026-06-04 17:52:03 -07:00
Owen Schwartz e531e02f2b New translations en-us.json (Russian)
[ci skip]
2026-06-04 17:52:01 -07:00
Owen Schwartz 7465f2b342 New translations en-us.json (Portuguese)
[ci skip]
2026-06-04 17:51:59 -07:00
Owen Schwartz 40f2909ca1 New translations en-us.json (Polish)
[ci skip]
2026-06-04 17:51:57 -07:00
Owen Schwartz 2bbbe9c880 New translations en-us.json (Dutch)
[ci skip]
2026-06-04 17:51:55 -07:00
Owen Schwartz 20117a87d5 New translations en-us.json (Korean)
[ci skip]
2026-06-04 17:51:54 -07:00
Owen Schwartz 28667618dd New translations en-us.json (Italian)
[ci skip]
2026-06-04 17:51:52 -07:00
Owen Schwartz 60163bf3ae New translations en-us.json (German)
[ci skip]
2026-06-04 17:51:50 -07:00
Owen Schwartz 374e899216 New translations en-us.json (Czech)
[ci skip]
2026-06-04 17:51:48 -07:00
Owen Schwartz cc3c9344cc New translations en-us.json (Bulgarian)
[ci skip]
2026-06-04 17:51:47 -07:00
Owen Schwartz a87c213927 New translations en-us.json (Spanish)
[ci skip]
2026-06-04 17:51:45 -07:00
Owen Schwartz df72b65ced New translations en-us.json (French)
[ci skip]
2026-06-04 16:46:42 -07:00
Owen Schwartz b00c3c8b47 New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-04 16:46:40 -07:00
Owen Schwartz d0211ca37d New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-04 16:46:38 -07:00
Owen Schwartz 210057ddb1 New translations en-us.json (Turkish)
[ci skip]
2026-06-04 16:46:36 -07:00
Owen Schwartz 34e32f14b8 New translations en-us.json (Russian)
[ci skip]
2026-06-04 16:46:35 -07:00
Owen Schwartz 0870576f4c New translations en-us.json (Portuguese)
[ci skip]
2026-06-04 16:46:33 -07:00
Owen Schwartz 2a50c1b4af New translations en-us.json (Polish)
[ci skip]
2026-06-04 16:46:31 -07:00
Owen Schwartz b18b574c5f New translations en-us.json (Dutch)
[ci skip]
2026-06-04 16:46:29 -07:00
Owen Schwartz ee4572ed64 New translations en-us.json (Korean)
[ci skip]
2026-06-04 16:46:27 -07:00
Owen Schwartz b0f9fee4b0 New translations en-us.json (Italian)
[ci skip]
2026-06-04 16:46:26 -07:00
Owen Schwartz 2c3a11718d New translations en-us.json (German)
[ci skip]
2026-06-04 16:46:24 -07:00
Owen Schwartz d7b98feb51 New translations en-us.json (Czech)
[ci skip]
2026-06-04 16:46:22 -07:00
Owen Schwartz 3736e27a4f New translations en-us.json (Bulgarian)
[ci skip]
2026-06-04 16:46:20 -07:00
Owen Schwartz edd320ce0b New translations en-us.json (Spanish)
[ci skip]
2026-06-04 16:46:18 -07:00
Owen Schwartz 91b02e839d New translations en-us.json (Norwegian Bokmal)
[ci skip]
2026-06-04 00:40:34 -07:00
Owen Schwartz 8f7274a8b4 New translations en-us.json (Chinese Simplified)
[ci skip]
2026-06-04 00:40:32 -07:00
Owen Schwartz d9b7b8cec4 New translations en-us.json (Turkish)
[ci skip]
2026-06-04 00:40:30 -07:00
Owen Schwartz 170624017d New translations en-us.json (Russian)
[ci skip]
2026-06-04 00:40:28 -07:00
Owen Schwartz 43d5c1d8df New translations en-us.json (Portuguese)
[ci skip]
2026-06-04 00:40:26 -07:00
Owen Schwartz f6a3951951 New translations en-us.json (Polish)
[ci skip]
2026-06-04 00:40:24 -07:00
Owen Schwartz 798497f437 New translations en-us.json (Dutch)
[ci skip]
2026-06-04 00:40:22 -07:00
Owen Schwartz c090a52d6a New translations en-us.json (Korean)
[ci skip]
2026-06-04 00:40:20 -07:00
Owen Schwartz 44fb0afced New translations en-us.json (Italian)
[ci skip]
2026-06-04 00:40:17 -07:00
Owen Schwartz 0dbe95019b New translations en-us.json (German)
[ci skip]
2026-06-04 00:40:15 -07:00
Owen Schwartz 67c899e3a6 New translations en-us.json (Czech)
[ci skip]
2026-06-04 00:40:13 -07:00
Owen Schwartz 827707471e New translations en-us.json (Bulgarian)
[ci skip]
2026-06-04 00:40:11 -07:00
Owen Schwartz ed221b09ac New translations en-us.json (Spanish)
[ci skip]
2026-06-04 00:40:09 -07:00
357 changed files with 17285 additions and 18944 deletions
-5
View File
@@ -1,5 +0,0 @@
---
alwaysApply: true
---
When adding submit buttons, don't change the text of the button during the loading state. Text should stay static and you should use the loading prop on the button.
-5
View File
@@ -1,5 +0,0 @@
---
alwaysApply: true
---
When creating UI for popup dialogs or modals, use the Credenza componennt. This component is mobile responsive and works on desktop and wraps the dialog component and sheet into one.
-7
View File
@@ -1,7 +0,0 @@
---
alwaysApply: true
---
When writing TypeScript:
Prefer to use types instead of interfaces.
@@ -1,5 +0,0 @@
---
alwaysApply: true
---
When creating forms, use React form for validation and use Zod schemas.
-1
View File
@@ -35,4 +35,3 @@ tsconfig.json
Dockerfile* Dockerfile*
drizzle.config.ts drizzle.config.ts
allowedDevOrigins.json allowedDevOrigins.json
scratch/
+3 -37
View File
@@ -4,26 +4,19 @@ import { eq } from "drizzle-orm";
type SetServerAdminArgs = { type SetServerAdminArgs = {
email: string; email: string;
remove: boolean;
}; };
export const setServerAdmin: CommandModule<{}, SetServerAdminArgs> = { export const setServerAdmin: CommandModule<{}, SetServerAdminArgs> = {
command: "set-server-admin", command: "set-server-admin",
describe: "Add or remove server admin by email address", describe: "Mark any user as a server admin by email address",
builder: (yargs) => { builder: (yargs) => {
return yargs return yargs.option("email", {
.option("email", {
type: "string", type: "string",
demandOption: true, demandOption: true,
describe: "User email address" describe: "User email address"
})
.option("remove", {
type: "boolean",
default: false,
describe: "Remove server admin status from the user"
}); });
}, },
handler: async (argv: SetServerAdminArgs) => { handler: async (argv: { email: string }) => {
try { try {
const email = argv.email.trim().toLowerCase(); const email = argv.email.trim().toLowerCase();
@@ -38,33 +31,6 @@ export const setServerAdmin: CommandModule<{}, SetServerAdminArgs> = {
process.exit(1); process.exit(1);
} }
if (argv.remove) {
if (!user.serverAdmin) {
console.log(`User '${email}' is not a server admin`);
process.exit(0);
}
const serverAdmins = await db
.select()
.from(users)
.where(eq(users.serverAdmin, true));
if (serverAdmins.length <= 1) {
console.error(
"Cannot remove server admin: at least one server admin must exist"
);
process.exit(1);
}
await db
.update(users)
.set({ serverAdmin: false })
.where(eq(users.userId, user.userId));
console.log(`Server admin status removed from user '${email}'`);
process.exit(0);
}
if (user.serverAdmin) { if (user.serverAdmin) {
console.log(`User '${email}' is already a server admin`); console.log(`User '${email}' is already a server admin`);
process.exit(0); process.exit(0);
+4 -2
View File
@@ -38,5 +38,7 @@ flags:
disable_user_create_org: false disable_user_create_org: false
allow_raw_resources: true allow_raw_resources: true
{{if .IsPostgreSQL}}postgres: {{if .IsPostgreSQL}}
connection_string: postgresql://pangolin:{{.IsPostgreSQLPass}}@postgres:5432/pangolin{{end}} postgres:
connection_string: postgresql://pangolin:{{.IsPostgreSQLPass}}@postgres:5432/pangolin
{{end}}
+33 -20
View File
@@ -7,17 +7,23 @@ services:
deploy: deploy:
resources: resources:
limits: limits:
memory: 2g memory: 1g
reservations: reservations:
memory: 512m memory: 256m
{{if or .IsPostgreSQL .IsRedis}}depends_on: {{if or .IsPostgreSQL .IsRedis}}
{{if .IsPostgreSQL}}postgres: depends_on:
condition: service_healthy{{end}} {{if .IsPostgreSQL}}
{{if .IsRedis}}redis: postgres:
condition: service_healthy{{end}} condition: service_healthy
{{end}}
{{if .IsRedis}}
redis:
condition: service_healthy
{{end}}
networks: networks:
- default - default
- backend{{end}} - backend
{{end}}
volumes: volumes:
- ./config:/app/config - ./config:/app/config
healthcheck: healthcheck:
@@ -25,8 +31,8 @@ services:
interval: "10s" interval: "10s"
timeout: "10s" timeout: "10s"
retries: 15 retries: 15
{{if .InstallGerbil}}
{{if .InstallGerbil}}gerbil: gerbil:
image: docker.io/fosrl/gerbil:{{.GerbilVersion}} image: docker.io/fosrl/gerbil:{{.GerbilVersion}}
container_name: gerbil container_name: gerbil
restart: unless-stopped restart: unless-stopped
@@ -47,16 +53,17 @@ services:
- 21820:21820/udp - 21820:21820/udp
- 443:443 - 443:443
- 443:443/udp # For http3 QUIC if desired - 443:443/udp # For http3 QUIC if desired
- 80:80{{end}} - 80:80
{{end}}
traefik: traefik:
image: docker.io/traefik:v3.6 image: docker.io/traefik:v3.6
container_name: traefik container_name: traefik
restart: unless-stopped restart: unless-stopped
{{if .InstallGerbil}}network_mode: service:gerbil # Ports appear on the gerbil service{{end}}{{if not .InstallGerbil}} {{if .InstallGerbil}} network_mode: service:gerbil # Ports appear on the gerbil service{{end}}{{if not .InstallGerbil}}
ports: ports:
- 443:443 - 443:443
- 80:80{{end}} - 80:80
{{end}}
depends_on: depends_on:
pangolin: pangolin:
condition: service_healthy condition: service_healthy
@@ -67,7 +74,8 @@ services:
- ./config/letsencrypt:/letsencrypt # Volume to store the Let's Encrypt certificates - ./config/letsencrypt:/letsencrypt # Volume to store the Let's Encrypt certificates
- ./config/traefik/logs:/var/log/traefik # Volume to store Traefik logs - ./config/traefik/logs:/var/log/traefik # Volume to store Traefik logs
{{if .IsPostgreSQL}}postgres: {{if .IsPostgreSQL}}
postgres:
image: postgres:18 image: postgres:18
container_name: postgres container_name: postgres
restart: unless-stopped restart: unless-stopped
@@ -83,9 +91,11 @@ services:
timeout: 5s timeout: 5s
retries: 5 retries: 5
networks: networks:
- backend{{end}} - backend
{{end}}
{{if .IsRedis}}redis: {{if .IsRedis}}
redis:
image: redis:8-trixie image: redis:8-trixie
container_name: redis container_name: redis
restart: unless-stopped restart: unless-stopped
@@ -103,14 +113,17 @@ services:
retries: 3 retries: 3
start_period: 10s start_period: 10s
networks: networks:
- backend{{end}} - backend
{{end}}
networks: networks:
default: default:
driver: bridge driver: bridge
name: pangolin_frontend name: pangolin_frontend
{{if .EnableIPv6}} enable_ipv6: true{{end}} {{if .EnableIPv6}} enable_ipv6: true{{end}}
{{if or .IsPostgreSQL .IsRedis}} backend: {{if or .IsPostgreSQL .IsRedis}}
backend:
driver: bridge driver: bridge
name: pangolin_backend name: pangolin_backend
internal: true{{end}} internal: true
{{end}}
+4 -2
View File
@@ -1,4 +1,6 @@
{{if .IsRedis}}redis: {{if .IsRedis}}
redis:
host: "redis" host: "redis"
port: 6379 port: 6379
password: "{{.IsRedisPass}}"{{end}} password: "{{.IsRedisPass}}"
{{end}}
+4 -7
View File
@@ -71,12 +71,9 @@ const (
Undefined SupportedContainer = "undefined" Undefined SupportedContainer = "undefined"
) )
var redisFlag *bool
func main() { func main() {
crowdsecFlag := flag.Bool("crowdsec", false, "Enable the CrowdSec installation prompt") crowdsecFlag := flag.Bool("crowdsec", false, "Enable the CrowdSec installation prompt")
redisFlag = flag.Bool("redis", false, "Install Redis as cacheing solution. Required for HA. Not required for the Enterprise version.")
flag.Parse() flag.Parse()
// print a banner about prerequisites - opening port 80, 443, 51820, and 21820 on the VPS and firewall and pointing your domain to the VPS IP with a records. Docs are at http://localhost:3000/Getting%20Started/dns-networking // print a banner about prerequisites - opening port 80, 443, 51820, and 21820 on the VPS and firewall and pointing your domain to the VPS IP with a records. Docs are at http://localhost:3000/Getting%20Started/dns-networking
@@ -494,13 +491,13 @@ func collectUserInput() Config {
config.IsEnterprise = readBoolNoDefault("Do you want to install the Enterprise version of Pangolin? The EE is free for personal use or for businesses making less than 100k USD annually.") config.IsEnterprise = readBoolNoDefault("Do you want to install the Enterprise version of Pangolin? The EE is free for personal use or for businesses making less than 100k USD annually.")
if config.IsEnterprise { if config.IsEnterprise {
if *redisFlag { config.IsRedis = readBool("Do you want to run the Redis containers locally? Required for HA.")
config.IsRedis = true if config.IsRedis {
config.IsRedisPass = readPassword("Enter a unique password for the Redis service.") config.IsRedisPass = readPassword("Enter a unique password for the Redis service.")
} }
} }
config.IsPostgreSQL = readBool("Do you want to use PostgreSQL (not recommended for most users)?", false) config.IsPostgreSQL = readBool("Do you want to run the PostgreSQL containers locally? Otherwise, default to the local SQLite database only.", false)
if config.IsPostgreSQL { if config.IsPostgreSQL {
config.IsPostgreSQLPass = readPassword("Enter a unique password for the PostgreSQL pangolin user.") config.IsPostgreSQLPass = readPassword("Enter a unique password for the PostgreSQL pangolin user.")
} }
@@ -547,7 +544,7 @@ func collectUserInput() Config {
fmt.Println("\n=== Advanced Configuration ===") fmt.Println("\n=== Advanced Configuration ===")
config.EnableIPv6 = readBool("Is your server IPv6 capable?", true) config.EnableIPv6 = readBool("Is your server IPv6 capable?", true)
config.EnableMaxMind = readBool("Do you want to download the MaxMind GeoLite2 Country and ASN databases for blocking functionality?", true) config.EnableMaxMind = readBool("Do you want to download the MaxMind GeoLite2 Country and ADN databases for blocking functionality?", true)
if config.DashboardDomain == "" { if config.DashboardDomain == "" {
fmt.Println("Error: Dashboard Domain name is required") fmt.Println("Error: Dashboard Domain name is required")
+186 -187
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Вижте частни ресурси", "sitesTableViewPrivateResources": "Вижте частни ресурси",
"siteInstallNewt": "Инсталирайте Newt", "siteInstallNewt": "Инсталирайте Newt",
"siteInstallNewtDescription": "Пуснете Newt на вашата система", "siteInstallNewtDescription": "Пуснете Newt на вашата система",
"siteInstallKubernetesDocsDescription": "За повече и актуална информация относно инсталацията на Kubernetes, вижте <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "За инструкции за инсталиране на Advantech модем, вижте <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "WireGuard конфигурация", "WgConfiguration": "WireGuard конфигурация",
"WgConfigurationDescription": "Използвайте следната конфигурация, за да се свържете с мрежата", "WgConfigurationDescription": "Използвайте следната конфигурация, за да се свържете с мрежата",
"operatingSystem": "Операционна система", "operatingSystem": "Операционна система",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Ще можете да виждате това само веднъж. Уверете се да го копирате на сигурно място.", "siteCredentialsSaveDescription": "Ще можете да виждате това само веднъж. Уверете се да го копирате на сигурно място.",
"siteInfo": "Информация за сайта", "siteInfo": "Информация за сайта",
"status": "Статус", "status": "Статус",
"shareTitle": "Управление на споделими връзки", "shareTitle": "Manage Shareable Links",
"shareDescription": "Създайте споделими връзки, за да предоставите временен или постоянен достъп до прокси ресурсите", "shareDescription": "Създайте споделими връзки, за да предоставите временен или постоянен достъп до прокси ресурсите",
"shareSearch": "Търсене на споделими връзки...", "shareSearch": "Search shareable links...",
"shareCreate": "Създаване на споделима връзка", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Неуспешно изтриване на връзката", "shareErrorDelete": "Неуспешно изтриване на връзката",
"shareErrorDeleteMessage": "Възникна грешка при изтриване на връзката", "shareErrorDeleteMessage": "Възникна грешка при изтриване на връзката",
"shareDeleted": "Връзката беше изтрита", "shareDeleted": "Връзката беше изтрита",
"shareDeletedDescription": "Връзката беше премахната", "shareDeletedDescription": "Връзката беше премахната",
"shareDelete": "Изтриване на споделима връзка", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Потвърдете изтриването на споделима връзка", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Сигурни ли сте, че искате да изтриете тази споделена връзка?", "shareQuestionRemove": "Сигурни ли сте, че искате да изтриете тази споделена връзка?",
"shareMessageRemove": "След изтриване връзката вече няма да работи и всеки, който я използва, ще загуби достъп до ресурса.", "shareMessageRemove": "След изтриване връзката вече няма да работи и всеки, който я използва, ще загуби достъп до ресурса.",
"shareTokenDescription": "Достъпният токен може да бъде предаван по два начина: като параметър или в хедърите на заявките. Те трябва да бъдат предавани от клиента при всяка заявка за удостоверен достъп.", "shareTokenDescription": "Достъпният токен може да бъде предаван по два начина: като параметър или в хедърите на заявките. Те трябва да бъдат предавани от клиента при всяка заявка за удостоверен достъп.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Всеки с тази връзка може да получи достъп до ресурса", "shareCreateDescription": "Всеки с тази връзка може да получи достъп до ресурса",
"shareTitleOptional": "Заглавие (по избор)", "shareTitleOptional": "Заглавие (по избор)",
"sharePathOptional": "Път (по избор)", "sharePathOptional": "Път (по избор)",
"sharePathDescription": "След удостоверяване, линкът ще препрати потребителите на този път.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Изтече", "expireIn": "Изтече",
"neverExpire": "Никога не изтича", "neverExpire": "Никога не изтича",
"shareExpireDescription": "Времето на изтичане е колко дълго връзката ще бъде използваема и ще предоставя достъп до ресурса. След това време, връзката няма да работи и потребителите, които са я използвали, ще загубят достъп до ресурса.", "shareExpireDescription": "Времето на изтичане е колко дълго връзката ще бъде използваема и ще предоставя достъп до ресурса. След това време, връзката няма да работи и потребителите, които са я използвали, ще загубят достъп до ресурса.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Моля, изберете ресурс", "shareErrorSelectResource": "Моля, изберете ресурс",
"proxyResourceTitle": "Управление на обществени ресурси", "proxyResourceTitle": "Управление на обществени ресурси",
"proxyResourceDescription": "Създайте и управлявайте ресурси, които са общодостъпни чрез уеб браузър.", "proxyResourceDescription": "Създайте и управлявайте ресурси, които са общодостъпни чрез уеб браузър.",
"publicResourcesBannerTitle": "Публичен достъп през Интернет", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Публичните ресурси са HTTPS проксита, достъпни за всеки в Интернет чрез уеб браузър. За разлика от частните ресурси, те не изискват клиентски софтуер и могат да включват издентити и контексто-осъзнати политики за достъп.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Управление на частни ресурси", "clientResourceTitle": "Управление на частни ресурси",
"clientResourceDescription": "Създайте и управлявайте ресурси, които са достъпни само чрез свързан клиент.", "clientResourceDescription": "Създайте и управлявайте ресурси, които са достъпни само чрез свързан клиент.",
"privateResourcesBannerTitle": "Достъп до частни ресурси с нулево доверие.", "privateResourcesBannerTitle": "Достъп до частни ресурси с нулево доверие.",
@@ -212,19 +212,18 @@
"resourcesSearch": "Търсене на ресурси...", "resourcesSearch": "Търсене на ресурси...",
"resourceAdd": "Добавете ресурс", "resourceAdd": "Добавете ресурс",
"resourceErrorDelte": "Грешка при изтриване на ресурс", "resourceErrorDelte": "Грешка при изтриване на ресурс",
"resourcePoliciesBannerTitle": "Повторно използване на Удостоверяване и Правила за Достъп", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Споделените ресурсни политики ви позволяват да дефинирате методи за удостоверяване и правила за достъп веднъж, след което ги прикачвате към множество публични ресурси. Когато актуализирате политика, всеки свързан ресурс автоматично унаследява промените.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Научете Повече", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Управление на публични ресурсни политики", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Ресурси",
"resourcePoliciesAttachedResources": "{count} ресурс(а)", "resourcePoliciesAttachedResources": "{count} ресурс(а)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# ресурс} other {# ресурси}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "няма ресурси", "resourcePoliciesAttachedResourcesEmpty": "няма ресурси",
"resourcePoliciesDescription": "Създайте и управлявайте политики за удостоверяване за контролиране на достъпа до вашите публични ресурси", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Търсене на политики...", "resourcePoliciesSearch": "Търсене на политики...",
"resourcePoliciesAdd": "Добавяне на политика", "resourcePoliciesAdd": "Добавяне на политика",
"resourcePoliciesDefaultBadgeText": "Стандартна политика", "resourcePoliciesDefaultBadgeText": "Стандартна политика",
"resourcePoliciesCreate": "Създаване на публична ресурсна политика", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Следвайте стъпките по-долу, за да създадете нова политика", "resourcePoliciesCreateDescription": "Следвайте стъпките по-долу, за да създадете нова политика",
"resourcePolicyName": "Име на политика", "resourcePolicyName": "Име на политика",
"resourcePolicyNameDescription": "Дайте на тази политика име, за да я идентифицирате в цялото ви ресурси", "resourcePolicyNameDescription": "Дайте на тази политика име, за да я идентифицирате в цялото ви ресурси",
@@ -281,7 +280,7 @@
"back": "Назад", "back": "Назад",
"cancel": "Отмяна", "cancel": "Отмяна",
"resourceConfig": "Конфигурационни фрагменти", "resourceConfig": "Конфигурационни фрагменти",
"resourceConfigDescription": "Копирайте и поставете тези фрагменти от конфигурация за настройка на TCP/UDP ресурса.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Добавете Входни точки", "resourceAddEntrypoints": "Traefik: Добавете Входни точки",
"resourceExposePorts": "Gerbil: Изложете портове в Docker Compose", "resourceExposePorts": "Gerbil: Изложете портове в Docker Compose",
"resourceLearnRaw": "Научете как да конфигурирате TCP/UDP ресурси", "resourceLearnRaw": "Научете как да конфигурирате TCP/UDP ресурси",
@@ -294,8 +293,8 @@
"labelDelete": "Изтриване на етикета", "labelDelete": "Изтриване на етикета",
"labelAdd": "Добавяне на етикет", "labelAdd": "Добавяне на етикет",
"labelCreateSuccessMessage": "Етикетът е създаден успешно", "labelCreateSuccessMessage": "Етикетът е създаден успешно",
"labelDuplicateError": "Дублиран етикет", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Етикет с това име вече съществува.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Етикетът е променен успешно", "labelEditSuccessMessage": "Етикетът е променен успешно",
"labelNameField": "Име на етикет", "labelNameField": "Име на етикет",
"labelColorField": "Цвят на етикет", "labelColorField": "Цвят на етикет",
@@ -320,7 +319,7 @@
"rules": "Правила", "rules": "Правила",
"resourceSettingDescription": "Конфигурирайте настройките на ресурса", "resourceSettingDescription": "Конфигурирайте настройките на ресурса",
"resourceSetting": "Настройки на {resourceName}", "resourceSetting": "Настройки на {resourceName}",
"resourcePolicySettingDescription": "Конфигурирайте настройките на тази публична ресурсна политика", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "Настройки за {policyName}", "resourcePolicySetting": "Настройки за {policyName}",
"alwaysAllow": "Заобикаляне на Ауторизацията", "alwaysAllow": "Заобикаляне на Ауторизацията",
"alwaysDeny": "Блокиране на Достъпа", "alwaysDeny": "Блокиране на Достъпа",
@@ -728,7 +727,7 @@
"targetSubmit": "Добавяне на цел", "targetSubmit": "Добавяне на цел",
"targetNoOne": "Този ресурс няма цели. Добавете цел, за да конфигурирате къде да се изпращат заявките към бекенда.", "targetNoOne": "Този ресурс няма цели. Добавете цел, за да конфигурирате къде да се изпращат заявките към бекенда.",
"targetNoOneDescription": "Добавянето на повече от една цел ще активира натоварването на баланса.", "targetNoOneDescription": "Добавянето на повече от една цел ще активира натоварването на баланса.",
"targetsSubmit": "Запази Настройки", "targetsSubmit": "Save Settings",
"addTarget": "Добавете цел", "addTarget": "Добавете цел",
"proxyMultiSiteRoundRobinNodeHelp": "Роунд Робин маршрутизирането няма да работи между сайтове, които не са свързани към един и същ възел, но автоматичното превключване ще работи.", "proxyMultiSiteRoundRobinNodeHelp": "Роунд Робин маршрутизирането няма да работи между сайтове, които не са свързани към един и същ възел, но автоматичното превключване ще работи.",
"targetErrorInvalidIp": "Невалиден IP адрес", "targetErrorInvalidIp": "Невалиден IP адрес",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Дубликат на правило", "rulesErrorDuplicate": "Дубликат на правило",
"rulesErrorDuplicateDescription": "Правило с тези настройки вече съществува", "rulesErrorDuplicateDescription": "Правило с тези настройки вече съществува",
"rulesErrorInvalidIpAddressRange": "Невалиден CIDR", "rulesErrorInvalidIpAddressRange": "Невалиден CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "Въведете валиден CIDR диапазон (напр., 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Невалиден път", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Въведете валиден път на URL или шаблон (напр., /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Невалиден IP адрес", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Въведете валиден IPv4 или IPv6 адрес.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Неуспешно актуализиране на правилата", "rulesErrorUpdate": "Неуспешно актуализиране на правилата",
"rulesErrorUpdateDescription": "Възникна грешка при актуализиране на правилата", "rulesErrorUpdateDescription": "Възникна грешка при актуализиране на правилата",
"rulesUpdated": "Активиране на правилата", "rulesUpdated": "Активиране на правилата",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Въведете адрес във формат CIDR (напр. 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Въведете адрес във формат CIDR (напр. 103.21.244.0/22)",
"rulesMatchIpAddress": "Въведете IP адрес (напр. 103.21.244.12)", "rulesMatchIpAddress": "Въведете IP адрес (напр. 103.21.244.12)",
"rulesMatchUrl": "Въведете URL път или модел (напр. /api/v1/todos или /api/v1/*)", "rulesMatchUrl": "Въведете URL път или модел (напр. /api/v1/todos или /api/v1/*)",
"rulesErrorInvalidPriority": "Невалиден приоритет", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Въведете цяло число 1 или по-голямо.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Дублирания на приоритети", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Всяко правило трябва да има уникален номер на приоритет.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Невалидни правила", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Правило {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Изберете валиден тип съвпадение (път, IP, CIDR, държава, регион или ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Въведете стойност за това правило.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Невалидна държава", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Изберете валидна държава.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "Невалиден ASN", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Въведете валиден ASN (напр., AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Правилата са актуализирани", "ruleUpdated": "Правилата са актуализирани",
"ruleUpdatedDescription": "Правилата бяха успешно актуализирани", "ruleUpdatedDescription": "Правилата бяха успешно актуализирани",
"ruleErrorUpdate": "Операцията не бе успешна", "ruleErrorUpdate": "Операцията не бе успешна",
"ruleErrorUpdateDescription": "Възникна грешка по време на операцията за запис", "ruleErrorUpdateDescription": "Възникна грешка по време на операцията за запис",
"rulesPriority": "Приоритет", "rulesPriority": "Приоритет",
"rulesReorderDragHandle": "Плъзнете за преаранжиране на приоритети на правилата", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Действие", "rulesAction": "Действие",
"rulesMatchType": "Тип на съвпадение", "rulesMatchType": "Тип на съвпадение",
"value": "Стойност", "value": "Стойност",
@@ -810,7 +809,7 @@
"rulesResource": "Конфигурация на правилата за ресурси", "rulesResource": "Конфигурация на правилата за ресурси",
"rulesResourceDescription": "Конфигурирайте правила за контролиране на достъпа до ресурса", "rulesResourceDescription": "Конфигурирайте правила за контролиране на достъпа до ресурса",
"ruleSubmit": "Добави правило", "ruleSubmit": "Добави правило",
"rulesNoOne": "Все още няма правила.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Правилата се оценяват по приоритет в нарастващ ред.", "rulesOrder": "Правилата се оценяват по приоритет в нарастващ ред.",
"rulesSubmit": "Запазване на правилата", "rulesSubmit": "Запазване на правилата",
"policyErrorCreate": "Грешка при създаване на политика", "policyErrorCreate": "Грешка при създаване на политика",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Възникна неочаквана грешка", "policyErrorUpdateMessageDescription": "Възникна неочаквана грешка",
"policyCreatedSuccess": "Политиката за ресурс е създадена успешно", "policyCreatedSuccess": "Политиката за ресурс е създадена успешно",
"policyUpdatedSuccess": "Политиката за ресурс е актуализирана успешно", "policyUpdatedSuccess": "Политиката за ресурс е актуализирана успешно",
"authMethodsSave": "Запази Настройки", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Удостоверяване", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Контролирайте кои методи за удостоверяване са необходими за достъп до този ресурс", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Множество активни методи за удостоверяване", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Посетителите могат да се удостоверяват чрез който и да е от активните методи по-долу. Не е необходимо да преминават през всичките.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Активен", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Изключено", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "Платформено SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Изисква вход чрез удостоверител на вашата организация", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} потребители, {roles} роли", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "По подразбиране удостоверител", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Добавете удостоверител по подразбиране", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Други Методи", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Опционални методи, които посетителите могат да използват вместо или заедно с платформния SSO", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Парола", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Изисква споделена алфанумерична парола за достъп до ресурса", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Зададена парола", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "ПИН код", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Кратък цифров код, необходим за достъп до ресурса", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "Зададен 6-цифрен ПИН код", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "Списък с имейл адреси", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Позволете изброените имейл адреси с еднократни пароли", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} адреси са позволени", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Активирането на списъка с имейл адреси изпраща еднократна парола на имейла на посетителя при влизане.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Базово удостоверяване чрез заглавие", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Валидирайте собствено HTTP заглавие и стойност при всяка заявка", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Конфигурирано заглавие", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Име на заглавието", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Очаквана стойност", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Задайте парола", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Задайте ПИН код", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Задайте списък с имейли", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Задайте базово удостоверяване чрез заглавие", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Правила за достъп", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Когато е включено, правилата се оценяват в низходящ ред, докато едно не се оцени като вярно.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Правилата се оценяват от горе надолу. Първото съвпадащо правило определя резултата.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Правилата съпоставят заявки по път, IP адрес, местоположение или друг критерий. Всяко правило прилага действие: заобикаля удостоверяване, блокира достъп или преминава към удостоверяване. Ако няма съвпадение, трафикът продължава към удостоверяване.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Когато правилата са изключени, целият трафик преминава към удостоверяване.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Когато няма съвпадение, трафикът преминава към удостоверяване.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Възникна грешка при актуализиране на ресурса", "resourcesErrorUpdateDescription": "Възникна грешка при актуализиране на ресурса",
"access": "Достъп", "access": "Достъп",
"accessControl": "Контрол на достъпа", "accessControl": "Контрол на достъпа",
"shareLink": "{resource} Споделима връзка", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Изберете ресурс", "resourceSelect": "Изберете ресурс",
"shareLinks": "Споделими връзки", "shareLinks": "Shareable Links",
"share": "Споделени връзки", "share": "Споделени връзки",
"shareDescription2": "Създайте връзки за достъп до ресурси. Връзките предоставят временен или неограничен достъп до вашия ресурс. Можете да конфигурирате продължителността на изтичане на връзката, когато я създавате.", "shareDescription2": "Създайте връзки за достъп до ресурси. Връзките предоставят временен или неограничен достъп до вашия ресурс. Можете да конфигурирате продължителността на изтичане на връзката, когато я създавате.",
"shareEasyCreate": "Лесно за създаване и споделяне", "shareEasyCreate": "Лесно за създаване и споделяне",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Администраторите винаги могат да имат достъп до този ресурс.", "resourceRoleDescription": "Администраторите винаги могат да имат достъп до този ресурс.",
"resourcePolicySelectTitle": "Политика за достъп до ресурс", "resourcePolicySelectTitle": "Политика за достъп до ресурс",
"resourcePolicySelectDescription": "Изберете типа на политиката за ресурс за идентификация", "resourcePolicySelectDescription": "Изберете типа на политиката за ресурс за идентификация",
"resourcePolicyTypeLabel": "Тип политика", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Ресурсна политика", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Инлайн Политика за Ресурс", "resourcePolicyInline": "Инлайн Политика за Ресурс",
"resourcePolicyInlineDescription": "Политика за достъп, ограничена само до този ресурс", "resourcePolicyInlineDescription": "Политика за достъп, ограничена само до този ресурс",
"resourcePolicyShared": "Споделена Политика за Ресурс", "resourcePolicyShared": "Споделена Политика за Ресурс",
"resourcePolicySharedDescription": "Този ресурс използва споделена политика.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Споделена политика", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Този ресурс има своя собствена политика.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Този ресурс има свои собствени контроли за удостоверяване и правила за достъп.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Този ресурс наследява от <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Този ресурс използва споделена политика. Някои настройки на удостоверяване могат да се редактират на този ресурс, за да се добавят към политиката. За да промените основната политика, трябва да редактирате <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Този ресурс използва споделена политика. Някои правила за достъп могат да се редактират на този ресурс. За да промените основната политика, трябва да редактирате <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Контроли за достъп", "resourceUsersRoles": "Контроли за достъп",
"resourceUsersRolesDescription": "Конфигурирайте кои потребители и роли могат да посещават този ресурс", "resourceUsersRolesDescription": "Конфигурирайте кои потребители и роли могат да посещават този ресурс",
"resourceUsersRolesSubmit": "Запазване на управлението на достъп.", "resourceUsersRolesSubmit": "Запазване на управлението на достъп.",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Видимост", "resourceVisibilityTitle": "Видимост",
"resourceVisibilityTitleDescription": "Напълно активирайте или деактивирайте видимостта на ресурса", "resourceVisibilityTitleDescription": "Напълно активирайте или деактивирайте видимостта на ресурса",
"resourceGeneral": "Общи настройки", "resourceGeneral": "Общи настройки",
"resourceGeneralDescription": "Конфигурирайте име, адрес и политика за достъп за този ресурс.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Подробности за ресурса", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Задайте показвано име, идентификатор и публично достъпен домейн за този ресурс.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Задайте показвано име, идентификатор и публичен порт за този ресурс.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Публичен Адрес", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Конфигурирайте как потребителите достигат до този ресурс.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Удостоверяване и Достъп", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Изберете дали този ресурс използва собствена политика или наследява от споделена политика.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Активирайте ресурс", "resourceEnable": "Активирайте ресурс",
"resourceTransfer": "Прехвърлете ресурс", "resourceTransfer": "Прехвърлете ресурс",
"resourceTransferDescription": "Прехвърлете този ресурс към различен сайт", "resourceTransferDescription": "Прехвърлете този ресурс към различен сайт",
@@ -1294,14 +1293,14 @@
"addLabels": "Добавяне на етикети", "addLabels": "Добавяне на етикети",
"siteLabelsTab": "Етикети", "siteLabelsTab": "Етикети",
"siteLabelsDescription": "Управление на етикети, свързани с този сайт.", "siteLabelsDescription": "Управление на етикети, свързани с този сайт.",
"labelsNotFound": "Не са намерени етикети.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Започнете да пишете горе, за да създадете етикет.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Търсене на етикети", "labelSearch": "Търсене на етикети",
"labelSearchOrCreate": "Търсене или създаване на етикет", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# етикет} other {# етикети}}", "accessLabelFilterCount": "{count, plural, one {# етикет} other {# етикети}}",
"labelOverflowCount": "+{count, plural, one {# етикет} other {# етикети}}", "labelOverflowCount": "+{count, plural, one {# етикет} other {# етикети}}",
"accessLabelFilterClear": "Изчисти филтрите за етикети", "accessLabelFilterClear": "Изчисти филтрите за етикети",
"accessFilterClear": "Изчистване на филтри", "accessFilterClear": "Clear filters",
"selectColor": "Изберете цвят", "selectColor": "Изберете цвят",
"createNewLabel": "Създайте нов организационен етикет \"{label}\"", "createNewLabel": "Създайте нов организационен етикет \"{label}\"",
"inviteInvalidDescription": "Линкът към поканата е невалиден.", "inviteInvalidDescription": "Линкът към поканата е невалиден.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Ресурси", "sidebarResources": "Ресурси",
"sidebarProxyResources": "Публично", "sidebarProxyResources": "Публично",
"sidebarClientResources": "Частно", "sidebarClientResources": "Частно",
"sidebarPolicies": "Споделени политики", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Публични ресурси", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Контрол на достъпа", "sidebarAccessControl": "Контрол на достъпа",
"sidebarLogsAndAnalytics": "Дневници и анализи", "sidebarLogsAndAnalytics": "Дневници и анализи",
"sidebarTeam": "Екип", "sidebarTeam": "Екип",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Администратор", "sidebarAdmin": "Администратор",
"sidebarInvitations": "Покани", "sidebarInvitations": "Покани",
"sidebarRoles": "Роли", "sidebarRoles": "Роли",
"sidebarShareableLinks": "Споделими връзки", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "API ключове", "sidebarApiKeys": "API ключове",
"sidebarProvisioning": "Осигуряване", "sidebarProvisioning": "Осигуряване",
"sidebarSettings": "Настройки", "sidebarSettings": "Настройки",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Ресурс {id}", "standaloneHcFilterResourceIdFallback": "Ресурс {id}",
"blueprints": "Чертежи", "blueprints": "Чертежи",
"blueprintsLog": "Регистър на скицописи", "blueprintsLog": "Регистър на скицописи",
"blueprintsDescription": "Прегледайте съществуващите blueprint приложения и резултатите им или приложете нов blueprint", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Добави Чертеж", "blueprintAdd": "Добави Чертеж",
"blueprintGoBack": "Виж всички Чертежи", "blueprintGoBack": "Виж всички Чертежи",
"blueprintCreate": "Създай Чертеж", "blueprintCreate": "Създай Чертеж",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Активиране на Docker Чернова", "enableDockerSocket": "Активиране на Docker Чернова",
"enableDockerSocketDescription": "Активирайте изтегляне с етикети на Docker Socket за скицописи. Пътят на гнездото трябва да бъде предоставен на конектора на сайта. Прочетете как работи това в <docsLink>документацията</docsLink>.", "enableDockerSocketDescription": "Активирайте изтегляне с етикети на Docker Socket за скицописи. Пътят на гнездото трябва да бъде предоставен на конектора на сайта. Прочетете как работи това в <docsLink>документацията</docsLink>.",
"newtAutoUpdate": "Активиране на автоматично обновяване на сайта", "newtAutoUpdate": "Активиране на автоматично обновяване на сайта",
"newtAutoUpdateDescription": "Когато е активирана, свързочният възел на сайта автоматично ще изтегли последната версия и ще се рестартира сам. Това може да бъде преодоляно на ниво сайт.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Автоматично обновяване на сайта", "siteAutoUpdate": "Автоматично обновяване на сайта",
"siteAutoUpdateLabel": "Активиране на автоматично обновяване", "siteAutoUpdateLabel": "Активиране на автоматично обновяване",
"siteAutoUpdateDescription": "Когато е активирана, конекторът на този сайт автоматично ще изтегли последната версия и ще се рестартира сам.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "По подразбиране за организацията: {state}", "siteAutoUpdateOrgDefault": "По подразбиране за организацията: {state}",
"siteAutoUpdateOverriding": "Преодоляване на настройката на организацията", "siteAutoUpdateOverriding": "Преодоляване на настройката на организацията",
"siteAutoUpdateResetToOrg": "Възстановяване към организацията по подразбиране", "siteAutoUpdateResetToOrg": "Възстановяване към организацията по подразбиране",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Настройката на профила завърши успешно! Добре дошли в Pangolin!", "accountSetupSuccess": "Настройката на профила завърши успешно! Добре дошли в Pangolin!",
"documentation": "Документация", "documentation": "Документация",
"saveAllSettings": "Запазване на всички настройки", "saveAllSettings": "Запазване на всички настройки",
"saveResourceTargets": "Запази Настройки", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Запази Настройки", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Запази Настройки", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Настройките са обновени", "settingsUpdated": "Настройките са обновени",
"settingsUpdatedDescription": "Настройките са успешно актуализирани.", "settingsUpdatedDescription": "Настройките са успешно актуализирани.",
"settingsErrorUpdate": "Неуспешно обновяване на настройките", "settingsErrorUpdate": "Неуспешно обновяване на настройките",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Неизвестен", "healthCheckUnknown": "Неизвестен",
"healthCheck": "Проверка на здравето", "healthCheck": "Проверка на здравето",
"configureHealthCheck": "Конфигуриране на проверка на здравето", "configureHealthCheck": "Конфигуриране на проверка на здравето",
"configureHealthCheckDescription": "Настройте мониторинг за вашия ресурс, за да се уверите, че винаги е на разположение", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Разрешаване на проверки на здравето", "enableHealthChecks": "Разрешаване на проверки на здравето",
"healthCheckDisabledStateDescription": "Когато е деактивиран, сайтът не изпълнява проверки и състоянието се счита за неизвестно.", "healthCheckDisabledStateDescription": "Когато е деактивиран, сайтът не изпълнява проверки и състоянието се счита за неизвестно.",
"enableHealthChecksDescription": "Мониторинг на здравето на тази цел. Можете да наблюдавате различен краен пункт от целта, ако е необходимо.", "enableHealthChecksDescription": "Мониторинг на здравето на тази цел. Можете да наблюдавате различен краен пункт от целта, ако е необходимо.",
"healthScheme": "Метод", "healthScheme": "Метод",
"healthSelectScheme": "Избор на метод", "healthSelectScheme": "Избор на метод",
"healthCheckPortInvalid": "Портът трябва да бъде между 1 и 65535", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Път", "healthCheckPath": "Път",
"healthHostname": "IP / Хост", "healthHostname": "IP / Хост",
"healthPort": "Порт", "healthPort": "Порт",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Изискват одобрение на устройства", "requireDeviceApproval": "Изискват одобрение на устройства",
"requireDeviceApprovalDescription": "Потребители с тази роля трябва да имат нови устройства одобрени от администратор преди да могат да се свържат и да имат достъп до ресурси.", "requireDeviceApprovalDescription": "Потребители с тази роля трябва да имат нови устройства одобрени от администратор преди да могат да се свържат и да имат достъп до ресурси.",
"sshSettings": "Настройки за SSH", "sshSettings": "Настройки за SSH",
"sshAccess": "SSH Достъп", "sshAccess": "SSH Access",
"rdpSettings": "Настройки за RDP", "rdpSettings": "Настройки за RDP",
"vncSettings": "Настройки за VNC", "vncSettings": "Настройки за VNC",
"sshServer": "SSH сървър", "sshServer": "SSH сървър",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Уверете се, че вашата целева хост машина е правилно конфигурирана за изпълнение на демона за идентификация преди завършване на тази настройка, в противен случай осигуряването ще се провали.", "sshDaemonDisclaimer": "Уверете се, че вашата целева хост машина е правилно конфигурирана за изпълнение на демона за идентификация преди завършване на тази настройка, в противен случай осигуряването ще се провали.",
"sshDaemonPort": "Порт на демона", "sshDaemonPort": "Порт на демона",
"sshServerDestination": "Дестинация на сървъра", "sshServerDestination": "Дестинация на сървъра",
"sshServerDestinationDescription": "Конфигурирайте дестинацията на SSH сървъра", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Дестинация", "destination": "Дестинация",
"destinationRequired": "Дестинацията е необходима.", "destinationRequired": "Destination is required.",
"domainRequired": "Домейнът е необходим.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Портът е необходим.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Невалидна конфигурация на пътя.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Невалидна конфигурация на пренаписване на пътя.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Избиране на множество сайтове позволява устойчиво маршрутизиране и сокетно превключване за висока наличност.", "bgTargetMultiSiteDisclaimer": "Избиране на множество сайтове позволява устойчиво маршрутизиране и сокетно превключване за висока наличност.",
"roleAllowSsh": "Разреши SSH", "roleAllowSsh": "Разреши SSH",
"roleAllowSshAllow": "Разреши", "roleAllowSshAllow": "Разреши",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "Потребителят може да изпълнява само определени команди с sudo.", "sshSudoModeCommandsDescription": "Потребителят може да изпълнява само определени команди с sudo.",
"sshSudo": "Разреши sudo", "sshSudo": "Разреши sudo",
"sshSudoCommands": "Sudo команди", "sshSudoCommands": "Sudo команди",
"sshSudoCommandsDescription": "Списък с команди, които потребителят има право да изпълнява със sudo, разделени със запетаи, интервали или нови редове. Необходимо е да се използват абсолютни пътища.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Създай начална директория", "sshCreateHomeDir": "Създай начална директория",
"sshUnixGroups": "Unix групи", "sshUnixGroups": "Unix групи",
"sshUnixGroupsDescription": "Unix групи, за добавяне на потребителя на целевия хост, разделени със запетаи, интервали или нови редове.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Въведете стойности или пуснете .txt или .csv файл", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Импортиране от файл", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Импортиране на {fileName} в {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Пропускане на първи ред (заглавие)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Заместване на съществуващите", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Добавяне към съществуващите", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Режим на импортиране", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Преглед", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Няма артикули за импортиране} one {1 артикул за импортиране} other {# артикули за импортиране}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} съществуващи + {imported} импортирани = {total} общо", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Импортиране", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Неподдържан тип файл", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Само .txt и .csv файлове са поддържани.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Няма намерени елементи във файла", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Файлът не съдържа подлежащи на импортиране елементи.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Опити за повторно", "retryAttempts": "Опити за повторно",
"expectedResponseCodes": "Очаквани кодове за отговор", "expectedResponseCodes": "Очаквани кодове за отговор",
"expectedResponseCodesDescription": "HTTP статус код, указващ здравословно състояние. Ако бъде оставено празно, между 200-300 се счита за здравословно.", "expectedResponseCodesDescription": "HTTP статус код, указващ здравословно състояние. Ако бъде оставено празно, между 200-300 се счита за здравословно.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Активирайте прокси протокола", "enableProxyProtocol": "Активирайте прокси протокола",
"proxyProtocolInfo": "Запазете IP адресите на клиентите за TCP бекендове", "proxyProtocolInfo": "Запазете IP адресите на клиентите за TCP бекендове",
"proxyProtocolVersion": "Версия на прокси протокола", "proxyProtocolVersion": "Версия на прокси протокола",
"version1": "Версия 1 (Препоръчана)", "version1": "Version 1 (Recommended)",
"version2": "Версия 2", "version2": "Версия 2",
"version1Description": "Текстово-базирана и широко поддържана. Уверете се, че транспортът на сървърите е добавен към динамичната конфигурация.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Двоична и по-ефективна, но по-малко съвместима. Уверете се, че транспортът на сървърите е добавен към динамичната конфигурация.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Предупреждение", "warning": "Предупреждение",
"proxyProtocolWarning": "Вашето бекенд приложение трябва да бъде конфигурирано да приема прокси протоколни връзки. Ако вашият бекенд не поддържа прокси протокол, активирането му ще прекъсне всички връзки. Уверете се, че сте конфигурирали вашия бекенд да се доверява на заглавията на прокси протокола от Traefik.", "proxyProtocolWarning": "Вашето бекенд приложение трябва да бъде конфигурирано да приема прокси протоколни връзки. Ако вашият бекенд не поддържа прокси протокол, активирането му ще прекъсне всички връзки. Уверете се, че сте конфигурирали вашия бекенд да се доверява на заглавията на прокси протокола от Traefik.",
"restarting": "Рестартиране...", "restarting": "Рестартиране...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Въведете потвърждение.", "enterConfirmation": "Въведете потвърждение.",
"blueprintViewDetails": "Подробности.", "blueprintViewDetails": "Подробности.",
"defaultIdentityProvider": "По подразбиране доставчик на идентичност.", "defaultIdentityProvider": "По подразбиране доставчик на идентичност.",
"defaultIdentityProviderDescription": "Потребителят автоматично ще бъде пренасочен към този удостоверител за удостоверяване.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Мрежови настройки.", "editInternalResourceDialogNetworkSettings": "Мрежови настройки.",
"editInternalResourceDialogAccessPolicy": "Политика за достъп.", "editInternalResourceDialogAccessPolicy": "Политика за достъп.",
"editInternalResourceDialogAddRoles": "Добавяне на роли.", "editInternalResourceDialogAddRoles": "Добавяне на роли.",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Тип режим на поддръжка.", "maintenanceModeType": "Тип режим на поддръжка.",
"showMaintenancePage": "Показване на страницата за поддръжка на посетители.", "showMaintenancePage": "Показване на страницата за поддръжка на посетители.",
"enableMaintenanceMode": "Активиране на режим на поддръжка.", "enableMaintenanceMode": "Активиране на режим на поддръжка.",
"enableMaintenanceModeDescription": "При включване, посетителите ще виждат страница за поддръжка вместо вашия ресурс.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Автоматично.", "automatic": "Автоматично.",
"automaticModeDescription": "Показване на страницата за поддръжка само когато всички целеви подсистеми са неработоспособни или в лошо състояние. Вашият ресурс продължава да работи нормално, докато поне един целеви подсистемен елемент е в здравия диапазон.", "automaticModeDescription": "Показване на страницата за поддръжка само когато всички целеви подсистеми са неработоспособни или в лошо състояние. Вашият ресурс продължава да работи нормално, докато поне един целеви подсистемен елемент е в здравия диапазон.",
"forced": "Наложително.", "forced": "Наложително.",
@@ -3182,8 +3181,8 @@
"warning:": "Предупреждение:", "warning:": "Предупреждение:",
"forcedeModeWarning": "Целият трафик ще бъде пренасочен към страницата за поддръжка. Вашите подсистемни ресурси няма да получат никакви заявки.", "forcedeModeWarning": "Целият трафик ще бъде пренасочен към страницата за поддръжка. Вашите подсистемни ресурси няма да получат никакви заявки.",
"pageTitle": "Заглавие на страницата.", "pageTitle": "Заглавие на страницата.",
"maintenancePageContentSubsection": "Съдържание на страницата", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Персонализирайте съдържанието, показвано на страницата за поддръжка", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "Основното заглавие, показвано на страницата за поддръжка.", "pageTitleDescription": "Основното заглавие, показвано на страницата за поддръжка.",
"maintenancePageMessage": "Съобщение за поддръжка.", "maintenancePageMessage": "Съобщение за поддръжка.",
"maintenancePageMessagePlaceholder": "Ще се върнем скоро! Нашият сайт понастоящем е в процес на планирана поддръжка.", "maintenancePageMessagePlaceholder": "Ще се върнем скоро! Нашият сайт понастоящем е в процес на планирана поддръжка.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Сигурни ли сте, че искате да отвържете този доставчик на самоличност от тази организация?", "idpUnassociateQuestion": "Сигурни ли сте, че искате да отвържете този доставчик на самоличност от тази организация?",
"idpUnassociateDescription": "Всички потребители, свързани с този доставчик на самоличност, ще бъдат премахнати от тази организация, но доставчика на самоличност ще продължи да съществува за други свързани организации.", "idpUnassociateDescription": "Всички потребители, свързани с този доставчик на самоличност, ще бъдат премахнати от тази организация, но доставчика на самоличност ще продължи да съществува за други свързани организации.",
"idpUnassociateConfirm": "Потвърдете отвързване на доставчика на самоличност", "idpUnassociateConfirm": "Потвърдете отвързване на доставчика на самоличност",
"idpConfirmDeleteAndRemoveMeFromOrg": "ИЗТРИВАНЕ И ПРЕМАХВАНЕ МЕ ОТ ОРГ", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "ОДЕЛЯНЕ И ПРЕМАХВАНЕ МЕ ОТ ОРГ", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Това не може да бъде отменено за тази организация.", "idpUnassociateWarning": "Това не може да бъде отменено за тази организация.",
"idpUnassociatedDescription": "Доставчика на самоличност е успешно отвързан от тази организация", "idpUnassociatedDescription": "Доставчика на самоличност е успешно отвързан от тази организация",
"idpUnassociateMenu": "Отвързване", "idpUnassociateMenu": "Отвързване",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Свързване…", "sshConnecting": "Свързване…",
"sshInitializing": "Инициализиране…", "sshInitializing": "Инициализиране…",
"sshSignInTitle": "Вход в SSH", "sshSignInTitle": "Вход в SSH",
"sshSignInDescription": "Въведете вашите SSH данни за свързване", "sshSignInDescription": "Въведете данните за SSH",
"sshPasswordTab": "Парола", "sshPasswordTab": "Парола",
"sshPrivateKeyTab": "Частен ключ", "sshPrivateKeyTab": "Частен ключ",
"sshPrivateKeyField": "Частен ключ", "sshPrivateKeyField": "Частен ключ",
"sshPrivateKeyDisclaimer": "Частният ви ключ не се съхранява или видима за Панголиин. Като алтернатива, можете да използвате краткотрайни сертификати за безпроблемна автентикация с вашата съществуваща идентичност в Панголиин.", "sshPrivateKeyDisclaimer": "Частният ви ключ не се съхранява или видима за Панголиин. Като алтернатива, можете да използвате краткотрайни сертификати за безпроблемна автентикация с вашата съществуваща идентичност в Панголиин.",
"sshLearnMore": "Научете повече", "sshLearnMore": "Научете повече",
"sshPrivateKeyFile": "Файл с частен ключ", "sshPrivateKeyFile": "Файл с частен ключ",
"sshAuthenticate": "Свързване", "sshAuthenticate": "Идентичност",
"sshTerminate": "Прекратяване", "sshTerminate": "Прекратяване",
"sshPoweredBy": "Подпомогнато от", "sshPoweredBy": "Подпомогнато от",
"sshErrorNoTarget": "Няма посочена цел", "sshErrorNoTarget": "Няма посочена цел",
"sshErrorWebSocket": "Неуспешно създаване на WebSocket връзка", "sshErrorWebSocket": "Неуспешно създаване на WebSocket връзка",
"sshErrorAuthFailed": "Неуспешна идентификация", "sshErrorAuthFailed": "Неуспешна идентификация",
"sshErrorConnectionClosed": "Връзката е затворена преди завършване на идентификацията", "sshErrorConnectionClosed": "Връзката е затворена преди завършване на идентификацията",
"sitePangolinSshDescription": "Позволете SSH достъп до ресурси на този сайт. Това може да бъде променено по-късно.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Не е намерен ресурс за този домейн", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Няма цел", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Свързване", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Неуспешно подписване на SSH ключ за PAM push удостоверяване. Вписахте ли се като потребител?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Грешка: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Връзката е затворена (код {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----НАЧАЛО НА OPENSSH ЧАСТЕН КЛЮЧ-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Изисква се частен ключ", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Въведете вашата VNC парола за свързване", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Парола (по избор)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Не е налична цел за ресурса", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Неуспешно зареждане на noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Статус {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Поставяне на клепач", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Вписване в Отдалечен Работен Плот", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Въведете данните за вашата Windows, за да се свържете", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Зареждане на модул...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Неуспешно зареждане на RDP модул", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Не е готов", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "RDP модулът все още се инициализира", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Изтегляне на {count} файл/файлове от отдалечено...", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Изтеглянето е неуспешно: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Качено: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Няма налична цел за свързване", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Връзката неуспешна", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Напасване", "rdpFit": "Fit",
"rdpFull": "Пълен", "rdpFull": "Full",
"rdpReal": "Реален", "rdpReal": "Real",
"rdpMeta": "Мета", "rdpMeta": "Meta",
"rdpUploadFiles": "Качване на файловете", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Файлове готови за поставяне", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} файл(ове) копирани в отдалечения клипборд — натиснете Ctrl+V на отдалечения работен плот за поставяне.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Качването неуспешно", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Режим на unicode клавиатура", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Показване на лентата с инструменти", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Скриване на лентата с инструменти" "sessionToolbarHide": "Hide toolbar"
} }
+184 -185
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Zobrazit soukromé zdroje", "sitesTableViewPrivateResources": "Zobrazit soukromé zdroje",
"siteInstallNewt": "Nainstalovat Newt", "siteInstallNewt": "Nainstalovat Newt",
"siteInstallNewtDescription": "Spustit Newt na vašem systému", "siteInstallNewtDescription": "Spustit Newt na vašem systému",
"siteInstallKubernetesDocsDescription": "Pro více aktuálních informací o instalaci Kubernetes navštivte <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Pro pokyny k instalaci modemu Advantech navštivte <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "Konfigurace WireGuard", "WgConfiguration": "Konfigurace WireGuard",
"WgConfigurationDescription": "K připojení k síti použijte následující konfiguraci", "WgConfigurationDescription": "K připojení k síti použijte následující konfiguraci",
"operatingSystem": "Operační systém", "operatingSystem": "Operační systém",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Toto nastavení uvidíte pouze jednou. Ujistěte se, že jej zkopírujete na bezpečné místo.", "siteCredentialsSaveDescription": "Toto nastavení uvidíte pouze jednou. Ujistěte se, že jej zkopírujete na bezpečné místo.",
"siteInfo": "Údaje o lokalitě", "siteInfo": "Údaje o lokalitě",
"status": "Stav", "status": "Stav",
"shareTitle": "Spravovat sdílné odkazy", "shareTitle": "Manage Shareable Links",
"shareDescription": "Vytvořit sdílitelné odkazy pro udělení dočasného nebo trvalého přístupu ke zdrojům proxy", "shareDescription": "Vytvořit sdílitelné odkazy pro udělení dočasného nebo trvalého přístupu ke zdrojům proxy",
"shareSearch": "Hledat sdílné odkazy...", "shareSearch": "Search shareable links...",
"shareCreate": "Vytvořit sdílný odkaz", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Nepodařilo se odstranit odkaz", "shareErrorDelete": "Nepodařilo se odstranit odkaz",
"shareErrorDeleteMessage": "Došlo k chybě při odstraňování odkazu", "shareErrorDeleteMessage": "Došlo k chybě při odstraňování odkazu",
"shareDeleted": "Odkaz odstraněn", "shareDeleted": "Odkaz odstraněn",
"shareDeletedDescription": "Odkaz byl odstraněn", "shareDeletedDescription": "Odkaz byl odstraněn",
"shareDelete": "Odstranit sdílný odkaz", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Potvrdit odstranění sdílného odkazu", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Jste si jisti, že chcete smazat tento odkaz ke sdílení?", "shareQuestionRemove": "Jste si jisti, že chcete smazat tento odkaz ke sdílení?",
"shareMessageRemove": "Jakmile bude smazán, odkaz přestane fungovat a všichni, kdo jej používají, ztratí přístup k prostředku.", "shareMessageRemove": "Jakmile bude smazán, odkaz přestane fungovat a všichni, kdo jej používají, ztratí přístup k prostředku.",
"shareTokenDescription": "Přístupový token může být předán dvěma způsoby: jako parametr dotazu nebo v záhlaví požadavku. Tyto údaje musí být předány klientovi na každé žádosti o ověřený přístup.", "shareTokenDescription": "Přístupový token může být předán dvěma způsoby: jako parametr dotazu nebo v záhlaví požadavku. Tyto údaje musí být předány klientovi na každé žádosti o ověřený přístup.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Kdokoliv s tímto odkazem může přistupovat ke zdroji", "shareCreateDescription": "Kdokoliv s tímto odkazem může přistupovat ke zdroji",
"shareTitleOptional": "Název (volitelné)", "shareTitleOptional": "Název (volitelné)",
"sharePathOptional": "Cesta (volitelně)", "sharePathOptional": "Cesta (volitelně)",
"sharePathDescription": "Odkaz přesměruje uživatele na tuto cestu po autentikaci.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Platnost vyprší za", "expireIn": "Platnost vyprší za",
"neverExpire": "Nikdy nevyprší", "neverExpire": "Nikdy nevyprší",
"shareExpireDescription": "Doba platnosti určuje, jak dlouho bude odkaz použitelný a bude poskytovat přístup ke zdroji. Po této době odkaz již nebude fungovat a uživatelé kteří tento odkaz používali ztratí přístup ke zdroji.", "shareExpireDescription": "Doba platnosti určuje, jak dlouho bude odkaz použitelný a bude poskytovat přístup ke zdroji. Po této době odkaz již nebude fungovat a uživatelé kteří tento odkaz používali ztratí přístup ke zdroji.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Zvolte prosím zdroj", "shareErrorSelectResource": "Zvolte prosím zdroj",
"proxyResourceTitle": "Spravovat veřejné zdroje", "proxyResourceTitle": "Spravovat veřejné zdroje",
"proxyResourceDescription": "Vytváření a správa zdrojů, které jsou veřejně přístupné prostřednictvím webového prohlížeče", "proxyResourceDescription": "Vytváření a správa zdrojů, které jsou veřejně přístupné prostřednictvím webového prohlížeče",
"publicResourcesBannerTitle": "Webové Veřejné Přístupy", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Veřejné prostředky jsou HTTPS proxy přístupné každému na internetu prostřednictvím webového prohlížeče. Na rozdíl od soukromých prostředků nevyžadují software na straně klienta a mohou zahrnovat politiky přístupu orientované na identitu a kontext.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Spravovat soukromé zdroje", "clientResourceTitle": "Spravovat soukromé zdroje",
"clientResourceDescription": "Vytváření a správa zdrojů, které jsou přístupné pouze prostřednictvím připojeného klienta", "clientResourceDescription": "Vytváření a správa zdrojů, které jsou přístupné pouze prostřednictvím připojeného klienta",
"privateResourcesBannerTitle": "Zero-Trust soukromý přístup", "privateResourcesBannerTitle": "Zero-Trust soukromý přístup",
@@ -212,19 +212,18 @@
"resourcesSearch": "Prohledat zdroje...", "resourcesSearch": "Prohledat zdroje...",
"resourceAdd": "Přidat zdroj", "resourceAdd": "Přidat zdroj",
"resourceErrorDelte": "Chyba při odstraňování zdroje", "resourceErrorDelte": "Chyba při odstraňování zdroje",
"resourcePoliciesBannerTitle": "Opětovné použití pravidel pro autentifikaci a přístup", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Sdílené politiky zdrojů vám umožňují definovat metody autentifikace a přístupová pravidla jednou, poté je připojit k více veřejným zdrojům. Při aktualizaci politiky každý propojený zdroj automaticky dědí změnu.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Zjistit více", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Správa Veřejných Zásad Zdrojů", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Zdroje",
"resourcePoliciesAttachedResources": "{count} zdroj(e/ů)", "resourcePoliciesAttachedResources": "{count} zdroj(e/ů)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# zdroj} few {# zdroje} many {# zdrojů} other {# zdrojů}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "žádné zdroje", "resourcePoliciesAttachedResourcesEmpty": "žádné zdroje",
"resourcePoliciesDescription": "Vytvořte a spravujte zásady autentifikace pro řízení přístupu k vašim veřejným zdrojům", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Hledat zásady...", "resourcePoliciesSearch": "Hledat zásady...",
"resourcePoliciesAdd": "Přidat zásadu", "resourcePoliciesAdd": "Přidat zásadu",
"resourcePoliciesDefaultBadgeText": "Výchozí zásada", "resourcePoliciesDefaultBadgeText": "Výchozí zásada",
"resourcePoliciesCreate": "Vytvořit Veřejnou Zásadu Zdroje", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Postupujte podle následujících kroků k vytvoření nové zásady", "resourcePoliciesCreateDescription": "Postupujte podle následujících kroků k vytvoření nové zásady",
"resourcePolicyName": "Název zásady", "resourcePolicyName": "Název zásady",
"resourcePolicyNameDescription": "Pojmenujte tuto zásadu, aby byla rozpoznatelná napříč vašimi zdroji", "resourcePolicyNameDescription": "Pojmenujte tuto zásadu, aby byla rozpoznatelná napříč vašimi zdroji",
@@ -281,7 +280,7 @@
"back": "Zpět", "back": "Zpět",
"cancel": "Zrušit", "cancel": "Zrušit",
"resourceConfig": "Konfigurační snippety", "resourceConfig": "Konfigurační snippety",
"resourceConfigDescription": "Zkopírujte a vložte tyto konfigurační úryvky pro nastavení TCP/UDP zdroje.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Přidat vstupní body", "resourceAddEntrypoints": "Traefik: Přidat vstupní body",
"resourceExposePorts": "Gerbil: Expose Ports in Docker Compose", "resourceExposePorts": "Gerbil: Expose Ports in Docker Compose",
"resourceLearnRaw": "Naučte se konfigurovat zdroje TCP/UDP", "resourceLearnRaw": "Naučte se konfigurovat zdroje TCP/UDP",
@@ -294,8 +293,8 @@
"labelDelete": "Smazat štítek", "labelDelete": "Smazat štítek",
"labelAdd": "Přidat štítek", "labelAdd": "Přidat štítek",
"labelCreateSuccessMessage": "Štítek byl úspěšně vytvořen", "labelCreateSuccessMessage": "Štítek byl úspěšně vytvořen",
"labelDuplicateError": "Duplikátní štítek", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Štítek s tímto názvem již existuje.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Štítek byl úspěšně změněn", "labelEditSuccessMessage": "Štítek byl úspěšně změněn",
"labelNameField": "Název štítku", "labelNameField": "Název štítku",
"labelColorField": "Barva štítku", "labelColorField": "Barva štítku",
@@ -320,7 +319,7 @@
"rules": "Pravidla", "rules": "Pravidla",
"resourceSettingDescription": "Konfigurace nastavení na zdroji", "resourceSettingDescription": "Konfigurace nastavení na zdroji",
"resourceSetting": "Nastavení {resourceName}", "resourceSetting": "Nastavení {resourceName}",
"resourcePolicySettingDescription": "Konfigurujte nastavení této veřejné zásady zdrojů", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "Nastavení {policyName}", "resourcePolicySetting": "Nastavení {policyName}",
"alwaysAllow": "Obejít Auth", "alwaysAllow": "Obejít Auth",
"alwaysDeny": "Blokovat přístup", "alwaysDeny": "Blokovat přístup",
@@ -728,7 +727,7 @@
"targetSubmit": "Add Target", "targetSubmit": "Add Target",
"targetNoOne": "Tento zdroj nemá žádné cíle. Přidejte cíl pro konfiguraci kam poslat žádosti na backend.", "targetNoOne": "Tento zdroj nemá žádné cíle. Přidejte cíl pro konfiguraci kam poslat žádosti na backend.",
"targetNoOneDescription": "Přidáním více než jednoho cíle se umožní vyvážení zatížení.", "targetNoOneDescription": "Přidáním více než jednoho cíle se umožní vyvážení zatížení.",
"targetsSubmit": "Uložit Nastavení", "targetsSubmit": "Save Settings",
"addTarget": "Add Target", "addTarget": "Add Target",
"proxyMultiSiteRoundRobinNodeHelp": "Round robin routing nebude fungovat mezi lokalitami, které nejsou připojeny ke stejnému uzlu, ale failover bude fungovat.", "proxyMultiSiteRoundRobinNodeHelp": "Round robin routing nebude fungovat mezi lokalitami, které nejsou připojeny ke stejnému uzlu, ale failover bude fungovat.",
"targetErrorInvalidIp": "Neplatná IP adresa", "targetErrorInvalidIp": "Neplatná IP adresa",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Duplikovat pravidlo", "rulesErrorDuplicate": "Duplikovat pravidlo",
"rulesErrorDuplicateDescription": "Pravidlo s těmito nastaveními již existuje", "rulesErrorDuplicateDescription": "Pravidlo s těmito nastaveními již existuje",
"rulesErrorInvalidIpAddressRange": "Neplatný CIDR", "rulesErrorInvalidIpAddressRange": "Neplatný CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "Zadejte platný rozsah CIDR (např. 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Neplatná cesta", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Zadejte platnou URL cestu nebo vzor (např. /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Neplatná IP adresa", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Zadejte platnou IPv4 nebo IPv6 adresu.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Aktualizace pravidel se nezdařila", "rulesErrorUpdate": "Aktualizace pravidel se nezdařila",
"rulesErrorUpdateDescription": "Při aktualizaci pravidel došlo k chybě", "rulesErrorUpdateDescription": "Při aktualizaci pravidel došlo k chybě",
"rulesUpdated": "Povolit pravidla", "rulesUpdated": "Povolit pravidla",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Zadejte adresu ve formátu CIDR (např. 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Zadejte adresu ve formátu CIDR (např. 103.21.244.0/22)",
"rulesMatchIpAddress": "Zadejte IP adresu (např. 103.21.244.12)", "rulesMatchIpAddress": "Zadejte IP adresu (např. 103.21.244.12)",
"rulesMatchUrl": "Zadejte URL cestu nebo vzor (např. /api/v1/todos nebo /api/v1/*)", "rulesMatchUrl": "Zadejte URL cestu nebo vzor (např. /api/v1/todos nebo /api/v1/*)",
"rulesErrorInvalidPriority": "Neplatná priorita", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Zadejte celé číslo 1 nebo vyšší.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Duplicitní priority", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Každé pravidlo musí mít unikátní číslo priority.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Neplatná pravidla", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Pravidlo {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Vyberte platný typ shody (cesta, IP, CIDR, země, oblast nebo ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Zadejte hodnotu pro toto pravidlo.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Neplatná země", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Vyberte platnou zemi.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "Neplatný ASN", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Zadejte platný ASN (např. AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Pravidla byla aktualizována", "ruleUpdated": "Pravidla byla aktualizována",
"ruleUpdatedDescription": "Pravidla byla úspěšně aktualizována", "ruleUpdatedDescription": "Pravidla byla úspěšně aktualizována",
"ruleErrorUpdate": "Operace selhala", "ruleErrorUpdate": "Operace selhala",
"ruleErrorUpdateDescription": "Při ukládání došlo k chybě", "ruleErrorUpdateDescription": "Při ukládání došlo k chybě",
"rulesPriority": "Priorita", "rulesPriority": "Priorita",
"rulesReorderDragHandle": "Přetažením změňte prioritu pravidel", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Akce", "rulesAction": "Akce",
"rulesMatchType": "Typ shody", "rulesMatchType": "Typ shody",
"value": "Hodnota", "value": "Hodnota",
@@ -810,7 +809,7 @@
"rulesResource": "Konfigurace pravidel zdroje", "rulesResource": "Konfigurace pravidel zdroje",
"rulesResourceDescription": "Nastavit pravidla pro kontrolu přístupu ke zdroji", "rulesResourceDescription": "Nastavit pravidla pro kontrolu přístupu ke zdroji",
"ruleSubmit": "Přidat pravidlo", "ruleSubmit": "Přidat pravidlo",
"rulesNoOne": "Žádná pravidla zatím nejsou.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Pravidla jsou hodnocena podle priority vzestupně.", "rulesOrder": "Pravidla jsou hodnocena podle priority vzestupně.",
"rulesSubmit": "Uložit pravidla", "rulesSubmit": "Uložit pravidla",
"policyErrorCreate": "Chyba při vytváření zásady", "policyErrorCreate": "Chyba při vytváření zásady",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Došlo k neočekávané chybě", "policyErrorUpdateMessageDescription": "Došlo k neočekávané chybě",
"policyCreatedSuccess": "Zásada zdroje byla úspěšně vytvořena", "policyCreatedSuccess": "Zásada zdroje byla úspěšně vytvořena",
"policyUpdatedSuccess": "Zásada zdroje byla úspěšně aktualizována", "policyUpdatedSuccess": "Zásada zdroje byla úspěšně aktualizována",
"authMethodsSave": "Uložit nastavení", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Autentifikace", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Určete, které metody autentifikace jsou požadovány pro přístup k tomuto zdroji", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Více metod autentifikace je aktivních", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Návštěvníci mohou použít jakoukoli aktiv metodu uvedenou níže. Nemusí splnit všechny z nich.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Aktiv", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Vypnuto", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "Platformové SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Požadujte přihlášení prostřednictvím identifikačního poskytovatele vaší organizace", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} uživatelé, {roles} role", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Výchozí poskytovatel", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Přidat výchozího identifikačního poskytovatele", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Ostatní metody", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Volitelné metody, které návštěvníci mohou použít místo nebo vedle platformového SSO", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Heslo", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Vyžadovat sdílené alfanumerické heslo pro přístup ke zdroji", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Sada hesel", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "PIN Kód", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Krátký číselný kód vyžadován pro přístup ke zdroji", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "Nastaven 6místný PIN", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "Email Whitelist", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Povolit vybraným emailovým adresám s jednorázovými hesly", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "Povoleno {count} adres(y)", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Povolení seznamu povolených e-mailů odešle jednorázové heslo na e-mail návštěvníka při přihlášení.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Základní Ověření Záhlaví", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Ověřit vlastní HTTP hlavičku názvu a hodnoty při každém požadavku", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Nastaveno hlavička", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Název hlavičky", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Očekávaná hodnota", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Nastavit přístupový kód", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Nastavit PIN kód", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Nastavit e-mailový whitelist", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Nastavit základní autentizaci hlavičkou", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Pravidla Přístupu", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Když je povoleno, pravidla jsou hodnocena sestupně, dokud jedno není vyhodnoceno jako pravda.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Pravidla jsou vyhodnocována shora dolů. První odpovídající pravidlo určuje výsledek.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Pravidla odpovídají požadavkům podle cesty, IP adresy, lokace nebo jiného kritéria. Každé pravidlo aplikuje akci: obejít autentizaci, zablokovat přístup nebo předat k autentizaci. Pokud žádné neodpovídá, provoz pokračuje k autentizaci.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Když jsou pravidla zakázána, veškerý provoz přechází k autentizaci.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Když žádné pravidlo neodpovídá, provoz přechází k autentizaci.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Došlo k chybě při aktualizaci zdroje", "resourcesErrorUpdateDescription": "Došlo k chybě při aktualizaci zdroje",
"access": "Přístup", "access": "Přístup",
"accessControl": "Kontrola přístupu", "accessControl": "Kontrola přístupu",
"shareLink": "{resource} Sdílný odkaz", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Vyberte zdroj", "resourceSelect": "Vyberte zdroj",
"shareLinks": "Sdíletelné odkazy", "shareLinks": "Shareable Links",
"share": "Sdílené odkazy", "share": "Sdílené odkazy",
"shareDescription2": "Vytvořte sdílitelné odkazy na zdroje. Odkazy poskytují dočasný nebo neomezený přístup k vašemu zdroji. Můžete nakonfigurovat dobu vypršení platnosti odkazu při jeho vytvoření.", "shareDescription2": "Vytvořte sdílitelné odkazy na zdroje. Odkazy poskytují dočasný nebo neomezený přístup k vašemu zdroji. Můžete nakonfigurovat dobu vypršení platnosti odkazu při jeho vytvoření.",
"shareEasyCreate": "Snadné vytváření a sdílení", "shareEasyCreate": "Snadné vytváření a sdílení",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Administrátoři mají vždy přístup k tomuto zdroji.", "resourceRoleDescription": "Administrátoři mají vždy přístup k tomuto zdroji.",
"resourcePolicySelectTitle": "Zásada přístupu ke zdrojům", "resourcePolicySelectTitle": "Zásada přístupu ke zdrojům",
"resourcePolicySelectDescription": "Vyberte typ zásady zdroje ověřování", "resourcePolicySelectDescription": "Vyberte typ zásady zdroje ověřování",
"resourcePolicyTypeLabel": "Typ zásady zdroje", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Zásada zdroje", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Inline Zásada Zdroje", "resourcePolicyInline": "Inline Zásada Zdroje",
"resourcePolicyInlineDescription": "Zásada přístupu se zaměřením pouze na tento zdroj", "resourcePolicyInlineDescription": "Zásada přístupu se zaměřením pouze na tento zdroj",
"resourcePolicyShared": "Sdílená Zásada Zdroje", "resourcePolicyShared": "Sdílená Zásada Zdroje",
"resourcePolicySharedDescription": "Tento zdroj používá sdílenou zásadu.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Sdílená Zásada", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Tento zdroj má vlastní zásadu.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Tento zdroj má vlastní ovládání autentifikace a přístupových pravidel.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Tento zdroj dědí ze <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Tento zdroj používá sdílenou politiku. Některá nastavení autentizace lze upravit na tomto zdroji k doplnění politiky. Pro úpravu základní politiky musíte upravit <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Tento zdroj používá sdílenou politiku. Některá přístupová pravidla lze upravit na tomto zdroji. Chcete-li změnit základní politiku, musíte upravit <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Kontrola přístupu", "resourceUsersRoles": "Kontrola přístupu",
"resourceUsersRolesDescription": "Nastavení, kteří uživatelé a role mohou navštívit tento zdroj", "resourceUsersRolesDescription": "Nastavení, kteří uživatelé a role mohou navštívit tento zdroj",
"resourceUsersRolesSubmit": "Uložit přístupové řízení", "resourceUsersRolesSubmit": "Uložit přístupové řízení",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Viditelnost", "resourceVisibilityTitle": "Viditelnost",
"resourceVisibilityTitleDescription": "Zcela povolit nebo zakázat viditelnost zdrojů", "resourceVisibilityTitleDescription": "Zcela povolit nebo zakázat viditelnost zdrojů",
"resourceGeneral": "Obecná nastavení", "resourceGeneral": "Obecná nastavení",
"resourceGeneralDescription": "Nakonfigurujte název, adresu a přístupovou politiku pro tento zdroj.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Detaily zdroje", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Nastavte zobrazovaný název, identifikátor a veřejně dostupnou doménu pro tento zdroj.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Nastavte zobrazovaný název, identifikátor a veřejný port pro tento zdroj.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Veřejná Adresa", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Nakonfigurujte, jak uživatelé dosáhnou tento zdroj.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Autentizace & Přístup", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Vyberte, zda tento zdroj používá vlastní politiku, nebo dědí od sdílené politiky.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Povolit dokument", "resourceEnable": "Povolit dokument",
"resourceTransfer": "Přenos zdroje", "resourceTransfer": "Přenos zdroje",
"resourceTransferDescription": "Přenést tento zdroj na jiný web", "resourceTransferDescription": "Přenést tento zdroj na jiný web",
@@ -1294,14 +1293,14 @@
"addLabels": "Přidat štítky", "addLabels": "Přidat štítky",
"siteLabelsTab": "Štítky", "siteLabelsTab": "Štítky",
"siteLabelsDescription": "Spravujte štítky přiřazené k této lokalitě.", "siteLabelsDescription": "Spravujte štítky přiřazené k této lokalitě.",
"labelsNotFound": "Nebyly nalezeny žádné štítky.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Začněte psát výše k vytvoření štítku.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Hledat štítky", "labelSearch": "Hledat štítky",
"labelSearchOrCreate": "Hledání nebo vytvoření štítku", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# štítek} few {# štítky} other {# štítků}}", "accessLabelFilterCount": "{count, plural, one {# štítek} few {# štítky} other {# štítků}}",
"labelOverflowCount": "+{count, plural, one {# štítek} few {# štítky} other {# štítků}}", "labelOverflowCount": "+{count, plural, one {# štítek} few {# štítky} other {# štítků}}",
"accessLabelFilterClear": "Vymazat filtry štítků", "accessLabelFilterClear": "Vymazat filtry štítků",
"accessFilterClear": "Vymazat filtry", "accessFilterClear": "Clear filters",
"selectColor": "Vybrat barvu", "selectColor": "Vybrat barvu",
"createNewLabel": "Vytvořit nový štítek organizace \"{label}\"", "createNewLabel": "Vytvořit nový štítek organizace \"{label}\"",
"inviteInvalidDescription": "Odkaz pro pozvání je neplatný.", "inviteInvalidDescription": "Odkaz pro pozvání je neplatný.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Zdroje", "sidebarResources": "Zdroje",
"sidebarProxyResources": "Veřejnost", "sidebarProxyResources": "Veřejnost",
"sidebarClientResources": "Soukromé", "sidebarClientResources": "Soukromé",
"sidebarPolicies": "Sdílené Odkazy", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Veřejné Zdroje", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Kontrola přístupu", "sidebarAccessControl": "Kontrola přístupu",
"sidebarLogsAndAnalytics": "Logy & Analytika", "sidebarLogsAndAnalytics": "Logy & Analytika",
"sidebarTeam": "Tým", "sidebarTeam": "Tým",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Admin", "sidebarAdmin": "Admin",
"sidebarInvitations": "Pozvánky", "sidebarInvitations": "Pozvánky",
"sidebarRoles": "Role", "sidebarRoles": "Role",
"sidebarShareableLinks": "Sdílené Odkazy", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "API klíče", "sidebarApiKeys": "API klíče",
"sidebarProvisioning": "Zajištění", "sidebarProvisioning": "Zajištění",
"sidebarSettings": "Nastavení", "sidebarSettings": "Nastavení",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Zdroj {id}", "standaloneHcFilterResourceIdFallback": "Zdroj {id}",
"blueprints": "Plány", "blueprints": "Plány",
"blueprintsLog": "Protokol plánů", "blueprintsLog": "Protokol plánů",
"blueprintsDescription": "Zobrazit předchozí aplikace modrotisku a jejich výsledky nebo aplikovat nový modrotisk", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Přidat plán", "blueprintAdd": "Přidat plán",
"blueprintGoBack": "Zobrazit všechny plány", "blueprintGoBack": "Zobrazit všechny plány",
"blueprintCreate": "Vytvořit plán", "blueprintCreate": "Vytvořit plán",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Povolit Docker plán", "enableDockerSocket": "Povolit Docker plán",
"enableDockerSocketDescription": "Povolte seškrábání štítků pro Docker Socket pro štítky plánů. Před připojením na lokalitní konektor musí být uvedena cesta k soketu. Přečtěte si, jak to funguje <docsLink>v dokumentaci</docsLink>.", "enableDockerSocketDescription": "Povolte seškrábání štítků pro Docker Socket pro štítky plánů. Před připojením na lokalitní konektor musí být uvedena cesta k soketu. Přečtěte si, jak to funguje <docsLink>v dokumentaci</docsLink>.",
"newtAutoUpdate": "Povolit automatickou aktualizaci stránek", "newtAutoUpdate": "Povolit automatickou aktualizaci stránek",
"newtAutoUpdateDescription": "Když je povoleno, konektory stránek automaticky stáhnou nejnovější verzi a restartují se. To lze přepsat na základě jednotlivých míst.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Automatická aktualizace stránek", "siteAutoUpdate": "Automatická aktualizace stránek",
"siteAutoUpdateLabel": "Povolte automatickou aktualizaci", "siteAutoUpdateLabel": "Povolte automatickou aktualizaci",
"siteAutoUpdateDescription": "Když je povoleno, konektor této stránky automaticky stáhne nejnovější verzi a restartuje se sám.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Výchozí organizace: {state}", "siteAutoUpdateOrgDefault": "Výchozí organizace: {state}",
"siteAutoUpdateOverriding": "Přepsání nastavení organizace", "siteAutoUpdateOverriding": "Přepsání nastavení organizace",
"siteAutoUpdateResetToOrg": "Obnovit na výchozí organizaci", "siteAutoUpdateResetToOrg": "Obnovit na výchozí organizaci",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Nastavení účtu dokončeno! Vítejte v Pangolinu!", "accountSetupSuccess": "Nastavení účtu dokončeno! Vítejte v Pangolinu!",
"documentation": "Dokumentace", "documentation": "Dokumentace",
"saveAllSettings": "Uložit všechna nastavení", "saveAllSettings": "Uložit všechna nastavení",
"saveResourceTargets": "Uložit Nastavení", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Uložit Nastavení", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Uložit Nastavení", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Nastavení aktualizováno", "settingsUpdated": "Nastavení aktualizováno",
"settingsUpdatedDescription": "Nastavení úspěšně aktualizována", "settingsUpdatedDescription": "Nastavení úspěšně aktualizována",
"settingsErrorUpdate": "Aktualizace nastavení se nezdařila", "settingsErrorUpdate": "Aktualizace nastavení se nezdařila",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Neznámý", "healthCheckUnknown": "Neznámý",
"healthCheck": "Kontrola stavu", "healthCheck": "Kontrola stavu",
"configureHealthCheck": "Konfigurace kontroly stavu", "configureHealthCheck": "Konfigurace kontroly stavu",
"configureHealthCheckDescription": "Nastavte monitorování vašeho zdroje, abyste zajistili, že je vždy dostupný", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Povolit kontrolu stavu", "enableHealthChecks": "Povolit kontrolu stavu",
"healthCheckDisabledStateDescription": "Pokud je zakázáno, web nebude provádět zdravotní kontroly a stav bude považován za neznámý.", "healthCheckDisabledStateDescription": "Pokud je zakázáno, web nebude provádět zdravotní kontroly a stav bude považován za neznámý.",
"enableHealthChecksDescription": "Sledujte zdraví tohoto cíle. V případě potřeby můžete sledovat jiný cílový bod, než je cíl.", "enableHealthChecksDescription": "Sledujte zdraví tohoto cíle. V případě potřeby můžete sledovat jiný cílový bod, než je cíl.",
"healthScheme": "Způsob", "healthScheme": "Způsob",
"healthSelectScheme": "Vybrat metodu", "healthSelectScheme": "Vybrat metodu",
"healthCheckPortInvalid": "Port musí být mezi 1 a 65535", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Cesta", "healthCheckPath": "Cesta",
"healthHostname": "IP / Hostitel", "healthHostname": "IP / Hostitel",
"healthPort": "Přístav", "healthPort": "Přístav",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Vyžadovat schválení zařízení", "requireDeviceApproval": "Vyžadovat schválení zařízení",
"requireDeviceApprovalDescription": "Uživatelé s touto rolí potřebují nová zařízení schválená správcem, než se mohou připojit a přistupovat ke zdrojům.", "requireDeviceApprovalDescription": "Uživatelé s touto rolí potřebují nová zařízení schválená správcem, než se mohou připojit a přistupovat ke zdrojům.",
"sshSettings": "Nastavení SSH", "sshSettings": "Nastavení SSH",
"sshAccess": "SSH Přístup", "sshAccess": "SSH Access",
"rdpSettings": "Nastavení RDP", "rdpSettings": "Nastavení RDP",
"vncSettings": "Nastavení VNC", "vncSettings": "Nastavení VNC",
"sshServer": "SSH server", "sshServer": "SSH server",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Ujistěte se, že váš cílový hostitel je správně nakonfigurován k přímu spuštění ověřovacího démona, jinak zřizování selže.", "sshDaemonDisclaimer": "Ujistěte se, že váš cílový hostitel je správně nakonfigurován k přímu spuštění ověřovacího démona, jinak zřizování selže.",
"sshDaemonPort": "Port démona", "sshDaemonPort": "Port démona",
"sshServerDestination": "Cíl serveru", "sshServerDestination": "Cíl serveru",
"sshServerDestinationDescription": "Nakonfigurujte cíl serveru SSH", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Cíl", "destination": "Cíl",
"destinationRequired": "Destinace je vyžadována.", "destinationRequired": "Destination is required.",
"domainRequired": "Doména je vyžadována.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Port je vyžadován.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Neplatná konfigurace cesty.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Neplatná konfigurace přepsat cesty.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Výběr více lokalit umožňuje odolné směrování a převzetí služeb při selhání pro vysokou dostupnost.", "bgTargetMultiSiteDisclaimer": "Výběr více lokalit umožňuje odolné směrování a převzetí služeb při selhání pro vysokou dostupnost.",
"roleAllowSsh": "Povolit SSH", "roleAllowSsh": "Povolit SSH",
"roleAllowSshAllow": "Povolit", "roleAllowSshAllow": "Povolit",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "Uživatel může spustit pouze zadané příkazy s sudo.", "sshSudoModeCommandsDescription": "Uživatel může spustit pouze zadané příkazy s sudo.",
"sshSudo": "Povolit sudo", "sshSudo": "Povolit sudo",
"sshSudoCommands": "Sudo příkazy", "sshSudoCommands": "Sudo příkazy",
"sshSudoCommandsDescription": "Seznam příkazů, které je uživateli povoleno spouštět se sudo, oddělený čárkami, mezerami, nebo novými řádky. Je třeba používat absolutní cesty.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Vytvořit domovský adresář", "sshCreateHomeDir": "Vytvořit domovský adresář",
"sshUnixGroups": "Unixové skupiny", "sshUnixGroups": "Unixové skupiny",
"sshUnixGroupsDescription": "Unixové skupiny, do kterých má být uživatel přidán na cílovém hostu, oddělené čárkami, mezerami, nebo novými řádky.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Zadejte hodnoty nebo přetáhněte soubor .txt nebo .csv", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Importovat ze souboru", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Importuje se {fileName} do {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Přeskočit první řádek (záhlaví)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Nahradit existující", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Přidat k existujícímu", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Režim importu", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Náhled", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Žádné položky k importu} one {1 položka k importu} few {# položky k importu} many {# položek k importu} other {# položek k importu}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} existující + {imported} importované = {total} celkem", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Importovat", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Nepodporovaný typ souboru", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Podporovány jsou pouze soubory .txt a .csv.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "V souboru nebyly nalezeny žádné položky", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Soubor neobsahuje žádné položky k importu.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Opakovat pokusy", "retryAttempts": "Opakovat pokusy",
"expectedResponseCodes": "Očekávané kódy odezvy", "expectedResponseCodes": "Očekávané kódy odezvy",
"expectedResponseCodesDescription": "HTTP kód stavu, který označuje zdravý stav. Ponecháte-li prázdné, 200-300 je považováno za zdravé.", "expectedResponseCodesDescription": "HTTP kód stavu, který označuje zdravý stav. Ponecháte-li prázdné, 200-300 je považováno za zdravé.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Povolit Proxy protokol", "enableProxyProtocol": "Povolit Proxy protokol",
"proxyProtocolInfo": "Zachovat IP adresu klienta pro TCP zálohy", "proxyProtocolInfo": "Zachovat IP adresu klienta pro TCP zálohy",
"proxyProtocolVersion": "Verze proxy protokolu", "proxyProtocolVersion": "Verze proxy protokolu",
"version1": "Verze 1 (Doporučeno)", "version1": "Version 1 (Recommended)",
"version2": "Verze 2", "version2": "Verze 2",
"version1Description": "Textově založený a široce podporovaný. Ujistěte se, že je transport serveru přidán do dynamické konfigurace.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Binární a efektivnější, ale méně kompatibilní. Ujistěte se, že je transport serveru přidán do dynamické konfigurace.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Varování", "warning": "Varování",
"proxyProtocolWarning": "Aplikace backend musí být nakonfigurována, aby mohla přijímat připojení k Proxy protokolu. Pokud vaše backend nepodporuje Proxy protokol, povolením tohoto protokolu dojde k přerušení všech připojení, takže toto povolíte pouze pokud víte, co děláte. Ujistěte se, že nastavíte svou backend a důvěřujte hlavičkám Proxy protokolu z Traefik.", "proxyProtocolWarning": "Aplikace backend musí být nakonfigurována, aby mohla přijímat připojení k Proxy protokolu. Pokud vaše backend nepodporuje Proxy protokol, povolením tohoto protokolu dojde k přerušení všech připojení, takže toto povolíte pouze pokud víte, co děláte. Ujistěte se, že nastavíte svou backend a důvěřujte hlavičkám Proxy protokolu z Traefik.",
"restarting": "Restartování...", "restarting": "Restartování...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Zadejte potvrzení", "enterConfirmation": "Zadejte potvrzení",
"blueprintViewDetails": "Detaily", "blueprintViewDetails": "Detaily",
"defaultIdentityProvider": "Výchozí poskytovatel identity", "defaultIdentityProvider": "Výchozí poskytovatel identity",
"defaultIdentityProviderDescription": "Uživatel bude automaticky přesměrován na tohoto identifikačního poskytovatele pro autentifikaci.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Nastavení sítě", "editInternalResourceDialogNetworkSettings": "Nastavení sítě",
"editInternalResourceDialogAccessPolicy": "Přístupová politika", "editInternalResourceDialogAccessPolicy": "Přístupová politika",
"editInternalResourceDialogAddRoles": "Přidat role", "editInternalResourceDialogAddRoles": "Přidat role",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Typ režimu údržby", "maintenanceModeType": "Typ režimu údržby",
"showMaintenancePage": "Zobrazit stránku údržby návštěvníkům", "showMaintenancePage": "Zobrazit stránku údržby návštěvníkům",
"enableMaintenanceMode": "Povolit režim údržby", "enableMaintenanceMode": "Povolit režim údržby",
"enableMaintenanceModeDescription": "Když je povoleno, návštěvníci uvidí údržbu místo vašeho zdroje.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automatické", "automatic": "Automatické",
"automaticModeDescription": "Zobrazte stránku údržby pouze, když jsou všechny cílové servery uživatele nebo prostředku nefunkční nebo nezdravé. Vaše prostředky budou nadále fungovat normálně, pokud je alespoň jeden cíl v pořádku.", "automaticModeDescription": "Zobrazte stránku údržby pouze, když jsou všechny cílové servery uživatele nebo prostředku nefunkční nebo nezdravé. Vaše prostředky budou nadále fungovat normálně, pokud je alespoň jeden cíl v pořádku.",
"forced": "Nucené", "forced": "Nucené",
@@ -3182,8 +3181,8 @@
"warning:": "Varování:", "warning:": "Varování:",
"forcedeModeWarning": "Veškerý provoz bude směrován na stránku údržby. Vaše prostředky backendu neobdrží žádné žádosti.", "forcedeModeWarning": "Veškerý provoz bude směrován na stránku údržby. Vaše prostředky backendu neobdrží žádné žádosti.",
"pageTitle": "Název stránky", "pageTitle": "Název stránky",
"maintenancePageContentSubsection": "Obsah Stránky", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Přizpůsobte obsah zobrazovaný na stránce údržby", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "Hlavní titulek zobrazovaný na stránce údržby", "pageTitleDescription": "Hlavní titulek zobrazovaný na stránce údržby",
"maintenancePageMessage": "Zpráva údržby", "maintenancePageMessage": "Zpráva údržby",
"maintenancePageMessagePlaceholder": "Vrátíme se brzy! Naše stránka právě prochází plánovanou údrbou.", "maintenancePageMessagePlaceholder": "Vrátíme se brzy! Naše stránka právě prochází plánovanou údrbou.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Opravdu chcete odpojit tohoto poskytovatele identity od této organizace?", "idpUnassociateQuestion": "Opravdu chcete odpojit tohoto poskytovatele identity od této organizace?",
"idpUnassociateDescription": "Všichni uživatelé spojení s tímto poskytovatelem identity budou odstraněni z této organizace, ale poskytovatel identity zůstane nadále existovat pro ostatní přidružené organizace.", "idpUnassociateDescription": "Všichni uživatelé spojení s tímto poskytovatelem identity budou odstraněni z této organizace, ale poskytovatel identity zůstane nadále existovat pro ostatní přidružené organizace.",
"idpUnassociateConfirm": "Potvrdit odpojení poskytovatele identity", "idpUnassociateConfirm": "Potvrdit odpojení poskytovatele identity",
"idpConfirmDeleteAndRemoveMeFromOrg": "SMAZAT A ODSTRANIT MĚ Z ORGANIZACE", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "ODPOJIT A ODSTRANIT MĚ Z ORGANIZACE", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Toto nelze pro tuto organizaci vrátit.", "idpUnassociateWarning": "Toto nelze pro tuto organizaci vrátit.",
"idpUnassociatedDescription": "Poskytovatel identity byl úspěšně odpojen od této organizace", "idpUnassociatedDescription": "Poskytovatel identity byl úspěšně odpojen od této organizace",
"idpUnassociateMenu": "Odpojit", "idpUnassociateMenu": "Odpojit",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Připojení…", "sshConnecting": "Připojení…",
"sshInitializing": "Inicializace…", "sshInitializing": "Inicializace…",
"sshSignInTitle": "Přihlášení do SSH", "sshSignInTitle": "Přihlášení do SSH",
"sshSignInDescription": "Zadejte své údaje SSH pro připojení", "sshSignInDescription": "Zadejte své SSH přihlašovací údaje",
"sshPasswordTab": "Heslo", "sshPasswordTab": "Heslo",
"sshPrivateKeyTab": "Soukromý klíč", "sshPrivateKeyTab": "Soukromý klíč",
"sshPrivateKeyField": "Soukromý klíč", "sshPrivateKeyField": "Soukromý klíč",
"sshPrivateKeyDisclaimer": "Váš soukromý klíč není ukládán ani viditelný pro Pangolin. Alternativně můžete použít krátkodobé certifikáty pro bezproblémové ověřování pomocí vaší stávající identity Pangolin.", "sshPrivateKeyDisclaimer": "Váš soukromý klíč není ukládán ani viditelný pro Pangolin. Alternativně můžete použít krátkodobé certifikáty pro bezproblémové ověřování pomocí vaší stávající identity Pangolin.",
"sshLearnMore": "Přečtěte si více", "sshLearnMore": "Přečtěte si více",
"sshPrivateKeyFile": "Soubor soukromého klíče", "sshPrivateKeyFile": "Soubor soukromého klíče",
"sshAuthenticate": "Připojit", "sshAuthenticate": "Ověřit",
"sshTerminate": "Ukončit", "sshTerminate": "Ukončit",
"sshPoweredBy": "Vytváří", "sshPoweredBy": "Vytváří",
"sshErrorNoTarget": "Cíl nebyl určen", "sshErrorNoTarget": "Cíl nebyl určen",
"sshErrorWebSocket": "Chyba připojení WebSocketu", "sshErrorWebSocket": "Chyba připojení WebSocketu",
"sshErrorAuthFailed": "Ověření selhalo", "sshErrorAuthFailed": "Ověření selhalo",
"sshErrorConnectionClosed": "Připojení bylo uzavřeno před dokončením ověřování", "sshErrorConnectionClosed": "Připojení bylo uzavřeno před dokončením ověřování",
"sitePangolinSshDescription": "Povolte SSH přístup k zdrojům na tomto místě. Toto lze změnit později.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Pro tuto doménu nebyl nalezen žádný zdroj", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Žádný cíl", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Připojit", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Nepodařilo se podepsat klíč SSH pro ověřování pomocí PAM push. Přihlásili jste se jako uživatel?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Chyba: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Připojení bylo uzavřeno (kód {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----ZAČÁTEK SOUKROMÉHO KLÍČE OPENSSH-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Je vyžadován soukromý klíč", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Zadejte své heslo VNC pro připojení", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Heslo (nepovinné)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Není k dispozici žádný cíl zdroje", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Nepodařilo se načíst noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Stav {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Vložit schránku", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Přihlásit se k Vzdálené ploše", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Zadejte přihlašovací údaje pro Windows k připojení", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Načítá se modul...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Nepodařilo se načíst modul RDP", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Není připraveno", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "Modul RDP se stále inicializuje", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Stahuje se {count} soubor(y) z dálky...", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Stažení se nezdařilo: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Nahráno: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Žádný dostupný cíl připojení", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Připojení se nezdařilo", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Přizpůsobit", "rdpFit": "Fit",
"rdpFull": "Celé", "rdpFull": "Full",
"rdpReal": "Skutečný", "rdpReal": "Real",
"rdpMeta": "Meta", "rdpMeta": "Meta",
"rdpUploadFiles": "Nahrát soubory", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Soubory připravené ke vložení", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} soubor(y) zkopírován(y) do vzdálené schránky — stiskněte Ctrl+V na vzdálené ploše pro vložení.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Nahrání selhalo", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Režim Unicode klávesnice", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Zobrazit panel nástrojů", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Skrýt panel nástrojů" "sessionToolbarHide": "Hide toolbar"
} }
+183 -184
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Private Ressourcen anzeigen", "sitesTableViewPrivateResources": "Private Ressourcen anzeigen",
"siteInstallNewt": "Newt installieren", "siteInstallNewt": "Newt installieren",
"siteInstallNewtDescription": "Installiere Newt auf deinem System.", "siteInstallNewtDescription": "Installiere Newt auf deinem System.",
"siteInstallKubernetesDocsDescription": "Für aktuelle Installationsinformationen zu Kubernetes, siehe <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Für Installationsanweisungen für Advantech-Modems siehe <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "WireGuard Konfiguration", "WgConfiguration": "WireGuard Konfiguration",
"WgConfigurationDescription": "Verwenden Sie folgende Konfiguration, um sich mit dem Netzwerk zu verbinden", "WgConfigurationDescription": "Verwenden Sie folgende Konfiguration, um sich mit dem Netzwerk zu verbinden",
"operatingSystem": "Betriebssystem", "operatingSystem": "Betriebssystem",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Du kannst das nur einmal sehen. Stelle sicher, dass du es an einen sicheren Ort kopierst.", "siteCredentialsSaveDescription": "Du kannst das nur einmal sehen. Stelle sicher, dass du es an einen sicheren Ort kopierst.",
"siteInfo": "Standortinformationen", "siteInfo": "Standortinformationen",
"status": "Status", "status": "Status",
"shareTitle": "Freigabelinks verwalten", "shareTitle": "Manage Shareable Links",
"shareDescription": "Erstelle teilbare Links, um temporären oder permanenten Zugriff auf Proxy-Ressourcen zu gewähren", "shareDescription": "Erstelle teilbare Links, um temporären oder permanenten Zugriff auf Proxy-Ressourcen zu gewähren",
"shareSearch": "Freigabelinks suchen...", "shareSearch": "Search shareable links...",
"shareCreate": "Freigabelink erstellen", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Link konnte nicht gelöscht werden", "shareErrorDelete": "Link konnte nicht gelöscht werden",
"shareErrorDeleteMessage": "Fehler beim Löschen des Links", "shareErrorDeleteMessage": "Fehler beim Löschen des Links",
"shareDeleted": "Link gelöscht", "shareDeleted": "Link gelöscht",
"shareDeletedDescription": "Der Link wurde gelöscht", "shareDeletedDescription": "Der Link wurde gelöscht",
"shareDelete": "Freigabelink löschen", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Löschung des Freigabelinks bestätigen", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Sind Sie sicher, dass Sie diesen Freigabelink löschen möchten?", "shareQuestionRemove": "Sind Sie sicher, dass Sie diesen Freigabelink löschen möchten?",
"shareMessageRemove": "Nach dem Löschen funktioniert der Link nicht mehr, und jeder, der ihn nutzt, verliert den Zugriff auf die Ressource.", "shareMessageRemove": "Nach dem Löschen funktioniert der Link nicht mehr, und jeder, der ihn nutzt, verliert den Zugriff auf die Ressource.",
"shareTokenDescription": "Das Zugriffstoken kann auf zwei Arten übergeben werden: als Abfrageparameter oder in den Request-Headern. Diese müssen vom Client auf jeder Anfrage für authentifizierten Zugriff weitergegeben werden.", "shareTokenDescription": "Das Zugriffstoken kann auf zwei Arten übergeben werden: als Abfrageparameter oder in den Request-Headern. Diese müssen vom Client auf jeder Anfrage für authentifizierten Zugriff weitergegeben werden.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Jeder mit diesem Link kann auf die Ressource zugreifen", "shareCreateDescription": "Jeder mit diesem Link kann auf die Ressource zugreifen",
"shareTitleOptional": "Titel (optional)", "shareTitleOptional": "Titel (optional)",
"sharePathOptional": "Pfad (optional)", "sharePathOptional": "Pfad (optional)",
"sharePathDescription": "Der Link leitet Benutzer nach der Authentifizierung zu diesem Pfad weiter.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Läuft ab in", "expireIn": "Läuft ab in",
"neverExpire": "Läuft nie ab", "neverExpire": "Läuft nie ab",
"shareExpireDescription": "Ablaufzeit ist, wie lange der Link verwendet werden kann und bietet Zugriff auf die Ressource. Nach dieser Zeit wird der Link nicht mehr funktionieren und Benutzer, die diesen Link benutzt haben, verlieren den Zugriff auf die Ressource.", "shareExpireDescription": "Ablaufzeit ist, wie lange der Link verwendet werden kann und bietet Zugriff auf die Ressource. Nach dieser Zeit wird der Link nicht mehr funktionieren und Benutzer, die diesen Link benutzt haben, verlieren den Zugriff auf die Ressource.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Bitte wählen Sie eine Ressource", "shareErrorSelectResource": "Bitte wählen Sie eine Ressource",
"proxyResourceTitle": "Öffentliche Ressourcen verwalten", "proxyResourceTitle": "Öffentliche Ressourcen verwalten",
"proxyResourceDescription": "Erstelle und verwalte Ressourcen, die über einen Webbrowser öffentlich zugänglich sind", "proxyResourceDescription": "Erstelle und verwalte Ressourcen, die über einen Webbrowser öffentlich zugänglich sind",
"publicResourcesBannerTitle": "Web-basierter öffentlicher Zugang", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Öffentliche Ressourcen sind HTTPS-Proxys, die über einen Webbrowser für jeden im Internet zugänglich sind. Im Gegensatz zu privaten Ressourcen benötigen sie keine Client-seitige Software und können Identitäts- und kontextuelle Zugriffsrichtlinien enthalten.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Private Ressourcen verwalten", "clientResourceTitle": "Private Ressourcen verwalten",
"clientResourceDescription": "Erstelle und verwalte Ressourcen, die nur über einen verbundenen Client zugänglich sind", "clientResourceDescription": "Erstelle und verwalte Ressourcen, die nur über einen verbundenen Client zugänglich sind",
"privateResourcesBannerTitle": "Zero-Trust-Zugriff auf private Ressourcen", "privateResourcesBannerTitle": "Zero-Trust-Zugriff auf private Ressourcen",
@@ -212,19 +212,18 @@
"resourcesSearch": "Suche Ressourcen...", "resourcesSearch": "Suche Ressourcen...",
"resourceAdd": "Ressource hinzufügen", "resourceAdd": "Ressource hinzufügen",
"resourceErrorDelte": "Fehler beim Löschen der Ressource", "resourceErrorDelte": "Fehler beim Löschen der Ressource",
"resourcePoliciesBannerTitle": "Authentifizierungs- und Zugriffsregeln wiederverwenden", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Freigegebene Ressourcenrichtlinien ermöglichen es Ihnen, Authentifizierungsmethoden und Zugriffsregeln einmal zu definieren und sie dann an mehrere öffentliche Ressourcen zu binden. Wenn Sie eine Richtlinie aktualisieren, übernimmt jede verknüpfte Ressource die Änderung automatisch.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Mehr erfahren", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Öffentliche Ressourcen Richtlinien verwalten", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Ressourcen",
"resourcePoliciesAttachedResources": "{count} Ressource(n)", "resourcePoliciesAttachedResources": "{count} Ressource(n)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# Ressource} other {# Ressourcen}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "keine Ressourcen", "resourcePoliciesAttachedResourcesEmpty": "keine Ressourcen",
"resourcePoliciesDescription": "Erstellen und verwalten Sie Authentifizierungsrichtlinien, um den Zugriff auf Ihre öffentlichen Ressourcen zu steuern", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Richtlinien suchen...", "resourcePoliciesSearch": "Richtlinien suchen...",
"resourcePoliciesAdd": "Richtlinie hinzufügen", "resourcePoliciesAdd": "Richtlinie hinzufügen",
"resourcePoliciesDefaultBadgeText": "Standardrichtlinie", "resourcePoliciesDefaultBadgeText": "Standardrichtlinie",
"resourcePoliciesCreate": "Öffentliche Ressourcen Richtlinie erstellen", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Befolgen Sie die unten stehenden Schritte, um eine neue Richtlinie zu erstellen", "resourcePoliciesCreateDescription": "Befolgen Sie die unten stehenden Schritte, um eine neue Richtlinie zu erstellen",
"resourcePolicyName": "Richtlinienname", "resourcePolicyName": "Richtlinienname",
"resourcePolicyNameDescription": "Geben Sie dieser Richtlinie einen Namen, um sie für Ihre Ressourcen zu identifizieren", "resourcePolicyNameDescription": "Geben Sie dieser Richtlinie einen Namen, um sie für Ihre Ressourcen zu identifizieren",
@@ -281,7 +280,7 @@
"back": "Zurück", "back": "Zurück",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"resourceConfig": "Konfiguration Snippets", "resourceConfig": "Konfiguration Snippets",
"resourceConfigDescription": "Kopieren und fügen Sie diese Konfigurationsschnipsel ein, um die TCP/UDP-Ressource einzurichten.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Einstiegspunkte hinzufügen", "resourceAddEntrypoints": "Traefik: Einstiegspunkte hinzufügen",
"resourceExposePorts": "Gerbil: Ports im Docker Compose freigeben", "resourceExposePorts": "Gerbil: Ports im Docker Compose freigeben",
"resourceLearnRaw": "Lernen Sie, wie Sie TCP/UDP Ressourcen konfigurieren", "resourceLearnRaw": "Lernen Sie, wie Sie TCP/UDP Ressourcen konfigurieren",
@@ -294,8 +293,8 @@
"labelDelete": "Etikett löschen", "labelDelete": "Etikett löschen",
"labelAdd": "Etikett hinzufügen", "labelAdd": "Etikett hinzufügen",
"labelCreateSuccessMessage": "Etikett erfolgreich erstellt", "labelCreateSuccessMessage": "Etikett erfolgreich erstellt",
"labelDuplicateError": "Doppeltes Label", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Ein Label mit diesem Namen existiert bereits.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Etikett erfolgreich bearbeitet", "labelEditSuccessMessage": "Etikett erfolgreich bearbeitet",
"labelNameField": "Etikettenname", "labelNameField": "Etikettenname",
"labelColorField": "Etikettenfarbe", "labelColorField": "Etikettenfarbe",
@@ -320,7 +319,7 @@
"rules": "Regeln", "rules": "Regeln",
"resourceSettingDescription": "Einstellungen für die Ressource konfigurieren", "resourceSettingDescription": "Einstellungen für die Ressource konfigurieren",
"resourceSetting": "{resourceName} Einstellungen", "resourceSetting": "{resourceName} Einstellungen",
"resourcePolicySettingDescription": "Richten Sie die Einstellungen für diese öffentliche Ressourcenrichtlinie ein", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "{policyName} Einstellungen", "resourcePolicySetting": "{policyName} Einstellungen",
"alwaysAllow": "Authentifizierung umgehen", "alwaysAllow": "Authentifizierung umgehen",
"alwaysDeny": "Zugriff blockieren", "alwaysDeny": "Zugriff blockieren",
@@ -728,7 +727,7 @@
"targetSubmit": "Ziel hinzufügen", "targetSubmit": "Ziel hinzufügen",
"targetNoOne": "Diese Ressource hat keine Ziele. Fügen Sie ein Ziel hinzu, um zu konfigurieren, wo Anfragen an das Backend gesendet werden sollen.", "targetNoOne": "Diese Ressource hat keine Ziele. Fügen Sie ein Ziel hinzu, um zu konfigurieren, wo Anfragen an das Backend gesendet werden sollen.",
"targetNoOneDescription": "Das Hinzufügen von mehr als einem Ziel aktiviert den Lastausgleich.", "targetNoOneDescription": "Das Hinzufügen von mehr als einem Ziel aktiviert den Lastausgleich.",
"targetsSubmit": "Einstellungen speichern", "targetsSubmit": "Save Settings",
"addTarget": "Ziel hinzufügen", "addTarget": "Ziel hinzufügen",
"proxyMultiSiteRoundRobinNodeHelp": "Round-Robin-Routing funktioniert nicht zwischen Standorten, die nicht mit demselben Knoten verbunden sind, aber Failover funktioniert.", "proxyMultiSiteRoundRobinNodeHelp": "Round-Robin-Routing funktioniert nicht zwischen Standorten, die nicht mit demselben Knoten verbunden sind, aber Failover funktioniert.",
"targetErrorInvalidIp": "Ungültige IP-Adresse", "targetErrorInvalidIp": "Ungültige IP-Adresse",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Doppelte Regel", "rulesErrorDuplicate": "Doppelte Regel",
"rulesErrorDuplicateDescription": "Eine Regel mit diesen Einstellungen existiert bereits", "rulesErrorDuplicateDescription": "Eine Regel mit diesen Einstellungen existiert bereits",
"rulesErrorInvalidIpAddressRange": "Ungültiger CIDR", "rulesErrorInvalidIpAddressRange": "Ungültiger CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "Geben Sie einen gültigen CIDR-Bereich ein (z.B., 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Ungültiger Pfad", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Geben Sie einen gültigen URL-Pfad oder ein gültiges Muster ein (z.B., /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Ungültige IP-Adresse", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Geben Sie eine gültige IPv4 oder IPv6 Adresse ein.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Fehler beim Aktualisieren der Regeln", "rulesErrorUpdate": "Fehler beim Aktualisieren der Regeln",
"rulesErrorUpdateDescription": "Beim Aktualisieren der Regeln ist ein Fehler aufgetreten", "rulesErrorUpdateDescription": "Beim Aktualisieren der Regeln ist ein Fehler aufgetreten",
"rulesUpdated": "Regeln aktivieren", "rulesUpdated": "Regeln aktivieren",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Geben Sie eine Adresse im CIDR-Format ein (z.B. 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Geben Sie eine Adresse im CIDR-Format ein (z.B. 103.21.244.0/22)",
"rulesMatchIpAddress": "Geben Sie eine IP-Adresse ein (z.B. 103.21.244.12)", "rulesMatchIpAddress": "Geben Sie eine IP-Adresse ein (z.B. 103.21.244.12)",
"rulesMatchUrl": "Geben Sie einen URL-Pfad oder -Muster ein (z.B. /api/v1/todos oder /api/v1/*)", "rulesMatchUrl": "Geben Sie einen URL-Pfad oder -Muster ein (z.B. /api/v1/todos oder /api/v1/*)",
"rulesErrorInvalidPriority": "Ungültige Priorität", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Geben Sie eine ganze Zahl von 1 oder höher ein.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Doppelte Prioritäten", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Jede Regel muss eine eindeutige Prioritätsnummer haben.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Ungültige Regeln", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Regel {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Wählen Sie einen gültigen Vergleichstyp (Pfad, IP, CIDR, Land, Region oder ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Geben Sie einen Wert für diese Regel ein.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Ungültiges Land", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Wählen Sie ein gültiges Land aus.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "Ungültiges ASN", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Geben Sie ein gültiges ASN ein (z.B., AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Regeln aktualisiert", "ruleUpdated": "Regeln aktualisiert",
"ruleUpdatedDescription": "Regeln erfolgreich aktualisiert", "ruleUpdatedDescription": "Regeln erfolgreich aktualisiert",
"ruleErrorUpdate": "Operation fehlgeschlagen", "ruleErrorUpdate": "Operation fehlgeschlagen",
"ruleErrorUpdateDescription": "Während des Speichervorgangs ist ein Fehler aufgetreten", "ruleErrorUpdateDescription": "Während des Speichervorgangs ist ein Fehler aufgetreten",
"rulesPriority": "Priorität", "rulesPriority": "Priorität",
"rulesReorderDragHandle": "Ziehen, um die Regelpriorität neu zu ordnen", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Aktion", "rulesAction": "Aktion",
"rulesMatchType": "Übereinstimmungstyp", "rulesMatchType": "Übereinstimmungstyp",
"value": "Wert", "value": "Wert",
@@ -810,7 +809,7 @@
"rulesResource": "Ressourcen-Regelkonfiguration", "rulesResource": "Ressourcen-Regelkonfiguration",
"rulesResourceDescription": "Regeln konfigurieren, um den Zugriff auf die Ressource zu steuern", "rulesResourceDescription": "Regeln konfigurieren, um den Zugriff auf die Ressource zu steuern",
"ruleSubmit": "Regel hinzufügen", "ruleSubmit": "Regel hinzufügen",
"rulesNoOne": "Noch keine Regeln vorhanden.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Regeln werden nach aufsteigender Priorität ausgewertet.", "rulesOrder": "Regeln werden nach aufsteigender Priorität ausgewertet.",
"rulesSubmit": "Regeln speichern", "rulesSubmit": "Regeln speichern",
"policyErrorCreate": "Fehler beim Erstellen der Richtlinie", "policyErrorCreate": "Fehler beim Erstellen der Richtlinie",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Ein unerwarteter Fehler ist aufgetreten", "policyErrorUpdateMessageDescription": "Ein unerwarteter Fehler ist aufgetreten",
"policyCreatedSuccess": "Ressourcenrichtlinie erfolgreich erstellt", "policyCreatedSuccess": "Ressourcenrichtlinie erfolgreich erstellt",
"policyUpdatedSuccess": "Ressourcenrichtlinie erfolgreich aktualisiert", "policyUpdatedSuccess": "Ressourcenrichtlinie erfolgreich aktualisiert",
"authMethodsSave": "Einstellungen speichern", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Authentifizierung", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Kontrollieren Sie, welche Authentifizierungsmethoden erforderlich sind, um auf diese Ressource zuzugreifen", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Mehrere Authentifizierungsmethoden aktiv", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Besucher können sich mit einer der unten aktiven Methoden authentifizieren. Sie müssen nicht alle abschließen.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Aktiv", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Aus", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "Plattform SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Anmeldung über den Identitätsanbieter Ihrer Organisation erforderlich", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} Benutzer, {roles} Rollen", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Standardanbieter", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Standardidentitätsanbieter hinzufügen", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Andere Methoden", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Optionale Methoden, die Besucher anstelle von oder zusammen mit Plattform-SSO verwenden können", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Passwort", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Erfordere einen geteilten alphanumerischen Passcode für den Zugriff auf die Ressource", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Passcode festgelegt", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "PIN-Code", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Ein kurzer numerischer Code, der erforderlich ist, um auf die Ressource zuzugreifen", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "6-stelliger PIN festgelegt", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "E-Mail-Whitelist", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Erlaubte E-Mail-Adressen mit Einmalpasswörtern", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} Adressen erlaubt", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Durch Aktivieren der E-Mail-Whitelist wird beim Einloggen ein Einmalpasswort an die E-Mail des Besuchers gesendet.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Grundlegende Header-Authentifizierung", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Überprüfen Sie einen benutzerdefinierten HTTP-Headernamen und -wert bei jeder Anfrage", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Header konfiguriert", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Header-Name", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Erwarteter Wert", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Passcode setzen", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "PIN-Code festlegen", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "E-Mail-Whitelist festlegen", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Grundlegende Header-Authentifizierung festlegen", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Zugriffsregeln", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Bei Aktivierung werden die Regeln in absteigender Reihenfolge ausgewertet, bis eine als wahr ausgewertet wird.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Regeln werden von oben nach unten ausgewertet. Die erste übereinstimmende Regel bestimmt das Ergebnis.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Regeln vergleichen Anfragen nach Pfad, IP-Adresse, Standort oder anderen Kriterien. Jede Regel wendet eine Aktion an: Authentifizierung umgehen, Zugriff blockieren oder zur Authentifizierung weiterleiten. Wenn keine Regel zutrifft, wird der Verkehr zur Authentifizierung weitergeleitet.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Wenn Regeln deaktiviert sind, wird der gesamte Verkehr zur Authentifizierung weitergeleitet.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Wenn keine Regel übereinstimmt, wird der Verkehr zur Authentifizierung weitergeleitet.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Beim Aktualisieren der Ressource ist ein Fehler aufgetreten", "resourcesErrorUpdateDescription": "Beim Aktualisieren der Ressource ist ein Fehler aufgetreten",
"access": "Zugriff", "access": "Zugriff",
"accessControl": "Zugriffskontrolle", "accessControl": "Zugriffskontrolle",
"shareLink": "{resource} Freigabelink", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Ressource auswählen", "resourceSelect": "Ressource auswählen",
"shareLinks": "Teilbare Links", "shareLinks": "Shareable Links",
"share": "Teilbare Links", "share": "Teilbare Links",
"shareDescription2": "Erstellen Sie teilbare Links zu Ressourcen. Links bieten temporären oder unbegrenzten Zugriff auf Ihre Ressource. Sie können die Verfallsdauer des Links beim Erstellen eines Links festlegen.", "shareDescription2": "Erstellen Sie teilbare Links zu Ressourcen. Links bieten temporären oder unbegrenzten Zugriff auf Ihre Ressource. Sie können die Verfallsdauer des Links beim Erstellen eines Links festlegen.",
"shareEasyCreate": "Einfach zu erstellen und zu teilen", "shareEasyCreate": "Einfach zu erstellen und zu teilen",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Administratoren haben immer Zugriff auf diese Ressource.", "resourceRoleDescription": "Administratoren haben immer Zugriff auf diese Ressource.",
"resourcePolicySelectTitle": "Zugriffsrichtlinie für Ressourcen", "resourcePolicySelectTitle": "Zugriffsrichtlinie für Ressourcen",
"resourcePolicySelectDescription": "Wählen Sie den Ressourcentransfertyp für die Authentifizierung", "resourcePolicySelectDescription": "Wählen Sie den Ressourcentransfertyp für die Authentifizierung",
"resourcePolicyTypeLabel": "Richtlinientyp", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Ressourcenrichtlinie", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Inline-Ressourcenrichtlinie", "resourcePolicyInline": "Inline-Ressourcenrichtlinie",
"resourcePolicyInlineDescription": "Zugriffsrichtlinie nur für diese Ressource", "resourcePolicyInlineDescription": "Zugriffsrichtlinie nur für diese Ressource",
"resourcePolicyShared": "Geteilte Ressourcenrichtlinie", "resourcePolicyShared": "Geteilte Ressourcenrichtlinie",
"resourcePolicySharedDescription": "Diese Ressource verwendet eine gemeinsame Richtlinie.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Gemeinsame Richtlinie", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Diese Ressource hat ihre eigene Richtlinie.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Diese Ressource hat eigene Authentifizierungs- und Zugriffsregel-Kontrollen.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Diese Ressource erbt von <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Diese Ressource verwendet eine geteilte Richtlinie. Einige Authentifizierungseinstellungen können in dieser Ressource bearbeitet werden, um zur Richtlinie beizutragen. Um die zugrunde liegende Richtlinie zu ändern, müssen Sie zu <policyLink>{policyName}</policyLink> wechseln.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Diese Ressource verwendet eine gemeinsame Richtlinie. Einige Zugriffsregeln können in dieser Ressource bearbeitet werden. Um die zugrunde liegende Richtlinie zu ändern, müssen Sie <policyLink>{policyName}</policyLink> bearbeiten.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Zugriffskontrolle", "resourceUsersRoles": "Zugriffskontrolle",
"resourceUsersRolesDescription": "Konfigurieren Sie, welche Benutzer und Rollen diese Ressource besuchen können", "resourceUsersRolesDescription": "Konfigurieren Sie, welche Benutzer und Rollen diese Ressource besuchen können",
"resourceUsersRolesSubmit": "Zugriffskontrollen speichern", "resourceUsersRolesSubmit": "Zugriffskontrollen speichern",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Sichtbarkeit", "resourceVisibilityTitle": "Sichtbarkeit",
"resourceVisibilityTitleDescription": "Ressourcensichtbarkeit vollständig aktivieren oder deaktivieren", "resourceVisibilityTitleDescription": "Ressourcensichtbarkeit vollständig aktivieren oder deaktivieren",
"resourceGeneral": "Allgemeine Einstellungen", "resourceGeneral": "Allgemeine Einstellungen",
"resourceGeneralDescription": "Konfigurieren Sie Name, Adresse und Zugriffsrichtlinie für diese Ressource.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Ressourcendetails", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Legen Sie den Anzeigenamen, die Kennung und die öffentlich zugängliche Domain für diese Ressource fest.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Legen Sie den Anzeigenamen, die Kennung und den öffentlichen Port für diese Ressource fest.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Öffentliche Adresse", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Bestimmen Sie, wie Benutzer diese Ressource erreichen.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Authentifizierung und Zugriff", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Wählen Sie, ob diese Ressource ihre eigene Richtlinie verwendet oder von einer gemeinsamen Richtlinie erbt.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Ressource aktivieren", "resourceEnable": "Ressource aktivieren",
"resourceTransfer": "Ressource übertragen", "resourceTransfer": "Ressource übertragen",
"resourceTransferDescription": "Diese Ressource auf einen anderen Standort übertragen", "resourceTransferDescription": "Diese Ressource auf einen anderen Standort übertragen",
@@ -1294,14 +1293,14 @@
"addLabels": "Etiketten hinzufügen", "addLabels": "Etiketten hinzufügen",
"siteLabelsTab": "Etiketten", "siteLabelsTab": "Etiketten",
"siteLabelsDescription": "Verwalten Sie die mit diesem Standort verbundenen Etiketten.", "siteLabelsDescription": "Verwalten Sie die mit diesem Standort verbundenen Etiketten.",
"labelsNotFound": "Keine Kennzeichnungen gefunden.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Beginnen Sie oben zu tippen, um ein Label zu erstellen.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Etiketten suchen", "labelSearch": "Etiketten suchen",
"labelSearchOrCreate": "Suchen oder erstellen Sie ein Label", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# Etikett} other {# Etiketten}}", "accessLabelFilterCount": "{count, plural, one {# Etikett} other {# Etiketten}}",
"labelOverflowCount": "+{count, plural, one {# Etikett} other {# Etiketten}}", "labelOverflowCount": "+{count, plural, one {# Etikett} other {# Etiketten}}",
"accessLabelFilterClear": "Etikettenfilter löschen", "accessLabelFilterClear": "Etikettenfilter löschen",
"accessFilterClear": "Filter löschen", "accessFilterClear": "Clear filters",
"selectColor": "Farbe auswählen", "selectColor": "Farbe auswählen",
"createNewLabel": "Neues Org-Etikett \"{label}\" erstellen", "createNewLabel": "Neues Org-Etikett \"{label}\" erstellen",
"inviteInvalidDescription": "Der Einladungslink ist ungültig.", "inviteInvalidDescription": "Der Einladungslink ist ungültig.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Ressourcen", "sidebarResources": "Ressourcen",
"sidebarProxyResources": "Öffentlich", "sidebarProxyResources": "Öffentlich",
"sidebarClientResources": "Privat", "sidebarClientResources": "Privat",
"sidebarPolicies": "Gemeinsame Richtlinien", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Öffentliche Ressourcen", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Zugriffskontrolle", "sidebarAccessControl": "Zugriffskontrolle",
"sidebarLogsAndAnalytics": "Protokolle & Analysen", "sidebarLogsAndAnalytics": "Protokolle & Analysen",
"sidebarTeam": "Team", "sidebarTeam": "Team",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Admin", "sidebarAdmin": "Admin",
"sidebarInvitations": "Einladungen", "sidebarInvitations": "Einladungen",
"sidebarRoles": "Rollen", "sidebarRoles": "Rollen",
"sidebarShareableLinks": "Teilbare Links", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "API-Schlüssel", "sidebarApiKeys": "API-Schlüssel",
"sidebarProvisioning": "Bereitstellung", "sidebarProvisioning": "Bereitstellung",
"sidebarSettings": "Einstellungen", "sidebarSettings": "Einstellungen",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Ressource {id}", "standaloneHcFilterResourceIdFallback": "Ressource {id}",
"blueprints": "Blaupausen", "blueprints": "Blaupausen",
"blueprintsLog": "Blaupausen-Protokoll", "blueprintsLog": "Blaupausen-Protokoll",
"blueprintsDescription": "Betrachten Sie vergangene Blueprint-Anwendungen und deren Ergebnisse oder wenden Sie einen neuen Blueprint an", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Blueprint hinzufügen", "blueprintAdd": "Blueprint hinzufügen",
"blueprintGoBack": "Alle Blueprints ansehen", "blueprintGoBack": "Alle Blueprints ansehen",
"blueprintCreate": "Blueprint erstellen", "blueprintCreate": "Blueprint erstellen",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Docker Blueprint aktivieren", "enableDockerSocket": "Docker Blueprint aktivieren",
"enableDockerSocketDescription": "Aktiviere Docker-Socket-Label-Scraping für Blueprint-Etiketten. Der Socket-Pfad muss dem Site-Connector angegeben werden. Lesen Sie, wie dies in <docsLink>der Dokumentation</docsLink> funktioniert.", "enableDockerSocketDescription": "Aktiviere Docker-Socket-Label-Scraping für Blueprint-Etiketten. Der Socket-Pfad muss dem Site-Connector angegeben werden. Lesen Sie, wie dies in <docsLink>der Dokumentation</docsLink> funktioniert.",
"newtAutoUpdate": "Standort-Auto-Update aktivieren", "newtAutoUpdate": "Standort-Auto-Update aktivieren",
"newtAutoUpdateDescription": "Wenn aktiviert, werden die Seiten-Connectoren automatisch die neueste Version herunterladen und sich selbst neu starten. Dies kann für jede Seite überschrieben werden.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Standort-Auto-Update", "siteAutoUpdate": "Standort-Auto-Update",
"siteAutoUpdateLabel": "Autoupdate aktivieren", "siteAutoUpdateLabel": "Autoupdate aktivieren",
"siteAutoUpdateDescription": "Wenn aktiviert, wird der Seiten-Connector automatisch die neueste Version herunterladen und sich selbst neu starten.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Standard der Organisation: {state}", "siteAutoUpdateOrgDefault": "Standard der Organisation: {state}",
"siteAutoUpdateOverriding": "Organisations-Einstellung überschreiben", "siteAutoUpdateOverriding": "Organisations-Einstellung überschreiben",
"siteAutoUpdateResetToOrg": "Auf Standard der Organisation zurücksetzen", "siteAutoUpdateResetToOrg": "Auf Standard der Organisation zurücksetzen",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Kontoeinrichtung abgeschlossen! Willkommen bei Pangolin!", "accountSetupSuccess": "Kontoeinrichtung abgeschlossen! Willkommen bei Pangolin!",
"documentation": "Dokumentation", "documentation": "Dokumentation",
"saveAllSettings": "Alle Einstellungen speichern", "saveAllSettings": "Alle Einstellungen speichern",
"saveResourceTargets": "Einstellungen speichern", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Einstellungen speichern", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Einstellungen speichern", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Einstellungen aktualisiert", "settingsUpdated": "Einstellungen aktualisiert",
"settingsUpdatedDescription": "Einstellungen erfolgreich aktualisiert", "settingsUpdatedDescription": "Einstellungen erfolgreich aktualisiert",
"settingsErrorUpdate": "Einstellungen konnten nicht aktualisiert werden", "settingsErrorUpdate": "Einstellungen konnten nicht aktualisiert werden",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Unbekannt", "healthCheckUnknown": "Unbekannt",
"healthCheck": "Gesundheits-Check", "healthCheck": "Gesundheits-Check",
"configureHealthCheck": "Gesundheits-Check konfigurieren", "configureHealthCheck": "Gesundheits-Check konfigurieren",
"configureHealthCheckDescription": "Richten Sie die Überwachung für Ihre Resource ein, um sicherzustellen, dass sie immer verfügbar ist", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Gesundheits-Checks aktivieren", "enableHealthChecks": "Gesundheits-Checks aktivieren",
"healthCheckDisabledStateDescription": "Wenn deaktiviert, führt der Standort keine Gesundheitsprüfungen durch und der Zustand wird als unbekannt betrachtet.", "healthCheckDisabledStateDescription": "Wenn deaktiviert, führt der Standort keine Gesundheitsprüfungen durch und der Zustand wird als unbekannt betrachtet.",
"enableHealthChecksDescription": "Überwachen Sie die Gesundheit dieses Ziels. Bei Bedarf können Sie einen anderen Endpunkt als das Ziel überwachen.", "enableHealthChecksDescription": "Überwachen Sie die Gesundheit dieses Ziels. Bei Bedarf können Sie einen anderen Endpunkt als das Ziel überwachen.",
"healthScheme": "Methode", "healthScheme": "Methode",
"healthSelectScheme": "Methode auswählen", "healthSelectScheme": "Methode auswählen",
"healthCheckPortInvalid": "Der Port muss zwischen 1 und 65535 liegen", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Pfad", "healthCheckPath": "Pfad",
"healthHostname": "IP / Host", "healthHostname": "IP / Host",
"healthPort": "Port", "healthPort": "Port",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Gerätegenehmigungen erforderlich", "requireDeviceApproval": "Gerätegenehmigungen erforderlich",
"requireDeviceApprovalDescription": "Benutzer mit dieser Rolle benötigen neue Geräte, die von einem Administrator genehmigt wurden, bevor sie sich verbinden und auf Ressourcen zugreifen können.", "requireDeviceApprovalDescription": "Benutzer mit dieser Rolle benötigen neue Geräte, die von einem Administrator genehmigt wurden, bevor sie sich verbinden und auf Ressourcen zugreifen können.",
"sshSettings": "SSH-Einstellungen", "sshSettings": "SSH-Einstellungen",
"sshAccess": "SSH Zugriff", "sshAccess": "SSH Access",
"rdpSettings": "RDP-Einstellungen", "rdpSettings": "RDP-Einstellungen",
"vncSettings": "VNC-Einstellungen", "vncSettings": "VNC-Einstellungen",
"sshServer": "SSH-Server", "sshServer": "SSH-Server",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Stellen Sie sicher, dass Ihr Zielhost korrekt konfiguriert ist, um den Auth-Daemon auszuführen, bevor Sie dieses Setup abschließen, andernfalls wird die Bereitstellung fehlschlagen.", "sshDaemonDisclaimer": "Stellen Sie sicher, dass Ihr Zielhost korrekt konfiguriert ist, um den Auth-Daemon auszuführen, bevor Sie dieses Setup abschließen, andernfalls wird die Bereitstellung fehlschlagen.",
"sshDaemonPort": "Daemon-Port", "sshDaemonPort": "Daemon-Port",
"sshServerDestination": "Serverziel", "sshServerDestination": "Serverziel",
"sshServerDestinationDescription": "Ziel des SSH-Servers konfigurieren", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Ziel", "destination": "Ziel",
"destinationRequired": "Ziel ist erforderlich.", "destinationRequired": "Destination is required.",
"domainRequired": "Domain ist erforderlich.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Port ist erforderlich.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Ungültige Pfadkonfiguration.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Ungültige Neupfad-Konfiguration.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Die Auswahl mehrerer Standorte ermöglicht eine widerstandsfähige Weiterleitung und einen Failover für hohe Verfügbarkeit.", "bgTargetMultiSiteDisclaimer": "Die Auswahl mehrerer Standorte ermöglicht eine widerstandsfähige Weiterleitung und einen Failover für hohe Verfügbarkeit.",
"roleAllowSsh": "SSH erlauben", "roleAllowSsh": "SSH erlauben",
"roleAllowSshAllow": "Erlauben", "roleAllowSshAllow": "Erlauben",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "Benutzer kann nur die angegebenen Befehle mit sudo ausführen.", "sshSudoModeCommandsDescription": "Benutzer kann nur die angegebenen Befehle mit sudo ausführen.",
"sshSudo": "sudo erlauben", "sshSudo": "sudo erlauben",
"sshSudoCommands": "Sudo-Befehle", "sshSudoCommands": "Sudo-Befehle",
"sshSudoCommandsDescription": "Liste der Befehle, die der Benutzer mit sudo ausführen darf, durch Kommas, Leerzeichen oder neue Zeilen getrennt. Absolute Pfade müssen verwendet werden.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Home-Verzeichnis erstellen", "sshCreateHomeDir": "Home-Verzeichnis erstellen",
"sshUnixGroups": "Unix-Gruppen", "sshUnixGroups": "Unix-Gruppen",
"sshUnixGroupsDescription": "Unix-Gruppen, in die der Benutzer auf dem Ziel-Host aufgenommen werden soll, getrennt durch Kommas, Leerzeichen oder neue Zeilen.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Werte eingeben oder eine .txt- oder .csv-Datei ablegen", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Von Datei importieren", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Importiere {fileName} in {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Erste Zeile überspringen (Header)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Vorhandenes ersetzen", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "An vorhandenes anfügen", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Importmodus", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Vorschau", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Keine Elemente zu importieren} one {1 Element zu importieren} other {# Elemente zu importieren}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} vorhanden + {imported} importiert = {total} gesamt", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Importieren", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Nicht unterstützter Dateityp", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Nur .txt- und .csv-Dateien werden unterstützt.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Keine Elemente in der Datei gefunden", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Die Datei enthält keine importierbaren Elemente.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Wiederholungsversuche", "retryAttempts": "Wiederholungsversuche",
"expectedResponseCodes": "Erwartete Antwortcodes", "expectedResponseCodes": "Erwartete Antwortcodes",
"expectedResponseCodesDescription": "HTTP-Statuscode, der einen gesunden Zustand anzeigt. Wenn leer gelassen, wird 200-300 als gesund angesehen.", "expectedResponseCodesDescription": "HTTP-Statuscode, der einen gesunden Zustand anzeigt. Wenn leer gelassen, wird 200-300 als gesund angesehen.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Proxy-Protokoll aktivieren", "enableProxyProtocol": "Proxy-Protokoll aktivieren",
"proxyProtocolInfo": "Client-IP-Adressen für TCP-Backends beibehalten", "proxyProtocolInfo": "Client-IP-Adressen für TCP-Backends beibehalten",
"proxyProtocolVersion": "Proxy-Protokollversion", "proxyProtocolVersion": "Proxy-Protokollversion",
"version1": "Version 1 (Empfohlen)", "version1": "Version 1 (Recommended)",
"version2": "Version 2", "version2": "Version 2",
"version1Description": "Textbasiert und weit verbreitet. Sicherstellen, dass das Servers-Transport zur dynamischen Konfiguration hinzugefügt wurde.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Binär und effizienter, aber weniger kompatibel. Sicherstellen, dass das Servers-Transport zur dynamischen Konfiguration hinzugefügt wurde.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Warnung", "warning": "Warnung",
"proxyProtocolWarning": "Die Backend-Anwendung muss so konfiguriert sein, dass Proxy-Protokoll-Verbindungen akzeptiert werden. Wenn Ihr Backend das Proxy-Protokoll nicht unterstützt, wird das Aktivieren aller Verbindungen unterbrochen, so dass Sie dies nur aktivieren, wenn Sie wissen, was Sie tun. Stellen Sie sicher, dass Sie Ihr Backend so konfigurieren, dass es Proxy-Protokoll-Header von Traefik vertraut.", "proxyProtocolWarning": "Die Backend-Anwendung muss so konfiguriert sein, dass Proxy-Protokoll-Verbindungen akzeptiert werden. Wenn Ihr Backend das Proxy-Protokoll nicht unterstützt, wird das Aktivieren aller Verbindungen unterbrochen, so dass Sie dies nur aktivieren, wenn Sie wissen, was Sie tun. Stellen Sie sicher, dass Sie Ihr Backend so konfigurieren, dass es Proxy-Protokoll-Header von Traefik vertraut.",
"restarting": "Neustarten...", "restarting": "Neustarten...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Bestätigung eingeben", "enterConfirmation": "Bestätigung eingeben",
"blueprintViewDetails": "Details", "blueprintViewDetails": "Details",
"defaultIdentityProvider": "Standard Identitätsanbieter", "defaultIdentityProvider": "Standard Identitätsanbieter",
"defaultIdentityProviderDescription": "Der Benutzer wird automatisch zu diesem Identitätsanbieter für die Authentifizierung weitergeleitet.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Netzwerkeinstellungen", "editInternalResourceDialogNetworkSettings": "Netzwerkeinstellungen",
"editInternalResourceDialogAccessPolicy": "Zugriffsrichtlinie", "editInternalResourceDialogAccessPolicy": "Zugriffsrichtlinie",
"editInternalResourceDialogAddRoles": "Rollen hinzufügen", "editInternalResourceDialogAddRoles": "Rollen hinzufügen",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Art des Wartungsmodus", "maintenanceModeType": "Art des Wartungsmodus",
"showMaintenancePage": "Eine Wartungsseite für Besucher anzeigen", "showMaintenancePage": "Eine Wartungsseite für Besucher anzeigen",
"enableMaintenanceMode": "Wartungsmodus aktivieren", "enableMaintenanceMode": "Wartungsmodus aktivieren",
"enableMaintenanceModeDescription": "Bei Aktivierung sehen Besucher eine Wartungsseite anstelle Ihrer Ressource.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automatisch", "automatic": "Automatisch",
"automaticModeDescription": " Wartungsseite nur anzeigen, wenn alle Backend-Ziele deaktiviert oder ungesund sind. Deine Ressource funktioniert normal, solange mindestens ein Ziel gesund ist.", "automaticModeDescription": " Wartungsseite nur anzeigen, wenn alle Backend-Ziele deaktiviert oder ungesund sind. Deine Ressource funktioniert normal, solange mindestens ein Ziel gesund ist.",
"forced": "Erzwungen", "forced": "Erzwungen",
@@ -3182,8 +3181,8 @@
"warning:": "Warnung:", "warning:": "Warnung:",
"forcedeModeWarning": "Der gesamte Datenverkehr wird zur Wartungsseite weitergeleitet. Ihre Backend-Ressourcen werden keine Anfragen erhalten.", "forcedeModeWarning": "Der gesamte Datenverkehr wird zur Wartungsseite weitergeleitet. Ihre Backend-Ressourcen werden keine Anfragen erhalten.",
"pageTitle": "Seitentitel", "pageTitle": "Seitentitel",
"maintenancePageContentSubsection": "Seiteninhalt", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Passen Sie den auf der Wartungsseite angezeigten Inhalt an", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "Die Hauptüberschrift auf der Wartungsseite", "pageTitleDescription": "Die Hauptüberschrift auf der Wartungsseite",
"maintenancePageMessage": "Wartungsmeldung", "maintenancePageMessage": "Wartungsmeldung",
"maintenancePageMessagePlaceholder": "Wir sind bald wieder da! Unsere Seite wird derzeit planmäßig gewartet.", "maintenancePageMessagePlaceholder": "Wir sind bald wieder da! Unsere Seite wird derzeit planmäßig gewartet.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Sind Sie sicher, dass Sie die Verknüpfung dieses Identitätsanbieters mit dieser Organisation aufheben möchten?", "idpUnassociateQuestion": "Sind Sie sicher, dass Sie die Verknüpfung dieses Identitätsanbieters mit dieser Organisation aufheben möchten?",
"idpUnassociateDescription": "Alle Benutzer, die mit diesem Identitätsanbieter verbunden sind, werden aus dieser Organisation entfernt, aber der Identitätsanbieter bleibt für andere verbundene Organisationen weiterhin bestehen.", "idpUnassociateDescription": "Alle Benutzer, die mit diesem Identitätsanbieter verbunden sind, werden aus dieser Organisation entfernt, aber der Identitätsanbieter bleibt für andere verbundene Organisationen weiterhin bestehen.",
"idpUnassociateConfirm": "Verknüpfung des Identitätsanbieters aufheben bestätigen", "idpUnassociateConfirm": "Verknüpfung des Identitätsanbieters aufheben bestätigen",
"idpConfirmDeleteAndRemoveMeFromOrg": "LÖSCHE UND ENTFERNE MICH AUS DER ORG", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "VERBINDUNG LÖSEN UND ENTFERNE MICH AUS DER ORG", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Dies kann für diese Organisation nicht rückgängig gemacht werden.", "idpUnassociateWarning": "Dies kann für diese Organisation nicht rückgängig gemacht werden.",
"idpUnassociatedDescription": "Identitätsanbieter erfolgreich von dieser Organisation gelöst", "idpUnassociatedDescription": "Identitätsanbieter erfolgreich von dieser Organisation gelöst",
"idpUnassociateMenu": "Verknüpfung aufheben", "idpUnassociateMenu": "Verknüpfung aufheben",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Verbindung wird hergestellt…", "sshConnecting": "Verbindung wird hergestellt…",
"sshInitializing": "Initialisieren…", "sshInitializing": "Initialisieren…",
"sshSignInTitle": "Anmelden bei SSH", "sshSignInTitle": "Anmelden bei SSH",
"sshSignInDescription": "Geben Sie Ihre SSH-Anmeldedaten ein, um sich zu verbinden", "sshSignInDescription": "Geben Sie Ihre SSH-Anmeldedaten ein",
"sshPasswordTab": "Passwort", "sshPasswordTab": "Passwort",
"sshPrivateKeyTab": "Privater Schlüssel", "sshPrivateKeyTab": "Privater Schlüssel",
"sshPrivateKeyField": "Privater Schlüssel", "sshPrivateKeyField": "Privater Schlüssel",
"sshPrivateKeyDisclaimer": "Ihr privater Schlüssel wird von Pangolin nicht gespeichert oder angezeigt. Alternativ können Sie kurzlebige Zertifikate für nahtlose Authentifizierung mit Ihrer bestehenden Pangolin-Identität verwenden.", "sshPrivateKeyDisclaimer": "Ihr privater Schlüssel wird von Pangolin nicht gespeichert oder angezeigt. Alternativ können Sie kurzlebige Zertifikate für nahtlose Authentifizierung mit Ihrer bestehenden Pangolin-Identität verwenden.",
"sshLearnMore": "Mehr erfahren", "sshLearnMore": "Mehr erfahren",
"sshPrivateKeyFile": "Private Schlüsseldatei", "sshPrivateKeyFile": "Private Schlüsseldatei",
"sshAuthenticate": "Verbinden", "sshAuthenticate": "Authentifizieren",
"sshTerminate": "Beenden", "sshTerminate": "Beenden",
"sshPoweredBy": "Bereitgestellt von", "sshPoweredBy": "Bereitgestellt von",
"sshErrorNoTarget": "Kein Ziel angegeben", "sshErrorNoTarget": "Kein Ziel angegeben",
"sshErrorWebSocket": "WebSocket-Verbindung fehlgeschlagen", "sshErrorWebSocket": "WebSocket-Verbindung fehlgeschlagen",
"sshErrorAuthFailed": "Authentifizierung fehlgeschlagen", "sshErrorAuthFailed": "Authentifizierung fehlgeschlagen",
"sshErrorConnectionClosed": "Verbindung geschlossen, bevor die Authentifizierung abgeschlossen wurde", "sshErrorConnectionClosed": "Verbindung geschlossen, bevor die Authentifizierung abgeschlossen wurde",
"sitePangolinSshDescription": "Erlaube SSH-Zugriff auf Ressourcen an diesem Standort. Dies kann später geändert werden.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Keine Ressource für diese Domain gefunden", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Kein Ziel", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Verbinden", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Strg+Alt+Entf", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Fehler beim Signieren des SSH-Schlüssels für die PAM-Push-Authentifizierung. Haben Sie sich als Benutzer angemeldet?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Fehler: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Verbindung geschlossen (Code {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Privater Schlüssel ist erforderlich", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Geben Sie Ihr VNC-Passwort ein, um sich zu verbinden", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Passwort (optional)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Kein Ressourcen-Ziel verfügbar", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Fehler beim Laden von noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Status {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Zwischenablage einfügen", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Anmeldung bei Remote Desktop", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Geben Sie die Windows-Anmeldedaten ein, um sich zu verbinden", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Modul wird geladen...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Fehler beim Laden des RDP-Moduls", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Nicht bereit", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "RDP-Modul wird noch initialisiert", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Herunterladen von {count} Datei(en) von Remote…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Download fehlgeschlagen: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Hochgeladen: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Kein Verbindungsziel verfügbar", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Verbindung fehlgeschlagen", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Anpassen", "rdpFit": "Fit",
"rdpFull": "Vollständig", "rdpFull": "Full",
"rdpReal": "Real", "rdpReal": "Real",
"rdpMeta": "Meta", "rdpMeta": "Meta",
"rdpUploadFiles": "Dateien hochladen", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Dateien bereit zum Einfügen", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} Datei(en) in die Remote-Zwischenablage kopiert — drücken Sie Strg+V auf dem Remote-Desktop, um einzufügen.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Upload fehlgeschlagen", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Unicode-Tastaturmodus", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Werkzeugleiste zeigen", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Werkzeugleiste ausblenden" "sessionToolbarHide": "Hide toolbar"
} }
+50 -192
View File
@@ -101,8 +101,6 @@
"sitesTableViewPrivateResources": "View Private Resources", "sitesTableViewPrivateResources": "View Private Resources",
"siteInstallNewt": "Install Site", "siteInstallNewt": "Install Site",
"siteInstallNewtDescription": "Install the site connector for your system", "siteInstallNewtDescription": "Install the site connector for your system",
"siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "WireGuard Configuration", "WgConfiguration": "WireGuard Configuration",
"WgConfigurationDescription": "Use the following configuration to connect to the network", "WgConfigurationDescription": "Use the following configuration to connect to the network",
"operatingSystem": "Operating System", "operatingSystem": "Operating System",
@@ -150,16 +148,16 @@
"siteCredentialsSaveDescription": "You will only be able to see this once. Make sure to copy it to a secure place.", "siteCredentialsSaveDescription": "You will only be able to see this once. Make sure to copy it to a secure place.",
"siteInfo": "Site Information", "siteInfo": "Site Information",
"status": "Status", "status": "Status",
"shareTitle": "Manage Shareable Links", "shareTitle": "Manage Share Links",
"shareDescription": "Create shareable links to grant temporary or permanent access to proxy resources", "shareDescription": "Create shareable links to grant temporary or permanent access to proxy resources",
"shareSearch": "Search shareable links...", "shareSearch": "Search share links...",
"shareCreate": "Create Shareable Link", "shareCreate": "Create Share Link",
"shareErrorDelete": "Failed to delete link", "shareErrorDelete": "Failed to delete link",
"shareErrorDeleteMessage": "An error occurred deleting link", "shareErrorDeleteMessage": "An error occurred deleting link",
"shareDeleted": "Link deleted", "shareDeleted": "Link deleted",
"shareDeletedDescription": "The link has been deleted", "shareDeletedDescription": "The link has been deleted",
"shareDelete": "Delete Shareable Link", "shareDelete": "Delete Share Link",
"shareDeleteConfirm": "Confirm Delete Shareable Link", "shareDeleteConfirm": "Confirm Delete Share Link",
"shareQuestionRemove": "Are you sure you want to delete this share link?", "shareQuestionRemove": "Are you sure you want to delete this share link?",
"shareMessageRemove": "Once deleted, the link will no longer work and anyone using it will lose access to the resource.", "shareMessageRemove": "Once deleted, the link will no longer work and anyone using it will lose access to the resource.",
"shareTokenDescription": "The access token can be passed in two ways: as a query parameter or in the request headers. These must be passed from the client on every request for authenticated access.", "shareTokenDescription": "The access token can be passed in two ways: as a query parameter or in the request headers. These must be passed from the client on every request for authenticated access.",
@@ -179,7 +177,6 @@
"shareCreateDescription": "Anyone with this link can access the resource", "shareCreateDescription": "Anyone with this link can access the resource",
"shareTitleOptional": "Title (optional)", "shareTitleOptional": "Title (optional)",
"sharePathOptional": "Path (optional)", "sharePathOptional": "Path (optional)",
"sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Expire In", "expireIn": "Expire In",
"neverExpire": "Never expire", "neverExpire": "Never expire",
"shareExpireDescription": "Expiration time is how long the link will be usable and provide access to the resource. After this time, the link will no longer work, and users who used this link will lose access to the resource.", "shareExpireDescription": "Expiration time is how long the link will be usable and provide access to the resource. After this time, the link will no longer work, and users who used this link will lose access to the resource.",
@@ -203,8 +200,8 @@
"shareErrorSelectResource": "Please select a resource", "shareErrorSelectResource": "Please select a resource",
"proxyResourceTitle": "Manage Public Resources", "proxyResourceTitle": "Manage Public Resources",
"proxyResourceDescription": "Create and manage resources that are publicly accessible through a web browser", "proxyResourceDescription": "Create and manage resources that are publicly accessible through a web browser",
"publicResourcesBannerTitle": "Web-based Public Access", "proxyResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.", "proxyResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Manage Private Resources", "clientResourceTitle": "Manage Private Resources",
"clientResourceDescription": "Create and manage resources that are only accessible through a connected client", "clientResourceDescription": "Create and manage resources that are only accessible through a connected client",
"privateResourcesBannerTitle": "Zero-Trust Private Access", "privateResourcesBannerTitle": "Zero-Trust Private Access",
@@ -212,19 +209,15 @@
"resourcesSearch": "Search resources...", "resourcesSearch": "Search resources...",
"resourceAdd": "Add Resource", "resourceAdd": "Add Resource",
"resourceErrorDelte": "Error deleting resource", "resourceErrorDelte": "Error deleting resource",
"resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules", "resourcePoliciesTitle": "Manage Resource Policies",
"resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.", "resourcePoliciesAttachedResourcesColumnTitle": "Attached resources",
"resourcePoliciesBannerButtonText": "Learn More",
"resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResources": "{count} resource(s)", "resourcePoliciesAttachedResources": "{count} resource(s)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "no resources", "resourcePoliciesAttachedResourcesEmpty": "no resources",
"resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your resources",
"resourcePoliciesSearch": "Search policies...", "resourcePoliciesSearch": "Search policies...",
"resourcePoliciesAdd": "Add Policy", "resourcePoliciesAdd": "Add Policy",
"resourcePoliciesDefaultBadgeText": "Default policy", "resourcePoliciesDefaultBadgeText": "Default policy",
"resourcePoliciesCreate": "Create Public Resource Policy", "resourcePoliciesCreate": "Create Resource Policy",
"resourcePoliciesCreateDescription": "Follow the steps below to create a new policy", "resourcePoliciesCreateDescription": "Follow the steps below to create a new policy",
"resourcePolicyName": "Policy Name", "resourcePolicyName": "Policy Name",
"resourcePolicyNameDescription": "Give this policy a name to identify it across your resources", "resourcePolicyNameDescription": "Give this policy a name to identify it across your resources",
@@ -281,7 +274,7 @@
"back": "Back", "back": "Back",
"cancel": "Cancel", "cancel": "Cancel",
"resourceConfig": "Configuration Snippets", "resourceConfig": "Configuration Snippets",
"resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource",
"resourceAddEntrypoints": "Traefik: Add Entrypoints", "resourceAddEntrypoints": "Traefik: Add Entrypoints",
"resourceExposePorts": "Gerbil: Expose Ports in Docker Compose", "resourceExposePorts": "Gerbil: Expose Ports in Docker Compose",
"resourceLearnRaw": "Learn how to configure TCP/UDP resources", "resourceLearnRaw": "Learn how to configure TCP/UDP resources",
@@ -294,8 +287,6 @@
"labelDelete": "Delete Label", "labelDelete": "Delete Label",
"labelAdd": "Add Label", "labelAdd": "Add Label",
"labelCreateSuccessMessage": "Label Created Successfully", "labelCreateSuccessMessage": "Label Created Successfully",
"labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Label Modified Successfully", "labelEditSuccessMessage": "Label Modified Successfully",
"labelNameField": "Label Name", "labelNameField": "Label Name",
"labelColorField": "Label Color", "labelColorField": "Label Color",
@@ -320,7 +311,7 @@
"rules": "Rules", "rules": "Rules",
"resourceSettingDescription": "Configure the settings on the resource", "resourceSettingDescription": "Configure the settings on the resource",
"resourceSetting": "{resourceName} Settings", "resourceSetting": "{resourceName} Settings",
"resourcePolicySettingDescription": "Configure the settings on this public resource policy", "resourcePolicySettingDescription": "Configure the settings on the resource policy",
"resourcePolicySetting": "{policyName} Settings", "resourcePolicySetting": "{policyName} Settings",
"alwaysAllow": "Bypass Auth", "alwaysAllow": "Bypass Auth",
"alwaysDeny": "Block Access", "alwaysDeny": "Block Access",
@@ -728,7 +719,7 @@
"targetSubmit": "Add Target", "targetSubmit": "Add Target",
"targetNoOne": "This resource doesn't have any targets. Add a target to configure where to send requests to the backend.", "targetNoOne": "This resource doesn't have any targets. Add a target to configure where to send requests to the backend.",
"targetNoOneDescription": "Adding more than one target above will enable load balancing.", "targetNoOneDescription": "Adding more than one target above will enable load balancing.",
"targetsSubmit": "Save Settings", "targetsSubmit": "Save Targets",
"addTarget": "Add Target", "addTarget": "Add Target",
"proxyMultiSiteRoundRobinNodeHelp": "Round robin routing will not work between sites that are not connected to the same node, but failover will work.", "proxyMultiSiteRoundRobinNodeHelp": "Round robin routing will not work between sites that are not connected to the same node, but failover will work.",
"targetErrorInvalidIp": "Invalid IP address", "targetErrorInvalidIp": "Invalid IP address",
@@ -762,11 +753,11 @@
"rulesErrorDuplicate": "Duplicate rule", "rulesErrorDuplicate": "Duplicate rule",
"rulesErrorDuplicateDescription": "A rule with these settings already exists", "rulesErrorDuplicateDescription": "A rule with these settings already exists",
"rulesErrorInvalidIpAddressRange": "Invalid CIDR", "rulesErrorInvalidIpAddressRange": "Invalid CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Please enter a valid CIDR value",
"rulesErrorInvalidUrl": "Invalid path", "rulesErrorInvalidUrl": "Invalid URL path",
"rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).", "rulesErrorInvalidUrlDescription": "Please enter a valid URL path value",
"rulesErrorInvalidIpAddress": "Invalid IP address", "rulesErrorInvalidIpAddress": "Invalid IP",
"rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.", "rulesErrorInvalidIpAddressDescription": "Please enter a valid IP address",
"rulesErrorUpdate": "Failed to update rules", "rulesErrorUpdate": "Failed to update rules",
"rulesErrorUpdateDescription": "An error occurred while updating rules", "rulesErrorUpdateDescription": "An error occurred while updating rules",
"rulesUpdated": "Enable Rules", "rulesUpdated": "Enable Rules",
@@ -774,24 +765,15 @@
"rulesMatchIpAddressRangeDescription": "Enter an address in CIDR format (e.g., 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Enter an address in CIDR format (e.g., 103.21.244.0/22)",
"rulesMatchIpAddress": "Enter an IP address (e.g., 103.21.244.12)", "rulesMatchIpAddress": "Enter an IP address (e.g., 103.21.244.12)",
"rulesMatchUrl": "Enter a URL path or pattern (e.g., /api/v1/todos or /api/v1/*)", "rulesMatchUrl": "Enter a URL path or pattern (e.g., /api/v1/todos or /api/v1/*)",
"rulesErrorInvalidPriority": "Invalid priority", "rulesErrorInvalidPriority": "Invalid Priority",
"rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.", "rulesErrorInvalidPriorityDescription": "Please enter a valid priority",
"rulesErrorDuplicatePriority": "Duplicate priorities", "rulesErrorDuplicatePriority": "Duplicate Priorities",
"rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.", "rulesErrorDuplicatePriorityDescription": "Please enter unique priorities",
"rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Rules updated", "ruleUpdated": "Rules updated",
"ruleUpdatedDescription": "Rules updated successfully", "ruleUpdatedDescription": "Rules updated successfully",
"ruleErrorUpdate": "Operation failed", "ruleErrorUpdate": "Operation failed",
"ruleErrorUpdateDescription": "An error occurred during the save operation", "ruleErrorUpdateDescription": "An error occurred during the save operation",
"rulesPriority": "Priority", "rulesPriority": "Priority",
"rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Action", "rulesAction": "Action",
"rulesMatchType": "Match Type", "rulesMatchType": "Match Type",
"value": "Value", "value": "Value",
@@ -810,7 +792,7 @@
"rulesResource": "Resource Rules Configuration", "rulesResource": "Resource Rules Configuration",
"rulesResourceDescription": "Configure rules to control access to the resource", "rulesResourceDescription": "Configure rules to control access to the resource",
"ruleSubmit": "Add Rule", "ruleSubmit": "Add Rule",
"rulesNoOne": "No rules yet.", "rulesNoOne": "No rules. Add a rule using the form.",
"rulesOrder": "Rules are evaluated by priority in ascending order.", "rulesOrder": "Rules are evaluated by priority in ascending order.",
"rulesSubmit": "Save Rules", "rulesSubmit": "Save Rules",
"policyErrorCreate": "Error creating policy", "policyErrorCreate": "Error creating policy",
@@ -821,48 +803,7 @@
"policyErrorUpdateMessageDescription": "An unexpected error occurred", "policyErrorUpdateMessageDescription": "An unexpected error occurred",
"policyCreatedSuccess": "Resource policy succesfully created", "policyCreatedSuccess": "Resource policy succesfully created",
"policyUpdatedSuccess": "Resource policy succesfully updated", "policyUpdatedSuccess": "Resource policy succesfully updated",
"authMethodsSave": "Save Settings", "authMethodsSave": "Save auth methods",
"policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP",
"rulesSave": "Save Rules", "rulesSave": "Save Rules",
"resourceErrorCreate": "Error creating resource", "resourceErrorCreate": "Error creating resource",
"resourceErrorCreateDescription": "An error occurred when creating the resource", "resourceErrorCreateDescription": "An error occurred when creating the resource",
@@ -883,9 +824,9 @@
"resourcesErrorUpdateDescription": "An error occurred while updating the resource", "resourcesErrorUpdateDescription": "An error occurred while updating the resource",
"access": "Access", "access": "Access",
"accessControl": "Access Control", "accessControl": "Access Control",
"shareLink": "{resource} Shareable Link", "shareLink": "{resource} Share Link",
"resourceSelect": "Select resource", "resourceSelect": "Select resource",
"shareLinks": "Shareable Links", "shareLinks": "Share Links",
"share": "Shareable Links", "share": "Shareable Links",
"shareDescription2": "Create shareable links to resources. Links provide temporary or unlimited access to your resource. You can configure the expiration duration of the link when you create one.", "shareDescription2": "Create shareable links to resources. Links provide temporary or unlimited access to your resource. You can configure the expiration duration of the link when you create one.",
"shareEasyCreate": "Easy to create and share", "shareEasyCreate": "Easy to create and share",
@@ -975,18 +916,10 @@
"resourceRoleDescription": "Admins can always access this resource.", "resourceRoleDescription": "Admins can always access this resource.",
"resourcePolicySelectTitle": "Resource Access Policy", "resourcePolicySelectTitle": "Resource Access Policy",
"resourcePolicySelectDescription": "Select the resource policy type for authentication", "resourcePolicySelectDescription": "Select the resource policy type for authentication",
"resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Inline Resource Policy", "resourcePolicyInline": "Inline Resource Policy",
"resourcePolicyInlineDescription": "Access Policy scoped to only this resource", "resourcePolicyInlineDescription": "Access Policy scoped to only this resource",
"resourcePolicyShared": "Shared Resource Policy", "resourcePolicyShared": "Shared Resource Policy",
"resourcePolicySharedDescription": "This resource uses a shared policy.", "resourcePolicySharedDescription": "This resource uses a shared policy. Policy-level settings (auth methods, email whitelist) are locked. You can add resource-specific rules, roles, and users below.",
"sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "This resource inherits from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource to add to the policy. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Access Controls", "resourceUsersRoles": "Access Controls",
"resourceUsersRolesDescription": "Configure which users and roles can visit this resource", "resourceUsersRolesDescription": "Configure which users and roles can visit this resource",
"resourceUsersRolesSubmit": "Save Access Controls", "resourceUsersRolesSubmit": "Save Access Controls",
@@ -1011,14 +944,7 @@
"resourceVisibilityTitle": "Visibility", "resourceVisibilityTitle": "Visibility",
"resourceVisibilityTitleDescription": "Completely enable or disable resource visibility", "resourceVisibilityTitleDescription": "Completely enable or disable resource visibility",
"resourceGeneral": "General Settings", "resourceGeneral": "General Settings",
"resourceGeneralDescription": "Configure name, address, and access policy for this resource.", "resourceGeneralDescription": "Configure the general settings for this resource",
"resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Enable Resource", "resourceEnable": "Enable Resource",
"resourceTransfer": "Transfer Resource", "resourceTransfer": "Transfer Resource",
"resourceTransferDescription": "Transfer this resource to a different site", "resourceTransferDescription": "Transfer this resource to a different site",
@@ -1294,14 +1220,11 @@
"addLabels": "Add labels", "addLabels": "Add labels",
"siteLabelsTab": "Labels", "siteLabelsTab": "Labels",
"siteLabelsDescription": "Manage labels associated with this site.", "siteLabelsDescription": "Manage labels associated with this site.",
"labelsNotFound": "No labels found.", "labelsNotFound": "Labels not found",
"labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Search labels", "labelSearch": "Search labels",
"labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# label} other {# labels}}", "accessLabelFilterCount": "{count, plural, one {# label} other {# labels}}",
"labelOverflowCount": "+{count, plural, one {# label} other {# labels}}", "labelOverflowCount": "+{count, plural, one {# label} other {# labels}}",
"accessLabelFilterClear": "Clear label filters", "accessLabelFilterClear": "Clear label filters",
"accessFilterClear": "Clear filters",
"selectColor": "Select color", "selectColor": "Select color",
"createNewLabel": "Create new org label \"{label}\"", "createNewLabel": "Create new org label \"{label}\"",
"inviteInvalidDescription": "The invite link is invalid.", "inviteInvalidDescription": "The invite link is invalid.",
@@ -1538,8 +1461,8 @@
"sidebarResources": "Resources", "sidebarResources": "Resources",
"sidebarProxyResources": "Public", "sidebarProxyResources": "Public",
"sidebarClientResources": "Private", "sidebarClientResources": "Private",
"sidebarPolicies": "Shared Policies", "sidebarPolicies": "Policies",
"sidebarResourcePolicies": "Public Resources", "sidebarResourcePolicies": "Resources",
"sidebarAccessControl": "Access Control", "sidebarAccessControl": "Access Control",
"sidebarLogsAndAnalytics": "Logs & Analytics", "sidebarLogsAndAnalytics": "Logs & Analytics",
"sidebarTeam": "Team", "sidebarTeam": "Team",
@@ -1547,7 +1470,7 @@
"sidebarAdmin": "Admin", "sidebarAdmin": "Admin",
"sidebarInvitations": "Invitations", "sidebarInvitations": "Invitations",
"sidebarRoles": "Roles", "sidebarRoles": "Roles",
"sidebarShareableLinks": "Shareable Links", "sidebarShareableLinks": "Links",
"sidebarApiKeys": "API Keys", "sidebarApiKeys": "API Keys",
"sidebarProvisioning": "Provisioning", "sidebarProvisioning": "Provisioning",
"sidebarSettings": "Settings", "sidebarSettings": "Settings",
@@ -1724,7 +1647,7 @@
"standaloneHcFilterResourceIdFallback": "Resource {id}", "standaloneHcFilterResourceIdFallback": "Resource {id}",
"blueprints": "Blueprints", "blueprints": "Blueprints",
"blueprintsLog": "Blueprints Log", "blueprintsLog": "Blueprints Log",
"blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint", "blueprintsDescription": "View past blueprint applications and their results",
"blueprintAdd": "Add Blueprint", "blueprintAdd": "Add Blueprint",
"blueprintGoBack": "See all Blueprints", "blueprintGoBack": "See all Blueprints",
"blueprintCreate": "Create Blueprint", "blueprintCreate": "Create Blueprint",
@@ -1744,10 +1667,10 @@
"enableDockerSocket": "Enable Docker Blueprint", "enableDockerSocket": "Enable Docker Blueprint",
"enableDockerSocketDescription": "Enable Docker Socket label scraping for blueprint labels. Socket path must be provided to the site connector. Read about how this works in <docsLink>the documentation</docsLink>.", "enableDockerSocketDescription": "Enable Docker Socket label scraping for blueprint labels. Socket path must be provided to the site connector. Read about how this works in <docsLink>the documentation</docsLink>.",
"newtAutoUpdate": "Enable Site Auto-Update", "newtAutoUpdate": "Enable Site Auto-Update",
"newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically update to the latest version when a new release is available.",
"siteAutoUpdate": "Site Auto-Update", "siteAutoUpdate": "Site Auto-Update",
"siteAutoUpdateLabel": "Enable Auto-Update", "siteAutoUpdateLabel": "Enable Auto-Update",
"siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.", "siteAutoUpdateDescription": "Control whether this site's connector automatically downloads the latest version.",
"siteAutoUpdateOrgDefault": "Organization default: {state}", "siteAutoUpdateOrgDefault": "Organization default: {state}",
"siteAutoUpdateOverriding": "Overriding organization setting", "siteAutoUpdateOverriding": "Overriding organization setting",
"siteAutoUpdateResetToOrg": "Reset to Organization Default", "siteAutoUpdateResetToOrg": "Reset to Organization Default",
@@ -1845,9 +1768,9 @@
"accountSetupSuccess": "Account setup completed! Welcome to Pangolin!", "accountSetupSuccess": "Account setup completed! Welcome to Pangolin!",
"documentation": "Documentation", "documentation": "Documentation",
"saveAllSettings": "Save All Settings", "saveAllSettings": "Save All Settings",
"saveResourceTargets": "Save Settings", "saveResourceTargets": "Save Targets",
"saveResourceHttp": "Save Settings", "saveResourceHttp": "Save Proxy Settings",
"saveProxyProtocol": "Save Settings", "saveProxyProtocol": "Save Proxy protocol settings",
"settingsUpdated": "Settings updated", "settingsUpdated": "Settings updated",
"settingsUpdatedDescription": "Settings updated successfully", "settingsUpdatedDescription": "Settings updated successfully",
"settingsErrorUpdate": "Failed to update settings", "settingsErrorUpdate": "Failed to update settings",
@@ -2104,13 +2027,13 @@
"healthCheckUnknown": "Unknown", "healthCheckUnknown": "Unknown",
"healthCheck": "Health Check", "healthCheck": "Health Check",
"configureHealthCheck": "Configure Health Check", "configureHealthCheck": "Configure Health Check",
"configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available", "configureHealthCheckDescription": "Set up health monitoring for {target}",
"enableHealthChecks": "Enable Health Checks", "enableHealthChecks": "Enable Health Checks",
"healthCheckDisabledStateDescription": "When disabled, the site will not perform health checks and the state will be considered unknown.", "healthCheckDisabledStateDescription": "When disabled, the site will not perform health checks and the state will be considered unknown.",
"enableHealthChecksDescription": "Monitor the health of this target. You can monitor a different endpoint than the target if required.", "enableHealthChecksDescription": "Monitor the health of this target. You can monitor a different endpoint than the target if required.",
"healthScheme": "Method", "healthScheme": "Method",
"healthSelectScheme": "Select Method", "healthSelectScheme": "Select Method",
"healthCheckPortInvalid": "Port must be between 1 and 65535", "healthCheckPortInvalid": "Health check port must be between 1 and 65535",
"healthCheckPath": "Path", "healthCheckPath": "Path",
"healthHostname": "IP / Host", "healthHostname": "IP / Host",
"healthPort": "Port", "healthPort": "Port",
@@ -2123,7 +2046,6 @@
"requireDeviceApproval": "Require Device Approvals", "requireDeviceApproval": "Require Device Approvals",
"requireDeviceApprovalDescription": "Users with this role need new devices approved by an admin before they can connect and access resources.", "requireDeviceApprovalDescription": "Users with this role need new devices approved by an admin before they can connect and access resources.",
"sshSettings": "SSH Settings", "sshSettings": "SSH Settings",
"sshAccess": "SSH Access",
"rdpSettings": "RDP Settings", "rdpSettings": "RDP Settings",
"vncSettings": "VNC Settings", "vncSettings": "VNC Settings",
"sshServer": "SSH Server", "sshServer": "SSH Server",
@@ -2150,13 +2072,8 @@
"sshDaemonDisclaimer": "Ensure your target host is properly configured to run the auth daemon before completing this setup, or provisioning will fail.", "sshDaemonDisclaimer": "Ensure your target host is properly configured to run the auth daemon before completing this setup, or provisioning will fail.",
"sshDaemonPort": "Daemon Port", "sshDaemonPort": "Daemon Port",
"sshServerDestination": "Server Destination", "sshServerDestination": "Server Destination",
"sshServerDestinationDescription": "Configure the destination of the SSH server", "sshServerDestinationDescription": "Configure the destination and port of the SSH server",
"destination": "Destination", "destination": "Destination",
"destinationRequired": "Destination is required.",
"domainRequired": "Domain is required.",
"proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Selecting multiple sites enables resilient routing and failover for high availability.", "bgTargetMultiSiteDisclaimer": "Selecting multiple sites enables resilient routing and failover for high availability.",
"roleAllowSsh": "Allow SSH", "roleAllowSsh": "Allow SSH",
"roleAllowSshAllow": "Allow", "roleAllowSshAllow": "Allow",
@@ -2171,25 +2088,10 @@
"sshSudoModeCommandsDescription": "User can run only the specified commands with sudo.", "sshSudoModeCommandsDescription": "User can run only the specified commands with sudo.",
"sshSudo": "Allow sudo", "sshSudo": "Allow sudo",
"sshSudoCommands": "Sudo Commands", "sshSudoCommands": "Sudo Commands",
"sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.", "sshSudoCommandsDescription": "Comma separated list of commands the user is allowed to run with sudo. Absolute paths must be used.",
"sshCreateHomeDir": "Create Home Directory", "sshCreateHomeDir": "Create Home Directory",
"sshUnixGroups": "Unix Groups", "sshUnixGroups": "Unix Groups",
"sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.", "sshUnixGroupsDescription": "Comma separated Unix groups to add the user to on the target host.",
"roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Retry Attempts", "retryAttempts": "Retry Attempts",
"expectedResponseCodes": "Expected Response Codes", "expectedResponseCodes": "Expected Response Codes",
"expectedResponseCodesDescription": "HTTP status code that indicates healthy status. If left blank, 200-300 is considered healthy.", "expectedResponseCodesDescription": "HTTP status code that indicates healthy status. If left blank, 200-300 is considered healthy.",
@@ -2973,10 +2875,9 @@
"enableProxyProtocol": "Enable Proxy Protocol", "enableProxyProtocol": "Enable Proxy Protocol",
"proxyProtocolInfo": "Preserve client IP addresses for TCP backends", "proxyProtocolInfo": "Preserve client IP addresses for TCP backends",
"proxyProtocolVersion": "Proxy Protocol Version", "proxyProtocolVersion": "Proxy Protocol Version",
"version1": "Version 1 (Recommended)", "version1": " Version 1 (Recommended)",
"version2": "Version 2", "version2": "Version 2",
"version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.", "versionDescription": "Version 1 is text-based and widely supported. Version 2 is binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Warning", "warning": "Warning",
"proxyProtocolWarning": "The backend application must be configured to accept Proxy Protocol connections. If your backend doesn't support Proxy Protocol, enabling this will break all connections so only enable this if you know what you're doing. Make sure to configure your backend to trust Proxy Protocol headers from Traefik.", "proxyProtocolWarning": "The backend application must be configured to accept Proxy Protocol connections. If your backend doesn't support Proxy Protocol, enabling this will break all connections so only enable this if you know what you're doing. Make sure to configure your backend to trust Proxy Protocol headers from Traefik.",
"restarting": "Restarting...", "restarting": "Restarting...",
@@ -3133,7 +3034,7 @@
"enterConfirmation": "Enter confirmation", "enterConfirmation": "Enter confirmation",
"blueprintViewDetails": "Details", "blueprintViewDetails": "Details",
"defaultIdentityProvider": "Default Identity Provider", "defaultIdentityProvider": "Default Identity Provider",
"defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.", "defaultIdentityProviderDescription": "When a default identity provider is selected, the user will be automatically redirected to the provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Network Settings", "editInternalResourceDialogNetworkSettings": "Network Settings",
"editInternalResourceDialogAccessPolicy": "Access Policy", "editInternalResourceDialogAccessPolicy": "Access Policy",
"editInternalResourceDialogAddRoles": "Add Roles", "editInternalResourceDialogAddRoles": "Add Roles",
@@ -3174,7 +3075,6 @@
"maintenanceModeType": "Maintenance Mode Type", "maintenanceModeType": "Maintenance Mode Type",
"showMaintenancePage": "Show a maintenance page to visitors", "showMaintenancePage": "Show a maintenance page to visitors",
"enableMaintenanceMode": "Enable Maintenance Mode", "enableMaintenanceMode": "Enable Maintenance Mode",
"enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automatic", "automatic": "Automatic",
"automaticModeDescription": " Show maintenance page only when all backend targets are down or unhealthy. Your resource continues working normally as long as at least one target is healthy.", "automaticModeDescription": " Show maintenance page only when all backend targets are down or unhealthy. Your resource continues working normally as long as at least one target is healthy.",
"forced": "Forced", "forced": "Forced",
@@ -3182,8 +3082,6 @@
"warning:": "Warning:", "warning:": "Warning:",
"forcedeModeWarning": "All traffic will be directed to the maintenance page. Your backend resources will not receive any requests.", "forcedeModeWarning": "All traffic will be directed to the maintenance page. Your backend resources will not receive any requests.",
"pageTitle": "Page Title", "pageTitle": "Page Title",
"maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "The main heading displayed on the maintenance page", "pageTitleDescription": "The main heading displayed on the maintenance page",
"maintenancePageMessage": "Maintenance Message", "maintenancePageMessage": "Maintenance Message",
"maintenancePageMessagePlaceholder": "We'll be back soon! Our site is currently undergoing scheduled maintenance.", "maintenancePageMessagePlaceholder": "We'll be back soon! Our site is currently undergoing scheduled maintenance.",
@@ -3543,58 +3441,18 @@
"sshConnecting": "Connecting…", "sshConnecting": "Connecting…",
"sshInitializing": "Initializing…", "sshInitializing": "Initializing…",
"sshSignInTitle": "Sign in to SSH", "sshSignInTitle": "Sign in to SSH",
"sshSignInDescription": "Enter your SSH credentials to connect", "sshSignInDescription": "Enter your SSH credentials",
"sshPasswordTab": "Password", "sshPasswordTab": "Password",
"sshPrivateKeyTab": "Private Key", "sshPrivateKeyTab": "Private Key",
"sshPrivateKeyField": "Private Key", "sshPrivateKeyField": "Private Key",
"sshPrivateKeyDisclaimer": "Your private key is not stored or visible to Pangolin. Alternatively, you can use short-lived certificates for seamless authentication using your existing Pangolin identity.", "sshPrivateKeyDisclaimer": "Your private key is not stored or visible to Pangolin. Alternatively, you can use short-lived certificates for seamless authentication using your existing Pangolin identity.",
"sshLearnMore": "Learn more", "sshLearnMore": "Learn more",
"sshPrivateKeyFile": "Private Key File", "sshPrivateKeyFile": "Private Key File",
"sshAuthenticate": "Connect", "sshAuthenticate": "Authenticate",
"sshTerminate": "Terminate", "sshTerminate": "Terminate",
"sshPoweredBy": "Powered by", "sshPoweredBy": "Powered by",
"sshErrorNoTarget": "No target specified", "sshErrorNoTarget": "No target specified",
"sshErrorWebSocket": "WebSocket connection failed", "sshErrorWebSocket": "WebSocket connection failed",
"sshErrorAuthFailed": "Authentication failed", "sshErrorAuthFailed": "Authentication failed",
"sshErrorConnectionClosed": "Connection closed before authentication completed", "sshErrorConnectionClosed": "Connection closed before authentication completed"
"sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC",
"vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP",
"rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Not ready",
"rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Connection failed",
"rdpFit": "Fit",
"rdpFull": "Full",
"rdpReal": "Real",
"rdpMeta": "Meta",
"rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Hide toolbar"
} }
+183 -184
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Ver Recursos Privados", "sitesTableViewPrivateResources": "Ver Recursos Privados",
"siteInstallNewt": "Instalar Newt", "siteInstallNewt": "Instalar Newt",
"siteInstallNewtDescription": "Recibe Newt corriendo en tu sistema", "siteInstallNewtDescription": "Recibe Newt corriendo en tu sistema",
"siteInstallKubernetesDocsDescription": "Para información de instalación de Kubernetes más reciente, consulta <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Para instrucciones de instalación del módem Advantech, consulta <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "Configuración de Wirex Guard", "WgConfiguration": "Configuración de Wirex Guard",
"WgConfigurationDescription": "Utilice la siguiente configuración para conectarse a la red", "WgConfigurationDescription": "Utilice la siguiente configuración para conectarse a la red",
"operatingSystem": "Sistema operativo", "operatingSystem": "Sistema operativo",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Sólo podrás verlo una vez. Asegúrate de copiarlo a un lugar seguro.", "siteCredentialsSaveDescription": "Sólo podrás verlo una vez. Asegúrate de copiarlo a un lugar seguro.",
"siteInfo": "Información del sitio", "siteInfo": "Información del sitio",
"status": "Estado", "status": "Estado",
"shareTitle": "Gestionar Enlaces Compartibles", "shareTitle": "Manage Shareable Links",
"shareDescription": "Crear enlaces compartidos para conceder acceso temporal o permanente a recursos proxy", "shareDescription": "Crear enlaces compartidos para conceder acceso temporal o permanente a recursos proxy",
"shareSearch": "Buscar enlaces compartibles...", "shareSearch": "Search shareable links...",
"shareCreate": "Crear Enlace Compartible", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Error al eliminar el enlace", "shareErrorDelete": "Error al eliminar el enlace",
"shareErrorDeleteMessage": "Se ha producido un error al eliminar el enlace", "shareErrorDeleteMessage": "Se ha producido un error al eliminar el enlace",
"shareDeleted": "Enlace eliminado", "shareDeleted": "Enlace eliminado",
"shareDeletedDescription": "El enlace ha sido eliminado", "shareDeletedDescription": "El enlace ha sido eliminado",
"shareDelete": "Eliminar Enlace Compartible", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Confirmar Eliminación de Enlace Compartible", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "¿Está seguro de que desea borrar este enlace compartido?", "shareQuestionRemove": "¿Está seguro de que desea borrar este enlace compartido?",
"shareMessageRemove": "Una vez borrado, el enlace dejará de funcionar y cualquier persona que lo use perderá acceso al recurso.", "shareMessageRemove": "Una vez borrado, el enlace dejará de funcionar y cualquier persona que lo use perderá acceso al recurso.",
"shareTokenDescription": "El token de acceso puede ser pasado de dos maneras: como parámetro de consulta o en las cabeceras de solicitud. Estos deben ser pasados del cliente en cada solicitud de acceso autenticado.", "shareTokenDescription": "El token de acceso puede ser pasado de dos maneras: como parámetro de consulta o en las cabeceras de solicitud. Estos deben ser pasados del cliente en cada solicitud de acceso autenticado.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Cualquiera con este enlace puede acceder al recurso", "shareCreateDescription": "Cualquiera con este enlace puede acceder al recurso",
"shareTitleOptional": "Título (opcional)", "shareTitleOptional": "Título (opcional)",
"sharePathOptional": "Ruta (opcional)", "sharePathOptional": "Ruta (opcional)",
"sharePathDescription": "El enlace redirigirá a los usuarios a esta ruta tras la autenticación.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Caduca en", "expireIn": "Caduca en",
"neverExpire": "Nunca expirar", "neverExpire": "Nunca expirar",
"shareExpireDescription": "El tiempo de caducidad es cuánto tiempo el enlace será utilizable y proporcionará acceso al recurso. Después de este tiempo, el enlace ya no funcionará, y los usuarios que usaron este enlace perderán el acceso al recurso.", "shareExpireDescription": "El tiempo de caducidad es cuánto tiempo el enlace será utilizable y proporcionará acceso al recurso. Después de este tiempo, el enlace ya no funcionará, y los usuarios que usaron este enlace perderán el acceso al recurso.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Por favor, seleccione un recurso", "shareErrorSelectResource": "Por favor, seleccione un recurso",
"proxyResourceTitle": "Administrar recursos públicos", "proxyResourceTitle": "Administrar recursos públicos",
"proxyResourceDescription": "Crear y administrar recursos que sean accesibles públicamente a través de un navegador web", "proxyResourceDescription": "Crear y administrar recursos que sean accesibles públicamente a través de un navegador web",
"publicResourcesBannerTitle": "Acceso Público basado en Web", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Los recursos públicos son proxies HTTPS accesibles para cualquiera en Internet a través de un navegador web. A diferencia de los recursos privados, no requieren software del lado del cliente e incluyen políticas de acceso basadas en identidad y contexto.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Administrar recursos privados", "clientResourceTitle": "Administrar recursos privados",
"clientResourceDescription": "Crear y administrar recursos que sólo son accesibles a través de un cliente conectado", "clientResourceDescription": "Crear y administrar recursos que sólo son accesibles a través de un cliente conectado",
"privateResourcesBannerTitle": "Acceso privado de confianza cero", "privateResourcesBannerTitle": "Acceso privado de confianza cero",
@@ -212,19 +212,18 @@
"resourcesSearch": "Buscar recursos...", "resourcesSearch": "Buscar recursos...",
"resourceAdd": "Añadir Recurso", "resourceAdd": "Añadir Recurso",
"resourceErrorDelte": "Error al eliminar el recurso", "resourceErrorDelte": "Error al eliminar el recurso",
"resourcePoliciesBannerTitle": "Reutilizar Reglas de Autenticación y Acceso", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Las políticas de recursos compartidos te permiten definir métodos de autenticación y reglas de acceso una vez, y luego adjuntarlas a múltiples recursos públicos. Al actualizar una política, cada recurso vinculado hereda automáticamente el cambio.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Saber más", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Gestionar Políticas de Recursos Públicos", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Recursos",
"resourcePoliciesAttachedResources": "{count} recurso/s", "resourcePoliciesAttachedResources": "{count} recurso/s",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# recurso} other {# recursos}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "sin recursos", "resourcePoliciesAttachedResourcesEmpty": "sin recursos",
"resourcePoliciesDescription": "Crear y gestionar políticas de autenticación para controlar el acceso a tus recursos públicos", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Buscar políticas...", "resourcePoliciesSearch": "Buscar políticas...",
"resourcePoliciesAdd": "Agregar Política", "resourcePoliciesAdd": "Agregar Política",
"resourcePoliciesDefaultBadgeText": "Política predeterminada", "resourcePoliciesDefaultBadgeText": "Política predeterminada",
"resourcePoliciesCreate": "Crear Política de Recursos Públicos", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Siga los pasos a continuación para crear una nueva política", "resourcePoliciesCreateDescription": "Siga los pasos a continuación para crear una nueva política",
"resourcePolicyName": "Nombre de la política", "resourcePolicyName": "Nombre de la política",
"resourcePolicyNameDescription": "Déle a esta política un nombre para identificarla en sus recursos", "resourcePolicyNameDescription": "Déle a esta política un nombre para identificarla en sus recursos",
@@ -281,7 +280,7 @@
"back": "Atrás", "back": "Atrás",
"cancel": "Cancelar", "cancel": "Cancelar",
"resourceConfig": "Fragmentos de configuración", "resourceConfig": "Fragmentos de configuración",
"resourceConfigDescription": "Copia y pega estos fragmentos de configuración para configurar el recurso TCP/UDP.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Añadir puntos de entrada", "resourceAddEntrypoints": "Traefik: Añadir puntos de entrada",
"resourceExposePorts": "Gerbil: Exponer puertos en Docker Compose", "resourceExposePorts": "Gerbil: Exponer puertos en Docker Compose",
"resourceLearnRaw": "Aprende cómo configurar los recursos TCP/UDP", "resourceLearnRaw": "Aprende cómo configurar los recursos TCP/UDP",
@@ -294,8 +293,8 @@
"labelDelete": "Eliminar etiqueta", "labelDelete": "Eliminar etiqueta",
"labelAdd": "Agregar etiqueta", "labelAdd": "Agregar etiqueta",
"labelCreateSuccessMessage": "Etiqueta creada correctamente", "labelCreateSuccessMessage": "Etiqueta creada correctamente",
"labelDuplicateError": "Etiqueta Duplicada", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Una etiqueta con este nombre ya existe.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Etiqueta modificada correctamente", "labelEditSuccessMessage": "Etiqueta modificada correctamente",
"labelNameField": "Nombre de la etiqueta", "labelNameField": "Nombre de la etiqueta",
"labelColorField": "Color de la etiqueta", "labelColorField": "Color de la etiqueta",
@@ -320,7 +319,7 @@
"rules": "Reglas", "rules": "Reglas",
"resourceSettingDescription": "Configurar la configuración del recurso", "resourceSettingDescription": "Configurar la configuración del recurso",
"resourceSetting": "Ajustes {resourceName}", "resourceSetting": "Ajustes {resourceName}",
"resourcePolicySettingDescription": "Configura los ajustes de esta política de recursos públicos", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "Configuración {policyName}", "resourcePolicySetting": "Configuración {policyName}",
"alwaysAllow": "Autorización Bypass", "alwaysAllow": "Autorización Bypass",
"alwaysDeny": "Bloquear acceso", "alwaysDeny": "Bloquear acceso",
@@ -728,7 +727,7 @@
"targetSubmit": "Añadir destino", "targetSubmit": "Añadir destino",
"targetNoOne": "Este recurso no tiene ningún objetivo. Agrega un objetivo para configurar dónde enviar peticiones al backend.", "targetNoOne": "Este recurso no tiene ningún objetivo. Agrega un objetivo para configurar dónde enviar peticiones al backend.",
"targetNoOneDescription": "Si se añade más de un objetivo anterior se activará el balance de carga.", "targetNoOneDescription": "Si se añade más de un objetivo anterior se activará el balance de carga.",
"targetsSubmit": "Guardar ajustes", "targetsSubmit": "Save Settings",
"addTarget": "Añadir destino", "addTarget": "Añadir destino",
"proxyMultiSiteRoundRobinNodeHelp": "El enrutamiento de turnos no funcionará entre sitios que no están conectados al mismo nodo, pero el failover funcionará.", "proxyMultiSiteRoundRobinNodeHelp": "El enrutamiento de turnos no funcionará entre sitios que no están conectados al mismo nodo, pero el failover funcionará.",
"targetErrorInvalidIp": "Dirección IP inválida", "targetErrorInvalidIp": "Dirección IP inválida",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Duplicar regla", "rulesErrorDuplicate": "Duplicar regla",
"rulesErrorDuplicateDescription": "Ya existe una regla con estos ajustes", "rulesErrorDuplicateDescription": "Ya existe una regla con estos ajustes",
"rulesErrorInvalidIpAddressRange": "CIDR inválido", "rulesErrorInvalidIpAddressRange": "CIDR inválido",
"rulesErrorInvalidIpAddressRangeDescription": "Introduce un rango CIDR válido (por ejemplo, 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Ruta no válida", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Introduce una ruta URL o patrón válido (por ejemplo, /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Dirección IP no válida", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Introduce una dirección IPv4 o IPv6 válida.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Error al actualizar las reglas", "rulesErrorUpdate": "Error al actualizar las reglas",
"rulesErrorUpdateDescription": "Se ha producido un error al actualizar las reglas", "rulesErrorUpdateDescription": "Se ha producido un error al actualizar las reglas",
"rulesUpdated": "Activar Reglas", "rulesUpdated": "Activar Reglas",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Introduzca una dirección en formato CIDR (por ejemplo, 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Introduzca una dirección en formato CIDR (por ejemplo, 103.21.244.0/22)",
"rulesMatchIpAddress": "Introduzca una dirección IP (por ejemplo, 103.21.244.12)", "rulesMatchIpAddress": "Introduzca una dirección IP (por ejemplo, 103.21.244.12)",
"rulesMatchUrl": "Introduzca una ruta URL o patrón (por ej., /api/v1/todos o /api/v1/*)", "rulesMatchUrl": "Introduzca una ruta URL o patrón (por ej., /api/v1/todos o /api/v1/*)",
"rulesErrorInvalidPriority": "Prioridad no válida", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Introduce un número entero de 1 o mayor.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Prioridades duplicadas", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Cada regla debe tener un número de prioridad único.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Reglas no válidas", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Regla {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Selecciona un tipo de coincidencia válido (ruta, IP, CIDR, país, región o ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Introduce un valor para esta regla.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "País no válido", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Selecciona un país válido.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "ASN no válido", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Introduce un ASN válido (por ejemplo, AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Reglas actualizadas", "ruleUpdated": "Reglas actualizadas",
"ruleUpdatedDescription": "Reglas actualizadas correctamente", "ruleUpdatedDescription": "Reglas actualizadas correctamente",
"ruleErrorUpdate": "Operación fallida", "ruleErrorUpdate": "Operación fallida",
"ruleErrorUpdateDescription": "Se ha producido un error durante la operación de guardado", "ruleErrorUpdateDescription": "Se ha producido un error durante la operación de guardado",
"rulesPriority": "Prioridad", "rulesPriority": "Prioridad",
"rulesReorderDragHandle": "Arrastra para reordenar la prioridad de reglas", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Accin", "rulesAction": "Accin",
"rulesMatchType": "Tipo de partida", "rulesMatchType": "Tipo de partida",
"value": "Valor", "value": "Valor",
@@ -810,7 +809,7 @@
"rulesResource": "Configuración de reglas de recursos", "rulesResource": "Configuración de reglas de recursos",
"rulesResourceDescription": "Configurar reglas para controlar el acceso al recurso", "rulesResourceDescription": "Configurar reglas para controlar el acceso al recurso",
"ruleSubmit": "Añadir Regla", "ruleSubmit": "Añadir Regla",
"rulesNoOne": "Aún no hay reglas.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Las reglas son evaluadas por prioridad en orden ascendente.", "rulesOrder": "Las reglas son evaluadas por prioridad en orden ascendente.",
"rulesSubmit": "Guardar Reglas", "rulesSubmit": "Guardar Reglas",
"policyErrorCreate": "Error al crear la política", "policyErrorCreate": "Error al crear la política",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Se ha producido un error inesperado", "policyErrorUpdateMessageDescription": "Se ha producido un error inesperado",
"policyCreatedSuccess": "Política de recursos creada con éxito", "policyCreatedSuccess": "Política de recursos creada con éxito",
"policyUpdatedSuccess": "Política de recursos actualizada con éxito", "policyUpdatedSuccess": "Política de recursos actualizada con éxito",
"authMethodsSave": "Guardar ajustes", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Autenticación", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Controla qué métodos de autenticación son necesarios para acceder a este recurso", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Múltiples métodos de autenticación activos", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Los visitantes pueden autenticarse utilizando cualquier método activo a continuación. No necesitan completar todos ellos.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Activo", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Apagado", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "SSO de Plataforma", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Requiere iniciar sesión a través del proveedor de identidad de tu organización", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} usuarios, {roles} roles", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Proveedor por defecto", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Añadir Proveedor de Identidad Predeterminado", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Otros Métodos", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Métodos opcionales que los visitantes pueden utilizar en lugar de o junto con el SSO de plataforma", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Código de Acceso", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Requiere un código alfanumérico compartido para acceder al recurso", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Código de acceso establecido", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "Código PIN", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Un código numérico corto necesario para acceder al recurso", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "digo PIN de 6 dígitos establecido", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "Lista Blanca de Correo", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Permitir direcciones de correo listadas con contraseñas de un solo uso", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} direcciones permitidas", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Habilitar la lista blanca de correos envía una contraseña de un solo uso al correo del visitante al iniciar sesión.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Autenticación Básica del Encabezado", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Valida un nombre y valor de encabezado HTTP personalizado en cada petición", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Encabezado configurado", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Nombre del encabezado", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Valor esperado", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Establecer Código de Acceso", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Establecer Código PIN", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Establecer Lista Blanca de Correo", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Establecer Autenticación Básica del Encabezado", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Reglas de Acceso", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Cuando está habilitado, las reglas se evalúan en orden descendente hasta que una se evalúa como verdadera.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Las reglas se evalúan de arriba a abajo. La primera regla coincidente decide el resultado.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Las reglas coinciden con las solicitudes por ruta, dirección IP, ubicación u otros criterios. Cada regla aplica una acción: omitir autenticación, bloquear acceso o pasar a autenticación. Si ninguna regla coincide, el tráfico sigue a la autenticación.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Cuando las reglas están deshabilitadas, todo el tráfico pasa a autenticación.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Cuando no coincide ninguna regla, el tráfico pasa a autenticación.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Se ha producido un error al actualizar el recurso", "resourcesErrorUpdateDescription": "Se ha producido un error al actualizar el recurso",
"access": "Acceder", "access": "Acceder",
"accessControl": "Control de acceso", "accessControl": "Control de acceso",
"shareLink": "Enlace Compartible de {resource}", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Seleccionar recurso", "resourceSelect": "Seleccionar recurso",
"shareLinks": "Enlaces Compartibles", "shareLinks": "Shareable Links",
"share": "Enlaces compartibles", "share": "Enlaces compartibles",
"shareDescription2": "Crea enlaces compartidos a recursos. Los enlaces proporcionan acceso temporal o ilimitado a tu recurso. Puede configurar la duración de caducidad del enlace cuando cree uno.", "shareDescription2": "Crea enlaces compartidos a recursos. Los enlaces proporcionan acceso temporal o ilimitado a tu recurso. Puede configurar la duración de caducidad del enlace cuando cree uno.",
"shareEasyCreate": "Fácil de crear y compartir", "shareEasyCreate": "Fácil de crear y compartir",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Los administradores siempre pueden acceder a este recurso.", "resourceRoleDescription": "Los administradores siempre pueden acceder a este recurso.",
"resourcePolicySelectTitle": "Política de Acceso a Recursos", "resourcePolicySelectTitle": "Política de Acceso a Recursos",
"resourcePolicySelectDescription": "Seleccione el tipo de política de recursos para la autenticación", "resourcePolicySelectDescription": "Seleccione el tipo de política de recursos para la autenticación",
"resourcePolicyTypeLabel": "Tipo de política", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Política de recurso", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Política de Recursos Integrada", "resourcePolicyInline": "Política de Recursos Integrada",
"resourcePolicyInlineDescription": "Política de Acceso solo destinada a este recurso", "resourcePolicyInlineDescription": "Política de Acceso solo destinada a este recurso",
"resourcePolicyShared": "Política de Recursos Compartida", "resourcePolicyShared": "Política de Recursos Compartida",
"resourcePolicySharedDescription": "Este recurso utiliza una política compartida.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Política Compartida", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Este recurso tiene su propia política.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Este recurso tiene sus propios controles de autenticación y reglas de acceso.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Este recurso hereda de <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Este recurso está usando una política compartida. Algunas configuraciones de autenticación se pueden editar en este recurso para añadirse a la política. Para cambiar la política subyacente, debes editar a <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Este recurso está utilizando una política compartida. Algunas reglas de acceso se pueden editar en este recurso. Para cambiar la política subyacente, debes editar <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Controles de acceso", "resourceUsersRoles": "Controles de acceso",
"resourceUsersRolesDescription": "Configurar qué usuarios y roles pueden visitar este recurso", "resourceUsersRolesDescription": "Configurar qué usuarios y roles pueden visitar este recurso",
"resourceUsersRolesSubmit": "Guardar controles de acceso", "resourceUsersRolesSubmit": "Guardar controles de acceso",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Visibilidad", "resourceVisibilityTitle": "Visibilidad",
"resourceVisibilityTitleDescription": "Activar o desactivar completamente la visibilidad de los recursos", "resourceVisibilityTitleDescription": "Activar o desactivar completamente la visibilidad de los recursos",
"resourceGeneral": "Configuración General", "resourceGeneral": "Configuración General",
"resourceGeneralDescription": "Configurar nombre, dirección y política de acceso para este recurso.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Detalles del Recurso", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Establecer el nombre de visualización, identificador y dominio públicamente accesible para este recurso.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Establecer el nombre de visualización, identificador y puerto público para este recurso.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Dirección Pública", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Configura cómo los usuarios acceden a este recurso.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Autenticación y Acceso", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Elige si este recurso utiliza su propia política o hereda de una política compartida.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Activar recurso", "resourceEnable": "Activar recurso",
"resourceTransfer": "Transferir recursos", "resourceTransfer": "Transferir recursos",
"resourceTransferDescription": "Transferir este recurso a un sitio diferente", "resourceTransferDescription": "Transferir este recurso a un sitio diferente",
@@ -1294,14 +1293,14 @@
"addLabels": "Agregar etiquetas", "addLabels": "Agregar etiquetas",
"siteLabelsTab": "Etiquetas", "siteLabelsTab": "Etiquetas",
"siteLabelsDescription": "Administrar las etiquetas asociadas con este sitio.", "siteLabelsDescription": "Administrar las etiquetas asociadas con este sitio.",
"labelsNotFound": "No se encontraron etiquetas.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Empieza a escribir arriba para crear una etiqueta.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Buscar etiquetas", "labelSearch": "Buscar etiquetas",
"labelSearchOrCreate": "Buscar o crear una etiqueta", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# etiqueta} other {# etiquetas}}", "accessLabelFilterCount": "{count, plural, one {# etiqueta} other {# etiquetas}}",
"labelOverflowCount": "+{count, plural, one {# etiqueta} other {# etiquetas}}", "labelOverflowCount": "+{count, plural, one {# etiqueta} other {# etiquetas}}",
"accessLabelFilterClear": "Borrar filtros de etiquetas", "accessLabelFilterClear": "Borrar filtros de etiquetas",
"accessFilterClear": "Limpiar filtros", "accessFilterClear": "Clear filters",
"selectColor": "Seleccionar color", "selectColor": "Seleccionar color",
"createNewLabel": "Crear nueva etiqueta de organización \"{label}\"", "createNewLabel": "Crear nueva etiqueta de organización \"{label}\"",
"inviteInvalidDescription": "El enlace de invitación no es válido.", "inviteInvalidDescription": "El enlace de invitación no es válido.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Recursos", "sidebarResources": "Recursos",
"sidebarProxyResources": "Público", "sidebarProxyResources": "Público",
"sidebarClientResources": "Privado", "sidebarClientResources": "Privado",
"sidebarPolicies": "Políticas Compartidas", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Recursos Públicos", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Control de acceso", "sidebarAccessControl": "Control de acceso",
"sidebarLogsAndAnalytics": "Registros y análisis", "sidebarLogsAndAnalytics": "Registros y análisis",
"sidebarTeam": "Equipo", "sidebarTeam": "Equipo",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Admin", "sidebarAdmin": "Admin",
"sidebarInvitations": "Invitaciones", "sidebarInvitations": "Invitaciones",
"sidebarRoles": "Roles", "sidebarRoles": "Roles",
"sidebarShareableLinks": "Enlaces Compartibles", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "Claves API", "sidebarApiKeys": "Claves API",
"sidebarProvisioning": "Aprovisionamiento", "sidebarProvisioning": "Aprovisionamiento",
"sidebarSettings": "Ajustes", "sidebarSettings": "Ajustes",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Recurso {id}", "standaloneHcFilterResourceIdFallback": "Recurso {id}",
"blueprints": "Planos", "blueprints": "Planos",
"blueprintsLog": "Registro de planos", "blueprintsLog": "Registro de planos",
"blueprintsDescription": "Ver aplicaciones de planos anteriores y sus resultados o aplicar un nuevo plano", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Añadir plano", "blueprintAdd": "Añadir plano",
"blueprintGoBack": "Ver todos los Planos", "blueprintGoBack": "Ver todos los Planos",
"blueprintCreate": "Crear Plano", "blueprintCreate": "Crear Plano",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Habilitar Plano Docker", "enableDockerSocket": "Habilitar Plano Docker",
"enableDockerSocketDescription": "Activar el raspado de etiquetas del socket Docker para etiquetas de planos. La ruta del socket debe proporcionarse al conector del sitio. Lea sobre cómo funciona esto en <docsLink>la documentación</docsLink>.", "enableDockerSocketDescription": "Activar el raspado de etiquetas del socket Docker para etiquetas de planos. La ruta del socket debe proporcionarse al conector del sitio. Lea sobre cómo funciona esto en <docsLink>la documentación</docsLink>.",
"newtAutoUpdate": "Habilitar actualización automática del sitio", "newtAutoUpdate": "Habilitar actualización automática del sitio",
"newtAutoUpdateDescription": "Cuando está habilitado, los conectores del sitio descargarán automáticamente la última versión y se reiniciarán. Esto se puede anular por sitio.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Actualización automática del sitio", "siteAutoUpdate": "Actualización automática del sitio",
"siteAutoUpdateLabel": "Habilitar actualización automática", "siteAutoUpdateLabel": "Habilitar actualización automática",
"siteAutoUpdateDescription": "Cuando está habilitado, el conector de este sitio descargará automáticamente la última versión y se reiniciará.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Predeterminado de la organización: {state}", "siteAutoUpdateOrgDefault": "Predeterminado de la organización: {state}",
"siteAutoUpdateOverriding": "Configuración de anulación de la organización", "siteAutoUpdateOverriding": "Configuración de anulación de la organización",
"siteAutoUpdateResetToOrg": "Restablecer al predeterminado de la organización", "siteAutoUpdateResetToOrg": "Restablecer al predeterminado de la organización",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "¡Configuración de cuenta completada! ¡Bienvenido a Pangolin!", "accountSetupSuccess": "¡Configuración de cuenta completada! ¡Bienvenido a Pangolin!",
"documentation": "Documentación", "documentation": "Documentación",
"saveAllSettings": "Guardar todos los ajustes", "saveAllSettings": "Guardar todos los ajustes",
"saveResourceTargets": "Guardar ajustes", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Guardar ajustes", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Guardar ajustes", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Ajustes actualizados", "settingsUpdated": "Ajustes actualizados",
"settingsUpdatedDescription": "Configuraciones actualizadas correctamente", "settingsUpdatedDescription": "Configuraciones actualizadas correctamente",
"settingsErrorUpdate": "Error al actualizar ajustes", "settingsErrorUpdate": "Error al actualizar ajustes",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Desconocido", "healthCheckUnknown": "Desconocido",
"healthCheck": "Chequeo de salud", "healthCheck": "Chequeo de salud",
"configureHealthCheck": "Configurar Chequeo de Salud", "configureHealthCheck": "Configurar Chequeo de Salud",
"configureHealthCheckDescription": "Configura la monitorización para tu recurso para asegurarte que siempre está disponible", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Activar Chequeos de Salud", "enableHealthChecks": "Activar Chequeos de Salud",
"healthCheckDisabledStateDescription": "Cuando está deshabilitado, el sitio no realizará comprobaciones de salud y el estado se considerará desconocido.", "healthCheckDisabledStateDescription": "Cuando está deshabilitado, el sitio no realizará comprobaciones de salud y el estado se considerará desconocido.",
"enableHealthChecksDescription": "Controlar la salud de este objetivo. Puedes supervisar un punto final diferente al objetivo si es necesario.", "enableHealthChecksDescription": "Controlar la salud de este objetivo. Puedes supervisar un punto final diferente al objetivo si es necesario.",
"healthScheme": "Método", "healthScheme": "Método",
"healthSelectScheme": "Seleccionar método", "healthSelectScheme": "Seleccionar método",
"healthCheckPortInvalid": "El puerto debe estar entre 1 y 65535", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Ruta", "healthCheckPath": "Ruta",
"healthHostname": "IP / Nombre del host", "healthHostname": "IP / Nombre del host",
"healthPort": "Puerto", "healthPort": "Puerto",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Requiere aprobaciones del dispositivo", "requireDeviceApproval": "Requiere aprobaciones del dispositivo",
"requireDeviceApprovalDescription": "Los usuarios con este rol necesitan nuevos dispositivos aprobados por un administrador antes de poder conectarse y acceder a los recursos.", "requireDeviceApprovalDescription": "Los usuarios con este rol necesitan nuevos dispositivos aprobados por un administrador antes de poder conectarse y acceder a los recursos.",
"sshSettings": "Configuración SSH", "sshSettings": "Configuración SSH",
"sshAccess": "Acceso SSH", "sshAccess": "SSH Access",
"rdpSettings": "Configuración RDP", "rdpSettings": "Configuración RDP",
"vncSettings": "Configuración VNC", "vncSettings": "Configuración VNC",
"sshServer": "Servidor SSH", "sshServer": "Servidor SSH",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Asegúrese de que su host objetivo esté correctamente configurado para ejecutar el daemon de autenticación antes de completar esta configuración, o la provisión fallará.", "sshDaemonDisclaimer": "Asegúrese de que su host objetivo esté correctamente configurado para ejecutar el daemon de autenticación antes de completar esta configuración, o la provisión fallará.",
"sshDaemonPort": "Puerto del Daemon", "sshDaemonPort": "Puerto del Daemon",
"sshServerDestination": "Destino del Servidor", "sshServerDestination": "Destino del Servidor",
"sshServerDestinationDescription": "Configurar el destino del servidor SSH", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Destino", "destination": "Destino",
"destinationRequired": "Se requiere destino.", "destinationRequired": "Destination is required.",
"domainRequired": "Se requiere dominio.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Se requiere puerto.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Configuración de ruta no válida.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Configuración de ruta de reescritura no válida.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Seleccionar múltiples sitios permite el enrutamiento resiliente y el failover para alta disponibilidad.", "bgTargetMultiSiteDisclaimer": "Seleccionar múltiples sitios permite el enrutamiento resiliente y el failover para alta disponibilidad.",
"roleAllowSsh": "Permitir SSH", "roleAllowSsh": "Permitir SSH",
"roleAllowSshAllow": "Permitir", "roleAllowSshAllow": "Permitir",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "El usuario sólo puede ejecutar los comandos especificados con sudo.", "sshSudoModeCommandsDescription": "El usuario sólo puede ejecutar los comandos especificados con sudo.",
"sshSudo": "Permitir sudo", "sshSudo": "Permitir sudo",
"sshSudoCommands": "Comandos Sudo", "sshSudoCommands": "Comandos Sudo",
"sshSudoCommandsDescription": "Lista de comandos que el usuario tiene permitido ejecutar con sudo, separados por comas, espacios o nuevas líneas. Se deben usar rutas absolutas.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Crear directorio principal", "sshCreateHomeDir": "Crear directorio principal",
"sshUnixGroups": "Grupos Unix", "sshUnixGroups": "Grupos Unix",
"sshUnixGroupsDescription": "Grupos Unix a los que añadir el usuario en el host de destino, separados por comas, espacios o nuevas líneas.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Introduce valores, o suelta un archivo .txt o .csv", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Importar desde Archivo", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Importando {fileName} en {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Omitir Primera Fila (Encabezado)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Reemplazar Existente", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Añadir al Existente", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Modo de Importación", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Previsualizar", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {No hay elementos para importar} one {1 elemento para importar} other {# elementos para importar}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} existentes + {imported} importados = {total} total", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Importar", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Tipo de archivo no soportado", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Sólo se soportan archivos .txt y .csv.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "No se encontraron elementos en el archivo", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "El archivo no contiene ningún elemento importable.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Intentos de Reintento", "retryAttempts": "Intentos de Reintento",
"expectedResponseCodes": "Códigos de respuesta esperados", "expectedResponseCodes": "Códigos de respuesta esperados",
"expectedResponseCodesDescription": "Código de estado HTTP que indica un estado saludable. Si se deja en blanco, se considera saludable de 200 a 300.", "expectedResponseCodesDescription": "Código de estado HTTP que indica un estado saludable. Si se deja en blanco, se considera saludable de 200 a 300.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Habilitar protocolo proxy", "enableProxyProtocol": "Habilitar protocolo proxy",
"proxyProtocolInfo": "Conservar direcciones IP del cliente para backends TCP", "proxyProtocolInfo": "Conservar direcciones IP del cliente para backends TCP",
"proxyProtocolVersion": "Versión del Protocolo Proxy", "proxyProtocolVersion": "Versión del Protocolo Proxy",
"version1": "Versión 1 (Recomendada)", "version1": "Version 1 (Recommended)",
"version2": "Versión 2", "version2": "Versión 2",
"version1Description": "Basado en texto y ampliamente compatible. Asegúrate de que el transporte de servidores está agregado a la configuración dinámica.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Binario y más eficiente, pero menos compatible. Asegúrate de que el transporte de servidores está agregado a la configuración dinámica.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Advertencia", "warning": "Advertencia",
"proxyProtocolWarning": "La aplicación backend debe configurarse para aceptar conexiones Proxy Protocol. Si el backend no soporta Proxy Protocol, activarlo romperá todas las conexiones, así que sólo habilítelo si sabe lo que está haciendo. Asegúrese de configurar su backend para que confíe en las cabeceras del protocolo Proxy de Traefik.", "proxyProtocolWarning": "La aplicación backend debe configurarse para aceptar conexiones Proxy Protocol. Si el backend no soporta Proxy Protocol, activarlo romperá todas las conexiones, así que sólo habilítelo si sabe lo que está haciendo. Asegúrese de configurar su backend para que confíe en las cabeceras del protocolo Proxy de Traefik.",
"restarting": "Reiniciando...", "restarting": "Reiniciando...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Ingresar confirmación", "enterConfirmation": "Ingresar confirmación",
"blueprintViewDetails": "Detalles", "blueprintViewDetails": "Detalles",
"defaultIdentityProvider": "Proveedor de identidad predeterminado", "defaultIdentityProvider": "Proveedor de identidad predeterminado",
"defaultIdentityProviderDescription": "El usuario será redirigido automáticamente a este proveedor de identidad para autenticación.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Configuración de red", "editInternalResourceDialogNetworkSettings": "Configuración de red",
"editInternalResourceDialogAccessPolicy": "Política de acceso", "editInternalResourceDialogAccessPolicy": "Política de acceso",
"editInternalResourceDialogAddRoles": "Agregar roles", "editInternalResourceDialogAddRoles": "Agregar roles",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Tipo de modo de mantenimiento", "maintenanceModeType": "Tipo de modo de mantenimiento",
"showMaintenancePage": "Mostrar página de mantenimiento a los visitantes", "showMaintenancePage": "Mostrar página de mantenimiento a los visitantes",
"enableMaintenanceMode": "Habilitar modo de mantenimiento", "enableMaintenanceMode": "Habilitar modo de mantenimiento",
"enableMaintenanceModeDescription": "Cuando esté habilitado, los visitantes verán una página de mantenimiento en lugar de tu recurso.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automático", "automatic": "Automático",
"automaticModeDescription": "Mostrar página de mantenimiento solo cuando todos los objetivos de backend están caídos o no saludables. Su recurso continúa funcionando normalmente siempre que al menos un objetivo esté saludable.", "automaticModeDescription": "Mostrar página de mantenimiento solo cuando todos los objetivos de backend están caídos o no saludables. Su recurso continúa funcionando normalmente siempre que al menos un objetivo esté saludable.",
"forced": "Forzado", "forced": "Forzado",
@@ -3182,8 +3181,8 @@
"warning:": "Advertencia:", "warning:": "Advertencia:",
"forcedeModeWarning": "Todo el tráfico será dirigido a la página de mantenimiento. Sus recursos de backend no recibirán solicitudes.", "forcedeModeWarning": "Todo el tráfico será dirigido a la página de mantenimiento. Sus recursos de backend no recibirán solicitudes.",
"pageTitle": "Título de la página", "pageTitle": "Título de la página",
"maintenancePageContentSubsection": "Contenido de la Página", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Personaliza el contenido mostrado en la página de mantenimiento", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "El encabezado principal visible en la página de mantenimiento", "pageTitleDescription": "El encabezado principal visible en la página de mantenimiento",
"maintenancePageMessage": "Mensaje de mantenimiento", "maintenancePageMessage": "Mensaje de mantenimiento",
"maintenancePageMessagePlaceholder": "¡Volveremos pronto! Nuestro sitio está actualmente en mantenimiento programado.", "maintenancePageMessagePlaceholder": "¡Volveremos pronto! Nuestro sitio está actualmente en mantenimiento programado.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "¿Está seguro de que desea desasociar este proveedor de identidad de esta organización?", "idpUnassociateQuestion": "¿Está seguro de que desea desasociar este proveedor de identidad de esta organización?",
"idpUnassociateDescription": "Todos los usuarios asociados con este proveedor de identidad serán eliminados de esta organización, pero el proveedor de identidad continuará existiendo para otras organizaciones asociadas.", "idpUnassociateDescription": "Todos los usuarios asociados con este proveedor de identidad serán eliminados de esta organización, pero el proveedor de identidad continuará existiendo para otras organizaciones asociadas.",
"idpUnassociateConfirm": "Confirme Desasociar Proveedor de Identidad", "idpUnassociateConfirm": "Confirme Desasociar Proveedor de Identidad",
"idpConfirmDeleteAndRemoveMeFromOrg": "ELIMINAR Y QUITARME DE ORG", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "DESASOCIAR Y QUITARME DE ORG", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Esto no se puede deshacer para esta organización.", "idpUnassociateWarning": "Esto no se puede deshacer para esta organización.",
"idpUnassociatedDescription": "Proveedor de identidad desasociado de esta organización con éxito", "idpUnassociatedDescription": "Proveedor de identidad desasociado de esta organización con éxito",
"idpUnassociateMenu": "Desasociar", "idpUnassociateMenu": "Desasociar",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Conectando…", "sshConnecting": "Conectando…",
"sshInitializing": "Inicializando…", "sshInitializing": "Inicializando…",
"sshSignInTitle": "Iniciar sesión en SSH", "sshSignInTitle": "Iniciar sesión en SSH",
"sshSignInDescription": "Ingresa tus credenciales SSH para conectar", "sshSignInDescription": "Ingrese sus credenciales SSH",
"sshPasswordTab": "Contraseña", "sshPasswordTab": "Contraseña",
"sshPrivateKeyTab": "Clave Privada", "sshPrivateKeyTab": "Clave Privada",
"sshPrivateKeyField": "Clave Privada", "sshPrivateKeyField": "Clave Privada",
"sshPrivateKeyDisclaimer": "Su clave privada no se almacena ni es visible para Pangolin. Alternativamente, puede usar certificados de corta duración para una autenticación sin interrupciones usando su identidad Pangolin existente.", "sshPrivateKeyDisclaimer": "Su clave privada no se almacena ni es visible para Pangolin. Alternativamente, puede usar certificados de corta duración para una autenticación sin interrupciones usando su identidad Pangolin existente.",
"sshLearnMore": "Más información", "sshLearnMore": "Más información",
"sshPrivateKeyFile": "Archivo de clave privada", "sshPrivateKeyFile": "Archivo de clave privada",
"sshAuthenticate": "Conectar", "sshAuthenticate": "Autenticarse",
"sshTerminate": "Terminar", "sshTerminate": "Terminar",
"sshPoweredBy": "Desarrollado por", "sshPoweredBy": "Desarrollado por",
"sshErrorNoTarget": "No se especificó el objetivo", "sshErrorNoTarget": "No se especificó el objetivo",
"sshErrorWebSocket": "Conexión WebSocket fallida", "sshErrorWebSocket": "Conexión WebSocket fallida",
"sshErrorAuthFailed": "Falló la autenticación", "sshErrorAuthFailed": "Falló la autenticación",
"sshErrorConnectionClosed": "La conexión se cerró antes de completar la autenticación", "sshErrorConnectionClosed": "La conexión se cerró antes de completar la autenticación",
"sitePangolinSshDescription": "Permitir acceso SSH a los recursos en este sitio. Esto se puede cambiar más tarde.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "No se encontró un recurso para este dominio", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Sin destino", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Conectar", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Error al firmar la clave SSH para autenticación PAM push. ¿Te has iniciado sesión como usuario?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Error: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Conexión cerrada (código {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----COMIENZO DE LA CLAVE PRIVADA OPENSSH-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Se requiere clave privada", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Introduce tu contraseña VNC para conectar", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Contraseña (opcional)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "No hay objetivo de recurso disponible", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Error al cargar noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Estado {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Pegar portapapeles", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Iniciar sesión en el Escritorio Remoto", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Introduce las credenciales de Windows para conectar", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Cargando módulo...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Error al cargar el módulo RDP", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "No está listo", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "El módulo RDP aún se está iniciando", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Descargando {count} archivo(s) del remoto…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Error al descargar: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Subido: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "No hay objetivo de conexión disponible", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Conexión fallida", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Ajustar", "rdpFit": "Fit",
"rdpFull": "Completo", "rdpFull": "Full",
"rdpReal": "Real", "rdpReal": "Real",
"rdpMeta": "Meta", "rdpMeta": "Meta",
"rdpUploadFiles": "Subir archivos", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Archivos listos para pegar", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count, plural, one {# archivo copiado al portapapeles remoto — pulsa Ctrl+V en el escritorio remoto para pegar.} other {# archivos copiados al portapapeles remoto — pulsa Ctrl+V en el escritorio remoto para pegar.}}", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Error de subida", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Modo teclado Unicode", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Mostrar barra de herramientas", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Ocultar barra de herramientas" "sessionToolbarHide": "Hide toolbar"
} }
+186 -187
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Voir les ressources privées", "sitesTableViewPrivateResources": "Voir les ressources privées",
"siteInstallNewt": "Installer Newt", "siteInstallNewt": "Installer Newt",
"siteInstallNewtDescription": "Faites fonctionner Newt sur votre système", "siteInstallNewtDescription": "Faites fonctionner Newt sur votre système",
"siteInstallKubernetesDocsDescription": "Pour plus d'informations à jour sur l'installation de Kubernetes, consultez <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Pour les instructions d'installation du modem Advantech, voir <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "Configuration WireGuard", "WgConfiguration": "Configuration WireGuard",
"WgConfigurationDescription": "Utilisez la configuration suivante pour vous connecter au réseau", "WgConfigurationDescription": "Utilisez la configuration suivante pour vous connecter au réseau",
"operatingSystem": "Système d'exploitation", "operatingSystem": "Système d'exploitation",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Vous ne pourrez voir cela qu'une seule fois. Assurez-vous de l'enregistrer dans un endroit sécurisé.", "siteCredentialsSaveDescription": "Vous ne pourrez voir cela qu'une seule fois. Assurez-vous de l'enregistrer dans un endroit sécurisé.",
"siteInfo": "Informations du nœud", "siteInfo": "Informations du nœud",
"status": "Statut", "status": "Statut",
"shareTitle": "Gérer les liens partageables", "shareTitle": "Manage Shareable Links",
"shareDescription": "Créez des liens partageables pour accorder un accès temporaire ou permanent aux ressources de proxy", "shareDescription": "Créez des liens partageables pour accorder un accès temporaire ou permanent aux ressources de proxy",
"shareSearch": "Rechercher des liens partageables...", "shareSearch": "Search shareable links...",
"shareCreate": "Créer un lien partageable", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Impossible de supprimer le lien", "shareErrorDelete": "Impossible de supprimer le lien",
"shareErrorDeleteMessage": "Une erreur s'est produite lors de la suppression du lien", "shareErrorDeleteMessage": "Une erreur s'est produite lors de la suppression du lien",
"shareDeleted": "Lien supprimé", "shareDeleted": "Lien supprimé",
"shareDeletedDescription": "Le lien a été supprimé", "shareDeletedDescription": "Le lien a été supprimé",
"shareDelete": "Supprimer le lien partageable", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Confirmer la suppression du lien partageable", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Êtes-vous sûr de vouloir supprimer ce lien de partage ?", "shareQuestionRemove": "Êtes-vous sûr de vouloir supprimer ce lien de partage ?",
"shareMessageRemove": "Une fois supprimé, le lien ne fonctionnera plus et toute personne l'utilisant perdra l'accès à la ressource.", "shareMessageRemove": "Une fois supprimé, le lien ne fonctionnera plus et toute personne l'utilisant perdra l'accès à la ressource.",
"shareTokenDescription": "Le jeton d'accès peut être passé de deux façons : en tant que paramètre de requête ou dans les en-têtes de la requête. Elles doivent être transmises par le client à chaque demande d'accès authentifié.", "shareTokenDescription": "Le jeton d'accès peut être passé de deux façons : en tant que paramètre de requête ou dans les en-têtes de la requête. Elles doivent être transmises par le client à chaque demande d'accès authentifié.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "N'importe qui avec ce lien peut accéder à la ressource", "shareCreateDescription": "N'importe qui avec ce lien peut accéder à la ressource",
"shareTitleOptional": "Titre (facultatif)", "shareTitleOptional": "Titre (facultatif)",
"sharePathOptional": "Chemin (optionnel)", "sharePathOptional": "Chemin (optionnel)",
"sharePathDescription": "Le lien redirigera les utilisateurs vers ce chemin après l'authentification.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Expire dans", "expireIn": "Expire dans",
"neverExpire": "N'expire jamais", "neverExpire": "N'expire jamais",
"shareExpireDescription": "Le délai d'expiration correspond à la période pendant laquelle le lien sera utilisable et permettra d'accéder à la ressource. Passé ce délai, le lien ne fonctionnera plus et les utilisateurs qui l'ont utilisé perdront l'accès à la ressource.", "shareExpireDescription": "Le délai d'expiration correspond à la période pendant laquelle le lien sera utilisable et permettra d'accéder à la ressource. Passé ce délai, le lien ne fonctionnera plus et les utilisateurs qui l'ont utilisé perdront l'accès à la ressource.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Veuillez sélectionner une ressource", "shareErrorSelectResource": "Veuillez sélectionner une ressource",
"proxyResourceTitle": "Gérer les ressources publiques", "proxyResourceTitle": "Gérer les ressources publiques",
"proxyResourceDescription": "Créer et gérer des ressources accessibles au public via un navigateur web", "proxyResourceDescription": "Créer et gérer des ressources accessibles au public via un navigateur web",
"publicResourcesBannerTitle": "Accès public basé sur le Web", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Les ressources publiques sont des proxys HTTPS accessibles à quiconque sur Internet via un navigateur Web. Contrairement aux ressources privées, elles ne nécessitent pas de logiciel côté client et peuvent inclure des politiques d'accès fondées sur l'identité et le contexte.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Gérer les ressources privées", "clientResourceTitle": "Gérer les ressources privées",
"clientResourceDescription": "Créer et gérer des ressources qui ne sont accessibles que via un client connecté", "clientResourceDescription": "Créer et gérer des ressources qui ne sont accessibles que via un client connecté",
"privateResourcesBannerTitle": "Accès privé sans confiance", "privateResourcesBannerTitle": "Accès privé sans confiance",
@@ -212,19 +212,18 @@
"resourcesSearch": "Chercher des ressources...", "resourcesSearch": "Chercher des ressources...",
"resourceAdd": "Ajouter une ressource", "resourceAdd": "Ajouter une ressource",
"resourceErrorDelte": "Erreur lors de la de suppression de la ressource", "resourceErrorDelte": "Erreur lors de la de suppression de la ressource",
"resourcePoliciesBannerTitle": "Réutiliser les règles d'authentification et d'accès", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Les politiques de ressources partagées vous permettent de définir des méthodes d'authentification et des règles d'accès une fois, puis de les attacher à plusieurs ressources publiques. Lorsque vous mettez à jour une politique, chaque ressource liée hérite automatiquement des changements.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "En Savoir Plus", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Gérer les politiques de ressources publiques", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Ressources",
"resourcePoliciesAttachedResources": "{count} ressource(s)", "resourcePoliciesAttachedResources": "{count} ressource(s)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# ressource} other {# ressources}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "pas de ressources", "resourcePoliciesAttachedResourcesEmpty": "pas de ressources",
"resourcePoliciesDescription": "Créez et gérer les politiques d'authentification pour contrôler l'accès à vos ressources publiques", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Chercher des politiques...", "resourcePoliciesSearch": "Chercher des politiques...",
"resourcePoliciesAdd": "Ajouter une politique", "resourcePoliciesAdd": "Ajouter une politique",
"resourcePoliciesDefaultBadgeText": "Politique par défaut", "resourcePoliciesDefaultBadgeText": "Politique par défaut",
"resourcePoliciesCreate": "Créer une politique de ressource publique", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Suivez les étapes ci-dessous pour créer une nouvelle politique", "resourcePoliciesCreateDescription": "Suivez les étapes ci-dessous pour créer une nouvelle politique",
"resourcePolicyName": "Nom de la politique", "resourcePolicyName": "Nom de la politique",
"resourcePolicyNameDescription": "Donnez à cette politique un nom pour l'identifier parmi vos ressources", "resourcePolicyNameDescription": "Donnez à cette politique un nom pour l'identifier parmi vos ressources",
@@ -281,7 +280,7 @@
"back": "Précédent", "back": "Précédent",
"cancel": "Abandonner", "cancel": "Abandonner",
"resourceConfig": "Snippets de configuration", "resourceConfig": "Snippets de configuration",
"resourceConfigDescription": "Copiez et collez ces extraits de configuration pour configurer la ressource TCP/UDP.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Ajouter des points d'entrée", "resourceAddEntrypoints": "Traefik: Ajouter des points d'entrée",
"resourceExposePorts": "Gerbil: Exposer des ports dans Docker Compose", "resourceExposePorts": "Gerbil: Exposer des ports dans Docker Compose",
"resourceLearnRaw": "Apprenez à configurer les ressources TCP/UDP", "resourceLearnRaw": "Apprenez à configurer les ressources TCP/UDP",
@@ -294,8 +293,8 @@
"labelDelete": "Supprimer Étiquette", "labelDelete": "Supprimer Étiquette",
"labelAdd": "Ajouter Étiquette", "labelAdd": "Ajouter Étiquette",
"labelCreateSuccessMessage": "Étiquette créée avec succès", "labelCreateSuccessMessage": "Étiquette créée avec succès",
"labelDuplicateError": "Étiquette en double", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Une étiquette avec ce nom existe déjà.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Étiquette modifiée avec succès", "labelEditSuccessMessage": "Étiquette modifiée avec succès",
"labelNameField": "Nom de l'étiquette", "labelNameField": "Nom de l'étiquette",
"labelColorField": "Couleur de l'étiquette", "labelColorField": "Couleur de l'étiquette",
@@ -320,7 +319,7 @@
"rules": "Règles", "rules": "Règles",
"resourceSettingDescription": "Configurer les paramètres de la ressource", "resourceSettingDescription": "Configurer les paramètres de la ressource",
"resourceSetting": "Réglages de {resourceName}", "resourceSetting": "Réglages de {resourceName}",
"resourcePolicySettingDescription": "Configurez les paramètres de cette politique de ressource publique", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "Paramètres de {policyName}", "resourcePolicySetting": "Paramètres de {policyName}",
"alwaysAllow": "Outrepasser l'authentification", "alwaysAllow": "Outrepasser l'authentification",
"alwaysDeny": "Bloquer l'accès", "alwaysDeny": "Bloquer l'accès",
@@ -728,7 +727,7 @@
"targetSubmit": "Ajouter une cible", "targetSubmit": "Ajouter une cible",
"targetNoOne": "Cette ressource n'a aucune cible. Ajoutez une cible pour configurer où envoyer des requêtes à l'arrière-plan.", "targetNoOne": "Cette ressource n'a aucune cible. Ajoutez une cible pour configurer où envoyer des requêtes à l'arrière-plan.",
"targetNoOneDescription": "L'ajout de plus d'une cible ci-dessus activera l'équilibrage de charge.", "targetNoOneDescription": "L'ajout de plus d'une cible ci-dessus activera l'équilibrage de charge.",
"targetsSubmit": "Enregistrer les paramètres", "targetsSubmit": "Save Settings",
"addTarget": "Ajouter une cible", "addTarget": "Ajouter une cible",
"proxyMultiSiteRoundRobinNodeHelp": "Le routage en tourniquet n'opérera pas entre des sites qui ne sont pas connectés au même nœud, mais le basculement fonctionnera.", "proxyMultiSiteRoundRobinNodeHelp": "Le routage en tourniquet n'opérera pas entre des sites qui ne sont pas connectés au même nœud, mais le basculement fonctionnera.",
"targetErrorInvalidIp": "Adresse IP invalide", "targetErrorInvalidIp": "Adresse IP invalide",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Règle en double", "rulesErrorDuplicate": "Règle en double",
"rulesErrorDuplicateDescription": "Une règle avec ces paramètres existe déjà", "rulesErrorDuplicateDescription": "Une règle avec ces paramètres existe déjà",
"rulesErrorInvalidIpAddressRange": "CIDR invalide", "rulesErrorInvalidIpAddressRange": "CIDR invalide",
"rulesErrorInvalidIpAddressRangeDescription": "Entrez une plage CIDR valide (par ex., 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Chemin non valide", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Entrez un chemin URL valide ou un modèle (par exemple, /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Adresse IP invalide", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Entrez une adresse IPv4 ou IPv6 valide.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Échec de la mise à jour des règles", "rulesErrorUpdate": "Échec de la mise à jour des règles",
"rulesErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour des règles", "rulesErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour des règles",
"rulesUpdated": "Activer les règles", "rulesUpdated": "Activer les règles",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Entrez une adresse au format CIDR (ex: 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Entrez une adresse au format CIDR (ex: 103.21.244.0/22)",
"rulesMatchIpAddress": "Entrez une adresse IP (ex: 103.21.244.12)", "rulesMatchIpAddress": "Entrez une adresse IP (ex: 103.21.244.12)",
"rulesMatchUrl": "Entrez un chemin URL ou un motif (ex: /api/v1/todos ou /api/v1/*)", "rulesMatchUrl": "Entrez un chemin URL ou un motif (ex: /api/v1/todos ou /api/v1/*)",
"rulesErrorInvalidPriority": "Priorité invalide", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Entrez un nombre entier de 1 ou plus.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Priorités en double", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Chaque règle doit avoir un numéro de priorité unique.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Règles invalides", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Règle {ruleNumber} : {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Sélectionnez un type de correspondance valide (chemin, IP, CIDR, pays, région ou ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Entrez une valeur pour cette règle.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Pays invalide", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Sélectionnez un pays valide.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "ASN invalide", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Entrez un ASN valide (par exemple, AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Règles mises à jour", "ruleUpdated": "Règles mises à jour",
"ruleUpdatedDescription": "Règles mises à jour avec succès", "ruleUpdatedDescription": "Règles mises à jour avec succès",
"ruleErrorUpdate": "L'opération a échoué", "ruleErrorUpdate": "L'opération a échoué",
"ruleErrorUpdateDescription": "Une erreur s'est produite lors de l'enregistrement", "ruleErrorUpdateDescription": "Une erreur s'est produite lors de l'enregistrement",
"rulesPriority": "Priorité", "rulesPriority": "Priorité",
"rulesReorderDragHandle": "Faites glisser pour réorganiser la priorité des règles", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Action", "rulesAction": "Action",
"rulesMatchType": "Type de correspondance", "rulesMatchType": "Type de correspondance",
"value": "Valeur", "value": "Valeur",
@@ -810,7 +809,7 @@
"rulesResource": "Configuration des règles de ressource", "rulesResource": "Configuration des règles de ressource",
"rulesResourceDescription": "Configurer les règles pour contrôler l'accès à la ressource", "rulesResourceDescription": "Configurer les règles pour contrôler l'accès à la ressource",
"ruleSubmit": "Ajouter une règle", "ruleSubmit": "Ajouter une règle",
"rulesNoOne": "Aucune règle pour le moment.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Les règles sont évaluées par priorité dans l'ordre croissant.", "rulesOrder": "Les règles sont évaluées par priorité dans l'ordre croissant.",
"rulesSubmit": "Enregistrer les règles", "rulesSubmit": "Enregistrer les règles",
"policyErrorCreate": "Erreur lors de la création de la politique", "policyErrorCreate": "Erreur lors de la création de la politique",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Une erreur inattendue s'est produite", "policyErrorUpdateMessageDescription": "Une erreur inattendue s'est produite",
"policyCreatedSuccess": "Politique de ressource créée avec succès", "policyCreatedSuccess": "Politique de ressource créée avec succès",
"policyUpdatedSuccess": "Politique de ressource mise à jour avec succès", "policyUpdatedSuccess": "Politique de ressource mise à jour avec succès",
"authMethodsSave": "Enregistrer les paramètres", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Authentification", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Contrôlez quelles méthodes d'authentification sont nécessaires pour accéder à cette ressource", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Plusieurs méthodes d'authentification actives", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Les visiteurs peuvent s'authentifier en utilisant l'une des méthodes actives ci-dessous. Ils n'ont pas besoin de toutes les compléter.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Actif", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Éteint", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "SSO de la plateforme", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Exigez une connexion via le fournisseur d'identité de votre organisation", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} utilisateurs, {roles} rôles", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Fournisseur par défaut", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Ajouter un fournisseur d'identité par défaut", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Autres méthodes", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Des méthodes facultatives que les visiteurs peuvent utiliser à la place de ou en parallèle avec la SSO de la plateforme", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Code confidentiel", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Exiger un code confidentiel alphanumérique partagé pour accéder à la ressource", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Code confidentiel établi", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "Code PIN", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Un code numérique court requis pour accéder à la ressource", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "Code PIN à 6 chiffres établi", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "Liste blanche des e-mails", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Autorisez les adresses e-mail listées avec des mots de passe à usage unique", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} adresses autorisées", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Activer la liste blanche des e-mails envoie un mot de passe à usage unique à l'e-mail du visiteur lors de la connexion.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Authentification de l'en-tête de base", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Validez un nom et une valeur d'en-tête HTTP personnalisé à chaque requête", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "En-tête configuré", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Nom de l'en-tête", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Valeur attendue", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Définir le code confidentiel", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Définir le code PIN", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Définir la liste blanche des e-mails", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Configurer l'authentification des en-têtes de base", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Règles d'accès", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Lorsqu'elles sont activées, les règles sont évaluées dans l'ordre décroissant jusqu'à ce que l'une soit évaluée comme vraie.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Les règles sont évaluées de haut en bas. La première règle correspondante décide du résultat.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Les règles correspondent aux demandes par chemin, adresse IP, emplacement, ou d'autres critères. Chaque règle applique une action : contourner l'authentification, bloquer l'accès, ou passer à l'authentification. Si aucune règle ne correspond, le trafic continue jusqu'à l'authentification.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Lorsque les règles sont désactivées, tout le trafic passe par l'authentification.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Lorsqu'aucune règle ne correspond, le trafic passe par l'authentification.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour de la ressource", "resourcesErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour de la ressource",
"access": "Accès", "access": "Accès",
"accessControl": "Contrôle d'accès", "accessControl": "Contrôle d'accès",
"shareLink": "Lien de partage {resource}", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Sélectionner une ressource", "resourceSelect": "Sélectionner une ressource",
"shareLinks": "Liens partageables", "shareLinks": "Shareable Links",
"share": "Liens partageables", "share": "Liens partageables",
"shareDescription2": "Créez des liens partageables vers des ressources. Les liens fournissent un accès temporaire ou illimité à votre ressource. Vous pouvez configurer la durée d'expiration du lien lorsque vous en créez un.", "shareDescription2": "Créez des liens partageables vers des ressources. Les liens fournissent un accès temporaire ou illimité à votre ressource. Vous pouvez configurer la durée d'expiration du lien lorsque vous en créez un.",
"shareEasyCreate": "Facile à créer et à partager", "shareEasyCreate": "Facile à créer et à partager",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Les administrateurs peuvent toujours accéder à cette ressource.", "resourceRoleDescription": "Les administrateurs peuvent toujours accéder à cette ressource.",
"resourcePolicySelectTitle": "Politique d'accès à la ressource", "resourcePolicySelectTitle": "Politique d'accès à la ressource",
"resourcePolicySelectDescription": "Sélectionner le type de politique de ressource pour l'authentification", "resourcePolicySelectDescription": "Sélectionner le type de politique de ressource pour l'authentification",
"resourcePolicyTypeLabel": "Type de politique", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Politique de ressource", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Politique de ressource en ligne", "resourcePolicyInline": "Politique de ressource en ligne",
"resourcePolicyInlineDescription": "Politique d'accès limitée uniquement à cette ressource", "resourcePolicyInlineDescription": "Politique d'accès limitée uniquement à cette ressource",
"resourcePolicyShared": "Politique de ressource partagée", "resourcePolicyShared": "Politique de ressource partagée",
"resourcePolicySharedDescription": "Cette ressource utilise une politique partagée.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Politique partagée", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Cette ressource a sa propre politique.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Cette ressource a ses propres contrôles de règles d'authentification et d'accès.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Cette ressource hérite de <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Cette ressource utilise une politique partagée. Certains paramètres d'authentification peuvent être modifiés sur cette ressource pour ajouter à la politique. Pour changer la politique sous-jacente, vous devez éditer à <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Cette ressource utilise une politique partagée. Certaines règles d'accès peuvent être modifiées sur cette ressource. Pour changer la politique sous-jacente, vous devez éditer <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Contrôles d'accès", "resourceUsersRoles": "Contrôles d'accès",
"resourceUsersRolesDescription": "Configurer quels utilisateurs et rôles peuvent visiter cette ressource", "resourceUsersRolesDescription": "Configurer quels utilisateurs et rôles peuvent visiter cette ressource",
"resourceUsersRolesSubmit": "Enregistrer les contrôles d'accès", "resourceUsersRolesSubmit": "Enregistrer les contrôles d'accès",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Visibilité", "resourceVisibilityTitle": "Visibilité",
"resourceVisibilityTitleDescription": "Activer ou désactiver complètement la visibilité de la ressource", "resourceVisibilityTitleDescription": "Activer ou désactiver complètement la visibilité de la ressource",
"resourceGeneral": "Paramètres généraux", "resourceGeneral": "Paramètres généraux",
"resourceGeneralDescription": "Configurer le nom, l'adresse et la politique d'accès pour cette ressource.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Détails de la ressource", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Définir le nom d'affichage, l'identifiant et le domaine accessible publiquement pour cette ressource.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Définir le nom d'affichage, l'identifiant et le port public pour cette ressource.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Adresse publique", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Configurez comment les utilisateurs accèdent à cette ressource.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Authentification & Accès", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Choisissez si cette ressource utilise sa propre politique ou hérite d'une politique partagée.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Activer la ressource", "resourceEnable": "Activer la ressource",
"resourceTransfer": "Transférer la ressource", "resourceTransfer": "Transférer la ressource",
"resourceTransferDescription": "Transférer cette ressource vers un autre site", "resourceTransferDescription": "Transférer cette ressource vers un autre site",
@@ -1294,14 +1293,14 @@
"addLabels": "Ajouter des étiquettes", "addLabels": "Ajouter des étiquettes",
"siteLabelsTab": "Étiquettes", "siteLabelsTab": "Étiquettes",
"siteLabelsDescription": "Gérer les étiquettes associées à ce site.", "siteLabelsDescription": "Gérer les étiquettes associées à ce site.",
"labelsNotFound": "Aucune étiquette trouvée.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Commencez à taper ci-dessus pour créer une étiquette.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Chercher des étiquettes", "labelSearch": "Chercher des étiquettes",
"labelSearchOrCreate": "Recherchez ou créez une étiquette", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# étiquette} other {# étiquettes}}", "accessLabelFilterCount": "{count, plural, one {# étiquette} other {# étiquettes}}",
"labelOverflowCount": "+{count, plural, one {# étiquette} other {# étiquettes}}", "labelOverflowCount": "+{count, plural, one {# étiquette} other {# étiquettes}}",
"accessLabelFilterClear": "Effacer les filtres d'étiquette", "accessLabelFilterClear": "Effacer les filtres d'étiquette",
"accessFilterClear": "Effacer les filtres", "accessFilterClear": "Clear filters",
"selectColor": "Sélectionner la couleur", "selectColor": "Sélectionner la couleur",
"createNewLabel": "Créer une nouvelle étiquette d'organisation \"{label}\"", "createNewLabel": "Créer une nouvelle étiquette d'organisation \"{label}\"",
"inviteInvalidDescription": "Le lien d'invitation n'est pas valide.", "inviteInvalidDescription": "Le lien d'invitation n'est pas valide.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Ressource", "sidebarResources": "Ressource",
"sidebarProxyResources": "Publique", "sidebarProxyResources": "Publique",
"sidebarClientResources": "Privé", "sidebarClientResources": "Privé",
"sidebarPolicies": "Politiques partagées", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Ressources publiques", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Contrôle d'accès", "sidebarAccessControl": "Contrôle d'accès",
"sidebarLogsAndAnalytics": "Journaux & Analytiques", "sidebarLogsAndAnalytics": "Journaux & Analytiques",
"sidebarTeam": "Equipe", "sidebarTeam": "Equipe",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Administrateur", "sidebarAdmin": "Administrateur",
"sidebarInvitations": "Invitations", "sidebarInvitations": "Invitations",
"sidebarRoles": "Rôles", "sidebarRoles": "Rôles",
"sidebarShareableLinks": "Liens partageables", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "Clés API", "sidebarApiKeys": "Clés API",
"sidebarProvisioning": "Mise en place", "sidebarProvisioning": "Mise en place",
"sidebarSettings": "Réglages", "sidebarSettings": "Réglages",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Ressource {id}", "standaloneHcFilterResourceIdFallback": "Ressource {id}",
"blueprints": "Configs", "blueprints": "Configs",
"blueprintsLog": "Journal des plans", "blueprintsLog": "Journal des plans",
"blueprintsDescription": "Consultez les applications et leurs résultats de planches à dessin passées ou appliquez une nouvelle planche à dessin", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Ajouter une Config", "blueprintAdd": "Ajouter une Config",
"blueprintGoBack": "Voir toutes les Configs", "blueprintGoBack": "Voir toutes les Configs",
"blueprintCreate": "Créer une Config", "blueprintCreate": "Créer une Config",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Activer la Config Docker", "enableDockerSocket": "Activer la Config Docker",
"enableDockerSocketDescription": "Activer le ramassage d'étiquettes de socket Docker pour les étiquettes de plan. Le chemin du socket doit être fourni au connecteur du site. Lisez plus à ce sujet dans <docsLink>la documentation</docsLink>.", "enableDockerSocketDescription": "Activer le ramassage d'étiquettes de socket Docker pour les étiquettes de plan. Le chemin du socket doit être fourni au connecteur du site. Lisez plus à ce sujet dans <docsLink>la documentation</docsLink>.",
"newtAutoUpdate": "Activer la mise à jour automatique du site", "newtAutoUpdate": "Activer la mise à jour automatique du site",
"newtAutoUpdateDescription": "Lorsqu'il est activé, les connecteurs de site téléchargeront automatiquement la dernière version et redémarreront eux-mêmes. Cela peut être contourné sur une base par site.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Mise à jour automatique du site", "siteAutoUpdate": "Mise à jour automatique du site",
"siteAutoUpdateLabel": "Activer la mise à jour automatique", "siteAutoUpdateLabel": "Activer la mise à jour automatique",
"siteAutoUpdateDescription": "Lorsqu'il est activé, le connecteur de ce site téléchargera automatiquement la dernière version et se redémarrera.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Valeur par défaut de l'organisation : {state}", "siteAutoUpdateOrgDefault": "Valeur par défaut de l'organisation : {state}",
"siteAutoUpdateOverriding": "Substitution des paramètres de l'organisation", "siteAutoUpdateOverriding": "Substitution des paramètres de l'organisation",
"siteAutoUpdateResetToOrg": "Réinitialiser à la valeur par défaut de l'organisation", "siteAutoUpdateResetToOrg": "Réinitialiser à la valeur par défaut de l'organisation",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Configuration du compte terminée! Bienvenue chez Pangolin !", "accountSetupSuccess": "Configuration du compte terminée! Bienvenue chez Pangolin !",
"documentation": "Documentation", "documentation": "Documentation",
"saveAllSettings": "Enregistrer tous les paramètres", "saveAllSettings": "Enregistrer tous les paramètres",
"saveResourceTargets": "Enregistrer les paramètres", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Enregistrer les paramètres", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Enregistrer les paramètres", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Paramètres mis à jour", "settingsUpdated": "Paramètres mis à jour",
"settingsUpdatedDescription": "Paramètres mis à jour avec succès", "settingsUpdatedDescription": "Paramètres mis à jour avec succès",
"settingsErrorUpdate": "Échec de la mise à jour des paramètres", "settingsErrorUpdate": "Échec de la mise à jour des paramètres",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Inconnu", "healthCheckUnknown": "Inconnu",
"healthCheck": "Vérification de l'état de santé", "healthCheck": "Vérification de l'état de santé",
"configureHealthCheck": "Configurer la vérification de l'état de santé", "configureHealthCheck": "Configurer la vérification de l'état de santé",
"configureHealthCheckDescription": "Configurez la surveillance de votre ressource pour vous assurer qu'elle est toujours disponible", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Activer les vérifications de santé", "enableHealthChecks": "Activer les vérifications de santé",
"healthCheckDisabledStateDescription": "Lorsqu'il est désactivé, le site ne procédera pas aux vérifications de santé et l'état sera considéré comme inconnu.", "healthCheckDisabledStateDescription": "Lorsqu'il est désactivé, le site ne procédera pas aux vérifications de santé et l'état sera considéré comme inconnu.",
"enableHealthChecksDescription": "Surveiller la vie de cette cible. Vous pouvez surveiller un point de terminaison différent de la cible si nécessaire.", "enableHealthChecksDescription": "Surveiller la vie de cette cible. Vous pouvez surveiller un point de terminaison différent de la cible si nécessaire.",
"healthScheme": "Méthode", "healthScheme": "Méthode",
"healthSelectScheme": "Sélectionnez la méthode", "healthSelectScheme": "Sélectionnez la méthode",
"healthCheckPortInvalid": "Le port doit être compris entre 1 et 65535", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Chemin d'accès", "healthCheckPath": "Chemin d'accès",
"healthHostname": "IP / Hôte", "healthHostname": "IP / Hôte",
"healthPort": "Port", "healthPort": "Port",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Exiger les autorisations de l'appareil", "requireDeviceApproval": "Exiger les autorisations de l'appareil",
"requireDeviceApprovalDescription": "Les utilisateurs ayant ce rôle ont besoin de nouveaux périphériques approuvés par un administrateur avant de pouvoir se connecter et accéder aux ressources.", "requireDeviceApprovalDescription": "Les utilisateurs ayant ce rôle ont besoin de nouveaux périphériques approuvés par un administrateur avant de pouvoir se connecter et accéder aux ressources.",
"sshSettings": "Paramètres SSH", "sshSettings": "Paramètres SSH",
"sshAccess": "Accès SSH", "sshAccess": "SSH Access",
"rdpSettings": "Paramètres RDP", "rdpSettings": "Paramètres RDP",
"vncSettings": "Paramètres VNC", "vncSettings": "Paramètres VNC",
"sshServer": "Serveur SSH", "sshServer": "Serveur SSH",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Assurez-vous que votre hôte cible est correctement configuré pour exécuter le daemon auth avant de terminer cette configuration, ou l'approvisionnement échouera.", "sshDaemonDisclaimer": "Assurez-vous que votre hôte cible est correctement configuré pour exécuter le daemon auth avant de terminer cette configuration, ou l'approvisionnement échouera.",
"sshDaemonPort": "Port du Démon", "sshDaemonPort": "Port du Démon",
"sshServerDestination": "Destination du Serveur", "sshServerDestination": "Destination du Serveur",
"sshServerDestinationDescription": "Configurez la destination du serveur SSH", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Destination", "destination": "Destination",
"destinationRequired": "La destination est requise.", "destinationRequired": "Destination is required.",
"domainRequired": "Le domaine est requis.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Le port est requis.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Configuration de chemin invalide.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Configuration de réécriture de chemin invalide.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "La sélection de plusieurs sites permet un routage résilient et une bascule pour une haute disponibilité.", "bgTargetMultiSiteDisclaimer": "La sélection de plusieurs sites permet un routage résilient et une bascule pour une haute disponibilité.",
"roleAllowSsh": "Autoriser SSH", "roleAllowSsh": "Autoriser SSH",
"roleAllowSshAllow": "Autoriser", "roleAllowSshAllow": "Autoriser",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "L'utilisateur ne peut exécuter que les commandes spécifiées avec sudo.", "sshSudoModeCommandsDescription": "L'utilisateur ne peut exécuter que les commandes spécifiées avec sudo.",
"sshSudo": "Autoriser sudo", "sshSudo": "Autoriser sudo",
"sshSudoCommands": "Commandes Sudo", "sshSudoCommands": "Commandes Sudo",
"sshSudoCommandsDescription": "Liste des commandes que l'utilisateur est autorisé à exécuter avec sudo, séparées par des virgules, des espaces ou des nouvelles lignes. Les chemins absolus doivent être utilisés.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Créer un répertoire personnel", "sshCreateHomeDir": "Créer un répertoire personnel",
"sshUnixGroups": "Groupes Unix", "sshUnixGroups": "Groupes Unix",
"sshUnixGroupsDescription": "Groupes Unix auxquels ajouter l'utilisateur sur l'hôte cible, séparés par des virgules, des espaces, ou des nouvelles lignes.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Entrez des valeurs, ou déposez un fichier .txt ou .csv", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Importer depuis un fichier", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Importation de {fileName} dans {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Ignorer la première ligne (en-tête)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Remplacer l'existant", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Ajouter à l'existant", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Mode d'importation", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Aperçu", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Aucun élément à importer} one {1 élément à importer} other {# éléments à importer}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} existant + {imported} importé = {total} total", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Importer", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Type de fichier non pris en charge", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Seuls les fichiers .txt et .csv sont pris en charge.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Aucun élément trouvé dans le fichier", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Le fichier ne contient aucun élément importable.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Tentatives de réessai", "retryAttempts": "Tentatives de réessai",
"expectedResponseCodes": "Codes de réponse attendus", "expectedResponseCodes": "Codes de réponse attendus",
"expectedResponseCodesDescription": "Code de statut HTTP indiquant un état de santé satisfaisant. Si non renseigné, 200-300 est considéré comme satisfaisant.", "expectedResponseCodesDescription": "Code de statut HTTP indiquant un état de santé satisfaisant. Si non renseigné, 200-300 est considéré comme satisfaisant.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Activer le protocole Proxy", "enableProxyProtocol": "Activer le protocole Proxy",
"proxyProtocolInfo": "Conserver les adresses IP du client pour les backends TCP", "proxyProtocolInfo": "Conserver les adresses IP du client pour les backends TCP",
"proxyProtocolVersion": "Version du protocole proxy", "proxyProtocolVersion": "Version du protocole proxy",
"version1": "Version 1 (Recommandée)", "version1": "Version 1 (Recommended)",
"version2": "Version 2", "version2": "Version 2",
"version1Description": "Basé sur texte et largement pris en charge. Assurez-vous que le transport des serveurs est ajouté à la configuration dynamique.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Binaire et plus efficace mais moins compatible. Assurez-vous que le transport des serveurs est ajouté à la configuration dynamique.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Avertissement", "warning": "Avertissement",
"proxyProtocolWarning": "L'application backend doit être configurée pour accepter les connexions Proxy Protocol. Si votre backend ne prend pas en charge le protocole Proxy, l'activation de cette option va perturber toutes les connexions, donc n'activez cette option que si vous savez ce que vous faites. Assurez-vous de configurer votre backend pour faire confiance aux en-têtes du protocole Proxy de Traefik.", "proxyProtocolWarning": "L'application backend doit être configurée pour accepter les connexions Proxy Protocol. Si votre backend ne prend pas en charge le protocole Proxy, l'activation de cette option va perturber toutes les connexions, donc n'activez cette option que si vous savez ce que vous faites. Assurez-vous de configurer votre backend pour faire confiance aux en-têtes du protocole Proxy de Traefik.",
"restarting": "Redémarrage...", "restarting": "Redémarrage...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Entrez la confirmation", "enterConfirmation": "Entrez la confirmation",
"blueprintViewDetails": "Détails", "blueprintViewDetails": "Détails",
"defaultIdentityProvider": "Fournisseur d'identité par défaut", "defaultIdentityProvider": "Fournisseur d'identité par défaut",
"defaultIdentityProviderDescription": "L'utilisateur sera automatiquement redirigé vers ce fournisseur d'identité pour l'authentification.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Paramètres réseau", "editInternalResourceDialogNetworkSettings": "Paramètres réseau",
"editInternalResourceDialogAccessPolicy": "Politique d'accès", "editInternalResourceDialogAccessPolicy": "Politique d'accès",
"editInternalResourceDialogAddRoles": "Ajouter des rôles", "editInternalResourceDialogAddRoles": "Ajouter des rôles",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Type de mode de maintenance", "maintenanceModeType": "Type de mode de maintenance",
"showMaintenancePage": "Afficher une page de maintenance aux visiteurs", "showMaintenancePage": "Afficher une page de maintenance aux visiteurs",
"enableMaintenanceMode": "Activer le mode de maintenance", "enableMaintenanceMode": "Activer le mode de maintenance",
"enableMaintenanceModeDescription": "Lorsqu'il est activé, les visiteurs verront une page de maintenance au lieu de votre ressource.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automatique", "automatic": "Automatique",
"automaticModeDescription": "Afficher la page de maintenance uniquement lorsque toutes les cibles backend sont en panne ou dégradées. Votre ressource continue à fonctionner normalement tant qu'au moins une cible est en bonne santé.", "automaticModeDescription": "Afficher la page de maintenance uniquement lorsque toutes les cibles backend sont en panne ou dégradées. Votre ressource continue à fonctionner normalement tant qu'au moins une cible est en bonne santé.",
"forced": "Forcé", "forced": "Forcé",
@@ -3182,8 +3181,8 @@
"warning:": "Attention :", "warning:": "Attention :",
"forcedeModeWarning": "Tout le trafic sera dirigé vers la page de maintenance. Vos ressources backend ne recevront aucune demande.", "forcedeModeWarning": "Tout le trafic sera dirigé vers la page de maintenance. Vos ressources backend ne recevront aucune demande.",
"pageTitle": "Titre de la page", "pageTitle": "Titre de la page",
"maintenancePageContentSubsection": "Contenu de la page", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Personnalisez le contenu affiché sur la page de maintenance", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "Le titre principal affiché sur la page de maintenance", "pageTitleDescription": "Le titre principal affiché sur la page de maintenance",
"maintenancePageMessage": "Message de maintenance", "maintenancePageMessage": "Message de maintenance",
"maintenancePageMessagePlaceholder": "Nous serons bientôt de retour ! Notre site est actuellement en maintenance planifiée.", "maintenancePageMessagePlaceholder": "Nous serons bientôt de retour ! Notre site est actuellement en maintenance planifiée.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Êtes-vous sûr de vouloir dissocier ce fournisseur d'identités de cette organisation?", "idpUnassociateQuestion": "Êtes-vous sûr de vouloir dissocier ce fournisseur d'identités de cette organisation?",
"idpUnassociateDescription": "Tous les utilisateurs associés à ce fournisseur d'identités seront retirés de cette organisation, mais le fournisseur d'identités continuera d'exister pour d'autres organisations associées.", "idpUnassociateDescription": "Tous les utilisateurs associés à ce fournisseur d'identités seront retirés de cette organisation, mais le fournisseur d'identités continuera d'exister pour d'autres organisations associées.",
"idpUnassociateConfirm": "Confirmer la dissociation du fournisseur d'identités", "idpUnassociateConfirm": "Confirmer la dissociation du fournisseur d'identités",
"idpConfirmDeleteAndRemoveMeFromOrg": "SUPPRIMER ET ME RETIRER DE L'ORG", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "DÉ-ASSOCIER ET ME RETIRER DE L'ORG", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Cela ne peut pas être annulé pour cette organisation.", "idpUnassociateWarning": "Cela ne peut pas être annulé pour cette organisation.",
"idpUnassociatedDescription": "Fournisseur d'identités dissocié de cette organisation avec succès", "idpUnassociatedDescription": "Fournisseur d'identités dissocié de cette organisation avec succès",
"idpUnassociateMenu": "Dissocier", "idpUnassociateMenu": "Dissocier",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Connexion…", "sshConnecting": "Connexion…",
"sshInitializing": "Initialisation…", "sshInitializing": "Initialisation…",
"sshSignInTitle": "Se connecter à SSH", "sshSignInTitle": "Se connecter à SSH",
"sshSignInDescription": "Entrez vos identifiants SSH pour vous connecter", "sshSignInDescription": "Entrez vos identifiants SSH",
"sshPasswordTab": "Mot de passe", "sshPasswordTab": "Mot de passe",
"sshPrivateKeyTab": "Clé Privée", "sshPrivateKeyTab": "Clé Privée",
"sshPrivateKeyField": "Clé Privée", "sshPrivateKeyField": "Clé Privée",
"sshPrivateKeyDisclaimer": "Votre clé privée n'est pas stockée ou visible par Pangolin. Alternativement, vous pouvez utiliser des certificats de courte durée pour une authentification transparente utilisant votre identité Pangolin existante.", "sshPrivateKeyDisclaimer": "Votre clé privée n'est pas stockée ou visible par Pangolin. Alternativement, vous pouvez utiliser des certificats de courte durée pour une authentification transparente utilisant votre identité Pangolin existante.",
"sshLearnMore": "En savoir plus", "sshLearnMore": "En savoir plus",
"sshPrivateKeyFile": "Fichier de Clé Privée", "sshPrivateKeyFile": "Fichier de Clé Privée",
"sshAuthenticate": "Connecter", "sshAuthenticate": "Authentifier",
"sshTerminate": "Terminer", "sshTerminate": "Terminer",
"sshPoweredBy": "Propulsé par", "sshPoweredBy": "Propulsé par",
"sshErrorNoTarget": "Aucune cible spécifiée", "sshErrorNoTarget": "Aucune cible spécifiée",
"sshErrorWebSocket": "Échec de la connexion WebSocket", "sshErrorWebSocket": "Échec de la connexion WebSocket",
"sshErrorAuthFailed": "Échec de l'authentification", "sshErrorAuthFailed": "Échec de l'authentification",
"sshErrorConnectionClosed": "Connexion fermée avant que l'authentification soit terminée", "sshErrorConnectionClosed": "Connexion fermée avant que l'authentification soit terminée",
"sitePangolinSshDescription": "Autoriser l'accès SSH aux ressources sur ce site. Cela peut être modifié plus tard.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Aucune ressource trouvée pour ce domaine", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Aucune cible", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Connecter", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Suppr", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Échec de la signature de la clé SSH pour l'authentification Push PAM. Vous êtes-vous connecté en tant qu'utilisateur ?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Erreur : {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Connexion fermée (code {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Une clé privée est requise", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Entrez votre mot de passe VNC pour vous connecter", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Mot de passe (facultatif)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Aucune cible de ressource disponible", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Échec du chargement de noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Statut {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Coller le presse-papiers", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Se connecter au Bureau à distance", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Entrez vos identifiants Windows pour vous connecter", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Chargement du module...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Échec du chargement du module RDP", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Pas prêt", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "Le module RDP est encore en cours d'initialisation", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Téléchargement de {count} fichier(s) depuis le site distant…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Échec du téléchargement : {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Téléchargé : {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Aucune cible de connexion disponible", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Échec de la connexion", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Ajuster", "rdpFit": "Fit",
"rdpFull": "Plein", "rdpFull": "Full",
"rdpReal": "Réel", "rdpReal": "Real",
"rdpMeta": "Méta", "rdpMeta": "Meta",
"rdpUploadFiles": "Télécharger des fichiers", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Fichiers prêts à coller", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} fichier(s) copié(s) vers le presse-papier distant — appuyez sur Ctrl+V sur le bureau distant pour coller.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Échec du téléchargement", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Mode clavier Unicode", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Afficher la barre d'outils", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Masquer la barre d'outils" "sessionToolbarHide": "Hide toolbar"
} }
+185 -186
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Visualizza Risorse Private", "sitesTableViewPrivateResources": "Visualizza Risorse Private",
"siteInstallNewt": "Installa Newt", "siteInstallNewt": "Installa Newt",
"siteInstallNewtDescription": "Esegui Newt sul tuo sistema", "siteInstallNewtDescription": "Esegui Newt sul tuo sistema",
"siteInstallKubernetesDocsDescription": "Per ulteriori informazioni aggiornate sull'installazione di Kubernetes, consulta <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Per le istruzioni sull'installazione del modem Advantech, consulta <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "Configurazione WireGuard", "WgConfiguration": "Configurazione WireGuard",
"WgConfigurationDescription": "Utilizzare la seguente configurazione per connettersi alla rete", "WgConfigurationDescription": "Utilizzare la seguente configurazione per connettersi alla rete",
"operatingSystem": "Sistema Operativo", "operatingSystem": "Sistema Operativo",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Potrai vederlo solo una volta. Assicurati di copiarlo in un luogo sicuro.", "siteCredentialsSaveDescription": "Potrai vederlo solo una volta. Assicurati di copiarlo in un luogo sicuro.",
"siteInfo": "Informazioni Sito", "siteInfo": "Informazioni Sito",
"status": "Stato", "status": "Stato",
"shareTitle": "Gestisci Collegamenti Condivisibili", "shareTitle": "Manage Shareable Links",
"shareDescription": "Crea link condivisibili per concedere accesso temporaneo o permanente alle risorse proxy", "shareDescription": "Crea link condivisibili per concedere accesso temporaneo o permanente alle risorse proxy",
"shareSearch": "Cerca collegamenti condivisibili...", "shareSearch": "Search shareable links...",
"shareCreate": "Crea Collegamento Condivisibile", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Impossibile eliminare il link", "shareErrorDelete": "Impossibile eliminare il link",
"shareErrorDeleteMessage": "Si è verificato un errore durante l'eliminazione del link", "shareErrorDeleteMessage": "Si è verificato un errore durante l'eliminazione del link",
"shareDeleted": "Link eliminato", "shareDeleted": "Link eliminato",
"shareDeletedDescription": "Il link è stato eliminato", "shareDeletedDescription": "Il link è stato eliminato",
"shareDelete": "Elimina Collegamento Condivisibile", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Conferma Eliminazione Collegamento Condivisibile", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Sei sicuro di voler eliminare questo link di condivisione?", "shareQuestionRemove": "Sei sicuro di voler eliminare questo link di condivisione?",
"shareMessageRemove": "Una volta eliminato, il link non funzionerà più e chiunque lo utilizzi perderà l'accesso alla risorsa.", "shareMessageRemove": "Una volta eliminato, il link non funzionerà più e chiunque lo utilizzi perderà l'accesso alla risorsa.",
"shareTokenDescription": "Il token di accesso può essere passato in due modi: come parametro di interrogazione o nelle intestazioni della richiesta. Questi devono essere passati dal client su ogni richiesta di accesso autenticato.", "shareTokenDescription": "Il token di accesso può essere passato in due modi: come parametro di interrogazione o nelle intestazioni della richiesta. Questi devono essere passati dal client su ogni richiesta di accesso autenticato.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Chiunque con questo link può accedere alla risorsa", "shareCreateDescription": "Chiunque con questo link può accedere alla risorsa",
"shareTitleOptional": "Titolo (facoltativo)", "shareTitleOptional": "Titolo (facoltativo)",
"sharePathOptional": "Percorso (opzionale)", "sharePathOptional": "Percorso (opzionale)",
"sharePathDescription": "Il link reindirizzerà gli utenti a questo percorso dopo l'autenticazione.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Scadenza In", "expireIn": "Scadenza In",
"neverExpire": "Nessuna scadenza", "neverExpire": "Nessuna scadenza",
"shareExpireDescription": "Il tempo di scadenza indica per quanto tempo il link sarà utilizzabile e fornirà accesso alla risorsa. Dopo questo tempo, il link non funzionerà più e gli utenti che hanno utilizzato questo link perderanno l'accesso alla risorsa.", "shareExpireDescription": "Il tempo di scadenza indica per quanto tempo il link sarà utilizzabile e fornirà accesso alla risorsa. Dopo questo tempo, il link non funzionerà più e gli utenti che hanno utilizzato questo link perderanno l'accesso alla risorsa.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Seleziona una risorsa", "shareErrorSelectResource": "Seleziona una risorsa",
"proxyResourceTitle": "Gestisci Risorse Pubbliche", "proxyResourceTitle": "Gestisci Risorse Pubbliche",
"proxyResourceDescription": "Creare e gestire risorse pubbliche accessibili tramite un browser web", "proxyResourceDescription": "Creare e gestire risorse pubbliche accessibili tramite un browser web",
"publicResourcesBannerTitle": "Accesso Pubblico Basato sul Web", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Le risorse pubbliche sono proxy HTTPS accessibili a chiunque su Internet tramite un browser web. A differenza delle risorse private, non richiedono software lato client e possono includere politiche di accesso basate su identità e contesto.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Gestisci Risorse Private", "clientResourceTitle": "Gestisci Risorse Private",
"clientResourceDescription": "Crea e gestisci risorse accessibili solo tramite un client connesso", "clientResourceDescription": "Crea e gestisci risorse accessibili solo tramite un client connesso",
"privateResourcesBannerTitle": "Accesso Privato Zero-Trust", "privateResourcesBannerTitle": "Accesso Privato Zero-Trust",
@@ -212,19 +212,18 @@
"resourcesSearch": "Cerca risorse...", "resourcesSearch": "Cerca risorse...",
"resourceAdd": "Aggiungi Risorsa", "resourceAdd": "Aggiungi Risorsa",
"resourceErrorDelte": "Errore nell'eliminare la risorsa", "resourceErrorDelte": "Errore nell'eliminare la risorsa",
"resourcePoliciesBannerTitle": "Riutilizza Regole di Autenticazione e Accesso", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Le politiche di risorsa condivise ti permettono di definire metodi di autenticazione e regole di accesso una volta, poi di applicarle a più risorse pubbliche. Quando aggiorni una politica, ogni risorsa collegata eredita il cambiamento automaticamente.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Scopri di più", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Gestisci Politiche delle Risorse Pubbliche", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Risorse",
"resourcePoliciesAttachedResources": "{count} risorsa(e)", "resourcePoliciesAttachedResources": "{count} risorsa(e)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# risorsa} other {# risorse}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "nessuna risorsa", "resourcePoliciesAttachedResourcesEmpty": "nessuna risorsa",
"resourcePoliciesDescription": "Crea e gestisci politiche d'autenticazione per controllare l'accesso alle tue risorse pubbliche", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Cerca politiche...", "resourcePoliciesSearch": "Cerca politiche...",
"resourcePoliciesAdd": "Aggiungi Politica", "resourcePoliciesAdd": "Aggiungi Politica",
"resourcePoliciesDefaultBadgeText": "Politica Predefinita", "resourcePoliciesDefaultBadgeText": "Politica Predefinita",
"resourcePoliciesCreate": "Crea Politica Risorse Pubbliche", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Segui i passaggi seguenti per creare una nuova politica", "resourcePoliciesCreateDescription": "Segui i passaggi seguenti per creare una nuova politica",
"resourcePolicyName": "Nome Politica", "resourcePolicyName": "Nome Politica",
"resourcePolicyNameDescription": "Dai un nome a questa politica per identificarla tra le tue risorse", "resourcePolicyNameDescription": "Dai un nome a questa politica per identificarla tra le tue risorse",
@@ -281,7 +280,7 @@
"back": "Indietro", "back": "Indietro",
"cancel": "Annulla", "cancel": "Annulla",
"resourceConfig": "Snippet Di Configurazione", "resourceConfig": "Snippet Di Configurazione",
"resourceConfigDescription": "Copia e incolla questi snippet di configurazione per configurare la risorsa TCP/UDP.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Aggiungi Entrypoint", "resourceAddEntrypoints": "Traefik: Aggiungi Entrypoint",
"resourceExposePorts": "Gerbil: espone le porte in Docker Compose", "resourceExposePorts": "Gerbil: espone le porte in Docker Compose",
"resourceLearnRaw": "Scopri come configurare le risorse TCP/UDP", "resourceLearnRaw": "Scopri come configurare le risorse TCP/UDP",
@@ -294,8 +293,8 @@
"labelDelete": "Elimina Etichetta", "labelDelete": "Elimina Etichetta",
"labelAdd": "Aggiungi Etichetta", "labelAdd": "Aggiungi Etichetta",
"labelCreateSuccessMessage": "Etichetta Creata con Successo", "labelCreateSuccessMessage": "Etichetta Creata con Successo",
"labelDuplicateError": "Etichetta Duplicata", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Esiste già un'etichetta con questo nome.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Etichetta Modificata con Successo", "labelEditSuccessMessage": "Etichetta Modificata con Successo",
"labelNameField": "Nome Etichetta", "labelNameField": "Nome Etichetta",
"labelColorField": "Colore Etichetta", "labelColorField": "Colore Etichetta",
@@ -320,7 +319,7 @@
"rules": "Regole", "rules": "Regole",
"resourceSettingDescription": "Configura le impostazioni sulla risorsa", "resourceSettingDescription": "Configura le impostazioni sulla risorsa",
"resourceSetting": "Impostazioni {resourceName}", "resourceSetting": "Impostazioni {resourceName}",
"resourcePolicySettingDescription": "Configura le impostazioni su questa politica di risorsa pubblica", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "Impostazioni del sito {policyName}", "resourcePolicySetting": "Impostazioni del sito {policyName}",
"alwaysAllow": "Bypass Autenticazione", "alwaysAllow": "Bypass Autenticazione",
"alwaysDeny": "Blocca Accesso", "alwaysDeny": "Blocca Accesso",
@@ -728,7 +727,7 @@
"targetSubmit": "Aggiungi Target", "targetSubmit": "Aggiungi Target",
"targetNoOne": "Questa risorsa non ha destinazioni. Aggiungi un obiettivo per configurare dove inviare richieste al backend.", "targetNoOne": "Questa risorsa non ha destinazioni. Aggiungi un obiettivo per configurare dove inviare richieste al backend.",
"targetNoOneDescription": "L'aggiunta di più di un target abiliterà il bilanciamento del carico.", "targetNoOneDescription": "L'aggiunta di più di un target abiliterà il bilanciamento del carico.",
"targetsSubmit": "Salva Impostazioni", "targetsSubmit": "Save Settings",
"addTarget": "Aggiungi Target", "addTarget": "Aggiungi Target",
"proxyMultiSiteRoundRobinNodeHelp": "Il routing round robin non funzionerà tra siti che non sono connessi allo stesso nodo, ma il failover funzionerà.", "proxyMultiSiteRoundRobinNodeHelp": "Il routing round robin non funzionerà tra siti che non sono connessi allo stesso nodo, ma il failover funzionerà.",
"targetErrorInvalidIp": "Indirizzo IP non valido", "targetErrorInvalidIp": "Indirizzo IP non valido",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Regola duplicata", "rulesErrorDuplicate": "Regola duplicata",
"rulesErrorDuplicateDescription": "Esiste già una regola con queste impostazioni", "rulesErrorDuplicateDescription": "Esiste già una regola con queste impostazioni",
"rulesErrorInvalidIpAddressRange": "CIDR non valido", "rulesErrorInvalidIpAddressRange": "CIDR non valido",
"rulesErrorInvalidIpAddressRangeDescription": "Inserisci un intervallo CIDR valido (es., 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Percorso non valido", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Inserisci un percorso URL valido o un pattern (es., /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Indirizzo IP non valido", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Inserisci un indirizzo IPv4 o IPv6 valido.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Impossibile aggiornare le regole", "rulesErrorUpdate": "Impossibile aggiornare le regole",
"rulesErrorUpdateDescription": "Si è verificato un errore durante l'aggiornamento delle regole", "rulesErrorUpdateDescription": "Si è verificato un errore durante l'aggiornamento delle regole",
"rulesUpdated": "Abilita Regole", "rulesUpdated": "Abilita Regole",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Inserisci un indirizzo in formato CIDR (es. 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Inserisci un indirizzo in formato CIDR (es. 103.21.244.0/22)",
"rulesMatchIpAddress": "Inserisci un indirizzo IP (es. 103.21.244.12)", "rulesMatchIpAddress": "Inserisci un indirizzo IP (es. 103.21.244.12)",
"rulesMatchUrl": "Inserisci un percorso URL o pattern (es. /api/v1/todos o /api/v1/*)", "rulesMatchUrl": "Inserisci un percorso URL o pattern (es. /api/v1/todos o /api/v1/*)",
"rulesErrorInvalidPriority": "Priorità non valida", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Inserisci un numero intero di 1 o superiore.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Priorità duplicate", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Ogni regola deve avere un numero di priorità univoco.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Regole non valide", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Regola {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Seleziona un tipo di corrispondenza valido (percorso, IP, CIDR, paese, regione o ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Inserisci un valore per questa regola.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Nazione non valida", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Seleziona un paese valido.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "ASN non valido", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Inserisci un ASN valido (es., AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Regole aggiornate", "ruleUpdated": "Regole aggiornate",
"ruleUpdatedDescription": "Regole aggiornate con successo", "ruleUpdatedDescription": "Regole aggiornate con successo",
"ruleErrorUpdate": "Operazione fallita", "ruleErrorUpdate": "Operazione fallita",
"ruleErrorUpdateDescription": "Si è verificato un errore durante il salvataggio", "ruleErrorUpdateDescription": "Si è verificato un errore durante il salvataggio",
"rulesPriority": "Priorità", "rulesPriority": "Priorità",
"rulesReorderDragHandle": "Trascina per riorganizzare la priorità delle regole", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Azione", "rulesAction": "Azione",
"rulesMatchType": "Tipo di Corrispondenza", "rulesMatchType": "Tipo di Corrispondenza",
"value": "Valore", "value": "Valore",
@@ -810,7 +809,7 @@
"rulesResource": "Configurazione Regole Risorsa", "rulesResource": "Configurazione Regole Risorsa",
"rulesResourceDescription": "Configura le regole per controllare l'accesso alla risorsa", "rulesResourceDescription": "Configura le regole per controllare l'accesso alla risorsa",
"ruleSubmit": "Aggiungi Regola", "ruleSubmit": "Aggiungi Regola",
"rulesNoOne": "Nessuna regola ancora.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Le regole sono valutate per priorità in ordine crescente.", "rulesOrder": "Le regole sono valutate per priorità in ordine crescente.",
"rulesSubmit": "Salva Regole", "rulesSubmit": "Salva Regole",
"policyErrorCreate": "Errore nella creazione della politica", "policyErrorCreate": "Errore nella creazione della politica",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Si è verificato un errore imprevisto", "policyErrorUpdateMessageDescription": "Si è verificato un errore imprevisto",
"policyCreatedSuccess": "Politica risorse creata con successo", "policyCreatedSuccess": "Politica risorse creata con successo",
"policyUpdatedSuccess": "Politica risorse aggiornata con successo", "policyUpdatedSuccess": "Politica risorse aggiornata con successo",
"authMethodsSave": "Salva Impostazioni", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Autenticazione", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Controlla quali metodi di autenticazione sono richiesti per accedere a questa risorsa", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Più metodi di autenticazione attivi", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "I visitatori possono autenticarsi utilizzando uno qualsiasi dei metodi attivi sottostanti. Non è necessario completarli tutti.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Attivo", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Disattivo", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "SSO della Piattaforma", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Richiedi l'accesso tramite il provider di identità della tua organizzazione", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} utenti, {roles} ruoli", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Provider predefinito", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Aggiungi Provider di Identità Predefinito", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Altri Metodi", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Metodi opzionali che i visitatori possono utilizzare al posto o insieme al SSO della piattaforma", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Codice di Accesso", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Richiedi un codice alfanumerico condiviso per accedere alla risorsa", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Codice di accesso impostato", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "Codice PIN", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Un breve codice numerico richiesto per accedere alla risorsa", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "Codice PIN a 6 cifre impostato", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "Lista Autorizzazioni Email", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Consenti indirizzi email elencati con password monouso", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} indirizzi consentiti", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "L'abilitazione dell'elenco email invia una password monouso all'email del visitatore durante il login.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Autenticazione Header Base", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Convalida un nome e un valore di intestazione HTTP personalizzato su ogni richiesta", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Intestazione configurata", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Nome dell'intestazione", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Valore atteso", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Imposta Codice di Accesso", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Imposta Codice PIN", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Imposta Lista Autorizzazioni Email", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Imposta Autenticazione Header Base", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Regole di Accesso", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Quando abilitate, le regole vengono valutate in ordine discendente finché una non è vera.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Le regole sono valutate dall'alto verso il basso. La prima regola corrispondente decide il risultato.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Le regole corrispondono alle richieste per percorso, indirizzo IP, posizione o altri criteri. Ogni regola applica un'azione: bypassa l'autenticazione, blocca l'accesso o passa all'autenticazione. Se nessuna regola corrisponde, il traffico continua all'autenticazione.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Quando le regole sono disabilitate, tutto il traffico passa all'autenticazione.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Quando nessuna regola corrisponde, il traffico passa all'autenticazione.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Si è verificato un errore durante l'aggiornamento della risorsa", "resourcesErrorUpdateDescription": "Si è verificato un errore durante l'aggiornamento della risorsa",
"access": "Accesso", "access": "Accesso",
"accessControl": "Controllo Accessi", "accessControl": "Controllo Accessi",
"shareLink": "Link di Condivisione {resource}", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Seleziona risorsa", "resourceSelect": "Seleziona risorsa",
"shareLinks": "Collegamenti Condivisibili", "shareLinks": "Shareable Links",
"share": "Link Condivisibili", "share": "Link Condivisibili",
"shareDescription2": "Crea link condivisibili alle risorse. I link forniscono un accesso temporaneo o illimitato alla tua risorsa. È possibile configurare la durata di scadenza del collegamento quando ne viene creato uno.", "shareDescription2": "Crea link condivisibili alle risorse. I link forniscono un accesso temporaneo o illimitato alla tua risorsa. È possibile configurare la durata di scadenza del collegamento quando ne viene creato uno.",
"shareEasyCreate": "Facile da creare e condividere", "shareEasyCreate": "Facile da creare e condividere",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Gli amministratori possono sempre accedere a questa risorsa.", "resourceRoleDescription": "Gli amministratori possono sempre accedere a questa risorsa.",
"resourcePolicySelectTitle": "Politica di Accesso Risorse", "resourcePolicySelectTitle": "Politica di Accesso Risorse",
"resourcePolicySelectDescription": "Seleziona il tipo di politica delle risorse per l'autenticazione", "resourcePolicySelectDescription": "Seleziona il tipo di politica delle risorse per l'autenticazione",
"resourcePolicyTypeLabel": "Tipo di politica", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Politica delle risorse", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Politica Inline delle Risorse", "resourcePolicyInline": "Politica Inline delle Risorse",
"resourcePolicyInlineDescription": "Politica di Accesso limitata solo a questa risorsa", "resourcePolicyInlineDescription": "Politica di Accesso limitata solo a questa risorsa",
"resourcePolicyShared": "Politica Condivisa delle Risorse", "resourcePolicyShared": "Politica Condivisa delle Risorse",
"resourcePolicySharedDescription": "Questa risorsa utilizza una politica condivisa.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Politica Condivisa", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Questa risorsa ha la sua politica.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Questa risorsa ha il controllo delle proprie regole di autenticazione e accesso.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Questa risorsa eredita da <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Questa risorsa utilizza una politica condivisa. Alcune impostazioni di autenticazione possono essere modificate su questa risorsa per aggiungerle alla politica. Per cambiare la politica sottostante, devi modificare <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Questa risorsa utilizza una politica condivisa. Alcune regole di accesso possono essere modificate su questa risorsa. Per cambiare la politica sottostante, devi modificare <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Controlli di Accesso", "resourceUsersRoles": "Controlli di Accesso",
"resourceUsersRolesDescription": "Configura quali utenti e ruoli possono visitare questa risorsa", "resourceUsersRolesDescription": "Configura quali utenti e ruoli possono visitare questa risorsa",
"resourceUsersRolesSubmit": "Salva Controlli di Accesso", "resourceUsersRolesSubmit": "Salva Controlli di Accesso",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Visibilità", "resourceVisibilityTitle": "Visibilità",
"resourceVisibilityTitleDescription": "Abilita o disabilita completamente la visibilità della risorsa", "resourceVisibilityTitleDescription": "Abilita o disabilita completamente la visibilità della risorsa",
"resourceGeneral": "Impostazioni Generali", "resourceGeneral": "Impostazioni Generali",
"resourceGeneralDescription": "Configura nome, indirizzo e politica di accesso per questa risorsa.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Dettagli Risorsa", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Imposta il nome visualizzato, l'identificatore e il dominio pubblicamente accessibile per questa risorsa.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Imposta il nome visualizzato, l'identificatore e la porta pubblica per questa risorsa.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Indirizzo Pubblico", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Configura come gli utenti raggiungono questa risorsa.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Autenticazione e Accesso", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Scegli se questa risorsa utilizza la sua politica o eredita da una politica condivisa.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Abilita Risorsa", "resourceEnable": "Abilita Risorsa",
"resourceTransfer": "Trasferisci Risorsa", "resourceTransfer": "Trasferisci Risorsa",
"resourceTransferDescription": "Trasferisci questa risorsa a un sito diverso", "resourceTransferDescription": "Trasferisci questa risorsa a un sito diverso",
@@ -1294,14 +1293,14 @@
"addLabels": "Aggiungi etichette", "addLabels": "Aggiungi etichette",
"siteLabelsTab": "Etichette", "siteLabelsTab": "Etichette",
"siteLabelsDescription": "Gestisci le etichette associate a questo sito.", "siteLabelsDescription": "Gestisci le etichette associate a questo sito.",
"labelsNotFound": "Nessuna etichetta trovata.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Inizia a digitare sopra per creare un'etichetta.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Cerca etichette", "labelSearch": "Cerca etichette",
"labelSearchOrCreate": "Cerca o crea un'etichetta", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# etichetta} other {# etichette}}", "accessLabelFilterCount": "{count, plural, one {# etichetta} other {# etichette}}",
"labelOverflowCount": "+{count, plural, one {# etichetta} other {# etichette}}", "labelOverflowCount": "+{count, plural, one {# etichetta} other {# etichette}}",
"accessLabelFilterClear": "Cancella filtri etichette", "accessLabelFilterClear": "Cancella filtri etichette",
"accessFilterClear": "Cancella filtri", "accessFilterClear": "Clear filters",
"selectColor": "Seleziona colore", "selectColor": "Seleziona colore",
"createNewLabel": "Crea nuova etichetta dell'organizzazione \"{label}\"", "createNewLabel": "Crea nuova etichetta dell'organizzazione \"{label}\"",
"inviteInvalidDescription": "Il link di invito non è valido.", "inviteInvalidDescription": "Il link di invito non è valido.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Risorse", "sidebarResources": "Risorse",
"sidebarProxyResources": "Pubblico", "sidebarProxyResources": "Pubblico",
"sidebarClientResources": "Privato", "sidebarClientResources": "Privato",
"sidebarPolicies": "Politiche Condivise", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Risorse Pubbliche", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Controllo Accesso", "sidebarAccessControl": "Controllo Accesso",
"sidebarLogsAndAnalytics": "Registri E Analisi", "sidebarLogsAndAnalytics": "Registri E Analisi",
"sidebarTeam": "Squadra", "sidebarTeam": "Squadra",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Amministratore", "sidebarAdmin": "Amministratore",
"sidebarInvitations": "Inviti", "sidebarInvitations": "Inviti",
"sidebarRoles": "Ruoli", "sidebarRoles": "Ruoli",
"sidebarShareableLinks": "Collegamenti Condivisibili", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "Chiavi API", "sidebarApiKeys": "Chiavi API",
"sidebarProvisioning": "Accantonamento", "sidebarProvisioning": "Accantonamento",
"sidebarSettings": "Impostazioni", "sidebarSettings": "Impostazioni",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Risorsa {id}", "standaloneHcFilterResourceIdFallback": "Risorsa {id}",
"blueprints": "Progetti", "blueprints": "Progetti",
"blueprintsLog": "Registro Progetti", "blueprintsLog": "Registro Progetti",
"blueprintsDescription": "Visualizza le applicazioni blueprint passate e i loro risultati o applica un nuovo blueprint", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Aggiungi Progetto", "blueprintAdd": "Aggiungi Progetto",
"blueprintGoBack": "Vedi tutti i progetti", "blueprintGoBack": "Vedi tutti i progetti",
"blueprintCreate": "Crea Progetto", "blueprintCreate": "Crea Progetto",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Abilita Progetto Docker", "enableDockerSocket": "Abilita Progetto Docker",
"enableDockerSocketDescription": "Abilita lo scraping delle etichette Docker Socket per le etichette dei progetti. Il percorso del socket deve essere fornito al connettore del sito. Leggi come funziona nel <docsLink>documentazione</docsLink>.", "enableDockerSocketDescription": "Abilita lo scraping delle etichette Docker Socket per le etichette dei progetti. Il percorso del socket deve essere fornito al connettore del sito. Leggi come funziona nel <docsLink>documentazione</docsLink>.",
"newtAutoUpdate": "Abilita Aggiornamento Automatico del Sito", "newtAutoUpdate": "Abilita Aggiornamento Automatico del Sito",
"newtAutoUpdateDescription": "Quando abilitati, i connettori del sito scaricheranno automaticamente l'ultima versione e si riavvieranno. Questo può essere sovrascritto caso per caso.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Aggiornamento Automatico del Sito", "siteAutoUpdate": "Aggiornamento Automatico del Sito",
"siteAutoUpdateLabel": "Abilita Aggiornamento Automatico", "siteAutoUpdateLabel": "Abilita Aggiornamento Automatico",
"siteAutoUpdateDescription": "Quando abilitato, il connettore di questo sito scaricherà automaticamente l'ultima versione e si riavvierà.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Predefinito dell'organizzazione: {state}", "siteAutoUpdateOrgDefault": "Predefinito dell'organizzazione: {state}",
"siteAutoUpdateOverriding": "Sovrascrivere le impostazioni dell'organizzazione", "siteAutoUpdateOverriding": "Sovrascrivere le impostazioni dell'organizzazione",
"siteAutoUpdateResetToOrg": "Reimposta al Predefinito dell'Organizzazione", "siteAutoUpdateResetToOrg": "Reimposta al Predefinito dell'Organizzazione",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Configurazione dell'account completata! Benvenuto su Pangolin!", "accountSetupSuccess": "Configurazione dell'account completata! Benvenuto su Pangolin!",
"documentation": "Documentazione", "documentation": "Documentazione",
"saveAllSettings": "Salva Tutte le Impostazioni", "saveAllSettings": "Salva Tutte le Impostazioni",
"saveResourceTargets": "Salva Impostazioni", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Salva Impostazioni", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Salva Impostazioni", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Impostazioni aggiornate", "settingsUpdated": "Impostazioni aggiornate",
"settingsUpdatedDescription": "Impostazioni aggiornate con successo", "settingsUpdatedDescription": "Impostazioni aggiornate con successo",
"settingsErrorUpdate": "Impossibile aggiornare le impostazioni", "settingsErrorUpdate": "Impossibile aggiornare le impostazioni",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Sconosciuto", "healthCheckUnknown": "Sconosciuto",
"healthCheck": "Controllo Salute", "healthCheck": "Controllo Salute",
"configureHealthCheck": "Configura Controllo Salute", "configureHealthCheck": "Configura Controllo Salute",
"configureHealthCheckDescription": "Imposta il monitoraggio per la tua risorsa per assicurarti che sia sempre disponibile", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Abilita i Controlli di Salute", "enableHealthChecks": "Abilita i Controlli di Salute",
"healthCheckDisabledStateDescription": "Quando disabilitato, il sito non eseguirà controlli di integrità e lo stato sarà considerato sconosciuto.", "healthCheckDisabledStateDescription": "Quando disabilitato, il sito non eseguirà controlli di integrità e lo stato sarà considerato sconosciuto.",
"enableHealthChecksDescription": "Monitorare lo stato di salute di questo obiettivo. Se necessario, è possibile monitorare un endpoint diverso da quello del bersaglio.", "enableHealthChecksDescription": "Monitorare lo stato di salute di questo obiettivo. Se necessario, è possibile monitorare un endpoint diverso da quello del bersaglio.",
"healthScheme": "Metodo", "healthScheme": "Metodo",
"healthSelectScheme": "Seleziona Metodo", "healthSelectScheme": "Seleziona Metodo",
"healthCheckPortInvalid": "La porta deve essere compresa tra 1 e 65535", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Percorso", "healthCheckPath": "Percorso",
"healthHostname": "IP / Nome host", "healthHostname": "IP / Nome host",
"healthPort": "Porta", "healthPort": "Porta",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Richiede Approvazioni Dispositivo", "requireDeviceApproval": "Richiede Approvazioni Dispositivo",
"requireDeviceApprovalDescription": "Gli utenti con questo ruolo hanno bisogno di nuovi dispositivi approvati da un amministratore prima di poter connettersi e accedere alle risorse.", "requireDeviceApprovalDescription": "Gli utenti con questo ruolo hanno bisogno di nuovi dispositivi approvati da un amministratore prima di poter connettersi e accedere alle risorse.",
"sshSettings": "Impostazioni SSH", "sshSettings": "Impostazioni SSH",
"sshAccess": "Accesso SSH", "sshAccess": "SSH Access",
"rdpSettings": "Impostazioni RDP", "rdpSettings": "Impostazioni RDP",
"vncSettings": "Impostazioni VNC", "vncSettings": "Impostazioni VNC",
"sshServer": "Server SSH", "sshServer": "Server SSH",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Assicurati che l'host target sia correttamente configurato per eseguire il demone di autenticazione prima di completare questa configurazione, altrimenti il provisioning fallirà.", "sshDaemonDisclaimer": "Assicurati che l'host target sia correttamente configurato per eseguire il demone di autenticazione prima di completare questa configurazione, altrimenti il provisioning fallirà.",
"sshDaemonPort": "Porta Daemon", "sshDaemonPort": "Porta Daemon",
"sshServerDestination": "Destinazione Server", "sshServerDestination": "Destinazione Server",
"sshServerDestinationDescription": "Configura la destinazione del server SSH", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Destinazione", "destination": "Destinazione",
"destinationRequired": "La destinazione è obbligatoria.", "destinationRequired": "Destination is required.",
"domainRequired": "Il dominio è obbligatorio.", "domainRequired": "Domain is required.",
"proxyPortRequired": "La porta è obbligatoria.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Configurazione percorso non valida.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Configurazione percorso di riscrittura non valida.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Selezionare più siti abilita instradamento resiliente e failover per alta disponibilità.", "bgTargetMultiSiteDisclaimer": "Selezionare più siti abilita instradamento resiliente e failover per alta disponibilità.",
"roleAllowSsh": "Consenti SSH", "roleAllowSsh": "Consenti SSH",
"roleAllowSshAllow": "Consenti", "roleAllowSshAllow": "Consenti",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "L'utente può eseguire solo i comandi specificati con sudo.", "sshSudoModeCommandsDescription": "L'utente può eseguire solo i comandi specificati con sudo.",
"sshSudo": "Consenti sudo", "sshSudo": "Consenti sudo",
"sshSudoCommands": "Comandi Sudo", "sshSudoCommands": "Comandi Sudo",
"sshSudoCommandsDescription": "Elenco di comandi che l'utente è autorizzato ad eseguire con sudo, separati da virgole, spazi o nuove righe. Devono essere utilizzati percorsi assoluti.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Crea Cartella Home", "sshCreateHomeDir": "Crea Cartella Home",
"sshUnixGroups": "Gruppi Unix", "sshUnixGroups": "Gruppi Unix",
"sshUnixGroupsDescription": "Gruppi Unix a cui aggiungere l'utente sull'host di destinazione, separati da virgole, spazi o nuove righe.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Inserisci i valori o rilascia un file .txt o .csv", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Importa da File", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Importazione di {fileName} in {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Ignora Prima Riga (Intestazione)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Sostituisci Esistente", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Aggiungi a Esistente", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Modalità Importazione", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Anteprima", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Nessun elemento da importare} one {1 elemento da importare} other {# elementi da importare}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} esistente + {imported} importato = {total} totale", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Importa", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Tipo di file non supportato", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Sono supportati solo file .txt e .csv.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Nessun elemento trovato nel file", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Il file non contiene elementi importabili.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Tentativi di Riprova", "retryAttempts": "Tentativi di Riprova",
"expectedResponseCodes": "Codici di Risposta Attesi", "expectedResponseCodes": "Codici di Risposta Attesi",
"expectedResponseCodesDescription": "Codice di stato HTTP che indica lo stato di salute. Se lasciato vuoto, considerato sano è compreso tra 200-300.", "expectedResponseCodesDescription": "Codice di stato HTTP che indica lo stato di salute. Se lasciato vuoto, considerato sano è compreso tra 200-300.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Abilita Protocollo Proxy", "enableProxyProtocol": "Abilita Protocollo Proxy",
"proxyProtocolInfo": "Conserva gli indirizzi IP del client per i backend TCP", "proxyProtocolInfo": "Conserva gli indirizzi IP del client per i backend TCP",
"proxyProtocolVersion": "Versione Protocollo Proxy", "proxyProtocolVersion": "Versione Protocollo Proxy",
"version1": "Versione 1 (Consigliato)", "version1": "Version 1 (Recommended)",
"version2": "Versione 2", "version2": "Versione 2",
"version1Description": "Testuale e ampiamente supportata. Assicurati che il trasporto server sia aggiunto alla configurazione dinamica.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Binaria e più efficiente ma meno compatibile. Assicurati che il trasporto server sia aggiunto alla configurazione dinamica.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Attenzione", "warning": "Attenzione",
"proxyProtocolWarning": "L'applicazione backend deve essere configurata per accettare le connessioni del protocollo proxy. Se il tuo backend non supporta il protocollo proxy, abilitarlo interromperà tutte le connessioni, quindi attivalo solo se sai cosa stai facendo. Assicurati di configurare il tuo backend per fidarti delle intestazioni del protocollo proxy da Traefik.", "proxyProtocolWarning": "L'applicazione backend deve essere configurata per accettare le connessioni del protocollo proxy. Se il tuo backend non supporta il protocollo proxy, abilitarlo interromperà tutte le connessioni, quindi attivalo solo se sai cosa stai facendo. Assicurati di configurare il tuo backend per fidarti delle intestazioni del protocollo proxy da Traefik.",
"restarting": "Riavvio...", "restarting": "Riavvio...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Inserisci conferma", "enterConfirmation": "Inserisci conferma",
"blueprintViewDetails": "Dettagli", "blueprintViewDetails": "Dettagli",
"defaultIdentityProvider": "Provider di Identità Predefinito", "defaultIdentityProvider": "Provider di Identità Predefinito",
"defaultIdentityProviderDescription": "L'utente verrà automaticamente reindirizzato a questo provider di identità per l'autenticazione.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Impostazioni di Rete", "editInternalResourceDialogNetworkSettings": "Impostazioni di Rete",
"editInternalResourceDialogAccessPolicy": "Politica di Accesso", "editInternalResourceDialogAccessPolicy": "Politica di Accesso",
"editInternalResourceDialogAddRoles": "Aggiungi Ruoli", "editInternalResourceDialogAddRoles": "Aggiungi Ruoli",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Tipo di Modalità di Manutenzione", "maintenanceModeType": "Tipo di Modalità di Manutenzione",
"showMaintenancePage": "Mostra una pagina di manutenzione ai visitatori", "showMaintenancePage": "Mostra una pagina di manutenzione ai visitatori",
"enableMaintenanceMode": "Abilita Modalità di Manutenzione", "enableMaintenanceMode": "Abilita Modalità di Manutenzione",
"enableMaintenanceModeDescription": "Quando abilitato, i visitatori vedranno una pagina di manutenzione invece della tua risorsa.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automatico", "automatic": "Automatico",
"automaticModeDescription": "Mostra pagina di manutenzione solo quando tutti i target del backend sono inattivi o non in salute. La tua risorsa continua a funzionare normalmente finché almeno un target è in salute.", "automaticModeDescription": "Mostra pagina di manutenzione solo quando tutti i target del backend sono inattivi o non in salute. La tua risorsa continua a funzionare normalmente finché almeno un target è in salute.",
"forced": "Forzato", "forced": "Forzato",
@@ -3182,8 +3181,8 @@
"warning:": "Avviso:", "warning:": "Avviso:",
"forcedeModeWarning": "Tutto il traffico verrà indirizzato alla pagina di manutenzione. Le risorse del tuo backend non riceveranno richieste.", "forcedeModeWarning": "Tutto il traffico verrà indirizzato alla pagina di manutenzione. Le risorse del tuo backend non riceveranno richieste.",
"pageTitle": "Titolo Pagina", "pageTitle": "Titolo Pagina",
"maintenancePageContentSubsection": "Contenuto della Pagina", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Personalizza il contenuto visualizzato sulla pagina di manutenzione", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "L'intestazione principale visualizzata sulla pagina di manutenzione", "pageTitleDescription": "L'intestazione principale visualizzata sulla pagina di manutenzione",
"maintenancePageMessage": "Messaggio di Manutenzione", "maintenancePageMessage": "Messaggio di Manutenzione",
"maintenancePageMessagePlaceholder": "Torneremo presto! Il nostro sito è attualmente in manutenzione programmata.", "maintenancePageMessagePlaceholder": "Torneremo presto! Il nostro sito è attualmente in manutenzione programmata.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Sei sicuro di voler disassociare questo provider di identità da questa organizzazione?", "idpUnassociateQuestion": "Sei sicuro di voler disassociare questo provider di identità da questa organizzazione?",
"idpUnassociateDescription": "Tutti gli utenti associati a questo provider di identità verranno rimossi da questa organizzazione, ma il provider di identità continuerà ad esistere per altre organizzazioni associate.", "idpUnassociateDescription": "Tutti gli utenti associati a questo provider di identità verranno rimossi da questa organizzazione, ma il provider di identità continuerà ad esistere per altre organizzazioni associate.",
"idpUnassociateConfirm": "Conferma Disassociazione Provider di Identità", "idpUnassociateConfirm": "Conferma Disassociazione Provider di Identità",
"idpConfirmDeleteAndRemoveMeFromOrg": "CANCELLA E RIMUOVIMI DALL'ORGANIZZAZIONE", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "DISASSOCIA E RIMUOVIMI DALL'ORGANIZZAZIONE", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Questo non può essere annullato per questa organizzazione.", "idpUnassociateWarning": "Questo non può essere annullato per questa organizzazione.",
"idpUnassociatedDescription": "Provider di identità disassociato con successo da questa organizzazione", "idpUnassociatedDescription": "Provider di identità disassociato con successo da questa organizzazione",
"idpUnassociateMenu": "Disassocia", "idpUnassociateMenu": "Disassocia",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Connessione…", "sshConnecting": "Connessione…",
"sshInitializing": "Inizializzazione…", "sshInitializing": "Inizializzazione…",
"sshSignInTitle": "Accedi a SSH", "sshSignInTitle": "Accedi a SSH",
"sshSignInDescription": "Inserisci le tue credenziali SSH per connetterti", "sshSignInDescription": "Inserisci le tue credenziali SSH",
"sshPasswordTab": "Password", "sshPasswordTab": "Password",
"sshPrivateKeyTab": "Chiave Privata", "sshPrivateKeyTab": "Chiave Privata",
"sshPrivateKeyField": "Chiave Privata", "sshPrivateKeyField": "Chiave Privata",
"sshPrivateKeyDisclaimer": "La tua chiave privata non è memorizzata o visibile a Pangolin. In alternativa, puoi utilizzare certificati a vita breve per un'autenticazione continua utilizzando la tua identità Pangolin esistente.", "sshPrivateKeyDisclaimer": "La tua chiave privata non è memorizzata o visibile a Pangolin. In alternativa, puoi utilizzare certificati a vita breve per un'autenticazione continua utilizzando la tua identità Pangolin esistente.",
"sshLearnMore": "Scopri di più", "sshLearnMore": "Scopri di più",
"sshPrivateKeyFile": "File Chiave Privata", "sshPrivateKeyFile": "File Chiave Privata",
"sshAuthenticate": "Connetti", "sshAuthenticate": "Autentica",
"sshTerminate": "Termina", "sshTerminate": "Termina",
"sshPoweredBy": "Offerto da", "sshPoweredBy": "Offerto da",
"sshErrorNoTarget": "Nessun obiettivo specificato", "sshErrorNoTarget": "Nessun obiettivo specificato",
"sshErrorWebSocket": "Connessione WebSocket fallita", "sshErrorWebSocket": "Connessione WebSocket fallita",
"sshErrorAuthFailed": "Autenticazione fallita", "sshErrorAuthFailed": "Autenticazione fallita",
"sshErrorConnectionClosed": "Connessione chiusa prima del completamento dell'autenticazione", "sshErrorConnectionClosed": "Connessione chiusa prima del completamento dell'autenticazione",
"sitePangolinSshDescription": "Consenti l'accesso SSH alle risorse su questo sito. Questo può essere modificato in seguito.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Nessuna risorsa trovata per questo dominio", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Nessun bersaglio", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Connetti", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Canc", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Impossibile firmare la chiave SSH per l'autenticazione push PAM. Ti sei autenticato come utente?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Errore: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Connessione chiusa (codice {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "È richiesta una chiave privata", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Inserisci la tua password VNC per connetterti", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Password (opzionale)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Nessun bersaglio di risorsa disponibile", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Impossibile caricare noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Stato {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Incolla appunti", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Accedi al Desktop Remoto", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Inserisci le credenziali di Windows per connetterti", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Caricamento modulo...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Impossibile caricare il modulo RDP", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Non pronto", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "Il modulo RDP è ancora in inizializzazione", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Scaricamento di {count} file(s) da remoto…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Download fallito: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Caricato: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Nessun bersaglio di connessione disponibile", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Connessione fallita", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Adatta", "rdpFit": "Fit",
"rdpFull": "Completo", "rdpFull": "Full",
"rdpReal": "Reale", "rdpReal": "Real",
"rdpMeta": "Meta", "rdpMeta": "Meta",
"rdpUploadFiles": "Carica file", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "File pronti per essere incollati", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} file(s) copiati negli appunti remoti — premi Ctrl+V sul desktop remoto per incollare.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Caricamento fallito", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Modalità tastiera Unicode", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Mostra barra degli strumenti", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Nascondi barra degli strumenti" "sessionToolbarHide": "Hide toolbar"
} }
+185 -186
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "개인 리소스 보기", "sitesTableViewPrivateResources": "개인 리소스 보기",
"siteInstallNewt": "Newt 설치", "siteInstallNewt": "Newt 설치",
"siteInstallNewtDescription": "시스템에서 Newt 실행하기", "siteInstallNewtDescription": "시스템에서 Newt 실행하기",
"siteInstallKubernetesDocsDescription": "더 많은 정보와 최신의 쿠버네티스 설치 정보를 보려면 <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>를 참조하세요.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Advantech 모뎀 설치 지침은 <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>을 참조하세요.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "WireGuard 구성", "WgConfiguration": "WireGuard 구성",
"WgConfigurationDescription": "네트워크에 연결하기 위한 다음 구성을 사용하세요.", "WgConfigurationDescription": "네트워크에 연결하기 위한 다음 구성을 사용하세요.",
"operatingSystem": "운영 체제", "operatingSystem": "운영 체제",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "이것은 한 번만 볼 수 있습니다. 안전한 장소에 복사해 두세요.", "siteCredentialsSaveDescription": "이것은 한 번만 볼 수 있습니다. 안전한 장소에 복사해 두세요.",
"siteInfo": "사이트 정보", "siteInfo": "사이트 정보",
"status": "상태", "status": "상태",
"shareTitle": "공유 가능한 링크 관리", "shareTitle": "Manage Shareable Links",
"shareDescription": "공유 가능한 링크를 생성하여 프록시 리소스에 임시 또는 영구적으로 액세스하세요.", "shareDescription": "공유 가능한 링크를 생성하여 프록시 리소스에 임시 또는 영구적으로 액세스하세요.",
"shareSearch": "공유 가능한 링크 검색...", "shareSearch": "Search shareable links...",
"shareCreate": "공유 가능한 링크 생성", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "링크 삭제에 실패했습니다.", "shareErrorDelete": "링크 삭제에 실패했습니다.",
"shareErrorDeleteMessage": "링크 삭제 중 오류가 발생했습니다.", "shareErrorDeleteMessage": "링크 삭제 중 오류가 발생했습니다.",
"shareDeleted": "링크가 삭제되었습니다.", "shareDeleted": "링크가 삭제되었습니다.",
"shareDeletedDescription": "링크가 삭제되었습니다.", "shareDeletedDescription": "링크가 삭제되었습니다.",
"shareDelete": "공유 가능한 링크 삭제", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "공유 가능한 링크 삭제 확인", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "이 공유 링크를 삭제하시겠습니까?", "shareQuestionRemove": "이 공유 링크를 삭제하시겠습니까?",
"shareMessageRemove": "삭제되면 링크가 더 이상 작동하지 않으며, 이를 사용하는 모든 사용자는 자원에 대한 접근을 잃게 됩니다.", "shareMessageRemove": "삭제되면 링크가 더 이상 작동하지 않으며, 이를 사용하는 모든 사용자는 자원에 대한 접근을 잃게 됩니다.",
"shareTokenDescription": "액세스 토큰은 쿼리 매개변수 또는 요청 헤더의 두 가지 방법으로 전달될 수 있습니다. 이는 인증된 액세스를 위해 클라이언트에서 모든 요청마다 전달되어야 합니다.", "shareTokenDescription": "액세스 토큰은 쿼리 매개변수 또는 요청 헤더의 두 가지 방법으로 전달될 수 있습니다. 이는 인증된 액세스를 위해 클라이언트에서 모든 요청마다 전달되어야 합니다.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "이 링크가 있는 누구나 리소스에 접근할 수 있습니다.", "shareCreateDescription": "이 링크가 있는 누구나 리소스에 접근할 수 있습니다.",
"shareTitleOptional": "제목 (선택 사항)", "shareTitleOptional": "제목 (선택 사항)",
"sharePathOptional": "경로 (선택 사항)", "sharePathOptional": "경로 (선택 사항)",
"sharePathDescription": "링크는 인증 후 이 경로로 사용자를 리디렉션합니다.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "만료됨", "expireIn": "만료됨",
"neverExpire": "만료되지 않음", "neverExpire": "만료되지 않음",
"shareExpireDescription": "만료 시간은 링크가 사용 가능하고 리소스에 접근할 수 있는 기간입니다. 이 시간이 지나면 링크는 더 이상 작동하지 않으며, 이 링크를 사용한 사용자는 리소스에 대한 접근 권한을 잃게 됩니다.", "shareExpireDescription": "만료 시간은 링크가 사용 가능하고 리소스에 접근할 수 있는 기간입니다. 이 시간이 지나면 링크는 더 이상 작동하지 않으며, 이 링크를 사용한 사용자는 리소스에 대한 접근 권한을 잃게 됩니다.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "리소스를 선택하세요", "shareErrorSelectResource": "리소스를 선택하세요",
"proxyResourceTitle": "공개 리소스 관리", "proxyResourceTitle": "공개 리소스 관리",
"proxyResourceDescription": "웹 브라우저를 통해 공용으로 접근할 수 있는 리소스를 생성하고 관리하세요.", "proxyResourceDescription": "웹 브라우저를 통해 공용으로 접근할 수 있는 리소스를 생성하고 관리하세요.",
"publicResourcesBannerTitle": "웹 기반의 공개 액세스", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "공공 자원은 누구나 웹 브라우저를 통해 접근 가능한 HTTPS 프록시입니다. 개인 자원과 달리 클라이언트 측 소프트웨어가 필요하지 않으며, 아이덴티티 및 컨텍스트 인지 접근 정책을 포함할 수 있습니다.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "개인 리소스 관리", "clientResourceTitle": "개인 리소스 관리",
"clientResourceDescription": "연결된 클라이언트를 통해서만 접근할 수 있는 리소스를 생성하고 관리하세요.", "clientResourceDescription": "연결된 클라이언트를 통해서만 접근할 수 있는 리소스를 생성하고 관리하세요.",
"privateResourcesBannerTitle": "제로 트러스트 개인 접근", "privateResourcesBannerTitle": "제로 트러스트 개인 접근",
@@ -212,19 +212,18 @@
"resourcesSearch": "리소스 검색...", "resourcesSearch": "리소스 검색...",
"resourceAdd": "리소스 추가", "resourceAdd": "리소스 추가",
"resourceErrorDelte": "리소스 삭제 중 오류 발생", "resourceErrorDelte": "리소스 삭제 중 오류 발생",
"resourcePoliciesBannerTitle": "인증 및 액세스 규칙 재사용", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "공유 리소스 정책을 사용하면 한 번 인증 방법 및 액세스 규칙을 정의하고, 여러 공개 리소스에 첨부할 수 있습니다. 정책을 업데이트하면 모든 연결된 리소스가 자동으로 변경 사항을 상속받습니다.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "자세히 알아보기", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "공개 리소스 정책 관리", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "리소스",
"resourcePoliciesAttachedResources": "{count} 리소스", "resourcePoliciesAttachedResources": "{count} 리소스",
"resourcePoliciesAttachedResourcesCount": "{count, plural, other {# 자원}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "리소스 없음", "resourcePoliciesAttachedResourcesEmpty": "리소스 없음",
"resourcePoliciesDescription": "공개 리소스에 대한 인증 정책을 생성하고 관리하여 접근을 제어합니다", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "정책 검색...", "resourcePoliciesSearch": "정책 검색...",
"resourcePoliciesAdd": "정책 추가", "resourcePoliciesAdd": "정책 추가",
"resourcePoliciesDefaultBadgeText": "기본 정책", "resourcePoliciesDefaultBadgeText": "기본 정책",
"resourcePoliciesCreate": "공개 리소스 정책 생성", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "새로운 정책을 생성하려면 아래 단계들을 따르세요", "resourcePoliciesCreateDescription": "새로운 정책을 생성하려면 아래 단계들을 따르세요",
"resourcePolicyName": "정책 이름", "resourcePolicyName": "정책 이름",
"resourcePolicyNameDescription": "이 정책에 리소스 간에 식별할 이름을 지정합니다", "resourcePolicyNameDescription": "이 정책에 리소스 간에 식별할 이름을 지정합니다",
@@ -281,7 +280,7 @@
"back": "뒤로", "back": "뒤로",
"cancel": "취소", "cancel": "취소",
"resourceConfig": "구성 스니펫", "resourceConfig": "구성 스니펫",
"resourceConfigDescription": "TCP/UDP 리소스를 설정하기 위해 이 구성 스니펫을 복사하여 붙여넣으세요.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: 엔트리포인트 추가", "resourceAddEntrypoints": "Traefik: 엔트리포인트 추가",
"resourceExposePorts": "Gerbil: Docker Compose에서 포트 노출", "resourceExposePorts": "Gerbil: Docker Compose에서 포트 노출",
"resourceLearnRaw": "TCP/UDP 리소스 구성 방법 알아보기", "resourceLearnRaw": "TCP/UDP 리소스 구성 방법 알아보기",
@@ -294,8 +293,8 @@
"labelDelete": "레이블 삭제", "labelDelete": "레이블 삭제",
"labelAdd": "레이블 추가", "labelAdd": "레이블 추가",
"labelCreateSuccessMessage": "레이블이 성공적으로 생성되었습니다", "labelCreateSuccessMessage": "레이블이 성공적으로 생성되었습니다",
"labelDuplicateError": "중복 레이블", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "이 이름의 레이블이 이미 존재합니다.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "레이블이 성공적으로 수정되었습니다", "labelEditSuccessMessage": "레이블이 성공적으로 수정되었습니다",
"labelNameField": "레이블 이름", "labelNameField": "레이블 이름",
"labelColorField": "레이블 색상", "labelColorField": "레이블 색상",
@@ -320,7 +319,7 @@
"rules": "규칙", "rules": "규칙",
"resourceSettingDescription": "리소스의 설정을 구성하세요.", "resourceSettingDescription": "리소스의 설정을 구성하세요.",
"resourceSetting": "{resourceName} 설정", "resourceSetting": "{resourceName} 설정",
"resourcePolicySettingDescription": "이 공개 리소스 정책의 설정을 구성하세요", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "{policyName} 설정", "resourcePolicySetting": "{policyName} 설정",
"alwaysAllow": "인증 우회", "alwaysAllow": "인증 우회",
"alwaysDeny": "접근 차단", "alwaysDeny": "접근 차단",
@@ -728,7 +727,7 @@
"targetSubmit": "대상 추가", "targetSubmit": "대상 추가",
"targetNoOne": "이 리소스에는 대상이 없습니다. 백엔드로 요청을 보낼 대상을 구성하려면 대상을 추가하세요.", "targetNoOne": "이 리소스에는 대상이 없습니다. 백엔드로 요청을 보낼 대상을 구성하려면 대상을 추가하세요.",
"targetNoOneDescription": "위에 하나 이상의 대상을 추가하면 로드 밸런싱이 활성화됩니다.", "targetNoOneDescription": "위에 하나 이상의 대상을 추가하면 로드 밸런싱이 활성화됩니다.",
"targetsSubmit": "설정 저장", "targetsSubmit": "Save Settings",
"addTarget": "대상 추가", "addTarget": "대상 추가",
"proxyMultiSiteRoundRobinNodeHelp": "라운드 로빈 라우팅은 동일한 노드에 연결되지 않은 사이트 간에는 작동하지 않으나, 대체 라우팅은 작동합니다.", "proxyMultiSiteRoundRobinNodeHelp": "라운드 로빈 라우팅은 동일한 노드에 연결되지 않은 사이트 간에는 작동하지 않으나, 대체 라우팅은 작동합니다.",
"targetErrorInvalidIp": "유효하지 않은 IP 주소", "targetErrorInvalidIp": "유효하지 않은 IP 주소",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "중복 규칙", "rulesErrorDuplicate": "중복 규칙",
"rulesErrorDuplicateDescription": "이 설정을 가진 규칙이 이미 존재합니다.", "rulesErrorDuplicateDescription": "이 설정을 가진 규칙이 이미 존재합니다.",
"rulesErrorInvalidIpAddressRange": "유효하지 않은 CIDR", "rulesErrorInvalidIpAddressRange": "유효하지 않은 CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "유효한 CIDR 범위를 입력하세요 (예: 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "유효하지 않은 경로", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "유효한 URL 경로 또는 패턴을 입력하세요 (예: /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "유효하지 않은 IP 주소", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "유효한 IPv4 또는 IPv6 주소를 입력하세요.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "규칙 업데이트에 실패했습니다.", "rulesErrorUpdate": "규칙 업데이트에 실패했습니다.",
"rulesErrorUpdateDescription": "규칙 업데이트 중 오류가 발생했습니다.", "rulesErrorUpdateDescription": "규칙 업데이트 중 오류가 발생했습니다.",
"rulesUpdated": "규칙 활성화", "rulesUpdated": "규칙 활성화",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "CIDR 형식으로 주소를 입력하세요 (예: 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "CIDR 형식으로 주소를 입력하세요 (예: 103.21.244.0/22)",
"rulesMatchIpAddress": "IP 주소를 입력하세요 (예: 103.21.244.12)", "rulesMatchIpAddress": "IP 주소를 입력하세요 (예: 103.21.244.12)",
"rulesMatchUrl": "URL 경로 또는 패턴을 입력하세요 (예: /api/v1/todos 또는 /api/v1/*)", "rulesMatchUrl": "URL 경로 또는 패턴을 입력하세요 (예: /api/v1/todos 또는 /api/v1/*)",
"rulesErrorInvalidPriority": "유효하지 않은 우선순위", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "1 이상의 정수를 입력하세요.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "중복된 우선순위", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "각 규칙은 고유한 우선순위 번호를 가져야 합니다.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "유효하지 않은 규칙", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "규칙 {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "유효한 매칭 유형을 선택하세요 (경로, IP, CIDR, 국가, 지역, 또는 ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "이 규칙에 대한 값을 입력하세요.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "유효하지 않은 국가", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "유효한 국가를 선택하세요.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "유효하지 않은 ASN", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "유효한 ASN을 입력하세요 (예: AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "규칙이 업데이트되었습니다", "ruleUpdated": "규칙이 업데이트되었습니다",
"ruleUpdatedDescription": "규칙이 성공적으로 업데이트되었습니다", "ruleUpdatedDescription": "규칙이 성공적으로 업데이트되었습니다",
"ruleErrorUpdate": "작업 실패", "ruleErrorUpdate": "작업 실패",
"ruleErrorUpdateDescription": "저장 작업 중 오류가 발생했습니다.", "ruleErrorUpdateDescription": "저장 작업 중 오류가 발생했습니다.",
"rulesPriority": "우선순위", "rulesPriority": "우선순위",
"rulesReorderDragHandle": "드래그하여 규칙 우선순위 재정렬", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "작업", "rulesAction": "작업",
"rulesMatchType": "일치 유형", "rulesMatchType": "일치 유형",
"value": "값", "value": "값",
@@ -810,7 +809,7 @@
"rulesResource": "리소스 규칙 구성", "rulesResource": "리소스 규칙 구성",
"rulesResourceDescription": "리소스에 대한 접근을 제어하는 규칙 구성", "rulesResourceDescription": "리소스에 대한 접근을 제어하는 규칙 구성",
"ruleSubmit": "규칙 추가", "ruleSubmit": "규칙 추가",
"rulesNoOne": "아직 규칙이 없습니다.", "rulesNoOne": "No rules yet.",
"rulesOrder": "규칙은 우선 순위에 따라 오름차순으로 평가됩니다.", "rulesOrder": "규칙은 우선 순위에 따라 오름차순으로 평가됩니다.",
"rulesSubmit": "규칙 저장", "rulesSubmit": "규칙 저장",
"policyErrorCreate": "정책 생성 오류", "policyErrorCreate": "정책 생성 오류",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "예기치 않은 오류가 발생했습니다", "policyErrorUpdateMessageDescription": "예기치 않은 오류가 발생했습니다",
"policyCreatedSuccess": "리소스 정책이 성공적으로 생성되었습니다", "policyCreatedSuccess": "리소스 정책이 성공적으로 생성되었습니다",
"policyUpdatedSuccess": "리소스 정책이 성공적으로 업데이트되었습니다", "policyUpdatedSuccess": "리소스 정책이 성공적으로 업데이트되었습니다",
"authMethodsSave": "설정 저장", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "인증", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "이 리소스에 접근하려면 어떤 인증 방법이 필요한지 제어합니다", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "다수의 인증 방법 활성화", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "방문자는 아래 활성화된 방법 중 하나만을 선택하여 인증할 수 있습니다. 모든 방법을 완료할 필요는 없습니다.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "활성화", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "비활성화", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "플랫폼 SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "사용자의 아이덴티티 공급자를 통해 로그인 필요", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} 사용자, {roles} 역할", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "기본 공급자", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "기본 아이덴티티 공급자 추가", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "기타 방법", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "플랫폼 SSO 대신 또는 함께 사용할 수 있는 선택적 방법", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "패스코드", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "리소스 접근을 위한 공유 알파벳 및 숫자 패스코드 필요", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "패스코드 설정됨", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "PIN 코드", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "리소스 접근에 필요한 짧은 숫자 코드", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "6자리 PIN 코드 설정됨", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "이메일 화이트리스트", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "허용된 이메일 주소로 일회용 비밀번호 전송", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count}개의 주소 허용됨", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "이메일 화이트리스트를 활성화하면 로그인 시 방문자의 이메일로 일회용 비밀번호가 전송됩니다.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "기본 헤더 인증", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "각 요청에서 맞춤 HTTP 헤더 이름 및 값을 검증", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "헤더 구성됨", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "헤더 이름", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "예상 값", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "패스코드 설정", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "PIN 코드 설정", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "이메일 화이트리스트 설정", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "기본 헤더 인증 설정", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "액세스 규칙", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "활성화되면 규칙은 내림차순으로 평가되며, 하나가 참으로 평가될 때까지 계속됩니다.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "규칙은 위에서 아래로 평가됩니다. 첫 번째 매칭 규칙이 결과를 결정합니다.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "규칙은 경로, IP 주소, 위치 또는 기타 기준에 따라 요청을 매칭합니다. 각 규칙은 인증 우회, 접근 차단 또는 인증 전송의 액션을 적용합니다. 매칭되는 규칙이 없으면, 트래픽은 인증으로 계속됩니다.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "규칙이 비활성화되면, 모든 트래픽은 인증으로 넘어갑니다.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "매칭되는 규칙이 없으면, 트래픽은 인증으로 넘어갑니다.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "리소스를 업데이트하는 동안 오류가 발생했습니다.", "resourcesErrorUpdateDescription": "리소스를 업데이트하는 동안 오류가 발생했습니다.",
"access": "접속", "access": "접속",
"accessControl": "액세스 제어", "accessControl": "액세스 제어",
"shareLink": "{resource} 공유 가능한 링크", "shareLink": "{resource} Shareable Link",
"resourceSelect": "리소스 선택", "resourceSelect": "리소스 선택",
"shareLinks": "공유 가능한 링크", "shareLinks": "Shareable Links",
"share": "공유 가능한 링크", "share": "공유 가능한 링크",
"shareDescription2": "리소스에 대한 공유 가능한 링크를 생성하세요. 링크는 리소스에 대한 임시 또는 무제한 액세스를 제공합니다. 링크를 생성할 때 만료 기간을 설정할 수 있습니다.", "shareDescription2": "리소스에 대한 공유 가능한 링크를 생성하세요. 링크는 리소스에 대한 임시 또는 무제한 액세스를 제공합니다. 링크를 생성할 때 만료 기간을 설정할 수 있습니다.",
"shareEasyCreate": "생성하고 공유하기 쉬움", "shareEasyCreate": "생성하고 공유하기 쉬움",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "관리자는 항상 이 리소스에 접근할 수 있습니다.", "resourceRoleDescription": "관리자는 항상 이 리소스에 접근할 수 있습니다.",
"resourcePolicySelectTitle": "리소스 액세스 정책", "resourcePolicySelectTitle": "리소스 액세스 정책",
"resourcePolicySelectDescription": "인증을 위한 리소스 정책 유형을 선택하세요", "resourcePolicySelectDescription": "인증을 위한 리소스 정책 유형을 선택하세요",
"resourcePolicyTypeLabel": "정책 유형", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "리소스 정책", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "인라인 리소스 정책", "resourcePolicyInline": "인라인 리소스 정책",
"resourcePolicyInlineDescription": "이 리소스에만 범위가 있는 액세스 정책", "resourcePolicyInlineDescription": "이 리소스에만 범위가 있는 액세스 정책",
"resourcePolicyShared": "공유 리소스 정책", "resourcePolicyShared": "공유 리소스 정책",
"resourcePolicySharedDescription": "이 리소스는 공유 정책을 사용합니다.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "공유 정책", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "이 리소스는 자체 정책을 가지고 있습니다.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "이 리소스는 자체 인증 및 접근 규칙 제어를 가지고 있습니다.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "이 리소스는 <policyLink>{policyName}</policyLink>에서 상속받습니다.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "이 리소스는 공유 정책을 사용합니다. 일부 인증 설정은 이 리소스에서 정책에 추가하기 위해 편집할 수 있습니다. 기본 정책을 변경하려면 <policyLink>{policyName}</policyLink>을 편집해야 합니다.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "이 리소스는 공유 정책을 사용합니다. 일부 액세스 규칙은 이 리소스에서 편집할 수 있습니다. 기본 정책을 변경하려면 <policyLink>{policyName}</policyLink>을 수정해야 합니다.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "접근 제어", "resourceUsersRoles": "접근 제어",
"resourceUsersRolesDescription": "이 리소스를 방문할 수 있는 사용자 및 역할을 구성하십시오", "resourceUsersRolesDescription": "이 리소스를 방문할 수 있는 사용자 및 역할을 구성하십시오",
"resourceUsersRolesSubmit": "접근 제어 저장", "resourceUsersRolesSubmit": "접근 제어 저장",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "가시성", "resourceVisibilityTitle": "가시성",
"resourceVisibilityTitleDescription": "리소스 가시성을 완전히 활성화하거나 비활성화", "resourceVisibilityTitleDescription": "리소스 가시성을 완전히 활성화하거나 비활성화",
"resourceGeneral": "일반 설정", "resourceGeneral": "일반 설정",
"resourceGeneralDescription": "이 리소스를 위한 이름, 주소 및 접근 정책을 구성하세요.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "리소스 세부 정보", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "이 리소스를 위한 표시 이름, 식별자 및 공개 도메인을 설정합니다.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "이 리소스를 위한 표시 이름, 식별자 및 공개 포트를 설정합니다.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "공공 주소", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "사용자가 이 리소스에 도달하는 방법을 구성하세요.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "인증 및 접근", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "이 리소스가 자체 정책을 사용하는지 또는 공유 정책에서 상속받는지를 선택하세요.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "리소스 활성화", "resourceEnable": "리소스 활성화",
"resourceTransfer": "리소스 전송", "resourceTransfer": "리소스 전송",
"resourceTransferDescription": "이 리소스를 다른 사이트로 전송", "resourceTransferDescription": "이 리소스를 다른 사이트로 전송",
@@ -1294,14 +1293,14 @@
"addLabels": "레이블 추가", "addLabels": "레이블 추가",
"siteLabelsTab": "레이블", "siteLabelsTab": "레이블",
"siteLabelsDescription": "이 사이트와 연결된 레이블을 관리합니다.", "siteLabelsDescription": "이 사이트와 연결된 레이블을 관리합니다.",
"labelsNotFound": "레이블을 찾을 수 없습니다.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "라벨을 생성하려면 위에서 입력을 시작하세요.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "레이블 검색", "labelSearch": "레이블 검색",
"labelSearchOrCreate": "레이블을 검색하거나 생성하세요", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, other {# 레이블}}", "accessLabelFilterCount": "{count, plural, other {# 레이블}}",
"labelOverflowCount": " +{count, plural, other {# 레이블}}", "labelOverflowCount": " +{count, plural, other {# 레이블}}",
"accessLabelFilterClear": "레이블 필터 초기화", "accessLabelFilterClear": "레이블 필터 초기화",
"accessFilterClear": "필터 지우기", "accessFilterClear": "Clear filters",
"selectColor": "색상 선택", "selectColor": "색상 선택",
"createNewLabel": "새 조직 레이블 \"{label}\" 만들기", "createNewLabel": "새 조직 레이블 \"{label}\" 만들기",
"inviteInvalidDescription": "초대 링크가 유효하지 않습니다.", "inviteInvalidDescription": "초대 링크가 유효하지 않습니다.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "리소스", "sidebarResources": "리소스",
"sidebarProxyResources": "공유", "sidebarProxyResources": "공유",
"sidebarClientResources": "비공개", "sidebarClientResources": "비공개",
"sidebarPolicies": "공유 정책들", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "공개 리소스", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "액세스 제어", "sidebarAccessControl": "액세스 제어",
"sidebarLogsAndAnalytics": "로그 및 분석", "sidebarLogsAndAnalytics": "로그 및 분석",
"sidebarTeam": "팀", "sidebarTeam": "팀",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "관리자", "sidebarAdmin": "관리자",
"sidebarInvitations": "초대", "sidebarInvitations": "초대",
"sidebarRoles": "역할", "sidebarRoles": "역할",
"sidebarShareableLinks": "공유 가능한 링크", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "API 키", "sidebarApiKeys": "API 키",
"sidebarProvisioning": "프로비저닝", "sidebarProvisioning": "프로비저닝",
"sidebarSettings": "설정", "sidebarSettings": "설정",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "리소스 {id}", "standaloneHcFilterResourceIdFallback": "리소스 {id}",
"blueprints": "청사진", "blueprints": "청사진",
"blueprintsLog": "블루프린트 로그", "blueprintsLog": "블루프린트 로그",
"blueprintsDescription": "이전에 블루프린트 응용 프로그램과 그 결과를 보거나 새 블루프린트를 적용하세요", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "청사진 추가", "blueprintAdd": "청사진 추가",
"blueprintGoBack": "모든 청사진 보기", "blueprintGoBack": "모든 청사진 보기",
"blueprintCreate": "청사진 생성", "blueprintCreate": "청사진 생성",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Docker 청사진 활성화", "enableDockerSocket": "Docker 청사진 활성화",
"enableDockerSocketDescription": "블루프린트 레이블을 위한 Docker 소켓 레이블 스크래핑을 활성화합니다. 소켓 경로는 사이트 커넥터에 제공되어야 합니다. 동작 방법에 대한 자세한 정보는 <docsLink>문서</docsLink>에서 확인하세요.", "enableDockerSocketDescription": "블루프린트 레이블을 위한 Docker 소켓 레이블 스크래핑을 활성화합니다. 소켓 경로는 사이트 커넥터에 제공되어야 합니다. 동작 방법에 대한 자세한 정보는 <docsLink>문서</docsLink>에서 확인하세요.",
"newtAutoUpdate": "사이트 자동 업데이트 활성화", "newtAutoUpdate": "사이트 자동 업데이트 활성화",
"newtAutoUpdateDescription": "활성화되면, 사이트 커넥터는 최신 버전을 자동으로 다운로드하고 재시작합니다. 각 사이트별로 이를 무시할 수 있습니다.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "사이트 자동 업데이트", "siteAutoUpdate": "사이트 자동 업데이트",
"siteAutoUpdateLabel": "자동 업데이트 활성화", "siteAutoUpdateLabel": "자동 업데이트 활성화",
"siteAutoUpdateDescription": "활성화되면, 이 사이트의 커넥터는 최신 버전을 자동으로 다운로드하고 재시작합니다.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "조직 기본값: {state}", "siteAutoUpdateOrgDefault": "조직 기본값: {state}",
"siteAutoUpdateOverriding": "조직 설정 재정의", "siteAutoUpdateOverriding": "조직 설정 재정의",
"siteAutoUpdateResetToOrg": "조직 기본값으로 재설정", "siteAutoUpdateResetToOrg": "조직 기본값으로 재설정",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "계정 설정이 완료되었습니다! 판골린에 오신 것을 환영합니다!", "accountSetupSuccess": "계정 설정이 완료되었습니다! 판골린에 오신 것을 환영합니다!",
"documentation": "문서", "documentation": "문서",
"saveAllSettings": "모든 설정 저장", "saveAllSettings": "모든 설정 저장",
"saveResourceTargets": "설정 저장", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "설정 저장", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "설정 저장", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "설정이 업데이트되었습니다", "settingsUpdated": "설정이 업데이트되었습니다",
"settingsUpdatedDescription": "설정이 성공적으로 업데이트되었습니다.", "settingsUpdatedDescription": "설정이 성공적으로 업데이트되었습니다.",
"settingsErrorUpdate": "설정 업데이트 실패", "settingsErrorUpdate": "설정 업데이트 실패",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "알 수 없음", "healthCheckUnknown": "알 수 없음",
"healthCheck": "상태 확인", "healthCheck": "상태 확인",
"configureHealthCheck": "상태 확인 설정", "configureHealthCheck": "상태 확인 설정",
"configureHealthCheckDescription": "리소스의 모니터링을 설정하여 항상 이용 가능하도록 하세요", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "상태 확인 활성화", "enableHealthChecks": "상태 확인 활성화",
"healthCheckDisabledStateDescription": "비활성화되면 이 사이트가 상태 확인을 수행하지 않으며 상태가 알 수 없는 것으로 간주됩니다.", "healthCheckDisabledStateDescription": "비활성화되면 이 사이트가 상태 확인을 수행하지 않으며 상태가 알 수 없는 것으로 간주됩니다.",
"enableHealthChecksDescription": "이 대상을 모니터링하여 건강 상태를 확인하세요. 필요에 따라 대상과 다른 엔드포인트를 모니터링할 수 있습니다.", "enableHealthChecksDescription": "이 대상을 모니터링하여 건강 상태를 확인하세요. 필요에 따라 대상과 다른 엔드포인트를 모니터링할 수 있습니다.",
"healthScheme": "방법", "healthScheme": "방법",
"healthSelectScheme": "방법 선택", "healthSelectScheme": "방법 선택",
"healthCheckPortInvalid": "포트는 1에서 65535 사이여야 합니다", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "경로", "healthCheckPath": "경로",
"healthHostname": "IP / 호스트", "healthHostname": "IP / 호스트",
"healthPort": "포트", "healthPort": "포트",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "장치 승인 요구", "requireDeviceApproval": "장치 승인 요구",
"requireDeviceApprovalDescription": "이 역할을 가진 사용자는 장치가 연결되기 전에 관리자의 승인이 필요합니다.", "requireDeviceApprovalDescription": "이 역할을 가진 사용자는 장치가 연결되기 전에 관리자의 승인이 필요합니다.",
"sshSettings": "SSH 설정", "sshSettings": "SSH 설정",
"sshAccess": "SSH 접속", "sshAccess": "SSH Access",
"rdpSettings": "RDP 설정", "rdpSettings": "RDP 설정",
"vncSettings": "VNC 설정", "vncSettings": "VNC 설정",
"sshServer": "SSH 서버", "sshServer": "SSH 서버",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "이 설정을 완료하기 전에 인증 데몬을 실행할 대상 호스트가 적절히 구성되었는지 확인하십시오. 그렇지 않으면 프로비저닝이 실패할 수 있습니다.", "sshDaemonDisclaimer": "이 설정을 완료하기 전에 인증 데몬을 실행할 대상 호스트가 적절히 구성되었는지 확인하십시오. 그렇지 않으면 프로비저닝이 실패할 수 있습니다.",
"sshDaemonPort": "데몬 포트", "sshDaemonPort": "데몬 포트",
"sshServerDestination": "서버 목적지", "sshServerDestination": "서버 목적지",
"sshServerDestinationDescription": "SSH 서버의 목적지를 설정합니다", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "대상지", "destination": "대상지",
"destinationRequired": "목적지가 필요합니다.", "destinationRequired": "Destination is required.",
"domainRequired": "도메인은 필수입니다.", "domainRequired": "Domain is required.",
"proxyPortRequired": "포트가 필요합니다.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "유효하지 않은 경로 구성입니다.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "유효하지 않은 재작성 경로 구성입니다.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "여러 사이트를 선택하면 고가용성을 위한 내구성 있는 라우팅 및 장애 조치를 활성화합니다.", "bgTargetMultiSiteDisclaimer": "여러 사이트를 선택하면 고가용성을 위한 내구성 있는 라우팅 및 장애 조치를 활성화합니다.",
"roleAllowSsh": "SSH 허용", "roleAllowSsh": "SSH 허용",
"roleAllowSshAllow": "허용", "roleAllowSshAllow": "허용",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "사용자는 sudo로 지정된 명령만 실행할 수 있습니다.", "sshSudoModeCommandsDescription": "사용자는 sudo로 지정된 명령만 실행할 수 있습니다.",
"sshSudo": "Sudo 허용", "sshSudo": "Sudo 허용",
"sshSudoCommands": "Sudo 명령", "sshSudoCommands": "Sudo 명령",
"sshSudoCommandsDescription": "사용자가 쉘에서 sudo로 실행할 수 있는 명령 목록, 쉼표, 공백 또는 새 줄로 구분됩니다. 절대 경로를 사용해야 합니다.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "홈 디렉터리 생성", "sshCreateHomeDir": "홈 디렉터리 생성",
"sshUnixGroups": "유닉스 그룹", "sshUnixGroups": "유닉스 그룹",
"sshUnixGroupsDescription": "사용자를 대상 호스트에 추가할 유닉스 그룹들, 쉼표, 공백 또는 새 줄로 구분됩니다.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "값을 입력하거나 .txt .csv 파일을 드롭하세요", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "파일에서 가져오기", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "{fileName}을(를) {fieldLabel}에 가져오는 중", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "첫 행 건너뛰기 (헤더)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "기존 항목 교체", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "기존 항목에 추가", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "가져오기 모드", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "미리보기", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {가져올 항목 없음} other {# 개의 항목 가져오기}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} 기존 + {imported} 가져옴 = {total} 총계", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "가져오기", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "지원되지 않는 파일 유형", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": ".txt .csv 파일만 지원됩니다.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "파일에서 항목을 찾을 수 없습니다", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "파일에 가져올 항목이 포함되어 있지 않습니다.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "재시도 횟수", "retryAttempts": "재시도 횟수",
"expectedResponseCodes": "예상 응답 코드", "expectedResponseCodes": "예상 응답 코드",
"expectedResponseCodesDescription": "정상 상태를 나타내는 HTTP 상태 코드입니다. 비워 두면 200-300이 정상으로 간주됩니다.", "expectedResponseCodesDescription": "정상 상태를 나타내는 HTTP 상태 코드입니다. 비워 두면 200-300이 정상으로 간주됩니다.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "프록시 프로토콜 활성화", "enableProxyProtocol": "프록시 프로토콜 활성화",
"proxyProtocolInfo": "TCP 백엔드에 대한 클라이언트 IP 주소를 유지합니다.", "proxyProtocolInfo": "TCP 백엔드에 대한 클라이언트 IP 주소를 유지합니다.",
"proxyProtocolVersion": "프록시 프로토콜 버전", "proxyProtocolVersion": "프록시 프로토콜 버전",
"version1": "버전 1 (추천)", "version1": "Version 1 (Recommended)",
"version2": "버전 2", "version2": "버전 2",
"version1Description": "텍스트 기반으로 널리 지원됩니다. 서버 전송이 동적 구성에 추가되었는지 확인하세요.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "바이너리 및 더 효율적이지만 호환성은 낮습니다. 서버 전송이 동적 구성에 추가되었는지 확인하세요.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "경고", "warning": "경고",
"proxyProtocolWarning": "백엔드 애플리케이션이 프록시 프로토콜 연결을 허용하도록 구성되어야 합니다. 백엔드가 프록시 프로토콜을 지원하지 않으면, 이를 활성화하면 모든 연결이 끊어집니다. 트래픽에서 온 프록시 프로토콜 헤더를 백엔드가 신뢰하도록 구성하십시오.", "proxyProtocolWarning": "백엔드 애플리케이션이 프록시 프로토콜 연결을 허용하도록 구성되어야 합니다. 백엔드가 프록시 프로토콜을 지원하지 않으면, 이를 활성화하면 모든 연결이 끊어집니다. 트래픽에서 온 프록시 프로토콜 헤더를 백엔드가 신뢰하도록 구성하십시오.",
"restarting": "재시작 중...", "restarting": "재시작 중...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "확인 입력", "enterConfirmation": "확인 입력",
"blueprintViewDetails": "세부 정보", "blueprintViewDetails": "세부 정보",
"defaultIdentityProvider": "기본 아이덴티티 공급자", "defaultIdentityProvider": "기본 아이덴티티 공급자",
"defaultIdentityProviderDescription": "사용자는 인증을 위해 이 아이덴티티 공급자로 자동 리디렉션됩니다.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "네트워크 설정", "editInternalResourceDialogNetworkSettings": "네트워크 설정",
"editInternalResourceDialogAccessPolicy": "액세스 정책", "editInternalResourceDialogAccessPolicy": "액세스 정책",
"editInternalResourceDialogAddRoles": "역할 추가", "editInternalResourceDialogAddRoles": "역할 추가",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "유지보수 모드 유형", "maintenanceModeType": "유지보수 모드 유형",
"showMaintenancePage": "방문자에게 유지보수 페이지 표시", "showMaintenancePage": "방문자에게 유지보수 페이지 표시",
"enableMaintenanceMode": "유지보수 모드 활성화", "enableMaintenanceMode": "유지보수 모드 활성화",
"enableMaintenanceModeDescription": "활성화되면 방문자는 리소스 대신 유지보수 페이지를 보게 됩니다.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "자동", "automatic": "자동",
"automaticModeDescription": "백엔드 타깃이 모두 다운되거나 건강하지 않을 때만 유지보수 페이지를 표시합니다. 적어도 하나의 타깃이 건강한 한 리소스는 정상 작동합니다.", "automaticModeDescription": "백엔드 타깃이 모두 다운되거나 건강하지 않을 때만 유지보수 페이지를 표시합니다. 적어도 하나의 타깃이 건강한 한 리소스는 정상 작동합니다.",
"forced": "강제", "forced": "강제",
@@ -3182,8 +3181,8 @@
"warning:": "경고:", "warning:": "경고:",
"forcedeModeWarning": "모든 트래픽이 유지보수 페이지로 전달됩니다. 백엔드 리소스는 어떠한 요청도 받지 않습니다.", "forcedeModeWarning": "모든 트래픽이 유지보수 페이지로 전달됩니다. 백엔드 리소스는 어떠한 요청도 받지 않습니다.",
"pageTitle": "페이지 제목", "pageTitle": "페이지 제목",
"maintenancePageContentSubsection": "페이지 콘텐츠", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "유지보수 페이지에 표시될 콘텐츠를 사용자 정의하세요", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "유지보수 페이지에 표시될 주요 제목", "pageTitleDescription": "유지보수 페이지에 표시될 주요 제목",
"maintenancePageMessage": "유지보수 메시지", "maintenancePageMessage": "유지보수 메시지",
"maintenancePageMessagePlaceholder": "곧 돌아오겠습니다! 사이트는 현재 예정된 유지보수를 진행 중입니다.", "maintenancePageMessagePlaceholder": "곧 돌아오겠습니다! 사이트는 현재 예정된 유지보수를 진행 중입니다.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "정말로 이 조직에서 이 아이덴티티 공급자의 연관을 해제하시겠습니까?", "idpUnassociateQuestion": "정말로 이 조직에서 이 아이덴티티 공급자의 연관을 해제하시겠습니까?",
"idpUnassociateDescription": "이 아이덴티티 공급자와 연관된 모든 사용자는 이 조직에서 제거될 것이지만, 아이덴티티 공급자는 다른 연관된 조직에 계속해서 존재할 것입니다.", "idpUnassociateDescription": "이 아이덴티티 공급자와 연관된 모든 사용자는 이 조직에서 제거될 것이지만, 아이덴티티 공급자는 다른 연관된 조직에 계속해서 존재할 것입니다.",
"idpUnassociateConfirm": "아이덴티티 공급자 연관 해제 확인", "idpUnassociateConfirm": "아이덴티티 공급자 연관 해제 확인",
"idpConfirmDeleteAndRemoveMeFromOrg": "조직에서 삭제하고 제거하기", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "조직에서 연관 해제하고 제거하기", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "이 조직에서 이것은 되돌릴 수 없습니다.", "idpUnassociateWarning": "이 조직에서 이것은 되돌릴 수 없습니다.",
"idpUnassociatedDescription": "아이덴티티 공급자가 이 조직에서 성공적으로 연관 해제되었습니다", "idpUnassociatedDescription": "아이덴티티 공급자가 이 조직에서 성공적으로 연관 해제되었습니다",
"idpUnassociateMenu": "연관 해제", "idpUnassociateMenu": "연관 해제",
@@ -3543,58 +3542,58 @@
"sshConnecting": "연결 중…", "sshConnecting": "연결 중…",
"sshInitializing": "초기화 중…", "sshInitializing": "초기화 중…",
"sshSignInTitle": "SSH에 로그인", "sshSignInTitle": "SSH에 로그인",
"sshSignInDescription": "연결하려면 SSH 자격 증명을 입력하세요", "sshSignInDescription": "SSH 자격 증명을 입력하세요",
"sshPasswordTab": "비밀번호", "sshPasswordTab": "비밀번호",
"sshPrivateKeyTab": "개인 키", "sshPrivateKeyTab": "개인 키",
"sshPrivateKeyField": "개인 키", "sshPrivateKeyField": "개인 키",
"sshPrivateKeyDisclaimer": "당신의 개인 키는 Pangolin에 저장되거나 보이지 않습니다. 대신, 기존 Pangolin 신원을 사용하여 매끄러운 인증을 제공하는 단기 인증서를 사용할 수 있습니다.", "sshPrivateKeyDisclaimer": "당신의 개인 키는 Pangolin에 저장되거나 보이지 않습니다. 대신, 기존 Pangolin 신원을 사용하여 매끄러운 인증을 제공하는 단기 인증서를 사용할 수 있습니다.",
"sshLearnMore": "자세히 알아보기", "sshLearnMore": "자세히 알아보기",
"sshPrivateKeyFile": "개인 키 파일", "sshPrivateKeyFile": "개인 키 파일",
"sshAuthenticate": "연결", "sshAuthenticate": "인증",
"sshTerminate": "종료", "sshTerminate": "종료",
"sshPoweredBy": "제공자", "sshPoweredBy": "제공자",
"sshErrorNoTarget": "지정된 대상이 없습니다", "sshErrorNoTarget": "지정된 대상이 없습니다",
"sshErrorWebSocket": "WebSocket 연결 실패", "sshErrorWebSocket": "WebSocket 연결 실패",
"sshErrorAuthFailed": "인증 실패", "sshErrorAuthFailed": "인증 실패",
"sshErrorConnectionClosed": "인증이 완료되기 전에 연결이 닫혔습니다", "sshErrorConnectionClosed": "인증이 완료되기 전에 연결이 닫혔습니다",
"sitePangolinSshDescription": "이 사이트의 리소스에 SSH 접속을 허용합니다. 나중에 변경할 수 있습니다.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "이 도메인에 대한 리소스를 찾을 수 없습니다", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "대상 없음", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "연결", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "PAM 푸시 인증을 위한 SSH 키 서명 실패. 사용자로 로그인하셨나요?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "오류: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "연결 종료됨 (코드 {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "프라이빗 키가 필요합니다", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "연결하려면 VNC 비밀번호를 입력하세요", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "비밀번호 (선택 사항)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "사용할 수 있는 리소스 대상이 없습니다", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "noVNC 로드를 실패했습니다", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "상태 {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "클립보드 붙여넣기", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "원격 데스크톱에 로그인", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "연결하려면 Windows 자격 증명을 입력하세요", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "모듈 로딩 중...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "RDP 모듈 로딩 실패", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "준비되지 않음", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "RDP 모듈이 아직 초기화 중입니다", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "원격에서 {count}개의 파일 다운로드 중…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "다운로드 실패: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "업로드 완료: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "연결 대상 없음", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "연결 실패", "rdpConnectionFailed": "Connection failed",
"rdpFit": "적합", "rdpFit": "Fit",
"rdpFull": "전체", "rdpFull": "Full",
"rdpReal": "실제", "rdpReal": "Real",
"rdpMeta": "메타", "rdpMeta": "Meta",
"rdpUploadFiles": "파일 업로드", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "붙여넣기 준비 완료된 파일", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count}개의 파일이 원격 클립보드에 복사되었습니다 — 원격 데스크탑에서 Ctrl+V를 눌러 붙여 넣으세요.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "업로드 실패", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "유니코드 키보드 모드", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "툴바 보기", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "툴바 숨기기" "sessionToolbarHide": "Hide toolbar"
} }
+182 -183
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Vis private ressurser", "sitesTableViewPrivateResources": "Vis private ressurser",
"siteInstallNewt": "Installer Newt", "siteInstallNewt": "Installer Newt",
"siteInstallNewtDescription": "Få Newt til å kjøre på systemet ditt", "siteInstallNewtDescription": "Få Newt til å kjøre på systemet ditt",
"siteInstallKubernetesDocsDescription": "For mer og oppdatert informasjon om Kubernetes-installasjon, se <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "For installasjonsinstruksjoner for Advantech-modem, se <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "WireGuard Konfigurasjon", "WgConfiguration": "WireGuard Konfigurasjon",
"WgConfigurationDescription": "Bruk følgende konfigurasjon for å koble til nettverket", "WgConfigurationDescription": "Bruk følgende konfigurasjon for å koble til nettverket",
"operatingSystem": "Operativsystem", "operatingSystem": "Operativsystem",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Du vil kun kunne se dette én gang. Sørg for å kopiere det til et sikkert sted.", "siteCredentialsSaveDescription": "Du vil kun kunne se dette én gang. Sørg for å kopiere det til et sikkert sted.",
"siteInfo": "Områdeinformasjon", "siteInfo": "Områdeinformasjon",
"status": "Status", "status": "Status",
"shareTitle": "Administrer delbare lenker", "shareTitle": "Manage Shareable Links",
"shareDescription": "Opprett delbare lenker for å gi midlertidige eller permanent tilgang til proxyressurser", "shareDescription": "Opprett delbare lenker for å gi midlertidige eller permanent tilgang til proxyressurser",
"shareSearch": "Søk delbare lenker...", "shareSearch": "Search shareable links...",
"shareCreate": "Opprett delbar lenke", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Klarte ikke å slette lenke", "shareErrorDelete": "Klarte ikke å slette lenke",
"shareErrorDeleteMessage": "En feil oppstod ved sletting av lenke", "shareErrorDeleteMessage": "En feil oppstod ved sletting av lenke",
"shareDeleted": "Lenke slettet", "shareDeleted": "Lenke slettet",
"shareDeletedDescription": "Lenken har blitt slettet", "shareDeletedDescription": "Lenken har blitt slettet",
"shareDelete": "Slett delbar lenke", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Bekreft sletting av delbar lenke", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Er du sikker på at du vil slette denne delingslenken?", "shareQuestionRemove": "Er du sikker på at du vil slette denne delingslenken?",
"shareMessageRemove": "Når slettet, vil lenken ikke lenger fungere, og alle som bruker den vil miste tilgang til ressursen.", "shareMessageRemove": "Når slettet, vil lenken ikke lenger fungere, og alle som bruker den vil miste tilgang til ressursen.",
"shareTokenDescription": "Adgangstoken kan sendes på to måter: som en spørringsparameter eller i forespørselsoverskriftene. Disse må sendes fra klienten på hver forespørsel om autentisert tilgang.", "shareTokenDescription": "Adgangstoken kan sendes på to måter: som en spørringsparameter eller i forespørselsoverskriftene. Disse må sendes fra klienten på hver forespørsel om autentisert tilgang.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Alle med denne lenken får tilgang til ressursen", "shareCreateDescription": "Alle med denne lenken får tilgang til ressursen",
"shareTitleOptional": "Tittel (valgfritt)", "shareTitleOptional": "Tittel (valgfritt)",
"sharePathOptional": "Bane (valgfritt)", "sharePathOptional": "Bane (valgfritt)",
"sharePathDescription": "Lenken vil videresende brukere til denne stien etter autentisering.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Utløper om", "expireIn": "Utløper om",
"neverExpire": "Utløper aldri", "neverExpire": "Utløper aldri",
"shareExpireDescription": "Utløpstid er hvor lenge lenken vil være brukbar og gi tilgang til ressursen. Etter denne tiden vil lenken ikke lenger fungere, og brukere som brukte denne lenken vil miste tilgangen til ressursen.", "shareExpireDescription": "Utløpstid er hvor lenge lenken vil være brukbar og gi tilgang til ressursen. Etter denne tiden vil lenken ikke lenger fungere, og brukere som brukte denne lenken vil miste tilgangen til ressursen.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Vennligst velg en ressurs", "shareErrorSelectResource": "Vennligst velg en ressurs",
"proxyResourceTitle": "Administrere offentlige ressurser", "proxyResourceTitle": "Administrere offentlige ressurser",
"proxyResourceDescription": "Opprett og administrer ressurser som er offentlig tilgjengelige via en nettleser", "proxyResourceDescription": "Opprett og administrer ressurser som er offentlig tilgjengelige via en nettleser",
"publicResourcesBannerTitle": "Web-basert offentlig tilgang", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Offentlige ressurser er HTTPS-proxyer som er tilgjengelige for alle på internett via en nettleser. I motsetning til private ressurser, krever de ikke klientprogramvare og kan inkludere identitets- og kontekstsensitive tilgangspolicyer.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Administrer private ressurser", "clientResourceTitle": "Administrer private ressurser",
"clientResourceDescription": "Opprette og administrere ressurser som bare er tilgjengelige via en tilkoblet klient", "clientResourceDescription": "Opprette og administrere ressurser som bare er tilgjengelige via en tilkoblet klient",
"privateResourcesBannerTitle": "Zero-Trust privat tilgang", "privateResourcesBannerTitle": "Zero-Trust privat tilgang",
@@ -212,19 +212,18 @@
"resourcesSearch": "Søk i ressurser...", "resourcesSearch": "Søk i ressurser...",
"resourceAdd": "Legg til ressurs", "resourceAdd": "Legg til ressurs",
"resourceErrorDelte": "Feil ved sletting av ressurs", "resourceErrorDelte": "Feil ved sletting av ressurs",
"resourcePoliciesBannerTitle": "Gjenbruk autentisering og tilgangsregler", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Delte ressursretningslinjer lar deg definere autentiseringsmetoder og tilgangsregler en gang, for deretter å knytte dem til flere offentlige ressurser. Når du oppdaterer en policy, arver alle tilknyttede ressurser endringen automatisk.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Lær mer", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Administrer offentlige ressursretningslinjer", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Ressurser",
"resourcePoliciesAttachedResources": "{count} ressurs(er)", "resourcePoliciesAttachedResources": "{count} ressurs(er)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# ressurs} other {# ressurser}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "ingen ressurser", "resourcePoliciesAttachedResourcesEmpty": "ingen ressurser",
"resourcePoliciesDescription": "Opprett og administrer autentiseringsretningslinjer for å kontrollere tilgang til dine offentlige ressurser", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Søk etter regler...", "resourcePoliciesSearch": "Søk etter regler...",
"resourcePoliciesAdd": "Legg til policy", "resourcePoliciesAdd": "Legg til policy",
"resourcePoliciesDefaultBadgeText": "Standard politisk", "resourcePoliciesDefaultBadgeText": "Standard politisk",
"resourcePoliciesCreate": "Opprett offentlig ressursretningslinje", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Følg trinnene nedenfor for å lage en ny policy", "resourcePoliciesCreateDescription": "Følg trinnene nedenfor for å lage en ny policy",
"resourcePolicyName": "Polisnavn", "resourcePolicyName": "Polisnavn",
"resourcePolicyNameDescription": "Gi denne policynavnet for å identifisere den på tvers av dine ressurser", "resourcePolicyNameDescription": "Gi denne policynavnet for å identifisere den på tvers av dine ressurser",
@@ -281,7 +280,7 @@
"back": "Tilbake", "back": "Tilbake",
"cancel": "Avbryt", "cancel": "Avbryt",
"resourceConfig": "Konfigurasjonsutdrag", "resourceConfig": "Konfigurasjonsutdrag",
"resourceConfigDescription": "Kopier og lim inn disse konfigurasjonsbitene for å sette opp TCP/UDP ressursen.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Legg til inngangspunkter", "resourceAddEntrypoints": "Traefik: Legg til inngangspunkter",
"resourceExposePorts": "Gerbil: Eksponer Porter i Docker Compose", "resourceExposePorts": "Gerbil: Eksponer Porter i Docker Compose",
"resourceLearnRaw": "Lær hvordan å konfigurere TCP/UDP-ressurser", "resourceLearnRaw": "Lær hvordan å konfigurere TCP/UDP-ressurser",
@@ -294,8 +293,8 @@
"labelDelete": "Slett etikett", "labelDelete": "Slett etikett",
"labelAdd": "Legg til etikett", "labelAdd": "Legg til etikett",
"labelCreateSuccessMessage": "Etikett opprettet vellykket", "labelCreateSuccessMessage": "Etikett opprettet vellykket",
"labelDuplicateError": "Dupliser etikett", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "En etikett med dette navnet finnes allerede.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Etikett endret vellykket", "labelEditSuccessMessage": "Etikett endret vellykket",
"labelNameField": "Etikettnavn", "labelNameField": "Etikettnavn",
"labelColorField": "Etikettfarge", "labelColorField": "Etikettfarge",
@@ -320,7 +319,7 @@
"rules": "Regler", "rules": "Regler",
"resourceSettingDescription": "Konfigurere innstillingene på ressursen", "resourceSettingDescription": "Konfigurere innstillingene på ressursen",
"resourceSetting": "{resourceName} Innstillinger", "resourceSetting": "{resourceName} Innstillinger",
"resourcePolicySettingDescription": "Konfigurer innstillingene for denne offentlige ressursretningslinjen", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "{policyName} Innstillinger", "resourcePolicySetting": "{policyName} Innstillinger",
"alwaysAllow": "Omgå Auth", "alwaysAllow": "Omgå Auth",
"alwaysDeny": "Blokker tilgang", "alwaysDeny": "Blokker tilgang",
@@ -728,7 +727,7 @@
"targetSubmit": "Legg til mål", "targetSubmit": "Legg til mål",
"targetNoOne": "Denne ressursen har ikke noen mål. Legg til et mål for å konfigurere hvor du vil sende forespørsler til backend.", "targetNoOne": "Denne ressursen har ikke noen mål. Legg til et mål for å konfigurere hvor du vil sende forespørsler til backend.",
"targetNoOneDescription": "Å legge til mer enn ett mål ovenfor vil aktivere lastbalansering.", "targetNoOneDescription": "Å legge til mer enn ett mål ovenfor vil aktivere lastbalansering.",
"targetsSubmit": "Lagre innstillinger", "targetsSubmit": "Save Settings",
"addTarget": "Legg til mål", "addTarget": "Legg til mål",
"proxyMultiSiteRoundRobinNodeHelp": "Rundkjøringrutefordeling vil ikke fungere mellom steder som ikke er koblet til samme node, men failover vil fungere.", "proxyMultiSiteRoundRobinNodeHelp": "Rundkjøringrutefordeling vil ikke fungere mellom steder som ikke er koblet til samme node, men failover vil fungere.",
"targetErrorInvalidIp": "Ugyldig IP-adresse", "targetErrorInvalidIp": "Ugyldig IP-adresse",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Duplisert regel", "rulesErrorDuplicate": "Duplisert regel",
"rulesErrorDuplicateDescription": "En regel med disse innstillingene finnes allerede", "rulesErrorDuplicateDescription": "En regel med disse innstillingene finnes allerede",
"rulesErrorInvalidIpAddressRange": "Ugyldig CIDR", "rulesErrorInvalidIpAddressRange": "Ugyldig CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "Skriv inn et gyldig CIDR-område (f.eks. 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Ugyldig sti", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Skriv inn en gyldig URL-sti eller et mønster (f.eks., /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Ugyldig IP-adresse", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Skriv inn en gyldig IPv4 eller IPv6 adresse.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Kunne ikke oppdatere regler", "rulesErrorUpdate": "Kunne ikke oppdatere regler",
"rulesErrorUpdateDescription": "Det oppsto en feil under oppdatering av regler", "rulesErrorUpdateDescription": "Det oppsto en feil under oppdatering av regler",
"rulesUpdated": "Aktiver Regler", "rulesUpdated": "Aktiver Regler",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Angi en adresse i CIDR-format (f.eks., 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Angi en adresse i CIDR-format (f.eks., 103.21.244.0/22)",
"rulesMatchIpAddress": "Angi en IP-adresse (f.eks. 103.21.244.12)", "rulesMatchIpAddress": "Angi en IP-adresse (f.eks. 103.21.244.12)",
"rulesMatchUrl": "Skriv inn en URL-sti eller et mønster (f.eks. /api/v1/todos eller /api/v1/*)", "rulesMatchUrl": "Skriv inn en URL-sti eller et mønster (f.eks. /api/v1/todos eller /api/v1/*)",
"rulesErrorInvalidPriority": "Ugyldig prioritet", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Skriv inn et heltall på 1 eller høyere.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Dupliserte prioriteter", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Hver regel må ha et unikt prioritetstall.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Ugyldige regler", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Regel {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Velg en gyldig samsvarstype (sti, IP, CIDR, land, region eller ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Skriv inn en verdi for denne regelen.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Ugyldig land", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Velg et gyldig land.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "Ugyldig ASN", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Skriv inn en gyldig ASN (f.eks., AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Regler oppdatert", "ruleUpdated": "Regler oppdatert",
"ruleUpdatedDescription": "Reglene er oppdatert", "ruleUpdatedDescription": "Reglene er oppdatert",
"ruleErrorUpdate": "Operasjon mislyktes", "ruleErrorUpdate": "Operasjon mislyktes",
"ruleErrorUpdateDescription": "En feil oppsto under lagringsoperasjonen", "ruleErrorUpdateDescription": "En feil oppsto under lagringsoperasjonen",
"rulesPriority": "Prioritet", "rulesPriority": "Prioritet",
"rulesReorderDragHandle": "Dra for å omorganisere regelprioriteringen", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Handling", "rulesAction": "Handling",
"rulesMatchType": "Trefftype", "rulesMatchType": "Trefftype",
"value": "Verdi", "value": "Verdi",
@@ -810,7 +809,7 @@
"rulesResource": "Konfigurasjon av ressursregler", "rulesResource": "Konfigurasjon av ressursregler",
"rulesResourceDescription": "Konfigurer regler for å kontrollere tilgang til ressursen", "rulesResourceDescription": "Konfigurer regler for å kontrollere tilgang til ressursen",
"ruleSubmit": "Legg til regel", "ruleSubmit": "Legg til regel",
"rulesNoOne": "Ingen regler ennå.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Regler evalueres etter prioritet i stigende rekkefølge.", "rulesOrder": "Regler evalueres etter prioritet i stigende rekkefølge.",
"rulesSubmit": "Lagre regler", "rulesSubmit": "Lagre regler",
"policyErrorCreate": "Feil ved opprettelse av policy", "policyErrorCreate": "Feil ved opprettelse av policy",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "En uventet feil oppstod", "policyErrorUpdateMessageDescription": "En uventet feil oppstod",
"policyCreatedSuccess": "Ressurspolitikken ble opprettet vellykket", "policyCreatedSuccess": "Ressurspolitikken ble opprettet vellykket",
"policyUpdatedSuccess": "Ressurspolitikken ble oppdatert vellykket", "policyUpdatedSuccess": "Ressurspolitikken ble oppdatert vellykket",
"authMethodsSave": "Lagre innstillinger", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Autentisering", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Kontroller hvilke autentiseringsmetoder som kreves for å få tilgang til denne ressursen", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Flere autentiseringsmetoder aktive", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Besøkende kan autentisere ved bruk av en hvilken som helst av de aktive metodene nedenfor. De trenger ikke å fullføre alle.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Aktiv", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Av", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "Plattform SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Krev pålogging gjennom din organisasjons identitetsleverandør", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} brukere, {roles} roller", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Standardleverandør", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Legg til standard identitetsleverandør", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Andre metoder", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Valgfrie metoder som besøkende kan bruke i stedet for eller i tillegg til plattform SSO", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Kodeord", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Krev en delt alfanumerisk kodeord for å få tilgang til ressursen", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Kodeord satt", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "PIN-kode", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "En kort numerisk kode kreves for å få tilgang til ressursen", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "6-sifret PIN satt", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "E-post hviteliste", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Tillat oppførte e-postadresser med engangspassord", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} adresser tillatt", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Aktivering av e-post hviteliste sender en engangskode til den besøkendes e-post ved innlogging.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Grunnleggende Header Autentisering", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Bekreft et tilpasset HTTP-headernavn og verdi ved hver forespørsel", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Header konfigurert", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Headernavn", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Forventet verdi", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Angi passordkode", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Sett PIN-kode", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Angi e-post hviteliste", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Sett grunnleggende Header Autentisering", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Tilgangsregler", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Når aktivert, blir regler evaluert i synkende rekkefølge til en evaluerer til sann.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Regler evalueres ovenfra og ned. Den første samsvarande regeln bestemmer utfall.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Regler samsvarer forespørsler etter sti, IP-adresse, lokasjon eller andre kriterier. Hver regel anvender en handling: omgå autentisering, blokkere tilgang, eller sende til autentisering. Hvis ingen regler samsvarer, fortsetter trafikken til autentisering.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Når regler er deaktivert, går all trafikk gjennom til autentisering.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Når ingen regler samsvarer, fortsetter trafikken til autentisering.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "En feil oppstod under oppdatering av ressursen", "resourcesErrorUpdateDescription": "En feil oppstod under oppdatering av ressursen",
"access": "Tilgang", "access": "Tilgang",
"accessControl": "Tilgangskontroll", "accessControl": "Tilgangskontroll",
"shareLink": "{resource} Delbar lenke", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Velg ressurs", "resourceSelect": "Velg ressurs",
"shareLinks": "Delbare lenker", "shareLinks": "Shareable Links",
"share": "Delbare lenker", "share": "Delbare lenker",
"shareDescription2": "Opprett delbare lenker til ressurser. Lenker gir midlertidig eller ubegrenset tilgang til din ressurs. Du kan konfigurere utløpsvarigheten på lenken når du oppretter en.", "shareDescription2": "Opprett delbare lenker til ressurser. Lenker gir midlertidig eller ubegrenset tilgang til din ressurs. Du kan konfigurere utløpsvarigheten på lenken når du oppretter en.",
"shareEasyCreate": "Enkelt å lage og dele", "shareEasyCreate": "Enkelt å lage og dele",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Administratorer har alltid tilgang til denne ressursen.", "resourceRoleDescription": "Administratorer har alltid tilgang til denne ressursen.",
"resourcePolicySelectTitle": "Ressurstilgangspolitikk", "resourcePolicySelectTitle": "Ressurstilgangspolitikk",
"resourcePolicySelectDescription": "Velg policytype for autentisering", "resourcePolicySelectDescription": "Velg policytype for autentisering",
"resourcePolicyTypeLabel": "Policy-type", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Ressurspolicy", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Inline Ressursregler", "resourcePolicyInline": "Inline Ressursregler",
"resourcePolicyInlineDescription": "Tilgangspolitikk som kun er gyldig for denne ressursen", "resourcePolicyInlineDescription": "Tilgangspolitikk som kun er gyldig for denne ressursen",
"resourcePolicyShared": "Delte Ressursregler", "resourcePolicyShared": "Delte Ressursregler",
"resourcePolicySharedDescription": "Denne ressursen bruker en delt policy.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Delt policy", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Denne ressursen har sin egen policy.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Denne ressursen har sine egne autentiserings- og tilgangskontroller.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Denne ressursen arver fra <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Denne ressursen bruker en delt policy. Noen autentiseringsinnstillinger kan redigeres på denne ressursen for å legge til policyen. For å endre den underliggende policyen, må du redigere til <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Denne ressursen bruker en delt policy. Noen tilgangsregler kan redigeres på denne ressursen. For å endre den underliggende policyen, må du redigere <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Tilgangskontroller", "resourceUsersRoles": "Tilgangskontroller",
"resourceUsersRolesDescription": "Konfigurer hvilke brukere og roller som har tilgang til denne ressursen", "resourceUsersRolesDescription": "Konfigurer hvilke brukere og roller som har tilgang til denne ressursen",
"resourceUsersRolesSubmit": "Lagre tilgangskontroller", "resourceUsersRolesSubmit": "Lagre tilgangskontroller",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Synlighet", "resourceVisibilityTitle": "Synlighet",
"resourceVisibilityTitleDescription": "Fullstendig aktiver eller deaktiver ressursynlighet", "resourceVisibilityTitleDescription": "Fullstendig aktiver eller deaktiver ressursynlighet",
"resourceGeneral": "Generelle innstillinger", "resourceGeneral": "Generelle innstillinger",
"resourceGeneralDescription": "Konfigurer navn, adresse og tilgangspolicy for denne ressursen.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Ressursdetaljer", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Angi visningsnavn, identifikator og offentlig tilgjengelig domene for denne ressursen.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Angi visningsnavn, identifikator og offentlig port for denne ressursen.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Offentlig adresse", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Konfigurer hvordan brukere får tilgang til denne ressursen.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Autentisering og tilgang", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Velg om denne ressursen bruker sin egen policy eller arver fra en delt policy.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Aktiver ressurs", "resourceEnable": "Aktiver ressurs",
"resourceTransfer": "Overfør Ressurs", "resourceTransfer": "Overfør Ressurs",
"resourceTransferDescription": "Overfør denne ressursen til et annet område", "resourceTransferDescription": "Overfør denne ressursen til et annet område",
@@ -1294,14 +1293,14 @@
"addLabels": "Legg til etiketter", "addLabels": "Legg til etiketter",
"siteLabelsTab": "Etiketter", "siteLabelsTab": "Etiketter",
"siteLabelsDescription": "Administrer etiketter knyttet til dette nettstedet.", "siteLabelsDescription": "Administrer etiketter knyttet til dette nettstedet.",
"labelsNotFound": "Ingen etiketter funnet.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Start å skrive ovenfor for å lage en etikett.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Søk etter etiketter", "labelSearch": "Søk etter etiketter",
"labelSearchOrCreate": "Søk eller opprett en etikett", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {en etikett} other {# etiketter}}", "accessLabelFilterCount": "{count, plural, one {en etikett} other {# etiketter}}",
"labelOverflowCount": "+{count, plural, one {en etikett} other {# etiketter}}", "labelOverflowCount": "+{count, plural, one {en etikett} other {# etiketter}}",
"accessLabelFilterClear": "Fjern etikettfiltre", "accessLabelFilterClear": "Fjern etikettfiltre",
"accessFilterClear": "Fjern filtre", "accessFilterClear": "Clear filters",
"selectColor": "Velg farge", "selectColor": "Velg farge",
"createNewLabel": "Opprett ny org-etikett \"{label}\"", "createNewLabel": "Opprett ny org-etikett \"{label}\"",
"inviteInvalidDescription": "Invitasjonslenken er ugyldig.", "inviteInvalidDescription": "Invitasjonslenken er ugyldig.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Ressurser", "sidebarResources": "Ressurser",
"sidebarProxyResources": "Offentlig", "sidebarProxyResources": "Offentlig",
"sidebarClientResources": "Privat", "sidebarClientResources": "Privat",
"sidebarPolicies": "Delte policies", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Offentlige ressurser", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Tilgangskontroll", "sidebarAccessControl": "Tilgangskontroll",
"sidebarLogsAndAnalytics": "Logger og analyser", "sidebarLogsAndAnalytics": "Logger og analyser",
"sidebarTeam": "Lag", "sidebarTeam": "Lag",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Administrator", "sidebarAdmin": "Administrator",
"sidebarInvitations": "Invitasjoner", "sidebarInvitations": "Invitasjoner",
"sidebarRoles": "Roller", "sidebarRoles": "Roller",
"sidebarShareableLinks": "Delbare lenker", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "API-nøkler", "sidebarApiKeys": "API-nøkler",
"sidebarProvisioning": "Levering", "sidebarProvisioning": "Levering",
"sidebarSettings": "Innstillinger", "sidebarSettings": "Innstillinger",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Ressurs {id}", "standaloneHcFilterResourceIdFallback": "Ressurs {id}",
"blueprints": "Tegninger", "blueprints": "Tegninger",
"blueprintsLog": "Blåkopieringslogg", "blueprintsLog": "Blåkopieringslogg",
"blueprintsDescription": "Se tidligere blueprint-applikasjoner og deres resultater, eller bruk et nytt blueprint", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Legg til blåkopi", "blueprintAdd": "Legg til blåkopi",
"blueprintGoBack": "Se alle blåkopier", "blueprintGoBack": "Se alle blåkopier",
"blueprintCreate": "Opprette mal", "blueprintCreate": "Opprette mal",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Aktiver Docker blåkopi", "enableDockerSocket": "Aktiver Docker blåkopi",
"enableDockerSocketDescription": "Aktiver Docker Socket etikett skrubbing for blueprint etiketter. Socket bane må oppgis til nettstedkobleren. Les om hvordan dette fungerer i <docsLink>dokumentasjonen</docsLink>.", "enableDockerSocketDescription": "Aktiver Docker Socket etikett skrubbing for blueprint etiketter. Socket bane må oppgis til nettstedkobleren. Les om hvordan dette fungerer i <docsLink>dokumentasjonen</docsLink>.",
"newtAutoUpdate": "Aktiver Automatisk Oppdatering av Nettsted", "newtAutoUpdate": "Aktiver Automatisk Oppdatering av Nettsted",
"newtAutoUpdateDescription": "Når aktivert, vil nettstedskoblinger automatisk laste ned den nyeste versjonen og starte seg selv på nytt. Dette kan overstyres på basis per nettsted.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Automatisk Oppdatering av Nettsted", "siteAutoUpdate": "Automatisk Oppdatering av Nettsted",
"siteAutoUpdateLabel": "Aktiver Automatisk Oppdatering", "siteAutoUpdateLabel": "Aktiver Automatisk Oppdatering",
"siteAutoUpdateDescription": "Når aktivert, vil denne nettstedets kobling automatisk laste ned den nyeste versjonen og starte seg selv på nytt.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Organisasjon standard: {state}", "siteAutoUpdateOrgDefault": "Organisasjon standard: {state}",
"siteAutoUpdateOverriding": "Overstyrer organisasjonens innstilling", "siteAutoUpdateOverriding": "Overstyrer organisasjonens innstilling",
"siteAutoUpdateResetToOrg": "Tilbakestill til Organisasjonsstandard", "siteAutoUpdateResetToOrg": "Tilbakestill til Organisasjonsstandard",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Kontooppsett fullført! Velkommen til Pangolin!", "accountSetupSuccess": "Kontooppsett fullført! Velkommen til Pangolin!",
"documentation": "Dokumentasjon", "documentation": "Dokumentasjon",
"saveAllSettings": "Lagre alle innstillinger", "saveAllSettings": "Lagre alle innstillinger",
"saveResourceTargets": "Lagre innstillinger", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Lagre innstillinger", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Lagre innstillinger", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Innstillinger oppdatert", "settingsUpdated": "Innstillinger oppdatert",
"settingsUpdatedDescription": "Innstillinger oppdatert vellykket", "settingsUpdatedDescription": "Innstillinger oppdatert vellykket",
"settingsErrorUpdate": "Klarte ikke å oppdatere innstillinger", "settingsErrorUpdate": "Klarte ikke å oppdatere innstillinger",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Ukjent", "healthCheckUnknown": "Ukjent",
"healthCheck": "Helsekontroll", "healthCheck": "Helsekontroll",
"configureHealthCheck": "Konfigurer Helsekontroll", "configureHealthCheck": "Konfigurer Helsekontroll",
"configureHealthCheckDescription": "Sett opp overvåking av ressursen din for å sikre at den alltid er tilgjengelig", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Aktiver Helsekontroller", "enableHealthChecks": "Aktiver Helsekontroller",
"healthCheckDisabledStateDescription": "Når deaktivert, vil ikke nettstedet utføre helsekontroller, og tilstanden vil anses som ukjent.", "healthCheckDisabledStateDescription": "Når deaktivert, vil ikke nettstedet utføre helsekontroller, og tilstanden vil anses som ukjent.",
"enableHealthChecksDescription": "Overvåk helsen til dette målet. Du kan overvåke et annet endepunkt enn målet hvis nødvendig.", "enableHealthChecksDescription": "Overvåk helsen til dette målet. Du kan overvåke et annet endepunkt enn målet hvis nødvendig.",
"healthScheme": "Metode", "healthScheme": "Metode",
"healthSelectScheme": "Velg metode", "healthSelectScheme": "Velg metode",
"healthCheckPortInvalid": "Porten må være mellom 1 og 65535", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Sti", "healthCheckPath": "Sti",
"healthHostname": "IP / Vert", "healthHostname": "IP / Vert",
"healthPort": "Port", "healthPort": "Port",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Krev enhetsgodkjenning", "requireDeviceApproval": "Krev enhetsgodkjenning",
"requireDeviceApprovalDescription": "Brukere med denne rollen trenger nye enheter godkjent av en admin før de kan koble seg og få tilgang til ressurser.", "requireDeviceApprovalDescription": "Brukere med denne rollen trenger nye enheter godkjent av en admin før de kan koble seg og få tilgang til ressurser.",
"sshSettings": "SSH Innstillinger", "sshSettings": "SSH Innstillinger",
"sshAccess": "SSH-tilgang", "sshAccess": "SSH Access",
"rdpSettings": "RDP Innstillinger", "rdpSettings": "RDP Innstillinger",
"vncSettings": "VNC Innstillinger", "vncSettings": "VNC Innstillinger",
"sshServer": "SSH-server", "sshServer": "SSH-server",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Sørg for at målenheten din er riktig konfigurert for å kjøre autentiseringsdaemon før du fullfører denne oppsettet, eller klargjøring vil mislykkes.", "sshDaemonDisclaimer": "Sørg for at målenheten din er riktig konfigurert for å kjøre autentiseringsdaemon før du fullfører denne oppsettet, eller klargjøring vil mislykkes.",
"sshDaemonPort": "Daemon-port", "sshDaemonPort": "Daemon-port",
"sshServerDestination": "Serverens Destinasjon", "sshServerDestination": "Serverens Destinasjon",
"sshServerDestinationDescription": "Konfigurer destinasjonen for SSH-serveren", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Destinasjon", "destination": "Destinasjon",
"destinationRequired": "Destinasjon er påkrevd.", "destinationRequired": "Destination is required.",
"domainRequired": "Domene er påkrevd.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Port er påkrevd.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Ugyldig sti-konfigurasjon.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Ugyldig omskrivingssti-konfigurasjon.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Ved å velge flere nettsteder aktiveres robust ruting og feilaktig avbrudd for høy tilgjengelighet.", "bgTargetMultiSiteDisclaimer": "Ved å velge flere nettsteder aktiveres robust ruting og feilaktig avbrudd for høy tilgjengelighet.",
"roleAllowSsh": "Tillat SSH", "roleAllowSsh": "Tillat SSH",
"roleAllowSshAllow": "Tillat", "roleAllowSshAllow": "Tillat",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "Brukeren kan bare kjøre de angitte kommandoene med sudo.", "sshSudoModeCommandsDescription": "Brukeren kan bare kjøre de angitte kommandoene med sudo.",
"sshSudo": "Tillat sudo", "sshSudo": "Tillat sudo",
"sshSudoCommands": "Sudo kommandoer", "sshSudoCommands": "Sudo kommandoer",
"sshSudoCommandsDescription": "Liste over kommandoer brukeren har lov til å kjøre med sudo, separert med komma, mellomrom eller nye linjer. Absolutte stier må brukes.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Opprett hjemmappe", "sshCreateHomeDir": "Opprett hjemmappe",
"sshUnixGroups": "Unix grupper", "sshUnixGroups": "Unix grupper",
"sshUnixGroupsDescription": "Unix-grupper å legge til brukeren i på målverten, separert med komma, mellomrom eller nye linjer.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Skriv inn verdier, eller slipp en .txt eller .csv fil", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Importer fra fil", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Importerer {fileName} til {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Hopp over første rad (header)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Erstatte eksisterende", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Legg til eksisterende", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Importmodus", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Forhåndsvisning", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Ingen elementer å importere} one {ett element å importere} other {# elementer å importere}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} eksisterende + {imported} importert = {total} totalt", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Import", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Ustøttet filtype", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Bare .txt og .csv filer er støttet.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Ingen elementer funnet i filen", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Filen inneholder ingen importerbare elementer.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Forsøk på nytt", "retryAttempts": "Forsøk på nytt",
"expectedResponseCodes": "Forventede svarkoder", "expectedResponseCodes": "Forventede svarkoder",
"expectedResponseCodesDescription": "HTTP-statuskode som indikerer sunn status. Hvis den blir stående tom, regnes 200-300 som sunn.", "expectedResponseCodesDescription": "HTTP-statuskode som indikerer sunn status. Hvis den blir stående tom, regnes 200-300 som sunn.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Aktiver Proxy-protokoll", "enableProxyProtocol": "Aktiver Proxy-protokoll",
"proxyProtocolInfo": "Bevar klientens IP-adresser for TCP backends", "proxyProtocolInfo": "Bevar klientens IP-adresser for TCP backends",
"proxyProtocolVersion": "Proxy protokoll versjon", "proxyProtocolVersion": "Proxy protokoll versjon",
"version1": "Versjon 1 (Anbefalt)", "version1": "Version 1 (Recommended)",
"version2": "Versjon 2", "version2": "Versjon 2",
"version1Description": "Tekstbasert og bredt støttet. Sørg for at servertransport er lagt til dynamisk konfigurasjon.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Binært og mer effektivt, men mindre kompatibel. Sørg for at servertransport er lagt til dynamisk konfigurasjon.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Advarsel", "warning": "Advarsel",
"proxyProtocolWarning": "backend-programmet må konfigureres til å akseptere forbindelser i Proxy Protokoll. Hvis backend ikke støtter Proxy Beskyttelse vil aktivering av dette ødelegge alle tilkoblinger så bare dette hvis du vet hva du gjør. Sørg for å konfigurere backend til å stole på Proxy Protokoll overskrifter fra Traefik.", "proxyProtocolWarning": "backend-programmet må konfigureres til å akseptere forbindelser i Proxy Protokoll. Hvis backend ikke støtter Proxy Beskyttelse vil aktivering av dette ødelegge alle tilkoblinger så bare dette hvis du vet hva du gjør. Sørg for å konfigurere backend til å stole på Proxy Protokoll overskrifter fra Traefik.",
"restarting": "Restarter...", "restarting": "Restarter...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Skriv inn bekreftelse", "enterConfirmation": "Skriv inn bekreftelse",
"blueprintViewDetails": "Detaljer", "blueprintViewDetails": "Detaljer",
"defaultIdentityProvider": "Standard identitetsleverandør", "defaultIdentityProvider": "Standard identitetsleverandør",
"defaultIdentityProviderDescription": "Brukeren vil automatisk bli videresendt til denne identitetsleverandøren for autentisering.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Nettverksinnstillinger", "editInternalResourceDialogNetworkSettings": "Nettverksinnstillinger",
"editInternalResourceDialogAccessPolicy": "Tilgangsregler for tilgang", "editInternalResourceDialogAccessPolicy": "Tilgangsregler for tilgang",
"editInternalResourceDialogAddRoles": "Legg til roller", "editInternalResourceDialogAddRoles": "Legg til roller",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Vedlikeholdsmodus type", "maintenanceModeType": "Vedlikeholdsmodus type",
"showMaintenancePage": "Vis en vedlikeholdsside til besøkende", "showMaintenancePage": "Vis en vedlikeholdsside til besøkende",
"enableMaintenanceMode": "Aktiver vedlikeholdsmodus", "enableMaintenanceMode": "Aktiver vedlikeholdsmodus",
"enableMaintenanceModeDescription": "Når aktivert, vil besøkende se en vedlikeholdsside i stedet for ressursen din.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automatisk", "automatic": "Automatisk",
"automaticModeDescription": "Vis vedlikeholdsside kun når alle serverens mål er nede eller usunne. Ressursen din fortsetter å fungere normalt så lenge minst ett mål er sunt.", "automaticModeDescription": "Vis vedlikeholdsside kun når alle serverens mål er nede eller usunne. Ressursen din fortsetter å fungere normalt så lenge minst ett mål er sunt.",
"forced": "Tvunget", "forced": "Tvunget",
@@ -3182,8 +3181,8 @@
"warning:": "Advarsel:", "warning:": "Advarsel:",
"forcedeModeWarning": "All trafikk vil bli dirigeres til vedlikeholdssiden. Serverens ressurser vil ikke motta noen forespørsler.", "forcedeModeWarning": "All trafikk vil bli dirigeres til vedlikeholdssiden. Serverens ressurser vil ikke motta noen forespørsler.",
"pageTitle": "Sidetittel", "pageTitle": "Sidetittel",
"maintenancePageContentSubsection": "Sideinnhold", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Tilpass innholdet som vises på vedlikeholdssiden", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "Hovedoverskriften vist på vedlikeholdssiden", "pageTitleDescription": "Hovedoverskriften vist på vedlikeholdssiden",
"maintenancePageMessage": "Vedlikeholdsbeskjed", "maintenancePageMessage": "Vedlikeholdsbeskjed",
"maintenancePageMessagePlaceholder": "Vi kommer snart tilbake! Vårt nettsted gjennomgår for øyeblikket planlagt vedlikehold.", "maintenancePageMessagePlaceholder": "Vi kommer snart tilbake! Vårt nettsted gjennomgår for øyeblikket planlagt vedlikehold.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Er du sikker på at du vil frakoble denne identitetsleverandøren fra denne organisasjonen?", "idpUnassociateQuestion": "Er du sikker på at du vil frakoble denne identitetsleverandøren fra denne organisasjonen?",
"idpUnassociateDescription": "Alle brukere knyttet til denne identitetsleverandøren vil bli fjernet fra denne organisasjonen, men identitetsleverandøren vil fortsatt eksistere for andre tilknyttede organisasjoner.", "idpUnassociateDescription": "Alle brukere knyttet til denne identitetsleverandøren vil bli fjernet fra denne organisasjonen, men identitetsleverandøren vil fortsatt eksistere for andre tilknyttede organisasjoner.",
"idpUnassociateConfirm": "Bekreft frakobling av identitetsleverandør", "idpUnassociateConfirm": "Bekreft frakobling av identitetsleverandør",
"idpConfirmDeleteAndRemoveMeFromOrg": "SLETT OG FJERN MEG FRA ORGANISASJONEN", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "AVKOBLE OG FJERN MEG FRA ORGANISASJONEN", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Dette kan ikke angres for denne organisasjonen.", "idpUnassociateWarning": "Dette kan ikke angres for denne organisasjonen.",
"idpUnassociatedDescription": "Identitetsleverandør er vellykket frakoblet fra denne organisasjonen", "idpUnassociatedDescription": "Identitetsleverandør er vellykket frakoblet fra denne organisasjonen",
"idpUnassociateMenu": "Frakoble", "idpUnassociateMenu": "Frakoble",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Kobler til…", "sshConnecting": "Kobler til…",
"sshInitializing": "Initialiserer…", "sshInitializing": "Initialiserer…",
"sshSignInTitle": "Logg inn på SSH", "sshSignInTitle": "Logg inn på SSH",
"sshSignInDescription": "Skriv inn dine SSH-legitimasjon for å koble til", "sshSignInDescription": "Oppgi dine SSH-legitimasjoner",
"sshPasswordTab": "Passord", "sshPasswordTab": "Passord",
"sshPrivateKeyTab": "Privat Nøkkel", "sshPrivateKeyTab": "Privat Nøkkel",
"sshPrivateKeyField": "Privat Nøkkel", "sshPrivateKeyField": "Privat Nøkkel",
"sshPrivateKeyDisclaimer": "Din private nøkkel er ikke lagret eller synlig for Pangolin. Alternativt kan du bruke kortevaliderte sertifikater for sømløs autentisering ved å bruke din eksisterende Pangolin-identitet.", "sshPrivateKeyDisclaimer": "Din private nøkkel er ikke lagret eller synlig for Pangolin. Alternativt kan du bruke kortevaliderte sertifikater for sømløs autentisering ved å bruke din eksisterende Pangolin-identitet.",
"sshLearnMore": "Lær mer", "sshLearnMore": "Lær mer",
"sshPrivateKeyFile": "Privat Nøkkelfil", "sshPrivateKeyFile": "Privat Nøkkelfil",
"sshAuthenticate": "Koble til", "sshAuthenticate": "Autentiser",
"sshTerminate": "Avslutt", "sshTerminate": "Avslutt",
"sshPoweredBy": "Drevet av", "sshPoweredBy": "Drevet av",
"sshErrorNoTarget": "Ingen mål spesifisert", "sshErrorNoTarget": "Ingen mål spesifisert",
"sshErrorWebSocket": "WebSocket-tilkobling mislyktes", "sshErrorWebSocket": "WebSocket-tilkobling mislyktes",
"sshErrorAuthFailed": "Autentisering mislyktes", "sshErrorAuthFailed": "Autentisering mislyktes",
"sshErrorConnectionClosed": "Tilkobling avsluttet før autentisering ble fullført", "sshErrorConnectionClosed": "Tilkobling avsluttet før autentisering ble fullført",
"sitePangolinSshDescription": "Tillat SSH-tilgang til ressurser på dette nettstedet. Dette kan endres senere.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Ingen ressurser funnet for dette domenet", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Ingen mål", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Koble til", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Kunne ikke signere SSH-nøkkel for PAM-påloggingsautentisering. Logget du inn som bruker?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Feil: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Tilkoblingen ble lukket (kode {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGYNN OPENSSH PRIVAT NØKKEL-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Privat nøkkel er påkrevd", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Skriv inn VNC-passordet for å koble til", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Passord (valgfritt)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Ingen ressursemål tilgjengelig", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Klarte ikke å laste noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Status {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Lim inn utklippstavle", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Logg på Fjernskrivebord", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Skriv inn Windows-legitimasjon for å koble til", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Laster modul...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Kunne ikke laste RDP-modul", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Ikke klar", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "RDP-modulen er fortsatt under initialisering", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Laster ned {count} fil(er) fra fjern…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Nedlasting feilet: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Opplastet: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Ingen tilkoblingsmål tilgjengelig", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Tilkoblingen feilet", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Tilpass", "rdpFit": "Fit",
"rdpFull": "Full", "rdpFull": "Full",
"rdpReal": "Ekte", "rdpReal": "Real",
"rdpMeta": "Meta", "rdpMeta": "Meta",
"rdpUploadFiles": "Last opp filer", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Filer klare til å limes inn", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} fil(er) kopiert til fjernutklippstavlen — trykk Ctrl+V på fjernskrivebordet for å lime inn.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Opplastningen mislyktes", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Unicode tastaturmodus", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Vis verktøylinje", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Skjul verktøylinje" "sessionToolbarHide": "Hide toolbar"
} }
+182 -183
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Privébronnen bekijken", "sitesTableViewPrivateResources": "Privébronnen bekijken",
"siteInstallNewt": "Installeer Newt", "siteInstallNewt": "Installeer Newt",
"siteInstallNewtDescription": "Laat Newt draaien op uw systeem", "siteInstallNewtDescription": "Laat Newt draaien op uw systeem",
"siteInstallKubernetesDocsDescription": "Voor meer informatie over de installatie van Kubernetes, zie <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Voor instructies voor de installatie van Advantech modems, zie <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "WireGuard Configuratie", "WgConfiguration": "WireGuard Configuratie",
"WgConfigurationDescription": "Gebruik de volgende configuratie om verbinding te maken met het netwerk", "WgConfigurationDescription": "Gebruik de volgende configuratie om verbinding te maken met het netwerk",
"operatingSystem": "Operating systeem", "operatingSystem": "Operating systeem",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Je kunt dit slechts één keer zien. Kopieer het naar een beveiligde plek.", "siteCredentialsSaveDescription": "Je kunt dit slechts één keer zien. Kopieer het naar een beveiligde plek.",
"siteInfo": "Site informatie", "siteInfo": "Site informatie",
"status": "Status", "status": "Status",
"shareTitle": "Beheer Deelbare Links", "shareTitle": "Manage Shareable Links",
"shareDescription": "Maak deelbare links aan om tijdelijke of permanente toegang tot proxybronnen te verlenen", "shareDescription": "Maak deelbare links aan om tijdelijke of permanente toegang tot proxybronnen te verlenen",
"shareSearch": "Zoek deelbare links...", "shareSearch": "Search shareable links...",
"shareCreate": "Creëer Deelbare Link", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Kan link niet verwijderen", "shareErrorDelete": "Kan link niet verwijderen",
"shareErrorDeleteMessage": "Fout opgetreden tijdens het verwijderen link", "shareErrorDeleteMessage": "Fout opgetreden tijdens het verwijderen link",
"shareDeleted": "Link verwijderd", "shareDeleted": "Link verwijderd",
"shareDeletedDescription": "De link is verwijderd", "shareDeletedDescription": "De link is verwijderd",
"shareDelete": "Verwijder Deelbare Link", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Bevestig Verwijdering Deelbare Link", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Weet u zeker dat u deze deel link wilt verwijderen?", "shareQuestionRemove": "Weet u zeker dat u deze deel link wilt verwijderen?",
"shareMessageRemove": "Zodra verwijderd, zal de link niet meer werken en zal iedereen die het gebruikt de toegang tot de bron verliezen.", "shareMessageRemove": "Zodra verwijderd, zal de link niet meer werken en zal iedereen die het gebruikt de toegang tot de bron verliezen.",
"shareTokenDescription": "De toegangstoken kan op twee manieren worden doorgegeven: als queryparameter of in de aanvraagheaders. Deze moeten worden doorgegeven van de client op elk verzoek voor geverifieerde toegang.", "shareTokenDescription": "De toegangstoken kan op twee manieren worden doorgegeven: als queryparameter of in de aanvraagheaders. Deze moeten worden doorgegeven van de client op elk verzoek voor geverifieerde toegang.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Iedereen met deze link heeft toegang tot de pagina", "shareCreateDescription": "Iedereen met deze link heeft toegang tot de pagina",
"shareTitleOptional": "Titel (optioneel)", "shareTitleOptional": "Titel (optioneel)",
"sharePathOptional": "Pad (optioneel)", "sharePathOptional": "Pad (optioneel)",
"sharePathDescription": "De link zal gebruikers naar dit pad doorsturen na authenticatie.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Vervalt in", "expireIn": "Vervalt in",
"neverExpire": "Nooit verlopen", "neverExpire": "Nooit verlopen",
"shareExpireDescription": "Vervaltijd is hoe lang de link bruikbaar is en geeft toegang tot de bron. Na deze tijd zal de link niet meer werken en zullen gebruikers die deze link hebben gebruikt de toegang tot de pagina verliezen.", "shareExpireDescription": "Vervaltijd is hoe lang de link bruikbaar is en geeft toegang tot de bron. Na deze tijd zal de link niet meer werken en zullen gebruikers die deze link hebben gebruikt de toegang tot de pagina verliezen.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Selecteer een bron", "shareErrorSelectResource": "Selecteer een bron",
"proxyResourceTitle": "Openbare bronnen beheren", "proxyResourceTitle": "Openbare bronnen beheren",
"proxyResourceDescription": "Creëer en beheer bronnen die openbaar toegankelijk zijn via een webbrowser", "proxyResourceDescription": "Creëer en beheer bronnen die openbaar toegankelijk zijn via een webbrowser",
"publicResourcesBannerTitle": "Web-gebaseerde Openbare Toegang", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Openbare bronnen zijn HTTPS-proxies die toegankelijk zijn voor iedereen op het internet via een webbrowser. In tegenstelling tot privébronnen hoeven ze geen client-software te hebben en kunnen ze identiteit- en context bewuste toegangsmiddelen bevatten.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Privébronnen beheren", "clientResourceTitle": "Privébronnen beheren",
"clientResourceDescription": "Creëer en beheer bronnen die alleen toegankelijk zijn via een verbonden client", "clientResourceDescription": "Creëer en beheer bronnen die alleen toegankelijk zijn via een verbonden client",
"privateResourcesBannerTitle": "Zero-Trust Private Access", "privateResourcesBannerTitle": "Zero-Trust Private Access",
@@ -212,19 +212,18 @@
"resourcesSearch": "Zoek bronnen...", "resourcesSearch": "Zoek bronnen...",
"resourceAdd": "Bron toevoegen", "resourceAdd": "Bron toevoegen",
"resourceErrorDelte": "Fout bij verwijderen document", "resourceErrorDelte": "Fout bij verwijderen document",
"resourcePoliciesBannerTitle": "Herbruik Authenticatie en Toegangsregels", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Gedeelde bronbeleidslijnen laten u authenticatiemethoden en toegangsregels eenmaal definiëren, en ze vervolgens koppelen aan meerdere openbare bronnen. Wanneer u een beleid bijwerkt, erft elke gekoppelde bron de wijziging automatisch.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Meer informatie", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Beheer Openbare Bronnenbeleid", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Bronnen",
"resourcePoliciesAttachedResources": "{count} bron(nen)", "resourcePoliciesAttachedResources": "{count} bron(nen)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# bron} other {# bronnen}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "geen bronnen", "resourcePoliciesAttachedResourcesEmpty": "geen bronnen",
"resourcePoliciesDescription": "Creëer en beheer authenticatiebeleid om toegang tot uw openbare bronnen te controleren", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Beleidsregels zoeken...", "resourcePoliciesSearch": "Beleidsregels zoeken...",
"resourcePoliciesAdd": "Beleid toevoegen", "resourcePoliciesAdd": "Beleid toevoegen",
"resourcePoliciesDefaultBadgeText": "Standaard beleidsregel", "resourcePoliciesDefaultBadgeText": "Standaard beleidsregel",
"resourcePoliciesCreate": "Openbare Bronbeleid maken", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Volg de onderstaande stappen om een nieuw beleid aan te maken", "resourcePoliciesCreateDescription": "Volg de onderstaande stappen om een nieuw beleid aan te maken",
"resourcePolicyName": "Beleidsregelnaam", "resourcePolicyName": "Beleidsregelnaam",
"resourcePolicyNameDescription": "Geef deze beleidsregel een naam om deze te identificeren in uw bronnen", "resourcePolicyNameDescription": "Geef deze beleidsregel een naam om deze te identificeren in uw bronnen",
@@ -281,7 +280,7 @@
"back": "Achterzijde", "back": "Achterzijde",
"cancel": "Annuleren", "cancel": "Annuleren",
"resourceConfig": "Configuratie tekstbouwstenen", "resourceConfig": "Configuratie tekstbouwstenen",
"resourceConfigDescription": "Kopieer en plak deze configuratiesnippets om de TCP/UDP-bron op te zetten.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Entrypoints toevoegen", "resourceAddEntrypoints": "Traefik: Entrypoints toevoegen",
"resourceExposePorts": "Gerbild: Gevangen blootstellen in Docker Compose", "resourceExposePorts": "Gerbild: Gevangen blootstellen in Docker Compose",
"resourceLearnRaw": "Leer hoe je TCP/UDP bronnen kunt configureren", "resourceLearnRaw": "Leer hoe je TCP/UDP bronnen kunt configureren",
@@ -294,8 +293,8 @@
"labelDelete": "Label verwijderen", "labelDelete": "Label verwijderen",
"labelAdd": "Label toevoegen", "labelAdd": "Label toevoegen",
"labelCreateSuccessMessage": "Label succesvol aangemaakt", "labelCreateSuccessMessage": "Label succesvol aangemaakt",
"labelDuplicateError": "Dubbel Label", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Een label met deze naam bestaat al.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Label succesvol gewijzigd", "labelEditSuccessMessage": "Label succesvol gewijzigd",
"labelNameField": "Labelnaam", "labelNameField": "Labelnaam",
"labelColorField": "Label kleur", "labelColorField": "Label kleur",
@@ -320,7 +319,7 @@
"rules": "Regels", "rules": "Regels",
"resourceSettingDescription": "Configureer de instellingen in de bron", "resourceSettingDescription": "Configureer de instellingen in de bron",
"resourceSetting": "{resourceName} instellingen", "resourceSetting": "{resourceName} instellingen",
"resourcePolicySettingDescription": "Configureer de instellingen van dit openbare bronbeleid", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "{policyName} instellingen", "resourcePolicySetting": "{policyName} instellingen",
"alwaysAllow": "Authenticatie omzeilen", "alwaysAllow": "Authenticatie omzeilen",
"alwaysDeny": "Blokkeer toegang", "alwaysDeny": "Blokkeer toegang",
@@ -728,7 +727,7 @@
"targetSubmit": "Doelwit toevoegen", "targetSubmit": "Doelwit toevoegen",
"targetNoOne": "Deze bron heeft geen doelwitten. Voeg een doel toe om te configureren waar verzoeken naar de backend verzonden kunnen worden.", "targetNoOne": "Deze bron heeft geen doelwitten. Voeg een doel toe om te configureren waar verzoeken naar de backend verzonden kunnen worden.",
"targetNoOneDescription": "Het toevoegen van meer dan één doel hierboven zal de load balancering mogelijk maken.", "targetNoOneDescription": "Het toevoegen van meer dan één doel hierboven zal de load balancering mogelijk maken.",
"targetsSubmit": "Instellingen opslaan", "targetsSubmit": "Save Settings",
"addTarget": "Doelwit toevoegen", "addTarget": "Doelwit toevoegen",
"proxyMultiSiteRoundRobinNodeHelp": "Round-robin routering werkt niet tussen locaties die niet met hetzelfde knooppunt zijn verbonden, maar failover werkt wel.", "proxyMultiSiteRoundRobinNodeHelp": "Round-robin routering werkt niet tussen locaties die niet met hetzelfde knooppunt zijn verbonden, maar failover werkt wel.",
"targetErrorInvalidIp": "Ongeldig IP-adres", "targetErrorInvalidIp": "Ongeldig IP-adres",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Dupliceer regel", "rulesErrorDuplicate": "Dupliceer regel",
"rulesErrorDuplicateDescription": "Een regel met deze instellingen bestaat al", "rulesErrorDuplicateDescription": "Een regel met deze instellingen bestaat al",
"rulesErrorInvalidIpAddressRange": "Ongeldige CIDR", "rulesErrorInvalidIpAddressRange": "Ongeldige CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "Voer een geldig CIDR-bereik in (bijv. 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Ongeldig pad", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Voer een geldig URL-pad of patroon in (bijv. /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Ongeldig IP-adres", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Voer een geldig IPv4- of IPv6-adres in.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Regels bijwerken mislukt", "rulesErrorUpdate": "Regels bijwerken mislukt",
"rulesErrorUpdateDescription": "Fout opgetreden tijdens het bijwerken van de regels", "rulesErrorUpdateDescription": "Fout opgetreden tijdens het bijwerken van de regels",
"rulesUpdated": "Regels inschakelen", "rulesUpdated": "Regels inschakelen",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Voer een adres in in het CIDR-formaat (bijv. 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Voer een adres in in het CIDR-formaat (bijv. 103.21.244.0/22)",
"rulesMatchIpAddress": "Voer een IP-adres in (bijv. 103.21.244.12)", "rulesMatchIpAddress": "Voer een IP-adres in (bijv. 103.21.244.12)",
"rulesMatchUrl": "Voer een URL-pad of patroon in (bijv. /api/v1/todos of /api/v1/*)", "rulesMatchUrl": "Voer een URL-pad of patroon in (bijv. /api/v1/todos of /api/v1/*)",
"rulesErrorInvalidPriority": "Ongeldige prioriteit", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Voer een geheel getal van 1 of hoger in.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Dubbele prioriteiten", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Elke regel moet een uniek prioriteitsnummer hebben.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Ongeldige regels", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Regel {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Selecteer een geldig matchtype (pad, IP, CIDR, land, regio of ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Voer een waarde in voor deze regel.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Ongeldig land", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Selecteer een geldig land.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "Ongeldige ASN", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Voer een geldig ASN in (bijv. AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Regels bijgewerkt", "ruleUpdated": "Regels bijgewerkt",
"ruleUpdatedDescription": "Regels met succes bijgewerkt", "ruleUpdatedDescription": "Regels met succes bijgewerkt",
"ruleErrorUpdate": "Bewerking mislukt", "ruleErrorUpdate": "Bewerking mislukt",
"ruleErrorUpdateDescription": "Er is een fout opgetreden tijdens het opslaan", "ruleErrorUpdateDescription": "Er is een fout opgetreden tijdens het opslaan",
"rulesPriority": "Prioriteit", "rulesPriority": "Prioriteit",
"rulesReorderDragHandle": "Sleep om de regelprioriteit te herordenen", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "actie", "rulesAction": "actie",
"rulesMatchType": "Wedstrijd Type", "rulesMatchType": "Wedstrijd Type",
"value": "Waarde", "value": "Waarde",
@@ -810,7 +809,7 @@
"rulesResource": "Configuratie Resource Regels", "rulesResource": "Configuratie Resource Regels",
"rulesResourceDescription": "Regels instellen om toegang tot de bron te beheren", "rulesResourceDescription": "Regels instellen om toegang tot de bron te beheren",
"ruleSubmit": "Regel toevoegen", "ruleSubmit": "Regel toevoegen",
"rulesNoOne": "Nog geen regels.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Regels worden in oplopende volgorde volgens prioriteit beoordeeld.", "rulesOrder": "Regels worden in oplopende volgorde volgens prioriteit beoordeeld.",
"rulesSubmit": "Regels opslaan", "rulesSubmit": "Regels opslaan",
"policyErrorCreate": "Fout bij het maken van beleid", "policyErrorCreate": "Fout bij het maken van beleid",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Er is een onverwachte fout opgetreden", "policyErrorUpdateMessageDescription": "Er is een onverwachte fout opgetreden",
"policyCreatedSuccess": "Bronbeleid met succes aangemaakt", "policyCreatedSuccess": "Bronbeleid met succes aangemaakt",
"policyUpdatedSuccess": "Bronbeleid succesvol bijgewerkt", "policyUpdatedSuccess": "Bronbeleid succesvol bijgewerkt",
"authMethodsSave": "Instellingen opslaan", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Authenticatie", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Bepaal welke authenticatiemethoden vereist zijn om toegang tot deze bron te krijgen", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Meerdere authenticatiemethoden actief", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Bezoekers kunnen zich aanmelden met een van de hieronder actieve methoden. Ze hoeven ze niet allemaal te voltooien.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Actief", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Uit", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "Platform SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Vereis inloggen via de identiteit provider van uw organisatie", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} gebruikers, {roles} rollen", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Standaard provider", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Standaard Identiteit Provider Toevoegen", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Andere Methoden", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Optionele methoden die bezoekers kunnen gebruiken in plaats van of samen met platform SSO", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Toegangscode", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Vereis een alfanumerieke toegangscode om toegang te krijgen tot de bron", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Toegangscode ingesteld", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "Pincode", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Een korte numerieke code vereist om toegang tot de bron te krijgen", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "6-cijferige Pincode ingesteld", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "E-mail Whitelist", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Sta vermelde e-mailadressen toe met eenmalige wachtwoorden", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} adressen toegestaan", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Het inschakelen van e-mailwhitelist stuurt een eenmalig wachtwoord naar de e-mail van de bezoeker bij het inloggen.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Basic Header Authenticatie", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Valideer een aangepaste HTTP-headernaam en waarde bij elk verzoek", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Header geconfigureerd", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Header naam", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Verwachte waarde", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Stel toegangscode in", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Stel Pincode in", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Stel E-mail Whitelist in", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Stel Basis Header Authenticatie in", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Toegang Regels", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Wanneer ingeschakeld, worden regels in aflopende volgorde geëvalueerd totdat er één als waar wordt geoordeeld.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Regels worden van boven naar beneden geëvalueerd. De eerste overeenkomstige regel bepaalt de uitkomst.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Regels komen overeen met verzoeken op basis van pad, IP-adres, locatie of andere criteria. Elke regel past een actie toe: authenticatie omzeilen, toegang blokkeren of authenticatie doorgeven. Als er geen regel overeenkomt, gaat het verkeer door naar authenticatie.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Wanneer regels zijn uitgeschakeld, passeert al het verkeer naar authenticatie.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Wanneer geen regel overeenkomt, passeert het verkeer naar authenticatie.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Er is een fout opgetreden tijdens het bijwerken van het document", "resourcesErrorUpdateDescription": "Er is een fout opgetreden tijdens het bijwerken van het document",
"access": "Toegangsrechten", "access": "Toegangsrechten",
"accessControl": "Toegangs controle", "accessControl": "Toegangs controle",
"shareLink": "{resource} Deelbare Link", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Selecteer resource", "resourceSelect": "Selecteer resource",
"shareLinks": "Deelbare Links", "shareLinks": "Shareable Links",
"share": "Deelbare links", "share": "Deelbare links",
"shareDescription2": "Maak deelbare links naar bronnen. Links bieden tijdelijke of onbeperkte toegang tot je bestand. U kunt de vervalduur van de link configureren wanneer u er een aanmaakt.", "shareDescription2": "Maak deelbare links naar bronnen. Links bieden tijdelijke of onbeperkte toegang tot je bestand. U kunt de vervalduur van de link configureren wanneer u er een aanmaakt.",
"shareEasyCreate": "Makkelijk te maken en te delen", "shareEasyCreate": "Makkelijk te maken en te delen",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Beheerders hebben altijd toegang tot deze bron.", "resourceRoleDescription": "Beheerders hebben altijd toegang tot deze bron.",
"resourcePolicySelectTitle": "Toegangsbeleid voor bronnen", "resourcePolicySelectTitle": "Toegangsbeleid voor bronnen",
"resourcePolicySelectDescription": "Selecteer het bronbeleidstype voor authenticatie", "resourcePolicySelectDescription": "Selecteer het bronbeleidstype voor authenticatie",
"resourcePolicyTypeLabel": "Beleidstype", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Bronbeleid", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Inline bronbeleid", "resourcePolicyInline": "Inline bronbeleid",
"resourcePolicyInlineDescription": "Toegangsbeleid alleen gericht op deze bron", "resourcePolicyInlineDescription": "Toegangsbeleid alleen gericht op deze bron",
"resourcePolicyShared": "Gedeeld bronbeleid", "resourcePolicyShared": "Gedeeld bronbeleid",
"resourcePolicySharedDescription": "Deze bron gebruikt een gedeeld beleid.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Gedeeld Beleid", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Deze bron heeft zijn eigen beleid.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Deze bron heeft zijn eigen authenticatie- en toegangsvanregels.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Deze bron erft van <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Deze bron gebruikt een gedeeld beleid. Sommige authenticatie-instellingen kunnen op deze bron worden bewerkt om toe te voegen aan het beleid. Om het onderliggende beleid te wijzigen, moet u het beleid bewerken in <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Deze bron gebruikt een gedeeld beleid. Sommige toegangsregels kunnen op deze bron worden bewerkt. Om het onderliggende beleid te wijzigen, moet u <policyLink>{policyName}</policyLink> bewerken.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Toegang Bediening", "resourceUsersRoles": "Toegang Bediening",
"resourceUsersRolesDescription": "Configureer welke gebruikers en rollen deze pagina kunnen bezoeken", "resourceUsersRolesDescription": "Configureer welke gebruikers en rollen deze pagina kunnen bezoeken",
"resourceUsersRolesSubmit": "Bewaar Toegangsbesturing", "resourceUsersRolesSubmit": "Bewaar Toegangsbesturing",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Zichtbaarheid", "resourceVisibilityTitle": "Zichtbaarheid",
"resourceVisibilityTitleDescription": "Zichtbaarheid van bestanden volledig in- of uitschakelen", "resourceVisibilityTitleDescription": "Zichtbaarheid van bestanden volledig in- of uitschakelen",
"resourceGeneral": "Algemene instellingen", "resourceGeneral": "Algemene instellingen",
"resourceGeneralDescription": "Configureer naam, adres en toegangspolicy voor deze bron.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Bron Details", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Stel de weergavenaam, identificatiecode en publiek toegankelijk domein voor deze bron in.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Stel de weergavenaam, identificatiecode en publieke poort voor deze bron in.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Publiek Adres", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Configureer hoe gebruikers deze bron bereiken.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Authenticatie & Toegang", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Kies of deze bron zijn eigen beleid gebruikt of van een gedeeld beleid erft.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Resource inschakelen", "resourceEnable": "Resource inschakelen",
"resourceTransfer": "Bronnen overdragen", "resourceTransfer": "Bronnen overdragen",
"resourceTransferDescription": "Verplaats dit document naar een andere site", "resourceTransferDescription": "Verplaats dit document naar een andere site",
@@ -1294,14 +1293,14 @@
"addLabels": "Labels toevoegen", "addLabels": "Labels toevoegen",
"siteLabelsTab": "Labels", "siteLabelsTab": "Labels",
"siteLabelsDescription": "Beheer labels geassocieerd met deze site.", "siteLabelsDescription": "Beheer labels geassocieerd met deze site.",
"labelsNotFound": "Geen labels gevonden.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Begin hierboven te typen om een label te maken.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Labels zoeken", "labelSearch": "Labels zoeken",
"labelSearchOrCreate": "Zoek of maak een label", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# label} other {# labels}}", "accessLabelFilterCount": "{count, plural, one {# label} other {# labels}}",
"labelOverflowCount": "+{count, plural, one {# label} other {# labels}}", "labelOverflowCount": "+{count, plural, one {# label} other {# labels}}",
"accessLabelFilterClear": "Labelfilters wissen", "accessLabelFilterClear": "Labelfilters wissen",
"accessFilterClear": "Wissen van filters", "accessFilterClear": "Clear filters",
"selectColor": "Kleur selecteren", "selectColor": "Kleur selecteren",
"createNewLabel": "Nieuw org-label \"{label}\" aanmaken", "createNewLabel": "Nieuw org-label \"{label}\" aanmaken",
"inviteInvalidDescription": "Uitnodigingslink is ongeldig.", "inviteInvalidDescription": "Uitnodigingslink is ongeldig.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Bronnen", "sidebarResources": "Bronnen",
"sidebarProxyResources": "Openbaar", "sidebarProxyResources": "Openbaar",
"sidebarClientResources": "Privé", "sidebarClientResources": "Privé",
"sidebarPolicies": "Gedeeld Beleid", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Openbare Bronnen", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Toegangs controle", "sidebarAccessControl": "Toegangs controle",
"sidebarLogsAndAnalytics": "Logs & Analytics", "sidebarLogsAndAnalytics": "Logs & Analytics",
"sidebarTeam": "Team", "sidebarTeam": "Team",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Beheerder", "sidebarAdmin": "Beheerder",
"sidebarInvitations": "Uitnodigingen", "sidebarInvitations": "Uitnodigingen",
"sidebarRoles": "Rollen", "sidebarRoles": "Rollen",
"sidebarShareableLinks": "Deelbare Links", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "API sleutels", "sidebarApiKeys": "API sleutels",
"sidebarProvisioning": "Provisie", "sidebarProvisioning": "Provisie",
"sidebarSettings": "Instellingen", "sidebarSettings": "Instellingen",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Bron {id}", "standaloneHcFilterResourceIdFallback": "Bron {id}",
"blueprints": "Blauwdrukken", "blueprints": "Blauwdrukken",
"blueprintsLog": "Log Blueprints", "blueprintsLog": "Log Blueprints",
"blueprintsDescription": "Bekijk eerdere blauwdruktoepassingen en hun resultaten of pas een nieuwe blauwdruk toe", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Blauwdruk toevoegen", "blueprintAdd": "Blauwdruk toevoegen",
"blueprintGoBack": "Bekijk alle Blauwdrukken", "blueprintGoBack": "Bekijk alle Blauwdrukken",
"blueprintCreate": "Creëer blauwdruk", "blueprintCreate": "Creëer blauwdruk",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Schakel Docker Blauwdruk in", "enableDockerSocket": "Schakel Docker Blauwdruk in",
"enableDockerSocketDescription": "Schakel Docker Socket-label in voor blueprint-labels. Socket-pad moet worden opgegeven aan de siteconnector. Lees meer over hoe dit werkt in <docsLink>de documentatie</docsLink>.", "enableDockerSocketDescription": "Schakel Docker Socket-label in voor blueprint-labels. Socket-pad moet worden opgegeven aan de siteconnector. Lees meer over hoe dit werkt in <docsLink>de documentatie</docsLink>.",
"newtAutoUpdate": "Automatische site-update inschakelen", "newtAutoUpdate": "Automatische site-update inschakelen",
"newtAutoUpdateDescription": "Als ingeschakeld, downloaden de site-connectoren automatisch de laatste versie en starten zichzelf opnieuw. Dit kan per site worden overschreven.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Automatische site-update", "siteAutoUpdate": "Automatische site-update",
"siteAutoUpdateLabel": "Automatische update inschakelen", "siteAutoUpdateLabel": "Automatische update inschakelen",
"siteAutoUpdateDescription": "Als dit is ingeschakeld, downloadt en start deze site-connector automatisch de nieuwste versie opnieuw.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Standaard van organisatie: {state}", "siteAutoUpdateOrgDefault": "Standaard van organisatie: {state}",
"siteAutoUpdateOverriding": "Overschrijving van organisatiestandaardinstelling", "siteAutoUpdateOverriding": "Overschrijving van organisatiestandaardinstelling",
"siteAutoUpdateResetToOrg": "Terugzetten naar standaard van organisatie", "siteAutoUpdateResetToOrg": "Terugzetten naar standaard van organisatie",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Accountinstelling voltooid! Welkom bij Pangolin!", "accountSetupSuccess": "Accountinstelling voltooid! Welkom bij Pangolin!",
"documentation": "Documentatie", "documentation": "Documentatie",
"saveAllSettings": "Alle instellingen opslaan", "saveAllSettings": "Alle instellingen opslaan",
"saveResourceTargets": "Instellingen opslaan", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Instellingen opslaan", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Instellingen opslaan", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Instellingen bijgewerkt", "settingsUpdated": "Instellingen bijgewerkt",
"settingsUpdatedDescription": "Instellingen succesvol bijgewerkt", "settingsUpdatedDescription": "Instellingen succesvol bijgewerkt",
"settingsErrorUpdate": "Bijwerken van instellingen mislukt", "settingsErrorUpdate": "Bijwerken van instellingen mislukt",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Onbekend", "healthCheckUnknown": "Onbekend",
"healthCheck": "Gezondheidscontrole", "healthCheck": "Gezondheidscontrole",
"configureHealthCheck": "Configureer Gezondheidscontrole", "configureHealthCheck": "Configureer Gezondheidscontrole",
"configureHealthCheckDescription": "Stel monitoring in voor uw bron om ervoor te zorgen dat deze altijd beschikbaar is", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Inschakelen Gezondheidscontroles", "enableHealthChecks": "Inschakelen Gezondheidscontroles",
"healthCheckDisabledStateDescription": "Wanneer uitgeschakeld, zal de site geen gezondheidscontroles uitvoeren en wordt de staat als onbekend beschouwd.", "healthCheckDisabledStateDescription": "Wanneer uitgeschakeld, zal de site geen gezondheidscontroles uitvoeren en wordt de staat als onbekend beschouwd.",
"enableHealthChecksDescription": "Controleer de gezondheid van dit doel. U kunt een ander eindpunt monitoren dan het doel indien vereist.", "enableHealthChecksDescription": "Controleer de gezondheid van dit doel. U kunt een ander eindpunt monitoren dan het doel indien vereist.",
"healthScheme": "Methode", "healthScheme": "Methode",
"healthSelectScheme": "Selecteer methode", "healthSelectScheme": "Selecteer methode",
"healthCheckPortInvalid": "Poort moet tussen 1 en 65535 zijn", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Pad", "healthCheckPath": "Pad",
"healthHostname": "IP / Hostnaam", "healthHostname": "IP / Hostnaam",
"healthPort": "Poort", "healthPort": "Poort",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Vereist goedkeuring van apparaat", "requireDeviceApproval": "Vereist goedkeuring van apparaat",
"requireDeviceApprovalDescription": "Gebruikers met deze rol hebben nieuwe apparaten nodig die door een beheerder zijn goedgekeurd voordat ze verbinding kunnen maken met bronnen en deze kunnen gebruiken.", "requireDeviceApprovalDescription": "Gebruikers met deze rol hebben nieuwe apparaten nodig die door een beheerder zijn goedgekeurd voordat ze verbinding kunnen maken met bronnen en deze kunnen gebruiken.",
"sshSettings": "SSH-instellingen", "sshSettings": "SSH-instellingen",
"sshAccess": "SSH Toegang", "sshAccess": "SSH Access",
"rdpSettings": "RDP-instellingen", "rdpSettings": "RDP-instellingen",
"vncSettings": "VNC-instellingen", "vncSettings": "VNC-instellingen",
"sshServer": "SSH-server", "sshServer": "SSH-server",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Zorg ervoor dat uw doelhost goed is geconfigureerd om de auth daemon uit te voeren voordat u deze configuratie voltooit, anders zal de voorziening mislukken.", "sshDaemonDisclaimer": "Zorg ervoor dat uw doelhost goed is geconfigureerd om de auth daemon uit te voeren voordat u deze configuratie voltooit, anders zal de voorziening mislukken.",
"sshDaemonPort": "Demonpoort", "sshDaemonPort": "Demonpoort",
"sshServerDestination": "Serverbestemming", "sshServerDestination": "Serverbestemming",
"sshServerDestinationDescription": "Configureer de bestemming van de SSH-server", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Bestemming", "destination": "Bestemming",
"destinationRequired": "Bestemming is vereist.", "destinationRequired": "Destination is required.",
"domainRequired": "Domein is vereist.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Poort is vereist.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Ongeldige padconfiguratie.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Ongeldige overschrijfpadconfiguratie.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Het selecteren van meerdere sites maakt veerkrachtige routering mogelijk en failover voor hoge beschikbaarheid.", "bgTargetMultiSiteDisclaimer": "Het selecteren van meerdere sites maakt veerkrachtige routering mogelijk en failover voor hoge beschikbaarheid.",
"roleAllowSsh": "SSH toestaan", "roleAllowSsh": "SSH toestaan",
"roleAllowSshAllow": "Toestaan", "roleAllowSshAllow": "Toestaan",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "Gebruiker kan alleen de opgegeven commando's uitvoeren met de sudo.", "sshSudoModeCommandsDescription": "Gebruiker kan alleen de opgegeven commando's uitvoeren met de sudo.",
"sshSudo": "sudo toestaan", "sshSudo": "sudo toestaan",
"sshSudoCommands": "Sudo Commando's", "sshSudoCommands": "Sudo Commando's",
"sshSudoCommandsDescription": "Lijst met commando's die de gebruiker mag uitvoeren met sudo, gescheiden door komma's, spaties of nieuwe regels. Absolute paden moeten worden gebruikt.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Maak Home Directory", "sshCreateHomeDir": "Maak Home Directory",
"sshUnixGroups": "Unix groepen", "sshUnixGroups": "Unix groepen",
"sshUnixGroupsDescription": "Unix-groepen om de gebruiker aan toe te voegen op de doelhost, gescheiden door komma's, spaties of nieuwe regels.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Voer waarden in, of sleep een .txt of .csv-bestand", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Importeer vanuit Bestand", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "{fileName} importeren naar {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Sla de eerste rij over (header)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Vervang Bestaande", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Voeg toe aan Bestaande", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Importeer modus", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Voorbeeld", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Geen items om te importeren} one {1 item om te importeren} other {# items om te importeren}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} bestaande + {imported} geïmporteerd = {total} totaal", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Importeren", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Niet-ondersteund bestandstype", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Alleen .txt en .csv-bestanden worden ondersteund.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Geen items gevonden in bestand", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Het bestand bevat geen importeerbare items.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Herhaal Pogingen", "retryAttempts": "Herhaal Pogingen",
"expectedResponseCodes": "Verwachte Reactiecodes", "expectedResponseCodes": "Verwachte Reactiecodes",
"expectedResponseCodesDescription": "HTTP-statuscode die gezonde status aangeeft. Indien leeg wordt 200-300 als gezond beschouwd.", "expectedResponseCodesDescription": "HTTP-statuscode die gezonde status aangeeft. Indien leeg wordt 200-300 als gezond beschouwd.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Proxy Protocol inschakelen", "enableProxyProtocol": "Proxy Protocol inschakelen",
"proxyProtocolInfo": "Behoud IP adressen van de client voor TCP backends", "proxyProtocolInfo": "Behoud IP adressen van de client voor TCP backends",
"proxyProtocolVersion": "Proxy Protocol Versie", "proxyProtocolVersion": "Proxy Protocol Versie",
"version1": "Versie 1 (Aanbevolen)", "version1": "Version 1 (Recommended)",
"version2": "Versie 2", "version2": "Versie 2",
"version1Description": "Tekstgebaseerd en breed ondersteund. Zorg ervoor dat servertransport aan dynamische configuratie is toegevoegd.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Binair en efficiënter maar minder compatibel. Zorg ervoor dat servertransport aan dynamische configuratie is toegevoegd.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Waarschuwing", "warning": "Waarschuwing",
"proxyProtocolWarning": "De backend applicatie moet worden geconfigureerd om Proxy Protocol verbindingen te accepteren. Als je backend geen Proxy Protocol ondersteunt, zal het inschakelen van dit alle verbindingen verbreken, dus schakel dit alleen in als je weet wat je doet. Zorg ervoor dat je je backend configureert om Proxy Protocol headers van Traefik.", "proxyProtocolWarning": "De backend applicatie moet worden geconfigureerd om Proxy Protocol verbindingen te accepteren. Als je backend geen Proxy Protocol ondersteunt, zal het inschakelen van dit alle verbindingen verbreken, dus schakel dit alleen in als je weet wat je doet. Zorg ervoor dat je je backend configureert om Proxy Protocol headers van Traefik.",
"restarting": "Herstarten...", "restarting": "Herstarten...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Bevestiging invoeren", "enterConfirmation": "Bevestiging invoeren",
"blueprintViewDetails": "Details", "blueprintViewDetails": "Details",
"defaultIdentityProvider": "Standaard Identiteitsprovider", "defaultIdentityProvider": "Standaard Identiteitsprovider",
"defaultIdentityProviderDescription": "De gebruiker wordt automatisch doorgestuurd naar deze identity provider voor authenticatie.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Netwerkinstellingen", "editInternalResourceDialogNetworkSettings": "Netwerkinstellingen",
"editInternalResourceDialogAccessPolicy": "Toegangsbeleid", "editInternalResourceDialogAccessPolicy": "Toegangsbeleid",
"editInternalResourceDialogAddRoles": "Rollen toevoegen", "editInternalResourceDialogAddRoles": "Rollen toevoegen",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Type onderhoudsmodus", "maintenanceModeType": "Type onderhoudsmodus",
"showMaintenancePage": "Toon een onderhoudspagina aan bezoekers", "showMaintenancePage": "Toon een onderhoudspagina aan bezoekers",
"enableMaintenanceMode": "Onderhoudsmodus inschakelen", "enableMaintenanceMode": "Onderhoudsmodus inschakelen",
"enableMaintenanceModeDescription": "Wanneer ingeschakeld zien bezoekers een onderhoudspagina in plaats van uw bron.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automatisch", "automatic": "Automatisch",
"automaticModeDescription": " Toon onderhoudspagina alleen wanneer alle back-enddoelen niet beschikbaar zijn of ongezond zijn. Jouw bron blijft normaal functioneren zolang er tenminste één doel gezond is.", "automaticModeDescription": " Toon onderhoudspagina alleen wanneer alle back-enddoelen niet beschikbaar zijn of ongezond zijn. Jouw bron blijft normaal functioneren zolang er tenminste één doel gezond is.",
"forced": "Geforceerd", "forced": "Geforceerd",
@@ -3182,8 +3181,8 @@
"warning:": "Waarschuwing:", "warning:": "Waarschuwing:",
"forcedeModeWarning": "Al het verkeer wordt naar de onderhoudspagina geleid. Jouw back-endbronnen ontvangen geen verzoeken.", "forcedeModeWarning": "Al het verkeer wordt naar de onderhoudspagina geleid. Jouw back-endbronnen ontvangen geen verzoeken.",
"pageTitle": "Paginatitel", "pageTitle": "Paginatitel",
"maintenancePageContentSubsection": "Pagina-inhoud", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Pas de inhoud aan die op de onderhoudspagina wordt weergegeven", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "De hoofdkop die op de onderhoudspagina wordt weergegeven", "pageTitleDescription": "De hoofdkop die op de onderhoudspagina wordt weergegeven",
"maintenancePageMessage": "Onderhoudsbericht", "maintenancePageMessage": "Onderhoudsbericht",
"maintenancePageMessagePlaceholder": "We keren snel terug! Onze site ondergaat momenteel gepland onderhoud.", "maintenancePageMessagePlaceholder": "We keren snel terug! Onze site ondergaat momenteel gepland onderhoud.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Weet u zeker dat u deze identiteitsprovider van deze organisatie wilt loskoppelen?", "idpUnassociateQuestion": "Weet u zeker dat u deze identiteitsprovider van deze organisatie wilt loskoppelen?",
"idpUnassociateDescription": "Alle gebruikers die aan deze identiteitsprovider zijn gekoppeld, worden uit deze organisatie verwijderd, maar de identiteitsprovider blijft bestaan voor andere gerelateerde organisaties.", "idpUnassociateDescription": "Alle gebruikers die aan deze identiteitsprovider zijn gekoppeld, worden uit deze organisatie verwijderd, maar de identiteitsprovider blijft bestaan voor andere gerelateerde organisaties.",
"idpUnassociateConfirm": "Bevestig ontkoppelen identiteitsprovider", "idpUnassociateConfirm": "Bevestig ontkoppelen identiteitsprovider",
"idpConfirmDeleteAndRemoveMeFromOrg": "VERWIJDER EN VERWIJDER ME VAN ORG", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "ONTKOPPEL EN VERWIJDER ME VAN ORG", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Dit kan niet ongedaan worden gemaakt voor deze organisatie.", "idpUnassociateWarning": "Dit kan niet ongedaan worden gemaakt voor deze organisatie.",
"idpUnassociatedDescription": "Identiteitsprovider succesvol losgekoppeld van deze organisatie", "idpUnassociatedDescription": "Identiteitsprovider succesvol losgekoppeld van deze organisatie",
"idpUnassociateMenu": "Ontkoppelen", "idpUnassociateMenu": "Ontkoppelen",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Verbinding maken…", "sshConnecting": "Verbinding maken…",
"sshInitializing": "Initialiseren…", "sshInitializing": "Initialiseren…",
"sshSignInTitle": "Meld u aan bij SSH", "sshSignInTitle": "Meld u aan bij SSH",
"sshSignInDescription": "Voer uw SSH-gegevens in om verbinding te maken", "sshSignInDescription": "Voer uw SSH-referenties in",
"sshPasswordTab": "Wachtwoord", "sshPasswordTab": "Wachtwoord",
"sshPrivateKeyTab": "Privésleutel", "sshPrivateKeyTab": "Privésleutel",
"sshPrivateKeyField": "Privésleutel", "sshPrivateKeyField": "Privésleutel",
"sshPrivateKeyDisclaimer": "Uw privésleutel wordt niet opgeslagen of zichtbaar gemaakt voor Pangolin. U kunt ook gebruik maken van kortlopende certificaten voor naadloze authenticatie met uw bestaande Pangolin-identiteit.", "sshPrivateKeyDisclaimer": "Uw privésleutel wordt niet opgeslagen of zichtbaar gemaakt voor Pangolin. U kunt ook gebruik maken van kortlopende certificaten voor naadloze authenticatie met uw bestaande Pangolin-identiteit.",
"sshLearnMore": "Meer informatie", "sshLearnMore": "Meer informatie",
"sshPrivateKeyFile": "Bestand met privésleutel", "sshPrivateKeyFile": "Bestand met privésleutel",
"sshAuthenticate": "Verbinden", "sshAuthenticate": "Authenticeren",
"sshTerminate": "Beëindigen", "sshTerminate": "Beëindigen",
"sshPoweredBy": "Aangeboden door", "sshPoweredBy": "Aangeboden door",
"sshErrorNoTarget": "Geen doelwit gespecificeerd", "sshErrorNoTarget": "Geen doelwit gespecificeerd",
"sshErrorWebSocket": "WebSocket-verbinding is mislukt", "sshErrorWebSocket": "WebSocket-verbinding is mislukt",
"sshErrorAuthFailed": "Authenticatie mislukt", "sshErrorAuthFailed": "Authenticatie mislukt",
"sshErrorConnectionClosed": "Verbinding gesloten voordat authenticatie was voltooid", "sshErrorConnectionClosed": "Verbinding gesloten voordat authenticatie was voltooid",
"sitePangolinSshDescription": "Sta SSH-toegang toe tot bronnen op deze site. Dit kan later worden gewijzigd.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Geen bron gevonden voor dit domein", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Geen doelwit", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Verbinden", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Kan SSH-sleutel voor PAM push-authenticatie niet ondertekenen. Heeft u als gebruiker aangemeld?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Fout: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Verbinding gesloten (code {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Privésleutel is vereist", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Voer uw VNC-wachtwoord in om verbinding te maken", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Wachtwoord (optioneel)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Geen bron doelwit beschikbaar", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Laden van noVNC mislukt", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Status {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Klembord plakken", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Meld u aan bij Remote Desktop", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Voer Windows-gegevens in om verbinding te maken", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Module laden...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Laden van RDP-module mislukt", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Niet gereed", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "RDP-module is nog aan het initialiseren", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "{count} bestand(en) worden van een externe locatie gedownload…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Download mislukt: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Geüpload: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Geen verbinding doelwit beschikbaar", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Verbinding mislukt", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Schalen", "rdpFit": "Fit",
"rdpFull": "Volledig", "rdpFull": "Full",
"rdpReal": "Reëel", "rdpReal": "Real",
"rdpMeta": "Meta", "rdpMeta": "Meta",
"rdpUploadFiles": "Bestanden uploaden", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Bestanden klaar om te plakken", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} bestand(en) gekopieerd naar klembord op afstand — druk op Ctrl+V op het externe bureaublad om te plakken.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Upload mislukt", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Unicode toetsenbordmodus", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Toon werkbalk", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Verberg werkbalk" "sessionToolbarHide": "Hide toolbar"
} }
+183 -184
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Zobacz zasoby prywatne", "sitesTableViewPrivateResources": "Zobacz zasoby prywatne",
"siteInstallNewt": "Zainstaluj Newt", "siteInstallNewt": "Zainstaluj Newt",
"siteInstallNewtDescription": "Uruchom Newt w swoim systemie", "siteInstallNewtDescription": "Uruchom Newt w swoim systemie",
"siteInstallKubernetesDocsDescription": "Aby uzyskać więcej aktualnych informacji o instalacji Kubernetes, zobacz <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Aby uzyskać instrukcje dotyczące instalacji modemu Advantech, zobacz: <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "Konfiguracja WireGuard", "WgConfiguration": "Konfiguracja WireGuard",
"WgConfigurationDescription": "Użyj następującej konfiguracji, aby połączyć się z siecią", "WgConfigurationDescription": "Użyj następującej konfiguracji, aby połączyć się z siecią",
"operatingSystem": "System operacyjny", "operatingSystem": "System operacyjny",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Możesz to zobaczyć tylko raz. Upewnij się, że skopiuj je do bezpiecznego miejsca.", "siteCredentialsSaveDescription": "Możesz to zobaczyć tylko raz. Upewnij się, że skopiuj je do bezpiecznego miejsca.",
"siteInfo": "Informacje o witrynie", "siteInfo": "Informacje o witrynie",
"status": "Status", "status": "Status",
"shareTitle": "Zarządzaj linkami do udostępnienia", "shareTitle": "Manage Shareable Links",
"shareDescription": "Utwórz linki do współdzielenia, aby przyznać tymczasowy lub stały dostęp do zasobów proxy", "shareDescription": "Utwórz linki do współdzielenia, aby przyznać tymczasowy lub stały dostęp do zasobów proxy",
"shareSearch": "Wyszukaj linki do udostępnienia...", "shareSearch": "Search shareable links...",
"shareCreate": "Utwórz link do udostępnienia", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Nie udało się usunąć linku", "shareErrorDelete": "Nie udało się usunąć linku",
"shareErrorDeleteMessage": "Wystąpił błąd podczas usuwania linku", "shareErrorDeleteMessage": "Wystąpił błąd podczas usuwania linku",
"shareDeleted": "Link usunięty", "shareDeleted": "Link usunięty",
"shareDeletedDescription": "Link został usunięty", "shareDeletedDescription": "Link został usunięty",
"shareDelete": "Usuń link do udostępnienia", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Potwierdź usunięcie linku do udostępnienia", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Czy na pewno chcesz usunąć ten link udostępniania?", "shareQuestionRemove": "Czy na pewno chcesz usunąć ten link udostępniania?",
"shareMessageRemove": "Po usunięciu, link przestanie działać i wszyscy korzystający z niego stracą dostęp do zasobu.", "shareMessageRemove": "Po usunięciu, link przestanie działać i wszyscy korzystający z niego stracą dostęp do zasobu.",
"shareTokenDescription": "Token dostępu może być przekazywany na dwa sposoby: jako parametr zapytania lub w nagłówkach żądania. Muszą być przekazywane z klienta na każde żądanie uwierzytelnionego dostępu.", "shareTokenDescription": "Token dostępu może być przekazywany na dwa sposoby: jako parametr zapytania lub w nagłówkach żądania. Muszą być przekazywane z klienta na każde żądanie uwierzytelnionego dostępu.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Każdy z tym linkiem może uzyskać dostęp do zasobu", "shareCreateDescription": "Każdy z tym linkiem może uzyskać dostęp do zasobu",
"shareTitleOptional": "Tytuł (opcjonalnie)", "shareTitleOptional": "Tytuł (opcjonalnie)",
"sharePathOptional": "Ścieżka (opcjonalnie)", "sharePathOptional": "Ścieżka (opcjonalnie)",
"sharePathDescription": "Link przekieruje użytkowników do tej ścieżki po uwierzytelnieniu.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Wygasa za", "expireIn": "Wygasa za",
"neverExpire": "Nigdy nie wygasa", "neverExpire": "Nigdy nie wygasa",
"shareExpireDescription": "Czas wygaśnięcia to jak długo link będzie mógł być użyty i zapewni dostęp do zasobu. Po tym czasie link nie będzie już działał, a użytkownicy, którzy użyli tego linku, utracą dostęp do zasobu.", "shareExpireDescription": "Czas wygaśnięcia to jak długo link będzie mógł być użyty i zapewni dostęp do zasobu. Po tym czasie link nie będzie już działał, a użytkownicy, którzy użyli tego linku, utracą dostęp do zasobu.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Wybierz zasób", "shareErrorSelectResource": "Wybierz zasób",
"proxyResourceTitle": "Zarządzaj zasobami publicznymi", "proxyResourceTitle": "Zarządzaj zasobami publicznymi",
"proxyResourceDescription": "Twórz i zarządzaj zasobami, które są publicznie dostępne w przeglądarce internetowej", "proxyResourceDescription": "Twórz i zarządzaj zasobami, które są publicznie dostępne w przeglądarce internetowej",
"publicResourcesBannerTitle": "Publiczny dostęp przez przeglądarkę internetową", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Zasoby publiczne to serwery proxy HTTPS, dostępne dla każdego w Internecie za pośrednictwem przeglądarki. W przeciwieństwie do zasobów prywatnych, nie wymagają oprogramowania po stronie klienta i mogą obejmować polityki dostępu świadome tożsamości i kontekstu.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Zarządzaj zasobami prywatnymi", "clientResourceTitle": "Zarządzaj zasobami prywatnymi",
"clientResourceDescription": "Twórz i zarządzaj zasobami, które są dostępne tylko za pośrednictwem połączonego klienta", "clientResourceDescription": "Twórz i zarządzaj zasobami, które są dostępne tylko za pośrednictwem połączonego klienta",
"privateResourcesBannerTitle": "Zero zaufania do prywatnego dostępu", "privateResourcesBannerTitle": "Zero zaufania do prywatnego dostępu",
@@ -212,19 +212,18 @@
"resourcesSearch": "Szukaj zasobów...", "resourcesSearch": "Szukaj zasobów...",
"resourceAdd": "Dodaj zasób", "resourceAdd": "Dodaj zasób",
"resourceErrorDelte": "Błąd podczas usuwania zasobu", "resourceErrorDelte": "Błąd podczas usuwania zasobu",
"resourcePoliciesBannerTitle": "Ponownie użyj Uwierzytelniania i Zasad Dostępu", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Polityki zasobów współdzielonych pozwalają zdefiniować metody uwierzytelniania oraz zasady dostępu jednokrotnie, a następnie przypiąć je do wielu zasobów publicznych. Po zaktualizowaniu polityki każda powiązana zasób automatycznie dziedziczy zmianę.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Dowiedz się więcej", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Zarządzaj publicznymi zasadami zasobów", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Zasoby",
"resourcePoliciesAttachedResources": "{count} zasób(y)", "resourcePoliciesAttachedResources": "{count} zasób(y)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# zasób} few {# zasoby} many {# zasobów} other {# zasobów}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "brak zasobów", "resourcePoliciesAttachedResourcesEmpty": "brak zasobów",
"resourcePoliciesDescription": "Twórz i zarządzaj politykami uwierzytelniania, aby kontrolować dostęp do swoich zasobów publicznych", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Szukaj polityk...", "resourcePoliciesSearch": "Szukaj polityk...",
"resourcePoliciesAdd": "Dodaj politykę", "resourcePoliciesAdd": "Dodaj politykę",
"resourcePoliciesDefaultBadgeText": "Domyślna polityka", "resourcePoliciesDefaultBadgeText": "Domyślna polityka",
"resourcePoliciesCreate": "Utwórz publiczną politykę zasobów", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Wykonaj poniższe kroki, aby utworzyć nową politykę", "resourcePoliciesCreateDescription": "Wykonaj poniższe kroki, aby utworzyć nową politykę",
"resourcePolicyName": "Nazwa polityki", "resourcePolicyName": "Nazwa polityki",
"resourcePolicyNameDescription": "Nadaj tej polityce nazwę, aby można ją było zidentyfikować w całych zasobach", "resourcePolicyNameDescription": "Nadaj tej polityce nazwę, aby można ją było zidentyfikować w całych zasobach",
@@ -281,7 +280,7 @@
"back": "Powrót", "back": "Powrót",
"cancel": "Anuluj", "cancel": "Anuluj",
"resourceConfig": "Snippety konfiguracji", "resourceConfig": "Snippety konfiguracji",
"resourceConfigDescription": "Skopiuj i wklej te fragmenty konfiguracji, aby skonfigurować zasób TCP/UDP.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Dodaj punkty wejścia", "resourceAddEntrypoints": "Traefik: Dodaj punkty wejścia",
"resourceExposePorts": "Gerbil: Podnieś porty w Komponencie Dockera", "resourceExposePorts": "Gerbil: Podnieś porty w Komponencie Dockera",
"resourceLearnRaw": "Dowiedz się, jak skonfigurować zasoby TCP/UDP", "resourceLearnRaw": "Dowiedz się, jak skonfigurować zasoby TCP/UDP",
@@ -294,8 +293,8 @@
"labelDelete": "Usuń etykietę", "labelDelete": "Usuń etykietę",
"labelAdd": "Dodaj etykietę", "labelAdd": "Dodaj etykietę",
"labelCreateSuccessMessage": "Etykieta została utworzona pomyślnie", "labelCreateSuccessMessage": "Etykieta została utworzona pomyślnie",
"labelDuplicateError": "Zduplikowana etykieta", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Etykieta o tej nazwie już istnieje.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Etykieta została pomyślnie zmodyfikowana", "labelEditSuccessMessage": "Etykieta została pomyślnie zmodyfikowana",
"labelNameField": "Nazwa etykiety", "labelNameField": "Nazwa etykiety",
"labelColorField": "Kolor etykiety", "labelColorField": "Kolor etykiety",
@@ -320,7 +319,7 @@
"rules": "Regulamin", "rules": "Regulamin",
"resourceSettingDescription": "Skonfiguruj ustawienia zasobu", "resourceSettingDescription": "Skonfiguruj ustawienia zasobu",
"resourceSetting": "Ustawienia {resourceName}", "resourceSetting": "Ustawienia {resourceName}",
"resourcePolicySettingDescription": "Skonfiguruj ustawienia tej publicznej polityki zasobów", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "Ustawienia {policyName}", "resourcePolicySetting": "Ustawienia {policyName}",
"alwaysAllow": "Omijanie uwierzytelniania", "alwaysAllow": "Omijanie uwierzytelniania",
"alwaysDeny": "Blokuj dostęp", "alwaysDeny": "Blokuj dostęp",
@@ -728,7 +727,7 @@
"targetSubmit": "Dodaj cel", "targetSubmit": "Dodaj cel",
"targetNoOne": "Ten zasób nie ma żadnych celów. Dodaj cel do skonfigurowania adresów wysyłania żądań do backendu.", "targetNoOne": "Ten zasób nie ma żadnych celów. Dodaj cel do skonfigurowania adresów wysyłania żądań do backendu.",
"targetNoOneDescription": "Dodanie więcej niż jednego celu powyżej włączy równoważenie obciążenia.", "targetNoOneDescription": "Dodanie więcej niż jednego celu powyżej włączy równoważenie obciążenia.",
"targetsSubmit": "Zapisz ustawienia", "targetsSubmit": "Save Settings",
"addTarget": "Dodaj cel", "addTarget": "Dodaj cel",
"proxyMultiSiteRoundRobinNodeHelp": "Trasowanie round-robin nie będzie działać między witrynami, które nie są połączone z tym samym węzłem, ale przełączanie awaryjne będzie działać.", "proxyMultiSiteRoundRobinNodeHelp": "Trasowanie round-robin nie będzie działać między witrynami, które nie są połączone z tym samym węzłem, ale przełączanie awaryjne będzie działać.",
"targetErrorInvalidIp": "Nieprawidłowy adres IP", "targetErrorInvalidIp": "Nieprawidłowy adres IP",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Duplikat reguły", "rulesErrorDuplicate": "Duplikat reguły",
"rulesErrorDuplicateDescription": "Reguła o tych ustawieniach już istnieje", "rulesErrorDuplicateDescription": "Reguła o tych ustawieniach już istnieje",
"rulesErrorInvalidIpAddressRange": "Nieprawidłowy CIDR", "rulesErrorInvalidIpAddressRange": "Nieprawidłowy CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "Wprowadź poprawny zakres CIDR (np. 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Nieprawidłowa ścieżka", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Wprowadź poprawną ścieżkę URL lub wzorzec (np. /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Nieprawidłowy adres IP", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Wprowadź poprawny adres IPv4 lub IPv6.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Nie udało się zaktualizować reguł", "rulesErrorUpdate": "Nie udało się zaktualizować reguł",
"rulesErrorUpdateDescription": "Wystąpił błąd podczas aktualizacji reguł", "rulesErrorUpdateDescription": "Wystąpił błąd podczas aktualizacji reguł",
"rulesUpdated": "Włącz reguły", "rulesUpdated": "Włącz reguły",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Wprowadź adres w formacie CIDR (np. 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Wprowadź adres w formacie CIDR (np. 103.21.244.0/22)",
"rulesMatchIpAddress": "Wprowadź adres IP (np. 103.21.244.12)", "rulesMatchIpAddress": "Wprowadź adres IP (np. 103.21.244.12)",
"rulesMatchUrl": "Wprowadź ścieżkę URL lub wzorzec (np. /api/v1/todos lub /api/v1/*)", "rulesMatchUrl": "Wprowadź ścieżkę URL lub wzorzec (np. /api/v1/todos lub /api/v1/*)",
"rulesErrorInvalidPriority": "Nieprawidłowy priorytet", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Wprowadź liczbę całkowitą 1 lub wyższą.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Zduplikowane priorytety", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Każda reguła musi mieć unikalny numer priorytetu.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Nieprawidłowe reguły", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Reguła {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Wybierz poprawny typ dopasowania (ścieżka, IP, CIDR, kraj, region lub ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Wprowadź wartość dla tej reguły.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Nieprawidłowy kraj", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Wybierz poprawny kraj.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "Nieprawidłowy ASN", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Wprowadź poprawny ASN (np. AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Reguły zaktualizowane", "ruleUpdated": "Reguły zaktualizowane",
"ruleUpdatedDescription": "Reguły zostały pomyślnie zaktualizowane", "ruleUpdatedDescription": "Reguły zostały pomyślnie zaktualizowane",
"ruleErrorUpdate": "Operacja nie powiodła się", "ruleErrorUpdate": "Operacja nie powiodła się",
"ruleErrorUpdateDescription": "Wystąpił błąd podczas operacji zapisu", "ruleErrorUpdateDescription": "Wystąpił błąd podczas operacji zapisu",
"rulesPriority": "Priorytet", "rulesPriority": "Priorytet",
"rulesReorderDragHandle": "Przeciągnij, aby zmienić kolejność priorytetów reguł", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Akcja", "rulesAction": "Akcja",
"rulesMatchType": "Typ dopasowania", "rulesMatchType": "Typ dopasowania",
"value": "Wartość", "value": "Wartość",
@@ -810,7 +809,7 @@
"rulesResource": "Konfiguracja reguł zasobu", "rulesResource": "Konfiguracja reguł zasobu",
"rulesResourceDescription": "Skonfiguruj reguły, aby kontrolować dostęp do zasobu", "rulesResourceDescription": "Skonfiguruj reguły, aby kontrolować dostęp do zasobu",
"ruleSubmit": "Dodaj regułę", "ruleSubmit": "Dodaj regułę",
"rulesNoOne": "Brak reguł.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Reguły są oceniane według priorytetu w kolejności rosnącej.", "rulesOrder": "Reguły są oceniane według priorytetu w kolejności rosnącej.",
"rulesSubmit": "Zapisz reguły", "rulesSubmit": "Zapisz reguły",
"policyErrorCreate": "Błąd przy tworzeniu polityki", "policyErrorCreate": "Błąd przy tworzeniu polityki",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Wystąpił nieoczekiwany błąd", "policyErrorUpdateMessageDescription": "Wystąpił nieoczekiwany błąd",
"policyCreatedSuccess": "Polityka zasobów została pomyślnie utworzona", "policyCreatedSuccess": "Polityka zasobów została pomyślnie utworzona",
"policyUpdatedSuccess": "Polityka zasobów została pomyślnie zaktualizowana", "policyUpdatedSuccess": "Polityka zasobów została pomyślnie zaktualizowana",
"authMethodsSave": "Zapisz ustawienia", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Uwierzytelnianie", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Kontroluj, które metody uwierzytelniania są wymagane do uzyskania dostępu do tego zasobu", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Kilka metod uwierzytelniania jest aktywnych", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Odwiedzający mogą się uwierzytelnić, korzystając z jednej z poniższych aktywnych metod. Nie muszą ukończyć wszystkich z nich.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Aktywny", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Wyłączony", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "Platforma SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Wymagany znak w identyfikatorze dostawcy Twojej organizacji", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} użytkowników, {roles} ról", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Dostawca domyślny", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Dodaj Dostawcę Tożsamości Domyślnej", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Inne Metody", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Opcjonalne metody, których odwiedzający mogą używać zamiast lub razem z platformą SSO", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Hasło dostępu", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Wymagane wspólne hasło alfanumeryczne do uzyskania dostępu do zasobu", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Zestaw hasła dostępu", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "Kod PIN", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Krótki kod numeryczny wymagany do uzyskania dostępu do zasobu", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "Ustawiono 6-cyfrowy kod PIN", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "Biała lista e-mail", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Dozwolone adresy e-mail z hasłami jednorazowymi", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "Dozwolonych {count} adresów", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Włączenie białej listy e-mail wysyła hasło jednorazowe na e-mail odwiedzającego podczas logowania.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Podstawowe Uwierzytelnianie Nagłówka", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Walidacja niestandardowej nazwy i wartości nagłówka HTTP przy każdym żądaniu", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Skonfigurowany nagłówek", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Nazwa nagłówka", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Oczekiwana wartość", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Ustaw hasło dostępu", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Ustaw kod PIN", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Ustaw białą listę e-mail", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Ustaw Podstawowe Uwierzytelnianie Nagłówka", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Zasady Dostępu", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Gdy zostaną włączone, reguły są oceniane w kolejności malejącej, aż jedna z nich zostanie oceniona jako prawdziwa.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Reguły są oceniane od góry do dołu. Pierwsza pasująca reguła decyduje o wyniku.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Reguły dopasowują żądania według ścieżki, adresu IP, lokalizacji lub innych kryteriów. Każda reguła stosuje działanie: pominięcie uwierzytelniania, blokowanie dostępu lub przekazanie do uwierzytelniania. Jeśli żadna reguła nie pasuje, ruch przechodzi dalej do uwierzytelniania.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Gdy reguły są wyłączone, cały ruch przechodzi do uwierzytelniania.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Gdy żadna reguła nie pasuje, ruch przechodzi do uwierzytelniania.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Wystąpił błąd podczas aktualizacji zasobu", "resourcesErrorUpdateDescription": "Wystąpił błąd podczas aktualizacji zasobu",
"access": "Dostęp", "access": "Dostęp",
"accessControl": "Kontrola dostępu", "accessControl": "Kontrola dostępu",
"shareLink": "{resource} Link do udostępnienia", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Wybierz zasób", "resourceSelect": "Wybierz zasób",
"shareLinks": "Linki do udostępnienia", "shareLinks": "Shareable Links",
"share": "Linki do udostępniania", "share": "Linki do udostępniania",
"shareDescription2": "Utwórz linki do zasobów, które można współdzielić. Linki zapewniają tymczasowy lub nieograniczony dostęp do twojego zasobu. Możesz skonfigurować czas ważności linku, gdy go utworzysz.", "shareDescription2": "Utwórz linki do zasobów, które można współdzielić. Linki zapewniają tymczasowy lub nieograniczony dostęp do twojego zasobu. Możesz skonfigurować czas ważności linku, gdy go utworzysz.",
"shareEasyCreate": "Łatwe tworzenie i udostępnianie", "shareEasyCreate": "Łatwe tworzenie i udostępnianie",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Administratorzy zawsze mają dostęp do tego zasobu.", "resourceRoleDescription": "Administratorzy zawsze mają dostęp do tego zasobu.",
"resourcePolicySelectTitle": "Polityka dostępu do zasobów", "resourcePolicySelectTitle": "Polityka dostępu do zasobów",
"resourcePolicySelectDescription": "Wybierz typ polityki zasobów do uwierzytelniania", "resourcePolicySelectDescription": "Wybierz typ polityki zasobów do uwierzytelniania",
"resourcePolicyTypeLabel": "Typ polityki", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Polityka zasobów", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Warunkowa polityka zasobów", "resourcePolicyInline": "Warunkowa polityka zasobów",
"resourcePolicyInlineDescription": "Polityka dostępu tylko do tego zasobu", "resourcePolicyInlineDescription": "Polityka dostępu tylko do tego zasobu",
"resourcePolicyShared": "Dzielona polityka zasobów", "resourcePolicyShared": "Dzielona polityka zasobów",
"resourcePolicySharedDescription": "Ten zasób korzysta z polityki współdzielonej.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Polityka Współdzielona", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Ten zasób ma własną politykę.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Ten zasób ma własne kontrole zasad uwierzytelniania i dostępu.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Ten zasób dziedziczy z <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Ten zasób używa polityki współdzielonej. Niektóre ustawienia uwierzytelniania można edytować w tym zasobie, aby dodać do polityki. Aby zmienić podlegającą politykę, musisz ją edytować do <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Ten zasób używa polityki współdzielonej. Niektóre zasady dostępu można edytować w tym zasobie. Aby zmienić podlegającą politykę, musisz edytować <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Kontrola dostępu", "resourceUsersRoles": "Kontrola dostępu",
"resourceUsersRolesDescription": "Skonfiguruj, którzy użytkownicy i role mogą odwiedzać ten zasób", "resourceUsersRolesDescription": "Skonfiguruj, którzy użytkownicy i role mogą odwiedzać ten zasób",
"resourceUsersRolesSubmit": "Zapisz kontrole dostępu", "resourceUsersRolesSubmit": "Zapisz kontrole dostępu",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Widoczność", "resourceVisibilityTitle": "Widoczność",
"resourceVisibilityTitleDescription": "Całkowicie włącz lub wyłącz widoczność zasobu", "resourceVisibilityTitleDescription": "Całkowicie włącz lub wyłącz widoczność zasobu",
"resourceGeneral": "Ustawienia ogólne", "resourceGeneral": "Ustawienia ogólne",
"resourceGeneralDescription": "Skonfiguruj nazwę, adres i zasady dostępu dla tego zasobu.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Szczegóły zasobu", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Ustaw nazwę wyświetlaną, identyfikator i publicznie dostępna domenę dla tego zasobu.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Ustaw nazwę wyświetlaną, identyfikator i publiczny port dla tego zasobu.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Publiczny Adres", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Skonfiguruj, jak użytkownicy mogą dotrzeć do tego zasobu.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Uwierzytelnianie i Dostęp", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Wybierz, czy ten zasób używa własnej polityki, czy dziedziczy z polityki współdzielonej.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Włącz zasób", "resourceEnable": "Włącz zasób",
"resourceTransfer": "Przenieś zasób", "resourceTransfer": "Przenieś zasób",
"resourceTransferDescription": "Przenieś ten zasób do innej witryny", "resourceTransferDescription": "Przenieś ten zasób do innej witryny",
@@ -1294,14 +1293,14 @@
"addLabels": "Dodaj etykiety", "addLabels": "Dodaj etykiety",
"siteLabelsTab": "Etykiety", "siteLabelsTab": "Etykiety",
"siteLabelsDescription": "Zarządzaj etykietami powiązanymi z tą stroną.", "siteLabelsDescription": "Zarządzaj etykietami powiązanymi z tą stroną.",
"labelsNotFound": "Nie znaleziono etykiet.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Zacznij pisać powyżej, aby utworzyć etykietę.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Szukaj etykiet", "labelSearch": "Szukaj etykiet",
"labelSearchOrCreate": "Wyszukaj lub utwórz etykietę", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# etykieta} few {# etykiety} many {# etykiet} other {# etykiet}}", "accessLabelFilterCount": "{count, plural, one {# etykieta} few {# etykiety} many {# etykiet} other {# etykiet}}",
"labelOverflowCount": "+{count, plural, one {# etykieta} few {# etykiety} many {# etykiet} other {# etykiet}}", "labelOverflowCount": "+{count, plural, one {# etykieta} few {# etykiety} many {# etykiet} other {# etykiet}}",
"accessLabelFilterClear": "Wyczyść filtry etykiet", "accessLabelFilterClear": "Wyczyść filtry etykiet",
"accessFilterClear": "Wyczyść filtry", "accessFilterClear": "Clear filters",
"selectColor": "Wybierz kolor", "selectColor": "Wybierz kolor",
"createNewLabel": "Utwórz nową etykietę org \"{label}\"", "createNewLabel": "Utwórz nową etykietę org \"{label}\"",
"inviteInvalidDescription": "Link zapraszający jest nieprawidłowy.", "inviteInvalidDescription": "Link zapraszający jest nieprawidłowy.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Zasoby", "sidebarResources": "Zasoby",
"sidebarProxyResources": "Publiczne", "sidebarProxyResources": "Publiczne",
"sidebarClientResources": "Prywatny", "sidebarClientResources": "Prywatny",
"sidebarPolicies": "Polityki Współdzielone", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Zasoby publiczne", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Kontrola dostępu", "sidebarAccessControl": "Kontrola dostępu",
"sidebarLogsAndAnalytics": "Logi i Analityki", "sidebarLogsAndAnalytics": "Logi i Analityki",
"sidebarTeam": "Drużyna", "sidebarTeam": "Drużyna",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Administrator", "sidebarAdmin": "Administrator",
"sidebarInvitations": "Zaproszenia", "sidebarInvitations": "Zaproszenia",
"sidebarRoles": "Role", "sidebarRoles": "Role",
"sidebarShareableLinks": "Linki do udostępnienia", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "Klucze API", "sidebarApiKeys": "Klucze API",
"sidebarProvisioning": "Dostarczanie", "sidebarProvisioning": "Dostarczanie",
"sidebarSettings": "Ustawienia", "sidebarSettings": "Ustawienia",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Zasób {id}", "standaloneHcFilterResourceIdFallback": "Zasób {id}",
"blueprints": "Schematy", "blueprints": "Schematy",
"blueprintsLog": "Dziennik szablonów", "blueprintsLog": "Dziennik szablonów",
"blueprintsDescription": "Przeglądaj wcześniejsze aplikacje wzorców i ich wyniki lub zastosuj nowy wzorzec", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Dodaj schemat", "blueprintAdd": "Dodaj schemat",
"blueprintGoBack": "Zobacz wszystkie schematy", "blueprintGoBack": "Zobacz wszystkie schematy",
"blueprintCreate": "Utwórz schemat", "blueprintCreate": "Utwórz schemat",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Włącz schemat dokera", "enableDockerSocket": "Włącz schemat dokera",
"enableDockerSocketDescription": "Włącz etykietowanie gniazda dokera dla etykiet szablonów. Ścieżka do gniazda musi być dostarczona do łącznika strony. Przeczytaj zarówno jak to działa w <docsLink>dokumentacji</docsLink>.", "enableDockerSocketDescription": "Włącz etykietowanie gniazda dokera dla etykiet szablonów. Ścieżka do gniazda musi być dostarczona do łącznika strony. Przeczytaj zarówno jak to działa w <docsLink>dokumentacji</docsLink>.",
"newtAutoUpdate": "Włącz automatyczną aktualizację witryny", "newtAutoUpdate": "Włącz automatyczną aktualizację witryny",
"newtAutoUpdateDescription": "Po włączeniu, łączniki witryn automatycznie pobiorą najnowszą wersję i uruchomią się ponownie. Można to nadpisać na poziomie poszczególnych witryn.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Automatyczna aktualizacja strony", "siteAutoUpdate": "Automatyczna aktualizacja strony",
"siteAutoUpdateLabel": "Włącz aktualizacje automatyczne", "siteAutoUpdateLabel": "Włącz aktualizacje automatyczne",
"siteAutoUpdateDescription": "Po włączeniu, łącznik tej witryny automatycznie pobierze najnowszą wersję i uruchomi się ponownie.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Domyślnie dla organizacji: {state}", "siteAutoUpdateOrgDefault": "Domyślnie dla organizacji: {state}",
"siteAutoUpdateOverriding": "Nadpisywanie ustawień organizacji", "siteAutoUpdateOverriding": "Nadpisywanie ustawień organizacji",
"siteAutoUpdateResetToOrg": "Zresetuj do domyślnych ustawień organizacji", "siteAutoUpdateResetToOrg": "Zresetuj do domyślnych ustawień organizacji",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Konfiguracja konta zakończona! Witaj w Pangolin!", "accountSetupSuccess": "Konfiguracja konta zakończona! Witaj w Pangolin!",
"documentation": "Dokumentacja", "documentation": "Dokumentacja",
"saveAllSettings": "Zapisz wszystkie ustawienia", "saveAllSettings": "Zapisz wszystkie ustawienia",
"saveResourceTargets": "Zapisz ustawienia", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Zapisz ustawienia", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Zapisz ustawienia", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Ustawienia zaktualizowane", "settingsUpdated": "Ustawienia zaktualizowane",
"settingsUpdatedDescription": "Ustawienia zostały pomyślnie zaktualizowane", "settingsUpdatedDescription": "Ustawienia zostały pomyślnie zaktualizowane",
"settingsErrorUpdate": "Nie udało się zaktualizować ustawień", "settingsErrorUpdate": "Nie udało się zaktualizować ustawień",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Nieznany", "healthCheckUnknown": "Nieznany",
"healthCheck": "Kontrola Zdrowia", "healthCheck": "Kontrola Zdrowia",
"configureHealthCheck": "Skonfiguruj Kontrolę Zdrowia", "configureHealthCheck": "Skonfiguruj Kontrolę Zdrowia",
"configureHealthCheckDescription": "Skonfiguruj monitorowanie zasobu, aby zapewnić jego dostępność", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Włącz Kontrole Zdrowia", "enableHealthChecks": "Włącz Kontrole Zdrowia",
"healthCheckDisabledStateDescription": "Gdy wyłączone, strona nie będzie wykonywać kontroli zdrowia, a stan zostanie uznany za nieznany.", "healthCheckDisabledStateDescription": "Gdy wyłączone, strona nie będzie wykonywać kontroli zdrowia, a stan zostanie uznany za nieznany.",
"enableHealthChecksDescription": "Monitoruj zdrowie tego celu. Możesz monitorować inny punkt końcowy niż docelowy w razie potrzeby.", "enableHealthChecksDescription": "Monitoruj zdrowie tego celu. Możesz monitorować inny punkt końcowy niż docelowy w razie potrzeby.",
"healthScheme": "Metoda", "healthScheme": "Metoda",
"healthSelectScheme": "Wybierz metodę", "healthSelectScheme": "Wybierz metodę",
"healthCheckPortInvalid": "Port musi być pomiędzy 1 a 65535", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Ścieżka", "healthCheckPath": "Ścieżka",
"healthHostname": "IP / Nazwa hosta", "healthHostname": "IP / Nazwa hosta",
"healthPort": "Port", "healthPort": "Port",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Wymagaj zatwierdzenia urządzenia", "requireDeviceApproval": "Wymagaj zatwierdzenia urządzenia",
"requireDeviceApprovalDescription": "Użytkownicy o tej roli potrzebują nowych urządzeń zatwierdzonych przez administratora, zanim będą mogli połączyć się i uzyskać dostęp do zasobów.", "requireDeviceApprovalDescription": "Użytkownicy o tej roli potrzebują nowych urządzeń zatwierdzonych przez administratora, zanim będą mogli połączyć się i uzyskać dostęp do zasobów.",
"sshSettings": "Ustawienia SSH", "sshSettings": "Ustawienia SSH",
"sshAccess": "Dostęp SSH", "sshAccess": "SSH Access",
"rdpSettings": "Ustawienia RDP", "rdpSettings": "Ustawienia RDP",
"vncSettings": "Ustawienia VNC", "vncSettings": "Ustawienia VNC",
"sshServer": "Serwer SSH", "sshServer": "Serwer SSH",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Upewnij się, że Twoja maszyna docelowa jest poprawnie skonfigurowana do uruchamiania demona uwierzytelniania zanim ukończysz tę konfigurację, w przeciwnym razie provisioning zakończy się niepowodzeniem.", "sshDaemonDisclaimer": "Upewnij się, że Twoja maszyna docelowa jest poprawnie skonfigurowana do uruchamiania demona uwierzytelniania zanim ukończysz tę konfigurację, w przeciwnym razie provisioning zakończy się niepowodzeniem.",
"sshDaemonPort": "Port Demona", "sshDaemonPort": "Port Demona",
"sshServerDestination": "Miejsce docelowe serwera", "sshServerDestination": "Miejsce docelowe serwera",
"sshServerDestinationDescription": "Skonfiguruj miejsce docelowe serwera SSH", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Miejsce docelowe", "destination": "Miejsce docelowe",
"destinationRequired": "Wymagane jest miejsce docelowe.", "destinationRequired": "Destination is required.",
"domainRequired": "Wymagana jest domena.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Wymagany jest port.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Nieprawidłowa konfiguracja ścieżki.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Nieprawidłowa konfiguracja ścieżki modyfikacji.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Wybór wielu stron umożliwia odporność trasowania i zmienioność dla wysokiej dostępności.", "bgTargetMultiSiteDisclaimer": "Wybór wielu stron umożliwia odporność trasowania i zmienioność dla wysokiej dostępności.",
"roleAllowSsh": "Zezwalaj na SSH", "roleAllowSsh": "Zezwalaj na SSH",
"roleAllowSshAllow": "Zezwól", "roleAllowSshAllow": "Zezwól",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "Użytkownik może uruchamiać tylko określone polecenia z sudo.", "sshSudoModeCommandsDescription": "Użytkownik może uruchamiać tylko określone polecenia z sudo.",
"sshSudo": "Zezwól na sudo", "sshSudo": "Zezwól na sudo",
"sshSudoCommands": "Komendy Sudo", "sshSudoCommands": "Komendy Sudo",
"sshSudoCommandsDescription": "Lista poleceń, które użytkownik może uruchomić z sudo, oddzielone przecinkami, spacjami lub nowymi liniami. Absolutne ścieżki muszą być używane.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Utwórz katalog domowy", "sshCreateHomeDir": "Utwórz katalog domowy",
"sshUnixGroups": "Grupy Unix", "sshUnixGroups": "Grupy Unix",
"sshUnixGroupsDescription": "Grupy Uniksowe, do których dodać użytkownika na docelowym hoście, oddzielone przecinkami, spacjami, lub nowymi liniami.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Wprowadź wartości lub upuść plik .txt lub .csv", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Importuj z pliku", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Importowanie {fileName} do {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Pomiń pierwszy wiersz (Nagłówek)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Zamień istniejące", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Dołącz do istniejącego", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Tryb importu", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Podgląd", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Brak elementów do zaimportowania} one {1 element do zaimportowania} few {# elementy do zaimportowania} many {# elementów do zaimportowania} other {# elementów do zaimportowania}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} istniejące + {imported} zaimportowane = {total} łącznie", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Importuj", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Nieobsługiwany typ pliku", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Obsługiwane są tylko pliki .txt i .csv.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Nie znaleziono elementów w pliku", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Plik nie zawiera żadnych elementów możliwych do zaimportowania.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Próby Ponowienia", "retryAttempts": "Próby Ponowienia",
"expectedResponseCodes": "Oczekiwane Kody Odpowiedzi", "expectedResponseCodes": "Oczekiwane Kody Odpowiedzi",
"expectedResponseCodesDescription": "Kod statusu HTTP, który wskazuje zdrowy status. Jeśli pozostanie pusty, uznaje się 200-300 za zdrowy.", "expectedResponseCodesDescription": "Kod statusu HTTP, który wskazuje zdrowy status. Jeśli pozostanie pusty, uznaje się 200-300 za zdrowy.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Włącz protokół proxy", "enableProxyProtocol": "Włącz protokół proxy",
"proxyProtocolInfo": "Zachowaj adresy IP klienta dla backendów TCP", "proxyProtocolInfo": "Zachowaj adresy IP klienta dla backendów TCP",
"proxyProtocolVersion": "Wersja protokołu proxy", "proxyProtocolVersion": "Wersja protokołu proxy",
"version1": "Wersja 1 (Zalecane)", "version1": "Version 1 (Recommended)",
"version2": "Wersja 2", "version2": "Wersja 2",
"version1Description": "Oparta na tekście i szeroko wspierana. Upewnij się, że transport serwera został dodany do dynamicznej konfiguracji.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Binarna i bardziej efektywna, ale mniej kompatybilna. Upewnij się, że transport serwera został dodany do dynamicznej konfiguracji.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Ostrzeżenie", "warning": "Ostrzeżenie",
"proxyProtocolWarning": "Aplikacja backend musi być skonfigurowana do akceptowania połączeń protokołu proxy. Jeśli Twój backend nie obsługuje protokołu Proxy, włączenie tego spowoduje przerwanie wszystkich połączeń, więc włącz to tylko jeśli wiesz, co robisz. Upewnij się, że konfiguracja twojego backendu do zaufanych nagłówków protokołu proxy z Traefik.", "proxyProtocolWarning": "Aplikacja backend musi być skonfigurowana do akceptowania połączeń protokołu proxy. Jeśli Twój backend nie obsługuje protokołu Proxy, włączenie tego spowoduje przerwanie wszystkich połączeń, więc włącz to tylko jeśli wiesz, co robisz. Upewnij się, że konfiguracja twojego backendu do zaufanych nagłówków protokołu proxy z Traefik.",
"restarting": "Restartowanie...", "restarting": "Restartowanie...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Wprowadź potwierdzenie", "enterConfirmation": "Wprowadź potwierdzenie",
"blueprintViewDetails": "Szczegóły", "blueprintViewDetails": "Szczegóły",
"defaultIdentityProvider": "Domyślny dostawca tożsamości", "defaultIdentityProvider": "Domyślny dostawca tożsamości",
"defaultIdentityProviderDescription": "Użytkownik zostanie automatycznie przekierowany do tego dostawcy tożsamości w celu uwierzytelnienia.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Ustawienia sieci", "editInternalResourceDialogNetworkSettings": "Ustawienia sieci",
"editInternalResourceDialogAccessPolicy": "Polityka dostępowa", "editInternalResourceDialogAccessPolicy": "Polityka dostępowa",
"editInternalResourceDialogAddRoles": "Dodaj role", "editInternalResourceDialogAddRoles": "Dodaj role",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Typ trybu konserwacji", "maintenanceModeType": "Typ trybu konserwacji",
"showMaintenancePage": "Pokaż odwiedzającym stronę konserwacji", "showMaintenancePage": "Pokaż odwiedzającym stronę konserwacji",
"enableMaintenanceMode": "Włącz tryb konserwacji", "enableMaintenanceMode": "Włącz tryb konserwacji",
"enableMaintenanceModeDescription": "Gdy włączone, odwiedzający zobaczą stronę konserwacyjną zamiast Twojego zasobu.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automatycznie", "automatic": "Automatycznie",
"automaticModeDescription": "Pokaż stronę konserwacyjną tylko wtedy, gdy wszystkie cele zaplecza są wyłączone lub niezdrowe. Twój zasób działa nadal normalnie, o ile przynajmniej jeden cel jest zdrowy.", "automaticModeDescription": "Pokaż stronę konserwacyjną tylko wtedy, gdy wszystkie cele zaplecza są wyłączone lub niezdrowe. Twój zasób działa nadal normalnie, o ile przynajmniej jeden cel jest zdrowy.",
"forced": "Wymuszone", "forced": "Wymuszone",
@@ -3182,8 +3181,8 @@
"warning:": "Ostrzeżenie:", "warning:": "Ostrzeżenie:",
"forcedeModeWarning": "Cały ruch zostanie skierowany na stronę konserwacyjną. Twoje zasoby zaplecza nie otrzymają żadnych żądań.", "forcedeModeWarning": "Cały ruch zostanie skierowany na stronę konserwacyjną. Twoje zasoby zaplecza nie otrzymają żadnych żądań.",
"pageTitle": "Tytuł strony", "pageTitle": "Tytuł strony",
"maintenancePageContentSubsection": "Zawartość strony", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Dostosuj treść wyświetlaną na stronie konserwacyjnej", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "Główny nagłówek wyświetlany na stronie konserwacyjnej", "pageTitleDescription": "Główny nagłówek wyświetlany na stronie konserwacyjnej",
"maintenancePageMessage": "Komunikat konserwacyjny", "maintenancePageMessage": "Komunikat konserwacyjny",
"maintenancePageMessagePlaceholder": "Wrócimy wkrótce! Nasza strona przechodzi obecnie zaplanowaną konserwację.", "maintenancePageMessagePlaceholder": "Wrócimy wkrótce! Nasza strona przechodzi obecnie zaplanowaną konserwację.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Czy na pewno chcesz odłączyć tego dostawcę tożsamości od tej organizacji?", "idpUnassociateQuestion": "Czy na pewno chcesz odłączyć tego dostawcę tożsamości od tej organizacji?",
"idpUnassociateDescription": "Wszystkie użytkownicy powiązani z tym dostawcą tożsamości zostaną usunięci z tej organizacji, ale dostawca tożsamości będzie nadal istniał dla innych powiązanych organizacji.", "idpUnassociateDescription": "Wszystkie użytkownicy powiązani z tym dostawcą tożsamości zostaną usunięci z tej organizacji, ale dostawca tożsamości będzie nadal istniał dla innych powiązanych organizacji.",
"idpUnassociateConfirm": "Potwierdź odłączenie dostawcy tożsamości", "idpUnassociateConfirm": "Potwierdź odłączenie dostawcy tożsamości",
"idpConfirmDeleteAndRemoveMeFromOrg": "USUŃ I USUŃ MNIE Z ORGANIZACJI", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "ODSTAW I USUŃ MNIE Z ORGANIZACJI", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Tego nie można cofnąć dla tej organizacji.", "idpUnassociateWarning": "Tego nie można cofnąć dla tej organizacji.",
"idpUnassociatedDescription": "Dostawca tożsamości pomyślnie odłączony od tej organizacji", "idpUnassociatedDescription": "Dostawca tożsamości pomyślnie odłączony od tej organizacji",
"idpUnassociateMenu": "Odłącz", "idpUnassociateMenu": "Odłącz",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Łączenie…", "sshConnecting": "Łączenie…",
"sshInitializing": "Inicjalizacja…", "sshInitializing": "Inicjalizacja…",
"sshSignInTitle": "Zaloguj się do SSH", "sshSignInTitle": "Zaloguj się do SSH",
"sshSignInDescription": "Wprowadź poświadczenia SSH, aby się połączyć", "sshSignInDescription": "Wprowadź swoje poświadczenia SSH",
"sshPasswordTab": "Hasło", "sshPasswordTab": "Hasło",
"sshPrivateKeyTab": "Klucz prywatny", "sshPrivateKeyTab": "Klucz prywatny",
"sshPrivateKeyField": "Klucz prywatny", "sshPrivateKeyField": "Klucz prywatny",
"sshPrivateKeyDisclaimer": "Twój klucz prywatny nie jest przechowywany ani widoczny dla Pangolin. Alternatywnie, możesz używać certyfikatów krótkoterminowych do bezproblemowego uwierzytelniania za pomocą Twojej istniejącej tożsamości Pangolin.", "sshPrivateKeyDisclaimer": "Twój klucz prywatny nie jest przechowywany ani widoczny dla Pangolin. Alternatywnie, możesz używać certyfikatów krótkoterminowych do bezproblemowego uwierzytelniania za pomocą Twojej istniejącej tożsamości Pangolin.",
"sshLearnMore": "Dowiedz się więcej", "sshLearnMore": "Dowiedz się więcej",
"sshPrivateKeyFile": "Plik klucza prywatnego", "sshPrivateKeyFile": "Plik klucza prywatnego",
"sshAuthenticate": "Połącz", "sshAuthenticate": "Uwierzytelnij",
"sshTerminate": "Zakończ", "sshTerminate": "Zakończ",
"sshPoweredBy": "Obsługiwane przez", "sshPoweredBy": "Obsługiwane przez",
"sshErrorNoTarget": "Nie określono celu", "sshErrorNoTarget": "Nie określono celu",
"sshErrorWebSocket": "Połączenie WebSocket nie powiodło się", "sshErrorWebSocket": "Połączenie WebSocket nie powiodło się",
"sshErrorAuthFailed": "Uwierzytelnianie nie powiodło się", "sshErrorAuthFailed": "Uwierzytelnianie nie powiodło się",
"sshErrorConnectionClosed": "Połączenie zamknięte przed ukończeniem uwierzytelniania", "sshErrorConnectionClosed": "Połączenie zamknięte przed ukończeniem uwierzytelniania",
"sitePangolinSshDescription": "Pozwól na dostęp SSH do zasobów na tej stronie. Można to zmienić później.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Nie znaleziono zasobu dla tej domeny", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Brak celu", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Połącz", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Nie udało się podpisać klucza SSH dla uwierzytelniania PAM. Czy zalogowałeś się jako użytkownik?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Błąd: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Połączenie zamknięte (kod {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Wymagany jest klucz prywatny", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Wprowadź hasło VNC, aby się połączyć", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Hasło (opcjonalne)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Brak dostępnego celu zasobu", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Błąd ładowania noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Status {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Wklej schowek", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Zaloguj się na Pulpit Zdalny", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Wprowadź poświadczenia Windows, aby się połączyć", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Ładowanie modułu...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Nie udało się załadować modułu RDP", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Nie gotowy", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "Moduł RDP jest nadal inicjalizowany", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Pobieranie {count} pliku(ów) zdalnego…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Nie udało się pobrać: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Przesłano: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Brak dostępnego celu połączenia", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Połączenie niepowiodło się", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Dopasuj", "rdpFit": "Fit",
"rdpFull": "Pełny", "rdpFull": "Full",
"rdpReal": "Rzeczywisty", "rdpReal": "Real",
"rdpMeta": "Meta", "rdpMeta": "Meta",
"rdpUploadFiles": "Prześlij pliki", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Pliki gotowe do wklejenia", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "Skopiowano {count} plik(-ów/-i) do zdalnego schowka — naciśnij Ctrl+V na zdalnym pulpicie, aby wkleić.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Niepowodzenie przesyłania", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Tryb klawiatury Unicode", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Pokaż pasek narzędzi", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Ukryj pasek narzędzi" "sessionToolbarHide": "Hide toolbar"
} }
+182 -183
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Visualizar Recursos Privados", "sitesTableViewPrivateResources": "Visualizar Recursos Privados",
"siteInstallNewt": "Instalar Novo", "siteInstallNewt": "Instalar Novo",
"siteInstallNewtDescription": "Novo item em execução no seu sistema", "siteInstallNewtDescription": "Novo item em execução no seu sistema",
"siteInstallKubernetesDocsDescription": "Para mais informações atualizadas sobre a instalação do Kubernetes, veja <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Para instruções de instalação do modem da Advantech, veja <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "Configuração do WireGuard", "WgConfiguration": "Configuração do WireGuard",
"WgConfigurationDescription": "Use a seguinte configuração para conectar-se à rede", "WgConfigurationDescription": "Use a seguinte configuração para conectar-se à rede",
"operatingSystem": "Sistema operacional", "operatingSystem": "Sistema operacional",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Você só será capaz de ver esta vez. Certifique-se de copiá-lo para um lugar seguro.", "siteCredentialsSaveDescription": "Você só será capaz de ver esta vez. Certifique-se de copiá-lo para um lugar seguro.",
"siteInfo": "Informações do Site", "siteInfo": "Informações do Site",
"status": "SItuação", "status": "SItuação",
"shareTitle": "Gerenciar Links Compartilháveis", "shareTitle": "Manage Shareable Links",
"shareDescription": "Criar links compartilháveis para conceder acesso temporário ou permanente aos recursos do proxy", "shareDescription": "Criar links compartilháveis para conceder acesso temporário ou permanente aos recursos do proxy",
"shareSearch": "Pesquisar links compartilháveis...", "shareSearch": "Search shareable links...",
"shareCreate": "Criar Link Compartilhável", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Falha ao apagar o link", "shareErrorDelete": "Falha ao apagar o link",
"shareErrorDeleteMessage": "Ocorreu um erro ao apagar o link", "shareErrorDeleteMessage": "Ocorreu um erro ao apagar o link",
"shareDeleted": "Link excluído", "shareDeleted": "Link excluído",
"shareDeletedDescription": "O link foi eliminado", "shareDeletedDescription": "O link foi eliminado",
"shareDelete": "Excluir Link Compartilhável", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Confirmar exclusão do Link Compartilhável", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Tem certeza de que deseja excluir este link de compartilhamento?", "shareQuestionRemove": "Tem certeza de que deseja excluir este link de compartilhamento?",
"shareMessageRemove": "Uma vez excluído, o link não funcionará mais e qualquer pessoa que o utilizar perderá o acesso ao recurso.", "shareMessageRemove": "Uma vez excluído, o link não funcionará mais e qualquer pessoa que o utilizar perderá o acesso ao recurso.",
"shareTokenDescription": "O token de acesso pode ser passado de duas maneiras: como um parâmetro de consulta ou nos cabeçalhos da solicitação. Estes devem ser passados do cliente em todas as solicitações para acesso autenticado.", "shareTokenDescription": "O token de acesso pode ser passado de duas maneiras: como um parâmetro de consulta ou nos cabeçalhos da solicitação. Estes devem ser passados do cliente em todas as solicitações para acesso autenticado.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Qualquer um com este link pode aceder o recurso", "shareCreateDescription": "Qualquer um com este link pode aceder o recurso",
"shareTitleOptional": "Título (opcional)", "shareTitleOptional": "Título (opcional)",
"sharePathOptional": "Caminho (opcional)", "sharePathOptional": "Caminho (opcional)",
"sharePathDescription": "O link redirecionará os usuários para este caminho após a autenticação.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Expira em", "expireIn": "Expira em",
"neverExpire": "Nunca expirar", "neverExpire": "Nunca expirar",
"shareExpireDescription": "Tempo de expiração é quanto tempo o link será utilizável e oferecerá acesso ao recurso. Após este tempo, o link não funcionará mais, e os utilizadores que usaram este link perderão acesso ao recurso.", "shareExpireDescription": "Tempo de expiração é quanto tempo o link será utilizável e oferecerá acesso ao recurso. Após este tempo, o link não funcionará mais, e os utilizadores que usaram este link perderão acesso ao recurso.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Por favor, selecione um recurso", "shareErrorSelectResource": "Por favor, selecione um recurso",
"proxyResourceTitle": "Gerenciar Recursos Públicos", "proxyResourceTitle": "Gerenciar Recursos Públicos",
"proxyResourceDescription": "Criar e gerenciar recursos que são acessíveis publicamente por meio de um navegador da web", "proxyResourceDescription": "Criar e gerenciar recursos que são acessíveis publicamente por meio de um navegador da web",
"publicResourcesBannerTitle": "Acesso Público Baseado em Web", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Os recursos públicos são proxies HTTPS acessíveis a qualquer pessoa na internet através de um navegador web. Ao contrário dos recursos privados, eles não exigem software do lado do cliente e podem incluir políticas de acesso conscientes de identidade e contexto.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Gerenciar recursos privados", "clientResourceTitle": "Gerenciar recursos privados",
"clientResourceDescription": "Criar e gerenciar recursos que só são acessíveis por meio de um cliente conectado", "clientResourceDescription": "Criar e gerenciar recursos que só são acessíveis por meio de um cliente conectado",
"privateResourcesBannerTitle": "Acesso Privado com Confiança Zero", "privateResourcesBannerTitle": "Acesso Privado com Confiança Zero",
@@ -212,19 +212,18 @@
"resourcesSearch": "Procurar recursos...", "resourcesSearch": "Procurar recursos...",
"resourceAdd": "Adicionar Recurso", "resourceAdd": "Adicionar Recurso",
"resourceErrorDelte": "Erro ao apagar recurso", "resourceErrorDelte": "Erro ao apagar recurso",
"resourcePoliciesBannerTitle": "Reutilizar Regras de Autenticação e Acesso", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Políticas de recursos compartilhados permitem que você defina métodos de autenticação e regras de acesso apenas uma vez, e então as associe a vários recursos públicos. Quando você atualiza uma política, cada recurso vinculado herda a alteração automaticamente.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Saiba mais", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Gerenciar Políticas de Recursos Públicos", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Recursos",
"resourcePoliciesAttachedResources": "{count} recurso(s)", "resourcePoliciesAttachedResources": "{count} recurso(s)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# recurso} other {# recursos}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "sem recursos", "resourcePoliciesAttachedResourcesEmpty": "sem recursos",
"resourcePoliciesDescription": "Crie e gerencie políticas de autenticação para controlar o acesso aos seus recursos públicos", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Pesquisar políticas...", "resourcePoliciesSearch": "Pesquisar políticas...",
"resourcePoliciesAdd": "Adicionar Política", "resourcePoliciesAdd": "Adicionar Política",
"resourcePoliciesDefaultBadgeText": "Política Padrão", "resourcePoliciesDefaultBadgeText": "Política Padrão",
"resourcePoliciesCreate": "Criar Política de Recurso Público", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Siga os passos abaixo para criar uma nova política", "resourcePoliciesCreateDescription": "Siga os passos abaixo para criar uma nova política",
"resourcePolicyName": "Nome da Política", "resourcePolicyName": "Nome da Política",
"resourcePolicyNameDescription": "Dê um nome a esta política para identificá-la em seus recursos", "resourcePolicyNameDescription": "Dê um nome a esta política para identificá-la em seus recursos",
@@ -281,7 +280,7 @@
"back": "Anterior", "back": "Anterior",
"cancel": "cancelar", "cancel": "cancelar",
"resourceConfig": "Snippets de Configuração", "resourceConfig": "Snippets de Configuração",
"resourceConfigDescription": "Copie e cole estes trechos de configuração para configurar o recurso TCP/UDP.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Adicionar pontos de entrada", "resourceAddEntrypoints": "Traefik: Adicionar pontos de entrada",
"resourceExposePorts": "Gerbil: Expor Portas no Docker Compose", "resourceExposePorts": "Gerbil: Expor Portas no Docker Compose",
"resourceLearnRaw": "Aprenda como configurar os recursos TCP/UDP", "resourceLearnRaw": "Aprenda como configurar os recursos TCP/UDP",
@@ -294,8 +293,8 @@
"labelDelete": "Excluir Etiqueta", "labelDelete": "Excluir Etiqueta",
"labelAdd": "Adicionar Etiqueta", "labelAdd": "Adicionar Etiqueta",
"labelCreateSuccessMessage": "Etiqueta Criada com Sucesso", "labelCreateSuccessMessage": "Etiqueta Criada com Sucesso",
"labelDuplicateError": "Etiqueta Duplicada", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Já existe uma etiqueta com este nome.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Etiqueta Modificada com Sucesso", "labelEditSuccessMessage": "Etiqueta Modificada com Sucesso",
"labelNameField": "Nome da Etiqueta", "labelNameField": "Nome da Etiqueta",
"labelColorField": "Cor da Etiqueta", "labelColorField": "Cor da Etiqueta",
@@ -320,7 +319,7 @@
"rules": "Regras", "rules": "Regras",
"resourceSettingDescription": "Configure as configurações do recurso", "resourceSettingDescription": "Configure as configurações do recurso",
"resourceSetting": "Configurações do {resourceName}", "resourceSetting": "Configurações do {resourceName}",
"resourcePolicySettingDescription": "Configure as configurações nesta política de recurso público", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "Configurações de {policyName}", "resourcePolicySetting": "Configurações de {policyName}",
"alwaysAllow": "Autenticação de bypass", "alwaysAllow": "Autenticação de bypass",
"alwaysDeny": "Bloquear Acesso", "alwaysDeny": "Bloquear Acesso",
@@ -728,7 +727,7 @@
"targetSubmit": "Adicionar Alvo", "targetSubmit": "Adicionar Alvo",
"targetNoOne": "Este recurso não tem nenhum alvo. Adicione um alvo para configurar para onde enviar solicitações para o backend.", "targetNoOne": "Este recurso não tem nenhum alvo. Adicione um alvo para configurar para onde enviar solicitações para o backend.",
"targetNoOneDescription": "Adicionar mais de um alvo acima habilitará o balanceamento de carga.", "targetNoOneDescription": "Adicionar mais de um alvo acima habilitará o balanceamento de carga.",
"targetsSubmit": "Salvar Configurações", "targetsSubmit": "Save Settings",
"addTarget": "Adicionar Alvo", "addTarget": "Adicionar Alvo",
"proxyMultiSiteRoundRobinNodeHelp": "O roteamento round robin não funcionará entre sites que não estão conectados ao mesmo nó, mas o failover funcionará.", "proxyMultiSiteRoundRobinNodeHelp": "O roteamento round robin não funcionará entre sites que não estão conectados ao mesmo nó, mas o failover funcionará.",
"targetErrorInvalidIp": "Endereço IP inválido", "targetErrorInvalidIp": "Endereço IP inválido",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Regra duplicada", "rulesErrorDuplicate": "Regra duplicada",
"rulesErrorDuplicateDescription": "Uma regra com estas configurações já existe", "rulesErrorDuplicateDescription": "Uma regra com estas configurações já existe",
"rulesErrorInvalidIpAddressRange": "CIDR inválido", "rulesErrorInvalidIpAddressRange": "CIDR inválido",
"rulesErrorInvalidIpAddressRangeDescription": "Digite um intervalo CIDR válido (ex.: 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Caminho inválido", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Insira um caminho URL válido ou padrão (ex.: /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Endereço IP inválido", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Insira um endereço IPv4 ou IPv6 válido.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Falha ao atualizar regras", "rulesErrorUpdate": "Falha ao atualizar regras",
"rulesErrorUpdateDescription": "Ocorreu um erro ao atualizar regras", "rulesErrorUpdateDescription": "Ocorreu um erro ao atualizar regras",
"rulesUpdated": "Ativar Regras", "rulesUpdated": "Ativar Regras",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Insira um endereço no formato CIDR (ex: 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Insira um endereço no formato CIDR (ex: 103.21.244.0/22)",
"rulesMatchIpAddress": "Insira um endereço IP (ex: 103.21.244.12)", "rulesMatchIpAddress": "Insira um endereço IP (ex: 103.21.244.12)",
"rulesMatchUrl": "Insira um caminho URL ou padrão (ex: /api/v1/todos ou /api/v1/*)", "rulesMatchUrl": "Insira um caminho URL ou padrão (ex: /api/v1/todos ou /api/v1/*)",
"rulesErrorInvalidPriority": "Prioridade inválida", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Digite um número inteiro de 1 ou mais.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Prioridades duplicadas", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Cada regra deve ter um número de prioridade único.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Regras inválidas", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Regra {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Selecione um tipo de correspondência válido (caminho, IP, CIDR, país, região ou ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Digite um valor para esta regra.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "País inválido", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Selecione um país válido.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "ASN inválido", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Insira um ASN válido (ex.: AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Regras atualizadas", "ruleUpdated": "Regras atualizadas",
"ruleUpdatedDescription": "Regras atualizadas com sucesso", "ruleUpdatedDescription": "Regras atualizadas com sucesso",
"ruleErrorUpdate": "Operação falhou", "ruleErrorUpdate": "Operação falhou",
"ruleErrorUpdateDescription": "Ocorreu um erro durante a operação de salvamento", "ruleErrorUpdateDescription": "Ocorreu um erro durante a operação de salvamento",
"rulesPriority": "Prioridade", "rulesPriority": "Prioridade",
"rulesReorderDragHandle": "Arraste para reordenar a prioridade da regra", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Ação", "rulesAction": "Ação",
"rulesMatchType": "Tipo de Correspondência", "rulesMatchType": "Tipo de Correspondência",
"value": "Valor", "value": "Valor",
@@ -810,7 +809,7 @@
"rulesResource": "Configuração de Regras do Recurso", "rulesResource": "Configuração de Regras do Recurso",
"rulesResourceDescription": "Configurar regras para controlar o acesso ao recurso", "rulesResourceDescription": "Configurar regras para controlar o acesso ao recurso",
"ruleSubmit": "Adicionar Regra", "ruleSubmit": "Adicionar Regra",
"rulesNoOne": "Ainda não há regras.", "rulesNoOne": "No rules yet.",
"rulesOrder": "As regras são avaliadas por prioridade em ordem ascendente.", "rulesOrder": "As regras são avaliadas por prioridade em ordem ascendente.",
"rulesSubmit": "Guardar Regras", "rulesSubmit": "Guardar Regras",
"policyErrorCreate": "Erro ao criar política", "policyErrorCreate": "Erro ao criar política",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Ocorreu um erro inesperado", "policyErrorUpdateMessageDescription": "Ocorreu um erro inesperado",
"policyCreatedSuccess": "Política de recurso criada com sucesso", "policyCreatedSuccess": "Política de recurso criada com sucesso",
"policyUpdatedSuccess": "Política de recurso atualizada com sucesso", "policyUpdatedSuccess": "Política de recurso atualizada com sucesso",
"authMethodsSave": "Salvar Configurações", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Autenticação", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Controle quais métodos de autenticação são necessários para acessar este recurso", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Vários métodos de autenticação ativos", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Os visitantes podem autenticar-se usando qualquer um dos métodos ativos abaixo. Eles não precisam completar todos eles.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Ativo", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Desligado", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "SSO da Plataforma", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Exigir login pelo provedor de identidade da sua organização", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} usuários, {roles} funções", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Provedor padrão", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Adicionar Provedor de Identidade Padrão", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Outros Métodos", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Métodos opcionais que os visitantes podem usar em vez da SSO da plataforma ou junto com ela", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Código de Acesso", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Requer um código de acesso alfanumérico compartilhado para acessar o recurso", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Código de acesso definido", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "Código PIN", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Um código numérico curto necessário para acessar o recurso", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "digo PIN de 6 dígitos definido", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "Lista de E-mails Permitidos", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Permitir endereços de e-mail listados com senhas temporárias", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} endereços permitidos", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Ativar a lista de e-mails permitidos envia uma senha temporária para o e-mail do visitante no login.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Autenticação de Cabeçalho Básico", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Valide um nome e valor de cabeçalho HTTP personalizado em cada solicitação", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Cabeçalho configurado", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Nome do Cabeçalho", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Valor esperado", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Definir Código de Acesso", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Definir Código PIN", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Definir Lista de E-mails Permitidos", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Definir Autenticação de Cabeçalho Básico", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Regras de Acesso", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Quando ativadas, as regras são avaliadas em ordem decrescente até que uma delas seja verdadeira.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "As regras são avaliadas de cima para baixo. A primeira regra correspondente decide o resultado.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "As regras correspondem a solicitações por caminho, endereço IP, localização ou outros critérios. Cada regra aplica uma ação: ignorar autenticação, bloquear acesso ou passar para autenticação. Se nenhuma regra corresponder, o tráfego continua até a autenticação.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Quando as regras estão desativadas, todo o tráfego passa para a autenticação.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Quando nenhuma regra corresponde, o tráfego passa para a autenticação.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Ocorreu um erro ao atualizar o recurso", "resourcesErrorUpdateDescription": "Ocorreu um erro ao atualizar o recurso",
"access": "Acesso", "access": "Acesso",
"accessControl": "Controle de Acesso", "accessControl": "Controle de Acesso",
"shareLink": "Link Compartilhável {resource}", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Selecionar recurso", "resourceSelect": "Selecionar recurso",
"shareLinks": "Links Compartilháveis", "shareLinks": "Shareable Links",
"share": "Links Compartilháveis", "share": "Links Compartilháveis",
"shareDescription2": "Crie links compartilháveis para recursos. Links fornecem acesso temporário ou ilimitado ao seu recurso. Você pode configurar a duração de expiração do link quando você criar um.", "shareDescription2": "Crie links compartilháveis para recursos. Links fornecem acesso temporário ou ilimitado ao seu recurso. Você pode configurar a duração de expiração do link quando você criar um.",
"shareEasyCreate": "Fácil de criar e compartilhar", "shareEasyCreate": "Fácil de criar e compartilhar",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Administradores sempre podem aceder este recurso.", "resourceRoleDescription": "Administradores sempre podem aceder este recurso.",
"resourcePolicySelectTitle": "Política de Acesso ao Recurso", "resourcePolicySelectTitle": "Política de Acesso ao Recurso",
"resourcePolicySelectDescription": "Selecione o tipo de política de recurso para autenticação", "resourcePolicySelectDescription": "Selecione o tipo de política de recurso para autenticação",
"resourcePolicyTypeLabel": "Tipo de política", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Política de recurso", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Política de Recurso Inline", "resourcePolicyInline": "Política de Recurso Inline",
"resourcePolicyInlineDescription": "Política de Acesso abrange apenas este recurso", "resourcePolicyInlineDescription": "Política de Acesso abrange apenas este recurso",
"resourcePolicyShared": "Política de Recurso Compartilhada", "resourcePolicyShared": "Política de Recurso Compartilhada",
"resourcePolicySharedDescription": "Este recurso usa uma política compartilhada.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Política Compartilhada", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Este recurso tem sua própria política.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Este recurso possui seus próprios controles de autenticação e regras de acesso.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Este recurso herda de <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Este recurso está usando uma política compartilhada. Algumas configurações de autenticação podem ser editadas neste recurso para adicionar à política. Para alterar a política subjacente, você deve editar para <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Este recurso está usando uma política compartilhada. Algumas regras de acesso podem ser editadas neste recurso. Para alterar a política subjacente, você deve editar <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Controlos de Acesso", "resourceUsersRoles": "Controlos de Acesso",
"resourceUsersRolesDescription": "Configure quais utilizadores e funções podem visitar este recurso", "resourceUsersRolesDescription": "Configure quais utilizadores e funções podem visitar este recurso",
"resourceUsersRolesSubmit": "Guardar Controlos de Acesso", "resourceUsersRolesSubmit": "Guardar Controlos de Acesso",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Visibilidade", "resourceVisibilityTitle": "Visibilidade",
"resourceVisibilityTitleDescription": "Ativar ou desativar completamente a visibilidade do recurso", "resourceVisibilityTitleDescription": "Ativar ou desativar completamente a visibilidade do recurso",
"resourceGeneral": "Configurações Gerais", "resourceGeneral": "Configurações Gerais",
"resourceGeneralDescription": "Configure o nome, endereço e política de acesso para este recurso.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Detalhes do Recurso", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Defina o nome de exibição, identificador e domínio publicamente acessível para este recurso.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Defina o nome de exibição, identificador e porta pública para este recurso.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Endereço Público", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Configure como os usuários alcançarão este recurso.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Autenticação & Acesso", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Escolha se este recurso usa sua própria política ou herda de uma política compartilhada.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Ativar Recurso", "resourceEnable": "Ativar Recurso",
"resourceTransfer": "Transferir Recurso", "resourceTransfer": "Transferir Recurso",
"resourceTransferDescription": "Transferir este recurso para um site diferente", "resourceTransferDescription": "Transferir este recurso para um site diferente",
@@ -1294,14 +1293,14 @@
"addLabels": "Adicionar etiquetas", "addLabels": "Adicionar etiquetas",
"siteLabelsTab": "Etiquetas", "siteLabelsTab": "Etiquetas",
"siteLabelsDescription": "Gerencie etiquetas associadas a este site.", "siteLabelsDescription": "Gerencie etiquetas associadas a este site.",
"labelsNotFound": "Nenhuma etiqueta encontrada.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Comece a digitar acima para criar uma etiqueta.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Pesquisar etiquetas", "labelSearch": "Pesquisar etiquetas",
"labelSearchOrCreate": "Pesquisar ou criar uma etiqueta", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# etiqueta} other {# etiquetas}}", "accessLabelFilterCount": "{count, plural, one {# etiqueta} other {# etiquetas}}",
"labelOverflowCount": "+{count, plural, one {# etiqueta} other {# etiquetas}}", "labelOverflowCount": "+{count, plural, one {# etiqueta} other {# etiquetas}}",
"accessLabelFilterClear": "Limpar filtros de etiquetas", "accessLabelFilterClear": "Limpar filtros de etiquetas",
"accessFilterClear": "Limpar filtros", "accessFilterClear": "Clear filters",
"selectColor": "Selecionar cor", "selectColor": "Selecionar cor",
"createNewLabel": "Criar nova etiqueta na organização \"{label}\"", "createNewLabel": "Criar nova etiqueta na organização \"{label}\"",
"inviteInvalidDescription": "O link do convite é inválido.", "inviteInvalidDescription": "O link do convite é inválido.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Recursos", "sidebarResources": "Recursos",
"sidebarProxyResources": "Público", "sidebarProxyResources": "Público",
"sidebarClientResources": "Privado", "sidebarClientResources": "Privado",
"sidebarPolicies": "Políticas Compartilhadas", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Recursos Públicos", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Controle de Acesso", "sidebarAccessControl": "Controle de Acesso",
"sidebarLogsAndAnalytics": "Registros e Análises", "sidebarLogsAndAnalytics": "Registros e Análises",
"sidebarTeam": "Equipe", "sidebarTeam": "Equipe",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Administrador", "sidebarAdmin": "Administrador",
"sidebarInvitations": "Convites", "sidebarInvitations": "Convites",
"sidebarRoles": "Papéis", "sidebarRoles": "Papéis",
"sidebarShareableLinks": "Links Compartilháveis", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "Chaves API", "sidebarApiKeys": "Chaves API",
"sidebarProvisioning": "Provisionamento", "sidebarProvisioning": "Provisionamento",
"sidebarSettings": "Configurações", "sidebarSettings": "Configurações",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Recurso {id}", "standaloneHcFilterResourceIdFallback": "Recurso {id}",
"blueprints": "Diagramas", "blueprints": "Diagramas",
"blueprintsLog": "Registo dos Blueprint", "blueprintsLog": "Registo dos Blueprint",
"blueprintsDescription": "Visualizar aplicações de blueprint passadas e seus resultados ou aplicar um novo blueprint", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Adicionar Diagrama", "blueprintAdd": "Adicionar Diagrama",
"blueprintGoBack": "Ver todos os Diagramas", "blueprintGoBack": "Ver todos os Diagramas",
"blueprintCreate": "Criar Diagrama", "blueprintCreate": "Criar Diagrama",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Habilitar o Diagrama Docker", "enableDockerSocket": "Habilitar o Diagrama Docker",
"enableDockerSocketDescription": "Ative a raspagem de etiquetas do Docker Socket para etiquetas de modelo. O caminho do Socket deve ser fornecido ao conector do site. Leia sobre como isso funciona na <docsLink>documentação</docsLink>.", "enableDockerSocketDescription": "Ative a raspagem de etiquetas do Docker Socket para etiquetas de modelo. O caminho do Socket deve ser fornecido ao conector do site. Leia sobre como isso funciona na <docsLink>documentação</docsLink>.",
"newtAutoUpdate": "Ativar Atualização Automática do Site", "newtAutoUpdate": "Ativar Atualização Automática do Site",
"newtAutoUpdateDescription": "Quando ativada, os conectores do site baixarão automaticamente a versão mais recente e reiniciarão por conta própria. Isto pode ser sobrescrito com base em cada site.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Atualização Automática do Site", "siteAutoUpdate": "Atualização Automática do Site",
"siteAutoUpdateLabel": "Ativar Atualização Automática", "siteAutoUpdateLabel": "Ativar Atualização Automática",
"siteAutoUpdateDescription": "Quando ativado, o conector deste site baixará automaticamente a versão mais recente e reiniciará por si mesmo.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Padrão da organização: {state}", "siteAutoUpdateOrgDefault": "Padrão da organização: {state}",
"siteAutoUpdateOverriding": "Substituindo configuração da organização", "siteAutoUpdateOverriding": "Substituindo configuração da organização",
"siteAutoUpdateResetToOrg": "Redefinir para Padrão da Organização", "siteAutoUpdateResetToOrg": "Redefinir para Padrão da Organização",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Configuração da conta concluída! Bem-vindo ao Pangolin!", "accountSetupSuccess": "Configuração da conta concluída! Bem-vindo ao Pangolin!",
"documentation": "Documentação", "documentation": "Documentação",
"saveAllSettings": "Guardar Todas as Configurações", "saveAllSettings": "Guardar Todas as Configurações",
"saveResourceTargets": "Salvar Configurações", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Salvar Configurações", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Salvar Configurações", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Configurações atualizadas", "settingsUpdated": "Configurações atualizadas",
"settingsUpdatedDescription": "Configurações atualizadas com sucesso", "settingsUpdatedDescription": "Configurações atualizadas com sucesso",
"settingsErrorUpdate": "Falha ao atualizar configurações", "settingsErrorUpdate": "Falha ao atualizar configurações",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Desconhecido", "healthCheckUnknown": "Desconhecido",
"healthCheck": "Verificação de Saúde", "healthCheck": "Verificação de Saúde",
"configureHealthCheck": "Configurar Verificação de Saúde", "configureHealthCheck": "Configurar Verificação de Saúde",
"configureHealthCheckDescription": "Configure a monitorização para o seu recurso para garantir que ele esteja sempre disponível", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Ativar Verificações de Saúde", "enableHealthChecks": "Ativar Verificações de Saúde",
"healthCheckDisabledStateDescription": "Quando desativado, o site não realizará verificações de saúde e o estado será considerado desconhecido.", "healthCheckDisabledStateDescription": "Quando desativado, o site não realizará verificações de saúde e o estado será considerado desconhecido.",
"enableHealthChecksDescription": "Monitore a saúde deste alvo. Você pode monitorar um ponto de extremidade diferente do alvo, se necessário.", "enableHealthChecksDescription": "Monitore a saúde deste alvo. Você pode monitorar um ponto de extremidade diferente do alvo, se necessário.",
"healthScheme": "Método", "healthScheme": "Método",
"healthSelectScheme": "Selecione o Método", "healthSelectScheme": "Selecione o Método",
"healthCheckPortInvalid": "A porta deve estar entre 1 e 65535", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Caminho", "healthCheckPath": "Caminho",
"healthHostname": "IP / Nome do Host", "healthHostname": "IP / Nome do Host",
"healthPort": "Porta", "healthPort": "Porta",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Exigir aprovação do dispositivo", "requireDeviceApproval": "Exigir aprovação do dispositivo",
"requireDeviceApprovalDescription": "Usuários com esta função precisam de novos dispositivos aprovados por um administrador antes que eles possam se conectar e acessar recursos.", "requireDeviceApprovalDescription": "Usuários com esta função precisam de novos dispositivos aprovados por um administrador antes que eles possam se conectar e acessar recursos.",
"sshSettings": "Configurações SSH", "sshSettings": "Configurações SSH",
"sshAccess": "Acesso SSH", "sshAccess": "SSH Access",
"rdpSettings": "Configurações RDP", "rdpSettings": "Configurações RDP",
"vncSettings": "Configurações VNC", "vncSettings": "Configurações VNC",
"sshServer": "Servidor SSH", "sshServer": "Servidor SSH",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Certifique-se de que seu host de destino está devidamente configurado para executar o daemon de autenticação antes de concluir esta configuração, ou o provisionamento falhará.", "sshDaemonDisclaimer": "Certifique-se de que seu host de destino está devidamente configurado para executar o daemon de autenticação antes de concluir esta configuração, ou o provisionamento falhará.",
"sshDaemonPort": "Porta do Daemon", "sshDaemonPort": "Porta do Daemon",
"sshServerDestination": "Destino do Servidor", "sshServerDestination": "Destino do Servidor",
"sshServerDestinationDescription": "Configure o destino do servidor SSH", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Destino", "destination": "Destino",
"destinationRequired": "Destino é obrigatório.", "destinationRequired": "Destination is required.",
"domainRequired": "Domínio é obrigatório.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Porta é obrigatória.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Configuração de caminho inválida.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Configuração de caminho de reescrita inválida.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Selecionar vários sites permite roteamento resiliente e failover para alta disponibilidade.", "bgTargetMultiSiteDisclaimer": "Selecionar vários sites permite roteamento resiliente e failover para alta disponibilidade.",
"roleAllowSsh": "Permitir SSH", "roleAllowSsh": "Permitir SSH",
"roleAllowSshAllow": "Autorizar", "roleAllowSshAllow": "Autorizar",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "Usuário só pode executar os comandos especificados com sudo.", "sshSudoModeCommandsDescription": "Usuário só pode executar os comandos especificados com sudo.",
"sshSudo": "Permitir sudo", "sshSudo": "Permitir sudo",
"sshSudoCommands": "Comandos Sudo", "sshSudoCommands": "Comandos Sudo",
"sshSudoCommandsDescription": "Lista de comandos que o usuário está autorizado a executar com sudo, separados por vírgulas, espaços ou novas linhas. Devem ser usados caminhos absolutos.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Criar Diretório Inicial", "sshCreateHomeDir": "Criar Diretório Inicial",
"sshUnixGroups": "Grupos Unix", "sshUnixGroups": "Grupos Unix",
"sshUnixGroupsDescription": "Grupos Unix para adicionar o usuário no host de destino, separados por vírgulas, espaços ou novas linhas.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Insira valores, ou solte um arquivo .txt ou .csv", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Importar de Arquivo", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Importando {fileName} para {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Pular Primeira Linha (Cabeçalho)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Substituir Existente", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Anexar ao Existente", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Modo de Importação", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Visualizar", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Sem itens para importar} one {1 item para importar} other {# itens para importar}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} existente + {imported} importado = {total} total", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Importar", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Tipo de arquivo não suportado", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Apenas arquivos .txt e .csv são suportados.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Nenhum item encontrado no arquivo", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "O arquivo não contém quaisquer itens importáveis.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Tentativas de Repetição", "retryAttempts": "Tentativas de Repetição",
"expectedResponseCodes": "Códigos de Resposta Esperados", "expectedResponseCodes": "Códigos de Resposta Esperados",
"expectedResponseCodesDescription": "Código de status HTTP que indica estado saudável. Se deixado em branco, 200-300 é considerado saudável.", "expectedResponseCodesDescription": "Código de status HTTP que indica estado saudável. Se deixado em branco, 200-300 é considerado saudável.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Habilitar protocolo proxy", "enableProxyProtocol": "Habilitar protocolo proxy",
"proxyProtocolInfo": "Preservar endereços IP do cliente para backends TCP", "proxyProtocolInfo": "Preservar endereços IP do cliente para backends TCP",
"proxyProtocolVersion": "Versão do Protocolo Proxy", "proxyProtocolVersion": "Versão do Protocolo Proxy",
"version1": "Versão 1 (Recomendado)", "version1": "Version 1 (Recommended)",
"version2": "Versão 2", "version2": "Versão 2",
"version1Description": "Baseado em texto e amplamente suportado. Certifique-se de que o transporte dos servidores seja adicionado à configuração dinâmica.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Binário e mais eficiente, mas menos compatível. Certifique-se de que o transporte do servidor seja adicionado à configuração dinâmica.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "ATENÇÃO", "warning": "ATENÇÃO",
"proxyProtocolWarning": "A aplicação de backend deve ser configurada para aceitar conexões de protocolo proxy. Se o seu backend não suporta o Protocolo de Proxy, habilitando isto quebrará todas as conexões, então só habilite isso se você souber o que está fazendo. Certifique-se de configurar seu backend para confiar nos cabeçalhos do protocolo proxy no Traefik.", "proxyProtocolWarning": "A aplicação de backend deve ser configurada para aceitar conexões de protocolo proxy. Se o seu backend não suporta o Protocolo de Proxy, habilitando isto quebrará todas as conexões, então só habilite isso se você souber o que está fazendo. Certifique-se de configurar seu backend para confiar nos cabeçalhos do protocolo proxy no Traefik.",
"restarting": "Reiniciando...", "restarting": "Reiniciando...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Inserir confirmação", "enterConfirmation": "Inserir confirmação",
"blueprintViewDetails": "Detalhes", "blueprintViewDetails": "Detalhes",
"defaultIdentityProvider": "Provedor de Identidade Padrão", "defaultIdentityProvider": "Provedor de Identidade Padrão",
"defaultIdentityProviderDescription": "O usuário será redirecionado automaticamente para este provedor de identidade para autenticação.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Configurações de Rede", "editInternalResourceDialogNetworkSettings": "Configurações de Rede",
"editInternalResourceDialogAccessPolicy": "Política de Acesso", "editInternalResourceDialogAccessPolicy": "Política de Acesso",
"editInternalResourceDialogAddRoles": "Adicionar Funções", "editInternalResourceDialogAddRoles": "Adicionar Funções",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Tipo de Modo de Manutenção", "maintenanceModeType": "Tipo de Modo de Manutenção",
"showMaintenancePage": "Mostrar uma página de manutenção para os visitantes", "showMaintenancePage": "Mostrar uma página de manutenção para os visitantes",
"enableMaintenanceMode": "Ativar Modo de Manutenção", "enableMaintenanceMode": "Ativar Modo de Manutenção",
"enableMaintenanceModeDescription": "Quando ativado, os visitantes verãos uma página de manutenção em vez do seu recurso.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Automático", "automatic": "Automático",
"automaticModeDescription": "Exibir página de manutenção apenas quando todos os destinos de back-end estiverem inativos ou não saudáveis. Seu recurso continua funcionando normalmente desde que pelo menos um destino esteja saudável.", "automaticModeDescription": "Exibir página de manutenção apenas quando todos os destinos de back-end estiverem inativos ou não saudáveis. Seu recurso continua funcionando normalmente desde que pelo menos um destino esteja saudável.",
"forced": "Forçado", "forced": "Forçado",
@@ -3182,8 +3181,8 @@
"warning:": "Aviso:", "warning:": "Aviso:",
"forcedeModeWarning": "Todo o tráfego será direcionado para a página de manutenção. Seus recursos de back-end não receberão nenhuma solicitação.", "forcedeModeWarning": "Todo o tráfego será direcionado para a página de manutenção. Seus recursos de back-end não receberão nenhuma solicitação.",
"pageTitle": "Título da Página", "pageTitle": "Título da Página",
"maintenancePageContentSubsection": "Conteúdo da Página", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Personalize o conteúdo exibido na página de manutenção", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "O título principal exibido na página de manutenção", "pageTitleDescription": "O título principal exibido na página de manutenção",
"maintenancePageMessage": "Mensagem de Manutenção", "maintenancePageMessage": "Mensagem de Manutenção",
"maintenancePageMessagePlaceholder": "Voltaremos em breve! Nosso site está passando por manutenção programada.", "maintenancePageMessagePlaceholder": "Voltaremos em breve! Nosso site está passando por manutenção programada.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Tem certeza de que deseja desassociar este provedor de identidade desta organização?", "idpUnassociateQuestion": "Tem certeza de que deseja desassociar este provedor de identidade desta organização?",
"idpUnassociateDescription": "Todos os usuários associados a este provedor de identidade serão removidos desta organização, mas o provedor de identidade continuará a existir para outras organizações associadas.", "idpUnassociateDescription": "Todos os usuários associados a este provedor de identidade serão removidos desta organização, mas o provedor de identidade continuará a existir para outras organizações associadas.",
"idpUnassociateConfirm": "Confirmar Desassociação do Provedor de Identidade", "idpUnassociateConfirm": "Confirmar Desassociação do Provedor de Identidade",
"idpConfirmDeleteAndRemoveMeFromOrg": "DELETAR E REMOVER-ME DA ORGANIZAÇÃO", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "DESASSOCIAR E REMOVER-ME DA ORGANIZAÇÃO", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Isso não pode ser desfeito para esta organização.", "idpUnassociateWarning": "Isso não pode ser desfeito para esta organização.",
"idpUnassociatedDescription": "Provedor de identidade desassociado desta organização com sucesso", "idpUnassociatedDescription": "Provedor de identidade desassociado desta organização com sucesso",
"idpUnassociateMenu": "Desassociar", "idpUnassociateMenu": "Desassociar",
@@ -3543,58 +3542,58 @@
"sshConnecting": "A conectar…", "sshConnecting": "A conectar…",
"sshInitializing": "A iniciar…", "sshInitializing": "A iniciar…",
"sshSignInTitle": "Entrar no SSH", "sshSignInTitle": "Entrar no SSH",
"sshSignInDescription": "Digite suas credenciais SSH para conectar", "sshSignInDescription": "Insira suas credenciais SSH",
"sshPasswordTab": "Palavra-passe", "sshPasswordTab": "Palavra-passe",
"sshPrivateKeyTab": "Chave Privada", "sshPrivateKeyTab": "Chave Privada",
"sshPrivateKeyField": "Chave Privada", "sshPrivateKeyField": "Chave Privada",
"sshPrivateKeyDisclaimer": "Sua chave privada não é armazenada ou visível para Pangolin. Alternativamente, você pode usar certificados de curta duração para autenticação perfeita usando sua identidade Pangolin existente.", "sshPrivateKeyDisclaimer": "Sua chave privada não é armazenada ou visível para Pangolin. Alternativamente, você pode usar certificados de curta duração para autenticação perfeita usando sua identidade Pangolin existente.",
"sshLearnMore": "Saiba mais", "sshLearnMore": "Saiba mais",
"sshPrivateKeyFile": "Arquivo de Chave Privada", "sshPrivateKeyFile": "Arquivo de Chave Privada",
"sshAuthenticate": "Conectar", "sshAuthenticate": "Autenticar",
"sshTerminate": "Terminar", "sshTerminate": "Terminar",
"sshPoweredBy": "Desenvolvido por", "sshPoweredBy": "Desenvolvido por",
"sshErrorNoTarget": "Nenhum alvo especificado", "sshErrorNoTarget": "Nenhum alvo especificado",
"sshErrorWebSocket": "Falha na conexão WebSocket", "sshErrorWebSocket": "Falha na conexão WebSocket",
"sshErrorAuthFailed": "Falha na autenticação", "sshErrorAuthFailed": "Falha na autenticação",
"sshErrorConnectionClosed": "Conexão encerrada antes de concluir a autenticação", "sshErrorConnectionClosed": "Conexão encerrada antes de concluir a autenticação",
"sitePangolinSshDescription": "Permitir acesso SSH aos recursos deste site. Isso pode ser alterado mais tarde.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Nenhum recurso encontrado para este domínio", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Sem alvo", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Conectar", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Falha ao assinar a chave SSH para autenticação PAM push. Você se conectou como um usuário?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Erro: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Conexão encerrada (código {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Chave privada é necessária", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Digite sua senha VNC para conectar", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Senha (opcional)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Nenhum alvo de recurso disponível", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Falha ao carregar noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Status {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Colar conteúdo da área de transferência", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Conectar-se à Área de Trabalho Remota", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Digite as credenciais do Windows para conectar", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Carregando módulo...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Falha ao carregar módulo RDP", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Não está pronto", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "Módulo RDP ainda está inicializando", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Baixando {count} arquivo(s) do remoto…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Falha ao baixar: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Enviado: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Nenhum alvo de conexão disponível", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Conexão falhou", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Ajustar", "rdpFit": "Fit",
"rdpFull": "Completo", "rdpFull": "Full",
"rdpReal": "Real", "rdpReal": "Real",
"rdpMeta": "Meta", "rdpMeta": "Meta",
"rdpUploadFiles": "Upload de arquivos", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Arquivos prontos para colar", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} arquivo(s) copiado(s) para a área de transferência remota — pressione Ctrl+V na área de trabalho remota para colar.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Falha no upload", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Modo de teclado Unicode", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Mostrar barra de ferramentas", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Ocultar barra de ferramentas" "sessionToolbarHide": "Hide toolbar"
} }
+186 -187
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Просмотр частных ресурсов", "sitesTableViewPrivateResources": "Просмотр частных ресурсов",
"siteInstallNewt": "Установить Newt", "siteInstallNewt": "Установить Newt",
"siteInstallNewtDescription": "Запустите Newt в вашей системе", "siteInstallNewtDescription": "Запустите Newt в вашей системе",
"siteInstallKubernetesDocsDescription": "Для получения дополнительной информации об установке Kubernetes, см. <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Для инструкций по установке модема Advantech, см. <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "Конфигурация WireGuard", "WgConfiguration": "Конфигурация WireGuard",
"WgConfigurationDescription": "Используйте следующую конфигурацию для подключения к сети", "WgConfigurationDescription": "Используйте следующую конфигурацию для подключения к сети",
"operatingSystem": "Операционная система", "operatingSystem": "Операционная система",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Вы сможете увидеть эти данные только один раз. Обязательно скопируйте их в безопасное место.", "siteCredentialsSaveDescription": "Вы сможете увидеть эти данные только один раз. Обязательно скопируйте их в безопасное место.",
"siteInfo": "Информация о сайте", "siteInfo": "Информация о сайте",
"status": "Статус", "status": "Статус",
"shareTitle": "Управление общими ссылками", "shareTitle": "Manage Shareable Links",
"shareDescription": "Создавайте общие ссылки, чтобы предоставить временный или постоянный доступ к прокси ресурсам", "shareDescription": "Создавайте общие ссылки, чтобы предоставить временный или постоянный доступ к прокси ресурсам",
"shareSearch": "Поиск общих ссылок...", "shareSearch": "Search shareable links...",
"shareCreate": "Создать общую ссылку", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Не удалось удалить ссылку", "shareErrorDelete": "Не удалось удалить ссылку",
"shareErrorDeleteMessage": "Произошла ошибка при удалении ссылки", "shareErrorDeleteMessage": "Произошла ошибка при удалении ссылки",
"shareDeleted": "Ссылка удалена", "shareDeleted": "Ссылка удалена",
"shareDeletedDescription": "Ссылка была успешно удалена", "shareDeletedDescription": "Ссылка была успешно удалена",
"shareDelete": "Удалить общую ссылку", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Подтвердить удаление общей ссылки", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Вы уверены, что хотите удалить эту общую ссылку?", "shareQuestionRemove": "Вы уверены, что хотите удалить эту общую ссылку?",
"shareMessageRemove": "После удаления ссылка перестанет работать, и все, кто ее использует, потеряют доступ к ресурсу.", "shareMessageRemove": "После удаления ссылка перестанет работать, и все, кто ее использует, потеряют доступ к ресурсу.",
"shareTokenDescription": "Токен доступа может быть передан двумя способами: как параметр запроса или в заголовках запроса. Они должны быть переданы от клиента по каждому запросу для аутентифицированного доступа.", "shareTokenDescription": "Токен доступа может быть передан двумя способами: как параметр запроса или в заголовках запроса. Они должны быть переданы от клиента по каждому запросу для аутентифицированного доступа.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Любой, у кого есть эта ссылка, может получить доступ к ресурсу", "shareCreateDescription": "Любой, у кого есть эта ссылка, может получить доступ к ресурсу",
"shareTitleOptional": "Заголовок (необязательно)", "shareTitleOptional": "Заголовок (необязательно)",
"sharePathOptional": "Путь (необязательно)", "sharePathOptional": "Путь (необязательно)",
"sharePathDescription": "Ссылка перенаправит пользователей на этот путь после аутентификации.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Срок действия", "expireIn": "Срок действия",
"neverExpire": "Бессрочный доступ", "neverExpire": "Бессрочный доступ",
"shareExpireDescription": "Срок действия - это период, в течение которого ссылка будет работать и предоставлять доступ к ресурсу. После этого времени ссылка перестанет работать, и пользователи, использовавшие эту ссылку, потеряют доступ к ресурсу.", "shareExpireDescription": "Срок действия - это период, в течение которого ссылка будет работать и предоставлять доступ к ресурсу. После этого времени ссылка перестанет работать, и пользователи, использовавшие эту ссылку, потеряют доступ к ресурсу.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Пожалуйста, выберите ресурс", "shareErrorSelectResource": "Пожалуйста, выберите ресурс",
"proxyResourceTitle": "Управление публичными ресурсами", "proxyResourceTitle": "Управление публичными ресурсами",
"proxyResourceDescription": "Создание и управление ресурсами, которые доступны через веб-браузер", "proxyResourceDescription": "Создание и управление ресурсами, которые доступны через веб-браузер",
"publicResourcesBannerTitle": "Веб-доступ к публичным ресурсам", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Публичные ресурсы — это HTTPS-прокси, доступные для любого пользователя Интернета через веб-браузер. В отличие от частных ресурсов, они не требуют программного обеспечения на стороне клиента и могут включать в себя политики доступа, учитывающие идентичность и контекст.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Управление приватными ресурсами", "clientResourceTitle": "Управление приватными ресурсами",
"clientResourceDescription": "Создание и управление ресурсами, которые доступны только через подключенный клиент", "clientResourceDescription": "Создание и управление ресурсами, которые доступны только через подключенный клиент",
"privateResourcesBannerTitle": "Частный доступ с нулевым доверием", "privateResourcesBannerTitle": "Частный доступ с нулевым доверием",
@@ -212,19 +212,18 @@
"resourcesSearch": "Поиск ресурсов...", "resourcesSearch": "Поиск ресурсов...",
"resourceAdd": "Добавить ресурс", "resourceAdd": "Добавить ресурс",
"resourceErrorDelte": "Ошибка при удалении ресурса", "resourceErrorDelte": "Ошибка при удалении ресурса",
"resourcePoliciesBannerTitle": "Повторное использование правил аутентификации и доступа", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Политики общих ресурсов позволяют один раз определить методы аутентификации и правила доступа, а затем прикреплять их к нескольким публичным ресурсам. Когда вы обновляете политику, каждое связанное с ней наследует изменение автоматически.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Узнать больше", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Управление политиками публичных ресурсов", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Ресурсы",
"resourcePoliciesAttachedResources": "{count} ресурс(ов)", "resourcePoliciesAttachedResources": "{count} ресурс(ов)",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# ресурс} few {# ресурса} many {# ресурсов} other {# ресурсов}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "нет ресурсов", "resourcePoliciesAttachedResourcesEmpty": "нет ресурсов",
"resourcePoliciesDescription": "Создание и управление политиками аутентификации для контроля доступа к вашим публичным ресурсам", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Поиск политик...", "resourcePoliciesSearch": "Поиск политик...",
"resourcePoliciesAdd": "Добавить политику", "resourcePoliciesAdd": "Добавить политику",
"resourcePoliciesDefaultBadgeText": "Политика по умолчанию", "resourcePoliciesDefaultBadgeText": "Политика по умолчанию",
"resourcePoliciesCreate": "Создать политику публичного ресурса", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Следуйте шагам ниже, чтобы создать новую политику", "resourcePoliciesCreateDescription": "Следуйте шагам ниже, чтобы создать новую политику",
"resourcePolicyName": "Имя политики", "resourcePolicyName": "Имя политики",
"resourcePolicyNameDescription": "Дайте этой политике имя для идентификации ее в ваших ресурсах", "resourcePolicyNameDescription": "Дайте этой политике имя для идентификации ее в ваших ресурсах",
@@ -281,7 +280,7 @@
"back": "Назад", "back": "Назад",
"cancel": "Отмена", "cancel": "Отмена",
"resourceConfig": "Фрагменты конфигурации", "resourceConfig": "Фрагменты конфигурации",
"resourceConfigDescription": "Скопируйте и вставьте эти фрагменты конфигурации для настройки ресурса TCP/UDP.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Добавить точки входа", "resourceAddEntrypoints": "Traefik: Добавить точки входа",
"resourceExposePorts": "Gerbil: Открыть порты в Docker Compose", "resourceExposePorts": "Gerbil: Открыть порты в Docker Compose",
"resourceLearnRaw": "Узнайте, как настроить TCP/UDP-ресурсы", "resourceLearnRaw": "Узнайте, как настроить TCP/UDP-ресурсы",
@@ -294,8 +293,8 @@
"labelDelete": "Удалить метку", "labelDelete": "Удалить метку",
"labelAdd": "Добавить метку", "labelAdd": "Добавить метку",
"labelCreateSuccessMessage": "Метка успешно создана", "labelCreateSuccessMessage": "Метка успешно создана",
"labelDuplicateError": "Повторяющаяся метка", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Метка с таким именем уже существует.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Метка успешно изменена", "labelEditSuccessMessage": "Метка успешно изменена",
"labelNameField": "Название метки", "labelNameField": "Название метки",
"labelColorField": "Цвет метки", "labelColorField": "Цвет метки",
@@ -320,7 +319,7 @@
"rules": "Правила", "rules": "Правила",
"resourceSettingDescription": "Настройка параметров ресурса", "resourceSettingDescription": "Настройка параметров ресурса",
"resourceSetting": "Настройки {resourceName}", "resourceSetting": "Настройки {resourceName}",
"resourcePolicySettingDescription": "Настройте параметры этой политики публичного ресурса", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "Настройки {policyName}", "resourcePolicySetting": "Настройки {policyName}",
"alwaysAllow": "Авторизация байпасса", "alwaysAllow": "Авторизация байпасса",
"alwaysDeny": "Блокировать доступ", "alwaysDeny": "Блокировать доступ",
@@ -728,7 +727,7 @@
"targetSubmit": "Добавить цель", "targetSubmit": "Добавить цель",
"targetNoOne": "Этот ресурс не имеет никаких целей. Добавьте цель для настройки, где отправлять запросы в бэкэнд.", "targetNoOne": "Этот ресурс не имеет никаких целей. Добавьте цель для настройки, где отправлять запросы в бэкэнд.",
"targetNoOneDescription": "Добавление более одной цели выше включит балансировку нагрузки.", "targetNoOneDescription": "Добавление более одной цели выше включит балансировку нагрузки.",
"targetsSubmit": "Сохранить настройки", "targetsSubmit": "Save Settings",
"addTarget": "Добавить цель", "addTarget": "Добавить цель",
"proxyMultiSiteRoundRobinNodeHelp": "Роутинг с балансировкой нагрузки не будет работать между сайтами, не подключенными к одному и тому же узлу, но подмена будет работать.", "proxyMultiSiteRoundRobinNodeHelp": "Роутинг с балансировкой нагрузки не будет работать между сайтами, не подключенными к одному и тому же узлу, но подмена будет работать.",
"targetErrorInvalidIp": "Неверный IP-адрес", "targetErrorInvalidIp": "Неверный IP-адрес",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Дублирующее правило", "rulesErrorDuplicate": "Дублирующее правило",
"rulesErrorDuplicateDescription": "Правило с такими настройками уже существует", "rulesErrorDuplicateDescription": "Правило с такими настройками уже существует",
"rulesErrorInvalidIpAddressRange": "Неверный CIDR", "rulesErrorInvalidIpAddressRange": "Неверный CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "Введите действительный диапазон CIDR (например, 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Неверный путь", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Введите действительный URL-путь или шаблон (например, /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Недействительный IP адрес", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Введите действительный адрес IPv4 или IPv6.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Не удалось обновить правила", "rulesErrorUpdate": "Не удалось обновить правила",
"rulesErrorUpdateDescription": "Произошла ошибка при обновлении правил", "rulesErrorUpdateDescription": "Произошла ошибка при обновлении правил",
"rulesUpdated": "Включить правила", "rulesUpdated": "Включить правила",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "Введите адрес в формате CIDR (например, 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "Введите адрес в формате CIDR (например, 103.21.244.0/22)",
"rulesMatchIpAddress": "Введите IP адрес (например, 103.21.244.12)", "rulesMatchIpAddress": "Введите IP адрес (например, 103.21.244.12)",
"rulesMatchUrl": "Введите URL путь или шаблон (например, /api/v1/todos или /api/v1/*)", "rulesMatchUrl": "Введите URL путь или шаблон (например, /api/v1/todos или /api/v1/*)",
"rulesErrorInvalidPriority": "Неверный приоритет", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "Введите целое число 1 или больше.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Повторяющиеся приоритеты", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Каждое правило должно иметь уникальный номер приоритета.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Неверные правила", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Правило {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Выберите действительный тип совпадения (путь, IP, CIDR, страна, регион или ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Введите значение для этого правила.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Недействительная страна", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Выберите правильную страну.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "Недействительный ASN", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Введите действительный ASN (например, AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Правила обновлены", "ruleUpdated": "Правила обновлены",
"ruleUpdatedDescription": "Правила успешно обновлены", "ruleUpdatedDescription": "Правила успешно обновлены",
"ruleErrorUpdate": "Операция не удалась", "ruleErrorUpdate": "Операция не удалась",
"ruleErrorUpdateDescription": "Произошла ошибка во время операции сохранения", "ruleErrorUpdateDescription": "Произошла ошибка во время операции сохранения",
"rulesPriority": "Приоритет", "rulesPriority": "Приоритет",
"rulesReorderDragHandle": "Перетащите, чтобы изменить приоритет правила", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Действие", "rulesAction": "Действие",
"rulesMatchType": "Тип совпадения", "rulesMatchType": "Тип совпадения",
"value": "Значение", "value": "Значение",
@@ -810,7 +809,7 @@
"rulesResource": "Конфигурация правил ресурса", "rulesResource": "Конфигурация правил ресурса",
"rulesResourceDescription": "Настройка правил для контроля доступа к ресурсу", "rulesResourceDescription": "Настройка правил для контроля доступа к ресурсу",
"ruleSubmit": "Добавить правило", "ruleSubmit": "Добавить правило",
"rulesNoOne": "Пока нет правил.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Правила оцениваются по приоритету в возрастающем порядке.", "rulesOrder": "Правила оцениваются по приоритету в возрастающем порядке.",
"rulesSubmit": "Сохранить правила", "rulesSubmit": "Сохранить правила",
"policyErrorCreate": "Ошибка создания политики", "policyErrorCreate": "Ошибка создания политики",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Произошла неожиданная ошибка", "policyErrorUpdateMessageDescription": "Произошла неожиданная ошибка",
"policyCreatedSuccess": "Политика ресурса успешно создана", "policyCreatedSuccess": "Политика ресурса успешно создана",
"policyUpdatedSuccess": "Политика ресурса успешно обновлена", "policyUpdatedSuccess": "Политика ресурса успешно обновлена",
"authMethodsSave": "Сохранить настройки", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Аутентификация", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Контроль, какие методы аутентификации требуются для доступа к этому ресурсу", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Несколько методов аутентификации активны", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Посетители могут аутентифицироваться, используя любой из активных методов ниже. Им не нужно выполнять все.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Активно", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Отключено", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "Платформа SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Требуется войти через поставщика удостоверений вашей организации", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} пользователей, {roles} ролей", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Поставщик по умолчанию", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Добавить поставщика удостоверений по умолчанию", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Другие методы", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Дополнительные методы, которые посетители могут использовать вместо или вместе с платформой SSO", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Пароль", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Требуется общий буквенно-цифровой пароль для доступа к ресурсу", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Пароль установлен", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "ПИН-код", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Краткий числовой код, необходимый для доступа к ресурсу", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "Установлен 6-значный PIN-код", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "Белый список email", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Разрешить перечисленные email-адреса с одноразовыми паролями", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "Разрешено адресов: {count}", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "Включение белого списка email отправляет одноразовый пароль на email посетителя при входе.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Базовая аутентификация заголовка", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Проверка пользовательского имени и значения HTTP-заголовка для каждого запроса", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Заголовок настроен", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Имя заголовка", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Ожидаемое значение", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Установить пароль", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "Установить ПИН-код", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "Установить белый список email", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Установить базовую аутентификацию заголовка", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Правила доступа", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "При включении правила оцениваются в порядке убывания до тех пор, пока одно из них не оценивается как истинное.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Правила оцениваются сверху вниз. Первое совпадающее правило определяет результат.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Правила сопоставляют запросы по пути, IP-адресу, местоположению или другим критериям. Каждое правило применяет действие: обойти аутентификацию, заблокировать доступ или передать для аутентификации. Если правило не подписано, трафик продолжается для аутентификации.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Когда правила отключены, весь трафик проходит для аутентификации.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Когда правило не совпадает, трафик проходит для аутентификации.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Произошла ошибка при обновлении ресурса", "resourcesErrorUpdateDescription": "Произошла ошибка при обновлении ресурса",
"access": "Доступ", "access": "Доступ",
"accessControl": "Контроль доступа", "accessControl": "Контроль доступа",
"shareLink": "Общая ссылка {resource}", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Выберите ресурс", "resourceSelect": "Выберите ресурс",
"shareLinks": "Общие ссылки", "shareLinks": "Shareable Links",
"share": "Общие ссылки", "share": "Общие ссылки",
"shareDescription2": "Создавайте общие ссылки на ресурсы. Ссылки обеспечивают временный или неограниченный доступ к вашему ресурсу. Вы можете настроить продолжительность действия ссылки при ее создании.", "shareDescription2": "Создавайте общие ссылки на ресурсы. Ссылки обеспечивают временный или неограниченный доступ к вашему ресурсу. Вы можете настроить продолжительность действия ссылки при ее создании.",
"shareEasyCreate": "Легко создавать и делиться", "shareEasyCreate": "Легко создавать и делиться",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Администраторы всегда имеют доступ к этому ресурсу.", "resourceRoleDescription": "Администраторы всегда имеют доступ к этому ресурсу.",
"resourcePolicySelectTitle": "Политика доступа к ресурсам", "resourcePolicySelectTitle": "Политика доступа к ресурсам",
"resourcePolicySelectDescription": "Выберите тип политики ресурса для аутентификации", "resourcePolicySelectDescription": "Выберите тип политики ресурса для аутентификации",
"resourcePolicyTypeLabel": "Тип политики", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Политика ресурса", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Политика ресурса на месте", "resourcePolicyInline": "Политика ресурса на месте",
"resourcePolicyInlineDescription": "Политика доступа ограничена только этим ресурсом", "resourcePolicyInlineDescription": "Политика доступа ограничена только этим ресурсом",
"resourcePolicyShared": "Общая политика ресурса", "resourcePolicyShared": "Общая политика ресурса",
"resourcePolicySharedDescription": "Этот ресурс использует общую политику.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Общая политика", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "У этого ресурса есть своя политика.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "У этого ресурса есть собственные средства управления аутентификацией и правилами доступа.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Этот ресурс наследует от <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Этот ресурс использует общую политику. Некоторые настройки аутентификации можно изменить в этом ресурсе, чтобы добавить их в политику. Чтобы изменить основную политику, отредактируйте <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Этот ресурс использует общую политику. Некоторые правила доступа могут быть отредактированы для этого ресурса. Чтобы изменить основную политику, вы должны отредактировать <policyLink>{policyName}</policyLink>.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Контроль доступа", "resourceUsersRoles": "Контроль доступа",
"resourceUsersRolesDescription": "Выберите пользователей и роли с доступом к этому ресурсу", "resourceUsersRolesDescription": "Выберите пользователей и роли с доступом к этому ресурсу",
"resourceUsersRolesSubmit": "Сохранить контроль доступа", "resourceUsersRolesSubmit": "Сохранить контроль доступа",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Видимость", "resourceVisibilityTitle": "Видимость",
"resourceVisibilityTitleDescription": "Включите или отключите видимость ресурса", "resourceVisibilityTitleDescription": "Включите или отключите видимость ресурса",
"resourceGeneral": "Общие настройки", "resourceGeneral": "Общие настройки",
"resourceGeneralDescription": "Настройте имя, адрес и политику доступа для этого ресурса.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Детали ресурса", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Установите отображаемое имя, идентификатор и публично доступный домен для этого ресурса.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Установите отображаемое имя, идентификатор и публичный порт для этого ресурса.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Публичный адрес", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Настройте, как пользователи будут получать доступ к этому ресурсу.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Аутентификация и доступ", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Выберите, будет ли этот ресурс использовать собственную политику или наследовать от общей политики.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Ресурс активен", "resourceEnable": "Ресурс активен",
"resourceTransfer": "Перенести ресурс", "resourceTransfer": "Перенести ресурс",
"resourceTransferDescription": "Перенесите этот ресурс на другой сайт", "resourceTransferDescription": "Перенесите этот ресурс на другой сайт",
@@ -1294,14 +1293,14 @@
"addLabels": "Добавить метки", "addLabels": "Добавить метки",
"siteLabelsTab": "Метки", "siteLabelsTab": "Метки",
"siteLabelsDescription": "Управляйте метками, связанными с этим сайтом.", "siteLabelsDescription": "Управляйте метками, связанными с этим сайтом.",
"labelsNotFound": "Метки не найдены.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Начните печатать выше, чтобы создать метку.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Поиск меток", "labelSearch": "Поиск меток",
"labelSearchOrCreate": "Найти или создать метку", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# метка} few {# метки} many {# меток} other {# меток}}", "accessLabelFilterCount": "{count, plural, one {# метка} few {# метки} many {# меток} other {# меток}}",
"labelOverflowCount": "+{count, plural, one {# метка} few {# метки} many {# меток} other {# меток}}", "labelOverflowCount": "+{count, plural, one {# метка} few {# метки} many {# меток} other {# меток}}",
"accessLabelFilterClear": "Очистить фильтры меток", "accessLabelFilterClear": "Очистить фильтры меток",
"accessFilterClear": "Очистить фильтры", "accessFilterClear": "Clear filters",
"selectColor": "Выберите цвет", "selectColor": "Выберите цвет",
"createNewLabel": "Создать новую метку организации \"{label}\"", "createNewLabel": "Создать новую метку организации \"{label}\"",
"inviteInvalidDescription": "Ссылка на приглашение недействительна.", "inviteInvalidDescription": "Ссылка на приглашение недействительна.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Ресурсы", "sidebarResources": "Ресурсы",
"sidebarProxyResources": "Публичный", "sidebarProxyResources": "Публичный",
"sidebarClientResources": "Приватный", "sidebarClientResources": "Приватный",
"sidebarPolicies": "Общие политики", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Публичные ресурсы", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Контроль доступа", "sidebarAccessControl": "Контроль доступа",
"sidebarLogsAndAnalytics": "Журналы и аналитика", "sidebarLogsAndAnalytics": "Журналы и аналитика",
"sidebarTeam": "Команда", "sidebarTeam": "Команда",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Админ", "sidebarAdmin": "Админ",
"sidebarInvitations": "Приглашения", "sidebarInvitations": "Приглашения",
"sidebarRoles": "Роли", "sidebarRoles": "Роли",
"sidebarShareableLinks": "Общие ссылки", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "API ключи", "sidebarApiKeys": "API ключи",
"sidebarProvisioning": "Подготовка", "sidebarProvisioning": "Подготовка",
"sidebarSettings": "Настройки", "sidebarSettings": "Настройки",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Ресурс {id}", "standaloneHcFilterResourceIdFallback": "Ресурс {id}",
"blueprints": "Чертежи", "blueprints": "Чертежи",
"blueprintsLog": "Журнал чертежей", "blueprintsLog": "Журнал чертежей",
"blueprintsDescription": "Просмотреть предыдущие приложения с чертежами и их результаты или применить новый чертеж", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Добавить чертёж", "blueprintAdd": "Добавить чертёж",
"blueprintGoBack": "Посмотреть все чертежи", "blueprintGoBack": "Посмотреть все чертежи",
"blueprintCreate": "Создать чертёж", "blueprintCreate": "Создать чертёж",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Включить чертёж Docker", "enableDockerSocket": "Включить чертёж Docker",
"enableDockerSocketDescription": "Включить сбор меток Docker Socket для чертежей. Путь сокета должен быть предоставлен подключателю сайта. Прочтите о том, как это работает, в <docsLink>документации</docsLink>.", "enableDockerSocketDescription": "Включить сбор меток Docker Socket для чертежей. Путь сокета должен быть предоставлен подключателю сайта. Прочтите о том, как это работает, в <docsLink>документации</docsLink>.",
"newtAutoUpdate": "Включить автообновление сайта", "newtAutoUpdate": "Включить автообновление сайта",
"newtAutoUpdateDescription": "При включении разъемы сайта автоматически загрузят последнюю версию и перезапустятся. Это можно переопределить на уровне каждого сайта.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Автообновление сайта", "siteAutoUpdate": "Автообновление сайта",
"siteAutoUpdateLabel": "Включить автообновление", "siteAutoUpdateLabel": "Включить автообновление",
"siteAutoUpdateDescription": "При включении разъем этого сайта автоматически скачает последнюю версию и перезапустится.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Значение по умолчанию для организации: {state}", "siteAutoUpdateOrgDefault": "Значение по умолчанию для организации: {state}",
"siteAutoUpdateOverriding": "Переопределение настройки организации", "siteAutoUpdateOverriding": "Переопределение настройки организации",
"siteAutoUpdateResetToOrg": "Сброс до значения по умолчанию для организации", "siteAutoUpdateResetToOrg": "Сброс до значения по умолчанию для организации",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Настройка аккаунта завершена! Добро пожаловать в Pangolin!", "accountSetupSuccess": "Настройка аккаунта завершена! Добро пожаловать в Pangolin!",
"documentation": "Документация", "documentation": "Документация",
"saveAllSettings": "Сохранить все настройки", "saveAllSettings": "Сохранить все настройки",
"saveResourceTargets": "Сохранить настройки", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Сохранить настройки", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Сохранить настройки", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Настройки обновлены", "settingsUpdated": "Настройки обновлены",
"settingsUpdatedDescription": "Настройки успешно обновлены", "settingsUpdatedDescription": "Настройки успешно обновлены",
"settingsErrorUpdate": "Не удалось обновить настройки", "settingsErrorUpdate": "Не удалось обновить настройки",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Неизвестно", "healthCheckUnknown": "Неизвестно",
"healthCheck": "Проверка здоровья", "healthCheck": "Проверка здоровья",
"configureHealthCheck": "Настроить проверку здоровья", "configureHealthCheck": "Настроить проверку здоровья",
"configureHealthCheckDescription": "Настройте мониторинг вашего ресурса, чтобы обеспечить его постоянную доступность", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Включить проверки здоровья", "enableHealthChecks": "Включить проверки здоровья",
"healthCheckDisabledStateDescription": "Когда отключен, сайт не будет выполнять проверки состояния и состояние будет считаться неизвестным.", "healthCheckDisabledStateDescription": "Когда отключен, сайт не будет выполнять проверки состояния и состояние будет считаться неизвестным.",
"enableHealthChecksDescription": "Мониторинг здоровья этой цели. При необходимости можно контролировать другую конечную точку.", "enableHealthChecksDescription": "Мониторинг здоровья этой цели. При необходимости можно контролировать другую конечную точку.",
"healthScheme": "Метод", "healthScheme": "Метод",
"healthSelectScheme": "Выберите метод", "healthSelectScheme": "Выберите метод",
"healthCheckPortInvalid": "Порт должен быть в диапазоне от 1 до 65535", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Путь", "healthCheckPath": "Путь",
"healthHostname": "IP / хост", "healthHostname": "IP / хост",
"healthPort": "Порт", "healthPort": "Порт",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Требовать подтверждения устройства", "requireDeviceApproval": "Требовать подтверждения устройства",
"requireDeviceApprovalDescription": "Пользователям с этой ролью нужны новые устройства, одобренные администратором, прежде чем они смогут подключаться и получать доступ к ресурсам.", "requireDeviceApprovalDescription": "Пользователям с этой ролью нужны новые устройства, одобренные администратором, прежде чем они смогут подключаться и получать доступ к ресурсам.",
"sshSettings": "Настройки SSH", "sshSettings": "Настройки SSH",
"sshAccess": "Доступ по SSH", "sshAccess": "SSH Access",
"rdpSettings": "Настройки RDP", "rdpSettings": "Настройки RDP",
"vncSettings": "Настройки VNC", "vncSettings": "Настройки VNC",
"sshServer": "SSH сервер", "sshServer": "SSH сервер",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Убедитесь, что целевой хост правильно настроен для запуска демона аутентификации перед завершением этой настройки, иначе предоставление не удастся.", "sshDaemonDisclaimer": "Убедитесь, что целевой хост правильно настроен для запуска демона аутентификации перед завершением этой настройки, иначе предоставление не удастся.",
"sshDaemonPort": "Порт демона", "sshDaemonPort": "Порт демона",
"sshServerDestination": "Пункт назначения сервера", "sshServerDestination": "Пункт назначения сервера",
"sshServerDestinationDescription": "Настройте адрес сервера SSH", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Пункт назначения", "destination": "Пункт назначения",
"destinationRequired": "Требуется указание пункта назначения.", "destinationRequired": "Destination is required.",
"domainRequired": "Требуется домен.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Требуется порт.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Недействительная конфигурация пути.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Недействительная конфигурация пути переписывания.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Выбор нескольких сайтов включает в себя устойчивую маршрутизацию и автоматический отказ для обеспечения высокой доступности.", "bgTargetMultiSiteDisclaimer": "Выбор нескольких сайтов включает в себя устойчивую маршрутизацию и автоматический отказ для обеспечения высокой доступности.",
"roleAllowSsh": "Разрешить SSH", "roleAllowSsh": "Разрешить SSH",
"roleAllowSshAllow": "Разрешить", "roleAllowSshAllow": "Разрешить",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "Пользователь может запускать только указанные команды с помощью sudo.", "sshSudoModeCommandsDescription": "Пользователь может запускать только указанные команды с помощью sudo.",
"sshSudo": "Разрешить sudo", "sshSudo": "Разрешить sudo",
"sshSudoCommands": "Sudo Команды", "sshSudoCommands": "Sudo Команды",
"sshSudoCommandsDescription": "Список команд, которые пользователь может запускать с sudo, разделенный запятыми, пробелами или новыми строками. Должны использоваться абсолютные пути.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Создать домашний каталог", "sshCreateHomeDir": "Создать домашний каталог",
"sshUnixGroups": "Unix группы", "sshUnixGroups": "Unix группы",
"sshUnixGroupsDescription": "Группы Unix, к которым пользователь добавляется на целевом хосте, разделяются запятыми, пробелами или новыми строками.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Введите значения или перетащите файл .txt или .csv", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Импорт из файла", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "Импортирую {fileName} в {fieldLabel}.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "Пропустить первую строку (заголовок)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Заменить существующее", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Добавить к существующему", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "Режим импорта", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Предпросмотр", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {Нет элементов для импорта} one {# элемент для импорта} few {# элемента для импорта} many {# элементов для импорта} other {# элементов для импорта}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} существующих + {imported} импортированных = {total} всего", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "Импортировать", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Неподдерживаемый тип файла", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Поддерживаются только файлы .txt и .csv.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Элементы в файле не найдены", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Файл не содержит элементов, которые можно импортировать.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Количество попыток повторного запроса", "retryAttempts": "Количество попыток повторного запроса",
"expectedResponseCodes": "Ожидаемые коды ответов", "expectedResponseCodes": "Ожидаемые коды ответов",
"expectedResponseCodesDescription": "HTTP-код состояния, указывающий на здоровое состояние. Если оставить пустым, 200-300 считается здоровым.", "expectedResponseCodesDescription": "HTTP-код состояния, указывающий на здоровое состояние. Если оставить пустым, 200-300 считается здоровым.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Включить Прокси Протокол", "enableProxyProtocol": "Включить Прокси Протокол",
"proxyProtocolInfo": "Сохранять IP-адреса клиента для backend'ов TCP", "proxyProtocolInfo": "Сохранять IP-адреса клиента для backend'ов TCP",
"proxyProtocolVersion": "Версия протокола прокси", "proxyProtocolVersion": "Версия протокола прокси",
"version1": "Версия 1 (рекомендуется)", "version1": "Version 1 (Recommended)",
"version2": "Версия 2", "version2": "Версия 2",
"version1Description": "Основано на тексте и широко поддерживается. Убедитесь, что транспорт сервера добавлен в динамическую конфигурацию.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "Бинарная и более эффективная, но менее совместимая. Убедитесь, что транспорт сервера добавлен в динамическую конфигурацию.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Предупреждение", "warning": "Предупреждение",
"proxyProtocolWarning": "Бэкэнд приложение должно быть настроено на принятие соединений прокси-протокола. Если ваш бэкэнд не поддерживает Прокси-протокол, то включение этой опции прервет все подключения, поэтому включите это только если вы знаете, что вы делаете. Обязательно настройте вашего бэкэнда на доверие заголовкам Proxy Protocol от Traefik.", "proxyProtocolWarning": "Бэкэнд приложение должно быть настроено на принятие соединений прокси-протокола. Если ваш бэкэнд не поддерживает Прокси-протокол, то включение этой опции прервет все подключения, поэтому включите это только если вы знаете, что вы делаете. Обязательно настройте вашего бэкэнда на доверие заголовкам Proxy Protocol от Traefik.",
"restarting": "Перезапуск...", "restarting": "Перезапуск...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Введите подтверждение", "enterConfirmation": "Введите подтверждение",
"blueprintViewDetails": "Подробности", "blueprintViewDetails": "Подробности",
"defaultIdentityProvider": "Поставщик удостоверений по умолчанию", "defaultIdentityProvider": "Поставщик удостоверений по умолчанию",
"defaultIdentityProviderDescription": "Пользователь будет автоматически перенаправлен к этому поставщику удостоверений для аутентификации.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Настройки сети", "editInternalResourceDialogNetworkSettings": "Настройки сети",
"editInternalResourceDialogAccessPolicy": "Политика доступа", "editInternalResourceDialogAccessPolicy": "Политика доступа",
"editInternalResourceDialogAddRoles": "Добавить роли", "editInternalResourceDialogAddRoles": "Добавить роли",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Тип режима обслуживания", "maintenanceModeType": "Тип режима обслуживания",
"showMaintenancePage": "Показать страницу обслуживания посетителям", "showMaintenancePage": "Показать страницу обслуживания посетителям",
"enableMaintenanceMode": "Включить режим обслуживания", "enableMaintenanceMode": "Включить режим обслуживания",
"enableMaintenanceModeDescription": "Когда включено, посетители увидят страницу обслуживания вместо вашего ресурса.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Автоматический", "automatic": "Автоматический",
"automaticModeDescription": "Показывать страницу обслуживания только когда все цели бэкэнда недоступны или неисправны. Ваш ресурс продолжит работать нормально, пока хотя бы одна цель здорова.", "automaticModeDescription": "Показывать страницу обслуживания только когда все цели бэкэнда недоступны или неисправны. Ваш ресурс продолжит работать нормально, пока хотя бы одна цель здорова.",
"forced": "Принудительно", "forced": "Принудительно",
@@ -3182,8 +3181,8 @@
"warning:": "Предупреждение:", "warning:": "Предупреждение:",
"forcedeModeWarning": "Весь трафик будет направлен на страницу обслуживания. Ваши бекэнд ресурсы не будут получать никакие запросы.", "forcedeModeWarning": "Весь трафик будет направлен на страницу обслуживания. Ваши бекэнд ресурсы не будут получать никакие запросы.",
"pageTitle": "Заголовок страницы", "pageTitle": "Заголовок страницы",
"maintenancePageContentSubsection": "Содержимое страницы", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Настройте содержимое, отображаемое на странице обслуживания", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "Основной заголовок, отображаемый на странице обслуживания", "pageTitleDescription": "Основной заголовок, отображаемый на странице обслуживания",
"maintenancePageMessage": "Сообщение об обслуживании", "maintenancePageMessage": "Сообщение об обслуживании",
"maintenancePageMessagePlaceholder": "Мы скоро вернемся! Наш сайт в настоящее время проходит плановое техническое обслуживание.", "maintenancePageMessagePlaceholder": "Мы скоро вернемся! Наш сайт в настоящее время проходит плановое техническое обслуживание.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Вы уверены, что хотите рассоединить этого поставщика удостоверений с этой организацией?", "idpUnassociateQuestion": "Вы уверены, что хотите рассоединить этого поставщика удостоверений с этой организацией?",
"idpUnassociateDescription": "Все пользователи, связанные с этим поставщиком удостоверений, будут удалены из этой организации, но поставщик удостоверений будет продолжать существовать для других связанных организаций.", "idpUnassociateDescription": "Все пользователи, связанные с этим поставщиком удостоверений, будут удалены из этой организации, но поставщик удостоверений будет продолжать существовать для других связанных организаций.",
"idpUnassociateConfirm": "Подтвердите рассоединение поставщика удостоверений", "idpUnassociateConfirm": "Подтвердите рассоединение поставщика удостоверений",
"idpConfirmDeleteAndRemoveMeFromOrg": "УДАЛИТЬ И ИЗВЛЕЧЬ МЕНЯ ИЗ ОРГАНИЗАЦИИ", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "РАЗОРВАТЬ СВЯЗЬ И УДАЛИТЬ МЕНЯ ИЗ ОРГАНИЗАЦИИ", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Это не может быть отменено для этой организации.", "idpUnassociateWarning": "Это не может быть отменено для этой организации.",
"idpUnassociatedDescription": "Поставщик удостоверений успешно рассоединен с этой организацией", "idpUnassociatedDescription": "Поставщик удостоверений успешно рассоединен с этой организацией",
"idpUnassociateMenu": "Рассоединить", "idpUnassociateMenu": "Рассоединить",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Подключение…", "sshConnecting": "Подключение…",
"sshInitializing": "Инициализация…", "sshInitializing": "Инициализация…",
"sshSignInTitle": "Вход в SSH", "sshSignInTitle": "Вход в SSH",
"sshSignInDescription": "Введите свои учетные данные SSH для подключения", "sshSignInDescription": "Введите свои учетные данные SSH",
"sshPasswordTab": "Пароль", "sshPasswordTab": "Пароль",
"sshPrivateKeyTab": "Закрытый ключ", "sshPrivateKeyTab": "Закрытый ключ",
"sshPrivateKeyField": "Закрытый ключ", "sshPrivateKeyField": "Закрытый ключ",
"sshPrivateKeyDisclaimer": "Ваш закрытый ключ не хранится и не виден для Pangolin. Вместо этого вы можете использовать краткосрочные сертификаты для бесшовной аутентификации с использованием вашей текущей идентификации Pangolin.", "sshPrivateKeyDisclaimer": "Ваш закрытый ключ не хранится и не виден для Pangolin. Вместо этого вы можете использовать краткосрочные сертификаты для бесшовной аутентификации с использованием вашей текущей идентификации Pangolin.",
"sshLearnMore": "Узнать больше", "sshLearnMore": "Узнать больше",
"sshPrivateKeyFile": "Файл закрытого ключа", "sshPrivateKeyFile": "Файл закрытого ключа",
"sshAuthenticate": "Подключиться", "sshAuthenticate": "Аутентификация",
"sshTerminate": "Завершить", "sshTerminate": "Завершить",
"sshPoweredBy": "Разработано", "sshPoweredBy": "Разработано",
"sshErrorNoTarget": "Цель не указана", "sshErrorNoTarget": "Цель не указана",
"sshErrorWebSocket": "Подключение WebSocket не удалось", "sshErrorWebSocket": "Подключение WebSocket не удалось",
"sshErrorAuthFailed": "Ошибка аутентификации", "sshErrorAuthFailed": "Ошибка аутентификации",
"sshErrorConnectionClosed": "Подключение закрыто до завершения аутентификации", "sshErrorConnectionClosed": "Подключение закрыто до завершения аутентификации",
"sitePangolinSshDescription": "Разрешить доступ по SSH к ресурсам на этом сайте. Это можно изменить позже.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Ресурс для этого домена не найден", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Нет цели", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Подключиться", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "Не удалось подписать ключ SSH для аутентификации через PAM push. Проверьте, вошли ли вы как пользователь?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Ошибка: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Соединение закрыто (код {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----НАЧАЛО ЛИЧНОГО КЛЮЧА OPENSSH-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Требуется личный ключ", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Введите пароль VNC для подключения", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Пароль (необязательно)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Отсутствует целевой ресурс", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "Не удалось загрузить noVNC", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Статус {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Вставить из буфера обмена", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Вход в удаленный рабочий стол", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Введите учетные данные Windows для подключения", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Загрузка модуля...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "Не удалось загрузить модуль RDP", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Не готово", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "Модуль RDP все еще инициализируется", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Загрузка {count} файлов с удалённого сервера…", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "Ошибка загрузки: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Загружено: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Доступная цель подключения отсутствует", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Ошибка соединения", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Подгонка", "rdpFit": "Fit",
"rdpFull": "Полный", "rdpFull": "Full",
"rdpReal": "Настоящий", "rdpReal": "Real",
"rdpMeta": "Метаданные", "rdpMeta": "Meta",
"rdpUploadFiles": "Загрузить файлы", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Файлы готовы к вставке", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count, plural, one {# файл скопирован в удалённый буфер обмена — нажмите Ctrl+V на удалённом рабочем столе, чтобы вставить.} few {# файла скопированы в удалённый буфер обмена — нажмите Ctrl+V на удалённом рабочем столе, чтобы вставить.} many {# файлов скопированы в удалённый буфер обмена — нажмите Ctrl+V на удалённом рабочем столе, чтобы вставить.} other {# файла скопированы в удалённый буфер обмена — нажмите Ctrl+V на удалённом рабочем столе, чтобы вставить.}}", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Ошибка загрузки", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Режим клавиатуры Unicode", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Показать панель инструментов", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Скрыть панель инструментов" "sessionToolbarHide": "Hide toolbar"
} }
+184 -185
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "Özel Kaynakları Görüntüle", "sitesTableViewPrivateResources": "Özel Kaynakları Görüntüle",
"siteInstallNewt": "Newt Yükle", "siteInstallNewt": "Newt Yükle",
"siteInstallNewtDescription": "Newt'i sisteminizde çalıştırma", "siteInstallNewtDescription": "Newt'i sisteminizde çalıştırma",
"siteInstallKubernetesDocsDescription": "Daha fazla ve güncel Kubernetes kurulum bilgileri için <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink> adresini inceleyin.", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "Advantech modem kurulum talimatları için <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink> adresini inceleyin.", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "WireGuard Yapılandırması", "WgConfiguration": "WireGuard Yapılandırması",
"WgConfigurationDescription": "Ağınıza bağlanmak için aşağıdaki yapılandırmayı kullanın", "WgConfigurationDescription": "Ağınıza bağlanmak için aşağıdaki yapılandırmayı kullanın",
"operatingSystem": "İşletim Sistemi", "operatingSystem": "İşletim Sistemi",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "Yalnızca bir kez görebileceksiniz. Güvenli bir yere kopyaladığınızdan emin olun.", "siteCredentialsSaveDescription": "Yalnızca bir kez görebileceksiniz. Güvenli bir yere kopyaladığınızdan emin olun.",
"siteInfo": "Site Bilgilendirmesi", "siteInfo": "Site Bilgilendirmesi",
"status": "Durum", "status": "Durum",
"shareTitle": "Paylaşılabilir Bağlantıları Yönet", "shareTitle": "Manage Shareable Links",
"shareDescription": "Kaynaklarınıza geçici veya kalıcı erişim sağlamak için paylaşılabilir bağlantılar oluşturun", "shareDescription": "Kaynaklarınıza geçici veya kalıcı erişim sağlamak için paylaşılabilir bağlantılar oluşturun",
"shareSearch": "Paylaşılabilir bağlantıları ara...", "shareSearch": "Search shareable links...",
"shareCreate": "Paylaşılabilir Bağlantı Oluştur", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "Bağlantı silinirken hata oluştu", "shareErrorDelete": "Bağlantı silinirken hata oluştu",
"shareErrorDeleteMessage": "Bağlantı silinirken bir hata oluştu", "shareErrorDeleteMessage": "Bağlantı silinirken bir hata oluştu",
"shareDeleted": "Bağlantı silindi", "shareDeleted": "Bağlantı silindi",
"shareDeletedDescription": "Bağlantı silindi", "shareDeletedDescription": "Bağlantı silindi",
"shareDelete": "Paylaşılabilir Bağlantıyı Sil", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "Paylaşılabilir Bağlantıyı Silmeyi Onayla", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "Bu paylaşım bağlantısını silmek istediğinizden emin misiniz?", "shareQuestionRemove": "Bu paylaşım bağlantısını silmek istediğinizden emin misiniz?",
"shareMessageRemove": "Silindikten sonra, bağlantı artık çalışmayacak ve kullanan herkes kaynağa erişimini kaybedecek.", "shareMessageRemove": "Silindikten sonra, bağlantı artık çalışmayacak ve kullanan herkes kaynağa erişimini kaybedecek.",
"shareTokenDescription": "Erişim jetonunuz iki şekilde iletilebilir: sorgu parametresi olarak veya istek başlıklarında. Kimlik doğrulanmış erişim için her istekten müşteri tarafından iletilmelidir.", "shareTokenDescription": "Erişim jetonunuz iki şekilde iletilebilir: sorgu parametresi olarak veya istek başlıklarında. Kimlik doğrulanmış erişim için her istekten müşteri tarafından iletilmelidir.",
@@ -179,7 +179,7 @@
"shareCreateDescription": "Bu bağlantıya sahip olan herkes kaynağa erişebilir", "shareCreateDescription": "Bu bağlantıya sahip olan herkes kaynağa erişebilir",
"shareTitleOptional": "Başlık (isteğe bağlı)", "shareTitleOptional": "Başlık (isteğe bağlı)",
"sharePathOptional": "Yol (isteğe bağlı)", "sharePathOptional": "Yol (isteğe bağlı)",
"sharePathDescription": "Bağlantıdan sonra kullanıcıları bu yola yönlendirecek bağlantıyı tanımlayın.", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "Süresi Dolacak", "expireIn": "Süresi Dolacak",
"neverExpire": "Hiçbir Zaman Sona Ermez", "neverExpire": "Hiçbir Zaman Sona Ermez",
"shareExpireDescription": "Son kullanma süresi, bağlantının kullanılabilir ve kaynağa erişim sağlayacak süresidir. Bu süreden sonra bağlantı çalışmayı durduracak ve bu bağlantıyı kullanan kullanıcılar kaynağa erişimini kaybedecektir.", "shareExpireDescription": "Son kullanma süresi, bağlantının kullanılabilir ve kaynağa erişim sağlayacak süresidir. Bu süreden sonra bağlantı çalışmayı durduracak ve bu bağlantıyı kullanan kullanıcılar kaynağa erişimini kaybedecektir.",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "Lütfen bir kaynak seçin", "shareErrorSelectResource": "Lütfen bir kaynak seçin",
"proxyResourceTitle": "Herkese Açık Kaynakları Yönet", "proxyResourceTitle": "Herkese Açık Kaynakları Yönet",
"proxyResourceDescription": "Bir web tarayıcısı aracılığıyla kamuya açık kaynaklar oluşturun ve yönetin", "proxyResourceDescription": "Bir web tarayıcısı aracılığıyla kamuya açık kaynaklar oluşturun ve yönetin",
"publicResourcesBannerTitle": "Web tabanlı Açık Erişim", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "Genel kaynaklar, web tarayıcısı aracılığıyla internette herkesin erişebileceği HTTPS veya TCP/UDP proxy'leridir. Özel kaynakların aksine istemci tarafı yazılım gerektirmezler ve kimlik ve bağlam farkındalığı erişim politikalarını içerebilirler.", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "Özel Kaynakları Yönet", "clientResourceTitle": "Özel Kaynakları Yönet",
"clientResourceDescription": "Sadece bağlı bir istemci aracılığıyla erişilebilen kaynakları oluşturun ve yönetin", "clientResourceDescription": "Sadece bağlı bir istemci aracılığıyla erişilebilen kaynakları oluşturun ve yönetin",
"privateResourcesBannerTitle": "Sıfır Güven Özel Erişim", "privateResourcesBannerTitle": "Sıfır Güven Özel Erişim",
@@ -212,19 +212,18 @@
"resourcesSearch": "Kaynakları ara...", "resourcesSearch": "Kaynakları ara...",
"resourceAdd": "Kaynak Ekle", "resourceAdd": "Kaynak Ekle",
"resourceErrorDelte": "Kaynak silinirken hata", "resourceErrorDelte": "Kaynak silinirken hata",
"resourcePoliciesBannerTitle": "Kimlik Doğrulama ve Erişim Kurallarını Yeniden Kullan", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "Paylaşılan kaynak politikaları, kimlik doğrulama yöntemlerini ve erişim kurallarını bir kez tanımlamanıza ve ardından bunları birden fazla genel kaynağa bağlamanıza olanak tanır. Bir politikayı güncellediğinizde, bağlı her kaynak değişikliği otomatik olarak devralır.", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "Daha fazla bilgi", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "Herkese Açık Kaynak Politikalarını Yönetin", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "Kaynaklar",
"resourcePoliciesAttachedResources": "{count} kaynak", "resourcePoliciesAttachedResources": "{count} kaynak",
"resourcePoliciesAttachedResourcesCount": "{count, plural, one {# kaynak} other {# kaynaklar}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "hiçbir kaynak", "resourcePoliciesAttachedResourcesEmpty": "hiçbir kaynak",
"resourcePoliciesDescription": "Genel kaynaklarınıza erişimi kontrol etmek için kimlik doğrulama politikalarını oluşturun ve yönetin", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "Politikaları ara...", "resourcePoliciesSearch": "Politikaları ara...",
"resourcePoliciesAdd": "Politika Ekle", "resourcePoliciesAdd": "Politika Ekle",
"resourcePoliciesDefaultBadgeText": "Varsayılan politika", "resourcePoliciesDefaultBadgeText": "Varsayılan politika",
"resourcePoliciesCreate": "Genel Kaynak Politikası Oluştur", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "Yeni bir politika oluşturmak için aşağıdaki adımları izleyin", "resourcePoliciesCreateDescription": "Yeni bir politika oluşturmak için aşağıdaki adımları izleyin",
"resourcePolicyName": "Politika Adı", "resourcePolicyName": "Politika Adı",
"resourcePolicyNameDescription": "Bu politikaya kaynaklarınız arasında kolayca tanımlayabilmek için bir ad verin", "resourcePolicyNameDescription": "Bu politikaya kaynaklarınız arasında kolayca tanımlayabilmek için bir ad verin",
@@ -281,7 +280,7 @@
"back": "Geri", "back": "Geri",
"cancel": "İptal", "cancel": "İptal",
"resourceConfig": "Yapılandırma Parçaları", "resourceConfig": "Yapılandırma Parçaları",
"resourceConfigDescription": "TCP/UDP kaynağınızı kurmak için bu yapılandırma parçalarını kopyalayıp yapıştırın.", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: Başlangıç Noktaları Ekleyin", "resourceAddEntrypoints": "Traefik: Başlangıç Noktaları Ekleyin",
"resourceExposePorts": "Gerbil: Docker Compose'da Portları Açın", "resourceExposePorts": "Gerbil: Docker Compose'da Portları Açın",
"resourceLearnRaw": "TCP/UDP kaynaklarını nasıl yapılandıracağınızı öğrenin", "resourceLearnRaw": "TCP/UDP kaynaklarını nasıl yapılandıracağınızı öğrenin",
@@ -294,8 +293,8 @@
"labelDelete": "Etiketi Sil", "labelDelete": "Etiketi Sil",
"labelAdd": "Etiket Ekle", "labelAdd": "Etiket Ekle",
"labelCreateSuccessMessage": "Etiket Başarıyla Oluşturuldu", "labelCreateSuccessMessage": "Etiket Başarıyla Oluşturuldu",
"labelDuplicateError": "Yinelenen Etiket", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "Bu isimle bir etiket zaten var.", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "Etiket Başarıyla Değiştirildi", "labelEditSuccessMessage": "Etiket Başarıyla Değiştirildi",
"labelNameField": "Etiket Adı", "labelNameField": "Etiket Adı",
"labelColorField": "Etiket Rengi", "labelColorField": "Etiket Rengi",
@@ -320,7 +319,7 @@
"rules": "Kurallar", "rules": "Kurallar",
"resourceSettingDescription": "Kaynağınızdaki ayarları yapılandırın", "resourceSettingDescription": "Kaynağınızdaki ayarları yapılandırın",
"resourceSetting": "{resourceName} Ayarları", "resourceSetting": "{resourceName} Ayarları",
"resourcePolicySettingDescription": "Bu açık kaynak politikasının ayarlarını yapılandırın", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "{policyName} Ayarları", "resourcePolicySetting": "{policyName} Ayarları",
"alwaysAllow": "Kimlik Doğrulamayı Atla", "alwaysAllow": "Kimlik Doğrulamayı Atla",
"alwaysDeny": "Erişimi Engelle", "alwaysDeny": "Erişimi Engelle",
@@ -728,7 +727,7 @@
"targetSubmit": "Hedef Ekle", "targetSubmit": "Hedef Ekle",
"targetNoOne": "Bu kaynağın hedefleri yok. Arka uca gönderilecek istekleri yapılandırmak için bir hedef ekleyin.", "targetNoOne": "Bu kaynağın hedefleri yok. Arka uca gönderilecek istekleri yapılandırmak için bir hedef ekleyin.",
"targetNoOneDescription": "Yukarıdaki birden fazla hedef ekleyerek yük dengeleme etkinleştirilecektir.", "targetNoOneDescription": "Yukarıdaki birden fazla hedef ekleyerek yük dengeleme etkinleştirilecektir.",
"targetsSubmit": "Ayarları Kaydet", "targetsSubmit": "Save Settings",
"addTarget": "Hedef Ekle", "addTarget": "Hedef Ekle",
"proxyMultiSiteRoundRobinNodeHelp": "Round robin yönlendirme, aynı düğüme bağlı olmayan siteler arasında çalışmayacaktır, ancak failover çalışacaktır.", "proxyMultiSiteRoundRobinNodeHelp": "Round robin yönlendirme, aynı düğüme bağlı olmayan siteler arasında çalışmayacaktır, ancak failover çalışacaktır.",
"targetErrorInvalidIp": "Geçersiz IP adresi", "targetErrorInvalidIp": "Geçersiz IP adresi",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "Yinelenen kural", "rulesErrorDuplicate": "Yinelenen kural",
"rulesErrorDuplicateDescription": "Bu ayarlara sahip bir kural zaten mevcut", "rulesErrorDuplicateDescription": "Bu ayarlara sahip bir kural zaten mevcut",
"rulesErrorInvalidIpAddressRange": "Geçersiz CIDR", "rulesErrorInvalidIpAddressRange": "Geçersiz CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "Geçerli bir CIDR aralığı girin (örneğin, 10.0.0.0/8).", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "Geçersiz yol", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "Geçerli bir URL yolu veya deseni girin (örneğin, /api/*).", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "Geçersiz IP adresi", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "Geçerli bir IPv4 veya IPv6 adresi girin.", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "Kurallar güncellenemedi", "rulesErrorUpdate": "Kurallar güncellenemedi",
"rulesErrorUpdateDescription": "Kurallar güncellenirken bir hata oluştu", "rulesErrorUpdateDescription": "Kurallar güncellenirken bir hata oluştu",
"rulesUpdated": "Kuralları Etkinleştir", "rulesUpdated": "Kuralları Etkinleştir",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "CIDR formatında bir adres girin (örneğin, 103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "CIDR formatında bir adres girin (örneğin, 103.21.244.0/22)",
"rulesMatchIpAddress": "Bir IP adresi girin (örneğin, 103.21.244.12)", "rulesMatchIpAddress": "Bir IP adresi girin (örneğin, 103.21.244.12)",
"rulesMatchUrl": "Bir URL yolu veya deseni girin (örneğin, /api/v1/todos veya /api/v1/*)", "rulesMatchUrl": "Bir URL yolu veya deseni girin (örneğin, /api/v1/todos veya /api/v1/*)",
"rulesErrorInvalidPriority": "Geçersiz öncelik", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "1 veya daha büyük bir tamsayı girin.", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "Yinelenen öncelikler", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "Her kuralın benzersiz bir öncelik numarası olmalıdır.", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "Geçersiz kurallar", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "Kural {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "Geçerli bir eşleşme türünü seçin (yol, IP, CIDR, ülke, bölge veya ASN).", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "Bu kural için bir değer girin.", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "Geçersiz ülke", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "Geçerli bir ülke seçin.", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "Geçersiz ASN", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "Geçerli bir ASN girin (örneğin, AS15169).", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "Kurallar güncellendi", "ruleUpdated": "Kurallar güncellendi",
"ruleUpdatedDescription": "Kurallar başarıyla güncellendi", "ruleUpdatedDescription": "Kurallar başarıyla güncellendi",
"ruleErrorUpdate": "Operasyon başarısız oldu", "ruleErrorUpdate": "Operasyon başarısız oldu",
"ruleErrorUpdateDescription": "Kaydetme operasyonu sırasında bir hata oluştu", "ruleErrorUpdateDescription": "Kaydetme operasyonu sırasında bir hata oluştu",
"rulesPriority": "Öncelik", "rulesPriority": "Öncelik",
"rulesReorderDragHandle": "Kural önceliğini yeniden sıralamak için sürükleyin", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "Aksiyon", "rulesAction": "Aksiyon",
"rulesMatchType": "Eşleşme Türü", "rulesMatchType": "Eşleşme Türü",
"value": "Değer", "value": "Değer",
@@ -810,7 +809,7 @@
"rulesResource": "Kaynak Kuralları Yapılandırması", "rulesResource": "Kaynak Kuralları Yapılandırması",
"rulesResourceDescription": "Kaynağa erişimi kontrol etmek için kuralları yapılandırın", "rulesResourceDescription": "Kaynağa erişimi kontrol etmek için kuralları yapılandırın",
"ruleSubmit": "Kural Ekle", "ruleSubmit": "Kural Ekle",
"rulesNoOne": "Henüz kural yok.", "rulesNoOne": "No rules yet.",
"rulesOrder": "Kurallar, artan öncelik sırasına göre değerlendirilir.", "rulesOrder": "Kurallar, artan öncelik sırasına göre değerlendirilir.",
"rulesSubmit": "Kuralları Kaydet", "rulesSubmit": "Kuralları Kaydet",
"policyErrorCreate": "Politika oluşturulurken hata oluştu", "policyErrorCreate": "Politika oluşturulurken hata oluştu",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "Beklenmeyen bir hata oluştu", "policyErrorUpdateMessageDescription": "Beklenmeyen bir hata oluştu",
"policyCreatedSuccess": "Kaynak politikası başarıyla oluşturuldu", "policyCreatedSuccess": "Kaynak politikası başarıyla oluşturuldu",
"policyUpdatedSuccess": "Kaynak politikası başarıyla güncellendi", "policyUpdatedSuccess": "Kaynak politikası başarıyla güncellendi",
"authMethodsSave": "Ayarları Kaydet", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "Kimlik Doğrulama", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "Bu kaynağa erişim için hangi kimlik doğrulama yöntemlerinin gerekli olduğuna karar verin", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "Birden fazla kimlik doğrulama yöntemi etkin", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "Ziyaretçiler aşağıdaki etkin yöntemlerden herhangi birini kullanarak kimlik doğrulaması yapabilirler. Hepsini tamamlamaları gerekmez.", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "Etkin", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "Kapalı", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "Platform SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "Organizasyonunuzun kimlik sağlayıcısı üzerinden oturum açmayı zorunlu kılın", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} kullanıcısı, {roles} rolü", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "Varsayılan sağlayıcı", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "Varsayılan Kimlik Sağlayıcı Ekle", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "Diğer Yöntemler", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "Ziyaretçilerin platform SSO yerine veya yanı sıra kullanabileceği isteğe bağlı yöntemler", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "Şifre", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "Kaynağa erişim için paylaşılan bir alfasayısal şifre gerektir", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "Şifre ayarlandı", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "PIN Kodu", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "Kaynağa erişim için kısa bir sayısal kod gereklidir", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "6 haneli PIN ayarlandı", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "E-posta Beyaz Listesi", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "Listelenen e-posta adreslerine tek kullanımlık parolalarla izin verin", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "{count} adres izinli", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "E-posta beyaz listesinin etkinleştirilmesiyle ziyaretçinin girişinde bir kereye mahsus parola e-postasına gönderilecektir.", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "Temel Başlık Kimlik Doğrulama", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "Her istekte özel bir HTTP başlık adını ve değerini doğrulayın", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "Başlık yapılandırıldı", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "Başlık adı", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "Beklenen değer", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "Şifreyi Ayarla", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "PIN Kodunu Ayarla", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "E-posta Beyaz Listesini Ayarla", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "Temel Başlık Kimlik Doğrulamasını Ayarla", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "Erişim Kuralları", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "Etkinleştirildiğinde, kurallar azalan sırayla değerlendirilecektir ve biri doğru olarak değerlendirildiğinde diğerine geçilecektir.", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "Kurallar yukarıdan aşağıya doğru değerlendirilir. İlk eşleşen kural sonucu belirler.", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "Kurallar, yol, IP adresi, konum veya başka kriterlere göre talepleri eşleştirir. Her kural bir eylem uygular: kimlik doğrulamayı atla, erişimi engelle veya kimlik doğrulaması için geçici olarak geç.", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "Kurallar devre dışı bırakıldığında, tüm trafik kimlik doğrulamasına geçer.", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "Herhangi bir kural eşleşmediğinde trafik kimlik doğrulamasına geçer.", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "Kaynak güncellenirken bir hata oluştu", "resourcesErrorUpdateDescription": "Kaynak güncellenirken bir hata oluştu",
"access": "Erişim", "access": "Erişim",
"accessControl": "Erişim Kontrolü", "accessControl": "Erişim Kontrolü",
"shareLink": "{resource} Paylaşılabilir Bağlantı", "shareLink": "{resource} Shareable Link",
"resourceSelect": "Kaynak seçin", "resourceSelect": "Kaynak seçin",
"shareLinks": "Paylaşılabilir Bağlantılar", "shareLinks": "Shareable Links",
"share": "Paylaşılabilir Bağlantılar", "share": "Paylaşılabilir Bağlantılar",
"shareDescription2": "Kaynaklarınıza geçici veya sınırsız erişim sağlamak için paylaşılabilir bağlantılar oluşturun. Bağlantı oluştururken sona erme süresini yapılandırabilirsiniz.", "shareDescription2": "Kaynaklarınıza geçici veya sınırsız erişim sağlamak için paylaşılabilir bağlantılar oluşturun. Bağlantı oluştururken sona erme süresini yapılandırabilirsiniz.",
"shareEasyCreate": "Kolayca oluştur ve paylaş", "shareEasyCreate": "Kolayca oluştur ve paylaş",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "Yöneticiler her zaman bu kaynağa erişebilir.", "resourceRoleDescription": "Yöneticiler her zaman bu kaynağa erişebilir.",
"resourcePolicySelectTitle": "Kaynak Erişim Politikası", "resourcePolicySelectTitle": "Kaynak Erişim Politikası",
"resourcePolicySelectDescription": "Kimlik doğrulama için kaynak politika türünü seçin", "resourcePolicySelectDescription": "Kimlik doğrulama için kaynak politika türünü seçin",
"resourcePolicyTypeLabel": "Politika türü", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "Kaynak politikası", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "Satır İçi Kaynak Politikası", "resourcePolicyInline": "Satır İçi Kaynak Politikası",
"resourcePolicyInlineDescription": "Erişim Politikası sadece bu kaynağa yönelik", "resourcePolicyInlineDescription": "Erişim Politikası sadece bu kaynağa yönelik",
"resourcePolicyShared": "Paylaşılan Kaynak Politikası", "resourcePolicyShared": "Paylaşılan Kaynak Politikası",
"resourcePolicySharedDescription": "Bu kaynak bir paylaşılan politika kullanıyor.", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "Paylaşılan Politika", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "Bu kaynağın kendi politikası var.", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "Bu kaynak, kendi kimlik doğrulama ve erişim kuralları denetimlerine sahiptir.", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "Bu kaynak <policyLink>{policyName}</policyLink>'dan devralmaktadır.", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "Bu kaynak bir ortak politika kullanıyor. Politikayı eklemek için kimlik doğrulama ayarlarını bu kaynakta düzenleyebilirsiniz. Altta yatan politikayı değiştirmek için <policyLink>{policyName}</policyLink> düzenlemelisiniz.", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "Bu kaynak bir paylaşılan politika kullanıyor. Bazı erişim kuralları bu kaynakta düzenlenebilir. Temel politikayı değiştirmek için, <policyLink>{policyName}</policyLink> düzenlemeniz gerekecektir.", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "Erişim Kontrolleri", "resourceUsersRoles": "Erişim Kontrolleri",
"resourceUsersRolesDescription": "Bu kaynağı kimlerin ziyaret edebileceği kullanıcıları ve rolleri yapılandırın", "resourceUsersRolesDescription": "Bu kaynağı kimlerin ziyaret edebileceği kullanıcıları ve rolleri yapılandırın",
"resourceUsersRolesSubmit": "Erişim Kontrollerini Kaydet", "resourceUsersRolesSubmit": "Erişim Kontrollerini Kaydet",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "Görünürlük", "resourceVisibilityTitle": "Görünürlük",
"resourceVisibilityTitleDescription": "Kaynak görünürlüğünü tamamen etkinleştirin veya devre dışı bırakın", "resourceVisibilityTitleDescription": "Kaynak görünürlüğünü tamamen etkinleştirin veya devre dışı bırakın",
"resourceGeneral": "Genel Ayarlar", "resourceGeneral": "Genel Ayarlar",
"resourceGeneralDescription": "Bu kaynak için ad, adres ve erişim politikası yapılandırın.", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "Kaynak Detayları", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "Bu kaynak için görüntülenen adı, tanıtıcıyı ve herkesin erişebileceği alan adını belirleyin.", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "Bu kaynak için görüntülenen adı, tanıtıcıyı ve halka açık portu ayarlayın.", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "Genel Adres", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "Kullanıcıların bu kaynağa nasıl ulaşacağını yapılandırın.", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "Kimlik Doğrulama ve Erişim", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "Bu kaynağın kendi politikasını mı yoksa ortak bir politikadan mı devralacağını seçin.", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "Kaynağı Etkinleştir", "resourceEnable": "Kaynağı Etkinleştir",
"resourceTransfer": "Kaynağı Aktar", "resourceTransfer": "Kaynağı Aktar",
"resourceTransferDescription": "Bu kaynağı farklı bir siteye aktarın", "resourceTransferDescription": "Bu kaynağı farklı bir siteye aktarın",
@@ -1294,14 +1293,14 @@
"addLabels": "Etiketler ekle", "addLabels": "Etiketler ekle",
"siteLabelsTab": "Etiketler", "siteLabelsTab": "Etiketler",
"siteLabelsDescription": "Bu siteyle ilişkili etiketleri yönetin.", "siteLabelsDescription": "Bu siteyle ilişkili etiketleri yönetin.",
"labelsNotFound": "Etiket bulunamadı.", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "Etiket oluşturmak için yukarıdan yazmaya başlayın.", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "Etiket ara", "labelSearch": "Etiket ara",
"labelSearchOrCreate": "Etiket arayın veya oluşturun", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, one {# etiket} other {# etiketler}}", "accessLabelFilterCount": "{count, plural, one {# etiket} other {# etiketler}}",
"labelOverflowCount": "+{count, plural, one {# etiket} other {# etiketler}}", "labelOverflowCount": "+{count, plural, one {# etiket} other {# etiketler}}",
"accessLabelFilterClear": "Etiket filtrelerini temizle", "accessLabelFilterClear": "Etiket filtrelerini temizle",
"accessFilterClear": "Filtreleri temizle", "accessFilterClear": "Clear filters",
"selectColor": "Renk seç", "selectColor": "Renk seç",
"createNewLabel": "Yeni kuruluş etiketi \"{label}\" oluştur", "createNewLabel": "Yeni kuruluş etiketi \"{label}\" oluştur",
"inviteInvalidDescription": "Davet bağlantısı geçersiz.", "inviteInvalidDescription": "Davet bağlantısı geçersiz.",
@@ -1538,8 +1537,8 @@
"sidebarResources": "Kaynaklar", "sidebarResources": "Kaynaklar",
"sidebarProxyResources": "Herkese Açık", "sidebarProxyResources": "Herkese Açık",
"sidebarClientResources": "Özel", "sidebarClientResources": "Özel",
"sidebarPolicies": "Paylaşılan Politikalar", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "Açık Kaynaklar", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "Erişim Kontrolü", "sidebarAccessControl": "Erişim Kontrolü",
"sidebarLogsAndAnalytics": "Kayıtlar & Analitik", "sidebarLogsAndAnalytics": "Kayıtlar & Analitik",
"sidebarTeam": "Ekip", "sidebarTeam": "Ekip",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "Yönetici", "sidebarAdmin": "Yönetici",
"sidebarInvitations": "Davetiye", "sidebarInvitations": "Davetiye",
"sidebarRoles": "Roller", "sidebarRoles": "Roller",
"sidebarShareableLinks": "Paylaşılabilir Bağlantılar", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "API Anahtarları", "sidebarApiKeys": "API Anahtarları",
"sidebarProvisioning": "Tedarik", "sidebarProvisioning": "Tedarik",
"sidebarSettings": "Ayarlar", "sidebarSettings": "Ayarlar",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "Kaynak {id}", "standaloneHcFilterResourceIdFallback": "Kaynak {id}",
"blueprints": "Planlar", "blueprints": "Planlar",
"blueprintsLog": "Şablonlar Günlüğü", "blueprintsLog": "Şablonlar Günlüğü",
"blueprintsDescription": "Geçmiş plan uygulamalarını ve sonuçlarını görüntüleyin veya yeni bir plan uygulayın", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "Plan Ekle", "blueprintAdd": "Plan Ekle",
"blueprintGoBack": "Tüm Planları Gör", "blueprintGoBack": "Tüm Planları Gör",
"blueprintCreate": "Plan Oluştur", "blueprintCreate": "Plan Oluştur",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "Docker Soketini Etkinleştir", "enableDockerSocket": "Docker Soketini Etkinleştir",
"enableDockerSocketDescription": "Plan etiketleri için Docker Socket etiket toplamasını etkinleştirin. Site bağlantısına soket yolu sağlanmalıdır. Bunun nasıl çalıştığını <docsLink>belgelemede</docsLink> okuyun.", "enableDockerSocketDescription": "Plan etiketleri için Docker Socket etiket toplamasını etkinleştirin. Site bağlantısına soket yolu sağlanmalıdır. Bunun nasıl çalıştığını <docsLink>belgelemede</docsLink> okuyun.",
"newtAutoUpdate": "Site Otomatik-Güncellemesini Etkinleştir", "newtAutoUpdate": "Site Otomatik-Güncellemesini Etkinleştir",
"newtAutoUpdateDescription": "Etkinleştirildiğinde, site konektörleri en son versiyonu otomatik olarak indirir ve yeniden başlar. Bu, site bazında geçersiz kılınabilir.", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "Site Otomatik-Güncellemesi", "siteAutoUpdate": "Site Otomatik-Güncellemesi",
"siteAutoUpdateLabel": "Otomatik Güncellemeyi Etkinleştir", "siteAutoUpdateLabel": "Otomatik Güncellemeyi Etkinleştir",
"siteAutoUpdateDescription": "Etkinleştirildiğinde, bu sitenin konektörü en son versiyonu otomatik olarak indirir ve kendini yeniden başlatır.", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "Kuruluş varsayılanı: {state}", "siteAutoUpdateOrgDefault": "Kuruluş varsayılanı: {state}",
"siteAutoUpdateOverriding": "Kuruluş ayarını geçersiz kılıyor", "siteAutoUpdateOverriding": "Kuruluş ayarını geçersiz kılıyor",
"siteAutoUpdateResetToOrg": "Kuruluş Varsayılanına Sıfırla", "siteAutoUpdateResetToOrg": "Kuruluş Varsayılanına Sıfırla",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "Hesap kurulumu tamamlandı! Pangolin'e hoş geldiniz!", "accountSetupSuccess": "Hesap kurulumu tamamlandı! Pangolin'e hoş geldiniz!",
"documentation": "Dokümantasyon", "documentation": "Dokümantasyon",
"saveAllSettings": "Tüm Ayarları Kaydet", "saveAllSettings": "Tüm Ayarları Kaydet",
"saveResourceTargets": "Ayarları Kaydet", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "Ayarları Kaydet", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "Ayarları Kaydet", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "Ayarlar güncellendi", "settingsUpdated": "Ayarlar güncellendi",
"settingsUpdatedDescription": "Ayarlar başarıyla güncellendi", "settingsUpdatedDescription": "Ayarlar başarıyla güncellendi",
"settingsErrorUpdate": "Ayarlar güncellenemedi", "settingsErrorUpdate": "Ayarlar güncellenemedi",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "Bilinmiyor", "healthCheckUnknown": "Bilinmiyor",
"healthCheck": "Sağlık Kontrolü", "healthCheck": "Sağlık Kontrolü",
"configureHealthCheck": "Sağlık Kontrolünü Yapılandır", "configureHealthCheck": "Sağlık Kontrolünü Yapılandır",
"configureHealthCheckDescription": "Kaynağınızın her zaman erişilebilir olduğundan emin olmak için izleme kurun", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "Sağlık Kontrollerini Etkinleştir", "enableHealthChecks": "Sağlık Kontrollerini Etkinleştir",
"healthCheckDisabledStateDescription": "Devre dışı bırakıldığında, site sağlık kontrolleri yapmaz ve durum bilinmeyen olarak kabul edilecektir.", "healthCheckDisabledStateDescription": "Devre dışı bırakıldığında, site sağlık kontrolleri yapmaz ve durum bilinmeyen olarak kabul edilecektir.",
"enableHealthChecksDescription": "Bu hedefin sağlığını izleyin. Gerekirse hedef dışındaki bir son noktayı izleyebilirsiniz.", "enableHealthChecksDescription": "Bu hedefin sağlığını izleyin. Gerekirse hedef dışındaki bir son noktayı izleyebilirsiniz.",
"healthScheme": "Yöntem", "healthScheme": "Yöntem",
"healthSelectScheme": "Yöntem Seç", "healthSelectScheme": "Yöntem Seç",
"healthCheckPortInvalid": "Bağlantı noktası 1 ile 65535 arasında olmalıdır", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "Yol", "healthCheckPath": "Yol",
"healthHostname": "IP / Hostname", "healthHostname": "IP / Hostname",
"healthPort": "Bağlantı Noktası", "healthPort": "Bağlantı Noktası",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "Cihaz Onaylarını Gerektir", "requireDeviceApproval": "Cihaz Onaylarını Gerektir",
"requireDeviceApprovalDescription": "Bu role sahip kullanıcıların yeni cihazlarının bağlanabilmesi ve kaynaklara erişebilmesi için bir yönetici tarafından onaylanması gerekiyor.", "requireDeviceApprovalDescription": "Bu role sahip kullanıcıların yeni cihazlarının bağlanabilmesi ve kaynaklara erişebilmesi için bir yönetici tarafından onaylanması gerekiyor.",
"sshSettings": "SSH Ayarları", "sshSettings": "SSH Ayarları",
"sshAccess": "SSH Erişimi", "sshAccess": "SSH Access",
"rdpSettings": "RDP Ayarları", "rdpSettings": "RDP Ayarları",
"vncSettings": "VNC Ayarları", "vncSettings": "VNC Ayarları",
"sshServer": "SSH Sunucusu", "sshServer": "SSH Sunucusu",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "Bu kurulumu tamamlamadan önce hedef ana bilgisayarınızın kimlik doğrulama daemonunu çalıştıracak şekilde düzgün yapılandırıldığından emin olun, aksi takdirde sağlama başarısız olur.", "sshDaemonDisclaimer": "Bu kurulumu tamamlamadan önce hedef ana bilgisayarınızın kimlik doğrulama daemonunu çalıştıracak şekilde düzgün yapılandırıldığından emin olun, aksi takdirde sağlama başarısız olur.",
"sshDaemonPort": "Daemon Bağlantı Noktası", "sshDaemonPort": "Daemon Bağlantı Noktası",
"sshServerDestination": "Sunucu Hedefi", "sshServerDestination": "Sunucu Hedefi",
"sshServerDestinationDescription": "SSH sunucusunun hedefini yapılandırın", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "Hedef", "destination": "Hedef",
"destinationRequired": "Hedef gereklidir.", "destinationRequired": "Destination is required.",
"domainRequired": "Alan adı gereklidir.", "domainRequired": "Domain is required.",
"proxyPortRequired": "Bağlantı noktası gereklidir.", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "Geçersiz yol yapılandırması.", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "Geçersiz yol yeniden yazma yapılandırması.", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "Birden fazla site seçmek, yüksek erişilebilirlik için dayanıklı yönlendirme ve failover sağlar.", "bgTargetMultiSiteDisclaimer": "Birden fazla site seçmek, yüksek erişilebilirlik için dayanıklı yönlendirme ve failover sağlar.",
"roleAllowSsh": "SSH'a İzin Ver", "roleAllowSsh": "SSH'a İzin Ver",
"roleAllowSshAllow": "İzin Ver", "roleAllowSshAllow": "İzin Ver",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "Kullanıcı sadece belirtilen komutları sudo ile çalıştırabilir.", "sshSudoModeCommandsDescription": "Kullanıcı sadece belirtilen komutları sudo ile çalıştırabilir.",
"sshSudo": "Sudo'ya izin ver", "sshSudo": "Sudo'ya izin ver",
"sshSudoCommands": "Sudo Komutları", "sshSudoCommands": "Sudo Komutları",
"sshSudoCommandsDescription": "Kullanıcının 'sudo' ile çalıştırmasına izin verilen komutlar listesi noktalı virgülle, boşluk veya yeni satırla ayrılmalıdır. Mutlak yollar kullanılmalıdır.", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "Ev Dizini Oluştur", "sshCreateHomeDir": "Ev Dizini Oluştur",
"sshUnixGroups": "Unix Grupları", "sshUnixGroups": "Unix Grupları",
"sshUnixGroupsDescription": "Hedef ana bilgisayardaki kullanıcıya eklemek için Unix grupları, noktalı virgülle, boşluk veya yeni satırla ayrılmalıdır.", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "Değerleri girin veya bir .txt veya .csv dosyası bırakın", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "Dosyadan İçe Aktar", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": "{fileName} dosyası {fieldLabel} alanına içe aktarılıyor.", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "İlk Satırı Atla (Başlık)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "Mevcut Olanın Yerine Yaz", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "Mevcut olana Ekle", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "İçe Aktarma Modu", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "Seçilen Dosya", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {İçe aktarılacak öğe yok} one {İçe aktarılacak 1 öğe} other {İçe aktarılacak # öğe}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} mevcut + {imported} ithal = {total} toplam", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "İçe Aktar", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "Desteklenmeyen dosya türü", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "Yalnızca .txt ve .csv dosyaları desteklenir.", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "Dosyada öğe bulunamadı", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "Dosya, içe aktarılabilir öğe içermiyor.", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "Tekrar Deneme Girişimleri", "retryAttempts": "Tekrar Deneme Girişimleri",
"expectedResponseCodes": "Beklenen Yanıt Kodları", "expectedResponseCodes": "Beklenen Yanıt Kodları",
"expectedResponseCodesDescription": "Sağlıklı durumu gösteren HTTP durum kodu. Boş bırakılırsa, 200-300 arası sağlıklı kabul edilir.", "expectedResponseCodesDescription": "Sağlıklı durumu gösteren HTTP durum kodu. Boş bırakılırsa, 200-300 arası sağlıklı kabul edilir.",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "Proxy Protokolünü Etkinleştir", "enableProxyProtocol": "Proxy Protokolünü Etkinleştir",
"proxyProtocolInfo": "TCP ara yüzlerini koruyarak istemci IP adreslerini saklayın", "proxyProtocolInfo": "TCP ara yüzlerini koruyarak istemci IP adreslerini saklayın",
"proxyProtocolVersion": "Proxy Protokol Versiyonu", "proxyProtocolVersion": "Proxy Protokol Versiyonu",
"version1": "Versiyon 1 (Önerilen)", "version1": "Version 1 (Recommended)",
"version2": "Versiyon 2", "version2": "Versiyon 2",
"version1Description": "Metin tabanlı ve yaygın olarak desteklenmektedir. Sunucu taşımacılığının dinamik yapılandırmaya eklenmiş olduğundan emin olun.", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "İkili ve daha verimli ama daha az uyumlu. Sunucu taşımasının dinamik yapılandırmaya eklendiğinden emin olun.", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "Uyarı", "warning": "Uyarı",
"proxyProtocolWarning": "Arka uç uygulamanız, Proxy Protokol bağlantılarını kabul etmek üzere yapılandırılmalıdır. Arka ucunuz Proxy Protokolünü desteklemiyorsa, bunu etkinleştirmek tüm bağlantıları koparır. Traefik'ten gelen Proxy Protokol başlıklarına güvenecek şekilde arka ucunuzu yapılandırdığınızdan emin olun.", "proxyProtocolWarning": "Arka uç uygulamanız, Proxy Protokol bağlantılarını kabul etmek üzere yapılandırılmalıdır. Arka ucunuz Proxy Protokolünü desteklemiyorsa, bunu etkinleştirmek tüm bağlantıları koparır. Traefik'ten gelen Proxy Protokol başlıklarına güvenecek şekilde arka ucunuzu yapılandırdığınızdan emin olun.",
"restarting": "Yeniden Başlatılıyor...", "restarting": "Yeniden Başlatılıyor...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "Onayı girin", "enterConfirmation": "Onayı girin",
"blueprintViewDetails": "Detaylar", "blueprintViewDetails": "Detaylar",
"defaultIdentityProvider": "Varsayılan Kimlik Sağlayıcı", "defaultIdentityProvider": "Varsayılan Kimlik Sağlayıcı",
"defaultIdentityProviderDescription": "Kullanıcı, kimlik doğrulama için bu kimlik sağlayıcısına otomatik olarak yönlendirilecektir.", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "Ağ Ayarları", "editInternalResourceDialogNetworkSettings": "Ağ Ayarları",
"editInternalResourceDialogAccessPolicy": "Erişim Politikası", "editInternalResourceDialogAccessPolicy": "Erişim Politikası",
"editInternalResourceDialogAddRoles": "Roller Ekle", "editInternalResourceDialogAddRoles": "Roller Ekle",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "Bakım Modu Türü", "maintenanceModeType": "Bakım Modu Türü",
"showMaintenancePage": "Ziyaretçilere bir bakım sayfası gösterin", "showMaintenancePage": "Ziyaretçilere bir bakım sayfası gösterin",
"enableMaintenanceMode": "Bakım Modunu Etkinleştir", "enableMaintenanceMode": "Bakım Modunu Etkinleştir",
"enableMaintenanceModeDescription": "Etkinleştirildiğinde, ziyaretçiler kaynak yerine bir bakım sayfası görecekler.", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "Otomatik", "automatic": "Otomatik",
"automaticModeDescription": "Tüm arka uç hedefleri kapalı veya sağlıksız olduğunda yalnızca bakım sayfasını gösterin. Sağlıklı en az bir hedef olduğu sürece kaynağınız normal şekilde çalışmaya devam eder.", "automaticModeDescription": "Tüm arka uç hedefleri kapalı veya sağlıksız olduğunda yalnızca bakım sayfasını gösterin. Sağlıklı en az bir hedef olduğu sürece kaynağınız normal şekilde çalışmaya devam eder.",
"forced": "Zorunlu", "forced": "Zorunlu",
@@ -3182,8 +3181,8 @@
"warning:": "Uyarı:", "warning:": "Uyarı:",
"forcedeModeWarning": "Tüm trafik bakım sayfasına yönlendirilecek. Arka plan kaynaklarınız herhangi bir isteği almayacaktır.", "forcedeModeWarning": "Tüm trafik bakım sayfasına yönlendirilecek. Arka plan kaynaklarınız herhangi bir isteği almayacaktır.",
"pageTitle": "Sayfa Başlığı", "pageTitle": "Sayfa Başlığı",
"maintenancePageContentSubsection": "Sayfa İçeriği", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "Bakım sayfasında gösterilen içeriği özelleştirin", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "Bakım sayfasında gösterilen ana başlık", "pageTitleDescription": "Bakım sayfasında gösterilen ana başlık",
"maintenancePageMessage": "Bakım Mesajı", "maintenancePageMessage": "Bakım Mesajı",
"maintenancePageMessagePlaceholder": "Yakında geri döneceğiz! Sitemiz şu anda planlı bakım altındadır.", "maintenancePageMessagePlaceholder": "Yakında geri döneceğiz! Sitemiz şu anda planlı bakım altındadır.",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "Bu kimlik sağlayıcının bu kuruluştan ilişiğini kesmek istediğinizden emin misiniz?", "idpUnassociateQuestion": "Bu kimlik sağlayıcının bu kuruluştan ilişiğini kesmek istediğinizden emin misiniz?",
"idpUnassociateDescription": "Bu kimlik sağlayıcı ile ilişkilendirilen tüm kullanıcılar bu kuruluştan kaldırılacaktır, ancak kimlik sağlayıcı diğer ilişkilendirilen kuruluşlar için var olmaya devam edecektir.", "idpUnassociateDescription": "Bu kimlik sağlayıcı ile ilişkilendirilen tüm kullanıcılar bu kuruluştan kaldırılacaktır, ancak kimlik sağlayıcı diğer ilişkilendirilen kuruluşlar için var olmaya devam edecektir.",
"idpUnassociateConfirm": "Kimlik Sağlayıcının İlişkisinin Kesilmesini Onayla", "idpUnassociateConfirm": "Kimlik Sağlayıcının İlişkisinin Kesilmesini Onayla",
"idpConfirmDeleteAndRemoveMeFromOrg": "BENİ SİL VE ORGANİZASYONDAN ÇIKAR", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "BENİ İLİŞKİLENDİRMEYİ BIRAK VE ORGANİZASYONDAN ÇIKAR", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "Bu işlem bu kuruluş için geri alınamaz.", "idpUnassociateWarning": "Bu işlem bu kuruluş için geri alınamaz.",
"idpUnassociatedDescription": "Kimlik sağlayıcı bu kuruluştan başarıyla ayrıldı", "idpUnassociatedDescription": "Kimlik sağlayıcı bu kuruluştan başarıyla ayrıldı",
"idpUnassociateMenu": "İlişkiyi Kes", "idpUnassociateMenu": "İlişkiyi Kes",
@@ -3543,58 +3542,58 @@
"sshConnecting": "Bağlanılıyor…", "sshConnecting": "Bağlanılıyor…",
"sshInitializing": "Başlatılıyor…", "sshInitializing": "Başlatılıyor…",
"sshSignInTitle": "SSH'a Giriş Yap", "sshSignInTitle": "SSH'a Giriş Yap",
"sshSignInDescription": "Bağlanmak için SSH kimlik bilgilerinizi girin", "sshSignInDescription": "SSH kimlik bilgilerinizi girin",
"sshPasswordTab": "Şifre", "sshPasswordTab": "Şifre",
"sshPrivateKeyTab": "Özel Anahtar", "sshPrivateKeyTab": "Özel Anahtar",
"sshPrivateKeyField": "Özel Anahtar", "sshPrivateKeyField": "Özel Anahtar",
"sshPrivateKeyDisclaimer": "Özel anahtarınız Pangolin'de saklanmaz veya görünmez. Alternatif olarak, mevcut Pangolin kimliğinizle sorunsuz kimlik doğrulama için kısa ömürlü sertifikalar kullanabilirsiniz.", "sshPrivateKeyDisclaimer": "Özel anahtarınız Pangolin'de saklanmaz veya görünmez. Alternatif olarak, mevcut Pangolin kimliğinizle sorunsuz kimlik doğrulama için kısa ömürlü sertifikalar kullanabilirsiniz.",
"sshLearnMore": "Daha fazla bilgi", "sshLearnMore": "Daha fazla bilgi",
"sshPrivateKeyFile": "Özel Anahtar Dosyası", "sshPrivateKeyFile": "Özel Anahtar Dosyası",
"sshAuthenticate": "Bağlan", "sshAuthenticate": "Kimlik Doğrulama",
"sshTerminate": "Sonlandır", "sshTerminate": "Sonlandır",
"sshPoweredBy": "Tarafından sağlanmaktadır", "sshPoweredBy": "Tarafından sağlanmaktadır",
"sshErrorNoTarget": "Belirtilen hedef yok", "sshErrorNoTarget": "Belirtilen hedef yok",
"sshErrorWebSocket": "WebSocket bağlantısı başarısız oldu", "sshErrorWebSocket": "WebSocket bağlantısı başarısız oldu",
"sshErrorAuthFailed": "Kimlik doğrulama başarısız", "sshErrorAuthFailed": "Kimlik doğrulama başarısız",
"sshErrorConnectionClosed": "Kimlik doğrulama tamamlanmadan bağlantı kapandı", "sshErrorConnectionClosed": "Kimlik doğrulama tamamlanmadan bağlantı kapandı",
"sitePangolinSshDescription": "Bu site üzerindeki kaynaklara SSH erişimine izin verin. Bu ayar sonradan değiştirilebilir.", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "Bu etki alanı için kaynak bulunamadı", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "Hedef Yok", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "Bağlan", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "PAM itmeli kimlik doğrulama için SSH anahtarı imzalanamadı. Kullanıcı olarak oturum açtınız mı?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "Hata: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "Bağlantı kapandı (kod {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BAŞLANGIÇ OPENSSH ÖZEL ANAHTARI-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "Özel anahtar gereklidir", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "Bağlanmak için VNC parolanızı girin", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "Parola (isteğe bağlı)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "Kaynak hedefi mevcut değil", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "NoVNC yüklenemedi", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "Durum {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "Panoya yapıştır", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "Uzak Masaüstü'ne Giriş Yap", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "Bağlanmak için Windows kimlik bilgilerinizi girin", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "Modül yükleniyor...", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "RDP modülü yüklenemedi", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "Hazır değil", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "RDP modülü hala başlatılıyor", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "Uzak {count, plural, one {dosya} other {dosya}} indiriliyor...", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "İndirme başarısız: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "Yüklendi: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "Bağlantı hedefi yok", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "Bağlantı başarısız oldu", "rdpConnectionFailed": "Connection failed",
"rdpFit": "Sığdır", "rdpFit": "Fit",
"rdpFull": "Tam", "rdpFull": "Full",
"rdpReal": "Gerçek", "rdpReal": "Real",
"rdpMeta": "Meta", "rdpMeta": "Meta",
"rdpUploadFiles": "Dosya yükle", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "Yapıştırmak üzere dosyalar hazır", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "{count} dosya uzak panoya kopyalandı — yapıştırmak için uzak masaüstünde Ctrl+V tuşlarına basın.", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "Yükleme başarısız", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Unicode klavye modu", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "Araç çubuğunu göster", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "Araç çubuğunu gizle" "sessionToolbarHide": "Hide toolbar"
} }
+184 -185
View File
@@ -101,8 +101,8 @@
"sitesTableViewPrivateResources": "查看私有资源", "sitesTableViewPrivateResources": "查看私有资源",
"siteInstallNewt": "安装 Newt", "siteInstallNewt": "安装 Newt",
"siteInstallNewtDescription": "在您的系统中运行 Newt", "siteInstallNewtDescription": "在您的系统中运行 Newt",
"siteInstallKubernetesDocsDescription": "有关最新的 Kubernetes 安装信息,请参阅<docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>", "siteInstallKubernetesDocsDescription": "For more and up to date Kubernetes installation information, see <docsLink>docs.pangolin.net/manage/sites/install-kubernetes</docsLink>.",
"siteInstallAdvantechDocsDescription": "有关 Advantech 调制解调器安装说明,请参阅<docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>", "siteInstallAdvantechDocsDescription": "For Advantech modem installation instructions, see <docsLink>docs.pangolin.net/manage/sites/install-advantech</docsLink>.",
"WgConfiguration": "WireGuard 配置", "WgConfiguration": "WireGuard 配置",
"WgConfigurationDescription": "使用以下配置连接到网络", "WgConfigurationDescription": "使用以下配置连接到网络",
"operatingSystem": "操作系统", "operatingSystem": "操作系统",
@@ -150,16 +150,16 @@
"siteCredentialsSaveDescription": "您只能看到一次。请确保将其复制并保存到一个安全的地方。", "siteCredentialsSaveDescription": "您只能看到一次。请确保将其复制并保存到一个安全的地方。",
"siteInfo": "站点信息", "siteInfo": "站点信息",
"status": "状态", "status": "状态",
"shareTitle": "管理可共享链接", "shareTitle": "Manage Shareable Links",
"shareDescription": "创建可共享的链接,允许临时或永久访问代理资源", "shareDescription": "创建可共享的链接,允许临时或永久访问代理资源",
"shareSearch": "搜索可共享链接……", "shareSearch": "Search shareable links...",
"shareCreate": "创建可共享链接", "shareCreate": "Create Shareable Link",
"shareErrorDelete": "删除链接失败", "shareErrorDelete": "删除链接失败",
"shareErrorDeleteMessage": "删除链接时出错", "shareErrorDeleteMessage": "删除链接时出错",
"shareDeleted": "链接已删除", "shareDeleted": "链接已删除",
"shareDeletedDescription": "链接已删除", "shareDeletedDescription": "链接已删除",
"shareDelete": "删除可共享链接", "shareDelete": "Delete Shareable Link",
"shareDeleteConfirm": "确认删除可共享链接", "shareDeleteConfirm": "Confirm Delete Shareable Link",
"shareQuestionRemove": "您确定要删除这个共享链接吗?", "shareQuestionRemove": "您确定要删除这个共享链接吗?",
"shareMessageRemove": "删除后,该链接将不再可用,使用它的任何人将失去对资源的访问权限。", "shareMessageRemove": "删除后,该链接将不再可用,使用它的任何人将失去对资源的访问权限。",
"shareTokenDescription": "访问令牌可以通过两种方式传递:作为查询参数或请求标题。 每次验证访问请求都必须从客户端传递。", "shareTokenDescription": "访问令牌可以通过两种方式传递:作为查询参数或请求标题。 每次验证访问请求都必须从客户端传递。",
@@ -179,7 +179,7 @@
"shareCreateDescription": "任何具有此链接的人都可以访问资源", "shareCreateDescription": "任何具有此链接的人都可以访问资源",
"shareTitleOptional": "标题 (可选)", "shareTitleOptional": "标题 (可选)",
"sharePathOptional": "路径(可选)", "sharePathOptional": "路径(可选)",
"sharePathDescription": "认证后,链接将把用户重定向到此路径。", "sharePathDescription": "The link will redirect users to this path after authentication.",
"expireIn": "过期时间", "expireIn": "过期时间",
"neverExpire": "永不过期", "neverExpire": "永不过期",
"shareExpireDescription": "过期时间是链接可以使用并提供对资源的访问时间。 此时间后,链接将不再工作,使用此链接的用户将失去对资源的访问。", "shareExpireDescription": "过期时间是链接可以使用并提供对资源的访问时间。 此时间后,链接将不再工作,使用此链接的用户将失去对资源的访问。",
@@ -203,8 +203,8 @@
"shareErrorSelectResource": "请选择一个资源", "shareErrorSelectResource": "请选择一个资源",
"proxyResourceTitle": "管理公共资源", "proxyResourceTitle": "管理公共资源",
"proxyResourceDescription": "创建和管理可通过 Web 浏览器公开访问的资源", "proxyResourceDescription": "创建和管理可通过 Web 浏览器公开访问的资源",
"publicResourcesBannerTitle": "基于 Web 的公共访问", "publicResourcesBannerTitle": "Web-based Public Access",
"publicResourcesBannerDescription": "公共资源是 HTTPS 代理,可以通过网络浏览器在互联网上的任何人访问。与私人资源不同,它们不需要客户端软件,并且可以包含身份和上下文感知的访问策略。", "publicResourcesBannerDescription": "Public resources are HTTPS proxies accessible to anyone on the internet through a web browser. Unlike private resources, they do not require client-side software and can include identity and context-aware access policies.",
"clientResourceTitle": "管理私有资源", "clientResourceTitle": "管理私有资源",
"clientResourceDescription": "创建和管理只能通过连接客户端访问的资源", "clientResourceDescription": "创建和管理只能通过连接客户端访问的资源",
"privateResourcesBannerTitle": "零信任的私人访问", "privateResourcesBannerTitle": "零信任的私人访问",
@@ -212,19 +212,18 @@
"resourcesSearch": "搜索资源...", "resourcesSearch": "搜索资源...",
"resourceAdd": "添加资源", "resourceAdd": "添加资源",
"resourceErrorDelte": "删除资源时出错", "resourceErrorDelte": "删除资源时出错",
"resourcePoliciesBannerTitle": "重用身份验证和访问规则", "resourcePoliciesBannerTitle": "Re-use Authentication and Access Rules",
"resourcePoliciesBannerDescription": "共享资源策略可让您定义身份验证方法和访问规则,然后将其应用到多个公共资源。当您更新策略时,每个链接的资源都会自动继承更改。", "resourcePoliciesBannerDescription": "Shared resource policies let you define authentication methods and access rules once, then attach them to multiple public resources. When you update a policy, every linked resource inherits the change automatically.",
"resourcePoliciesBannerButtonText": "了解更多", "resourcePoliciesTitle": "Manage Public Resource Policies",
"resourcePoliciesTitle": "管理公共资源策略", "resourcePoliciesAttachedResourcesColumnTitle": "Resources",
"resourcePoliciesAttachedResourcesColumnTitle": "资源",
"resourcePoliciesAttachedResources": "{count} 个资源", "resourcePoliciesAttachedResources": "{count} 个资源",
"resourcePoliciesAttachedResourcesCount": "{count, plural, other {# 个资源}}", "resourcePoliciesAttachedResourcesCount": "{count, plural, one {# resource} other {# resources}}",
"resourcePoliciesAttachedResourcesEmpty": "没有资源", "resourcePoliciesAttachedResourcesEmpty": "没有资源",
"resourcePoliciesDescription": "创建和管理身份验证策略以控制对公共资源的访问", "resourcePoliciesDescription": "Create and manage authentication policies to control access to your public resources",
"resourcePoliciesSearch": "搜索策略……", "resourcePoliciesSearch": "搜索策略……",
"resourcePoliciesAdd": "添加策略", "resourcePoliciesAdd": "添加策略",
"resourcePoliciesDefaultBadgeText": "默认策略", "resourcePoliciesDefaultBadgeText": "默认策略",
"resourcePoliciesCreate": "创建公共资源策略", "resourcePoliciesCreate": "Create Public Resource Policy",
"resourcePoliciesCreateDescription": "按照以下步骤创建新策略", "resourcePoliciesCreateDescription": "按照以下步骤创建新策略",
"resourcePolicyName": "策略名称", "resourcePolicyName": "策略名称",
"resourcePolicyNameDescription": "给此策略命名,以便在您的资源中识别它", "resourcePolicyNameDescription": "给此策略命名,以便在您的资源中识别它",
@@ -281,7 +280,7 @@
"back": "后退", "back": "后退",
"cancel": "取消", "cancel": "取消",
"resourceConfig": "配置片段", "resourceConfig": "配置片段",
"resourceConfigDescription": "复制并粘贴这些配置片段以设置 TCP/UDP 资源。", "resourceConfigDescription": "Copy and paste these configuration snippets to set up the TCP/UDP resource.",
"resourceAddEntrypoints": "Traefik: 添加入口点", "resourceAddEntrypoints": "Traefik: 添加入口点",
"resourceExposePorts": "Gerbil:在 Docker Compose 中显示端口", "resourceExposePorts": "Gerbil:在 Docker Compose 中显示端口",
"resourceLearnRaw": "学习如何配置 TCP/UDP 资源", "resourceLearnRaw": "学习如何配置 TCP/UDP 资源",
@@ -294,8 +293,8 @@
"labelDelete": "删除标签", "labelDelete": "删除标签",
"labelAdd": "添加标签", "labelAdd": "添加标签",
"labelCreateSuccessMessage": "标签创建成功", "labelCreateSuccessMessage": "标签创建成功",
"labelDuplicateError": "标签重复", "labelDuplicateError": "Duplicate Label",
"labelDuplicateErrorDescription": "已存在具有该名称的标签。", "labelDuplicateErrorDescription": "A label with this name already exists.",
"labelEditSuccessMessage": "标签修改成功", "labelEditSuccessMessage": "标签修改成功",
"labelNameField": "标签名称", "labelNameField": "标签名称",
"labelColorField": "标签颜色", "labelColorField": "标签颜色",
@@ -320,7 +319,7 @@
"rules": "规则", "rules": "规则",
"resourceSettingDescription": "配置资源上的设置", "resourceSettingDescription": "配置资源上的设置",
"resourceSetting": "{resourceName} 设置", "resourceSetting": "{resourceName} 设置",
"resourcePolicySettingDescription": "配置此公共资源策略上的设置", "resourcePolicySettingDescription": "Configure the settings on this public resource policy",
"resourcePolicySetting": "{policyName} 设置", "resourcePolicySetting": "{policyName} 设置",
"alwaysAllow": "旁路认证", "alwaysAllow": "旁路认证",
"alwaysDeny": "屏蔽访问", "alwaysDeny": "屏蔽访问",
@@ -728,7 +727,7 @@
"targetSubmit": "添加目标", "targetSubmit": "添加目标",
"targetNoOne": "此资源没有任何目标。添加目标来配置向后端发送请求的位置。", "targetNoOne": "此资源没有任何目标。添加目标来配置向后端发送请求的位置。",
"targetNoOneDescription": "在上面添加多个目标将启用负载平衡。", "targetNoOneDescription": "在上面添加多个目标将启用负载平衡。",
"targetsSubmit": "保存设置", "targetsSubmit": "Save Settings",
"addTarget": "添加目标", "addTarget": "添加目标",
"proxyMultiSiteRoundRobinNodeHelp": "轮询路由在未连接到相同节点的站点之间将不起作用,但故障转移会生效。", "proxyMultiSiteRoundRobinNodeHelp": "轮询路由在未连接到相同节点的站点之间将不起作用,但故障转移会生效。",
"targetErrorInvalidIp": "无效的 IP 地址", "targetErrorInvalidIp": "无效的 IP 地址",
@@ -762,11 +761,11 @@
"rulesErrorDuplicate": "复制规则", "rulesErrorDuplicate": "复制规则",
"rulesErrorDuplicateDescription": "带有这些设置的规则已存在", "rulesErrorDuplicateDescription": "带有这些设置的规则已存在",
"rulesErrorInvalidIpAddressRange": "无效的 CIDR", "rulesErrorInvalidIpAddressRange": "无效的 CIDR",
"rulesErrorInvalidIpAddressRangeDescription": "输入有效的 CIDR 范围(例如,10.0.0.0/8)。", "rulesErrorInvalidIpAddressRangeDescription": "Enter a valid CIDR range (e.g., 10.0.0.0/8).",
"rulesErrorInvalidUrl": "无效路径", "rulesErrorInvalidUrl": "Invalid path",
"rulesErrorInvalidUrlDescription": "输入有效的 URL 路径或模式(例如,/api/*)。", "rulesErrorInvalidUrlDescription": "Enter a valid URL path or pattern (e.g., /api/*).",
"rulesErrorInvalidIpAddress": "无效 IP 地址", "rulesErrorInvalidIpAddress": "Invalid IP address",
"rulesErrorInvalidIpAddressDescription": "输入有效的 IPv4 IPv6 地址。", "rulesErrorInvalidIpAddressDescription": "Enter a valid IPv4 or IPv6 address.",
"rulesErrorUpdate": "更新规则失败", "rulesErrorUpdate": "更新规则失败",
"rulesErrorUpdateDescription": "更新规则时出错", "rulesErrorUpdateDescription": "更新规则时出错",
"rulesUpdated": "启用规则", "rulesUpdated": "启用规则",
@@ -774,24 +773,24 @@
"rulesMatchIpAddressRangeDescription": "以 CIDR 格式输入地址(如:103.21.244.0/22)", "rulesMatchIpAddressRangeDescription": "以 CIDR 格式输入地址(如:103.21.244.0/22)",
"rulesMatchIpAddress": "输入IP地址(例如,103.21.244.12)", "rulesMatchIpAddress": "输入IP地址(例如,103.21.244.12)",
"rulesMatchUrl": "输入一个 URL 路径或模式(例如/api/v1/todos 或 /api/v1/*)", "rulesMatchUrl": "输入一个 URL 路径或模式(例如/api/v1/todos 或 /api/v1/*)",
"rulesErrorInvalidPriority": "优先级无效", "rulesErrorInvalidPriority": "Invalid priority",
"rulesErrorInvalidPriorityDescription": "输入一个大于或等于 1 的整数。", "rulesErrorInvalidPriorityDescription": "Enter a whole number of 1 or higher.",
"rulesErrorDuplicatePriority": "优先级重复", "rulesErrorDuplicatePriority": "Duplicate priorities",
"rulesErrorDuplicatePriorityDescription": "每条规则必须拥有唯一的优先级号。", "rulesErrorDuplicatePriorityDescription": "Each rule must have a unique priority number.",
"rulesErrorValidation": "规则无效", "rulesErrorValidation": "Invalid rules",
"rulesErrorValidationRuleDescription": "规则 {ruleNumber}: {message}", "rulesErrorValidationRuleDescription": "Rule {ruleNumber}: {message}",
"rulesErrorInvalidMatchTypeDescription": "选择有效的匹配类型(路径、IP、CIDR、国家、地区或 ASN)。", "rulesErrorInvalidMatchTypeDescription": "Select a valid match type (path, IP, CIDR, country, region, or ASN).",
"rulesErrorValueRequired": "为此规则输入一个值。", "rulesErrorValueRequired": "Enter a value for this rule.",
"rulesErrorInvalidCountry": "国家无效", "rulesErrorInvalidCountry": "Invalid country",
"rulesErrorInvalidCountryDescription": "选择一个有效的国家。", "rulesErrorInvalidCountryDescription": "Select a valid country.",
"rulesErrorInvalidAsn": "ASN 无效", "rulesErrorInvalidAsn": "Invalid ASN",
"rulesErrorInvalidAsnDescription": "输入有效的 ASN(例如,AS15169)。", "rulesErrorInvalidAsnDescription": "Enter a valid ASN (e.g., AS15169).",
"ruleUpdated": "规则已更新", "ruleUpdated": "规则已更新",
"ruleUpdatedDescription": "规则更新成功", "ruleUpdatedDescription": "规则更新成功",
"ruleErrorUpdate": "操作失败", "ruleErrorUpdate": "操作失败",
"ruleErrorUpdateDescription": "保存过程中发生错误", "ruleErrorUpdateDescription": "保存过程中发生错误",
"rulesPriority": "优先权", "rulesPriority": "优先权",
"rulesReorderDragHandle": "拖动以重新排序规则优先级", "rulesReorderDragHandle": "Drag to reorder rule priority",
"rulesAction": "行为", "rulesAction": "行为",
"rulesMatchType": "匹配类型", "rulesMatchType": "匹配类型",
"value": "值", "value": "值",
@@ -810,7 +809,7 @@
"rulesResource": "资源规则配置", "rulesResource": "资源规则配置",
"rulesResourceDescription": "配置规则来控制对资源的访问", "rulesResourceDescription": "配置规则来控制对资源的访问",
"ruleSubmit": "添加规则", "ruleSubmit": "添加规则",
"rulesNoOne": "尚无规则。", "rulesNoOne": "No rules yet.",
"rulesOrder": "规则按优先顺序评定。", "rulesOrder": "规则按优先顺序评定。",
"rulesSubmit": "保存规则", "rulesSubmit": "保存规则",
"policyErrorCreate": "创建策略时出错", "policyErrorCreate": "创建策略时出错",
@@ -821,45 +820,45 @@
"policyErrorUpdateMessageDescription": "发生意外错误", "policyErrorUpdateMessageDescription": "发生意外错误",
"policyCreatedSuccess": "资源策略创建成功", "policyCreatedSuccess": "资源策略创建成功",
"policyUpdatedSuccess": "资源策略更新成功", "policyUpdatedSuccess": "资源策略更新成功",
"authMethodsSave": "保存设置", "authMethodsSave": "Save Settings",
"policyAuthStackTitle": "身份验证", "policyAuthStackTitle": "Authentication",
"policyAuthStackDescription": "控制哪些身份验证方法需由用户执行才能访问资源", "policyAuthStackDescription": "Control which authentication methods are required to access this resource",
"policyAuthOrLogicTitle": "多种身份验证方法处于激活状态", "policyAuthOrLogicTitle": "Multiple authentication methods active",
"policyAuthOrLogicBanner": "访问者可以使用下列任意激活的方法进行身份验证。无需完成全部过程。", "policyAuthOrLogicBanner": "Visitors may authenticate using any one of the active methods below. They do not need to complete all of them.",
"policyAuthMethodActive": "激活", "policyAuthMethodActive": "Active",
"policyAuthMethodOff": "关闭", "policyAuthMethodOff": "Off",
"policyAuthSsoTitle": "平台单点登录 SSO", "policyAuthSsoTitle": "Platform SSO",
"policyAuthSsoDescription": "要求通过您组织的身份提供商登录", "policyAuthSsoDescription": "Require sign-in through your organization's identity provider",
"policyAuthSsoSummary": "{idp} · {users} 个用户, {roles} 个角色", "policyAuthSsoSummary": "{idp} · {users} users, {roles} roles",
"policyAuthSsoDefaultIdp": "默认提供商", "policyAuthSsoDefaultIdp": "Default provider",
"policyAuthAddDefaultIdentityProvider": "添加默认身份提供商", "policyAuthAddDefaultIdentityProvider": "Add Default Identity Provider",
"policyAuthOtherMethodsTitle": "其他方法", "policyAuthOtherMethodsTitle": "Other Methods",
"policyAuthOtherMethodsDescription": "访问者可以使用以下备用或联合平台 SSO 的方法", "policyAuthOtherMethodsDescription": "Optional methods visitors can use instead of or alongside platform SSO",
"policyAuthPasscodeTitle": "密码", "policyAuthPasscodeTitle": "Passcode",
"policyAuthPasscodeDescription": "要求使用共享字母数字密码以访资源问", "policyAuthPasscodeDescription": "Require a shared alphanumeric passcode to access the resource",
"policyAuthPasscodeSummary": "密码已设定", "policyAuthPasscodeSummary": "Passcode set",
"policyAuthPincodeTitle": "PIN ", "policyAuthPincodeTitle": "PIN Code",
"policyAuthPincodeDescription": "要求使用短数字代码以访问资源", "policyAuthPincodeDescription": "A short numeric code required to access the resource",
"policyAuthPincodeSummary": "6 位数字 PIN 码已设定", "policyAuthPincodeSummary": "6-digit PIN set",
"policyAuthEmailTitle": "电子邮件白名单", "policyAuthEmailTitle": "Email Whitelist",
"policyAuthEmailDescription": "允许列出的电子邮件地址使用一次性密码", "policyAuthEmailDescription": "Allow listed email addresses with one-time passwords",
"policyAuthEmailSummary": "允许 {count} 个地址", "policyAuthEmailSummary": "{count} addresses allowed",
"policyAuthEmailOtpCallout": "启用电子邮件白名单将在登录时向访问者的电子邮件发送一次性密码。", "policyAuthEmailOtpCallout": "Enabling email whitelist sends a one-time password to the visitor's email on login.",
"policyAuthHeaderAuthTitle": "基础标题认证", "policyAuthHeaderAuthTitle": "Basic Header Auth",
"policyAuthHeaderAuthDescription": "在每次请求上验证自定义 HTTP 标头名称和值", "policyAuthHeaderAuthDescription": "Validate a custom HTTP header name and value on each request",
"policyAuthHeaderAuthSummary": "标头已配置", "policyAuthHeaderAuthSummary": "Header configured",
"policyAuthHeaderName": "标头名称", "policyAuthHeaderName": "Header name",
"policyAuthHeaderValue": "预期值", "policyAuthHeaderValue": "Expected value",
"policyAuthSetPasscode": "设定密码", "policyAuthSetPasscode": "Set Passcode",
"policyAuthSetPincode": "设置 PIN ", "policyAuthSetPincode": "Set PIN Code",
"policyAuthSetEmailWhitelist": "设置电子邮件白名单", "policyAuthSetEmailWhitelist": "Set Email Whitelist",
"policyAuthSetHeaderAuth": "设置基础标题认证", "policyAuthSetHeaderAuth": "Set Basic Header Auth",
"policyAccessRulesTitle": "访问规则", "policyAccessRulesTitle": "Access Rules",
"policyAccessRulesEnableDescription": "启用后,规则将按下降顺序进行评估,直到某条规则评估结果为真。", "policyAccessRulesEnableDescription": "When enabled, rules are evaluated in descending order until one evaluates as true.",
"policyAccessRulesFirstMatch": "规则将自上而下进行评估。首次匹配的规则决定结果。", "policyAccessRulesFirstMatch": "Rules are evaluated top to bottom. The first matching rule decides the outcome.",
"policyAccessRulesHowItWorks": "规则通过路径、IP 地址、位置或其他标准匹配请求。每个规则都会应用操作:绕过身份验证、阻止访问或通过身份验证。如果没有规则匹配,流量将继续通过身份验证。", "policyAccessRulesHowItWorks": "Rules match requests by path, IP address, location, or other criteria. Each rule applies an action: bypass authentication, block access, or pass to authentication. If no rule matches, traffic continues to authentication.",
"policyAccessRulesFallthroughOff": "禁用规则后,所有流量将通过身份验证。", "policyAccessRulesFallthroughOff": "When rules are disabled, all traffic passes through to authentication.",
"policyAccessRulesFallthroughOn": "没有规则匹配时,流量将通过身份验证。", "policyAccessRulesFallthroughOn": "When no rule matches, traffic passes through to authentication.",
"rulesPlaceholderCidr": "10.0.0.0/8", "rulesPlaceholderCidr": "10.0.0.0/8",
"rulesPlaceholderPath": "/admin/*", "rulesPlaceholderPath": "/admin/*",
"rulesPlaceholderGeo": "RU, KP", "rulesPlaceholderGeo": "RU, KP",
@@ -883,9 +882,9 @@
"resourcesErrorUpdateDescription": "更新资源时出错", "resourcesErrorUpdateDescription": "更新资源时出错",
"access": "访问权限", "access": "访问权限",
"accessControl": "访问控制", "accessControl": "访问控制",
"shareLink": "{resource} 可共享链接", "shareLink": "{resource} Shareable Link",
"resourceSelect": "选择资源", "resourceSelect": "选择资源",
"shareLinks": "可共享链接", "shareLinks": "Shareable Links",
"share": "分享链接", "share": "分享链接",
"shareDescription2": "创建资源的可共享链接。链接提供了对您资源的临时或无限制访问。 当您创建链接时,您可以配置链接的到期时间。", "shareDescription2": "创建资源的可共享链接。链接提供了对您资源的临时或无限制访问。 当您创建链接时,您可以配置链接的到期时间。",
"shareEasyCreate": "轻松创建和分享", "shareEasyCreate": "轻松创建和分享",
@@ -975,18 +974,18 @@
"resourceRoleDescription": "管理员总是可以访问此资源。", "resourceRoleDescription": "管理员总是可以访问此资源。",
"resourcePolicySelectTitle": "资源访问策略", "resourcePolicySelectTitle": "资源访问策略",
"resourcePolicySelectDescription": "选择用于认证的资源策略类型", "resourcePolicySelectDescription": "选择用于认证的资源策略类型",
"resourcePolicyTypeLabel": "策略类型", "resourcePolicyTypeLabel": "Policy type",
"resourcePolicyLabel": "资源策略", "resourcePolicyLabel": "Resource policy",
"resourcePolicyInline": "内联资源策略", "resourcePolicyInline": "内联资源策略",
"resourcePolicyInlineDescription": "仅限于此资源的访问策略", "resourcePolicyInlineDescription": "仅限于此资源的访问策略",
"resourcePolicyShared": "共享资源策略", "resourcePolicyShared": "共享资源策略",
"resourcePolicySharedDescription": "此资源使用共享策略。", "resourcePolicySharedDescription": "This resource uses a shared policy.",
"sharedPolicy": "共享策略", "sharedPolicy": "Shared Policy",
"sharedPolicyNoneDescription": "此资源有自己的策略。", "sharedPolicyNoneDescription": "This resource has its own policy.",
"resourceSharedPolicyOwnDescription": "此资源具有自己的身份验证和访问规则控制。", "resourceSharedPolicyOwnDescription": "This resource has its own authentication and access rules controls.",
"resourceSharedPolicyInheritedDescription": "此资源继承自<policyLink>{policyName}</policyLink>", "resourceSharedPolicyInheritedDescription": "This resource inherits authentication and access rules controls from <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyAuthenticationNotice": "此资源使用共享策略。一些身份验证设置可以在此资源上编辑以添加到策略。要更改基础策略,您必须编辑<policyLink>{policyName}</policyLink>", "resourceSharedPolicyAuthenticationNotice": "This resource is using a shared policy. Some authentication settings can be edited on this resource. To change the underlying policy, you must edit to <policyLink>{policyName}</policyLink>.",
"resourceSharedPolicyRulesNotice": "此资源正在使用一个共享策略。某些访问规则可以在此资源上编辑。要更改基础策略,您必须编辑<policyLink>{policyName}</policyLink>", "resourceSharedPolicyRulesNotice": "This resource is using a shared policy. Some access rules can be edited on this resource. To change the underlying policy, you must edit <policyLink>{policyName}</policyLink>.",
"resourceUsersRoles": "访问控制", "resourceUsersRoles": "访问控制",
"resourceUsersRolesDescription": "配置用户和角色可以访问此资源", "resourceUsersRolesDescription": "配置用户和角色可以访问此资源",
"resourceUsersRolesSubmit": "保存访问控制", "resourceUsersRolesSubmit": "保存访问控制",
@@ -1011,14 +1010,14 @@
"resourceVisibilityTitle": "可见性", "resourceVisibilityTitle": "可见性",
"resourceVisibilityTitleDescription": "完全启用或禁用资源可见性", "resourceVisibilityTitleDescription": "完全启用或禁用资源可见性",
"resourceGeneral": "常规设置", "resourceGeneral": "常规设置",
"resourceGeneralDescription": "配置资源的名称、地址和访问策略。", "resourceGeneralDescription": "Configure name, address, and access policy for this resource.",
"resourceGeneralDetailsSubsection": "资源详情", "resourceGeneralDetailsSubsection": "Resource Details",
"resourceGeneralDetailsSubsectionDescription": "设置资源的显示名称、标识符和公共访问域名。", "resourceGeneralDetailsSubsectionDescription": "Set the display name, identifier, and publicly accessible domain for this resource.",
"resourceGeneralDetailsSubsectionPortDescription": "设置资源的显示名称、标识符和公共端口。", "resourceGeneralDetailsSubsectionPortDescription": "Set the display name, identifier, and public port for this resource.",
"resourceGeneralPublicAddressSubsection": "公共地址", "resourceGeneralPublicAddressSubsection": "Public Address",
"resourceGeneralPublicAddressSubsectionDescription": "配置用户如何访问该资源。", "resourceGeneralPublicAddressSubsectionDescription": "Configure how users reach this resource.",
"resourceGeneralAuthenticationAccessSubsection": "身份验证与访问", "resourceGeneralAuthenticationAccessSubsection": "Authentication & Access",
"resourceGeneralAuthenticationAccessSubsectionDescription": "选择该资源是使用其自己的策略还是从共享策略继承。", "resourceGeneralAuthenticationAccessSubsectionDescription": "Choose whether this resource uses its own policy or inherits from a shared policy.",
"resourceEnable": "启用资源", "resourceEnable": "启用资源",
"resourceTransfer": "转移资源", "resourceTransfer": "转移资源",
"resourceTransferDescription": "将此资源转移到另一个站点", "resourceTransferDescription": "将此资源转移到另一个站点",
@@ -1294,14 +1293,14 @@
"addLabels": "添加标签", "addLabels": "添加标签",
"siteLabelsTab": "标签", "siteLabelsTab": "标签",
"siteLabelsDescription": "管理与此网站相关的标签。", "siteLabelsDescription": "管理与此网站相关的标签。",
"labelsNotFound": "未找到标签。", "labelsNotFound": "No labels found.",
"labelsEmptyCreateHint": "在上方输入以创建标签。", "labelsEmptyCreateHint": "Start typing above to create a label.",
"labelSearch": "搜索标签", "labelSearch": "搜索标签",
"labelSearchOrCreate": "搜索或创建标签", "labelSearchOrCreate": "Search or create a label",
"accessLabelFilterCount": "{count, plural, other {# 标签}}", "accessLabelFilterCount": "{count, plural, other {# 标签}}",
"labelOverflowCount": "+{count, plural, other {# 标签}}", "labelOverflowCount": "+{count, plural, other {# 标签}}",
"accessLabelFilterClear": "清除标签过滤器", "accessLabelFilterClear": "清除标签过滤器",
"accessFilterClear": "清除筛选器", "accessFilterClear": "Clear filters",
"selectColor": "选择颜色", "selectColor": "选择颜色",
"createNewLabel": "创建新的组织标签 \"{label}\"", "createNewLabel": "创建新的组织标签 \"{label}\"",
"inviteInvalidDescription": "邀请链接无效。", "inviteInvalidDescription": "邀请链接无效。",
@@ -1538,8 +1537,8 @@
"sidebarResources": "资源", "sidebarResources": "资源",
"sidebarProxyResources": "公开的", "sidebarProxyResources": "公开的",
"sidebarClientResources": "非公开的", "sidebarClientResources": "非公开的",
"sidebarPolicies": "共享策略", "sidebarPolicies": "Shared Policies",
"sidebarResourcePolicies": "公共资源", "sidebarResourcePolicies": "Public Resources",
"sidebarAccessControl": "访问控制", "sidebarAccessControl": "访问控制",
"sidebarLogsAndAnalytics": "日志与分析", "sidebarLogsAndAnalytics": "日志与分析",
"sidebarTeam": "团队", "sidebarTeam": "团队",
@@ -1547,7 +1546,7 @@
"sidebarAdmin": "管理员", "sidebarAdmin": "管理员",
"sidebarInvitations": "邀请", "sidebarInvitations": "邀请",
"sidebarRoles": "角色", "sidebarRoles": "角色",
"sidebarShareableLinks": "可共享链接", "sidebarShareableLinks": "Shareable Links",
"sidebarApiKeys": "API密钥", "sidebarApiKeys": "API密钥",
"sidebarProvisioning": "置备中", "sidebarProvisioning": "置备中",
"sidebarSettings": "设置", "sidebarSettings": "设置",
@@ -1724,7 +1723,7 @@
"standaloneHcFilterResourceIdFallback": "资源 {id}", "standaloneHcFilterResourceIdFallback": "资源 {id}",
"blueprints": "蓝图", "blueprints": "蓝图",
"blueprintsLog": "蓝图日志", "blueprintsLog": "蓝图日志",
"blueprintsDescription": "查看过去的蓝图应用及其结果或应用一个新的蓝图", "blueprintsDescription": "View past blueprint applications and their results or apply a new blueprint",
"blueprintAdd": "添加蓝图", "blueprintAdd": "添加蓝图",
"blueprintGoBack": "查看所有蓝图", "blueprintGoBack": "查看所有蓝图",
"blueprintCreate": "创建蓝图", "blueprintCreate": "创建蓝图",
@@ -1744,10 +1743,10 @@
"enableDockerSocket": "启用 Docker 蓝图", "enableDockerSocket": "启用 Docker 蓝图",
"enableDockerSocketDescription": "启用用于蓝图标签的 Docker 套接字标签擦除。必须为站点连接器提供套接字路径。阅读<docsLink>文档</docsLink>以了解相关工作原理。", "enableDockerSocketDescription": "启用用于蓝图标签的 Docker 套接字标签擦除。必须为站点连接器提供套接字路径。阅读<docsLink>文档</docsLink>以了解相关工作原理。",
"newtAutoUpdate": "启用站点自动更新", "newtAutoUpdate": "启用站点自动更新",
"newtAutoUpdateDescription": "启用后,站点连接器将自动下载最新版本并重新启动。可以针对每个站点进行覆盖。", "newtAutoUpdateDescription": "When enabled, site connectors will automatically download the latest version and restart themselves. This can be overridden on a per-site basis.",
"siteAutoUpdate": "站点自动更新", "siteAutoUpdate": "站点自动更新",
"siteAutoUpdateLabel": "启用自动更新", "siteAutoUpdateLabel": "启用自动更新",
"siteAutoUpdateDescription": "启用后,该站点的连接器将自动下载最新版本并重新启动。", "siteAutoUpdateDescription": "When enabled, this site's connector will automatically download the latest version and restart itself.",
"siteAutoUpdateOrgDefault": "组织默认设置:{state}", "siteAutoUpdateOrgDefault": "组织默认设置:{state}",
"siteAutoUpdateOverriding": "覆盖组织设置", "siteAutoUpdateOverriding": "覆盖组织设置",
"siteAutoUpdateResetToOrg": "重置为组织默认设置", "siteAutoUpdateResetToOrg": "重置为组织默认设置",
@@ -1845,9 +1844,9 @@
"accountSetupSuccess": "账号设置完成!欢迎来到 Pangolin", "accountSetupSuccess": "账号设置完成!欢迎来到 Pangolin",
"documentation": "文档", "documentation": "文档",
"saveAllSettings": "保存所有设置", "saveAllSettings": "保存所有设置",
"saveResourceTargets": "保存设置", "saveResourceTargets": "Save Settings",
"saveResourceHttp": "保存设置", "saveResourceHttp": "Save Settings",
"saveProxyProtocol": "保存设置", "saveProxyProtocol": "Save Settings",
"settingsUpdated": "设置已更新", "settingsUpdated": "设置已更新",
"settingsUpdatedDescription": "设置更新成功", "settingsUpdatedDescription": "设置更新成功",
"settingsErrorUpdate": "设置更新失败", "settingsErrorUpdate": "设置更新失败",
@@ -2104,13 +2103,13 @@
"healthCheckUnknown": "未知", "healthCheckUnknown": "未知",
"healthCheck": "健康检查", "healthCheck": "健康检查",
"configureHealthCheck": "配置健康检查", "configureHealthCheck": "配置健康检查",
"configureHealthCheckDescription": "为您的资源设置监控以确保其始终可用", "configureHealthCheckDescription": "Set up monitoring for your resource to ensure it is always available",
"enableHealthChecks": "启用健康检查", "enableHealthChecks": "启用健康检查",
"healthCheckDisabledStateDescription": "禁用后,站点不会进行健康检查,状态将被视为未知。", "healthCheckDisabledStateDescription": "禁用后,站点不会进行健康检查,状态将被视为未知。",
"enableHealthChecksDescription": "监视此目标的健康状况。如果需要,您可以监视一个不同的终点。", "enableHealthChecksDescription": "监视此目标的健康状况。如果需要,您可以监视一个不同的终点。",
"healthScheme": "方法", "healthScheme": "方法",
"healthSelectScheme": "选择方法", "healthSelectScheme": "选择方法",
"healthCheckPortInvalid": "端口必须在 1 和 65535 之间", "healthCheckPortInvalid": "Port must be between 1 and 65535",
"healthCheckPath": "路径", "healthCheckPath": "路径",
"healthHostname": "IP / 主机", "healthHostname": "IP / 主机",
"healthPort": "端口", "healthPort": "端口",
@@ -2123,7 +2122,7 @@
"requireDeviceApproval": "需要设备批准", "requireDeviceApproval": "需要设备批准",
"requireDeviceApprovalDescription": "具有此角色的用户需要管理员批准的新设备才能连接和访问资源。", "requireDeviceApprovalDescription": "具有此角色的用户需要管理员批准的新设备才能连接和访问资源。",
"sshSettings": "SSH 设置", "sshSettings": "SSH 设置",
"sshAccess": "SSH 访问", "sshAccess": "SSH Access",
"rdpSettings": "RDP 设置", "rdpSettings": "RDP 设置",
"vncSettings": "VNC 设置", "vncSettings": "VNC 设置",
"sshServer": "SSH 服务器", "sshServer": "SSH 服务器",
@@ -2150,13 +2149,13 @@
"sshDaemonDisclaimer": "在完成本设置之前,请确保您的目标主机已经正确配置以运行身份验证守护程序,否则配置将失败。", "sshDaemonDisclaimer": "在完成本设置之前,请确保您的目标主机已经正确配置以运行身份验证守护程序,否则配置将失败。",
"sshDaemonPort": "守护程序端口", "sshDaemonPort": "守护程序端口",
"sshServerDestination": "服务器目标", "sshServerDestination": "服务器目标",
"sshServerDestinationDescription": "配置 SSH 服务器的目的地", "sshServerDestinationDescription": "Configure the destination of the SSH server",
"destination": "目标", "destination": "目标",
"destinationRequired": "需要目的地。", "destinationRequired": "Destination is required.",
"domainRequired": "需要域。", "domainRequired": "Domain is required.",
"proxyPortRequired": "需要端口。", "proxyPortRequired": "Port is required.",
"invalidPathConfiguration": "路径配置无效。", "invalidPathConfiguration": "Invalid path configuration.",
"invalidRewritePathConfiguration": "重写路径配置无效。", "invalidRewritePathConfiguration": "Invalid rewrite path configuration.",
"bgTargetMultiSiteDisclaimer": "选择多个站点可实现高可用性的弹性路由和故障转移。", "bgTargetMultiSiteDisclaimer": "选择多个站点可实现高可用性的弹性路由和故障转移。",
"roleAllowSsh": "允许 SSH", "roleAllowSsh": "允许 SSH",
"roleAllowSshAllow": "允许", "roleAllowSshAllow": "允许",
@@ -2171,25 +2170,25 @@
"sshSudoModeCommandsDescription": "用户只能用 sudo 运行指定的命令。", "sshSudoModeCommandsDescription": "用户只能用 sudo 运行指定的命令。",
"sshSudo": "允许Sudo", "sshSudo": "允许Sudo",
"sshSudoCommands": "Sudo 命令", "sshSudoCommands": "Sudo 命令",
"sshSudoCommandsDescription": "用户可以使用 sudo 运行的命令列表,以逗号、空格或新行分隔。必须使用绝对路径。", "sshSudoCommandsDescription": "List of commands the user is allowed to run with sudo, separated by commas, spaces, or new lines. Absolute paths must be used.",
"sshCreateHomeDir": "创建主目录", "sshCreateHomeDir": "创建主目录",
"sshUnixGroups": "Unix 组", "sshUnixGroups": "Unix 组",
"sshUnixGroupsDescription": "在目标主机上将用户添加到的 Unix 组,以逗号、空格或新行分隔。", "sshUnixGroupsDescription": "Unix groups to add the user to on the target host, separated by commas, spaces, or new lines.",
"roleTextFieldPlaceholder": "输入值,或放入 .txt .csv 文件", "roleTextFieldPlaceholder": "Enter values, or drop a .txt or .csv file",
"roleTextImportTitle": "从文件导入", "roleTextImportTitle": "Import from File",
"roleTextImportDescription": " {fileName} 导入到 {fieldLabel}", "roleTextImportDescription": "Importing {fileName} into {fieldLabel}.",
"roleTextImportSkipHeader": "跳过第一行(标题)", "roleTextImportSkipHeader": "Skip First Row (Header)",
"roleTextImportOverride": "替换现有", "roleTextImportOverride": "Replace Existing",
"roleTextImportAppend": "附加到现有", "roleTextImportAppend": "Append to Existing",
"roleTextImportMode": "导入模式", "roleTextImportMode": "Import Mode",
"roleTextImportPreview": "预览", "roleTextImportPreview": "Preview",
"roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}", "roleTextImportItemCount": "{count, plural, =0 {No items to import} one {1 item to import} other {# items to import}}",
"roleTextImportTotalCount": "{existing} 个现有 + {imported} 个导入 = {total} 个总计", "roleTextImportTotalCount": "{existing} existing + {imported} imported = {total} total",
"roleTextImportConfirm": "导入", "roleTextImportConfirm": "Import",
"roleTextImportInvalidFile": "不支持的文件类型", "roleTextImportInvalidFile": "Unsupported file type",
"roleTextImportInvalidFileDescription": "仅支持 .txt .csv 文件。", "roleTextImportInvalidFileDescription": "Only .txt and .csv files are supported.",
"roleTextImportEmpty": "文件中未找到项目", "roleTextImportEmpty": "No items found in file",
"roleTextImportEmptyDescription": "文件不包含任何可导入的项目。", "roleTextImportEmptyDescription": "The file does not contain any importable items.",
"retryAttempts": "重试次数", "retryAttempts": "重试次数",
"expectedResponseCodes": "期望响应代码", "expectedResponseCodes": "期望响应代码",
"expectedResponseCodesDescription": "HTTP 状态码表示健康状态。如留空,200-300 被视为健康。", "expectedResponseCodesDescription": "HTTP 状态码表示健康状态。如留空,200-300 被视为健康。",
@@ -2973,10 +2972,10 @@
"enableProxyProtocol": "启用代理协议", "enableProxyProtocol": "启用代理协议",
"proxyProtocolInfo": "为TCP后端保留客户端IP地址", "proxyProtocolInfo": "为TCP后端保留客户端IP地址",
"proxyProtocolVersion": "代理协议版本", "proxyProtocolVersion": "代理协议版本",
"version1": "版本 1(推荐)", "version1": "Version 1 (Recommended)",
"version2": "版本 2", "version2": "版本 2",
"version1Description": "基于文本和广泛支持。确保服务器传输添加到动态配置。", "version1Description": "Text-based and widely supported. Make sure servers transport is added to dynamic config.",
"version2Description": "二进制且更有效率但兼容性较低。确保服务器传输添加到动态配置。", "version2Description": "Binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
"warning": "警告", "warning": "警告",
"proxyProtocolWarning": "后端应用程序必须配置为接受代理协议连接。 如果您的后端不支持代理协议,启用此功能将会中断所有连接,只有当您知道自己在做什么时才能启用此功能。 请务必从Traefik配置您的后端到信任代理协议标题。", "proxyProtocolWarning": "后端应用程序必须配置为接受代理协议连接。 如果您的后端不支持代理协议,启用此功能将会中断所有连接,只有当您知道自己在做什么时才能启用此功能。 请务必从Traefik配置您的后端到信任代理协议标题。",
"restarting": "正在重启...", "restarting": "正在重启...",
@@ -3133,7 +3132,7 @@
"enterConfirmation": "输入确认", "enterConfirmation": "输入确认",
"blueprintViewDetails": "详细信息", "blueprintViewDetails": "详细信息",
"defaultIdentityProvider": "默认身份提供商", "defaultIdentityProvider": "默认身份提供商",
"defaultIdentityProviderDescription": "用户将自动重定向到此身份提供者进行身份验证。", "defaultIdentityProviderDescription": "The user will be automatically redirected to this identity provider for authentication.",
"editInternalResourceDialogNetworkSettings": "网络设置", "editInternalResourceDialogNetworkSettings": "网络设置",
"editInternalResourceDialogAccessPolicy": "访问策略", "editInternalResourceDialogAccessPolicy": "访问策略",
"editInternalResourceDialogAddRoles": "添加角色", "editInternalResourceDialogAddRoles": "添加角色",
@@ -3174,7 +3173,7 @@
"maintenanceModeType": "维护模式类型", "maintenanceModeType": "维护模式类型",
"showMaintenancePage": "只在所有后端目标都故障或不健康时显示维护页面。只要至少一个目标健康,您的资源将正常工作。", "showMaintenancePage": "只在所有后端目标都故障或不健康时显示维护页面。只要至少一个目标健康,您的资源将正常工作。",
"enableMaintenanceMode": "启用维护模式", "enableMaintenanceMode": "启用维护模式",
"enableMaintenanceModeDescription": "启用后,访问者将看到维护页面而不是您的资源。", "enableMaintenanceModeDescription": "When enabled, visitors will see a maintenance page instead of your resource.",
"automatic": "自动", "automatic": "自动",
"automaticModeDescription": "如果所有后端目标都故障或不健康,则仅显示维护页面。只要至少一个目标健康,您的资源将正常工作。", "automaticModeDescription": "如果所有后端目标都故障或不健康,则仅显示维护页面。只要至少一个目标健康,您的资源将正常工作。",
"forced": "强制", "forced": "强制",
@@ -3182,8 +3181,8 @@
"warning:": "警告:", "warning:": "警告:",
"forcedeModeWarning": "所有流量将被引导到维护页面。您的后端资源不会收到任何请求。", "forcedeModeWarning": "所有流量将被引导到维护页面。您的后端资源不会收到任何请求。",
"pageTitle": "页面标题", "pageTitle": "页面标题",
"maintenancePageContentSubsection": "页面内容", "maintenancePageContentSubsection": "Page Content",
"maintenancePageContentSubsectionDescription": "自定义维护页面上显示的内容", "maintenancePageContentSubsectionDescription": "Customize the content displayed on the maintenance page",
"pageTitleDescription": "维护页面显示的主标题", "pageTitleDescription": "维护页面显示的主标题",
"maintenancePageMessage": "维护信息", "maintenancePageMessage": "维护信息",
"maintenancePageMessagePlaceholder": "我们很快回来! 我们的网站目前正在进行计划中的维护。", "maintenancePageMessagePlaceholder": "我们很快回来! 我们的网站目前正在进行计划中的维护。",
@@ -3448,8 +3447,8 @@
"idpUnassociateQuestion": "您确定要将此身份提供者从此组织中取消关联吗?", "idpUnassociateQuestion": "您确定要将此身份提供者从此组织中取消关联吗?",
"idpUnassociateDescription": "与此身份提供者关联的所有用户将从该组织中移除,但身份提供者仍会继续存在于关联的其他组织中。", "idpUnassociateDescription": "与此身份提供者关联的所有用户将从该组织中移除,但身份提供者仍会继续存在于关联的其他组织中。",
"idpUnassociateConfirm": "确认取消关联身份提供者", "idpUnassociateConfirm": "确认取消关联身份提供者",
"idpConfirmDeleteAndRemoveMeFromOrg": "删除并将我从组织中移除", "idpConfirmDeleteAndRemoveMeFromOrg": "DELETE AND REMOVE ME FROM ORG",
"idpUnassociateAndRemoveMeFromOrg": "解除关联并将我从组织中移除", "idpUnassociateAndRemoveMeFromOrg": "UNASSOCIATE AND REMOVE ME FROM ORG",
"idpUnassociateWarning": "此操作无法对该组织撤销。", "idpUnassociateWarning": "此操作无法对该组织撤销。",
"idpUnassociatedDescription": "身份提供者已成功从该组织中取消关联", "idpUnassociatedDescription": "身份提供者已成功从该组织中取消关联",
"idpUnassociateMenu": "取消关联", "idpUnassociateMenu": "取消关联",
@@ -3543,58 +3542,58 @@
"sshConnecting": "正在连接…", "sshConnecting": "正在连接…",
"sshInitializing": "初始化中…", "sshInitializing": "初始化中…",
"sshSignInTitle": "登录 SSH", "sshSignInTitle": "登录 SSH",
"sshSignInDescription": "输入您的 SSH 凭据以进行连接", "sshSignInDescription": "输入您的 SSH 凭据",
"sshPasswordTab": "密码", "sshPasswordTab": "密码",
"sshPrivateKeyTab": "私钥", "sshPrivateKeyTab": "私钥",
"sshPrivateKeyField": "私钥", "sshPrivateKeyField": "私钥",
"sshPrivateKeyDisclaimer": "您的私钥不会被 Pangolin 存储或显示。或者,您可以使用短期证书,使用您现有的 Pangolin 身份无缝认证。", "sshPrivateKeyDisclaimer": "您的私钥不会被 Pangolin 存储或显示。或者,您可以使用短期证书,使用您现有的 Pangolin 身份无缝认证。",
"sshLearnMore": "了解更多", "sshLearnMore": "了解更多",
"sshPrivateKeyFile": "私钥文件", "sshPrivateKeyFile": "私钥文件",
"sshAuthenticate": "连接", "sshAuthenticate": "验证",
"sshTerminate": "终止", "sshTerminate": "终止",
"sshPoweredBy": "支持者", "sshPoweredBy": "支持者",
"sshErrorNoTarget": "未指定目标", "sshErrorNoTarget": "未指定目标",
"sshErrorWebSocket": "WebSocket 连接失败", "sshErrorWebSocket": "WebSocket 连接失败",
"sshErrorAuthFailed": "身份验证失败", "sshErrorAuthFailed": "身份验证失败",
"sshErrorConnectionClosed": "认证完成前连接已关闭", "sshErrorConnectionClosed": "认证完成前连接已关闭",
"sitePangolinSshDescription": "允许对该站点的资源进行 SSH 访问。可稍后更改。", "sitePangolinSshDescription": "Allow SSH access to resources on this site. This can be changed later.",
"browserGatewayNoResourceForDomain": "未找到该域的资源", "browserGatewayNoResourceForDomain": "No resource found for this domain",
"browserGatewayNoTarget": "没有目标", "browserGatewayNoTarget": "No target",
"browserGatewayConnect": "连接", "browserGatewayConnect": "Connect",
"browserGatewayCtrlAltDel": "Ctrl+Alt+Del", "browserGatewayCtrlAltDel": "Ctrl+Alt+Del",
"sshErrorSignKeyFailed": "签署 SSH 密钥以进行 PAM 推送身份验证失败。您以用户身份登录了吗?", "sshErrorSignKeyFailed": "Failed to sign SSH key for PAM push authentication. Did you sign in as a user?",
"sshTerminalError": "错误: {error}", "sshTerminalError": "Error: {error}",
"sshConnectionClosedCode": "连接关闭 (代码 {code})", "sshConnectionClosedCode": "Connection closed (code {code})",
"sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----", "sshPrivateKeyPlaceholder": "-----BEGIN OPENSSH PRIVATE KEY-----",
"sshPrivateKeyRequired": "需要私钥", "sshPrivateKeyRequired": "Private key is required",
"vncTitle": "VNC", "vncTitle": "VNC",
"vncSignInDescription": "输入您的 VNC 密码以连接", "vncSignInDescription": "Enter your VNC password to connect",
"vncPasswordOptional": "密码 (可选)", "vncPasswordOptional": "Password (optional)",
"vncNoResourceTarget": "没有可用的资源目标", "vncNoResourceTarget": "No resource target is available",
"vncFailedToLoadNovnc": "加载 noVNC 失败", "vncFailedToLoadNovnc": "Failed to load noVNC",
"vncAuthFailedStatus": "状态 {status}", "vncAuthFailedStatus": "Status {status}",
"vncPasteClipboard": "粘贴剪贴板", "vncPasteClipboard": "Paste clipboard",
"rdpTitle": "RDP", "rdpTitle": "RDP",
"rdpSignInTitle": "登录到远程桌面", "rdpSignInTitle": "Sign in to Remote Desktop",
"rdpSignInDescription": "输入 Windows 凭据以连接", "rdpSignInDescription": "Enter Windows credentials to connect",
"rdpLoadingModule": "加载模块中……", "rdpLoadingModule": "Loading module...",
"rdpFailedToLoadModule": "加载 RDP 模块失败", "rdpFailedToLoadModule": "Failed to load RDP module",
"rdpNotReady": "未准备好", "rdpNotReady": "Not ready",
"rdpModuleInitializing": "RDP 模块仍在初始化中", "rdpModuleInitializing": "RDP module is still initializing",
"rdpDownloadingFiles": "正在从远程下载 {count} 个文件...", "rdpDownloadingFiles": "Downloading {count} file(s) from remote…",
"rdpDownloadFailed": "下载失败: {fileName}", "rdpDownloadFailed": "Download failed: {fileName}",
"rdpUploaded": "已上传: {fileName}", "rdpUploaded": "Uploaded: {fileName}",
"rdpNoConnectionTarget": "没有可用的连接目标", "rdpNoConnectionTarget": "No connection target available",
"rdpConnectionFailed": "连接失败", "rdpConnectionFailed": "Connection failed",
"rdpFit": "适合", "rdpFit": "Fit",
"rdpFull": "完整", "rdpFull": "Full",
"rdpReal": "真实", "rdpReal": "Real",
"rdpMeta": "元数据", "rdpMeta": "Meta",
"rdpUploadFiles": "上传文件", "rdpUploadFiles": "Upload files",
"rdpFilesReadyToPaste": "文件准备好粘贴", "rdpFilesReadyToPaste": "Files ready to paste",
"rdpFilesReadyToPasteDescription": "已将 {count} 个文件复制到远程剪贴板——在远程桌面上按 Ctrl+V 进行粘贴", "rdpFilesReadyToPasteDescription": "{count} file(s) copied to remote clipboard — press Ctrl+V on the remote desktop to paste.",
"rdpUploadFailed": "上传失败", "rdpUploadFailed": "Upload failed",
"rdpUnicodeKeyboardMode": "Unicode 键盘模式", "rdpUnicodeKeyboardMode": "Unicode keyboard mode",
"sessionToolbarShow": "显示工具栏", "sessionToolbarShow": "Show toolbar",
"sessionToolbarHide": "隐藏工具栏" "sessionToolbarHide": "Hide toolbar"
} }
+2 -2
View File
@@ -152,8 +152,8 @@
"shareErrorSelectResource": "請選擇一個資源", "shareErrorSelectResource": "請選擇一個資源",
"proxyResourceTitle": "管理公開資源", "proxyResourceTitle": "管理公開資源",
"proxyResourceDescription": "建立和管理可透過網頁瀏覽器公開存取的資源", "proxyResourceDescription": "建立和管理可透過網頁瀏覽器公開存取的資源",
"publicResourcesBannerTitle": "基於網頁的公開存取", "proxyResourcesBannerTitle": "基於網頁的公開存取",
"publicResourcesBannerDescription": "公開資源是任何人都可以透過網頁瀏覽器存取的 HTTPS 或 TCP/UDP 代理。與私有資源不同,它們不需要客戶端軟體,並且可以包含基於身份和情境感知的存取策略。", "proxyResourcesBannerDescription": "公開資源是任何人都可以透過網頁瀏覽器存取的 HTTPS 或 TCP/UDP 代理。與私有資源不同,它們不需要客戶端軟體,並且可以包含基於身份和情境感知的存取策略。",
"clientResourceTitle": "管理私有資源", "clientResourceTitle": "管理私有資源",
"clientResourceDescription": "建立和管理只能透過已連接的客戶端存取的資源", "clientResourceDescription": "建立和管理只能透過已連接的客戶端存取的資源",
"privateResourcesBannerTitle": "零信任私有存取", "privateResourcesBannerTitle": "零信任私有存取",
+17 -89
View File
@@ -1,12 +1,6 @@
import { db } from "@server/db"; import { db } from "@server/db";
import { and, eq, inArray, isNull, or } from "drizzle-orm"; import { and, eq, inArray } from "drizzle-orm";
import { import { roleResources, userResources } from "@server/db";
rolePolicies,
roleResources,
resources,
userPolicies,
userResources
} from "@server/db";
export async function canUserAccessResource({ export async function canUserAccessResource({
userId, userId,
@@ -17,14 +11,9 @@ export async function canUserAccessResource({
resourceId: number; resourceId: number;
roleIds: number[]; roleIds: number[];
}): Promise<boolean> { }): Promise<boolean> {
const [ const roleResourceAccess =
roleResourceAccess,
rolePolicyAccess,
userResourceAccess,
userPolicyAccess
] = await Promise.all([
roleIds.length > 0 roleIds.length > 0
? db ? await db
.select() .select()
.from(roleResources) .from(roleResources)
.where( .where(
@@ -34,41 +23,13 @@ export async function canUserAccessResource({
) )
) )
.limit(1) .limit(1)
: [], : [];
roleIds.length > 0
? db if (roleResourceAccess.length > 0) {
.select({ return true;
roleId: rolePolicies.roleId, }
resourcePolicyId: rolePolicies.resourcePolicyId
}) const userResourceAccess = await db
.from(rolePolicies)
.innerJoin(
resources,
// Shared policy wins; only use default policy when no shared
// policy is assigned to the resource.
or(
eq(
resources.resourcePolicyId,
rolePolicies.resourcePolicyId
),
and(
isNull(resources.resourcePolicyId),
eq(
resources.defaultResourcePolicyId,
rolePolicies.resourcePolicyId
)
)
)
)
.where(
and(
eq(resources.resourceId, resourceId),
inArray(rolePolicies.roleId, roleIds)
)
)
.limit(1)
: [],
db
.select() .select()
.from(userResources) .from(userResources)
.where( .where(
@@ -77,44 +38,11 @@ export async function canUserAccessResource({
eq(userResources.resourceId, resourceId) eq(userResources.resourceId, resourceId)
) )
) )
.limit(1), .limit(1);
db
.select({
userId: userPolicies.userId,
resourcePolicyId: userPolicies.resourcePolicyId
})
.from(userPolicies)
.innerJoin(
resources,
// Shared policy wins; only use default policy when no shared
// policy is assigned to the resource.
or(
eq(
resources.resourcePolicyId,
userPolicies.resourcePolicyId
),
and(
isNull(resources.resourcePolicyId),
eq(
resources.defaultResourcePolicyId,
userPolicies.resourcePolicyId
)
)
)
)
.where(
and(
eq(resources.resourceId, resourceId),
eq(userPolicies.userId, userId)
)
)
.limit(1)
]);
return ( if (userResourceAccess.length > 0) {
roleResourceAccess.length > 0 || return true;
rolePolicyAccess.length > 0 || }
userResourceAccess.length > 0 ||
userPolicyAccess.length > 0 return false;
);
} }
+1 -1
View File
@@ -87,7 +87,7 @@ function createDb() {
export const db = createDb(); export const db = createDb();
export default db; export default db;
export const primaryDb = db.$primary as typeof db; // is this typeof a problem - technically they are different types export const primaryDb = db.$primary as typeof db; // is this typeof a problem - techincally they are different types
export type Transaction = Parameters< export type Transaction = Parameters<
Parameters<(typeof db)["transaction"]>[0] Parameters<(typeof db)["transaction"]>[0]
>[0]; >[0];
+3 -2
View File
@@ -2,7 +2,7 @@ import { drizzle as DrizzlePostgres } from "drizzle-orm/node-postgres";
import { readConfigFile } from "@server/lib/readConfigFile"; import { readConfigFile } from "@server/lib/readConfigFile";
import { withReplicas } from "drizzle-orm/pg-core"; import { withReplicas } from "drizzle-orm/pg-core";
import { build } from "@server/build"; import { build } from "@server/build";
import { db as mainDb } from "./driver"; import { db as mainDb, primaryDb as mainPrimaryDb } from "./driver";
import { createPool } from "./poolConfig"; import { createPool } from "./poolConfig";
function createLogsDb() { function createLogsDb() {
@@ -63,7 +63,8 @@ function createLogsDb() {
}) })
); );
} else { } else {
const maxReplicaConnections = poolConfig?.max_replica_connections || 20; const maxReplicaConnections =
poolConfig?.max_replica_connections || 20;
for (const conn of replicaConnections) { for (const conn of replicaConnections) {
const replicaPool = createPool( const replicaPool = createPool(
conn.connection_string, conn.connection_string,
+3 -2
View File
@@ -1,4 +1,5 @@
import { Pool, PoolConfig } from "pg"; import { Pool, PoolConfig } from "pg";
import logger from "@server/logger";
export function createPoolConfig( export function createPoolConfig(
connectionString: string, connectionString: string,
@@ -26,7 +27,7 @@ export function attachPoolErrorHandlers(pool: Pool, label: string): void {
pool.on("error", (err) => { pool.on("error", (err) => {
// This catches errors on idle clients in the pool. Without this // This catches errors on idle clients in the pool. Without this
// handler an unexpected disconnect would crash the process. // handler an unexpected disconnect would crash the process.
console.error( logger.error(
`Unexpected error on idle ${label} database client: ${err.message}` `Unexpected error on idle ${label} database client: ${err.message}`
); );
}); });
@@ -35,7 +36,7 @@ export function attachPoolErrorHandlers(pool: Pool, label: string): void {
// Set a statement timeout on every new connection so a single slow // Set a statement timeout on every new connection so a single slow
// query can't block the pool forever // query can't block the pool forever
client.query("SET statement_timeout = '30s'").catch((err: Error) => { client.query("SET statement_timeout = '30s'").catch((err: Error) => {
console.warn( logger.warn(
`Failed to set statement_timeout on ${label} client: ${err.message}` `Failed to set statement_timeout on ${label} client: ${err.message}`
); );
}); });
+21
View File
@@ -580,6 +580,24 @@ export const trialNotifications = pgTable("trialNotifications", {
sentAt: bigint("sentAt", { mode: "number" }).notNull() sentAt: bigint("sentAt", { mode: "number" }).notNull()
}); });
export const browserGatewayTarget = pgTable("browserGatewayTarget", {
browserGatewayTargetId: serial("browserGatewayTargetId").primaryKey(),
resourceId: integer("resourceId")
.references(() => resources.resourceId, {
onDelete: "cascade"
})
.notNull(),
siteId: integer("siteId")
.references(() => sites.siteId, {
onDelete: "cascade"
})
.notNull(),
authToken: varchar("authToken").notNull(),
type: varchar("type").notNull(), // "ssh", "rdp", "vnc"
destination: varchar("destination").notNull(),
destinationPort: integer("destinationPort").notNull()
});
export type Approval = InferSelectModel<typeof approvals>; export type Approval = InferSelectModel<typeof approvals>;
export type Limit = InferSelectModel<typeof limits>; export type Limit = InferSelectModel<typeof limits>;
export type Account = InferSelectModel<typeof account>; export type Account = InferSelectModel<typeof account>;
@@ -627,3 +645,6 @@ export type AlertEmailRecipients = InferSelectModel<
>; >;
export type AlertWebhookActions = InferSelectModel<typeof alertWebhookActions>; export type AlertWebhookActions = InferSelectModel<typeof alertWebhookActions>;
export type TrialNotification = InferSelectModel<typeof trialNotifications>; export type TrialNotification = InferSelectModel<typeof trialNotifications>;
export type BrowserGatewayTarget = InferSelectModel<
typeof browserGatewayTarget
>;
+7 -12
View File
@@ -147,10 +147,12 @@ export const resources = pgTable("resources", {
}), }),
ssl: boolean("ssl").notNull().default(false), ssl: boolean("ssl").notNull().default(false),
blockAccess: boolean("blockAccess").notNull().default(false), blockAccess: boolean("blockAccess").notNull().default(false),
sso: boolean("sso").notNull().default(true),
proxyPort: integer("proxyPort"), proxyPort: integer("proxyPort"),
sso: boolean("sso"), emailWhitelistEnabled: boolean("emailWhitelistEnabled")
emailWhitelistEnabled: boolean("emailWhitelistEnabled"), .notNull()
applyRules: boolean("applyRules"), .default(false),
applyRules: boolean("applyRules").notNull().default(false),
enabled: boolean("enabled").notNull().default(true), enabled: boolean("enabled").notNull().default(true),
stickySession: boolean("stickySession").notNull().default(false), stickySession: boolean("stickySession").notNull().default(false),
tlsServerName: varchar("tlsServerName"), tlsServerName: varchar("tlsServerName"),
@@ -288,12 +290,7 @@ export const targets = pgTable("targets", {
pathMatchType: text("pathMatchType"), // exact, prefix, regex pathMatchType: text("pathMatchType"), // exact, prefix, regex
rewritePath: text("rewritePath"), // if set, rewrites the path to this value before sending to the target rewritePath: text("rewritePath"), // if set, rewrites the path to this value before sending to the target
rewritePathType: text("rewritePathType"), // exact, prefix, regex, stripPrefix rewritePathType: text("rewritePathType"), // exact, prefix, regex, stripPrefix
priority: integer("priority").notNull().default(100), priority: integer("priority").notNull().default(100)
mode: varchar("mode")
.$type<"http" | "tcp" | "udp" | "ssh" | "rdp" | "vnc">()
.notNull()
.default("http"),
authToken: varchar("authToken")
}); });
export const targetHealthCheck = pgTable("targetHealthCheck", { export const targetHealthCheck = pgTable("targetHealthCheck", {
@@ -889,9 +886,7 @@ export const resourcePolicyRules = pgTable("resourcePolicyRules", {
enabled: boolean("enabled").notNull().default(true), enabled: boolean("enabled").notNull().default(true),
priority: integer("priority").notNull(), priority: integer("priority").notNull(),
action: varchar("action").$type<"ACCEPT" | "DROP" | "PASS">().notNull(), action: varchar("action").$type<"ACCEPT" | "DROP" | "PASS">().notNull(),
match: varchar("match") match: varchar("match").$type<"CIDR" | "PATH" | "IP">().notNull(),
.$type<"CIDR" | "PATH" | "IP" | "COUNTRY" | "ASN" | "REGION">()
.notNull(),
value: varchar("value").notNull() value: varchar("value").notNull()
}); });
+3 -3
View File
@@ -45,9 +45,9 @@ export type ResourceWithAuth = {
password: ResourcePassword | ResourcePolicyPassword | null; password: ResourcePassword | ResourcePolicyPassword | null;
headerAuth: ResourceHeaderAuth | ResourcePolicyHeaderAuth | null; headerAuth: ResourceHeaderAuth | ResourcePolicyHeaderAuth | null;
headerAuthExtendedCompatibility: ResourceHeaderAuthExtendedCompatibility | null; headerAuthExtendedCompatibility: ResourceHeaderAuthExtendedCompatibility | null;
applyRules: boolean | null; applyRules: boolean;
sso: boolean | null; sso: boolean;
emailWhitelistEnabled: boolean | null; emailWhitelistEnabled: boolean;
org: Org; org: Org;
}; };
+23
View File
@@ -588,6 +588,26 @@ export const trialNotifications = sqliteTable("trialNotifications", {
sentAt: integer("sentAt").notNull() sentAt: integer("sentAt").notNull()
}); });
export const browserGatewayTarget = sqliteTable("browserGatewayTarget", {
browserGatewayTargetId: integer("browserGatewayTargetId").primaryKey({
autoIncrement: true
}),
resourceId: integer("resourceId")
.references(() => resources.resourceId, {
onDelete: "cascade"
})
.notNull(),
siteId: integer("siteId")
.references(() => sites.siteId, {
onDelete: "cascade"
})
.notNull(),
authToken: text("authToken").notNull(),
type: text("type").notNull(), // "ssh", "rdp", "vnc"
destination: text("destination").notNull(),
destinationPort: integer("destinationPort").notNull()
});
export type Approval = InferSelectModel<typeof approvals>; export type Approval = InferSelectModel<typeof approvals>;
export type Limit = InferSelectModel<typeof limits>; export type Limit = InferSelectModel<typeof limits>;
export type Account = InferSelectModel<typeof account>; export type Account = InferSelectModel<typeof account>;
@@ -627,3 +647,6 @@ export type AlertEmailAction = InferSelectModel<typeof alertEmailActions>;
export type AlertEmailRecipient = InferSelectModel<typeof alertEmailRecipients>; export type AlertEmailRecipient = InferSelectModel<typeof alertEmailRecipients>;
export type AlertWebhookAction = InferSelectModel<typeof alertWebhookActions>; export type AlertWebhookAction = InferSelectModel<typeof alertWebhookActions>;
export type TrialNotification = InferSelectModel<typeof trialNotifications>; export type TrialNotification = InferSelectModel<typeof trialNotifications>;
export type BrowserGatewayTarget = InferSelectModel<
typeof browserGatewayTarget
>;
+9 -14
View File
@@ -165,12 +165,14 @@ export const resources = sqliteTable("resources", {
blockAccess: integer("blockAccess", { mode: "boolean" }) blockAccess: integer("blockAccess", { mode: "boolean" })
.notNull() .notNull()
.default(false), .default(false),
sso: integer("sso", { mode: "boolean" }).notNull().default(true),
proxyPort: integer("proxyPort"), proxyPort: integer("proxyPort"),
sso: integer("sso", { mode: "boolean" }), emailWhitelistEnabled: integer("emailWhitelistEnabled", { mode: "boolean" })
emailWhitelistEnabled: integer("emailWhitelistEnabled", { .notNull()
mode: "boolean" .default(false),
}), applyRules: integer("applyRules", { mode: "boolean" })
applyRules: integer("applyRules", { mode: "boolean" }), .notNull()
.default(false),
enabled: integer("enabled", { mode: "boolean" }).notNull().default(true), enabled: integer("enabled", { mode: "boolean" }).notNull().default(true),
stickySession: integer("stickySession", { mode: "boolean" }) stickySession: integer("stickySession", { mode: "boolean" })
.notNull() .notNull()
@@ -320,12 +322,7 @@ export const targets = sqliteTable("targets", {
pathMatchType: text("pathMatchType"), // exact, prefix, regex pathMatchType: text("pathMatchType"), // exact, prefix, regex
rewritePath: text("rewritePath"), // if set, rewrites the path to this value before sending to the target rewritePath: text("rewritePath"), // if set, rewrites the path to this value before sending to the target
rewritePathType: text("rewritePathType"), // exact, prefix, regex, stripPrefix rewritePathType: text("rewritePathType"), // exact, prefix, regex, stripPrefix
priority: integer("priority").notNull().default(100), priority: integer("priority").notNull().default(100)
mode: text("mode")
.$type<"http" | "tcp" | "udp" | "ssh" | "rdp" | "vnc">()
.notNull()
.default("http"),
authToken: text("authToken")
}); });
export const targetHealthCheck = sqliteTable("targetHealthCheck", { export const targetHealthCheck = sqliteTable("targetHealthCheck", {
@@ -1251,9 +1248,7 @@ export const resourcePolicyRules = sqliteTable("resourcePolicyRules", {
enabled: integer("enabled", { mode: "boolean" }).notNull().default(true), enabled: integer("enabled", { mode: "boolean" }).notNull().default(true),
priority: integer("priority").notNull(), priority: integer("priority").notNull(),
action: text("action").$type<"ACCEPT" | "DROP" | "PASS">().notNull(), action: text("action").$type<"ACCEPT" | "DROP" | "PASS">().notNull(),
match: text("match") match: text("match").$type<"CIDR" | "PATH" | "IP">().notNull(),
.$type<"CIDR" | "PATH" | "IP" | "COUNTRY" | "ASN" | "REGION">()
.notNull(),
value: text("value").notNull() value: text("value").notNull()
}); });
+1 -3
View File
@@ -157,9 +157,7 @@ function getOpenApiDocumentation() {
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z data: z.unknown().nullable(),
.record(z.string(), z.any())
.nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
+13 -3
View File
@@ -31,7 +31,7 @@ export enum TierFeature {
} }
export const tierMatrix: Record<TierFeature, Tier[]> = { export const tierMatrix: Record<TierFeature, Tier[]> = {
[TierFeature.Labels]: ["tier1", "tier2", "tier3", "enterprise"], [TierFeature.Labels]: ["tier2", "tier3", "enterprise"],
[TierFeature.OrgOidc]: ["tier1", "tier2", "tier3", "enterprise"], [TierFeature.OrgOidc]: ["tier1", "tier2", "tier3", "enterprise"],
[TierFeature.LoginPageDomain]: ["tier1", "tier2", "tier3", "enterprise"], [TierFeature.LoginPageDomain]: ["tier1", "tier2", "tier3", "enterprise"],
[TierFeature.DeviceApprovals]: ["tier1", "tier3", "enterprise"], [TierFeature.DeviceApprovals]: ["tier1", "tier3", "enterprise"],
@@ -71,6 +71,16 @@ export const tierMatrix: Record<TierFeature, Tier[]> = {
[TierFeature.WildcardSubdomain]: ["tier1", "tier2", "tier3", "enterprise"], [TierFeature.WildcardSubdomain]: ["tier1", "tier2", "tier3", "enterprise"],
[TierFeature.NewtAutoUpdate]: ["tier1", "tier2", "tier3", "enterprise"], [TierFeature.NewtAutoUpdate]: ["tier1", "tier2", "tier3", "enterprise"],
[TierFeature.ResourcePolicies]: ["tier3", "enterprise"], [TierFeature.ResourcePolicies]: ["tier3", "enterprise"],
[TierFeature.AdvancedPublicResources]: ["tier3", "enterprise"], [TierFeature.AdvancedPublicResources]: [
[TierFeature.AdvancedPrivateResources]: ["tier3", "enterprise"] "tier1",
"tier2",
"tier3",
"enterprise"
],
[TierFeature.AdvancedPrivateResources]: [
"tier1",
"tier2",
"tier3",
"enterprise"
]
}; };
+9 -32
View File
@@ -10,23 +10,16 @@ import {
clientSiteResources clientSiteResources
} from "@server/db"; } from "@server/db";
import { Config, ConfigSchema } from "./types"; import { Config, ConfigSchema } from "./types";
import { import { ProxyResourcesResults, updateProxyResources } from "./proxyResources";
PublicResourcesResults,
updatePublicResources
} from "./publicResources";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import logger from "@server/logger"; import logger from "@server/logger";
import { sites } from "@server/db"; import { sites } from "@server/db";
import { eq, and, isNotNull } from "drizzle-orm"; import { eq, and, isNotNull } from "drizzle-orm";
import { import { addTargets as addProxyTargets } from "@server/routers/newt/targets";
addTargets as addProxyTargets,
sendBrowserGatewayTargets
} from "@server/routers/newt/targets";
import { import {
ClientResourcesResults, ClientResourcesResults,
updatePrivateResources updateClientResources
} from "./privateResources"; } from "./clientResources";
import { updateResourcePolicies } from "./resourcePolicies";
import { BlueprintSource } from "@server/routers/blueprints/types"; import { BlueprintSource } from "@server/routers/blueprints/types";
import { stringify as stringifyYaml } from "yaml"; import { stringify as stringifyYaml } from "yaml";
import { generateName } from "@server/db/names"; import { generateName } from "@server/db/names";
@@ -60,18 +53,16 @@ export async function applyBlueprint({
let error: any | null = null; let error: any | null = null;
try { try {
let proxyResourcesResults: PublicResourcesResults = []; let proxyResourcesResults: ProxyResourcesResults = [];
let clientResourcesResults: ClientResourcesResults = []; let clientResourcesResults: ClientResourcesResults = [];
await db.transaction(async (trx) => { await db.transaction(async (trx) => {
await updateResourcePolicies(orgId, config, trx); proxyResourcesResults = await updateProxyResources(
proxyResourcesResults = await updatePublicResources(
orgId, orgId,
config, config,
trx, trx,
siteId siteId
); );
clientResourcesResults = await updatePrivateResources( clientResourcesResults = await updateClientResources(
orgId, orgId,
config, config,
trx, trx,
@@ -110,27 +101,13 @@ export async function applyBlueprint({
(hc) => hc.targetId === target.targetId (hc) => hc.targetId === target.targetId
); );
if (["http", "tcp", "udp"].includes(target.mode)) {
await addProxyTargets( await addProxyTargets(
site.newt.newtId, site.newt.newtId,
[target], [target],
matchingHealthcheck matchingHealthcheck ? [matchingHealthcheck] : [],
? [matchingHealthcheck] result.proxyResource.mode === "udp" ? "udp" : "tcp",
: [],
result.proxyResource.mode === "udp"
? "udp"
: "tcp",
site.newt.version site.newt.version
); );
} else if (
["ssh", "rdp", "vnc"].includes(target.mode)
) {
await sendBrowserGatewayTargets(
site.newt.newtId,
[target],
site.newt.version
);
}
} }
} }
} }
@@ -71,10 +71,7 @@ export async function applyNewtDockerBlueprint(
let skippedKeys: string[] = []; let skippedKeys: string[] = [];
try { try {
// Some Newt clients can report null/undefined containers when Docker const blueprint = processContainerLabels(containers);
// labels are unavailable. Treat that as an empty blueprint payload.
const safeContainers = Array.isArray(containers) ? containers : [];
const blueprint = processContainerLabels(safeContainers);
logger.debug( logger.debug(
`Received Docker blueprint with ${Object.keys(blueprint["proxy-resources"]).length} proxy, ${Object.keys(blueprint["client-resources"]).length} client resource(s)` `Received Docker blueprint with ${Object.keys(blueprint["proxy-resources"]).length} proxy, ${Object.keys(blueprint["client-resources"]).length} client resource(s)`
@@ -23,8 +23,6 @@ import logger from "@server/logger";
import { defaultRoleAllowedActions } from "@server/routers/role/createRole"; import { defaultRoleAllowedActions } from "@server/routers/role/createRole";
import { getNextAvailableAliasAddress } from "../ip"; import { getNextAvailableAliasAddress } from "../ip";
import { createCertificate } from "#dynamic/routers/certificates/createCertificate"; import { createCertificate } from "#dynamic/routers/certificates/createCertificate";
import { isLicensedOrSubscribed } from "#dynamic/lib/isLicencedOrSubscribed";
import { tierMatrix } from "../billing/tierMatrix";
async function getDomainForSiteResource( async function getDomainForSiteResource(
siteResourceId: number | undefined, siteResourceId: number | undefined,
@@ -105,7 +103,7 @@ export type ClientResourcesResults = {
oldSites: { siteId: number }[]; oldSites: { siteId: number }[];
}[]; }[];
export async function updatePrivateResources( export async function updateClientResources(
orgId: string, orgId: string,
config: Config, config: Config,
trx: Transaction, trx: Transaction,
@@ -116,30 +114,6 @@ export async function updatePrivateResources(
for (const [resourceNiceId, resourceData] of Object.entries( for (const [resourceNiceId, resourceData] of Object.entries(
config["client-resources"] config["client-resources"]
)) { )) {
if (resourceData.mode === "http") {
const hasHttpFeature = await isLicensedOrSubscribed(
orgId,
tierMatrix.advancedPrivateResources
);
if (!hasHttpFeature) {
throw new Error(
"HTTP private resources are not included in your current plan. Please upgrade."
);
}
}
if (resourceData.mode === "ssh") {
const hasSshFeature = await isLicensedOrSubscribed(
orgId,
tierMatrix.advancedPrivateResources
);
if (!hasSshFeature) {
throw new Error(
"SSH private resources are not included in your current plan. Please upgrade."
);
}
}
const [existingResource] = await trx const [existingResource] = await trx
.select() .select()
.from(siteResources) .from(siteResources)
@@ -392,9 +366,7 @@ export async function updatePrivateResources(
})) }))
); );
existingRoles.push(created); existingRoles.push(created);
logger.info( logger.info(`Auto-created role "${name}" in org ${orgId} from blueprint`);
`Auto-created role "${name}" in org ${orgId} from blueprint`
);
} }
const roleIds = existingRoles.map((role) => role.roleId); const roleIds = existingRoles.map((role) => role.roleId);
@@ -415,11 +387,7 @@ export async function updatePrivateResources(
} else { } else {
let aliasAddress: string | null = null; let aliasAddress: string | null = null;
let releaseAliasLock: (() => Promise<void>) | null = null; let releaseAliasLock: (() => Promise<void>) | null = null;
if ( if (resourceData.mode === "host" || resourceData.mode === "http") {
resourceData.mode === "host" ||
resourceData.mode === "http" ||
resourceData.mode === "ssh"
) {
const { value, release } = await getNextAvailableAliasAddress( const { value, release } = await getNextAvailableAliasAddress(
orgId, orgId,
trx trx
@@ -542,9 +510,7 @@ export async function updatePrivateResources(
})) }))
); );
existingRoles.push(created); existingRoles.push(created);
logger.info( logger.info(`Auto-created role "${name}" in org ${orgId} from blueprint`);
`Auto-created role "${name}" in org ${orgId} from blueprint`
);
} }
const roleIds = existingRoles.map((role) => role.roleId); const roleIds = existingRoles.map((role) => role.roleId);
@@ -47,24 +47,20 @@ import { isLicensedOrSubscribed } from "#dynamic/lib/isLicencedOrSubscribed";
import { fireHealthCheckUnknownAlert } from "@server/lib/alerts"; import { fireHealthCheckUnknownAlert } from "@server/lib/alerts";
import { tierMatrix } from "../billing/tierMatrix"; import { tierMatrix } from "../billing/tierMatrix";
import { defaultRoleAllowedActions } from "@server/routers/role/createRole"; import { defaultRoleAllowedActions } from "@server/routers/role/createRole";
import { build } from "@server/build";
import { encrypt } from "@server/lib/crypto";
import { generateId } from "@server/auth/sessions/app";
import serverConfig from "@server/lib/config";
export type PublicResourcesResults = { export type ProxyResourcesResults = {
proxyResource: Resource; proxyResource: Resource;
targetsToUpdate: Target[]; targetsToUpdate: Target[];
healthchecksToUpdate: TargetHealthCheck[]; healthchecksToUpdate: TargetHealthCheck[];
}[]; }[];
export async function updatePublicResources( export async function updateProxyResources(
orgId: string, orgId: string,
config: Config, config: Config,
trx: Transaction, trx: Transaction,
siteId?: number siteId?: number
): Promise<PublicResourcesResults> { ): Promise<ProxyResourcesResults> {
const results: PublicResourcesResults = []; const results: ProxyResourcesResults = [];
for (const [resourceNiceId, resourceData] of Object.entries( for (const [resourceNiceId, resourceData] of Object.entries(
config["proxy-resources"] config["proxy-resources"]
@@ -83,7 +79,7 @@ export async function updatePublicResources(
if (targetSiteId) { if (targetSiteId) {
// Look up site by niceId // Look up site by niceId
[site] = await trx [site] = await trx
.select({ siteId: sites.siteId, type: sites.type }) .select({ siteId: sites.siteId })
.from(sites) .from(sites)
.where( .where(
and( and(
@@ -95,7 +91,7 @@ export async function updatePublicResources(
} else if (siteId) { } else if (siteId) {
// Use the provided siteId directly, but verify it belongs to the org // Use the provided siteId directly, but verify it belongs to the org
[site] = await trx [site] = await trx
.select({ siteId: sites.siteId, type: sites.type }) .select({ siteId: sites.siteId })
.from(sites) .from(sites)
.where( .where(
and(eq(sites.siteId, siteId), eq(sites.orgId, orgId)) and(eq(sites.siteId, siteId), eq(sites.orgId, orgId))
@@ -122,15 +118,6 @@ export async function updatePublicResources(
internalPortToCreate = targetData["internal-port"]; internalPortToCreate = targetData["internal-port"];
} }
let authToken: string | undefined;
if (site.type !== "local") {
const plainToken = generateId(48);
authToken = encrypt(
plainToken,
serverConfig.getRawConfig().server.secret!
);
}
// Create target // Create target
const [newTarget] = await trx const [newTarget] = await trx
.insert(targets) .insert(targets)
@@ -138,12 +125,10 @@ export async function updatePublicResources(
resourceId: resourceId, resourceId: resourceId,
siteId: site.siteId, siteId: site.siteId,
ip: targetData.hostname, ip: targetData.hostname,
mode: resourceData.mode as Target["mode"],
method: targetData.method, method: targetData.method,
port: targetData.port, port: targetData.port,
enabled: targetData.enabled, enabled: targetData.enabled,
internalPort: internalPortToCreate, internalPort: internalPortToCreate,
authToken: authToken,
path: targetData.path, path: targetData.path,
pathMatchType: targetData["path-match"], pathMatchType: targetData["path-match"],
rewritePath: rewritePath:
@@ -237,59 +222,17 @@ export async function updatePublicResources(
headers = JSON.stringify(resourceData.headers); headers = JSON.stringify(resourceData.headers);
} }
if (["ssh", "rdp", "vnc"].includes(resourceData.mode || "")) {
const isLicensed = await isLicensedOrSubscribed(
orgId,
tierMatrix.advancedPublicResources
);
if (!isLicensed) {
throw new Error(
"Your current subscription does not support browser gateway resources. Please upgrade to access this feature."
);
}
}
if (resourceData.policy) {
const isLicensed = await isLicensedOrSubscribed(
orgId,
tierMatrix.resourcePolicies
);
if (!isLicensed) {
throw new Error(
"Your current subscription does not support shared resource policies. Please upgrade to access this feature."
);
}
}
if (existingResource) { if (existingResource) {
let domain; let domain;
if ( if (
["http", "ssh", "rdp", "vnc"].includes(resourceData.mode || "") ["http", "ssh", "rdp", "vnc"].includes(resourceData.mode || "")
) { ) {
if (resourceData["full-domain"]?.startsWith("*.")) {
const isLicensed = await isLicensedOrSubscribed(
orgId,
tierMatrix.wildcardSubdomain
);
if (!isLicensed) {
throw new Error(
"Wildcard subdomains are not supported on your current plan. Please upgrade to access this feature."
);
}
}
domain = await getDomain( domain = await getDomain(
existingResource.resourceId, existingResource.resourceId,
resourceData["full-domain"]!, resourceData["full-domain"]!,
orgId, orgId,
trx trx
); );
await enforceDomainNamespacePaywall(
orgId,
domain.domainId,
trx
);
} }
// check if the only key in the resource is targets, if so, skip the update // check if the only key in the resource is targets, if so, skip the update
@@ -579,13 +522,6 @@ export async function updatePublicResources(
? (resourceData["proxy-protocol-version"] ?? ? (resourceData["proxy-protocol-version"] ??
1) 1)
: 1, : 1,
pamMode:
resourceData["auth-daemon"]?.pam ||
"passthrough",
authDaemonMode:
resourceData["auth-daemon"]?.mode || "native",
authDaemonPort:
resourceData["auth-daemon"]?.port || 22123,
resourcePolicyId: null, resourcePolicyId: null,
defaultResourcePolicyId: inlinePolicyId defaultResourcePolicyId: inlinePolicyId
}) })
@@ -728,8 +664,7 @@ export async function updatePublicResources(
? "/" ? "/"
: undefined), : undefined),
rewritePathType: targetData["rewrite-match"], rewritePathType: targetData["rewrite-match"],
priority: targetData.priority, priority: targetData.priority
mode: resourceData.mode
}) })
.where(eq(targets.targetId, existingTarget.targetId)) .where(eq(targets.targetId, existingTarget.targetId))
.returning(); .returning();
@@ -945,45 +880,7 @@ export async function updatePublicResources(
} }
} else { } else {
// INLINE POLICY MODE: sync rules into policy-level table // INLINE POLICY MODE: sync rules into policy-level table
let inlinePolicyId = resource!.defaultResourcePolicyId; const inlinePolicyId = resource!.defaultResourcePolicyId!;
// Targets-only updates skip the auth/policy update branch above,
// so pre-1.19 resources can still have no inline policy linked.
if (!inlinePolicyId) {
const [adminRole] = await trx
.select()
.from(roles)
.where(
and(eq(roles.isAdmin, true), eq(roles.orgId, orgId))
)
.limit(1);
if (!adminRole) {
throw new Error(`Admin role not found`);
}
inlinePolicyId = await ensureInlinePolicy(
existingResource.defaultResourcePolicyId,
orgId,
resourceNiceId,
adminRole.roleId,
trx
);
[resource] = await trx
.update(resources)
.set({
resourcePolicyId: null,
defaultResourcePolicyId: inlinePolicyId
})
.where(
eq(
resources.resourceId,
existingResource.resourceId
)
)
.returning();
}
// Clear the old resource-level rules table // Clear the old resource-level rules table
await trx await trx
@@ -1009,30 +906,12 @@ export async function updatePublicResources(
if ( if (
["http", "ssh", "rdp", "vnc"].includes(resourceData.mode || "") ["http", "ssh", "rdp", "vnc"].includes(resourceData.mode || "")
) { ) {
if (resourceData["full-domain"]?.startsWith("*.")) {
const isLicensed = await isLicensedOrSubscribed(
orgId,
tierMatrix.wildcardSubdomain
);
if (!isLicensed) {
throw new Error(
"Wildcard subdomains are not supported on your current plan. Please upgrade to access this feature."
);
}
}
domain = await getDomain( domain = await getDomain(
undefined, undefined,
resourceData["full-domain"]!, resourceData["full-domain"]!,
orgId, orgId,
trx trx
); );
await enforceDomainNamespacePaywall(
orgId,
domain.domainId,
trx
);
} }
const isLicensed = await isLicensedOrSubscribed( const isLicensed = await isLicensedOrSubscribed(
@@ -1505,6 +1384,17 @@ async function syncWhitelistUsers(
.where(eq(resourceWhitelist.resourceId, resourceId)); .where(eq(resourceWhitelist.resourceId, resourceId));
for (const email of whitelistUsers) { for (const email of whitelistUsers) {
const [user] = await trx
.select()
.from(users)
.innerJoin(userOrgs, eq(users.userId, userOrgs.userId))
.where(and(eq(users.email, email), eq(userOrgs.orgId, orgId)))
.limit(1);
if (!user) {
throw new Error(`User not found: ${email} in org ${orgId}`);
}
const existingWhitelistEntry = existingWhitelist.find( const existingWhitelistEntry = existingWhitelist.find(
(w) => w.email === email (w) => w.email === email
); );
@@ -1976,37 +1866,6 @@ function checkIfTargetChanged(
return false; return false;
} }
async function enforceDomainNamespacePaywall(
orgId: string,
domainId: string,
trx: Transaction
) {
if (build !== "saas") {
return;
}
const hasDomainNamespaceAccess = await isLicensedOrSubscribed(
orgId,
tierMatrix.domainNamespaces
);
if (hasDomainNamespaceAccess) {
return;
}
const [namespaceDomain] = await trx
.select()
.from(domainNamespaces)
.where(eq(domainNamespaces.domainId, domainId))
.limit(1);
if (namespaceDomain) {
throw new Error(
"Your current subscription does not support custom domain namespaces. Please upgrade to access this feature."
);
}
}
export async function getDomain( export async function getDomain(
resourceId: number | undefined, resourceId: number | undefined,
fullDomain: string, fullDomain: string,
-653
View File
@@ -1,653 +0,0 @@
import {
db,
idp,
idpOrg,
resourcePolicies,
resourcePolicyHeaderAuth,
resourcePolicyPassword,
resourcePolicyPincode,
resourcePolicyRules,
resourcePolicyWhiteList,
rolePolicies,
roles,
Transaction,
userOrgs,
userPolicies,
users
} from "@server/db";
import { eq, and, or } from "drizzle-orm";
import { Config, ResourcePolicyData } from "./types";
import logger from "@server/logger";
import { getUniqueResourcePolicyName } from "@server/db/names";
import { hashPassword } from "@server/auth/password";
import { isValidCIDR, isValidIP, isValidUrlGlobPattern } from "../validators";
import { isLicensedOrSubscribed } from "#dynamic/lib/isLicencedOrSubscribed";
import { tierMatrix } from "../billing/tierMatrix";
export type ResourcePoliciesResults = {
resourcePolicyId: number;
niceId: string;
}[];
export async function updateResourcePolicies(
orgId: string,
config: Config,
trx: Transaction
): Promise<ResourcePoliciesResults> {
const results: ResourcePoliciesResults = [];
for (const [policyNiceId, policyData] of Object.entries(
config["public-policies"]
)) {
const isLicensed = await isLicensedOrSubscribed(
orgId,
tierMatrix.resourcePolicies
);
if (!isLicensed) {
throw new Error(
"Your current subscription does not support shared resource policies. Please upgrade to access this feature."
);
}
// Validate rules
for (const rule of policyData.rules) {
if (rule.match === "cidr" && !isValidCIDR(rule.value)) {
throw new Error(
`Invalid CIDR provided in resource policy '${policyNiceId}': ${rule.value}`
);
} else if (rule.match === "ip" && !isValidIP(rule.value)) {
throw new Error(
`Invalid IP provided in resource policy '${policyNiceId}': ${rule.value}`
);
} else if (
rule.match === "path" &&
!isValidUrlGlobPattern(rule.value)
) {
throw new Error(
`Invalid URL glob pattern provided in resource policy '${policyNiceId}': ${rule.value}`
);
}
}
// Validate auto-login-idp if provided
if (policyData["auto-login-idp"]) {
const [provider] = await trx
.select()
.from(idp)
.innerJoin(idpOrg, eq(idpOrg.idpId, idp.idpId))
.where(
and(
eq(idp.idpId, policyData["auto-login-idp"]),
eq(idpOrg.orgId, orgId)
)
)
.limit(1);
if (!provider) {
throw new Error(
`Identity provider not found for policy '${policyNiceId}' in this organization`
);
}
}
// Look up the admin role
const [adminRole] = await trx
.select()
.from(roles)
.where(and(eq(roles.isAdmin, true), eq(roles.orgId, orgId)))
.limit(1);
if (!adminRole) {
throw new Error("Admin role not found");
}
// Find existing policy by niceId and orgId
const [existingPolicy] = await trx
.select()
.from(resourcePolicies)
.where(
and(
eq(resourcePolicies.niceId, policyNiceId),
eq(resourcePolicies.orgId, orgId)
)
)
.limit(1);
let resourcePolicyId: number;
if (existingPolicy) {
// Update the existing policy
await trx
.update(resourcePolicies)
.set({
name: policyData.name,
sso: policyData.sso ?? true,
idpId: policyData["auto-login-idp"] ?? null,
emailWhitelistEnabled:
policyData["email-whitelist-enabled"] ??
policyData["whitelist-users"].length > 0,
applyRules:
policyData["apply-rules"] || policyData.rules.length > 0
})
.where(
eq(
resourcePolicies.resourcePolicyId,
existingPolicy.resourcePolicyId
)
);
resourcePolicyId = existingPolicy.resourcePolicyId;
// Sync password
await trx
.delete(resourcePolicyPassword)
.where(
eq(
resourcePolicyPassword.resourcePolicyId,
resourcePolicyId
)
);
if (policyData.password) {
const passwordHash = await hashPassword(policyData.password);
await trx.insert(resourcePolicyPassword).values({
resourcePolicyId,
passwordHash
});
}
// Sync pincode
await trx
.delete(resourcePolicyPincode)
.where(
eq(resourcePolicyPincode.resourcePolicyId, resourcePolicyId)
);
if (policyData.pincode) {
const pincodeHash = await hashPassword(policyData.pincode);
await trx.insert(resourcePolicyPincode).values({
resourcePolicyId,
pincodeHash,
digitLength: 6
});
}
// Sync header auth
await trx
.delete(resourcePolicyHeaderAuth)
.where(
eq(
resourcePolicyHeaderAuth.resourcePolicyId,
resourcePolicyId
)
);
if (policyData["basic-auth"]) {
const basicAuth = policyData["basic-auth"];
const headerAuthHash = await hashPassword(
Buffer.from(
`${basicAuth.user}:${basicAuth.password}`
).toString("base64")
);
await trx.insert(resourcePolicyHeaderAuth).values({
resourcePolicyId,
headerAuthHash,
extendedCompatibility:
basicAuth["extended-compatibility"] ?? true
});
}
// Sync SSO roles
await syncRolePolicies(
resourcePolicyId,
policyData["sso-roles"],
orgId,
adminRole.roleId,
trx
);
// Sync SSO users
await syncUserPolicies(
resourcePolicyId,
policyData["sso-users"],
orgId,
trx
);
// Sync whitelist users
await syncWhitelistPolicyUsers(
resourcePolicyId,
policyData["whitelist-users"],
trx
);
// Sync rules
await syncPolicyRules(resourcePolicyId, policyData.rules, trx);
logger.debug(
`Updated resource policy ${resourcePolicyId} (${policyNiceId})`
);
} else {
// Create a new policy
const [newPolicy] = await trx
.insert(resourcePolicies)
.values({
niceId: policyNiceId,
orgId,
name: policyData.name,
sso: policyData.sso ?? true,
idpId: policyData["auto-login-idp"] ?? null,
emailWhitelistEnabled:
policyData["email-whitelist-enabled"] ??
policyData["whitelist-users"].length > 0,
applyRules:
policyData["apply-rules"] ||
policyData.rules.length > 0,
scope: "global"
})
.returning();
resourcePolicyId = newPolicy.resourcePolicyId;
// Always add admin role
await trx.insert(rolePolicies).values({
roleId: adminRole.roleId,
resourcePolicyId
});
// Add SSO roles
await addRolePolicies(
resourcePolicyId,
policyData["sso-roles"],
orgId,
adminRole.roleId,
trx
);
// Add SSO users
await addUserPolicies(
resourcePolicyId,
policyData["sso-users"],
orgId,
trx
);
// Add password
if (policyData.password) {
const passwordHash = await hashPassword(policyData.password);
await trx.insert(resourcePolicyPassword).values({
resourcePolicyId,
passwordHash
});
}
// Add pincode
if (policyData.pincode) {
const pincodeHash = await hashPassword(policyData.pincode);
await trx.insert(resourcePolicyPincode).values({
resourcePolicyId,
pincodeHash,
digitLength: 6
});
}
// Add header auth
if (policyData["basic-auth"]) {
const basicAuth = policyData["basic-auth"];
const headerAuthHash = await hashPassword(
Buffer.from(
`${basicAuth.user}:${basicAuth.password}`
).toString("base64")
);
await trx.insert(resourcePolicyHeaderAuth).values({
resourcePolicyId,
headerAuthHash,
extendedCompatibility:
basicAuth["extended-compatibility"] ?? true
});
}
// Add whitelist users
if (policyData["whitelist-users"].length > 0) {
await trx.insert(resourcePolicyWhiteList).values(
policyData["whitelist-users"].map((email) => ({
email,
resourcePolicyId
}))
);
}
// Add rules
if (policyData.rules.length > 0) {
await trx.insert(resourcePolicyRules).values(
policyData.rules.map((rule, index) => ({
resourcePolicyId,
action: getRuleAction(rule.action),
match: getRuleMatch(rule.match),
value: rule.value,
priority: rule.priority ?? index + 1,
enabled: rule.enabled ?? true
}))
);
}
logger.debug(
`Created resource policy ${resourcePolicyId} (${policyNiceId})`
);
}
results.push({ resourcePolicyId, niceId: policyNiceId });
}
return results;
}
function getRuleAction(input: string): "ACCEPT" | "DROP" | "PASS" {
if (input === "allow") return "ACCEPT";
if (input === "deny") return "DROP";
return "PASS";
}
function getRuleMatch(
input: string
): "CIDR" | "IP" | "PATH" | "COUNTRY" | "ASN" | "REGION" {
return input.toUpperCase() as
| "CIDR"
| "IP"
| "PATH"
| "COUNTRY"
| "ASN"
| "REGION";
}
async function syncRolePolicies(
policyId: number,
ssoRoles: string[],
orgId: string,
adminRoleId: number,
trx: Transaction
) {
const existingRolePolicies = await trx
.select()
.from(rolePolicies)
.where(eq(rolePolicies.resourcePolicyId, policyId));
for (const roleName of ssoRoles) {
const [role] = await trx
.select()
.from(roles)
.where(and(eq(roles.name, roleName), eq(roles.orgId, orgId)))
.limit(1);
if (!role) {
logger.warn(
`Role '${roleName}' not found in org '${orgId}', skipping`
);
continue;
}
if (role.isAdmin) {
continue; // admin role is always included, skip
}
const alreadyExists = existingRolePolicies.some(
(rp) => rp.roleId === role.roleId
);
if (!alreadyExists) {
await trx.insert(rolePolicies).values({
roleId: role.roleId,
resourcePolicyId: policyId
});
}
}
// Remove roles no longer in the list (except admin)
for (const existingRolePolicy of existingRolePolicies) {
if (existingRolePolicy.roleId === adminRoleId) {
continue;
}
const [role] = await trx
.select()
.from(roles)
.where(eq(roles.roleId, existingRolePolicy.roleId))
.limit(1);
if (role?.isAdmin) {
continue;
}
if (role && !ssoRoles.includes(role.name)) {
await trx
.delete(rolePolicies)
.where(
and(
eq(rolePolicies.resourcePolicyId, policyId),
eq(rolePolicies.roleId, existingRolePolicy.roleId)
)
);
}
}
}
async function addRolePolicies(
policyId: number,
ssoRoles: string[],
orgId: string,
adminRoleId: number,
trx: Transaction
) {
for (const roleName of ssoRoles) {
const [role] = await trx
.select()
.from(roles)
.where(and(eq(roles.name, roleName), eq(roles.orgId, orgId)))
.limit(1);
if (!role) {
logger.warn(
`Role '${roleName}' not found in org '${orgId}', skipping`
);
continue;
}
if (role.isAdmin) {
continue; // admin already added
}
await trx.insert(rolePolicies).values({
roleId: role.roleId,
resourcePolicyId: policyId
});
}
}
async function syncUserPolicies(
policyId: number,
ssoUsers: string[],
orgId: string,
trx: Transaction
) {
const existingUserPolicies = await trx
.select()
.from(userPolicies)
.where(eq(userPolicies.resourcePolicyId, policyId));
for (const username of ssoUsers) {
const [user] = await trx
.select()
.from(users)
.innerJoin(userOrgs, eq(users.userId, userOrgs.userId))
.where(
and(
or(eq(users.username, username), eq(users.email, username)),
eq(userOrgs.orgId, orgId)
)
)
.limit(1);
if (!user) {
logger.warn(
`User '${username}' not found in org '${orgId}', skipping`
);
continue;
}
const alreadyExists = existingUserPolicies.some(
(up) => up.userId === user.user.userId
);
if (!alreadyExists) {
await trx.insert(userPolicies).values({
userId: user.user.userId,
resourcePolicyId: policyId
});
}
}
// Remove users no longer in the list
for (const existingUserPolicy of existingUserPolicies) {
const [user] = await trx
.select()
.from(users)
.innerJoin(userOrgs, eq(users.userId, userOrgs.userId))
.where(
and(
eq(users.userId, existingUserPolicy.userId),
eq(userOrgs.orgId, orgId)
)
)
.limit(1);
if (
user &&
user.user.username &&
!ssoUsers.includes(user.user.username) &&
!ssoUsers.includes(user.user.email ?? "")
) {
await trx
.delete(userPolicies)
.where(
and(
eq(userPolicies.resourcePolicyId, policyId),
eq(userPolicies.userId, existingUserPolicy.userId)
)
);
}
}
}
async function addUserPolicies(
policyId: number,
ssoUsers: string[],
orgId: string,
trx: Transaction
) {
for (const username of ssoUsers) {
const [user] = await trx
.select()
.from(users)
.innerJoin(userOrgs, eq(users.userId, userOrgs.userId))
.where(
and(
or(eq(users.username, username), eq(users.email, username)),
eq(userOrgs.orgId, orgId)
)
)
.limit(1);
if (!user) {
logger.warn(
`User '${username}' not found in org '${orgId}', skipping`
);
continue;
}
await trx.insert(userPolicies).values({
userId: user.user.userId,
resourcePolicyId: policyId
});
}
}
async function syncWhitelistPolicyUsers(
policyId: number,
whitelistUsers: string[],
trx: Transaction
) {
const existingWhitelist = await trx
.select()
.from(resourcePolicyWhiteList)
.where(eq(resourcePolicyWhiteList.resourcePolicyId, policyId));
for (const email of whitelistUsers) {
const alreadyExists = existingWhitelist.some((w) => w.email === email);
if (!alreadyExists) {
await trx.insert(resourcePolicyWhiteList).values({
email,
resourcePolicyId: policyId
});
}
}
for (const existingEntry of existingWhitelist) {
if (!whitelistUsers.includes(existingEntry.email)) {
await trx
.delete(resourcePolicyWhiteList)
.where(
and(
eq(resourcePolicyWhiteList.resourcePolicyId, policyId),
eq(resourcePolicyWhiteList.email, existingEntry.email)
)
);
}
}
}
async function syncPolicyRules(
policyId: number,
rules: ResourcePolicyData["rules"],
trx: Transaction
) {
const existingRules = await trx
.select()
.from(resourcePolicyRules)
.where(eq(resourcePolicyRules.resourcePolicyId, policyId))
.orderBy(resourcePolicyRules.priority);
for (const [index, rule] of rules.entries()) {
const intendedPriority = rule.priority ?? index + 1;
const existingRule = existingRules[index];
if (existingRule) {
await trx
.update(resourcePolicyRules)
.set({
action: getRuleAction(rule.action),
match: getRuleMatch(rule.match),
value: rule.value,
priority: intendedPriority,
enabled: rule.enabled ?? true
})
.where(eq(resourcePolicyRules.ruleId, existingRule.ruleId));
} else {
await trx.insert(resourcePolicyRules).values({
resourcePolicyId: policyId,
action: getRuleAction(rule.action),
match: getRuleMatch(rule.match),
value: rule.value,
priority: intendedPriority,
enabled: rule.enabled ?? true
});
}
}
// Remove extra rules
if (existingRules.length > rules.length) {
const rulesToDelete = existingRules.slice(rules.length);
for (const rule of rulesToDelete) {
await trx
.delete(resourcePolicyRules)
.where(eq(resourcePolicyRules.ruleId, rule.ruleId));
}
}
}
+7 -150
View File
@@ -1,23 +1,8 @@
import { z } from "zod"; import { z } from "zod";
import { existsSync } from "node:fs";
import { portRangeStringSchema } from "@server/lib/ip"; import { portRangeStringSchema } from "@server/lib/ip";
import { MaintenanceSchema } from "#dynamic/lib/blueprints/MaintenanceSchema"; import { MaintenanceSchema } from "#dynamic/lib/blueprints/MaintenanceSchema";
import { isValidRegionId } from "@server/db/regions"; import { isValidRegionId } from "@server/db/regions";
import { wildcardSubdomainSchema } from "@server/lib/schemas"; import { wildcardSubdomainSchema } from "@server/lib/schemas";
import config from "@server/lib/config";
const maxmindDbPath = config.getRawConfig().server.maxmind_db_path;
const maxmindAsnPath = config.getRawConfig().server.maxmind_asn_path;
const hasMaxmindCountryDb =
typeof maxmindDbPath === "string" &&
maxmindDbPath.length > 0 &&
existsSync(maxmindDbPath);
const hasMaxmindAsnDb =
typeof maxmindAsnPath === "string" &&
maxmindAsnPath.length > 0 &&
existsSync(maxmindAsnPath);
export const SiteSchema = z.object({ export const SiteSchema = z.object({
name: z.string().min(1).max(100), name: z.string().min(1).max(100),
@@ -98,8 +83,7 @@ export const RuleSchema = z
action: z.enum(["allow", "deny", "pass"]), action: z.enum(["allow", "deny", "pass"]),
match: z.enum(["cidr", "path", "ip", "country", "asn", "region"]), match: z.enum(["cidr", "path", "ip", "country", "asn", "region"]),
value: z.coerce.string(), value: z.coerce.string(),
priority: z.int().optional(), priority: z.int().optional()
enabled: z.boolean().optional().default(true)
}) })
.refine( .refine(
(rule) => { (rule) => {
@@ -132,9 +116,6 @@ export const RuleSchema = z
.refine( .refine(
(rule) => { (rule) => {
if (rule.match === "country") { if (rule.match === "country") {
if (!hasMaxmindCountryDb) {
return false;
}
// Check if it's a valid 2-letter country code or "ALL" // Check if it's a valid 2-letter country code or "ALL"
return /^[A-Z]{2}$/.test(rule.value) || rule.value === "ALL"; return /^[A-Z]{2}$/.test(rule.value) || rule.value === "ALL";
} }
@@ -143,15 +124,12 @@ export const RuleSchema = z
{ {
path: ["value"], path: ["value"],
message: message:
"Country rules require a valid existing server.maxmind_db_path and value must be a 2-letter country code or 'ALL'" "Value must be a 2-letter country code or 'ALL' when match is 'country'"
} }
) )
.refine( .refine(
(rule) => { (rule) => {
if (rule.match === "asn") { if (rule.match === "asn") {
if (!hasMaxmindCountryDb || !hasMaxmindAsnDb) {
return false;
}
// Check if it's either AS<number> format or "ALL" // Check if it's either AS<number> format or "ALL"
const asNumberPattern = /^AS\d+$/i; const asNumberPattern = /^AS\d+$/i;
return asNumberPattern.test(rule.value) || rule.value === "ALL"; return asNumberPattern.test(rule.value) || rule.value === "ALL";
@@ -161,7 +139,7 @@ export const RuleSchema = z
{ {
path: ["value"], path: ["value"],
message: message:
"ASN rules require valid existing server.maxmind_db_path and server.maxmind_asn_path, and value must be 'AS<number>' format or 'ALL'" "Value must be 'AS<number>' format or 'ALL' when match is 'asn'"
} }
) )
.refine( .refine(
@@ -289,37 +267,8 @@ export const PublicResourceSchema = z
return true; return true;
} }
const effectiveProtocol = resource.mode ?? resource.protocol; // If protocol/mode is http, it must have a full-domain
if (effectiveProtocol !== "ssh") { if ((resource.mode ?? resource.protocol) === "http") {
return true;
}
const authDaemonMode = resource["auth-daemon"]?.mode;
if (authDaemonMode !== "native" && authDaemonMode !== "site") {
return true;
}
return (
resource.targets.filter((target) => target != null).length <= 1
);
},
{
path: ["targets"],
error: "When protocol is 'ssh' and auth-daemon mode is 'native' or 'site', only one target/site is allowed"
}
)
.refine(
(resource) => {
if (isTargetsOnlyResource(resource)) {
return true;
}
// If protocol/mode is http, ssh, rdp, or vnc, it must have a full-domain
const effectiveProtocol = resource.mode ?? resource.protocol;
if (
effectiveProtocol !== undefined &&
["http", "ssh", "rdp", "vnc"].includes(effectiveProtocol)
) {
return ( return (
resource["full-domain"] !== undefined && resource["full-domain"] !== undefined &&
resource["full-domain"].length > 0 resource["full-domain"].length > 0
@@ -329,7 +278,7 @@ export const PublicResourceSchema = z
}, },
{ {
path: ["full-domain"], path: ["full-domain"],
error: "When protocol is 'http', 'ssh', 'rdp', or 'vnc', a 'full-domain' must be provided" error: "When protocol is 'http', a 'full-domain' must be provided"
} }
) )
.refine( .refine(
@@ -556,90 +505,7 @@ export const PrivateResourceSchema = z
{ {
message: "Destination must be a valid CIDR notation for cidr mode" message: "Destination must be a valid CIDR notation for cidr mode"
} }
) );
.refine(
(data) => {
if (data.mode !== "ssh") {
return true;
}
const authDaemonMode = data["auth-daemon"]?.mode;
if (authDaemonMode !== "native" && authDaemonMode !== "site") {
return true;
}
const uniqueSites = new Set<string>();
if (data.site) {
uniqueSites.add(data.site);
}
for (const site of data.sites) {
uniqueSites.add(site);
}
return uniqueSites.size <= 1;
},
{
path: ["sites"],
message:
"When mode is 'ssh' and auth-daemon mode is 'native' or 'site', only one site/target is allowed"
}
)
.transform((data) => {
if (
data.mode === "ssh" &&
data.destination !== undefined &&
data["destination-port"] === undefined
) {
data["destination-port"] = 22;
}
return data;
});
export const ResourcePolicyRuleSchema = RuleSchema;
export const ResourcePolicySchema = z.object({
name: z.string().min(1).max(255),
sso: z.boolean().optional().default(true),
"auto-login-idp": z.int().positive().optional().nullable(),
"sso-roles": z
.array(z.string())
.optional()
.default([])
.refine((roles) => !roles.includes("Admin"), {
error: "Admin role cannot be included in sso-roles"
}),
"sso-users": z.array(z.string()).optional().default([]),
password: z.string().min(4).max(100).optional().nullable(),
pincode: z
.string()
.regex(/^\d{6}$/)
.optional()
.nullable(),
"basic-auth": z
.object({
user: z.string().min(4).max(100),
password: z.string().min(4).max(100),
"extended-compatibility": z.boolean().default(true)
})
.optional()
.nullable(),
"email-whitelist-enabled": z.boolean().optional().default(false),
"whitelist-users": z
.array(
z.email().or(
z.string().regex(/^\*@[\w.-]+\.[a-zA-Z]{2,}$/, {
error: "Invalid email address. Wildcard (*) must be the entire local part."
})
)
)
.max(50)
.transform((v) => v.map((e) => e.toLowerCase()))
.optional()
.default([]),
"apply-rules": z.boolean().optional().default(false),
rules: z.array(ResourcePolicyRuleSchema).optional().default([])
});
export type ResourcePolicyData = z.infer<typeof ResourcePolicySchema>;
// Schema for the entire configuration object // Schema for the entire configuration object
export const ConfigSchema = z export const ConfigSchema = z
@@ -660,10 +526,6 @@ export const ConfigSchema = z
.record(z.string(), PrivateResourceSchema) .record(z.string(), PrivateResourceSchema)
.optional() .optional()
.prefault({}), .prefault({}),
"public-policies": z
.record(z.string(), ResourcePolicySchema)
.optional()
.prefault({}),
sites: z.record(z.string(), SiteSchema).optional().prefault({}) sites: z.record(z.string(), SiteSchema).optional().prefault({})
}) })
.transform((data) => { .transform((data) => {
@@ -694,10 +556,6 @@ export const ConfigSchema = z
string, string,
z.infer<typeof PrivateResourceSchema> z.infer<typeof PrivateResourceSchema>
>; >;
"public-policies": Record<
string,
z.infer<typeof ResourcePolicySchema>
>;
sites: Record<string, z.infer<typeof SiteSchema>>; sites: Record<string, z.infer<typeof SiteSchema>>;
}; };
}) })
@@ -837,4 +695,3 @@ export type Site = z.infer<typeof SiteSchema>;
export type Target = z.infer<typeof TargetSchema>; export type Target = z.infer<typeof TargetSchema>;
export type Resource = z.infer<typeof PublicResourceSchema>; export type Resource = z.infer<typeof PublicResourceSchema>;
export type Config = z.infer<typeof ConfigSchema>; export type Config = z.infer<typeof ConfigSchema>;
export type BlueprintResourcePolicy = z.infer<typeof ResourcePolicySchema>;
+6 -15
View File
@@ -504,7 +504,7 @@ export function generateRemoteSubnets(
const parseResult = cidrSchema.safeParse(sr.destination); const parseResult = cidrSchema.safeParse(sr.destination);
return parseResult.success; return parseResult.success;
} }
if (sr.mode === "host" || sr.mode === "ssh") { if (sr.mode === "host") {
// check if its a valid IP using zod // check if its a valid IP using zod
const ipSchema = z.union([z.ipv4(), z.ipv6()]); const ipSchema = z.union([z.ipv4(), z.ipv6()]);
const parseResult = ipSchema.safeParse(sr.destination); const parseResult = ipSchema.safeParse(sr.destination);
@@ -514,7 +514,7 @@ export function generateRemoteSubnets(
}) })
.map((sr) => { .map((sr) => {
if (sr.mode === "cidr") return sr.destination; if (sr.mode === "cidr") return sr.destination;
if (sr.mode === "host" || sr.mode === "ssh") { if (sr.mode === "host") {
return `${sr.destination}/32`; return `${sr.destination}/32`;
} }
return ""; // This should never be reached due to filtering, but satisfies TypeScript return ""; // This should never be reached due to filtering, but satisfies TypeScript
@@ -531,7 +531,7 @@ export function generateAliasConfig(allSiteResources: SiteResource[]): Alias[] {
.filter( .filter(
(sr) => (sr) =>
sr.aliasAddress && sr.aliasAddress &&
((sr.alias && (sr.mode == "host" || sr.mode == "ssh")) || ((sr.alias && sr.mode == "host") ||
(sr.fullDomain && sr.mode == "http")) (sr.fullDomain && sr.mode == "http"))
) )
.map((sr) => ({ .map((sr) => ({
@@ -577,10 +577,6 @@ export function generateSubnetProxyTargets(
continue; continue;
} }
if (!siteResource.destination) {
continue;
}
const clientPrefix = `${clientSite.subnet.split("/")[0]}/32`; const clientPrefix = `${clientSite.subnet.split("/")[0]}/32`;
const portRange = [ const portRange = [
...parsePortRangeString(siteResource.tcpPortRangeString, "tcp"), ...parsePortRangeString(siteResource.tcpPortRangeString, "tcp"),
@@ -588,7 +584,7 @@ export function generateSubnetProxyTargets(
]; ];
const disableIcmp = siteResource.disableIcmp ?? false; const disableIcmp = siteResource.disableIcmp ?? false;
if (siteResource.mode == "host" || siteResource.mode == "ssh") { if (siteResource.mode == "host") {
let destination = siteResource.destination; let destination = siteResource.destination;
// check if this is a valid ip // check if this is a valid ip
const ipSchema = z.union([z.ipv4(), z.ipv6()]); const ipSchema = z.union([z.ipv4(), z.ipv6()]);
@@ -669,12 +665,7 @@ export async function generateSubnetProxyTargetV2(
return; return;
} }
if (!siteResource.destination) { let targets: SubnetProxyTargetV2[] = [];
// ssh can have no destination
return;
}
const targets: SubnetProxyTargetV2[] = [];
const portRange = [ const portRange = [
...parsePortRangeString(siteResource.tcpPortRangeString, "tcp"), ...parsePortRangeString(siteResource.tcpPortRangeString, "tcp"),
@@ -682,7 +673,7 @@ export async function generateSubnetProxyTargetV2(
]; ];
const disableIcmp = siteResource.disableIcmp ?? false; const disableIcmp = siteResource.disableIcmp ?? false;
if (siteResource.mode == "host" || siteResource.mode == "ssh") { if (siteResource.mode == "host") {
let destination = siteResource.destination; let destination = siteResource.destination;
// check if this is a valid ip // check if this is a valid ip
const ipSchema = z.union([z.ipv4(), z.ipv6()]); const ipSchema = z.union([z.ipv4(), z.ipv6()]);
-4
View File
@@ -181,7 +181,6 @@ class TelemetryClient {
let numPrivResourceHosts = 0; let numPrivResourceHosts = 0;
let numPrivResourceCidr = 0; let numPrivResourceCidr = 0;
let numPrivResourceHttp = 0; let numPrivResourceHttp = 0;
let numPrivResourceSsh = 0;
for (const res of allPrivateResources) { for (const res of allPrivateResources) {
if (res.mode === "host") { if (res.mode === "host") {
numPrivResourceHosts += 1; numPrivResourceHosts += 1;
@@ -189,8 +188,6 @@ class TelemetryClient {
numPrivResourceCidr += 1; numPrivResourceCidr += 1;
} else if (res.mode === "http") { } else if (res.mode === "http") {
numPrivResourceHttp += 1; numPrivResourceHttp += 1;
} else if (res.mode === "ssh") {
numPrivResourceSsh += 1;
} }
if (res.alias) { if (res.alias) {
@@ -210,7 +207,6 @@ class TelemetryClient {
numPrivateResourceHosts: numPrivResourceHosts, numPrivateResourceHosts: numPrivResourceHosts,
numPrivateResourceCidr: numPrivResourceCidr, numPrivateResourceCidr: numPrivResourceCidr,
numPrivateResourceHttp: numPrivResourceHttp, numPrivateResourceHttp: numPrivResourceHttp,
numPrivateResourceSsh: numPrivResourceSsh,
numAlertRules: numAlertRules.count, numAlertRules: numAlertRules.count,
numUserDevices: userDevicesCount.count, numUserDevices: userDevicesCount.count,
numMachineClients: machineClients.count, numMachineClients: machineClients.count,
+3 -4
View File
@@ -44,8 +44,7 @@ export async function getTraefikConfig(
filterOutNamespaceDomains = false, // UNUSED BUT USED IN PRIVATE filterOutNamespaceDomains = false, // UNUSED BUT USED IN PRIVATE
generateLoginPageRouters = false, // UNUSED BUT USED IN PRIVATE generateLoginPageRouters = false, // UNUSED BUT USED IN PRIVATE
allowRawResources = true, allowRawResources = true,
allowMaintenancePage = true, // UNUSED BUT USED IN PRIVATE allowMaintenancePage = true // UNUSED BUT USED IN PRIVATE
allowBrowserGatewayResources = true
): Promise<any> { ): Promise<any> {
// Get resources with their targets and sites in a single optimized query // Get resources with their targets and sites in a single optimized query
// Start from sites on this exit node, then join to targets and resources // Start from sites on this exit node, then join to targets and resources
@@ -241,7 +240,7 @@ export async function getTraefikConfig(
continue; continue;
} }
if (resource.mode === "http") { if (resource.http) {
if (!resource.domainId || !resource.fullDomain) { if (!resource.domainId || !resource.fullDomain) {
continue; continue;
} }
@@ -573,7 +572,7 @@ export async function getTraefikConfig(
serviceName serviceName
].loadBalancer.serversTransport = transportName; ].loadBalancer.serversTransport = transportName;
} }
} else if (resource.mode === "tcp" || resource.mode === "udp") { } else {
// Non-HTTP (TCP/UDP) configuration // Non-HTTP (TCP/UDP) configuration
if (!resource.enableProxy || !resource.proxyPort) { if (!resource.enableProxy || !resource.proxyPort) {
continue; continue;
-41
View File
@@ -1,7 +1,5 @@
import z from "zod"; import z from "zod";
import ipaddr from "ipaddr.js"; import ipaddr from "ipaddr.js";
import { COUNTRIES } from "@server/db/countries";
import { isValidRegionId } from "@server/db/regions";
export function isValidCIDR(cidr: string): boolean { export function isValidCIDR(cidr: string): boolean {
return ( return (
@@ -69,45 +67,6 @@ export function isValidUrlGlobPattern(pattern: string): boolean {
return true; return true;
} }
export const RESOURCE_RULE_MATCH_TYPES = [
"CIDR",
"IP",
"PATH",
"COUNTRY",
"ASN",
"REGION"
] as const;
export type ResourceRuleMatchType = (typeof RESOURCE_RULE_MATCH_TYPES)[number];
export function getResourceRuleValueValidationError(
match: ResourceRuleMatchType,
value: string
): string | null {
switch (match) {
case "CIDR":
return isValidCIDR(value) ? null : "Invalid CIDR provided";
case "IP":
return isValidIP(value) ? null : "Invalid IP provided";
case "PATH":
return isValidUrlGlobPattern(value)
? null
: "Invalid URL glob pattern provided";
case "REGION":
return isValidRegionId(value) ? null : "Invalid region ID provided";
case "COUNTRY":
return COUNTRIES.some((country) => country.code === value)
? null
: "Invalid country code provided";
case "ASN":
return /^AS\d+$/i.test(value.trim())
? null
: "Invalid ASN provided";
default:
return "Invalid rule match type provided";
}
}
export function isUrlValid(url: string | undefined) { export function isUrlValid(url: string | undefined) {
if (!url) return true; // the link is optional in the schema so if it's empty it's valid if (!url) return true; // the link is optional in the schema so if it's empty it's valid
var pattern = new RegExp( var pattern = new RegExp(
+26 -15
View File
@@ -1,15 +1,11 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { db, Resource } from "@server/db"; import { db, Resource } from "@server/db";
import { resources, userOrgs } from "@server/db"; import { resources, userOrgs, userResources, roleResources } from "@server/db";
import { and, eq } from "drizzle-orm"; import { and, eq, inArray } from "drizzle-orm";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import { checkOrgAccessPolicy } from "#dynamic/lib/checkOrgAccessPolicy"; import { checkOrgAccessPolicy } from "#dynamic/lib/checkOrgAccessPolicy";
import { getUserOrgRoleIds } from "@server/lib/userOrgRoles"; import { getUserOrgRoleIds } from "@server/lib/userOrgRoles";
import {
getRoleResourceAccess,
getUserResourceAccess
} from "@server/db/queries/verifySessionQueries";
export async function verifyResourceAccess( export async function verifyResourceAccess(
req: Request, req: Request,
@@ -120,22 +116,37 @@ export async function verifyResourceAccess(
const roleResourceAccess = const roleResourceAccess =
(req.userOrgRoleIds?.length ?? 0) > 0 (req.userOrgRoleIds?.length ?? 0) > 0
? await getRoleResourceAccess( ? await db
resource.resourceId, .select()
.from(roleResources)
.where(
and(
eq(roleResources.resourceId, resource.resourceId),
inArray(
roleResources.roleId,
req.userOrgRoleIds! req.userOrgRoleIds!
) )
: null; )
)
.limit(1)
: [];
if (roleResourceAccess) { if (roleResourceAccess.length > 0) {
return next(); return next();
} }
const userResourceAccess = await getUserResourceAccess( const userResourceAccess = await db
userId, .select()
resource.resourceId .from(userResources)
); .where(
and(
eq(userResources.userId, userId),
eq(userResources.resourceId, resource.resourceId)
)
)
.limit(1);
if (userResourceAccess) { if (userResourceAccess.length > 0) {
return next(); return next();
} }
-322
View File
@@ -1,322 +0,0 @@
import { assertEquals } from "@test/assert";
/**
* Tests for the cross-organization site binding prevention in verifySiteAccess.
*
* verifySiteAccess now includes a check: if req.userOrgId is already set by a
* previous middleware (e.g. verifyResourceAccess or verifyTargetAccess), and the
* loaded site's orgId differs from req.userOrgId, the request is rejected with
* 403 Forbidden.
*
* Route stacks after fix:
* PUT /resource/:resourceId/target
* verifyResourceAccess verifySiteAccess verifyLimits ...
* POST /target/:targetId
* verifyTargetAccess verifySiteAccess verifyLimits ...
*
* verifyResourceAccess sets req.userOrgId to the resource's org.
* verifyTargetAccess sets req.userOrgId to the target's resource org.
* verifySiteAccess then checks site.orgId against req.userOrgId before
* overwriting it with the site's org.
*/
// --- Core org-matching logic (mirrors the check in verifySiteAccess) ---
function siteOrgMatchesExpectedOrg(
siteOrgId: string | null | undefined,
expectedOrgId: string | null | undefined
): boolean {
if (!siteOrgId || !expectedOrgId) {
return false;
}
return siteOrgId === expectedOrgId;
}
// Simulates the condition check in verifySiteAccess:
// if (req.userOrgId && site.orgId !== req.userOrgId) { reject }
function shouldRejectCrossOrgSite(
siteOrgId: string,
reqUserOrgId: string | undefined
): boolean {
// The actual check in verifySiteAccess is:
// if (req.userOrgId && site.orgId !== req.userOrgId) { reject }
return !!(reqUserOrgId && siteOrgId !== reqUserOrgId);
}
// --- Tests ---
function testSiteOrgMatchLogic() {
console.log("Running verifySiteAccess org-match logic tests...");
// Test 1: Same org — should match
{
const result = siteOrgMatchesExpectedOrg(
"org-attacker",
"org-attacker"
);
assertEquals(result, true, "Same org should match");
}
// Test 2: Different org — should NOT match (cross-org bypass scenario)
{
const result = siteOrgMatchesExpectedOrg("org-victim", "org-attacker");
assertEquals(
result,
false,
"Cross-org site should NOT match expected org"
);
}
// Test 3: Site orgId is null — should NOT match
{
const result = siteOrgMatchesExpectedOrg(null, "org-attacker");
assertEquals(result, false, "Null site orgId should NOT match");
}
// Test 4: Expected orgId is null — should NOT match
{
const result = siteOrgMatchesExpectedOrg("org-attacker", null);
assertEquals(result, false, "Null expected orgId should NOT match");
}
// Test 5: Both null — should NOT match
{
const result = siteOrgMatchesExpectedOrg(null, null);
assertEquals(result, false, "Both null should NOT match");
}
// Test 6: Empty string orgIds — should NOT match (empty string is falsy)
{
const result = siteOrgMatchesExpectedOrg("", "org-attacker");
assertEquals(result, false, "Empty site orgId should NOT match");
}
// Test 7: Undefined orgIds — should NOT match
{
const result = siteOrgMatchesExpectedOrg(undefined, "org-attacker");
assertEquals(result, false, "Undefined site orgId should NOT match");
}
console.log("All verifySiteAccess org-match logic tests passed.");
}
function testShouldRejectCrossOrgSite() {
console.log(
"Running shouldRejectCrossOrgSite tests (mirrors verifySiteAccess check)..."
);
// Test: No prior org context (undefined) — should NOT reject
// This is the normal case for site-only routes (e.g. PUT /site/:siteId)
// where verifySiteAccess runs without a prior verifyResourceAccess.
{
const shouldReject = shouldRejectCrossOrgSite("org-victim", undefined);
assertEquals(
shouldReject,
false,
"No prior org context should NOT reject (normal site routes)"
);
}
// Test: Same org — should NOT reject
{
const shouldReject = shouldRejectCrossOrgSite(
"org-attacker",
"org-attacker"
);
assertEquals(shouldReject, false, "Same org should NOT reject");
}
// Test: Different org — should reject
{
const shouldReject = shouldRejectCrossOrgSite(
"org-victim",
"org-attacker"
);
assertEquals(shouldReject, true, "Cross-org site should be rejected");
}
// Test: Empty string userOrgId — should NOT reject (falsy, check is skipped)
{
const shouldReject = shouldRejectCrossOrgSite("org-victim", "");
assertEquals(
shouldReject,
false,
"Empty string userOrgId should NOT reject (check is skipped)"
);
}
console.log("All shouldRejectCrossOrgSite tests passed.");
}
// --- Route stack validation tests ---
function testRouteStackOrdering() {
console.log("Running route stack ordering tests...");
const createTargetStack = [
"verifyResourceAccess",
"verifySiteAccess",
"verifyLimits",
"verifyUserHasAction",
"logActionAudit",
"createTarget"
];
const updateTargetStack = [
"verifyTargetAccess",
"verifySiteAccess",
"verifyLimits",
"verifyUserHasAction",
"logActionAudit",
"updateTarget"
];
// Verify verifySiteAccess comes after resource/target access middleware
{
const siteAccessIndex = createTargetStack.indexOf("verifySiteAccess");
const resourceAccessIndex = createTargetStack.indexOf(
"verifyResourceAccess"
);
assertEquals(
siteAccessIndex > resourceAccessIndex,
true,
"verifySiteAccess must come after verifyResourceAccess in create target stack"
);
}
{
const siteAccessIndex = updateTargetStack.indexOf("verifySiteAccess");
const targetAccessIndex =
updateTargetStack.indexOf("verifyTargetAccess");
assertEquals(
siteAccessIndex > targetAccessIndex,
true,
"verifySiteAccess must come after verifyTargetAccess in update target stack"
);
}
// Verify verifySiteAccess comes before the handler
{
const siteAccessIndex = createTargetStack.indexOf("verifySiteAccess");
const handlerIndex = createTargetStack.indexOf("createTarget");
assertEquals(
siteAccessIndex < handlerIndex,
true,
"verifySiteAccess must come before createTarget handler"
);
}
{
const siteAccessIndex = updateTargetStack.indexOf("verifySiteAccess");
const handlerIndex = updateTargetStack.indexOf("updateTarget");
assertEquals(
siteAccessIndex < handlerIndex,
true,
"verifySiteAccess must come before updateTarget handler"
);
}
console.log("All route stack ordering tests passed.");
}
// --- Security scenario tests ---
function testSecurityScenarios() {
console.log("Running security scenario tests...");
// Scenario 1: Attacker has resource access in org_attacker, but tries to
// bind target to a site in org_victim.
// verifyResourceAccess passes (sets req.userOrgId = "org_attacker").
// verifySiteAccess loads site (org_victim), checks site.orgId !== req.userOrgId.
// Expected: 403 Forbidden.
{
const shouldReject = shouldRejectCrossOrgSite(
"org_victim",
"org_attacker"
);
assertEquals(
shouldReject,
true,
"Scenario 1: Cross-org site binding must be rejected"
);
}
// Scenario 2: Attacker has resource access AND site access in another org.
// Even though the user has site access, verifySiteAccess rejects because
// the org-match check runs before the site access check.
// Expected: 403 Forbidden (org mismatch caught before site access check).
{
const shouldReject = shouldRejectCrossOrgSite(
"org_victim",
"org_attacker"
);
assertEquals(
shouldReject,
true,
"Scenario 2: Cross-org site must be rejected even if user has site access"
);
}
// Scenario 3: Legitimate user creates target with site in same org.
// verifyResourceAccess passes, verifySiteAccess org-match passes (same org),
// verifySiteAccess site access passes.
// Expected: 201 Created.
{
const shouldReject = shouldRejectCrossOrgSite(
"org_attacker",
"org_attacker"
);
assertEquals(
shouldReject,
false,
"Scenario 3: Same-org site must be allowed"
);
}
// Scenario 4: WireGuard site in victim org — org mismatch is caught before
// any DB write, pickPort, addPeer, or addTargets side effect.
{
const shouldReject = shouldRejectCrossOrgSite(
"org_victim",
"org_attacker"
);
assertEquals(
shouldReject,
true,
"Scenario 4: WireGuard cross-org site must be rejected before addPeer"
);
}
// Scenario 5: Newt site in victim org — same as scenario 4 but for newt.
{
const shouldReject = shouldRejectCrossOrgSite(
"org_victim",
"org_attacker"
);
assertEquals(
shouldReject,
true,
"Scenario 5: Newt cross-org site must be rejected before addTargets"
);
}
// Scenario 6: Normal site-only route (e.g. PUT /site/:siteId) where
// verifySiteAccess runs without a prior verifyResourceAccess.
// req.userOrgId is undefined, so the org-match check is skipped.
// Normal site access verification proceeds.
{
const shouldReject = shouldRejectCrossOrgSite("org_victim", undefined);
assertEquals(
shouldReject,
false,
"Scenario 6: Site-only routes should skip org-match check"
);
}
console.log("All security scenario tests passed.");
}
// Run all tests
testSiteOrgMatchLogic();
testShouldRejectCrossOrgSite();
testRouteStackOrdering();
testSecurityScenarios();
+4 -10
View File
@@ -71,15 +71,6 @@ export async function verifySiteAccess(
); );
} }
if (req.userOrgId && site.orgId !== req.userOrgId) {
return next(
createHttpError(
HttpCode.FORBIDDEN,
"User does not have access to this site"
)
);
}
if (!req.userOrg) { if (!req.userOrg) {
// Get user's role ID in the organization // Get user's role ID in the organization
const userOrgRole = await db const userOrgRole = await db
@@ -137,7 +128,10 @@ export async function verifySiteAccess(
.where( .where(
and( and(
eq(roleSites.siteId, site.siteId), eq(roleSites.siteId, site.siteId),
inArray(roleSites.roleId, req.userOrgRoleIds!) inArray(
roleSites.roleId,
req.userOrgRoleIds!
)
) )
) )
.limit(1) .limit(1)
+1 -5
View File
@@ -109,11 +109,7 @@ export const privateConfigSchema = z
enable_redis: z.boolean().optional().default(false), enable_redis: z.boolean().optional().default(false),
use_pangolin_dns: z.boolean().optional().default(false), use_pangolin_dns: z.boolean().optional().default(false),
use_org_only_idp: z.boolean().optional(), use_org_only_idp: z.boolean().optional(),
enable_acme_cert_sync: z.boolean().optional().default(true), enable_acme_cert_sync: z.boolean().optional().default(true)
disable_private_http_placeholder: z
.boolean()
.optional()
.default(false)
}) })
.optional() .optional()
.prefault({}), .prefault({}),
+76 -44
View File
@@ -12,6 +12,7 @@
*/ */
import { import {
browserGatewayTarget,
certificates, certificates,
db, db,
domainNamespaces, domainNamespaces,
@@ -171,15 +172,8 @@ export async function getTraefikConfig(
), ),
inArray(sites.type, siteTypes), inArray(sites.type, siteTypes),
allowRawResources allowRawResources
? inArray(resources.mode, [ ? inArray(resources.mode, ["http", "udp", "tcp"]) // allow all three
"http", : eq(resources.mode, "http")
"udp",
"tcp",
"vnc",
"ssh",
"rdp"
]) // allow all three
: inArray(resources.mode, ["http", "vnc", "ssh", "rdp"])
) )
) )
.orderBy(desc(targets.priority), targets.targetId); // stable ordering .orderBy(desc(targets.priority), targets.targetId); // stable ordering
@@ -187,10 +181,7 @@ export async function getTraefikConfig(
// Group by resource and include targets with their unique site data // Group by resource and include targets with their unique site data
const resourcesMap = new Map(); const resourcesMap = new Map();
for (const row of resourcesWithTargetsAndSites) { resourcesWithTargetsAndSites.forEach((row) => {
if (!["http", "tcp", "udp"].includes(row.mode)) {
continue;
}
const resourceId = row.resourceId; const resourceId = row.resourceId;
const resourceName = sanitize(row.resourceName) || ""; const resourceName = sanitize(row.resourceName) || "";
const targetPath = encodePath(row.path); // Use encodePath to avoid collisions (e.g. "/a/b" vs "/a-b") const targetPath = encodePath(row.path); // Use encodePath to avoid collisions (e.g. "/a/b" vs "/a-b")
@@ -200,7 +191,7 @@ export async function getTraefikConfig(
const priority = row.priority ?? 100; const priority = row.priority ?? 100;
if (filterOutNamespaceDomains && row.domainNamespaceId) { if (filterOutNamespaceDomains && row.domainNamespaceId) {
continue; return;
} }
// Create a unique key combining resourceId, path config, and rewrite config // Create a unique key combining resourceId, path config, and rewrite config
@@ -227,7 +218,7 @@ export async function getTraefikConfig(
logger.debug( logger.debug(
`Invalid path rewrite configuration for resource ${resourceId}: ${validation.error}` `Invalid path rewrite configuration for resource ${resourceId}: ${validation.error}`
); );
continue; return;
} }
resourcesMap.set(mapKey, { resourcesMap.set(mapKey, {
@@ -284,7 +275,7 @@ export async function getTraefikConfig(
online: row.siteOnline online: row.siteOnline
} }
}); });
} });
// Group browser gateway targets by resource // Group browser gateway targets by resource
type BrowserGatewayResourceEntry = { type BrowserGatewayResourceEntry = {
@@ -304,12 +295,13 @@ export async function getTraefikConfig(
maintenanceMessage: string | null; maintenanceMessage: string | null;
maintenanceEstimatedTime: string | null; maintenanceEstimatedTime: string | null;
targets: { targets: {
targetId: number; browserGatewayTargetId: number;
bgType: string; bgType: string;
siteId: number; siteId: number;
siteType: string; siteType: string;
siteOnline: boolean | null; siteOnline: boolean | null;
subnet: string | null; subnet: string | null;
siteExitNodeId: number | null;
}[]; }[];
}; };
const browserGatewayResourcesMap = new Map< const browserGatewayResourcesMap = new Map<
@@ -318,10 +310,66 @@ export async function getTraefikConfig(
>(); >();
if (allowBrowserGatewayResources) { if (allowBrowserGatewayResources) {
for (const row of resourcesWithTargetsAndSites) { // Query browser gateway targets for this exit node
if (!["ssh", "vnc", "rdp"].includes(row.mode)) { const browserGatewayRows = await db
continue; .select({
} // Resource fields
resourceId: resources.resourceId,
resourceName: resources.name,
fullDomain: resources.fullDomain,
ssl: resources.ssl,
subdomain: resources.subdomain,
domainId: resources.domainId,
enabled: resources.enabled,
wildcard: resources.wildcard,
domainCertResolver: domains.certResolver,
preferWildcardCert: domains.preferWildcardCert,
domainNamespaceId: domainNamespaces.domainNamespaceId,
// Maintenance fields
maintenanceModeEnabled: resources.maintenanceModeEnabled,
maintenanceModeType: resources.maintenanceModeType,
maintenanceTitle: resources.maintenanceTitle,
maintenanceMessage: resources.maintenanceMessage,
maintenanceEstimatedTime: resources.maintenanceEstimatedTime,
// Browser gateway target fields
browserGatewayTargetId:
browserGatewayTarget.browserGatewayTargetId,
bgType: browserGatewayTarget.type,
// Site fields
siteId: sites.siteId,
siteType: sites.type,
siteOnline: sites.online,
subnet: sites.subnet,
siteExitNodeId: sites.exitNodeId
})
.from(browserGatewayTarget)
.innerJoin(sites, eq(sites.siteId, browserGatewayTarget.siteId))
.innerJoin(
resources,
eq(resources.resourceId, browserGatewayTarget.resourceId)
)
.leftJoin(domains, eq(domains.domainId, resources.domainId))
.leftJoin(
domainNamespaces,
eq(domainNamespaces.domainId, resources.domainId)
)
.where(
and(
eq(resources.enabled, true),
or(
eq(sites.exitNodeId, exitNodeId),
and(
isNull(sites.exitNodeId),
sql`(${siteTypes.includes("local") ? 1 : 0} = 1)`,
eq(sites.type, "local"),
sql`(${build != "saas" ? 1 : 0} = 1)`
)
),
inArray(sites.type, siteTypes)
)
);
for (const row of browserGatewayRows) {
if (filterOutNamespaceDomains && row.domainNamespaceId) { if (filterOutNamespaceDomains && row.domainNamespaceId) {
continue; continue;
} }
@@ -346,12 +394,13 @@ export async function getTraefikConfig(
}); });
} }
browserGatewayResourcesMap.get(row.resourceId)!.targets.push({ browserGatewayResourcesMap.get(row.resourceId)!.targets.push({
targetId: row.targetId, browserGatewayTargetId: row.browserGatewayTargetId,
bgType: row.mode, bgType: row.bgType,
siteId: row.siteId, siteId: row.siteId,
siteType: row.siteType, siteType: row.siteType,
siteOnline: row.siteOnline, siteOnline: row.siteOnline,
subnet: row.subnet subnet: row.subnet,
siteExitNodeId: row.siteExitNodeId
}); });
} }
} }
@@ -361,11 +410,7 @@ export async function getTraefikConfig(
fullDomain: string | null; fullDomain: string | null;
mode: "http" | "host" | "cidr" | "ssh"; mode: "http" | "host" | "cidr" | "ssh";
}[] = []; }[] = [];
if ( if (build == "enterprise") {
build == "enterprise" &&
!privateConfig.getRawPrivateConfig().flags
.disable_private_http_placeholder
) {
// we dont want to do this on the cloud // we dont want to do this on the cloud
// Query siteResources in HTTP mode with SSL enabled and aliases - cert generation / HTTPS edge // Query siteResources in HTTP mode with SSL enabled and aliases - cert generation / HTTPS edge
siteResourcesWithFullDomain = await db siteResourcesWithFullDomain = await db
@@ -448,29 +493,16 @@ export async function getTraefikConfig(
const transportName = `${key}-transport`; const transportName = `${key}-transport`;
const headersMiddlewareName = `${key}-headers-middleware`; const headersMiddlewareName = `${key}-headers-middleware`;
logger.debug(
`Processing resource ${resource.name} with domain ${fullDomain} and ${targets.length} targets`
);
if (!resource.enabled) { if (!resource.enabled) {
logger.debug(
`Resource ${resource.name} is disabled, skipping Traefik config`
);
continue; continue;
} }
if (resource.mode == "http") { if (resource.http) {
if (!resource.domainId) { if (!resource.domainId) {
logger.debug(
`Resource ${resource.name} does not have a domainId, skipping Traefik config`
);
continue; continue;
} }
if (!resource.fullDomain) { if (!resource.fullDomain) {
logger.debug(
`Resource ${resource.name} does not have a fullDomain, skipping Traefik config`
);
continue; continue;
} }
@@ -926,7 +958,7 @@ export async function getTraefikConfig(
serviceName serviceName
].loadBalancer.serversTransport = transportName; ].loadBalancer.serversTransport = transportName;
} }
} else if (resource.mode == "tcp" || resource.mode == "udp") { } else {
// Non-HTTP (TCP/UDP) configuration // Non-HTTP (TCP/UDP) configuration
if (!resource.enableProxy) { if (!resource.enableProxy) {
continue; continue;
@@ -208,7 +208,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -44,7 +44,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -32,10 +32,7 @@ import { OpenAPITags, registry } from "@server/openApi";
import { and, eq } from "drizzle-orm"; import { and, eq } from "drizzle-orm";
import { decrypt } from "@server/lib/crypto"; import { decrypt } from "@server/lib/crypto";
import config from "@server/lib/config"; import config from "@server/lib/config";
import { import { GetAlertRuleResponse, WebhookAlertConfig } from "@server/routers/alertRule/types";
GetAlertRuleResponse,
WebhookAlertConfig
} from "@server/routers/alertRule/types";
const paramsSchema = z const paramsSchema = z
.object({ .object({
@@ -58,7 +55,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -101,7 +101,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -44,7 +44,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -44,7 +44,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -44,7 +44,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -72,9 +72,7 @@ export async function exportConnectionAuditLogs(
); );
} }
const parsedParams = queryConnectionAuditLogsParams.safeParse( const parsedParams = queryConnectionAuditLogsParams.safeParse(req.params);
req.params
);
if (!parsedParams.success) { if (!parsedParams.success) {
return next( return next(
createHttpError( createHttpError(
@@ -11,14 +11,7 @@
* This file is not licensed under the AGPLv3. * This file is not licensed under the AGPLv3.
*/ */
import { import { accessAuditLog, logsDb, resources, siteResources, db, primaryDb } from "@server/db";
accessAuditLog,
logsDb,
resources,
siteResources,
db,
primaryDb
} from "@server/db";
import { registry } from "@server/openApi"; import { registry } from "@server/openApi";
import { NextFunction } from "express"; import { NextFunction } from "express";
import { Request, Response } from "express"; import { Request, Response } from "express";
@@ -157,30 +150,21 @@ export function queryAccess(data: Q) {
.orderBy(desc(accessAuditLog.timestamp), desc(accessAuditLog.id)); .orderBy(desc(accessAuditLog.timestamp), desc(accessAuditLog.id));
} }
async function enrichWithResourceDetails( async function enrichWithResourceDetails(logs: Awaited<ReturnType<typeof queryAccess>>) {
logs: Awaited<ReturnType<typeof queryAccess>>
) {
const resourceIds = logs const resourceIds = logs
.map((log) => log.resourceId) .map(log => log.resourceId)
.filter((id): id is number => id !== null && id !== undefined); .filter((id): id is number => id !== null && id !== undefined);
const siteResourceIds = logs const siteResourceIds = logs
.filter((log) => log.resourceId == null && log.siteResourceId != null) .filter(log => log.resourceId == null && log.siteResourceId != null)
.map((log) => log.siteResourceId) .map(log => log.siteResourceId)
.filter((id): id is number => id !== null && id !== undefined); .filter((id): id is number => id !== null && id !== undefined);
if (resourceIds.length === 0 && siteResourceIds.length === 0) { if (resourceIds.length === 0 && siteResourceIds.length === 0) {
return logs.map((log) => ({ return logs.map(log => ({ ...log, resourceName: null, resourceNiceId: null }));
...log,
resourceName: null,
resourceNiceId: null
}));
} }
const resourceMap = new Map< const resourceMap = new Map<number, { name: string | null; niceId: string | null }>();
number,
{ name: string | null; niceId: string | null }
>();
if (resourceIds.length > 0) { if (resourceIds.length > 0) {
const resourceDetails = await primaryDb const resourceDetails = await primaryDb
@@ -197,10 +181,7 @@ async function enrichWithResourceDetails(
} }
} }
const siteResourceMap = new Map< const siteResourceMap = new Map<number, { name: string | null; niceId: string | null }>();
number,
{ name: string | null; niceId: string | null }
>();
if (siteResourceIds.length > 0) { if (siteResourceIds.length > 0) {
const siteResourceDetails = await primaryDb const siteResourceDetails = await primaryDb
@@ -213,15 +194,12 @@ async function enrichWithResourceDetails(
.where(inArray(siteResources.siteResourceId, siteResourceIds)); .where(inArray(siteResources.siteResourceId, siteResourceIds));
for (const r of siteResourceDetails) { for (const r of siteResourceDetails) {
siteResourceMap.set(r.siteResourceId, { siteResourceMap.set(r.siteResourceId, { name: r.name, niceId: r.niceId });
name: r.name,
niceId: r.niceId
});
} }
} }
// Enrich logs with resource details // Enrich logs with resource details
return logs.map((log) => { return logs.map(log => {
if (log.resourceId != null) { if (log.resourceId != null) {
const details = resourceMap.get(log.resourceId); const details = resourceMap.get(log.resourceId);
return { return {
@@ -295,11 +273,11 @@ async function queryUniqueFilterAttributes(
// Fetch resource names from main database for the unique resource IDs // Fetch resource names from main database for the unique resource IDs
const resourceIds = uniqueResources const resourceIds = uniqueResources
.map((row) => row.id) .map(row => row.id)
.filter((id): id is number => id !== null); .filter((id): id is number => id !== null);
const siteResourceIds = uniqueSiteResources const siteResourceIds = uniqueSiteResources
.map((row) => row.id) .map(row => row.id)
.filter((id): id is number => id !== null); .filter((id): id is number => id !== null);
let resourcesWithNames: Array<{ id: number; name: string | null }> = []; let resourcesWithNames: Array<{ id: number; name: string | null }> = [];
@@ -315,7 +293,7 @@ async function queryUniqueFilterAttributes(
resourcesWithNames = [ resourcesWithNames = [
...resourcesWithNames, ...resourcesWithNames,
...resourceDetails.map((r) => ({ ...resourceDetails.map(r => ({
id: r.resourceId, id: r.resourceId,
name: r.name name: r.name
})) }))
@@ -333,7 +311,7 @@ async function queryUniqueFilterAttributes(
resourcesWithNames = [ resourcesWithNames = [
...resourcesWithNames, ...resourcesWithNames,
...siteResourceDetails.map((r) => ({ ...siteResourceDetails.map(r => ({
id: r.siteResourceId, id: r.siteResourceId,
name: r.name name: r.name
})) }))
@@ -366,7 +344,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -171,7 +171,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -459,7 +459,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -17,7 +17,8 @@ import createHttpError from "http-errors";
import { z } from "zod"; import { z } from "zod";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import logger from "@server/logger"; import logger from "@server/logger";
import { db, safeRead, sessions, sessionTransferToken } from "@server/db"; import { sessions, sessionTransferToken } from "@server/db";
import { db } from "@server/db";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { response } from "@server/lib/response"; import { response } from "@server/lib/response";
import { encodeHexLowerCase } from "@oslojs/encoding"; import { encodeHexLowerCase } from "@oslojs/encoding";
@@ -56,8 +57,7 @@ export async function transferSession(
sha256(new TextEncoder().encode(token)) sha256(new TextEncoder().encode(token))
); );
const result = await safeRead((db) => const [existing] = await db
db
.select() .select()
.from(sessionTransferToken) .from(sessionTransferToken)
.where(eq(sessionTransferToken.token, tokenRaw)) .where(eq(sessionTransferToken.token, tokenRaw))
@@ -65,10 +65,7 @@ export async function transferSession(
sessions, sessions,
eq(sessions.sessionId, sessionTransferToken.sessionId) eq(sessions.sessionId, sessionTransferToken.sessionId)
) )
.limit(1) .limit(1);
);
const [existing] = result;
if (!existing) { if (!existing) {
return next( return next(
@@ -45,7 +45,7 @@ const getOrgSchema = z.strictObject({
// content: { // content: {
// "application/json": { // "application/json": {
// schema: z.object({ // schema: z.object({
// data: z.record(z.string(), z.any()).nullable(), // data: z.unknown().nullable(),
// success: z.boolean(), // success: z.boolean(),
// error: z.boolean(), // error: z.boolean(),
// message: z.string(), // message: z.string(),
@@ -0,0 +1,187 @@
/*
* This file is part of a proprietary work.
*
* Copyright (c) 2025-2026 Fossorial, Inc.
* All rights reserved.
*
* This file is licensed under the Fossorial Commercial License.
* You may not use this file except in compliance with the License.
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
*
* This file is not licensed under the AGPLv3.
*/
import { Request, Response, NextFunction } from "express";
import { z } from "zod";
import {
browserGatewayTarget,
BrowserGatewayTarget,
db,
newts,
resources,
sites
} from "@server/db";
import { eq, and } from "drizzle-orm";
import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode";
import createHttpError from "http-errors";
import logger from "@server/logger";
import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi";
import { encrypt } from "@server/lib/crypto";
import config from "@server/lib/config";
import { sendBrowserGatewayTargets } from "@server/routers/newt/targets";
import { generateId } from "@server/auth/sessions/app";
const paramsSchema = z.strictObject({
orgId: z.string().nonempty(),
resourceId: z.string().transform(Number).pipe(z.number().int().positive())
});
const bodySchema = z.strictObject({
siteId: z.number().int().positive(),
type: z.enum(["ssh", "rdp", "vnc"]),
destination: z.string().nonempty(),
destinationPort: z.number().int().min(1).max(65535)
});
export type CreateBrowserGatewayTargetResponse = BrowserGatewayTarget;
registry.registerPath({
method: "put",
path: "/org/{orgId}/resource/{resourceId}/browser-gateway-target",
description: "Create a browser gateway target for a resource.",
tags: [OpenAPITags.Org],
request: {
params: paramsSchema,
body: {
content: {
"application/json": {
schema: bodySchema
}
}
}
},
responses: {}
});
export async function createBrowserGatewayTarget(
req: Request,
res: Response,
next: NextFunction
): Promise<any> {
try {
const parsedParams = paramsSchema.safeParse(req.params);
if (!parsedParams.success) {
return next(
createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedParams.error).toString()
)
);
}
const { orgId, resourceId } = parsedParams.data;
const parsedBody = bodySchema.safeParse(req.body);
if (!parsedBody.success) {
return next(
createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedBody.error).toString()
)
);
}
const { siteId, type, destination, destinationPort } = parsedBody.data;
const [resource] = await db
.select()
.from(resources)
.where(
and(
eq(resources.resourceId, resourceId),
eq(resources.orgId, orgId)
)
)
.limit(1);
if (!resource) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`Resource with ID ${resourceId} not found in organization ${orgId}`
)
);
}
const [site] = await db
.select()
.from(sites)
.where(and(eq(sites.siteId, siteId), eq(sites.orgId, orgId)))
.limit(1);
if (!site) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`Site with ID ${siteId} not found in organization ${orgId}`
)
);
}
const plainToken = generateId(48);
const encryptedToken = encrypt(
plainToken,
config.getRawConfig().server.secret!
);
const [record] = await db
.insert(browserGatewayTarget)
.values({
resourceId,
siteId,
type,
destination,
destinationPort,
authToken: encryptedToken
})
.returning();
if (site.type === "newt") {
const [newt] = await db
.select()
.from(newts)
.where(eq(newts.siteId, siteId))
.limit(1);
if (newt) {
await sendBrowserGatewayTargets(
newt.newtId,
[record],
newt.version
);
}
}
logger.info(
`Created browser gateway target ${record.browserGatewayTargetId} for resource ${resourceId}`
);
return response<CreateBrowserGatewayTargetResponse>(res, {
data: record,
success: true,
error: false,
message: "Browser gateway target created successfully",
status: HttpCode.CREATED
});
} catch (error) {
logger.error(error);
return next(
createHttpError(
HttpCode.INTERNAL_SERVER_ERROR,
"Failed to create browser gateway target"
)
);
}
}
@@ -0,0 +1,130 @@
/*
* This file is part of a proprietary work.
*
* Copyright (c) 2025-2026 Fossorial, Inc.
* All rights reserved.
*
* This file is licensed under the Fossorial Commercial License.
* You may not use this file except in compliance with the License.
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
*
* This file is not licensed under the AGPLv3.
*/
import { Request, Response, NextFunction } from "express";
import { z } from "zod";
import { browserGatewayTarget, db, newts, sites } from "@server/db";
import { eq, and } from "drizzle-orm";
import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode";
import createHttpError from "http-errors";
import logger from "@server/logger";
import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi";
import { removeBrowserGatewayTarget } from "@server/routers/newt/targets";
const paramsSchema = z.strictObject({
orgId: z.string().nonempty(),
browserGatewayTargetId: z
.string()
.transform(Number)
.pipe(z.number().int().positive())
});
registry.registerPath({
method: "delete",
path: "/org/{orgId}/browser-gateway-target/{browserGatewayTargetId}",
description: "Delete a browser gateway target.",
tags: [OpenAPITags.Org],
request: {
params: paramsSchema
},
responses: {}
});
export async function deleteBrowserGatewayTarget(
req: Request,
res: Response,
next: NextFunction
): Promise<any> {
try {
const parsedParams = paramsSchema.safeParse(req.params);
if (!parsedParams.success) {
return next(
createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedParams.error).toString()
)
);
}
const { orgId, browserGatewayTargetId } = parsedParams.data;
const [existing] = await db
.select({ bgt: browserGatewayTarget, site: sites })
.from(browserGatewayTarget)
.innerJoin(sites, eq(sites.siteId, browserGatewayTarget.siteId))
.where(
and(
eq(
browserGatewayTarget.browserGatewayTargetId,
browserGatewayTargetId
),
eq(sites.orgId, orgId)
)
)
.limit(1);
if (!existing) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`Browser gateway target with ID ${browserGatewayTargetId} not found`
)
);
}
await db
.delete(browserGatewayTarget)
.where(
eq(
browserGatewayTarget.browserGatewayTargetId,
browserGatewayTargetId
)
);
if (existing.site.type === "newt") {
const [newt] = await db
.select()
.from(newts)
.where(eq(newts.siteId, existing.bgt.siteId))
.limit(1);
if (newt) {
await removeBrowserGatewayTarget(
newt.newtId,
browserGatewayTargetId,
newt.version
);
}
}
logger.info(`Deleted browser gateway target ${browserGatewayTargetId}`);
return response(res, {
data: null,
success: true,
error: false,
message: "Browser gateway target deleted successfully",
status: HttpCode.OK
});
} catch (error) {
logger.error(error);
return next(
createHttpError(
HttpCode.INTERNAL_SERVER_ERROR,
"Failed to delete browser gateway target"
)
);
}
}
@@ -0,0 +1,109 @@
/*
* This file is part of a proprietary work.
*
* Copyright (c) 2025-2026 Fossorial, Inc.
* All rights reserved.
*
* This file is licensed under the Fossorial Commercial License.
* You may not use this file except in compliance with the License.
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
*
* This file is not licensed under the AGPLv3.
*/
import { Request, Response, NextFunction } from "express";
import { z } from "zod";
import {
browserGatewayTarget,
BrowserGatewayTarget,
db,
sites
} from "@server/db";
import { eq, and } from "drizzle-orm";
import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode";
import createHttpError from "http-errors";
import logger from "@server/logger";
import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi";
const paramsSchema = z.strictObject({
orgId: z.string().nonempty(),
browserGatewayTargetId: z
.string()
.transform(Number)
.pipe(z.number().int().positive())
});
export type GetBrowserGatewayTargetResponse = BrowserGatewayTarget;
registry.registerPath({
method: "get",
path: "/org/{orgId}/browser-gateway-target/{browserGatewayTargetId}",
description: "Get a browser gateway target.",
tags: [OpenAPITags.Org],
request: {
params: paramsSchema
},
responses: {}
});
export async function getBrowserGatewayTarget(
req: Request,
res: Response,
next: NextFunction
): Promise<any> {
try {
const parsedParams = paramsSchema.safeParse(req.params);
if (!parsedParams.success) {
return next(
createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedParams.error).toString()
)
);
}
const { orgId, browserGatewayTargetId } = parsedParams.data;
const [result] = await db
.select({ bgt: browserGatewayTarget })
.from(browserGatewayTarget)
.innerJoin(sites, eq(sites.siteId, browserGatewayTarget.siteId))
.where(
and(
eq(
browserGatewayTarget.browserGatewayTargetId,
browserGatewayTargetId
),
eq(sites.orgId, orgId)
)
)
.limit(1);
if (!result) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`Browser gateway target with ID ${browserGatewayTargetId} not found`
)
);
}
return response<GetBrowserGatewayTargetResponse>(res, {
data: result.bgt,
success: true,
error: false,
message: "Browser gateway target retrieved successfully",
status: HttpCode.OK
});
} catch (error) {
logger.error(error);
return next(
createHttpError(
HttpCode.INTERNAL_SERVER_ERROR,
"Failed to retrieve browser gateway target"
)
);
}
}
@@ -13,8 +13,9 @@
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { z } from "zod"; import { z } from "zod";
import { db, resources, targets } from "@server/db"; import { browserGatewayTarget, db } from "@server/db";
import { eq, and, inArray } from "drizzle-orm"; import { resources, targets } from "@server/db";
import { eq } from "drizzle-orm";
import response from "@server/lib/response"; import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
@@ -50,30 +51,31 @@ export async function getBrowserTarget(
logger.info(`Retrieving browser target for domain: ${fullDomain}`); logger.info(`Retrieving browser target for domain: ${fullDomain}`);
const [row] = await db const [browserTarget] = await db
.select({ .select({
ip: targets.ip, destination: browserGatewayTarget.destination,
port: targets.port, destinationPort: browserGatewayTarget.destinationPort,
authToken: targets.authToken, authToken: browserGatewayTarget.authToken,
resourceId: resources.resourceId, resourceId: resources.resourceId,
niceId: resources.niceId, niceId: resources.niceId,
name: resources.name,
orgId: resources.orgId, orgId: resources.orgId,
pamMode: resources.pamMode, pamMode: resources.pamMode,
authDaemonMode: resources.authDaemonMode authDaemonMode: resources.authDaemonMode
}) })
.from(targets) .from(browserGatewayTarget)
.innerJoin(resources, eq(targets.resourceId, resources.resourceId)) .innerJoin(
.where( resources,
and( eq(browserGatewayTarget.resourceId, resources.resourceId)
eq(resources.fullDomain, fullDomain),
eq(targets.enabled, true),
inArray(targets.mode, ["ssh", "rdp", "vnc"])
)
) )
.where(eq(resources.fullDomain, fullDomain))
.limit(1); .limit(1);
if (!row) { const decryptedAuthToken = decrypt(
browserTarget.authToken,
config.getRawConfig().server.secret!
);
if (!browserTarget) {
return next( return next(
createHttpError( createHttpError(
HttpCode.NOT_FOUND, HttpCode.NOT_FOUND,
@@ -82,21 +84,16 @@ export async function getBrowserTarget(
); );
} }
const decryptedAuthToken = row.authToken
? decrypt(row.authToken, config.getRawConfig().server.secret!)
: "";
return response<GetBrowserTargetResponse>(res, { return response<GetBrowserTargetResponse>(res, {
data: { data: {
ip: row.ip, ip: browserTarget.destination,
port: row.port, port: browserTarget.destinationPort,
authToken: decryptedAuthToken, authToken: decryptedAuthToken,
pamMode: row.pamMode, pamMode: browserTarget.pamMode,
authDaemonMode: row.authDaemonMode, authDaemonMode: browserTarget.authDaemonMode,
orgId: row.orgId, orgId: browserTarget.orgId,
resourceId: row.resourceId, resourceId: browserTarget.resourceId,
niceId: row.niceId, niceId: browserTarget.niceId
name: row.name ?? ""
}, },
success: true, success: true,
error: false, error: false,
@@ -11,4 +11,9 @@
* This file is not licensed under the AGPLv3. * This file is not licensed under the AGPLv3.
*/ */
export * from "./createBrowserGatewayTarget";
export * from "./updateBrowserGatewayTarget";
export * from "./deleteBrowserGatewayTarget";
export * from "./getBrowserGatewayTarget";
export * from "./listBrowserGatewayTargets";
export * from "./getBrowserTarget"; export * from "./getBrowserTarget";
@@ -0,0 +1,159 @@
/*
* This file is part of a proprietary work.
*
* Copyright (c) 2025-2026 Fossorial, Inc.
* All rights reserved.
*
* This file is licensed under the Fossorial Commercial License.
* You may not use this file except in compliance with the License.
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
*
* This file is not licensed under the AGPLv3.
*/
import { Request, Response, NextFunction } from "express";
import { z } from "zod";
import {
browserGatewayTarget,
BrowserGatewayTarget,
db,
resources,
sites
} from "@server/db";
import { eq, and } from "drizzle-orm";
import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode";
import createHttpError from "http-errors";
import logger from "@server/logger";
import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi";
const paramsSchema = z.strictObject({
orgId: z.string().nonempty(),
resourceId: z.string().transform(Number).pipe(z.number().int().positive())
});
const querySchema = z.object({
limit: z
.string()
.optional()
.default("1000")
.transform(Number)
.pipe(z.number().int().positive()),
offset: z
.string()
.optional()
.default("0")
.transform(Number)
.pipe(z.number().int().nonnegative())
});
export type ListBrowserGatewayTargetsResponse = {
targets: BrowserGatewayTarget[];
total: number;
limit: number;
offset: number;
};
registry.registerPath({
method: "get",
path: "/org/{orgId}/resource/{resourceId}/browser-gateway-targets",
description: "List browser gateway targets for a resource.",
tags: [OpenAPITags.Org],
request: {
params: paramsSchema,
query: querySchema
},
responses: {}
});
export async function listBrowserGatewayTargets(
req: Request,
res: Response,
next: NextFunction
): Promise<any> {
try {
const parsedParams = paramsSchema.safeParse(req.params);
if (!parsedParams.success) {
return next(
createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedParams.error).toString()
)
);
}
const { orgId, resourceId } = parsedParams.data;
const parsedQuery = querySchema.safeParse(req.query);
if (!parsedQuery.success) {
return next(
createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedQuery.error).toString()
)
);
}
const { limit, offset } = parsedQuery.data;
const [resource] = await db
.select()
.from(resources)
.where(
and(
eq(resources.resourceId, resourceId),
eq(resources.orgId, orgId)
)
)
.limit(1);
if (!resource) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`Resource with ID ${resourceId} not found in organization ${orgId}`
)
);
}
const rows = await db
.select({
browserGatewayTargetId:
browserGatewayTarget.browserGatewayTargetId,
resourceId: browserGatewayTarget.resourceId,
siteId: browserGatewayTarget.siteId,
authToken: browserGatewayTarget.authToken,
type: browserGatewayTarget.type,
destination: browserGatewayTarget.destination,
destinationPort: browserGatewayTarget.destinationPort,
siteName: sites.name
})
.from(browserGatewayTarget)
.leftJoin(sites, eq(sites.siteId, browserGatewayTarget.siteId))
.where(eq(browserGatewayTarget.resourceId, resourceId))
.limit(limit)
.offset(offset);
return response<ListBrowserGatewayTargetsResponse>(res, {
data: {
targets: rows as any,
total: rows.length,
limit,
offset
},
success: true,
error: false,
message: "Browser gateway targets retrieved successfully",
status: HttpCode.OK
});
} catch (error) {
logger.error(error);
return next(
createHttpError(
HttpCode.INTERNAL_SERVER_ERROR,
"Failed to list browser gateway targets"
)
);
}
}
@@ -0,0 +1,180 @@
/*
* This file is part of a proprietary work.
*
* Copyright (c) 2025-2026 Fossorial, Inc.
* All rights reserved.
*
* This file is licensed under the Fossorial Commercial License.
* You may not use this file except in compliance with the License.
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
*
* This file is not licensed under the AGPLv3.
*/
import { Request, Response, NextFunction } from "express";
import { z } from "zod";
import {
browserGatewayTarget,
BrowserGatewayTarget,
db,
newts,
sites
} from "@server/db";
import { eq, and } from "drizzle-orm";
import response from "@server/lib/response";
import HttpCode from "@server/types/HttpCode";
import createHttpError from "http-errors";
import logger from "@server/logger";
import { fromError } from "zod-validation-error";
import { OpenAPITags, registry } from "@server/openApi";
import { sendBrowserGatewayTargets } from "@server/routers/newt/targets";
const paramsSchema = z.strictObject({
orgId: z.string().nonempty(),
browserGatewayTargetId: z
.string()
.transform(Number)
.pipe(z.number().int().positive())
});
const bodySchema = z.strictObject({
siteId: z.number().int().positive().optional(),
type: z.enum(["ssh", "rdp", "vnc"]).optional(),
destination: z.string().nonempty().optional(),
destinationPort: z.number().int().min(1).max(65535).optional()
});
export type UpdateBrowserGatewayTargetResponse = BrowserGatewayTarget;
registry.registerPath({
method: "post",
path: "/org/{orgId}/browser-gateway-target/{browserGatewayTargetId}",
description: "Update a browser gateway target.",
tags: [OpenAPITags.Org],
request: {
params: paramsSchema,
body: {
content: {
"application/json": {
schema: bodySchema
}
}
}
},
responses: {}
});
export async function updateBrowserGatewayTarget(
req: Request,
res: Response,
next: NextFunction
): Promise<any> {
try {
const parsedParams = paramsSchema.safeParse(req.params);
if (!parsedParams.success) {
return next(
createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedParams.error).toString()
)
);
}
const { orgId, browserGatewayTargetId } = parsedParams.data;
const parsedBody = bodySchema.safeParse(req.body);
if (!parsedBody.success) {
return next(
createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedBody.error).toString()
)
);
}
const { siteId, type, destination, destinationPort } = parsedBody.data;
const [existing] = await db
.select({ bgt: browserGatewayTarget, site: sites })
.from(browserGatewayTarget)
.innerJoin(sites, eq(sites.siteId, browserGatewayTarget.siteId))
.where(
and(
eq(
browserGatewayTarget.browserGatewayTargetId,
browserGatewayTargetId
),
eq(sites.orgId, orgId)
)
)
.limit(1);
if (!existing) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`Browser gateway target with ID ${browserGatewayTargetId} not found`
)
);
}
const updateValues: Partial<BrowserGatewayTarget> = {};
if (siteId !== undefined) updateValues.siteId = siteId;
if (type !== undefined) updateValues.type = type;
if (destination !== undefined) updateValues.destination = destination;
if (destinationPort !== undefined)
updateValues.destinationPort = destinationPort;
const [updated] = await db
.update(browserGatewayTarget)
.set(updateValues)
.where(
eq(
browserGatewayTarget.browserGatewayTargetId,
browserGatewayTargetId
)
)
.returning();
const targetSiteId = siteId ?? existing.bgt.siteId;
const [site] = await db
.select()
.from(sites)
.where(eq(sites.siteId, targetSiteId))
.limit(1);
if (site && site.type === "newt") {
const [newt] = await db
.select()
.from(newts)
.where(eq(newts.siteId, targetSiteId))
.limit(1);
if (newt) {
await sendBrowserGatewayTargets(
newt.newtId,
[updated],
newt.version
);
}
}
logger.info(`Updated browser gateway target ${browserGatewayTargetId}`);
return response<UpdateBrowserGatewayTargetResponse>(res, {
data: updated,
success: true,
error: false,
message: "Browser gateway target updated successfully",
status: HttpCode.OK
});
} catch (error) {
logger.error(error);
return next(
createHttpError(
HttpCode.INTERNAL_SERVER_ERROR,
"Failed to update browser gateway target"
)
);
}
}
@@ -121,7 +121,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -46,7 +46,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -29,7 +29,7 @@ import { tierMatrix } from "@server/lib/billing/tierMatrix";
const paramsSchema = z.strictObject({}); const paramsSchema = z.strictObject({});
const querySchema = z.strictObject({ const querySchema = z.strictObject({
subdomain: z.string() subdomain: z.string(),
// orgId: build === "saas" ? z.string() : z.string().optional() // Required for saas, optional otherwise // orgId: build === "saas" ? z.string() : z.string().optional() // Required for saas, optional otherwise
}); });
@@ -48,7 +48,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -33,8 +33,7 @@ const paramsSchema = z
registry.registerPath({ registry.registerPath({
method: "delete", method: "delete",
path: "/org/{orgId}/event-streaming-destination/{destinationId}", path: "/org/{orgId}/event-streaming-destination/{destinationId}",
description: description: "Delete an event streaming destination for a specific organization.",
"Delete an event streaming destination for a specific organization.",
tags: [OpenAPITags.Org], tags: [OpenAPITags.Org],
request: { request: {
params: paramsSchema params: paramsSchema
@@ -45,7 +44,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
+47 -1
View File
@@ -31,6 +31,7 @@ import * as siteProvisioning from "#private/routers/siteProvisioning";
import * as eventStreamingDestination from "#private/routers/eventStreamingDestination"; import * as eventStreamingDestination from "#private/routers/eventStreamingDestination";
import * as alertRule from "#private/routers/alertRule"; import * as alertRule from "#private/routers/alertRule";
import * as healthChecks from "#private/routers/healthChecks"; import * as healthChecks from "#private/routers/healthChecks";
import * as browserGatewayTarget from "#private/routers/browserGatewayTarget";
import * as labels from "#private/routers/labels"; import * as labels from "#private/routers/labels";
import * as client from "@server/routers/client"; import * as client from "@server/routers/client";
import * as resource from "#private/routers/resource"; import * as resource from "#private/routers/resource";
@@ -612,7 +613,7 @@ authenticated.post(
verifyValidSubscription(tierMatrix.advancedPrivateResources), verifyValidSubscription(tierMatrix.advancedPrivateResources),
verifyOrgAccess, verifyOrgAccess,
verifyLimits, verifyLimits,
// verifyUserHasAction(ActionsEnum.signSshKey), // this check happens inside of the function now verifyUserHasAction(ActionsEnum.signSshKey),
// logActionAudit(ActionsEnum.signSshKey), // it is handled inside of the function below so we can include more metadata // logActionAudit(ActionsEnum.signSshKey), // it is handled inside of the function below so we can include more metadata
ssh.signSshKey ssh.signSshKey
); );
@@ -878,3 +879,48 @@ authenticated.post(
verifyClientAccess, verifyClientAccess,
client.rebuildClientAssociationsCacheRoute client.rebuildClientAssociationsCacheRoute
); );
authenticated.put(
"/org/:orgId/resource/:resourceId/browser-gateway-target",
verifyValidLicense,
verifyOrgAccess,
verifyLimits,
verifyUserHasAction(ActionsEnum.createBrowserGatewayTarget),
logActionAudit(ActionsEnum.createBrowserGatewayTarget),
browserGatewayTarget.createBrowserGatewayTarget
);
authenticated.get(
"/org/:orgId/resource/:resourceId/browser-gateway-targets",
verifyValidLicense,
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.listBrowserGatewayTargets),
browserGatewayTarget.listBrowserGatewayTargets
);
authenticated.get(
"/org/:orgId/browser-gateway-target/:browserGatewayTargetId",
verifyValidLicense,
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.getBrowserGatewayTarget),
browserGatewayTarget.getBrowserGatewayTarget
);
authenticated.post(
"/org/:orgId/browser-gateway-target/:browserGatewayTargetId",
verifyValidLicense,
verifyOrgAccess,
verifyLimits,
verifyUserHasAction(ActionsEnum.updateBrowserGatewayTarget),
logActionAudit(ActionsEnum.updateBrowserGatewayTarget),
browserGatewayTarget.updateBrowserGatewayTarget
);
authenticated.delete(
"/org/:orgId/browser-gateway-target/:browserGatewayTargetId",
verifyValidLicense,
verifyOrgAccess,
verifyUserHasAction(ActionsEnum.deleteBrowserGatewayTarget),
logActionAudit(ActionsEnum.deleteBrowserGatewayTarget),
browserGatewayTarget.deleteBrowserGatewayTarget
);
@@ -47,7 +47,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -74,7 +74,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
+6 -32
View File
@@ -79,10 +79,7 @@ import logger from "@server/logger";
import { decrypt } from "@server/lib/crypto"; import { decrypt } from "@server/lib/crypto";
import config from "@server/lib/config"; import config from "@server/lib/config";
import { exchangeSession } from "@server/routers/badger"; import { exchangeSession } from "@server/routers/badger";
import { import { validateResourceSessionToken } from "@server/auth/sessions/resource";
ResourceSessionValidationResult,
validateResourceSessionToken
} from "@server/auth/sessions/resource";
import { checkExitNodeOrg, resolveExitNodes } from "#private/lib/exitNodes"; import { checkExitNodeOrg, resolveExitNodes } from "#private/lib/exitNodes";
import { maxmindLookup } from "@server/db/maxmind"; import { maxmindLookup } from "@server/db/maxmind";
import { verifyResourceAccessToken } from "@server/auth/verifyResourceAccessToken"; import { verifyResourceAccessToken } from "@server/auth/verifyResourceAccessToken";
@@ -219,9 +216,9 @@ export type ResourceWithAuth = {
password: ResourcePassword | ResourcePolicyPassword | null; password: ResourcePassword | ResourcePolicyPassword | null;
headerAuth: ResourceHeaderAuth | ResourcePolicyHeaderAuth | null; headerAuth: ResourceHeaderAuth | ResourcePolicyHeaderAuth | null;
headerAuthExtendedCompatibility: ResourceHeaderAuthExtendedCompatibility | null; headerAuthExtendedCompatibility: ResourceHeaderAuthExtendedCompatibility | null;
applyRules: boolean | null; applyRules: boolean;
sso: boolean | null; sso: boolean;
emailWhitelistEnabled: boolean | null; emailWhitelistEnabled: boolean;
org: Org; org: Org;
}; };
@@ -1757,34 +1754,11 @@ hybridRouter.post(
resourceId resourceId
); );
// this is for backward compatibility with nodes that did not have the policy id checking
const modifiedResult: ResourceSessionValidationResult = {
...result,
resourceSession: result.resourceSession
? {
...result.resourceSession,
// Prefer policy IDs, but keep legacy IDs populated for older nodes.
pincodeId:
result.resourceSession.policyPincodeId ??
result.resourceSession.pincodeId ??
null,
passwordId:
result.resourceSession.policyPasswordId ??
result.resourceSession.passwordId ??
null,
whitelistId:
result.resourceSession.policyWhitelistId ??
result.resourceSession.whitelistId ??
null
}
: null
};
return response(res, { return response(res, {
data: modifiedResult, data: result,
success: true, success: true,
error: false, error: false,
message: modifiedResult.resourceSession message: result.resourceSession
? "Resource session token is valid" ? "Resource session token is valid"
: "Resource session token is invalid or expired", : "Resource session token is invalid or expired",
status: HttpCode.OK status: HttpCode.OK
+41
View File
@@ -16,6 +16,7 @@ import * as org from "#private/routers/org";
import * as logs from "#private/routers/auditLogs"; import * as logs from "#private/routers/auditLogs";
import * as alertEvents from "#private/routers/alertEvents"; import * as alertEvents from "#private/routers/alertEvents";
import * as certificates from "#private/routers/certificates"; import * as certificates from "#private/routers/certificates";
import * as browserGatewayTarget from "#private/routers/browserGatewayTarget";
import { import {
verifyApiKeyHasAction, verifyApiKeyHasAction,
@@ -215,3 +216,43 @@ authenticated.delete(
logActionAudit(ActionsEnum.removeUserRole), logActionAudit(ActionsEnum.removeUserRole),
user.removeUserRole user.removeUserRole
); );
authenticated.put(
"/org/:orgId/resource/:resourceId/browser-gateway-target",
verifyApiKeyOrgAccess,
verifyLimits,
verifyApiKeyHasAction(ActionsEnum.createBrowserGatewayTarget),
logActionAudit(ActionsEnum.createBrowserGatewayTarget),
browserGatewayTarget.createBrowserGatewayTarget
);
authenticated.get(
"/org/:orgId/resource/:resourceId/browser-gateway-targets",
verifyApiKeyOrgAccess,
verifyApiKeyHasAction(ActionsEnum.listBrowserGatewayTargets),
browserGatewayTarget.listBrowserGatewayTargets
);
authenticated.get(
"/org/:orgId/browser-gateway-target/:browserGatewayTargetId",
verifyApiKeyOrgAccess,
verifyApiKeyHasAction(ActionsEnum.getBrowserGatewayTarget),
browserGatewayTarget.getBrowserGatewayTarget
);
authenticated.post(
"/org/:orgId/browser-gateway-target/:browserGatewayTargetId",
verifyApiKeyOrgAccess,
verifyLimits,
verifyApiKeyHasAction(ActionsEnum.updateBrowserGatewayTarget),
logActionAudit(ActionsEnum.updateBrowserGatewayTarget),
browserGatewayTarget.updateBrowserGatewayTarget
);
authenticated.delete(
"/org/:orgId/browser-gateway-target/:browserGatewayTargetId",
verifyApiKeyOrgAccess,
verifyApiKeyHasAction(ActionsEnum.deleteBrowserGatewayTarget),
logActionAudit(ActionsEnum.deleteBrowserGatewayTarget),
browserGatewayTarget.deleteBrowserGatewayTarget
);
+1 -1
View File
@@ -17,9 +17,9 @@ import * as orgIdp from "#private/routers/orgIdp";
import * as billing from "#private/routers/billing"; import * as billing from "#private/routers/billing";
import * as license from "#private/routers/license"; import * as license from "#private/routers/license";
import * as resource from "#private/routers/resource"; import * as resource from "#private/routers/resource";
import * as browserTarget from "#private/routers/browserGatewayTarget";
import * as ssh from "#private/routers/ssh"; import * as ssh from "#private/routers/ssh";
import * as ws from "@server/routers/ws"; import * as ws from "@server/routers/ws";
import * as browserTarget from "#private/routers/browserGatewayTarget";
import { import {
verifySessionUserMiddleware, verifySessionUserMiddleware,
@@ -22,7 +22,7 @@ import response from "@server/lib/response";
import logger from "@server/logger"; import logger from "@server/logger";
import type { CreateOrEditLabelResponse } from "@server/routers/labels/types"; import type { CreateOrEditLabelResponse } from "@server/routers/labels/types";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import { and, eq, sql } from "drizzle-orm"; import { and, eq } from "drizzle-orm";
import { NextFunction, Request, Response } from "express"; import { NextFunction, Request, Response } from "express";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
import { z } from "zod"; import { z } from "zod";
@@ -107,26 +107,6 @@ export async function createOrgLabel(
} }
} }
const [existingLabel] = await db
.select({ labelId: labels.labelId })
.from(labels)
.where(
and(
eq(labels.orgId, orgId),
sql`LOWER(${labels.name}) = ${name.toLowerCase()}`
)
)
.limit(1);
if (existingLabel) {
return next(
createHttpError(
HttpCode.CONFLICT,
"A label with this name already exists"
)
);
}
const label = await db.transaction(async (tx) => { const label = await db.transaction(async (tx) => {
const [label] = await tx const [label] = await tx
.insert(labels) .insert(labels)
@@ -16,7 +16,7 @@ import response from "@server/lib/response";
import logger from "@server/logger"; import logger from "@server/logger";
import type { CreateOrEditLabelResponse } from "@server/routers/labels/types"; import type { CreateOrEditLabelResponse } from "@server/routers/labels/types";
import HttpCode from "@server/types/HttpCode"; import HttpCode from "@server/types/HttpCode";
import { and, eq, ne, sql } from "drizzle-orm"; import { and, eq } from "drizzle-orm";
import { NextFunction, Request, Response } from "express"; import { NextFunction, Request, Response } from "express";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
import { z } from "zod"; import { z } from "zod";
@@ -74,29 +74,6 @@ export async function updateOrgLabel(
const { name, color } = parsedBody.data; const { name, color } = parsedBody.data;
if (name && name.toLowerCase() !== existing.name.toLowerCase()) {
const [duplicateLabel] = await db
.select({ labelId: labels.labelId })
.from(labels)
.where(
and(
eq(labels.orgId, orgId),
ne(labels.labelId, labelId),
sql`LOWER(${labels.name}) = ${name.toLowerCase()}`
)
)
.limit(1);
if (duplicateLabel) {
return next(
createHttpError(
HttpCode.CONFLICT,
"A label with this name already exists"
)
);
}
}
const [label] = await db const [label] = await db
.update(labels) .update(labels)
.set({ .set({
@@ -69,7 +69,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -127,8 +127,7 @@ export async function createOrgOidcIdp(
let { autoProvision } = parsedBody.data; let { autoProvision } = parsedBody.data;
if (build == "saas") { if (build == "saas") { // this is not paywalled with a ee license because this whole endpoint is restricted
// this is not paywalled with a ee license because this whole endpoint is restricted
const subscribed = await isSubscribed( const subscribed = await isSubscribed(
orgId, orgId,
tierMatrix.deviceApprovals tierMatrix.deviceApprovals
@@ -44,7 +44,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
+1 -1
View File
@@ -62,7 +62,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
+1 -1
View File
@@ -78,7 +78,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -33,8 +33,9 @@ import {
import { getUniqueResourcePolicyName } from "@server/db/names"; import { getUniqueResourcePolicyName } from "@server/db/names";
import response from "@server/lib/response"; import response from "@server/lib/response";
import { import {
getResourceRuleValueValidationError, isValidCIDR,
RESOURCE_RULE_MATCH_TYPES isValidIP,
isValidUrlGlobPattern
} from "@server/lib/validators"; } from "@server/lib/validators";
import logger from "@server/logger"; import logger from "@server/logger";
import { OpenAPITags, registry } from "@server/openApi"; import { OpenAPITags, registry } from "@server/openApi";
@@ -55,9 +56,9 @@ const ruleSchema = z.strictObject({
enum: ["ACCEPT", "DROP", "PASS"], enum: ["ACCEPT", "DROP", "PASS"],
description: "rule action" description: "rule action"
}), }),
match: z.enum(RESOURCE_RULE_MATCH_TYPES).openapi({ match: z.enum(["CIDR", "IP", "PATH"]).openapi({
type: "string", type: "string",
enum: [...RESOURCE_RULE_MATCH_TYPES], enum: ["CIDR", "IP", "PATH"],
description: "rule match" description: "rule match"
}), }),
value: z.string().min(1), value: z.string().min(1),
@@ -260,13 +261,26 @@ export async function createResourcePolicy(
const niceId = await getUniqueResourcePolicyName(orgId); const niceId = await getUniqueResourcePolicyName(orgId);
for (const rule of rules) { for (const rule of rules) {
const validationError = getResourceRuleValueValidationError( if (rule.match === "CIDR" && !isValidCIDR(rule.value)) {
rule.match,
rule.value
);
if (validationError) {
return next( return next(
createHttpError(HttpCode.BAD_REQUEST, validationError) createHttpError(
HttpCode.BAD_REQUEST,
"Invalid CIDR provided"
)
);
} else if (rule.match === "IP" && !isValidIP(rule.value)) {
return next(
createHttpError(HttpCode.BAD_REQUEST, "Invalid IP provided")
);
} else if (
rule.match === "PATH" &&
!isValidUrlGlobPattern(rule.value)
) {
return next(
createHttpError(
HttpCode.BAD_REQUEST,
"Invalid URL glob pattern provided"
)
); );
} }
} }
@@ -216,7 +216,6 @@ export async function listResourcePolicies(
: await db : await db
.select({ .select({
resourceId: resources.resourceId, resourceId: resources.resourceId,
niceId: resources.niceId,
name: resources.name, name: resources.name,
fullDomain: resources.fullDomain, fullDomain: resources.fullDomain,
resourcePolicyId: resources.resourcePolicyId resourcePolicyId: resources.resourcePolicyId
@@ -1,202 +0,0 @@
/*
* This file is part of a proprietary work.
*
* Copyright (c) 2025-2026 Fossorial, Inc.
* All rights reserved.
*
* This file is licensed under the Fossorial Commercial License.
* You may not use this file except in compliance with the License.
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
*
* This file is not licensed under the AGPLv3.
*/
import axios from "axios";
import { db, exitNodes, newts, sites } from "@server/db";
import { eq } from "drizzle-orm";
import logger from "@server/logger";
import redisManager from "#private/lib/redis";
import { sendToClient } from "#private/routers/ws";
const INITIAL_DELAY_MS = 15 * 1000; // 15 seconds before first check
const CHECK_INTERVAL_MS = 10 * 1000; // Check every 10 seconds
const MAX_DURATION_MS = 5 * 60 * 1000; // Give up after 5 minutes
const REDIS_PENDING_SET = "exit-node-reconnect-pending";
const REDIS_HASH_PREFIX = "exit-node-reconnect:";
interface PendingReconnect {
startTime: number;
reachableAt: string;
}
// In-memory tracking for this node
const pendingReconnects = new Map<number, PendingReconnect>();
let schedulerInterval: NodeJS.Timeout | null = null;
/**
* Schedules a reconnect check for newts connected to the given exit node.
* Called when an exit node transitions from offline to online.
*/
export async function scheduleExitNodeReconnect(
exitNodeId: number,
reachableAt: string
): Promise<void> {
logger.info(
`Scheduling newt reconnect for exit node ${exitNodeId} (reachableAt: ${reachableAt})`
);
const entry: PendingReconnect = {
startTime: Date.now(),
reachableAt
};
pendingReconnects.set(exitNodeId, entry);
// Store in Redis if available for cross-node coordination
if (redisManager.isRedisEnabled()) {
await redisManager.sadd(REDIS_PENDING_SET, exitNodeId.toString());
await redisManager.hset(
`${REDIS_HASH_PREFIX}${exitNodeId}`,
"startTime",
entry.startTime.toString()
);
await redisManager.hset(
`${REDIS_HASH_PREFIX}${exitNodeId}`,
"reachableAt",
reachableAt
);
}
}
/**
* Starts the background interval that checks pending exit node reconnects.
*/
export function startExitNodeReconnectScheduler(): void {
if (schedulerInterval) {
return;
}
schedulerInterval = setInterval(async () => {
try {
await processPendingReconnects();
} catch (error) {
logger.error("Error in exit node reconnect scheduler", { error });
}
}, CHECK_INTERVAL_MS);
logger.debug("Started exit node reconnect scheduler");
}
async function processPendingReconnects(): Promise<void> {
// Merge in-memory and Redis-tracked pending reconnects
const toProcess = new Map(pendingReconnects);
if (redisManager.isRedisEnabled()) {
const redisIds = await redisManager.smembers(REDIS_PENDING_SET);
for (const idStr of redisIds) {
const id = parseInt(idStr, 10);
if (!toProcess.has(id)) {
const startTimeStr = await redisManager.hget(
`${REDIS_HASH_PREFIX}${id}`,
"startTime"
);
const reachableAt = await redisManager.hget(
`${REDIS_HASH_PREFIX}${id}`,
"reachableAt"
);
if (startTimeStr && reachableAt) {
toProcess.set(id, {
startTime: parseInt(startTimeStr, 10),
reachableAt
});
}
}
}
}
const now = Date.now();
for (const [exitNodeId, entry] of toProcess) {
const elapsed = now - entry.startTime;
// Give up after max duration
if (elapsed >= MAX_DURATION_MS) {
logger.warn(
`Exit node reconnect check timed out for exit node ${exitNodeId} after 5 minutes`
);
await removePending(exitNodeId);
continue;
}
// Respect initial delay
if (elapsed < INITIAL_DELAY_MS) {
continue;
}
// Check if the exit node HTTP endpoint is reachable
const pingUrl = `${entry.reachableAt}/ping`;
try {
await axios.get(pingUrl, { timeout: 5000 });
} catch {
logger.debug(
`Exit node ${exitNodeId} not yet reachable at ${pingUrl}`
);
continue;
}
// Node is reachable — send reconnect to all connected newts
logger.info(
`Exit node ${exitNodeId} is reachable. Sending newt/wg/reconnect to connected newts.`
);
await sendReconnectToNewts(exitNodeId);
await removePending(exitNodeId);
}
}
async function sendReconnectToNewts(exitNodeId: number): Promise<void> {
try {
const connectedNewts = await db
.select({ newtId: newts.newtId })
.from(newts)
.innerJoin(sites, eq(newts.siteId, sites.siteId))
.where(eq(sites.exitNodeId, exitNodeId));
if (connectedNewts.length === 0) {
logger.debug(
`No newts found for exit node ${exitNodeId}, nothing to reconnect`
);
return;
}
logger.info(
`Sending newt/wg/reconnect to ${connectedNewts.length} newt(s) for exit node ${exitNodeId}`
);
const reconnectMessage = {
type: "newt/wg/reconnect",
data: {}
};
await Promise.allSettled(
connectedNewts.map(({ newtId }) =>
sendToClient(newtId, reconnectMessage)
)
);
} catch (error) {
logger.error(
`Failed to send reconnect messages for exit node ${exitNodeId}`,
{ error }
);
}
}
async function removePending(exitNodeId: number): Promise<void> {
pendingReconnects.delete(exitNodeId);
if (redisManager.isRedisEnabled()) {
await redisManager.srem(REDIS_PENDING_SET, exitNodeId.toString());
await redisManager.del(`${REDIS_HASH_PREFIX}${exitNodeId}`);
}
}
@@ -16,7 +16,6 @@ import { MessageHandler } from "@server/routers/ws";
import { RemoteExitNode } from "@server/db"; import { RemoteExitNode } from "@server/db";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import logger from "@server/logger"; import logger from "@server/logger";
import { scheduleExitNodeReconnect } from "./exitNodeReconnectScheduler";
/** /**
* Handles ping messages from clients and responds with pong * Handles ping messages from clients and responds with pong
@@ -38,13 +37,6 @@ export const handleRemoteExitNodePingMessage: MessageHandler = async (
} }
try { try {
// Fetch the current state before updating so we can detect the offline→online transition
const [currentExitNode] = await db
.select({ online: exitNodes.online, reachableAt: exitNodes.reachableAt })
.from(exitNodes)
.where(eq(exitNodes.exitNodeId, remoteExitNode.exitNodeId))
.limit(1);
// Update the exit node's last ping timestamp // Update the exit node's last ping timestamp
await db await db
.update(exitNodes) .update(exitNodes)
@@ -53,16 +45,6 @@ export const handleRemoteExitNodePingMessage: MessageHandler = async (
online: true online: true
}) })
.where(eq(exitNodes.exitNodeId, remoteExitNode.exitNodeId)); .where(eq(exitNodes.exitNodeId, remoteExitNode.exitNodeId));
// If the exit node was offline and is now coming online, schedule newt reconnects
if (currentExitNode && !currentExitNode.online && currentExitNode.reachableAt) {
scheduleExitNodeReconnect(
remoteExitNode.exitNodeId,
currentExitNode.reachableAt
).catch((error) => {
logger.error("Failed to schedule exit node reconnect", { error });
});
}
} catch (error) { } catch (error) {
logger.error("Error handling ping message", { error }); logger.error("Error handling ping message", { error });
} }
@@ -22,4 +22,3 @@ export * from "./listRemoteExitNodes";
export * from "./pickRemoteExitNodeDefaults"; export * from "./pickRemoteExitNodeDefaults";
export * from "./quickStartRemoteExitNode"; export * from "./quickStartRemoteExitNode";
export * from "./offlineChecker"; export * from "./offlineChecker";
export * from "./exitNodeReconnectScheduler";
+27 -97
View File
@@ -12,7 +12,6 @@
*/ */
import { Request, Response, NextFunction } from "express"; import { Request, Response, NextFunction } from "express";
import { randomInt } from "crypto";
import { z } from "zod"; import { z } from "zod";
import { import {
actionAuditLog, actionAuditLog,
@@ -20,8 +19,6 @@ import {
logsDb, logsDb,
newts, newts,
roles, roles,
roleActions,
rolePolicies,
roleResources, roleResources,
roleSiteResources, roleSiteResources,
resources, resources,
@@ -32,7 +29,8 @@ import {
userOrgs, userOrgs,
sites, sites,
Resource, Resource,
SiteResource SiteResource,
browserGatewayTarget
} from "@server/db"; } from "@server/db";
import { logAccessAudit } from "#private/lib/logAccessAudit"; import { logAccessAudit } from "#private/lib/logAccessAudit";
import { isLicensedOrSubscribed } from "#private/lib/isLicencedOrSubscribed"; import { isLicensedOrSubscribed } from "#private/lib/isLicencedOrSubscribed";
@@ -42,7 +40,7 @@ import HttpCode from "@server/types/HttpCode";
import createHttpError from "http-errors"; import createHttpError from "http-errors";
import logger from "@server/logger"; import logger from "@server/logger";
import { fromError } from "zod-validation-error"; import { fromError } from "zod-validation-error";
import { and, eq, inArray, isNull, or } from "drizzle-orm"; import { and, eq, inArray, or } from "drizzle-orm";
import { canUserAccessResource } from "@server/auth/canUserAccessResource"; import { canUserAccessResource } from "@server/auth/canUserAccessResource";
import { canUserAccessSiteResource } from "@server/auth/canUserAccessSiteResource"; import { canUserAccessSiteResource } from "@server/auth/canUserAccessSiteResource";
import { signPublicKey, getOrgCAKeys } from "@server/lib/sshCA"; import { signPublicKey, getOrgCAKeys } from "@server/lib/sshCA";
@@ -142,27 +140,6 @@ export async function signSshKey(
); );
} }
const roleActionPermission = await db
.select({ roleId: roleActions.roleId })
.from(roleActions)
.where(
and(
eq(roleActions.actionId, ActionsEnum.signSshKey),
inArray(roleActions.roleId, roleIds),
eq(roleActions.orgId, orgId)
)
)
.limit(1);
if (roleActionPermission.length === 0) {
return next(
createHttpError(
HttpCode.FORBIDDEN,
"User does not have permission perform this action"
)
);
}
const isLicensed = await isLicensedOrSubscribed( const isLicensed = await isLicensedOrSubscribed(
orgId, orgId,
tierMatrix.advancedPrivateResources tierMatrix.advancedPrivateResources
@@ -313,15 +290,16 @@ export async function signSshKey(
const publicResource = resource as Resource; const publicResource = resource as Resource;
const targetRows = await db const targetRows = await db
.select({ .select({
siteId: targets.siteId, siteId: browserGatewayTarget.siteId,
ip: targets.ip ip: browserGatewayTarget.destination
}) })
.from(targets) .from(browserGatewayTarget)
.where( .where(
and( and(
eq(targets.resourceId, publicResource.resourceId), eq(
eq(targets.enabled, true), browserGatewayTarget.resourceId,
eq(targets.mode, "ssh") publicResource.resourceId
)
) )
); );
@@ -414,7 +392,7 @@ export async function signSshKey(
if (existingUserWithSameName) { if (existingUserWithSameName) {
let foundUniqueUsername = false; let foundUniqueUsername = false;
for (let attempt = 0; attempt < 20; attempt++) { for (let attempt = 0; attempt < 20; attempt++) {
const randomNum = randomInt(0, 101); // 0 to 100 const randomNum = Math.floor(Math.random() * 101); // 0 to 100
const candidateUsername = `${usernameToUse}${randomNum}`; const candidateUsername = `${usernameToUse}${randomNum}`;
const [existingUser] = await db const [existingUser] = await db
@@ -458,20 +436,10 @@ export async function signSshKey(
usernameToUse = userOrg.pamUsername; usernameToUse = userOrg.pamUsername;
} }
type RoleSshMeta = { const roleRows =
roleId: number; type === "private"
sshSudoCommands: string | null; ? await db
sshUnixGroups: string | null;
sshCreateHomeDir: boolean | null;
sshSudoMode: string | null;
};
let roleRows: RoleSshMeta[] = [];
if (type === "private") {
roleRows = await db
.select({ .select({
roleId: roles.roleId,
sshSudoCommands: roles.sshSudoCommands, sshSudoCommands: roles.sshSudoCommands,
sshUnixGroups: roles.sshUnixGroups, sshUnixGroups: roles.sshUnixGroups,
sshCreateHomeDir: roles.sshCreateHomeDir, sshCreateHomeDir: roles.sshCreateHomeDir,
@@ -490,13 +458,9 @@ export async function signSshKey(
(resource as SiteResource).siteResourceId (resource as SiteResource).siteResourceId
) )
) )
); )
} else { : await db
const publicResourceId = (resource as Resource).resourceId;
const [directRoleRows, policyRoleRows] = await Promise.all([
db
.select({ .select({
roleId: roles.roleId,
sshSudoCommands: roles.sshSudoCommands, sshSudoCommands: roles.sshSudoCommands,
sshUnixGroups: roles.sshUnixGroups, sshUnixGroups: roles.sshUnixGroups,
sshCreateHomeDir: roles.sshCreateHomeDir, sshCreateHomeDir: roles.sshCreateHomeDir,
@@ -510,54 +474,12 @@ export async function signSshKey(
.where( .where(
and( and(
inArray(roles.roleId, roleIds), inArray(roles.roleId, roleIds),
eq(roleResources.resourceId, publicResourceId)
)
),
db
.select({
roleId: roles.roleId,
sshSudoCommands: roles.sshSudoCommands,
sshUnixGroups: roles.sshUnixGroups,
sshCreateHomeDir: roles.sshCreateHomeDir,
sshSudoMode: roles.sshSudoMode
})
.from(roles)
.innerJoin(
rolePolicies,
eq(rolePolicies.roleId, roles.roleId)
)
.innerJoin(
resources,
or(
eq( eq(
resources.resourcePolicyId, roleResources.resourceId,
rolePolicies.resourcePolicyId (resource as Resource).resourceId
),
and(
isNull(resources.resourcePolicyId),
eq(
resources.defaultResourcePolicyId,
rolePolicies.resourcePolicyId
) )
) )
) );
)
.where(
and(
inArray(roles.roleId, roleIds),
eq(resources.resourceId, publicResourceId)
)
)
]);
const uniqueByRoleId = new Map<number, RoleSshMeta>();
for (const row of [...directRoleRows, ...policyRoleRows]) {
if (!uniqueByRoleId.has(row.roleId)) {
uniqueByRoleId.set(row.roleId, row);
}
}
roleRows = Array.from(uniqueByRoleId.values());
}
const parsedSudoCommands: string[] = []; const parsedSudoCommands: string[] = [];
const parsedGroupsSet = new Set<string>(); const parsedGroupsSet = new Set<string>();
@@ -644,6 +566,14 @@ export async function signSshKey(
messageIds.push(message.messageId); messageIds.push(message.messageId);
const agentHost = siteAgentHostMap.get(siteId); const agentHost = siteAgentHostMap.get(siteId);
if (!agentHost) {
return next(
createHttpError(
HttpCode.INTERNAL_SERVER_ERROR,
`Unable to determine agent host for site ${siteId}`
)
);
}
await sendToClient(newt.newtId, { await sendToClient(newt.newtId, {
type: `newt/pam/connection`, type: `newt/pam/connection`,
+1 -1
View File
@@ -44,7 +44,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -45,7 +45,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
+1 -3
View File
@@ -14,8 +14,7 @@
import { import {
handleRemoteExitNodeRegisterMessage, handleRemoteExitNodeRegisterMessage,
handleRemoteExitNodePingMessage, handleRemoteExitNodePingMessage,
startRemoteExitNodeOfflineChecker, startRemoteExitNodeOfflineChecker
startExitNodeReconnectScheduler
} from "#private/routers/remoteExitNode"; } from "#private/routers/remoteExitNode";
import { MessageHandler } from "@server/routers/ws"; import { MessageHandler } from "@server/routers/ws";
import { build } from "@server/build"; import { build } from "@server/build";
@@ -30,5 +29,4 @@ export const messageHandlers: Record<string, MessageHandler> = {
if (build != "saas") { if (build != "saas") {
startRemoteExitNodeOfflineChecker(); // this is to handle the offline check for remote exit nodes startRemoteExitNodeOfflineChecker(); // this is to handle the offline check for remote exit nodes
startExitNodeReconnectScheduler(); // check pending exit node reconnects and notify newts
} }
@@ -28,7 +28,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -61,7 +61,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -135,7 +135,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
@@ -164,7 +164,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),
+1 -1
View File
@@ -28,7 +28,7 @@ registry.registerPath({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
data: z.record(z.string(), z.any()).nullable(), data: z.unknown().nullable(),
success: z.boolean(), success: z.boolean(),
error: z.boolean(), error: z.boolean(),
message: z.string(), message: z.string(),

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