-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathi18n.js
More file actions
3807 lines (3585 loc) · 219 KB
/
Copy pathi18n.js
File metadata and controls
3807 lines (3585 loc) · 219 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/**
* SessionPort — i18n.js
* Loaded FIRST (before all other popup scripts).
* Exposes window.PR_i18n with t(key), lang, setLang(lang), applyI18n().
*/
const PR_i18n = (() => {
const STRINGS = {
ru: {
// ── Header ──
'hdr.account_title': 'Аккаунт и настройки',
'hdr.account_aria': 'Аккаунт и настройки',
// ── Test button ──
'test.btn': '🧪 Тест автовставки',
'test.title': 'Загружает тестовый слепок и автоматически вставляет контекст + файл в активную LLM-вкладку. История снапшотов не засоряется.',
// ── Onboarding ──
'onboard.title': 'SessionPort',
'onboard.sub': 'Перенос контекста AI за 3 шага',
'onboard.s1_t': 'Откройте чат с AI',
'onboard.s1_s': 'Claude, ChatGPT, Grok, Gemini, Mistral...',
'onboard.s2_t': 'Нажмите Quick или Full',
'onboard.s2_s': 'Дождитесь пока модель выдаст SessionPort JSON',
'onboard.s3_t': 'Откройте расширение в новой вкладке',
'onboard.s3_s': 'Нажмите Paste — контекст перенесён',
'onboard.btn': 'Понятно, начать →',
// ── Project bar ──
'proj.no_project': 'Нет активного проекта',
'proj.rename_title':'Переименовать',
'proj.rename_aria': 'Переименовать проект',
'proj.select_title':'Выбрать проект',
'proj.select_aria': 'Выбрать проект',
'proj.add_title': 'Новый проект',
'proj.new_item': '+ Новый проект',
// ── Snap card ──
'snap.goal': 'Цель',
'snap.status': 'Статус',
'snap.next_step': 'Следующий шаг',
'snap.decisions': 'Ключевые решения',
'snap.no_decisions':'нет решений',
// ── Transfer tabs ──
'tab.simple': 'Простой',
'tab.extended': 'Расширенный',
'tab.reset_title': 'Сбросить состояние переноса и начать заново',
'tab.reset_aria': 'Сбросить перенос',
// ── Simple section ──
'simple.desc': 'Автоматический анализ сессии. Модель сама определит ключевые решения, правила и контекст.',
'simple.step1.label': 'Анализ сессии',
'simple.step1.hint': 'вставит промпт в активный чат',
'simple.step2.label': 'Подтвердить перенос',
'simple.step2.hint': 'захватит JSON из ответа модели',
'simple.step3.label': 'Сохранить перенос',
'simple.step3.hint': 'сохранит в историю и откроет вставку',
'simple.overlay': '✓ Перенос сохранён',
// ── Extended section ──
'ext.desc': 'Полный контроль: уточняющие вопросы, проверка якорей, финальная генерация.',
'ext.step1.label': 'Подготовка',
'ext.step1.hint': 'подготовительный промпт',
'ext.step2.label': 'Проверка якорей',
'ext.step2.hint': '6 якорей: GOAL · CONTEXT · DECISIONS · …',
'ext.step3.label': 'Финальный перенос',
'ext.step3.hint': 'генерация JSON слепка',
'ext.step4.label': 'Сохранить перенос',
'ext.step4.hint': 'сохранит в историю и откроет вставку',
'ext.overlay': '✓ Перенос сохранён',
// ── Step badge states ──
'badge.waiting': 'ждёт',
'badge.active': 'сейчас',
'badge.done': 'готово',
// ── Files section ──
'files.title': 'Прикреплённые файлы',
'files.dropzone_title': 'Добавить файлы',
'files.dropzone_hint': 'Перетащите или <span class="dropzone-browse" id="btnBrowseFiles">выберите файлы</span>',
'files.dropzone_locked':'Сначала выполните перенос контекста',
'files.drag_title': 'Перетащите в чат LLM для прикрепления',
'files.unbind_title':'Отвязать',
'files.detach_confirm':'Удалить файл из слепка?',
'files.detach_ok': 'Удалить',
'files.detach_cancel': 'Отмена',
'files.no_snap_title':'⚠ Нет активного слепка',
'files.no_snap_hint':'Сначала захватите контекст через<br/>«Простой» или «Расширенный» перенос',
// ── Scan button ──
'scan.btn': 'Захватить вручную — если JSON уже на странице',
// ── Paste section ──
'paste.title': 'Вставка контекста',
'paste.src_warn': '⚠️ Вы на сайте-источнике. Откройте другую модель или скопируйте JSON.',
'paste.desc': 'Контекст захвачен. Выберите способ вставки:',
'paste.btn_main': '📋 Вставить контекст + файлы',
'paste.btn_ctx': 'Только контекст',
'paste.btn_copy': '📄 Копировать JSON',
'paste.new_chat': 'Открыть новый чат:',
// ── Status ──
'status.ready': 'Готов к работе',
'status.reset': 'Сброшено — начните заново',
'status.injecting': 'Вставляю промпт…',
'status.step1_done': '1/3 — Промпт вставлен, отправьте',
'status.step2_start': '2/3 — Вставляю промпт захвата…',
'status.no_session': 'Сессия не инициализирована — нажмите шаг 1',
'status.waiting_model': '2/3 — Жду ответа модели…',
'status.captured': '3/3 — Контекст захвачен!',
'status.captured_add': 'Контекст захвачен — добавьте файлы или нажмите «Сохранить перенос»',
'status.timeout': 'Время ожидания истекло — нажмите «Захватить вручную»',
'status.ext1_done': '1/4 — Промпт вставлен, обсудите',
'status.ext2_start': '2/4 — Вставляю промпт якорей (итерация {n})…',
'status.ext2_hint': 'итерация {n} — нажмите ещё или перейдите к шагу 3',
'status.ext2_done': '2/4 — Якоря вставлены (×{n}), проверьте',
'status.ext3_start': '3/4 — Вставляю промпт генерации…',
'status.no_session2': 'Сессия не инициализирована',
'status.waiting_json': '3/4 — Жду JSON от модели…',
'status.captured4': '4/4 — Контекст захвачен!',
'status.saving': 'Сохраняю…',
'status.saved': '✓ Перенос сохранён',
'status.paste_ready': 'Контекст готов к вставке',
'status.pasting': 'Вставляю контекст…',
'status.paste_fail': 'Автовставка не удалась — скопируйте JSON',
'status.attaching': 'Прикрепляю файлы…',
'status.pasted_n': 'Контекст и {n} файлов вставлены',
'status.pasted': 'Контекст вставлен',
'status.paste_no_files':'Контекст вставлен, файлы не прикрепились',
'status.pasting_ctx': 'Вставляю только контекст…',
'status.paste_fail2': 'Автовставка не удалась',
'status.buf_empty': 'Буфер пуст',
'status.copied': 'Скопировано! Вставьте через Ctrl+V',
'status.copy_fail': 'Не удалось скопировать — оставьте popup открытым',
'status.decode_err': 'Ошибка декодирования',
'status.no_llm': 'Откройте вкладку с LLM (Claude, ChatGPT, Grok…)',
'status.connecting': 'Подключаюсь…',
'status.conn_fail': 'Не удалось подключиться — попробуйте ещё раз',
'status.reconnecting': 'Переподключение к захвату…',
'status.pasted_again': 'Контекст вставлен — можно вставить ещё раз или сбросить ↺',
'status.scanning': 'Сканирую страницу…',
'status.scan_fail': 'Не удалось подключиться к странице',
'status.json_captured': '✓ JSON захвачен!',
'status.json_not_found':'JSON не найден на странице — убедитесь что модель его выдала',
'status.test_loading': 'Загружаю тестовый слепок…',
'status.test_no_llm': 'Автовставка не удалась — откройте LLM-вкладку и нажмите «Вставить»',
'status.test_attaching':'Прикрепляю файл…',
'status.test_done': '✓ Тест выполнен — контекст и файл вставлены',
'status.test_err': 'Ошибка теста: ',
'status.test_warn': '🧪 Тест: откройте LLM и нажмите Вставить вручную',
'status.storage_crit': '⚠ Буфер почти заполнен ({used} MB из {total} MB) — рекомендуется экспорт и очистка',
'status.storage_warn': 'Буфер заполняется ({used} MB из {total} MB)',
'status.attach_n': '{n}/{total} файлов прикреплено',
'status.attach_err_quota':'Ошибка: диск переполнен',
'status.attach_timeout':'Таймаут: {name}',
'status.attach_big': 'Файл слишком большой: {name} ({size}, макс 25 MB)',
'status.no_snap_ctx': 'Сначала захватите контекст',
'status.no_project': 'Сначала выберите проект',
'status.no_snap_map': 'Нет активного слепка — сначала захватите контекст',
'status.snap_not_found':'Снапшот не найден',
'status.import_ok': '✓ Импорт завершён',
'status.import_err': '⚠ Ошибка импорта: ',
// ── Paste panel messages ──
'paste_msg.from_map': 'Слепок загружен из Map',
'paste_msg.from_hist': 'Слепок загружен из истории',
'paste_msg.captured': 'Контекст захвачен!',
'paste_msg.src_warn': '⚠️ Вы на сайте-источнике. Переключитесь на другую LLM и нажмите Вставить.',
// ── Nav ──
'nav.history': 'История',
'nav.transfer': 'Перенос',
'nav.trash': 'Корзина',
'nav.donate': 'Поддержать SessionPort',
'nav.bug': '🐛 Сообщить о баге',
'storage.label': 'Буфер:',
// ── Screen: History ──
'hist.back': 'Назад',
'hist.title': 'История переносов',
'hist.tab_history': 'История',
'hist.tab_map': 'Mind Map',
'hist.filter_all': 'Все',
'hist.filter_all_title': 'Показать все переносы',
'hist.filter_linked':'Связи',
'hist.filter_linked_title': 'Переносы связанные с другими проектами (cross-project chain)',
'hist.search_ph': 'Поиск по сайту…',
'hist.all_projects': 'Все проекты',
'hist.loading': 'Загрузка…',
'hist.empty': 'Нет захваченных контекстов',
'hist.no_snap_map': 'Нет снапшотов — сделайте захват в основном окне',
'hist.load_snap': 'Загрузить слепок',
'hist.zoom_in_aria': 'Увеличить',
'hist.zoom_out_aria':'Уменьшить',
'hist.zoom_rst_aria':'Сбросить масштаб',
'hist.branch': '+ Ветка',
'hist.dashboard': '⛶ Обзор',
'hist.export': '⬇ Экспорт',
'hist.import': '⬆ Импорт',
'dash.load': 'Загрузить',
'dash.diff': 'Diff',
'dash.fork': 'Форк',
'dash.diff_empty': 'Выберите два слепка для сравнения',
'map.legend_branch': 'ветка',
'map.legend_link': 'связь',
'hist.diff_identical':'Слепки идентичны',
'hist.diff_select': 'Выбери второй слепок',
'hist.diff_added': 'добавлено',
'hist.diff_removed': 'удалено',
'hist.diff_changed': 'изменено',
'hist.no_project': 'без проекта',
'hist.card_drop': '+ Перетащите или <span class="hist-dz-browse" data-snap="{id}">выберите</span>',
'hist.card_load': '📋 Загрузить + файлы',
'hist.card_ctx_only':'Только контекст',
'hist.fork_prompt': 'Имя ветки:',
'hist.branch_no_snap':'Нет активного слепка',
'hist.snap_with_files':'Слепок загружен с файлами',
'hist.snap_loaded': 'Слепок загружен',
'hist.status_loaded_files': '✓ Слепок + файлы готовы',
'hist.status_loaded': '✓ Слепок готов',
'hist.attaching': 'Прикрепляю…',
'hist.not_file': '⚠ Не файл — перетащите из Проводника',
'hist.too_big': '⚠ Слишком большой: {size}',
'hist.select_diff': 'Выбери второй слепок',
'hist.trash_confirm':'Переместить снапшот в корзину?',
'hist.trash_ok': 'Удалить',
'hist.trash_cancel': 'Отмена',
// ── Screen: Map ──
'map.back': 'Назад',
'map.all': 'Все',
'map.empty': 'Нет снапшотов — сделайте захват в основном окне',
'map.load_snap':'Загрузить слепок',
'map.branch': '+ Ветка',
'map.link': '🔗 Связать',
'map.new_proj':'+ Проект',
'map.dashboard':'⛶ Обзор',
'map.link_hint1':'🔗 Кликните на первую ноду · Esc — отмена',
'map.link_hint2':'🔗 Теперь кликните на вторую ноду · Esc — отмена',
'map.link_hint3':'🔗 Кликните на вторую ноду для связи · Esc — отмена',
'map.link_comment':'Комментарий к связи (необязательно):',
'map.new_proj_prompt':'Название нового проекта:',
'map.branch_prompt': 'Имя ветки:',
'map.no_snap_err': 'Нет активного слепка — сначала захватите контекст',
'map.no_project': 'без проекта',
// ── Screen: Donate ──
'donate.back': 'Назад',
'donate.title': 'Поддержать проект',
'donate.s1_title': 'SessionPort — что это и зачем',
'donate.s1_body': 'SessionPort — это браузерное расширение для тех, кто работает с несколькими AI-моделями одновременно. Оно решает одну конкретную проблему: когда вы ведёте сложный проект в Claude, потом переключаетесь в ChatGPT или Grok — весь контекст теряется. Приходится заново объяснять что за проект, какие решения приняты, что уже пробовали. SessionPort захватывает контекст из одного чата и переносит его в другой — со всей историей, ветвлениями и промежуточными файлами.<br><br>Расширение умеет работать с Claude, ChatGPT, Grok, Gemini, Mistral и Perplexity. Всё хранится локально, в вашем браузере — никакие данные никуда не отправляются. Есть визуальная карта всех переносов: видно откуда что пришло, как ветвился контекст, какие решения были приняты в каждой сессии.',
'donate.s2_title': 'Как появился проект',
'donate.s2_body': 'Проект вырос из личной потребности. Я работаю с несколькими AI-моделями параллельно — использую их сильные стороны для разных задач, перекрёстно проверяю ответы, веду длинные проекты через десятки сессий. В какой-то момент стало невозможно держать всё в голове и копировать контекст вручную. Так и родился SessionPort — сначала как скрипт для себя, потом как полноценное расширение.<br><br>За ним стоят месяцы работы в свободные часы — бесчисленные итерации, переделки, рефакторинги, тестирование на живых платформах, которые постоянно меняют свой интерфейс. Проект писался одним человеком с помощью тех самых AI-моделей, для которых он и предназначен.',
'donate.s3_title': 'Поддержка',
'donate.s3_body': 'У меня есть основная работа, и SessionPort — это то, чем я занимаюсь в свободное время. Буду рад любой поддержке — будь то репост, упоминание, звёздочка на GitHub или материальная помощь. Всё это помогает проекту развиваться.<br><br>Если нашли баг, есть идея по доработке или хотите предложить сотрудничество — напишите через GitHub Issues или на почту. Каждое сообщение читается и учитывается.',
'donate.crypto_title': 'Криптовалюта',
// ── Screen: Bug ──
'bug.back': 'Назад',
'bug.title': 'Сообщить о баге',
'bug.desc': 'Нашли проблему? Выберите удобный канал:',
// ── Screen: Trash ──
'trash.back': 'Назад',
'trash.title': 'Корзина',
'trash.empty': 'Корзина пуста',
'trash.clear': 'Очистить корзину',
'trash.restore': '↩ Восстановить',
'trash.delete': '✕ Удалить',
'trash.created': 'Создан:',
'trash.deleted': 'Удалён:',
'trash.confirm_delete': 'Удалить снапшот безвозвратно? Это действие нельзя отменить.',
'trash.confirm_empty': 'Очистить корзину? {label} будет удалено безвозвратно.',
'trash.snap_count': '{n} снапшот',
// ── Screen: Settings ──
'sett.back': 'Назад',
'sett.title': 'Аккаунт и настройки',
'sett.tab_account': 'Аккаунт',
'sett.tab_prefs': 'Настройки',
'sett.auth_notice': '🔜 Синхронизация между устройствами — v1.1',
'sett.auth_email': 'Email',
'sett.auth_pass': 'Пароль',
'sett.auth_login': 'Войти',
'sett.auth_signup': 'Регистрация',
'sett.auth_google': 'Войти через Google',
'sett.theme_label': 'Светлая тема',
'sett.theme_sub': 'Переключить цветовую схему',
'sett.lang_label': 'Язык',
'sett.lang_sub': 'Язык интерфейса',
'sett.hide_onboard_label': 'Скрыть онбординг',
'sett.hide_onboard_sub': 'Не показывать стартовый экран при каждом запуске',
'sett.hide_test_label': 'Скрыть кнопку теста',
'sett.hide_test_sub': 'Убрать «Тест автовставки» с главного экрана',
'sett.backup_section': 'Резервная копия',
'sett.export_label': 'Экспорт данных',
'sett.export_sub': 'Скачать все снапшоты как JSON-файл',
'sett.export_btn': 'Скачать',
'sett.import_label': 'Импорт данных',
'sett.import_sub': 'Восстановить снапшоты из файла резервной копии',
'sett.import_btn': 'Загрузить',
'sett.export_ok': 'Экспорт завершён',
'sett.import_ok': 'Импорт завершён — снапшоты восстановлены',
'sett.import_restored': 'Снимки найдены в корзине и восстановлены',
'sett.import_err': 'Ошибка импорта: ',
'sett.export_modal_title': 'Экспорт слепков',
'sett.export_sel_all': 'Выбрать все',
'sett.export_sel_none': 'Сбросить',
'sett.export_cancel': 'Отмена',
'sett.gd_connecting': 'Подключение…',
'sett.gd_connected': 'Google Drive подключён',
'sett.gd_login_err': 'Ошибка входа: ',
'sett.gd_signed_out': 'Отключено от Google',
'sett.gd_backup_saved': 'Бэкап сохранён',
'sett.gd_backup_err': 'Ошибка бэкапа: ',
'sett.gd_session_expired': 'Сессия истекла — войдите снова',
'sett.gd_backup_btn': 'Создать бэкап сейчас',
'sett.gd_no_backups': 'Бэкапов нет',
'sett.gd_restore_msg': 'Восстановить этот бэкап? Существующие снапшоты будут дополнены (не перезаписаны).',
'sett.gd_restore_btn': 'Восстановить',
'sett.gd_signout': 'Выйти',
'sett.gd_section': 'Google Drive бэкап',
'sett.gd_autobackup': 'Автобэкап',
'sett.gd_int_off': 'Выкл',
'sett.gd_int_6h': 'Каждые 6 ч',
'sett.gd_int_24h': 'Каждые 24 ч',
'sett.gd_int_7d': 'Каждые 7 дней',
'sett.gd_restore_drive': 'Восстановить с Drive',
'sett.gd_last_prefix': 'Последний бэкап: ',
'sett.gd_autobackup_off': 'Автобэкап выключен',
'sett.gd_autobackup_on': 'Автобэкап: ',
'sett.gd_setup_notice': '⚠ Для входа нужен OAuth Client ID. Google Cloud Console → APIs & Services → Credentials → Create OAuth Client ID (Chrome Extension) → вставить в manifest.json поле oauth2.client_id.',
'sett.gd_sync_title': 'Синхронизация между устройствами',
'sett.gd_sync_desc': 'Автосинхронизация снапшотов между браузерами через Google Drive. Синхронизация с мобильным приложением — скоро.',
'sett.gd_restored': 'Восстановлено: {n} снапшотов',
'sett.gd_restore_err': 'Ошибка восстановления: ',
'sett.gd_err': 'Ошибка: ',
'sett.lang_en': 'English',
'sett.lang_ru': 'Русский',
'sett.lang_de': 'Deutsch',
'sett.lang_fr': 'Français',
'sett.lang_es': 'Español',
'sett.lang_pt': 'Português',
'sett.lang_ja': '日本語',
'sett.lang_ko': '한국어',
'sett.lang_zh': '中文',
// ── Dialogs ──
'dlg.ok': 'OK',
'dlg.cancel': 'Отмена',
// ── Projects ──
'proj.prompt_create': 'Название нового проекта:',
'proj.prompt_rename': 'Переименовать проект:',
// ── Prompt Library ──
'prompts.field_tags_label': 'Теги',
'prompts.add_tag': 'Добавить тег',
'prompts.no_tag': 'Без тега',
'prompts.title': 'Промпт-библиотека',
'prompts.back': 'Назад',
'prompts.create': '+ Создать',
'prompts.search_ph': 'Поиск по названию или тегу…',
'prompts.insert': 'Вставить',
'prompts.edit': 'Изменить',
'prompts.delete': 'Удалить',
'prompts.delete_confirm': 'Переместить промпт в корзину?',
'prompts.no_match': 'Ничего не найдено',
'prompts.empty_title': 'Библиотека пуста',
'prompts.empty_sub': 'Создайте первый промпт для быстрой вставки в любую LLM',
'prompts.empty_btn': '+ Создать промпт',
'prompts.toast_inserted': 'Промпт добавлен в чат',
'prompts.toast_saved': 'Промпт сохранён',
'prompts.toast_deleted': 'Промпт перемещён в корзину',
'prompts.toast_permdeleted': 'Промпт удалён безвозвратно',
'prompts.edit_title_new': 'Новый промпт',
'prompts.edit_title_edit': 'Редактировать промпт',
'prompts.save': 'Сохранить',
'prompts.title_required': 'Введите название промпта',
'prompts.text_required': 'Текст промпта не может быть пустым',
'prompts.field_title_ph': 'Название промпта',
'prompts.field_text_ph': 'Текст промпта…',
'prompts.field_tag_ph': 'Добавить тег…',
'prompts.attach_file': '📎 Файл',
'prompts.file_too_large': 'Файл слишком большой (макс 5 МБ)',
'prompts.add_favorite': 'В избранное',
'prompts.in_favorites': 'В избранном',
'prompts.preview_label': 'Предпросмотр',
'prompts.preview_empty': 'Введите текст промпта…',
'prompts.chars': 'сим.',
'prompts.var_hint': 'Переменные {{…}} будут запрошены перед вставкой',
'prompts.var_prompt': 'Введите значение для «{name}»:',
'prompts.unsaved_confirm': 'Есть несохранённые изменения. Выйти?',
'prompts.leave': 'Выйти',
'prompts.empty_text': 'Промпт пустой',
'prompts.sync': 'Синхр.',
'prompts.syncing': 'Синхронизация…',
'prompts.sync_ok': 'Промпты синхронизированы',
'prompts.sync_error': 'Ошибка синхронизации',
'prompts.sync_need_login': 'Войдите в аккаунт Google в Настройках',
'prompts.deleted_at': 'Удалён',
'prompts.restore': 'Восстановить',
'prompts.delete_forever': 'Удалить навсегда',
'prompts.permdelete_confirm': 'Промпт будет удалён безвозвратно — из библиотеки и Google Drive.',
'prompts.trash_title': 'Корзина промптов',
'prompts.trash_empty': 'Корзина пуста',
'prompts.trash_nav': 'Корзина промптов',
'prompts.nav_label': 'Промпты',
'prompts.drop_file': 'Перетащите файл или нажмите для выбора',
},
en: {
// ── Header ──
'hdr.account_title': 'Account & Settings',
'hdr.account_aria': 'Account & Settings',
// ── Test button ──
'test.btn': '🧪 Test Auto-Paste',
'test.title': 'Loads a test snapshot and automatically pastes context + file into the active LLM tab. History is not affected.',
// ── Onboarding ──
'onboard.title': 'SessionPort',
'onboard.sub': 'Transfer AI context in 3 steps',
'onboard.s1_t': 'Open any AI chat',
'onboard.s1_s': 'Claude, ChatGPT, Grok, Gemini, Mistral...',
'onboard.s2_t': 'Press Quick or Full',
'onboard.s2_s': 'Wait for the model to output SessionPort JSON',
'onboard.s3_t': 'Open the extension in a new tab',
'onboard.s3_s': 'Press Paste — context transferred',
'onboard.btn': 'Got it, start →',
// ── Project bar ──
'proj.no_project': 'No active project',
'proj.rename_title':'Rename',
'proj.rename_aria': 'Rename project',
'proj.select_title':'Select project',
'proj.select_aria': 'Select project',
'proj.add_title': 'New project',
'proj.new_item': '+ New project',
// ── Snap card ──
'snap.goal': 'Goal',
'snap.status': 'Status',
'snap.next_step': 'Next step',
'snap.decisions': 'Key decisions',
'snap.no_decisions':'no decisions',
// ── Transfer tabs ──
'tab.simple': 'Quick',
'tab.extended': 'Full',
'tab.reset_title': 'Reset transfer state and start over',
'tab.reset_aria': 'Reset transfer',
// ── Simple section ──
'simple.desc': 'Automatic session analysis. The model identifies key decisions, rules, and context on its own.',
'simple.step1.label': 'Analyze session',
'simple.step1.hint': 'injects a prompt into the active chat',
'simple.step2.label': 'Confirm transfer',
'simple.step2.hint': 'captures JSON from the model\'s response',
'simple.step3.label': 'Save transfer',
'simple.step3.hint': 'saves to history and opens the paste panel',
'simple.overlay': '✓ Transfer saved',
// ── Extended section ──
'ext.desc': 'Full control: clarifying questions, anchor verification, final generation.',
'ext.step1.label': 'Preparation',
'ext.step1.hint': 'sends the preparation prompt',
'ext.step2.label': 'Verify anchors',
'ext.step2.hint': '6 anchors: GOAL · CONTEXT · DECISIONS · …',
'ext.step3.label': 'Final transfer',
'ext.step3.hint': 'generates the JSON snapshot',
'ext.step4.label': 'Save transfer',
'ext.step4.hint': 'saves to history and opens the paste panel',
'ext.overlay': '✓ Transfer saved',
// ── Step badge states ──
'badge.waiting': 'waiting',
'badge.active': 'active',
'badge.done': 'done',
// ── Files section ──
'files.title': 'Attached files',
'files.dropzone_title': 'Add files',
'files.dropzone_hint': 'Drop files here or <span class="dropzone-browse" id="btnBrowseFiles">browse</span>',
'files.dropzone_locked':'Capture context first',
'files.drag_title': 'Drag into an LLM chat to attach',
'files.unbind_title':'Remove',
'files.detach_confirm':'Remove file from snapshot?',
'files.detach_ok': 'Remove',
'files.detach_cancel': 'Cancel',
'files.no_snap_title':'⚠ No active snapshot',
'files.no_snap_hint':'Capture context first using<br/>Quick or Full transfer',
// ── Scan button ──
'scan.btn': 'Capture manually — if JSON is already on the page',
// ── Paste section ──
'paste.title': 'Paste context',
'paste.src_warn': '⚠️ You are on the source site. Switch to a different model or copy the JSON.',
'paste.desc': 'Context captured. Choose how to paste:',
'paste.btn_main': '📋 Paste context + files',
'paste.btn_ctx': 'Context only',
'paste.btn_copy': '📄 Copy JSON',
'paste.new_chat': 'Open new chat:',
// ── Status ──
'status.ready': 'Ready',
'status.reset': 'Reset — start over',
'status.injecting': 'Injecting prompt…',
'status.step1_done': '1/3 — Prompt injected, send it',
'status.step2_start': '2/3 — Injecting capture prompt…',
'status.no_session': 'Session not started — click step 1',
'status.waiting_model': '2/3 — Waiting for model response…',
'status.captured': '3/3 — Context captured!',
'status.captured_add': 'Context captured — add files or click Save transfer',
'status.timeout': 'Timed out — click Capture manually',
'status.ext1_done': '1/4 — Prompt injected, discuss with the model',
'status.ext2_start': '2/4 — Injecting anchor prompt (iteration {n})…',
'status.ext2_hint': 'iteration {n} — click again or move to step 3',
'status.ext2_done': '2/4 — Anchors injected (×{n}), review them',
'status.ext3_start': '3/4 — Injecting generation prompt…',
'status.no_session2': 'Session not started',
'status.waiting_json': '3/4 — Waiting for JSON from model…',
'status.captured4': '4/4 — Context captured!',
'status.saving': 'Saving…',
'status.saved': '✓ Transfer saved',
'status.paste_ready': 'Context ready to paste',
'status.pasting': 'Pasting context…',
'status.paste_fail': 'Auto-paste failed — copy JSON instead',
'status.attaching': 'Attaching files…',
'status.pasted_n': 'Context and {n} files pasted',
'status.pasted': 'Context pasted',
'status.paste_no_files':'Context pasted, files failed to attach',
'status.pasting_ctx': 'Pasting context only…',
'status.paste_fail2': 'Auto-paste failed',
'status.buf_empty': 'Buffer empty',
'status.copied': 'Copied! Paste with Ctrl+V',
'status.copy_fail': 'Could not copy — keep the popup open',
'status.decode_err': 'Decode error',
'status.no_llm': 'Open an LLM tab (Claude, ChatGPT, Grok…)',
'status.connecting': 'Connecting…',
'status.conn_fail': 'Could not connect — try again',
'status.reconnecting': 'Reconnecting to capture…',
'status.pasted_again': 'Context pasted — you can paste again or reset ↺',
'status.scanning': 'Scanning the page…',
'status.scan_fail': 'Could not connect to the page',
'status.json_captured': '✓ JSON captured!',
'status.json_not_found':'No JSON found on the page — make sure the model output it',
'status.test_loading': 'Loading test snapshot…',
'status.test_no_llm': 'Auto-paste failed — open an LLM tab and click Paste',
'status.test_attaching':'Attaching file…',
'status.test_done': '✓ Test complete — context and file pasted',
'status.test_err': 'Test error: ',
'status.test_warn': '🧪 Test: open an LLM tab and click Paste',
'status.storage_crit': '⚠ Storage almost full ({used} MB of {total} MB) — export and clear recommended',
'status.storage_warn': 'Storage filling up ({used} MB of {total} MB)',
'status.attach_n': '{n}/{total} files attached',
'status.attach_err_quota':'Error: storage full',
'status.attach_timeout':'Timeout: {name}',
'status.attach_big': 'File too large: {name} ({size}, max 25 MB)',
'status.no_snap_ctx': 'Capture context first',
'status.no_project': 'Select a project first',
'status.no_snap_map': 'No active snapshot — capture context first',
'status.snap_not_found':'Snapshot not found',
'status.import_ok': '✓ Import complete',
'status.import_err': '⚠ Import error: ',
// ── Paste panel messages ──
'paste_msg.from_map': 'Snapshot loaded from Map',
'paste_msg.from_hist': 'Snapshot loaded from history',
'paste_msg.captured': 'Context captured!',
'paste_msg.src_warn': '⚠️ You are on the source site. Switch to a different LLM and click Paste.',
// ── Nav ──
'nav.history': 'History',
'nav.transfer': 'Transfer',
'nav.trash': 'Trash',
'nav.donate': 'Support SessionPort',
'nav.bug': '🐛 Report a bug',
'storage.label': 'Storage:',
// ── Screen: History ──
'hist.back': 'Back',
'hist.title': 'Transfer history',
'hist.tab_history': 'History',
'hist.tab_map': 'Mind Map',
'hist.filter_all': 'All',
'hist.filter_all_title': 'Show all transfers',
'hist.filter_linked':'Linked',
'hist.filter_linked_title': 'Transfers linked to other projects (cross-project chain)',
'hist.search_ph': 'Search by site…',
'hist.all_projects': 'All projects',
'hist.loading': 'Loading…',
'hist.empty': 'No captured contexts',
'hist.no_snap_map': 'No snapshots yet — capture a session first',
'hist.load_snap': 'Load snapshot',
'hist.zoom_in_aria': 'Zoom in',
'hist.zoom_out_aria':'Zoom out',
'hist.zoom_rst_aria':'Reset zoom',
'hist.branch': '+ Branch',
'hist.dashboard': '⛶ Overview',
'hist.export': '⬇ Export',
'hist.import': '⬆ Import',
'dash.load': 'Load',
'dash.diff': 'Diff',
'dash.fork': 'Fork',
'dash.diff_empty': 'Select two snapshots to compare',
'map.legend_branch': 'branch',
'map.legend_link': 'link',
'hist.diff_identical':'Snapshots are identical',
'hist.diff_select': 'Select a second snapshot',
'hist.diff_added': 'added',
'hist.diff_removed': 'removed',
'hist.diff_changed': 'changed',
'hist.no_project': 'no project',
'hist.card_drop': '+ Drop here or <span class="hist-dz-browse" data-snap="{id}">browse</span>',
'hist.card_load': '📋 Load + files',
'hist.card_ctx_only':'Context only',
'hist.fork_prompt': 'Branch name:',
'hist.branch_no_snap':'No active snapshot',
'hist.snap_with_files':'Snapshot loaded with files',
'hist.snap_loaded': 'Snapshot loaded',
'hist.status_loaded_files': '✓ Snapshot + files ready',
'hist.status_loaded': '✓ Snapshot ready',
'hist.attaching': 'Attaching…',
'hist.not_file': '⚠ Not a file — drag from Explorer',
'hist.too_big': '⚠ Too large: {size}',
'hist.select_diff': 'Select a second snapshot',
'hist.trash_confirm':'Move snapshot to trash?',
'hist.trash_ok': 'Delete',
'hist.trash_cancel': 'Cancel',
// ── Screen: Map ──
'map.back': 'Back',
'map.all': 'All',
'map.empty': 'No snapshots yet — capture a session first',
'map.load_snap':'Load snapshot',
'map.branch': '+ Branch',
'map.link': '🔗 Link',
'map.new_proj':'+ Project',
'map.dashboard':'⛶ Overview',
'map.link_hint1':'🔗 Click the first node · Esc to cancel',
'map.link_hint2':'🔗 Now click the second node · Esc to cancel',
'map.link_hint3':'🔗 Click the second node to link · Esc to cancel',
'map.link_comment':'Link comment (optional):',
'map.new_proj_prompt':'New project name:',
'map.branch_prompt': 'Branch name:',
'map.no_snap_err': 'No active snapshot — capture context first',
'map.no_project': 'no project',
// ── Screen: Donate ──
'donate.back': 'Back',
'donate.title': 'Support the project',
'donate.s1_title': 'SessionPort — What It Is and Why',
'donate.s1_body': 'SessionPort is a browser extension for anyone who works with multiple AI models at the same time. It solves one specific problem: when you\'re running a complex project in Claude, then switch to ChatGPT or Grok, all your context is lost. You have to re-explain the project from scratch — what decisions were made, what was already tried, where things stand. SessionPort captures the context from one chat and transfers it to another — with the full history, branches, and intermediate files.<br><br>The extension works with Claude, ChatGPT, Grok, Gemini, Mistral, and Perplexity. Everything is stored locally in your browser — no data is sent anywhere. There\'s a visual map of all transfers: you can see where each context came from, how it branched, and what decisions were made in each session.',
'donate.s2_title': 'How the Project Started',
'donate.s2_body': 'The project grew out of a personal need. I work with several AI models in parallel — leveraging their strengths for different tasks, cross-checking answers, running long projects across dozens of sessions. At some point it became impossible to keep it all in my head and copy context by hand. That\'s how SessionPort was born — first as a script for myself, then as a full browser extension.<br><br>Behind it are months of work during free hours — countless iterations, rewrites, refactors, and testing on live platforms that constantly change their interfaces. The project was built by one person with the help of the very AI models it was designed for.',
'donate.s3_title': 'Support',
'donate.s3_body': 'I have a day job, and SessionPort is what I work on in my spare time. I\'d appreciate any support — whether it\'s a repost, a mention, a star on GitHub, or financial help. It all helps the project move forward.<br><br>If you\'ve found a bug, have an idea for improvement, or want to propose a collaboration — please write through GitHub Issues or by email. Every message is read and taken into account.',
'donate.crypto_title': 'Crypto',
// ── Screen: Bug ──
'bug.back': 'Back',
'bug.title': 'Report a bug',
'bug.desc': 'Found an issue? Pick a channel:',
// ── Screen: Trash ──
'trash.back': 'Back',
'trash.title': 'Trash',
'trash.empty': 'Trash is empty',
'trash.clear': 'Empty trash',
'trash.restore': '↩ Restore',
'trash.delete': '✕ Delete',
'trash.created': 'Created:',
'trash.deleted': 'Deleted:',
'trash.confirm_delete': 'Delete this snapshot permanently? This cannot be undone.',
'trash.confirm_empty': 'Empty trash? {label} will be permanently deleted.',
'trash.snap_count': '{n} snapshot',
// ── Screen: Settings ──
'sett.back': 'Back',
'sett.title': 'Account & Settings',
'sett.tab_account': 'Account',
'sett.tab_prefs': 'Settings',
'sett.auth_notice': '🔜 Cross-device sync coming in v1.1',
'sett.auth_email': 'Email',
'sett.auth_pass': 'Password',
'sett.auth_login': 'Sign in',
'sett.auth_signup': 'Sign up',
'sett.auth_google': 'Sign in with Google',
'sett.theme_label': 'Light theme',
'sett.theme_sub': 'Switch color scheme',
'sett.lang_label': 'Language',
'sett.lang_sub': 'Interface language',
'sett.hide_onboard_label': 'Hide onboarding',
'sett.hide_onboard_sub': 'Don\'t show the welcome screen on every launch',
'sett.hide_test_label': 'Hide test button',
'sett.hide_test_sub': 'Remove "Auto-inject test" from the main screen',
'sett.backup_section': 'Backup',
'sett.export_label': 'Export data',
'sett.export_sub': 'Download all snapshots as a JSON file',
'sett.export_btn': 'Download',
'sett.import_label': 'Import data',
'sett.import_sub': 'Restore snapshots from a backup file',
'sett.import_btn': 'Upload',
'sett.export_ok': 'Export complete',
'sett.import_ok': 'Import complete — snapshots restored',
'sett.import_restored': 'Snapshots were in trash — restored automatically',
'sett.import_err': 'Import error: ',
'sett.export_modal_title': 'Export Snapshots',
'sett.export_sel_all': 'Select all',
'sett.export_sel_none': 'Clear',
'sett.export_cancel': 'Cancel',
'sett.gd_connecting': 'Connecting…',
'sett.gd_connected': 'Google Drive connected',
'sett.gd_login_err': 'Sign-in error: ',
'sett.gd_signed_out': 'Signed out of Google',
'sett.gd_backup_saved': 'Backup saved',
'sett.gd_backup_err': 'Backup error: ',
'sett.gd_session_expired': 'Session expired — sign in again',
'sett.gd_backup_btn': 'Backup now',
'sett.gd_no_backups': 'No backups',
'sett.gd_restore_msg': 'Restore this backup? Existing snapshots will be supplemented (not overwritten).',
'sett.gd_restore_btn': 'Restore',
'sett.gd_signout': 'Sign out',
'sett.gd_section': 'Google Drive backup',
'sett.gd_autobackup': 'Auto-backup',
'sett.gd_int_off': 'Off',
'sett.gd_int_6h': 'Every 6h',
'sett.gd_int_24h': 'Every 24h',
'sett.gd_int_7d': 'Every 7 days',
'sett.gd_restore_drive': 'Restore from Drive',
'sett.gd_last_prefix': 'Last backup: ',
'sett.gd_autobackup_off': 'Auto-backup off',
'sett.gd_autobackup_on': 'Auto-backup: ',
'sett.gd_setup_notice': '⚠ Sign-in needs an OAuth Client ID. Google Cloud Console → APIs & Services → Credentials → Create OAuth Client ID (Chrome Extension) → paste into manifest.json oauth2.client_id.',
'sett.gd_sync_title': 'Cross-device sync',
'sett.gd_sync_desc': 'Auto-sync snapshots across your browsers via Google Drive. Mobile app sync is coming soon.',
'sett.gd_restored': 'Restored: {n} snapshots',
'sett.gd_restore_err': 'Restore error: ',
'sett.gd_err': 'Error: ',
'sett.lang_en': 'English',
'sett.lang_ru': 'Русский',
'sett.lang_de': 'Deutsch',
'sett.lang_fr': 'Français',
'sett.lang_es': 'Español',
'sett.lang_pt': 'Português',
'sett.lang_ja': '日本語',
'sett.lang_ko': '한국어',
'sett.lang_zh': '中文',
// ── Dialogs ──
'dlg.ok': 'OK',
'dlg.cancel': 'Cancel',
// ── Projects ──
'proj.prompt_create': 'New project name:',
'proj.prompt_rename': 'Rename project:',
// ── Prompt Library ──
'prompts.field_tags_label': 'Tags',
'prompts.add_tag': 'Add tag',
'prompts.no_tag': 'No tag',
'prompts.title': 'Prompt Library',
'prompts.back': 'Back',
'prompts.create': '+ Create',
'prompts.search_ph': 'Search by title or tag…',
'prompts.insert': 'Insert',
'prompts.edit': 'Edit',
'prompts.delete': 'Delete',
'prompts.delete_confirm': 'Move prompt to trash?',
'prompts.no_match': 'Nothing found',
'prompts.empty_title': 'Library is empty',
'prompts.empty_sub': 'Create your first prompt for quick insertion into any LLM',
'prompts.empty_btn': '+ Create prompt',
'prompts.toast_inserted': 'Prompt added to chat',
'prompts.toast_saved': 'Prompt saved',
'prompts.toast_deleted': 'Prompt moved to trash',
'prompts.toast_permdeleted': 'Prompt permanently deleted',
'prompts.edit_title_new': 'New prompt',
'prompts.edit_title_edit': 'Edit prompt',
'prompts.save': 'Save',
'prompts.title_required': 'Enter prompt title',
'prompts.text_required': 'Prompt text cannot be empty',
'prompts.field_title_ph': 'Prompt title',
'prompts.field_text_ph': 'Prompt text…',
'prompts.field_tag_ph': 'Add tag…',
'prompts.attach_file': '📎 File',
'prompts.file_too_large': 'File too large (max 5 MB)',
'prompts.add_favorite': 'Add to favorites',
'prompts.in_favorites': 'In favorites',
'prompts.preview_label': 'Preview',
'prompts.preview_empty': 'Start typing your prompt…',
'prompts.chars': 'ch.',
'prompts.var_hint': 'Variables {{…}} will be asked before inserting',
'prompts.var_prompt': 'Enter value for “{name}”:',
'prompts.unsaved_confirm': 'Unsaved changes. Leave?',
'prompts.leave': 'Leave',
'prompts.empty_text': 'Prompt is empty',
'prompts.sync': 'Sync',
'prompts.syncing': 'Syncing…',
'prompts.sync_ok': 'Prompts synced',
'prompts.sync_error': 'Sync error',
'prompts.sync_need_login': 'Sign in to Google account in Settings',
'prompts.deleted_at': 'Deleted',
'prompts.restore': 'Restore',
'prompts.delete_forever': 'Delete forever',
'prompts.permdelete_confirm': 'Prompt will be permanently deleted — from your library and Google Drive.',
'prompts.trash_title': 'Prompt Trash',
'prompts.trash_empty': 'Trash is empty',
'prompts.trash_nav': 'Prompt Trash',
'prompts.nav_label': 'Prompts',
'prompts.drop_file': 'Drop a file or click to select',
},
de: {
// ── Header ──
'hdr.account_title': 'Konto & Einstellungen',
'hdr.account_aria': 'Konto & Einstellungen',
// ── Test button ──
'test.btn': '🧪 Test Auto-Paste',
'test.title': 'Lädt einen Test-Snapshot und fügt Kontext + Datei automatisch in den aktiven LLM-Tab ein. Der Verlauf wird nicht verändert.',
// ── Onboarding ──
'onboard.title': 'SessionPort',
'onboard.sub': 'KI-Kontext in 3 Schritten übertragen',
'onboard.s1_t': 'KI-Chat öffnen',
'onboard.s1_s': 'Claude, ChatGPT, Grok, Gemini, Mistral...',
'onboard.s2_t': 'Quick oder Full drücken',
'onboard.s2_s': 'Warten bis das Modell SessionPort-JSON ausgibt',
'onboard.s3_t': 'Erweiterung im neuen Tab öffnen',
'onboard.s3_s': 'Paste drücken — Kontext übertragen',
'onboard.btn': 'Verstanden, starten →',
// ── Project bar ──
'proj.no_project': 'Kein aktives Projekt',
'proj.rename_title':'Umbenennen',
'proj.rename_aria': 'Projekt umbenennen',
'proj.select_title':'Projekt auswählen',
'proj.select_aria': 'Projekt auswählen',
'proj.add_title': 'Neues Projekt',
'proj.new_item': '+ Neues Projekt',
// ── Snap card ──
'snap.goal': 'Ziel',
'snap.status': 'Status',
'snap.next_step': 'Nächster Schritt',
'snap.decisions': 'Wichtige Entscheidungen',
'snap.no_decisions':'keine Entscheidungen',
// ── Transfer tabs ──
'tab.simple': 'Schnell',
'tab.extended': 'Vollständig',
'tab.reset_title': 'Transferstatus zurücksetzen und neu beginnen',
'tab.reset_aria': 'Transfer zurücksetzen',
// ── Simple section ──
'simple.desc': 'Automatische Sitzungsanalyse. Das Modell erkennt wichtige Entscheidungen, Regeln und Kontext selbständig.',
'simple.step1.label': 'Sitzung analysieren',
'simple.step1.hint': 'Injiziert einen Prompt in den aktiven Chat',
'simple.step2.label': 'Transfer bestätigen',
'simple.step2.hint': 'Erfasst JSON aus der Modellantwort',
'simple.step3.label': 'Transfer speichern',
'simple.step3.hint': 'Speichert im Verlauf und öffnet das Einfüge-Panel',
'simple.overlay': '✓ Transfer gespeichert',
// ── Extended section ──
'ext.desc': 'Volle Kontrolle: Klärungsfragen, Anker-Verifizierung, finaler Transfer.',
'ext.step1.label': 'Vorbereitung',
'ext.step1.hint': 'Sendet den Vorbereitungs-Prompt',
'ext.step2.label': 'Anker verifizieren',
'ext.step2.hint': '6 Anker: GOAL · CONTEXT · DECISIONS · …',
'ext.step3.label': 'Finaler Transfer',
'ext.step3.hint': 'Generiert den JSON-Snapshot',
'ext.step4.label': 'Transfer speichern',
'ext.step4.hint': 'Speichert im Verlauf und öffnet das Einfüge-Panel',
'ext.overlay': '✓ Transfer gespeichert',
// ── Step badge states ──
'badge.waiting': 'wartend',
'badge.active': 'aktiv',
'badge.done': 'erledigt',
// ── Files section ──
'files.title': 'Angehängte Dateien',
'files.dropzone_title': 'Dateien hinzufügen',
'files.dropzone_hint': 'Dateien ablegen oder <span class="dropzone-browse" id="btnBrowseFiles">durchsuchen</span>',
'files.dropzone_locked':'Zuerst Kontext erfassen',
'files.drag_title': 'In einen LLM-Chat ziehen zum Anhängen',
'files.unbind_title':'Entfernen',
'files.detach_confirm':'Datei aus dem Snapshot entfernen?',
'files.detach_ok': 'Entfernen',
'files.detach_cancel': 'Abbrechen',
'files.no_snap_title':'⚠ Kein aktiver Snapshot',
'files.no_snap_hint':'Zuerst Kontext erfassen über<br/>Schnell- oder Vollständig-Transfer',
// ── Scan button ──
'scan.btn': 'Manuell erfassen — wenn JSON bereits auf der Seite ist',
// ── Paste section ──
'paste.title': 'Kontext einfügen',
'paste.src_warn': '⚠️ Sie befinden sich auf der Quellseite. Wechseln Sie zu einem anderen Modell oder kopieren Sie das JSON.',
'paste.desc': 'Kontext erfasst. Wählen Sie, wie eingefügt werden soll:',
'paste.btn_main': '📋 Kontext + Dateien einfügen',
'paste.btn_ctx': 'Nur Kontext',
'paste.btn_copy': '📄 JSON kopieren',
'paste.new_chat': 'Neuen Chat öffnen:',
// ── Status ──
'status.ready': 'Bereit',
'status.reset': 'Zurückgesetzt — neu starten',
'status.injecting': 'Prompt wird injiziert…',
'status.step1_done': '1/3 — Prompt injiziert, absenden',
'status.step2_start': '2/3 — Erfassungs-Prompt wird injiziert…',
'status.no_session': 'Sitzung nicht gestartet — Schritt 1 klicken',
'status.waiting_model': '2/3 — Warten auf Modellantwort…',
'status.captured': '3/3 — Kontext erfasst!',
'status.captured_add': 'Kontext erfasst — Dateien hinzufügen oder Transfer speichern klicken',
'status.timeout': 'Zeitüberschreitung — Manuell erfassen klicken',
'status.ext1_done': '1/4 — Prompt injiziert, mit dem Modell besprechen',
'status.ext2_start': '2/4 — Anker-Prompt wird injiziert (Iteration {n})…',
'status.ext2_hint': 'Iteration {n} — erneut klicken oder zu Schritt 3 wechseln',
'status.ext2_done': '2/4 — Anker injiziert (×{n}), bitte prüfen',
'status.ext3_start': '3/4 — Generierungs-Prompt wird injiziert…',
'status.no_session2': 'Sitzung nicht gestartet',
'status.waiting_json': '3/4 — Warten auf JSON vom Modell…',
'status.captured4': '4/4 — Kontext erfasst!',
'status.saving': 'Speichern…',
'status.saved': '✓ Transfer gespeichert',
'status.paste_ready': 'Kontext bereit zum Einfügen',
'status.pasting': 'Kontext wird eingefügt…',
'status.paste_fail': 'Automatisches Einfügen fehlgeschlagen — JSON stattdessen kopieren',
'status.attaching': 'Dateien werden angehängt…',
'status.pasted_n': 'Kontext und {n} Dateien eingefügt',
'status.pasted': 'Kontext eingefügt',
'status.paste_no_files':'Kontext eingefügt, Dateien konnten nicht angehängt werden',
'status.pasting_ctx': 'Nur Kontext wird eingefügt…',
'status.paste_fail2': 'Automatisches Einfügen fehlgeschlagen',
'status.buf_empty': 'Puffer leer',
'status.copied': 'Kopiert! Mit Ctrl+V einfügen',
'status.copy_fail': 'Kopieren fehlgeschlagen — Popup geöffnet lassen',
'status.decode_err': 'Dekodierungsfehler',
'status.no_llm': 'LLM-Tab öffnen (Claude, ChatGPT, Grok…)',
'status.connecting': 'Verbinden…',
'status.conn_fail': 'Verbindung fehlgeschlagen — erneut versuchen',
'status.reconnecting': 'Verbindung zur Erfassung wird wiederhergestellt…',
'status.pasted_again': 'Kontext eingefügt — erneut einfügen oder zurücksetzen ↺',
'status.scanning': 'Seite wird gescannt…',
'status.scan_fail': 'Verbindung zur Seite fehlgeschlagen',
'status.json_captured': '✓ JSON erfasst!',
'status.json_not_found':'Kein JSON auf der Seite gefunden — stellen Sie sicher, dass das Modell es ausgegeben hat',
'status.test_loading': 'Test-Snapshot wird geladen…',
'status.test_no_llm': 'Auto-Paste fehlgeschlagen — LLM-Tab öffnen und Einfügen klicken',
'status.test_attaching':'Datei wird angehängt…',
'status.test_done': '✓ Test abgeschlossen — Kontext und Datei eingefügt',
'status.test_err': 'Testfehler: ',
'status.test_warn': '🧪 Test: LLM-Tab öffnen und Einfügen klicken',
'status.storage_crit': '⚠ Speicher fast voll ({used} MB von {total} MB) — Export und Bereinigung empfohlen',
'status.storage_warn': 'Speicher füllt sich ({used} MB von {total} MB)',
'status.attach_n': '{n}/{total} Dateien angehängt',
'status.attach_err_quota':'Fehler: Speicher voll',
'status.attach_timeout':'Zeitüberschreitung: {name}',
'status.attach_big': 'Datei zu groß: {name} ({size}, max 25 MB)',
'status.no_snap_ctx': 'Zuerst Kontext erfassen',
'status.no_project': 'Zuerst ein Projekt auswählen',
'status.no_snap_map': 'Kein aktiver Snapshot — zuerst Kontext erfassen',
'status.snap_not_found':'Snapshot nicht gefunden',
'status.import_ok': '✓ Import abgeschlossen',
'status.import_err': '⚠ Importfehler: ',
// ── Paste panel messages ──
'paste_msg.from_map': 'Snapshot aus Map geladen',
'paste_msg.from_hist': 'Snapshot aus Verlauf geladen',
'paste_msg.captured': 'Kontext erfasst!',
'paste_msg.src_warn': '⚠️ Sie befinden sich auf der Quellseite. Wechseln Sie zu einem anderen LLM und klicken Sie Einfügen.',
// ── Nav ──
'nav.history': 'Verlauf',
'nav.transfer': 'Transfer',
'nav.trash': 'Papierkorb',
'nav.donate': 'SessionPort unterstützen',
'nav.bug': '🐛 Fehler melden',
'storage.label': 'Speicher:',
// ── Screen: History ──
'hist.back': 'Zurück',
'hist.title': 'Transferverlauf',
'hist.tab_history': 'Verlauf',
'hist.tab_map': 'Mind Map',
'hist.filter_all': 'Alle',
'hist.filter_all_title': 'Alle Transfers anzeigen',
'hist.filter_linked':'Verknüpft',
'hist.filter_linked_title': 'Transfers, die mit anderen Projekten verknüpft sind (projektübergreifend)',
'hist.search_ph': 'Nach Seite suchen…',
'hist.all_projects': 'Alle Projekte',
'hist.loading': 'Laden…',
'hist.empty': 'Keine erfassten Kontexte',
'hist.no_snap_map': 'Noch keine Snapshots — zuerst eine Sitzung erfassen',