privateboard 0.1.13 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/public/i18n.js CHANGED
@@ -1,15 +1,27 @@
1
1
  /* ═══════════════════════════════════════════
2
- UI i18n · en / zh-CN
3
- Storage: boardroom.uiLocale ("en" | "zh")
2
+ UI i18n · en / zh-CN / ja / es
3
+ Storage: boardroom.uiLocale ("en" | "zh" | "ja" | "es")
4
4
  Event: document "boardroom:locale" · detail.locale
5
+
6
+ Adding a new locale:
7
+ 1. Add it to SUPPORTED_LOCALES below
8
+ 2. Add a STR.<code> block (any missing key falls back to en)
9
+ 3. Add a locale_<code> short label in EN + ZH (e.g. "JP")
10
+ 4. Wire the picker UI (user-settings.js applyLocale)
5
11
  ═══════════════════════════════════════════ */
6
12
  (function (root) {
7
13
  const STORAGE_KEY = "boardroom.uiLocale";
14
+ const SUPPORTED_LOCALES = ["en", "zh", "ja", "es"];
15
+ function isLocale(loc) {
16
+ return typeof loc === "string" && SUPPORTED_LOCALES.indexOf(loc) >= 0;
17
+ }
8
18
 
9
19
  const STR = {
10
20
  en: {
11
21
  locale_en: "EN",
12
22
  locale_zh: "中文",
23
+ locale_ja: "日本語",
24
+ locale_es: "Español",
13
25
  aria_language: "Language",
14
26
 
15
27
  brand_privateboard: "PRIVATEBOARD",
@@ -34,18 +46,32 @@
34
46
  queue_speaking_queue: "speaking queue",
35
47
  queue_mode: "mode:",
36
48
  queue_toggle: "collapse / expand",
37
- queue_foot_hint:
38
- "type to interject · <kbd>@</kbd> to direct · the chair files the round-end vote in chat",
39
49
  send_placeholder: "interject anytime · @first_p to direct a director...",
50
+ ib_paused_placeholder: "drop a note · directors see it when you resume",
51
+ ib_followup_placeholder: "continue the thread · sends a follow-up room with this question",
52
+ adj_export_label: "Export this room",
53
+ adj_export_tip: "Export · download the transcript + report",
54
+ adj_replay_label: "Voice replay",
55
+ adj_replay_tip: "Voice replay · listen back to the discussion",
56
+ adj_followup_label: "Convene follow-up",
57
+ adj_followup_tip: "Convene a follow-up room from this one",
58
+ paused_strip_kicker: "// paused",
59
+ paused_strip_resume: "▸ Resume discussion",
60
+ adjourned_strip_kicker: "// adjourned",
61
+ adjourned_strip_meta: "filed {time} ago",
62
+ adjourned_strip_replay: "▸ Voice replay",
40
63
  send_button: "[ Send ]",
41
64
  ib_pause_label: "Pause discussion",
42
65
  ib_pause_tip: "Pause · you can resume later",
43
66
  ib_adjourn_label: "Adjourn the room",
44
67
  ib_adjourn_tip: "Adjourn · file the report and end",
68
+ ib_adjourn_text: "Adjourn",
45
69
  ib_vote_label: "Open vote phase",
46
70
  ib_vote_tip: "Call the vote · end the round and tally directors",
47
71
  ib_vote_label_queued: "Vote queued",
48
72
  ib_vote_tip_queued: "Vote queued · will open after current speaker finishes",
73
+ ib_jump_top_label: "Jump to the original question",
74
+ ib_jump_top_tip: "Scroll to the original question that opened this room",
49
75
 
50
76
  vt_kicker: "vote trigger",
51
77
  vt_title: "Open the vote phase?",
@@ -97,6 +123,27 @@
97
123
 
98
124
  export_btn: "[↓] Export",
99
125
  followup_btn: "[→] Convene Follow-up",
126
+ followup_classify: "follow-up · continuation room",
127
+ followup_classify_right: "// continuing",
128
+ followup_title: "Convene a follow-up",
129
+ followup_meta_prefix: "// following up",
130
+ followup_placeholder: "What's the next question to chase, given what the prior session settled?",
131
+ followup_context_note: "The prior subject, the filed brief (room's settled judgement), and each director's load-bearing observations are bundled as context for this follow-up — the new cast picks up where the prior session left off rather than starting from scratch.",
132
+ followup_cast_label: "Directors",
133
+ followup_cast_hint: "2–4 recommended",
134
+ followup_cast_same: "Same cast as last session",
135
+ followup_picker_label: "Pick directors",
136
+ followup_auto_label: "directors",
137
+ followup_auto_val: "auto-pick",
138
+ followup_directors_one: "{n} director",
139
+ followup_directors_many: "{n} directors",
140
+ followup_cancel: "[ Cancel ]",
141
+ followup_confirm: "[ Convene → ]",
142
+ followup_confirm_busy: "[ Convening… ]",
143
+ followup_adjourned_at_prefix: "adjourned",
144
+ followup_briefs_one: "{n} brief filed",
145
+ followup_briefs_many: "{n} briefs filed",
146
+ followup_no_brief: "no brief filed",
100
147
 
101
148
  sys_notice_dismiss: "Dismiss",
102
149
 
@@ -153,6 +200,7 @@
153
200
  notes_aria_filters: "Filter notes by recency",
154
201
  notes_director_fallback: "Director",
155
202
  notes_item_room: "ROOM",
203
+ share_card_distilled: "Distilled · {name}",
156
204
 
157
205
  room_meeting_room: "Meeting Room",
158
206
  room_meta_tone: "tone",
@@ -169,6 +217,8 @@
169
217
  room_view_report: "[ View Report ]",
170
218
  room_view_report_multi: "[ View Report · {n} ▾ ]",
171
219
  room_view_report_title_multi: "{n} reports · click to choose",
220
+ room_view_report_generating: "Generating Report…",
221
+ room_view_report_generating_title: "The report is being generated · the link unlocks when it's ready",
172
222
  room_generate_report: "Generate Report",
173
223
  room_generate_report_title: "File a brief from this session",
174
224
  room_chair_pick_title: "Chair picked {name} for this turn",
@@ -224,6 +274,35 @@
224
274
  ap_edit: "edit",
225
275
  ap_cancel: "cancel",
226
276
  ap_save: "save",
277
+
278
+ ap_build_log: "Build log",
279
+ ap_build_log_kicker: "— HOW IT WAS BUILT",
280
+ ap_build_log_open: "How was this agent built?",
281
+ ap_build_log_open_cta: "▸ OPEN BUILD LOG",
282
+ ap_build_log_teaser_fallback: "This agent was assembled over seven phases — including a sweep of the open web to ground the persona.",
283
+ ap_build_log_no_narrative: "We didn't write a summary for this one, but here's the timeline.",
284
+ ap_build_phase_1: "First sketch",
285
+ ap_build_phase_2: "Research the field",
286
+ ap_build_phase_3: "Refined draft",
287
+ ap_build_phase_4: "Behavioural rules",
288
+ ap_build_phase_5: "Worked examples",
289
+ ap_build_phase_6: "Self-check questions",
290
+ ap_build_phase_7: "Test prompts & uniqueness",
291
+ ap_build_phase_1_blurb: "We drafted a first take on the persona's lineage, signature ideas, and failure modes — cold, before any research.",
292
+ ap_build_phase_2_blurb: "We picked a handful of angles to dig into and scoured the open web for each one, then filled any gaps with follow-up searches.",
293
+ ap_build_phase_3_blurb: "With the research in hand we rewrote the persona from scratch — same shape, richer detail.",
294
+ ap_build_phase_4_blurb: "We distilled behavioural rules: things this director always does, never does, and conditionally does.",
295
+ ap_build_phase_5_blurb: "We wrote a handful of worked examples that show how this persona actually responds.",
296
+ ap_build_phase_6_blurb: "We drafted the silent checklist this director runs before every reply.",
297
+ ap_build_phase_7_blurb: "We ran test prompts side-by-side against a generic AI to measure how different this voice really is.",
298
+ ap_build_dimensions_label: "Angles researched",
299
+ ap_build_topup_label: "Gap searches",
300
+ ap_build_divergence_label: "Voice uniqueness",
301
+ ap_build_tokens_label: "Tokens used",
302
+ ap_build_duration_label: "Time spent",
303
+ ap_build_sources_short: "{n} sources read",
304
+ ap_build_searches_short: "{n} searches",
305
+ ap_build_close: "Close build log",
227
306
  ap_rules_add: "+ add rule",
228
307
  ap_rules_max: "max {n}",
229
308
  ap_rules_empty_list: "no rules yet · use the + add rule button above",
@@ -332,6 +411,7 @@
332
411
 
333
412
  sa_head: "// session analytics",
334
413
  sa_stamp: "closed",
414
+ session_end_marker: "session adjourned",
335
415
  sa_tokens: "tokens",
336
416
  sa_messages: "msgs",
337
417
  sa_rounds: "rounds",
@@ -378,17 +458,111 @@
378
458
  pause_soft_deck: "Let {name} complete this turn, then pause the queue.",
379
459
  pause_cancel_mark: "↩ Cancel",
380
460
  pause_cancel_deck: "Keep the discussion running.",
461
+ // Reload-confirm modal · shown on Ctrl+R / Cmd+R while a
462
+ // director is mid-stream. Same three-option grammar as
463
+ // the pause modal but the verb is "reload" not "pause".
464
+ reload_class: "reload · choose",
465
+ reload_right: "// the room is mid-turn",
466
+ reload_tag: "▸ Refresh page",
467
+ reload_title: "{name} is speaking right now.",
468
+ reload_deck: "How would you like to handle the in-flight speaker before refreshing?",
469
+ reload_hard_mark: "▍ Interrupt and reload",
470
+ reload_hard_deck: "Cut their reply mid-sentence, then refresh. The partial response is dropped.",
471
+ reload_soft_mark: "⌛ Reload after they finish",
472
+ reload_soft_deck: "Let {name} complete this turn, then refresh the page automatically.",
473
+ reload_cancel_mark: "↩ Cancel",
474
+ reload_cancel_deck: "Stay on the page · keep the discussion running.",
475
+ // Resume-choice modal · shown when user clicks Resume on a
476
+ // voice room with no voice key configured. Same 3-button
477
+ // shape as the pause / reload modals.
478
+ resume_class: "resume · choose",
479
+ resume_right: "// voice key missing",
480
+ resume_tag: "▸ Voice mode needs a key",
481
+ resume_deck: "This room is in voice mode but no voice provider key is configured. Pick how you want to resume:",
482
+ resume_configure_mark: "⚙ Configure a voice key",
483
+ resume_configure_deck: "Opens Settings → API Keys. Resume once a key lands.",
484
+ resume_text_mark: "▸ Continue as a text room",
485
+ resume_text_deck: "Switch this room to text mode and resume now. Directors speak via text bubbles, no audio.",
486
+ resume_cancel_mark: "↩ Cancel",
487
+ resume_cancel_deck: "Stay paused. Decide later.",
488
+ // Room delivery-mode toggle · same vocabulary as the composer's
489
+ // voice toggle. Title attribute flips with state + key.
490
+ room_delivery_switch_err: "Couldn't switch delivery mode: {msg}",
381
491
 
382
- pause_bar_add_input: "[ + Add input ]",
383
- pause_bar_adjourn: "[ ▸ Adjourn & File Brief ]",
384
- pause_bar_resume: "[ ▸ Resume Discussion ]",
385
- pause_bar_paused: "paused",
386
- pause_bar_next: "next",
387
492
 
388
493
  cmp_tone_label: "Tone",
389
494
  cmp_intensity_label: "Intensity",
390
495
  cmp_voice_tooltip: "Enable voice meeting",
391
496
  cmp_voice_label: "Voice Mode",
497
+ // Topic-rec trigger card · idle + busy state labels.
498
+ // The "discover" tag column stays English (system-UI
499
+ // convention), but the trigger's main copy follows the
500
+ // composer locale because it's user-facing prompt text
501
+ // (parallel to the cmp_prompt + greeting which also flip
502
+ // with locale).
503
+ cmp_recs_trigger_label: "Find topics you might be interested in",
504
+ cmp_recs_trigger_tag: "discover",
505
+ cmp_recs_trigger_starting: "starting…",
506
+
507
+ // Voice-mode onboarding overlay · shown when the voice toggle
508
+ // is clicked without any voice provider key configured.
509
+ vonb_tag: "▸ VOICE MODE",
510
+ vonb_classification_left: "voice mode · onboarding",
511
+ vonb_classification_right: "// preview",
512
+ vonb_meta_label: "// promo",
513
+ vonb_meta_live: "live preview",
514
+ vonb_title: "Hear your boardroom.",
515
+ vonb_deck: "Directors speak aloud at the round table. Add a voice-model API key below and convene a live session.",
516
+ vonb_cta: "Configure voice keys",
517
+ vonb_theme_eastwood_name: "BRAINSTORM",
518
+ vonb_theme_eastwood_deck: "soil + grass · open ground",
519
+ vonb_theme_regent_name: "CONSTRUCTIVE",
520
+ vonb_theme_regent_deck: "graphite marble · executive",
521
+ vonb_theme_atrium_name: "RESEARCH",
522
+ vonb_theme_atrium_deck: "light marble · scholarly",
523
+ vonb_theme_nintendo_name: "CRITIQUE",
524
+ vonb_theme_nintendo_deck: "burgundy carpet · formal",
525
+
526
+ onb_v2_classification_left: "first run · welcome",
527
+ onb_v2_classification_right: "// local · ~60 seconds",
528
+ onb_v2_back: "[ ◂ Back ]",
529
+ onb_v2_next: "[ Next ▸ ]",
530
+ onb_v2_continue: "[ Continue ▸ ]",
531
+ onb_v2_ready: "[ I'm ready ▸ ]",
532
+ onb_v2_enter: "[ Step in ▸ ]",
533
+ onb_v2_name_kicker: "00 — Sit down",
534
+ onb_v2_name_title: "How should the room call you?",
535
+ onb_v2_name_sub: "From here on, this is your room.",
536
+ onb_v2_name_placeholder: "e.g. Kay",
537
+ onb_v2_what_kicker: "01 — A meeting, not a chatbot",
538
+ onb_v2_what_title: "You convene stubborn advisors and let them argue, in front of you, over a question that matters.",
539
+ onb_v2_what_body: "Three acts · convene · sharpen · adjourn. You sit as chair, the directors take sides, and on adjourn you walk away with a brief in hand.",
540
+ onb_v2_what_note: "Not a chatbot. The directors don't agree with you — they pressure-test the question until it sharpens.",
541
+ onb_v2_key_kicker: "02 — Hand over a key",
542
+ onb_v2_key_title: "Pick one brain — or pick many.",
543
+ onb_v2_key_body: "Your key stays on this machine. We never upload it.",
544
+ onb_v2_key_recommend_badge: "// recommended",
545
+ onb_v2_key_recommend_name: "OpenRouter · one key, every model",
546
+ onb_v2_key_recommend_body: "Each director can run on a different model — Claude as the skeptic, GPT as the pattern hunter, Gemini as the long-horizon strategist. The chair routes each turn to the right brain.",
547
+ onb_v2_key_or: "or — a direct provider",
548
+ onb_v2_key_or_body: "Same model for every director. Personas stay distinct, but they all share one brain underneath.",
549
+ onb_v2_voice_kicker: "03 — Give them a voice · optional",
550
+ onb_v2_voice_title: "Want them to speak aloud?",
551
+ onb_v2_voice_body: "Add a TTS key and the boardroom turns into a round table. Directors take seats, raise their head when speaking, fade back when listening.",
552
+ onb_v2_voice_pitch: "It plays like a slow strategy game — you watch your bench think, debate, and challenge each other in real voices. Each director gets a distinct voice on first key. Skip if you'd rather stay text-only; you can flip this on anytime in Settings.",
553
+ onb_v2_voice_skip: "[ Skip for now ]",
554
+ onb_v2_voice_skip_cta: "[ Skip → ]",
555
+ onb_v2_cast_kicker: "04 — Your board",
556
+ onb_v2_cast_title: "Chair runs the room. Directors disagree. The brief closes the loop.",
557
+ onb_v2_cast_body: "By default the chair picks three directors for you; you can also pick your own. That choice — and your question — happens in the composer next.",
558
+ onb_v2_cast_lineup: "// preview only · pick later in the composer",
559
+ onb_v2_cast_next_kicker: "// next · in the composer",
560
+ onb_v2_cast_next_step_1: "Write your question",
561
+ onb_v2_cast_next_step_2: "Chair picks 3 directors",
562
+ onb_v2_cast_next_step_3: "Hit Convene",
563
+ onb_v2_hint_kicker: "// your seat",
564
+ onb_v2_hint_body: "Write the question that's been sitting on your mind — then press Convene.",
565
+ onb_v2_hint_dismiss: "Got it",
392
566
 
393
567
  rt_speaking: "Speaking",
394
568
  rt_thinking: "Thinking",
@@ -528,6 +702,13 @@
528
702
  brief_supplement_btn: "Add a perspective · regenerate",
529
703
  brief_delete_label: "Delete report",
530
704
  ending_session_foot: "// end of session",
705
+ brief_llm_hide_stream: "Hide model stream",
706
+ brief_llm_view_stream: "View model stream",
707
+ brief_llm_waiting_first: "waiting for first call",
708
+ brief_llm_waiting_output: "waiting for output…",
709
+ delivery_text_hint: "fast written meeting",
710
+ delivery_voice_hint: "spoken · paced turns",
711
+ share_distilled_by: "distilled from {author}",
531
712
  brief_wc_approx_chars: "~{n} 字",
532
713
  brief_wc_one_word: "1 word",
533
714
  brief_wc_words: "{n} words",
@@ -649,6 +830,14 @@ When the room ___, raise an objection.`,
649
830
  ag_ws_title_off: "Generation runs offline · click to enable web search",
650
831
  ag_ws_label: "web search",
651
832
 
833
+ // Time-of-day greeting buckets · 4 slots driven by hour-of-day
834
+ // in composerGreeting. Each locale fills these four; the
835
+ // legacy greet_en_* / greet_zh_* keys below are kept for any
836
+ // back-compat reference but no longer drive the picker.
837
+ greet_0: "// Up late, {name}",
838
+ greet_1: "// Good morning, {name}",
839
+ greet_2: "// Good afternoon, {name}",
840
+ greet_3: "// Good evening, {name}",
652
841
  greet_en_0: "// Up late, {name}",
653
842
  greet_en_1: "// Good morning, {name}",
654
843
  greet_en_2: "// Good afternoon, {name}",
@@ -751,6 +940,9 @@ When the room ___, raise an objection.`,
751
940
  us_locale_label: "Interface language",
752
941
  us_locale_deck:
753
942
  "Sidebar labels, dialogs, and app chrome follow this locale. Room messages and briefs still mirror the language you write in.",
943
+ us_replay_onb_label: "Replay onboarding",
944
+ us_replay_onb_btn: "Walk me through again",
945
+ us_replay_onb_deck: "Re-runs the four-step welcome storyline. Your name, theme, and API keys stay configured.",
754
946
  us_default_model_title: "Default Model",
755
947
  us_default_deck_long:
756
948
  "new agents inherit this. when an agent's saved model becomes unreachable (key removed / model retired), it falls back here too. flagship tier uses this as the deep-write model.",
@@ -810,6 +1002,8 @@ When the room ___, raise an objection.`,
810
1002
  zh: {
811
1003
  locale_en: "EN",
812
1004
  locale_zh: "中文",
1005
+ locale_ja: "日本語",
1006
+ locale_es: "Español",
813
1007
  aria_language: "语言",
814
1008
 
815
1009
  brand_privateboard: "PRIVATEBOARD",
@@ -834,13 +1028,28 @@ When the room ___, raise an objection.`,
834
1028
  queue_speaking_queue: "发言队列",
835
1029
  queue_mode: "模式:",
836
1030
  queue_toggle: "收起 / 展开",
837
- queue_foot_hint: "随时插话 · <kbd>@</kbd> 指定董事 · 主席在回合结束时发起关键点评投票",
838
1031
  send_placeholder: "随时插话 · @handle 指定某位董事…",
1032
+ ib_paused_placeholder: "留个补充 · 恢复讨论时 directors 会看到",
1033
+ ib_followup_placeholder: "继续这个话题 · 发送即新开一个 follow-up 房间",
1034
+ adj_export_label: "导出此房间",
1035
+ adj_export_tip: "导出 · 下载逐字稿与报告",
1036
+ adj_replay_label: "语音回放",
1037
+ adj_replay_tip: "语音回放 · 重听整场讨论",
1038
+ adj_followup_label: "召集后续房间",
1039
+ adj_followup_tip: "基于此房间召集一个后续讨论",
1040
+ paused_strip_kicker: "// 已暂停",
1041
+ paused_strip_resume: "▸ 恢复讨论",
1042
+ adjourned_strip_kicker: "// 已闭会",
1043
+ adjourned_strip_meta: "{time}前归档",
1044
+ adjourned_strip_replay: "▸ 语音回放",
839
1045
  send_button: "[ 发送 ]",
840
1046
  ib_pause_label: "暂停讨论",
841
1047
  ib_pause_tip: "暂停 · 可稍后继续",
842
1048
  ib_adjourn_label: "结束会议",
843
1049
  ib_adjourn_tip: "散会 · 归档报告并结束",
1050
+ ib_adjourn_text: "结束",
1051
+ ib_jump_top_label: "跳到最初的提问",
1052
+ ib_jump_top_tip: "滚动到打开本房间的最初提问",
844
1053
 
845
1054
  paused_bar_template: "// 讨论已暂停。",
846
1055
  adjourned_strong: "// 会议已结束。",
@@ -878,6 +1087,27 @@ When the room ___, raise an objection.`,
878
1087
 
879
1088
  export_btn: "[↓] 导出",
880
1089
  followup_btn: "[→] 召开跟进会",
1090
+ followup_classify: "follow-up · 跟进会议",
1091
+ followup_classify_right: "// continuing",
1092
+ followup_title: "开一场跟进会议",
1093
+ followup_meta_prefix: "// following up",
1094
+ followup_placeholder: "在上一场判断之上,下一个要追问的问题是什么?",
1095
+ followup_context_note: "上一场的议题、最终判断(brief)和每位 director 的关键观察会作为这场 follow-up 房间的上下文交给新一组 director —— 他们可以直接在已成型的判断上推进,不会从零开始。",
1096
+ followup_cast_label: "Directors",
1097
+ followup_cast_hint: "建议 2-4 位",
1098
+ followup_cast_same: "沿用上一场的 cast",
1099
+ followup_picker_label: "选择董事",
1100
+ followup_auto_label: "directors",
1101
+ followup_auto_val: "自动挑选",
1102
+ followup_directors_one: "{n} 位董事",
1103
+ followup_directors_many: "{n} 位董事",
1104
+ followup_cancel: "[ Cancel ]",
1105
+ followup_confirm: "[ Convene → ]",
1106
+ followup_confirm_busy: "[ Convening… ]",
1107
+ followup_adjourned_at_prefix: "adjourned",
1108
+ followup_briefs_one: "已存 {n} 份 brief",
1109
+ followup_briefs_many: "已存 {n} 份 brief",
1110
+ followup_no_brief: "no brief filed",
881
1111
 
882
1112
  sys_notice_dismiss: "关闭",
883
1113
 
@@ -934,6 +1164,7 @@ When the room ___, raise an objection.`,
934
1164
  notes_aria_filters: "按时间筛选笔记",
935
1165
  notes_director_fallback: "董事",
936
1166
  notes_item_room: "会议室",
1167
+ share_card_distilled: "被蒸馏的 {name}",
937
1168
 
938
1169
  room_meeting_room: "会议室",
939
1170
  room_meta_tone: "模式",
@@ -950,6 +1181,8 @@ When the room ___, raise an objection.`,
950
1181
  room_view_report: "[ 查看报告 ]",
951
1182
  room_view_report_multi: "[ 查看报告 · {n} ▾ ]",
952
1183
  room_view_report_title_multi: "{n} 份报告 · 点击选择",
1184
+ room_view_report_generating: "报告生成中…",
1185
+ room_view_report_generating_title: "报告正在生成中 · 完成后可点击查看",
953
1186
  room_generate_report: "生成报告",
954
1187
  room_generate_report_title: "为本场会议补出报告",
955
1188
  room_chair_pick_title: "本回合由主席点名 {name}",
@@ -1005,6 +1238,35 @@ When the room ___, raise an objection.`,
1005
1238
  ap_edit: "编辑",
1006
1239
  ap_cancel: "取消",
1007
1240
  ap_save: "保存",
1241
+
1242
+ ap_build_log: "构建日志",
1243
+ ap_build_log_kicker: "— 这个 Agent 是怎么搭出来的",
1244
+ ap_build_log_open: "想看看这个 Agent 是怎么搭出来的?",
1245
+ ap_build_log_open_cta: "▸ 打开构建日志",
1246
+ ap_build_log_teaser_fallback: "我们用了七个阶段来搭这个 Agent,其中包括上网做了一轮多角度的资料检索。",
1247
+ ap_build_log_no_narrative: "这次没有写总述,下面是完整的时间线。",
1248
+ ap_build_phase_1: "先画个草稿",
1249
+ ap_build_phase_2: "上网搜资料",
1250
+ ap_build_phase_3: "重新润色",
1251
+ ap_build_phase_4: "总结行为准则",
1252
+ ap_build_phase_5: "写出范例",
1253
+ ap_build_phase_6: "拟自检清单",
1254
+ ap_build_phase_7: "测题与独特性测试",
1255
+ ap_build_phase_1_blurb: "在没看任何资料之前,我们先粗略勾出这个角色的思想脉络、招牌想法和容易踩坑的地方。",
1256
+ ap_build_phase_2_blurb: "我们挑了几个角度去网上挖资料,再补充几轮针对空白点的搜索。",
1257
+ ap_build_phase_3_blurb: "把搜来的资料吃透之后,整个角色重写了一遍——形状还是那个形状,细节变厚了。",
1258
+ ap_build_phase_4_blurb: "把规则提炼出来:永远要做什么、永远不做什么、什么时候做什么。",
1259
+ ap_build_phase_5_blurb: "写了几个工作范例,告诉模型这个人具体是怎么回话的。",
1260
+ ap_build_phase_6_blurb: "整理出一份内部清单,让这位 Director 在开口之前默默自检一遍。",
1261
+ ap_build_phase_7_blurb: "用一批测试问题,把它的回答跟通用 AI 拉到一起对照,量一下它有多独特。",
1262
+ ap_build_dimensions_label: "研究角度",
1263
+ ap_build_topup_label: "补漏搜索",
1264
+ ap_build_divergence_label: "声音独特度",
1265
+ ap_build_tokens_label: "Token 用量",
1266
+ ap_build_duration_label: "耗时",
1267
+ ap_build_sources_short: "读了 {n} 篇资料",
1268
+ ap_build_searches_short: "{n} 次搜索",
1269
+ ap_build_close: "关闭构建日志",
1008
1270
  ap_rules_add: "+ 添加规则",
1009
1271
  ap_rules_max: "上限 {n} 条",
1010
1272
  ap_rules_empty_list: "暂无规则 · 点击上方「+ 添加规则」",
@@ -1113,6 +1375,7 @@ When the room ___, raise an objection.`,
1113
1375
 
1114
1376
  sa_head: "// 会议数据",
1115
1377
  sa_stamp: "已结束",
1378
+ session_end_marker: "会议已结束",
1116
1379
  sa_tokens: "tokens",
1117
1380
  sa_messages: "条消息",
1118
1381
  sa_rounds: "轮讨论",
@@ -1159,17 +1422,98 @@ When the room ___, raise an objection.`,
1159
1422
  pause_soft_deck: "让 {name} 说完本轮,再暂停队列。",
1160
1423
  pause_cancel_mark: "↩ 取消",
1161
1424
  pause_cancel_deck: "不暂停,继续讨论。",
1425
+ reload_class: "刷新 · 选择",
1426
+ reload_right: "// 房间正在发言",
1427
+ reload_tag: "▸ 刷新页面",
1428
+ reload_title: "{name} 正在发言。",
1429
+ reload_deck: "刷新前如何处理当前发言?",
1430
+ reload_hard_mark: "▍ 立即打断并刷新",
1431
+ reload_hard_deck: "中途打断回复,立即刷新。已生成的部分会被丢弃。",
1432
+ reload_soft_mark: "⌛ 当前发言完毕后刷新",
1433
+ reload_soft_deck: "让 {name} 说完这轮,然后自动刷新页面。",
1434
+ reload_cancel_mark: "↩ 取消",
1435
+ reload_cancel_deck: "留在页面,讨论继续。",
1436
+ resume_class: "继续 · 选择",
1437
+ resume_right: "// 缺少语音密钥",
1438
+ resume_tag: "▸ 语音模式需要密钥",
1439
+ resume_deck: "这个房间是语音模式,但没有配置任何语音服务密钥。选择如何继续:",
1440
+ resume_configure_mark: "⚙ 配置语音密钥",
1441
+ resume_configure_deck: "打开设置 → API 密钥。配置完成后回来恢复房间。",
1442
+ resume_text_mark: "▸ 转为纯文字房间",
1443
+ resume_text_deck: "把这个房间切到文字模式立即恢复。Director 通过文字气泡发言,没有声音。",
1444
+ resume_cancel_mark: "↩ 取消",
1445
+ resume_cancel_deck: "保持暂停,稍后再说。",
1446
+ room_delivery_switch_err: "切换发言模式失败:{msg}",
1162
1447
 
1163
- pause_bar_add_input: "[ + 补充观点 ]",
1164
- pause_bar_adjourn: "[ ▸ 结束并存档 ]",
1165
- pause_bar_resume: "[ ▶ 恢复讨论 ]",
1166
- pause_bar_paused: "已暂停",
1167
- pause_bar_next: "下一位",
1168
1448
 
1169
1449
  cmp_tone_label: "语气",
1170
1450
  cmp_intensity_label: "强度",
1171
1451
  cmp_voice_tooltip: "开启语音会议",
1172
1452
  cmp_voice_label: "Voice Mode",
1453
+ // Topic-rec trigger card · zh translation. See en/ block
1454
+ // above for why this string is i18n'd (parallel with the
1455
+ // composer hero copy that also flips with locale).
1456
+ cmp_recs_trigger_label: "找你可能感兴趣的话题",
1457
+ cmp_recs_trigger_tag: "discover",
1458
+ cmp_recs_trigger_starting: "正在准备…",
1459
+
1460
+ vonb_tag: "▸ 语音房间",
1461
+ vonb_classification_left: "语音房间 · 引导",
1462
+ vonb_classification_right: "// 预览",
1463
+ vonb_meta_label: "// 功能介绍",
1464
+ vonb_meta_live: "实时预览",
1465
+ vonb_title: "让董事会发声。",
1466
+ vonb_deck: "Director 在圆桌上有声发言。在下面配置一个语音模型的 API key,就能召开一场语音会议。",
1467
+ vonb_cta: "去配置语音 API Key",
1468
+ vonb_theme_eastwood_name: "脑暴",
1469
+ vonb_theme_eastwood_deck: "泥土 + 草地 · 自由开阔",
1470
+ vonb_theme_regent_name: "建设性",
1471
+ vonb_theme_regent_deck: "石墨大理石 · 高管",
1472
+ vonb_theme_atrium_name: "研究",
1473
+ vonb_theme_atrium_deck: "浅色大理石 · 学院风",
1474
+ vonb_theme_nintendo_name: "批评",
1475
+ vonb_theme_nintendo_deck: "酒红地毯 · 正式",
1476
+
1477
+ onb_v2_classification_left: "首次进入 · 欢迎",
1478
+ onb_v2_classification_right: "// 本地 · 约 60 秒",
1479
+ onb_v2_back: "[ ◂ 上一步 ]",
1480
+ onb_v2_next: "[ 下一步 ▸ ]",
1481
+ onb_v2_continue: "[ 继续 ▸ ]",
1482
+ onb_v2_ready: "[ 我准备好了 ▸ ]",
1483
+ onb_v2_enter: "[ 进来 ▸ ]",
1484
+ onb_v2_name_kicker: "00 — 坐下来",
1485
+ onb_v2_name_title: "房间该怎么称呼你?",
1486
+ onb_v2_name_sub: "从现在起,这里就是你的房间。",
1487
+ onb_v2_name_placeholder: "例如 Kay",
1488
+ onb_v2_what_kicker: "01 — 这是一场会议,不是问答",
1489
+ onb_v2_what_title: "你召集一群固执的顾问,让他们就一个问题在你面前争论。",
1490
+ onb_v2_what_body: "三幕 · convene · sharpen · adjourn。你是主席,董事们各执一词,闭会时你拿到一份 brief。",
1491
+ onb_v2_what_note: "不是 chatbot。董事们不会顺着你说——他们会持续施压,直到问题被磨清。",
1492
+ onb_v2_key_kicker: "02 — 把钥匙交给信使",
1493
+ onb_v2_key_title: "选一个脑袋,或者一群脑袋。",
1494
+ onb_v2_key_body: "Key 只留在这台机器上,我们不会上传。",
1495
+ onb_v2_key_recommend_badge: "// 推荐",
1496
+ onb_v2_key_recommend_name: "OpenRouter · 一把钥匙,所有模型",
1497
+ onb_v2_key_recommend_body: "每位 director 可以跑在不同的模型上——Claude 当怀疑论者,GPT 当模式猎手,Gemini 当长期主义者。主席每一轮都会把发言派给最合适的脑袋。",
1498
+ onb_v2_key_or: "或者,用一家直连厂商",
1499
+ onb_v2_key_or_body: "所有 director 共用一个模型。人格仍然各异,但底下是同一颗脑袋。",
1500
+ onb_v2_voice_kicker: "03 — 让他们开口说话 · 可跳过",
1501
+ onb_v2_voice_title: "想让他们真的发声吗?",
1502
+ onb_v2_voice_body: "配置一个 TTS key,董事会就会变成一张圆桌——director 们各就各位,发言时抬头说话,倾听时缓缓落座。",
1503
+ onb_v2_voice_pitch: "玩起来像一场慢节奏的策略游戏:你看着自己的董事们思考、对峙、互相挑战,每位 director 都有自己独特的声线(首次配置时自动分配)。不想要也行,跳过即可;之后在 Settings 里随时可以打开。",
1504
+ onb_v2_voice_skip: "[ 暂时跳过 ]",
1505
+ onb_v2_voice_skip_cta: "[ 跳过 → ]",
1506
+ onb_v2_cast_kicker: "04 — 你的董事会",
1507
+ onb_v2_cast_title: "Chair 主持会议,director 各执一词,最后给你一份 brief。",
1508
+ onb_v2_cast_body: "默认主席替你挑三位 director,你也可以亲自选。这些选择——以及你那个问题——下一步在 composer 里完成。",
1509
+ onb_v2_cast_lineup: "// 仅预览 · 待会儿在 composer 里挑",
1510
+ onb_v2_cast_next_kicker: "// 下一步 · 在 composer 里",
1511
+ onb_v2_cast_next_step_1: "写下你的问题",
1512
+ onb_v2_cast_next_step_2: "Chair 替你选 3 位 director",
1513
+ onb_v2_cast_next_step_3: "按下 Convene",
1514
+ onb_v2_hint_kicker: "// 你的座位",
1515
+ onb_v2_hint_body: "把你心里那个一直绕不开的问题写在这里——然后按 Convene。",
1516
+ onb_v2_hint_dismiss: "知道了",
1173
1517
 
1174
1518
  rt_speaking: "正在说话",
1175
1519
  rt_thinking: "思考中",
@@ -1308,6 +1652,13 @@ When the room ___, raise an objection.`,
1308
1652
  brief_supplement_btn: "补充视角,再生成一版报告",
1309
1653
  brief_delete_label: "删除报告",
1310
1654
  ending_session_foot: "// 会议结束",
1655
+ brief_llm_hide_stream: "收起模型流水",
1656
+ brief_llm_view_stream: "查看模型流水",
1657
+ brief_llm_waiting_first: "等待首个调用",
1658
+ brief_llm_waiting_output: "等待模型输出…",
1659
+ delivery_text_hint: "最快的文字会议",
1660
+ delivery_voice_hint: "口语化 · 逐位播放",
1661
+ share_distilled_by: "被蒸馏的 {author}",
1311
1662
  brief_wc_approx_chars: "约 {n} 字",
1312
1663
  brief_wc_one_word: "1 词",
1313
1664
  brief_wc_words: "{n} 词",
@@ -1429,6 +1780,10 @@ When the room ___, raise an objection.`,
1429
1780
  ag_ws_title_off: "生成时不联网 · 点击开启",
1430
1781
  ag_ws_label: "联网搜索",
1431
1782
 
1783
+ greet_0: "// 深夜了,{name}",
1784
+ greet_1: "// 早上好,{name}",
1785
+ greet_2: "// 下午好,{name}",
1786
+ greet_3: "// 晚上好,{name}",
1432
1787
  greet_en_0: "// Up late, {name}",
1433
1788
  greet_en_1: "// Good morning, {name}",
1434
1789
  greet_en_2: "// Good afternoon, {name}",
@@ -1530,6 +1885,9 @@ When the room ___, raise an objection.`,
1530
1885
  us_nav_other_settings: "其他设置",
1531
1886
  us_locale_label: "界面语言",
1532
1887
  us_locale_deck: "侧边栏、对话框和应用外壳使用该语言;房间消息与简报仍会以你书写的内容为准。",
1888
+ us_replay_onb_label: "回放 Onboarding",
1889
+ us_replay_onb_btn: "再带我走一次",
1890
+ us_replay_onb_deck: "重新走一遍四步欢迎流程。你的名字、主题和 API key 都保留不动。",
1533
1891
  us_default_model_title: "默认模型",
1534
1892
  us_default_deck_long:
1535
1893
  "新创建的董事默认继承此项;若已保存的模型因密钥变更或下线而不可达,也会回退到这里。旗舰档位的深度写作同样使用该模型。",
@@ -1551,29 +1909,1540 @@ When the room ___, raise an objection.`,
1551
1909
  onb_show: "显示",
1552
1910
  onb_hide: "隐藏",
1553
1911
  },
1912
+ /* ─── ja · 日本語 · best-effort translations ───
1913
+ Missing / awkward strings fall back to en via the
1914
+ t() helper. Tone: polite-neutral (です/ます), kept
1915
+ short to match the codebase's terse mono-register. */
1916
+ ja: {
1917
+ locale_en: "EN",
1918
+ locale_zh: "中文",
1919
+ locale_ja: "日本語",
1920
+ locale_es: "Español",
1921
+ aria_language: "言語",
1922
+
1923
+ brand_privateboard: "PRIVATEBOARD",
1924
+ brand_control: "コントロール",
1925
+ classification: "プライベートアクセス",
1926
+ topbar_sync: "同期:",
1927
+ topbar_uid: "UID:",
1928
+ topbar_room: "会議室:",
1929
+
1930
+ sidebar_head: "// コントロール",
1931
+ sidebar_tab_rooms: "会議室",
1932
+ sidebar_tab_agents: "エージェント",
1933
+ sidebar_new_room: "新しい会議室",
1934
+ sidebar_all_reports: "すべてのレポート",
1935
+ sidebar_all_notes: "すべてのノート",
1936
+ sidebar_new_agent: "新しいエージェント",
1937
+ sidebar_host: "// ホスト",
1938
+ sidebar_collapse: "サイドバーを折りたたむ",
1939
+ sidebar_expand: "サイドバーを展開",
1940
+ sidebar_summary: "{live} 進行中 / {agents} エージェント",
1941
+
1942
+ queue_speaking_queue: "発言キュー",
1943
+ queue_mode: "モード:",
1944
+ queue_toggle: "折りたたみ / 展開",
1945
+ send_placeholder: "いつでも割り込み · @first_p でディレクター指名…",
1946
+ ib_paused_placeholder: "メモを残す · 再開時にディレクターが確認します",
1947
+ ib_followup_placeholder: "話を継続 · 送信するとこの質問でフォローアップ・ルームを開きます",
1948
+ adj_export_label: "このルームをエクスポート",
1949
+ adj_export_tip: "エクスポート · 議事録とレポートをダウンロード",
1950
+ adj_replay_label: "音声リプレイ",
1951
+ adj_replay_tip: "音声リプレイ · 議論を聞き直す",
1952
+ adj_followup_label: "フォローアップを召集",
1953
+ adj_followup_tip: "このルームからフォローアップ・ルームを召集",
1954
+ paused_strip_kicker: "// 一時停止中",
1955
+ paused_strip_resume: "▸ 議論を再開",
1956
+ adjourned_strip_kicker: "// 終了済み",
1957
+ adjourned_strip_meta: "{time}前に提出",
1958
+ adjourned_strip_replay: "▸ 音声リプレイ",
1959
+ send_button: "[ 送信 ]",
1960
+ ib_pause_label: "議論を一時停止",
1961
+ ib_pause_tip: "一時停止 · 後で再開できます",
1962
+ ib_adjourn_label: "会議を終了",
1963
+ ib_adjourn_tip: "終了 · レポートを提出して閉じる",
1964
+ ib_adjourn_text: "終了",
1965
+ ib_vote_label: "投票フェーズを開始",
1966
+ ib_vote_tip: "ラウンドを締めてディレクターの投票を集計",
1967
+ ib_vote_label_queued: "投票キュー済み",
1968
+ ib_vote_tip_queued: "投票キュー済み · 現在の発言者の後で開始",
1969
+ ib_jump_top_label: "最初の質問へ移動",
1970
+ ib_jump_top_tip: "このルームを開いた最初の質問までスクロール",
1971
+
1972
+ vt_kicker: "投票トリガー",
1973
+ vt_title: "投票フェーズを開始しますか?",
1974
+ vt_intro_idle: "発言中のディレクターはいません。チェアがラウンドを要約し、キーポイントを記録して投票を開始します。",
1975
+ vt_intro_speaking: "{who} が発言中です。投票フェーズのタイミングを選んでください。",
1976
+ vt_intro_speaking_fallback: "あるディレクター",
1977
+ vt_now_label: "今すぐ割り込み",
1978
+ vt_now_desc_speaking: "現在の発言者を中断し、すぐに投票を開始します。",
1979
+ vt_now_desc_idle: "キュー中のディレクターをスキップしてすぐに投票を開始。",
1980
+ vt_after_label: "現在の発言者の後",
1981
+ vt_after_desc_speaking: "現在の発言者にターンを終えさせてから投票へ。",
1982
+ vt_after_desc_idle: "発言者はいません — 「今すぐ割り込み」を選んでください。",
1983
+ vt_cancel: "キャンセル",
1984
+ vt_cancel_desc: "会議を続行 · 投票は開かない。",
1985
+
1986
+ paused_bar_template: "// 議論を一時停止中。",
1987
+ adjourned_strong: "// 会議終了。",
1988
+ adjourned_deck: "ブリーフは上に提出されています。",
1989
+
1990
+ adj_title_file: "レポートを提出しますか?",
1991
+ adj_title_generate: "レポートを生成",
1992
+ adj_classify_adjourn: "会議室 · 終了",
1993
+ adj_classify_generate: "会議室 · レポート生成",
1994
+ adj_classify_right_terminal: "// 最終",
1995
+ adj_classify_right_posthoc: "// 事後",
1996
+ adj_confirm_file: "[ 終了 & 提出 ]",
1997
+ adj_confirm_generate: "[ 生成 ]",
1998
+ adj_meta_room_kicker: "// 会議室 #",
1999
+ adj_meta_sep: " · ",
2000
+ adj_meta_status_live: "進行中",
2001
+ adj_meta_status_paused: "一時停止",
2002
+ adj_meta_status_adjourned: "終了",
2003
+ adj_meta_turns: "{n} ターン",
2004
+ adj_key_subject: "// テーマ",
2005
+ adj_key_authors: "// 著者",
2006
+ adj_key_turns: "// ターン",
2007
+ adj_agents_count: "{n} エージェント",
2008
+ adj_note_adjourn:
2009
+ "チェアが会議の議事録から標準レポートを編集します — 状況、主な発見、含意。会議室は終了とマークされ、レポートはチャットに提出されます。",
2010
+ adj_note_generate:
2011
+ "チェアが会議の議事録から標準レポートを編集します — 状況、主な発見、含意。レポートはチャットに提出されます。",
2012
+ adj_skip: "レポートなしで終了",
2013
+ adj_cancel: "[ キャンセル ]",
2014
+ adj_close_aria: "閉じる",
2015
+ adj_busy_generate: "[ 生成中… ]",
2016
+ adj_busy_adjourn: "[ 終了中… ]",
2017
+ adj_err_generate: "生成に失敗: ",
2018
+ adj_err_adjourn: "終了に失敗: ",
2019
+
2020
+ export_btn: "[↓] エクスポート",
2021
+ followup_btn: "[→] フォローアップを開く",
2022
+ followup_classify: "follow-up · 継続セッション",
2023
+ followup_classify_right: "// continuing",
2024
+ followup_title: "フォローアップを開催",
2025
+ followup_meta_prefix: "// following up",
2026
+ followup_placeholder: "前回のセッションが残した結論を踏まえ、次に追求すべき問いは何ですか?",
2027
+ followup_context_note: "前回のテーマ、提出されたブリーフ(会議室の確定判断)、各ディレクターの主要観察がこのフォローアップの文脈として束ねられ、新しいキャストが前回の続きから入れるようになります。",
2028
+ followup_cast_label: "ディレクター",
2029
+ followup_cast_hint: "2〜4 名推奨",
2030
+ followup_cast_same: "前回と同じキャスト",
2031
+ followup_picker_label: "ディレクター選択",
2032
+ followup_auto_label: "directors",
2033
+ followup_auto_val: "自動選択",
2034
+ followup_directors_one: "{n} ディレクター",
2035
+ followup_directors_many: "{n} ディレクター",
2036
+ followup_cancel: "[ キャンセル ]",
2037
+ followup_confirm: "[ 開催 → ]",
2038
+ followup_confirm_busy: "[ 開催中… ]",
2039
+ followup_adjourned_at_prefix: "終了",
2040
+ followup_briefs_one: "{n} ブリーフ提出済み",
2041
+ followup_briefs_many: "{n} ブリーフ提出済み",
2042
+ followup_no_brief: "ブリーフ未提出",
2043
+
2044
+ sys_notice_dismiss: "閉じる",
2045
+
2046
+ rep_title: "すべてのレポート",
2047
+ rep_kicker: "// アーカイブ",
2048
+ rep_meta: "{n} レポート",
2049
+ rep_meta_room: " · {n} 会議室",
2050
+ rep_filter_all: "すべて",
2051
+ rep_filter_today: "今日",
2052
+ rep_filter_week: "今週",
2053
+ rep_filter_earlier: "以前",
2054
+ rep_filter_archive_label: "アーカイブ",
2055
+ rep_group_today: "今日",
2056
+ rep_group_yesterday: "昨日",
2057
+ rep_group_week: "今週",
2058
+ rep_group_earlier: "以前",
2059
+ rep_empty_kicker_archive: "// アーカイブが空",
2060
+ rep_empty_kicker_window: "// この期間は空",
2061
+ rep_empty_title_none: "まだレポートはありません",
2062
+ rep_empty_title_window: "{window} にレポートはありません",
2063
+ rep_empty_deck_all:
2064
+ "セッションを開いて終了 — チェアが提出すれば、すべての会議室のブリーフがここに並びます。",
2065
+ rep_empty_deck_window:
2066
+ "セッションを開いて終了 — チェアの提出が完了するとこの期間にレポートが並びます。アーカイブ全体に戻ることもできます。",
2067
+ rep_empty_deck_filter: "別のフィルターを選ぶか、アーカイブ全体に戻ってください。",
2068
+ rep_cta_convene: "新しい会議室を開く",
2069
+ rep_cta_show_all: "すべてのレポートを表示",
2070
+ rep_aria_filters: "新しさでレポートをフィルタ",
2071
+ rep_sentinel_more: "+ あと {n} 件 · スクロールまたはクリックで読み込み",
2072
+ rep_total_one: "1 レポート",
2073
+ rep_total_n: "{n} レポート",
2074
+ rep_meta_room_one: " · 1 会議室",
2075
+ rep_meta_room_n: " · {n} 会議室",
2076
+ rep_showing: " · {n} 件表示中",
2077
+ rep_load_more: "あと {load} 件読み込み · 残り {remaining}",
2078
+
2079
+ notes_title: "すべてのノート",
2080
+ notes_kicker: "// チェアマン · 保存済み抜粋",
2081
+ notes_meta: "{n} ノート",
2082
+ notes_meta_room: " · {n} 会議室",
2083
+ notes_one: "1 ノート",
2084
+ notes_many: "{n} ノート",
2085
+ rooms_one: "1 会議室",
2086
+ rooms_many: "{n} 会議室",
2087
+
2088
+ picker_no_directors: "ディレクターなし",
2089
+ notes_filter_all: "すべて",
2090
+ notes_empty_title: "まだ保存されたノートはありません",
2091
+ notes_empty_deck:
2092
+ 'ディレクターの返信を読んでいる際に興味深い箇所を選択し <span class="kbd">S</span> またはフローティングバーの <span class="kbd">⌖ 保存</span> をクリックしてここにブックマーク。',
2093
+ notes_empty_window: "{window} にノートはありません",
2094
+ notes_empty_filter_deck: "別のフィルターを選ぶか、アーカイブ全体に戻ってください。",
2095
+ notes_cta_show_all: "すべてのノートを表示",
2096
+ notes_aria_filters: "新しさでノートをフィルタ",
2097
+ notes_director_fallback: "ディレクター",
2098
+ notes_item_room: "会議室",
2099
+ share_card_distilled: "蒸留された {name}",
2100
+
2101
+ room_meeting_room: "会議室",
2102
+ room_meta_tone: "トーン",
2103
+ room_meta_intensity: "強度",
2104
+ room_meta_report: "レポート",
2105
+ room_stamp_paused: "{ago} 前に一時停止",
2106
+ room_stamp_adjourned: "{ago} 前に終了",
2107
+ room_stamp_opened: "{ago} 前に開始",
2108
+ room_cast_title_1: "1 ディレクター",
2109
+ room_cast_n: "{n} ディレクター",
2110
+ room_settings: "会議室設定",
2111
+ room_pause_verb: "一時停止",
2112
+ room_resume_verb: "再開",
2113
+ room_view_report: "[ レポートを開く ]",
2114
+ room_view_report_multi: "[ レポート · {n} ▾ ]",
2115
+ room_view_report_title_multi: "{n} レポート · クリックで選択",
2116
+ room_view_report_generating: "レポート生成中…",
2117
+ room_view_report_generating_title: "レポートを生成中 · 完了するとリンクが有効になります",
2118
+ room_generate_report: "レポート生成",
2119
+ room_generate_report_title: "このセッションからブリーフを提出",
2120
+ room_chair_pick_title: "チェアがこのターンに {name} を指名",
2121
+ msg_chair_pick: "▸ チェア · {body}",
2122
+
2123
+ chat_banner: "会議室開始 · {when} · {n} ディレクター · {mode}",
2124
+
2125
+ round_end_vote_above: "ラウンド終了 · 上で投票",
2126
+ round_clarifying: "確認中 — チェアをお待ちください",
2127
+ round_end_open_vote: "ラウンド終了 · キーポイント投票を開始",
2128
+
2129
+ rp_spent_round: "ラウンド #{n}",
2130
+ rp_spent_label: "終了 · 会議室は次へ",
2131
+ rp_chair_recommends: "チェアの推奨",
2132
+ rp_continue_next: "続行 · 次のラウンド",
2133
+ rp_adjourn_room_file: "⊘ 会議室を終了してブリーフを提出",
2134
+
2135
+ kp_eyebrow_drafting: "▸ キーポイント · 作成中",
2136
+ kp_pending_drafting: "チェアがキーポイントを起草中…",
2137
+ kp_eyebrow_degraded: "▸ キーポイント · このラウンドから解析できませんでした",
2138
+ kp_eyebrow_vote: "▸ キーポイント · 追求したいものに投票",
2139
+ kp_ctas_spent: "// 続行済み",
2140
+ kp_btn_continue_next: "[ ▶ 続行 · 次のラウンド ]",
2141
+ kp_btn_adjourn_brief: "[ ⊘ 終了 & ブリーフ提出 ]",
2142
+ kp_btn_adjourn: "[ ⊘ 終了 ]",
2143
+ kp_shift_eyebrow_prefix: "▸ チェア提案 · トーンを切り替え ",
2144
+ kp_switch_to: "[ ↻ {mode} に切り替え ]",
2145
+ kp_keep_mode: "[ {mode} のまま ]",
2146
+ kp_mode_current_fallback: "現在",
2147
+ kp_vote_more: "もっと",
2148
+ kp_vote_drop: "却下",
2149
+ kp_vote_aria_up: "興味あり",
2150
+ kp_vote_aria_down: "興味なし",
2151
+
2152
+ agent_role_tag_moderator: "モデレーター",
2153
+
2154
+ ap_track_record: "実績",
2155
+ ap_track_tag_model_usage: "モデル · 利用状況",
2156
+ ap_voice_section: "音声設定",
2157
+ ap_voice_section_tag: "tts · プロバイダ · 音声",
2158
+ ap_skills: "スキル",
2159
+ ap_skills_installed: "{current} / {cap} インストール済み",
2160
+ ap_skills_cap_reached: "上限到達 ({current}/{cap}) · 空けるにはアンインストール",
2161
+ ap_skills_drop_hint: "スキルをインストール · <code>.md</code> ファイルをドロップまたはクリック",
2162
+ ap_skills_load_fail: "スキルの読み込み失敗 · {detail}",
2163
+ ap_stat_rooms: "会議室",
2164
+ ap_stat_rounds: "ラウンド",
2165
+ ap_stat_tokens: "トークン",
2166
+ ap_intel: "プロフィール",
2167
+ ap_instruction: "指示",
2168
+ ap_rules: "ルール",
2169
+ ap_memory: "メモリー",
2170
+ ap_edit: "編集",
2171
+ ap_cancel: "キャンセル",
2172
+ ap_save: "保存",
2173
+
2174
+ ap_build_log: "ビルドログ",
2175
+ ap_build_log_kicker: "— このエージェントの作り方",
2176
+ ap_build_log_open: "このエージェントはどうやって作られた?",
2177
+ ap_build_log_open_cta: "▸ ビルドログを開く",
2178
+ ap_build_log_teaser_fallback: "このエージェントは7つのフェーズで組み立てられました。ウェブを複数の角度から調べる工程も含まれています。",
2179
+ ap_build_log_no_narrative: "今回はサマリーを書けませんでしたが、下にタイムラインがあります。",
2180
+ ap_build_phase_1: "最初のスケッチ",
2181
+ ap_build_phase_2: "ウェブで調べる",
2182
+ ap_build_phase_3: "下書きを書き直す",
2183
+ ap_build_phase_4: "ふるまいの規則",
2184
+ ap_build_phase_5: "応答例を書く",
2185
+ ap_build_phase_6: "セルフチェック項目",
2186
+ ap_build_phase_7: "テスト問と個性度の測定",
2187
+ ap_build_phase_1_blurb: "何も調べないうちに、人物の思想的な系譜・代表的な発想・はまりやすい落とし穴をざっとスケッチしました。",
2188
+ ap_build_phase_2_blurb: "いくつかの角度を選んでウェブを調べ、足りないところはあとから追加で探しました。",
2189
+ ap_build_phase_3_blurb: "調べたものをふまえて、ペルソナをもう一度書き直しました。形は同じ、中身が濃くなります。",
2190
+ ap_build_phase_4_blurb: "「いつもこうする / 絶対しない / 条件付きでする」のルールに整理しました。",
2191
+ ap_build_phase_5_blurb: "このペルソナが実際にどう答えるかを示す応答例を何本か書きました。",
2192
+ ap_build_phase_6_blurb: "発言前に静かに自分でチェックする項目をリスト化しました。",
2193
+ ap_build_phase_7_blurb: "テスト用のお題で、汎用 AI と並べて答えさせ、声がどれだけ違うかを測りました。",
2194
+ ap_build_dimensions_label: "調べた角度",
2195
+ ap_build_topup_label: "補足検索",
2196
+ ap_build_divergence_label: "声の独自性",
2197
+ ap_build_tokens_label: "使用トークン",
2198
+ ap_build_duration_label: "所要時間",
2199
+ ap_build_sources_short: "{n} 件読了",
2200
+ ap_build_searches_short: "{n} 回検索",
2201
+ ap_build_close: "ビルドログを閉じる",
2202
+ ap_rules_add: "+ ルールを追加",
2203
+ ap_rules_max: "最大 {n}",
2204
+ ap_rules_empty_list: "ルールなし · 上の「+ ルールを追加」を使ってください",
2205
+ ap_memory_add: "+ ノート追加",
2206
+ ap_dream_consolidate_btn: "☾ 統合を実行",
2207
+ ap_dream_consolidate_title: "統合 · 古いノートを破棄し、安定したパターンを残す",
2208
+ ap_show_more: "もっと見る",
2209
+ ap_show_less: "閉じる",
2210
+ ap_intel_empty: "説明なし · 編集して追加",
2211
+ ap_instr_empty: "指示なし · 編集して markdown で記述",
2212
+ ap_instr_placeholder_editor:
2213
+ "markdown · ### 見出し · **太字** · *斜体* · - 箇条書き · `code`",
2214
+ ap_instr_edit_hint: "markdown 対応 · esc でキャンセル",
2215
+ ap_intel_placeholder: "このディレクターの思考スタイルを一文で · {min}–{max} 字",
2216
+ ap_intel_hint: "{min}–{max} 字 · esc でキャンセル",
2217
+ ap_status_intern: "インターン · 試用",
2218
+ ap_status_active: "アクティブ",
2219
+ ap_role_director_upper: "ディレクター",
2220
+ ap_aria_id_menu: "その他",
2221
+ ap_live_agent_director: "ディレクター",
2222
+
2223
+ ap_voice_browser_default: "ブラウザ既定",
2224
+ ap_voice_engine_browser: "ブラウザ TTS",
2225
+ ap_voice_speed: "速度",
2226
+ ap_voice_pitch: "ピッチ",
2227
+ ap_voice_emotion_label: "感情",
2228
+ ap_voice_emotion_hint: "合成音声の感情トーンを設定 — auto はモデルに任せます。",
2229
+ ap_voice_advanced: "詳細チューニング",
2230
+ ap_voice_locked_tag: "// ロック中",
2231
+ ap_voice_locked_title: "音声プロバイダを設定するとこのディレクターが独自の声で話せます。",
2232
+ ap_voice_locked_body: "音声プロバイダを設定して TTS を解除 — ピッチ・速度・感情の調整も可能になります。",
2233
+ ap_voice_locked_cta: "音声を解除",
2234
+ ap_voice_locked_providers: "対応: <b>MiniMax</b> · <b>ElevenLabs</b>",
2235
+ ap_voice_modify_pitch: "ピッチ調整",
2236
+ ap_voice_modify_intensity: "強度調整",
2237
+ ap_voice_modify_timbre: "音色調整",
2238
+ ap_voice_preview_btn_title: "サンプル再生",
2239
+ ap_voice_no_provider: "音声プロバイダが未設定です。",
2240
+ ap_voice_loading: "音声を読み込み中…",
2241
+ ap_voice_fallback_voice: "音声",
2242
+ ap_voice_save_err: "音声の保存に失敗: {msg}",
2243
+ ap_voice_preview_need_voice: "先に音声を選択してください。",
2244
+ ap_voice_preview_failed: "プレビュー失敗: {msg}",
2245
+ ap_voice_preview_playback_blocked: "再生がブロックされました: {msg}",
2246
+ ap_voice_preview_err: "プレビューエラー: {msg}",
2247
+ ap_voice_emotion_auto: "自動",
2248
+ ap_voice_emotion_happy: "幸せ",
2249
+ ap_voice_emotion_sad: "悲しい",
2250
+ ap_voice_emotion_angry: "怒り",
2251
+ ap_voice_emotion_fearful: "恐れ",
2252
+ ap_voice_emotion_disgusted: "嫌悪",
2253
+ ap_voice_emotion_surprised: "驚き",
2254
+ ap_voice_emotion_calm: "落ち着き",
2255
+ ap_voice_emotion_fluent: "流暢",
2256
+
2257
+ ap_model_stale_title: "このモデルは現在の API キーでは到達できません。実行時はグローバル既定にフォールバックします。",
2258
+ ap_model_stale_text: "到達不可 · 実行時に既定へ戻る",
2259
+
2260
+ ao_personnel_kicker: "エージェント · 人事ファイル",
2261
+ ao_classified_mark: "// 機密",
2262
+ ao_lens: "レンズ",
2263
+ ao_model: "モデル",
2264
+ ao_style: "スタイル",
2265
+ ao_memory_room: "会議室内メモリー",
2266
+ ao_badge_this_room: "この会議室",
2267
+ ao_badge_classified: "⊘ 機密",
2268
+ ao_lock_blurb_html:
2269
+ '会議室内のノートは各思考者のプライベートです。<a href="/" class="lock-link">サインイン →</a> で発言と立場の変化を確認できます。',
2270
+ ao_tenure_meta: "在任 ·",
2271
+ ao_first_room_meta: "最初の会議室 ·",
2272
+ ao_free: "空き",
2273
+ ao_convene_cta: "[ ◆ 一緒に開催 ]",
2274
+ ao_signin_cta: "[ → サインインして開催 ]",
2275
+ ao_room_notes_empty: "進行中の会議室なし。会議室を開いてこのディレクターのノートを表示。",
2276
+ ao_room_notes_waiting: "まだターンなし — 発言があれば主張と立場の変化がここに表示されます。",
2277
+
2278
+ convene_show_more: "もっと見る ↓",
2279
+ convene_show_less: "閉じる ↑",
2280
+ convene_eyebrow: "▸ 開始 · 最初の質問",
2281
+ convene_meta_to: "宛先",
2282
+
2283
+ msg_model_title: "モデル · {label}",
2284
+ msg_skills_used: "使用したスキル: {list}",
2285
+ msg_ws_title: "ウェブ検索: {query} · {n} ソース",
2286
+ msg_ws_btn: "ウェブ検索 · {n} ソース",
2287
+ msg_ws_btn_one: "ウェブ検索 · 1 ソース",
2288
+ msg_ws_searching: "検索中…",
2289
+ msg_ws_done: "{n} ソース{tail}",
2290
+ msg_ws_done_one: "1 ソース{tail}",
2291
+ msg_ws_failed: "失敗",
2292
+ msg_ws_failed_elapsed: "失敗 · {elapsed}",
2293
+ msg_ws_banner: "// ウェブ検索",
2294
+ msg_ws_toggle: "ソース表示切替",
2295
+ msg_ws_expand_show: "{n} 件のソースをすべて表示",
2296
+ msg_ws_query_label: "クエリ",
2297
+ msg_ws_expand_hide: "閉じる",
2298
+ msg_ws_secs: "{n}s",
2299
+ msg_chair_direct_kicker: "▸ チェア · あなたへの返答",
2300
+ msg_chair_intervention_kicker: "▸ チェア注記",
2301
+ msg_chair_billing_kicker: "▸ 請求 · 要確認",
2302
+ msg_chair_display_fallback: "チェア",
2303
+ msg_ctx_title: "{name} に文脈として送信された過去 {n} ターン",
2304
+ msg_ctx_inline: "· {n} ctx",
2305
+ msg_tag_you: "// あなた",
2306
+ msg_tag_chair: "// チェア",
2307
+
2308
+ sa_head: "// セッション分析",
2309
+ sa_stamp: "終了",
2310
+ session_end_marker: "セッション終了",
2311
+ sa_tokens: "トークン",
2312
+ sa_messages: "メッセージ",
2313
+ sa_rounds: "ラウンド",
2314
+ sa_minutes: "分",
2315
+ sa_model_head: "モデル使用状況",
2316
+ sa_value_head: "重要視したもの",
2317
+ sa_value_empty: "このセッションで ▲ 投票、追問、賛同はありませんでした。",
2318
+ sa_voted: "▲ 投票",
2319
+ sa_seconded: "★ 賛同",
2320
+ sa_probed: "✎ 追問",
2321
+ sa_seg_title: "{model} · {tokens} トークン",
2322
+
2323
+ nk_title: "モデル API キーを設定",
2324
+ nk_deck: "チェアとディレクターは大規模言語モデルで動作します。AI 機能を有効にする前に少なくとも 1 つのプロバイダ (Anthropic / OpenAI / Google / xAI / DeepSeek / OpenRouter) のキーを設定してください。",
2325
+ nk_primary: "[ 設定を開く ▸ ]",
2326
+ nk_dismiss: "[ 閉じる ]",
2327
+ nk_classification: "ai · モデルキー未設定",
2328
+ nk_tag: "▸ API キーを設定",
2329
+ nk_primary_deck: "Preferences → API Key に移動。任意のプロバイダのキーを貼り付けて会議室を解除。",
2330
+ nk_frontend_gate: "// フロントエンドゲート",
2331
+
2332
+ sc_send_class: "送信 · 選択",
2333
+ sc_send_right: "// {name} が発言中",
2334
+ sc_send_tag: "▸ ターン中に送信",
2335
+ sc_send_title: "{name} がターンの途中です。",
2336
+ sc_send_deck: "今すぐ割り込むか、終了までキューしますか?",
2337
+ sc_interrupt_mark: "▸ 割り込んで今送信",
2338
+ sc_interrupt_deck: "即座に会議室へ。{name} はあなたの上で続行します。",
2339
+ sc_queue_mark: "→ {name} の終了を待つ",
2340
+ sc_queue_deck: "メッセージは現在のターンの後に並び、終了次第投稿されます。",
2341
+ sc_cancel_mark: "✕ キャンセル",
2342
+ sc_cancel_deck: "入力を続けて後で決める。",
2343
+ sc_speaker_fallback: "あるディレクター",
2344
+
2345
+ pause_class: "一時停止 · 選択",
2346
+ pause_right: "// 会議室はターン中",
2347
+ pause_tag: "▸ 議論を一時停止",
2348
+ pause_title: "{name} が今発言中です。",
2349
+ pause_deck: "どのように一時停止しますか?",
2350
+ pause_hard_mark: "▍ すぐに停止",
2351
+ pause_hard_deck: "返答を文の途中で打ち切り。部分的な返答は破棄されます。",
2352
+ pause_soft_mark: "⌛ 終了を待つ",
2353
+ pause_soft_deck: "{name} にこのターンを終えさせてからキューを停止。",
2354
+ pause_cancel_mark: "↩ キャンセル",
2355
+ pause_cancel_deck: "議論を続行。",
2356
+ reload_class: "再読込 · 選択",
2357
+ reload_right: "// 会議室はターン中",
2358
+ reload_tag: "▸ ページを再読込",
2359
+ reload_title: "{name} が発言中です。",
2360
+ reload_deck: "再読込の前に、進行中の発言をどうしますか?",
2361
+ reload_hard_mark: "▍ 中断して再読込",
2362
+ reload_hard_deck: "返答を文の途中で打ち切ってから再読込。部分的な返答は破棄されます。",
2363
+ reload_soft_mark: "⌛ 終わったら再読込",
2364
+ reload_soft_deck: "{name} にこのターンを終えさせてから自動で再読込。",
2365
+ reload_cancel_mark: "↩ キャンセル",
2366
+ reload_cancel_deck: "ページに留まる · 議論を続行。",
2367
+ resume_class: "再開 · 選択",
2368
+ resume_right: "// 音声キーが未設定",
2369
+ resume_tag: "▸ 音声モードには鍵が必要",
2370
+ resume_deck: "この会議室は音声モードですが、音声プロバイダの鍵が設定されていません。再開方法を選んでください:",
2371
+ resume_configure_mark: "⚙ 音声キーを設定",
2372
+ resume_configure_deck: "設定 → API キーを開きます。鍵を設定したら再開してください。",
2373
+ resume_text_mark: "▸ テキスト会議室として続行",
2374
+ resume_text_deck: "この会議室をテキストモードに切り替えてすぐ再開。ディレクターはテキストで発言し、音声はありません。",
2375
+ resume_cancel_mark: "↩ キャンセル",
2376
+ resume_cancel_deck: "一時停止のまま。後で決めます。",
2377
+ room_delivery_switch_err: "配信モードを切り替えられませんでした: {msg}",
2378
+
2379
+
2380
+ cmp_tone_label: "トーン",
2381
+ cmp_intensity_label: "強度",
2382
+ cmp_voice_tooltip: "音声会議を有効化",
2383
+ cmp_voice_label: "Voice Mode",
2384
+ cmp_recs_trigger_label: "あなたが興味を持ちそうなトピックを探す",
2385
+ cmp_recs_trigger_tag: "discover",
2386
+ cmp_recs_trigger_starting: "準備中…",
2387
+
2388
+ vonb_tag: "▸ ボイスモード",
2389
+ vonb_classification_left: "ボイスモード · オンボーディング",
2390
+ vonb_classification_right: "// プレビュー",
2391
+ vonb_meta_label: "// 機能紹介",
2392
+ vonb_meta_live: "ライブプレビュー",
2393
+ vonb_title: "ボードを声で動かす。",
2394
+ vonb_deck: "ディレクターが円卓で声に出して議論します。下の音声モデル API キーを登録すれば、ライブセッションを開けます。",
2395
+ vonb_cta: "音声 API キーを設定",
2396
+ vonb_theme_eastwood_name: "ブレスト",
2397
+ vonb_theme_eastwood_deck: "土と草地 · オープン",
2398
+ vonb_theme_regent_name: "建設的",
2399
+ vonb_theme_regent_deck: "グラファイト大理石 · エグゼクティブ",
2400
+ vonb_theme_atrium_name: "リサーチ",
2401
+ vonb_theme_atrium_deck: "ライト大理石 · アカデミック",
2402
+ vonb_theme_nintendo_name: "クリティーク",
2403
+ vonb_theme_nintendo_deck: "バーガンディ絨毯 · フォーマル",
2404
+
2405
+ onb_v2_classification_left: "初回 · ようこそ",
2406
+ onb_v2_classification_right: "// ローカル · 約 60 秒",
2407
+ onb_v2_back: "[ ◂ 戻る ]",
2408
+ onb_v2_next: "[ 次へ ▸ ]",
2409
+ onb_v2_continue: "[ 続ける ▸ ]",
2410
+ onb_v2_ready: "[ 準備できた ▸ ]",
2411
+ onb_v2_enter: "[ 入る ▸ ]",
2412
+ onb_v2_name_kicker: "00 — まず座る",
2413
+ onb_v2_name_title: "この部屋であなたを何と呼びましょう?",
2414
+ onb_v2_name_sub: "今この瞬間から、ここはあなたの部屋です。",
2415
+ onb_v2_name_placeholder: "例:Kay",
2416
+ onb_v2_what_kicker: "01 — チャットボットではなく、会議",
2417
+ onb_v2_what_title: "頑固な顧問たちを呼び集め、あなたの前で本気の問いを巡って議論させる。",
2418
+ onb_v2_what_body: "三幕構成 · convene · sharpen · adjourn。あなたは議長、director たちは各々の立場で対立し、閉会時にあなたは brief を持って退室します。",
2419
+ onb_v2_what_note: "チャットボットではありません。director たちは同調しない——問いが鋭くなるまで圧をかけ続けます。",
2420
+ onb_v2_key_kicker: "02 — 鍵を預ける",
2421
+ onb_v2_key_title: "一つの脳を選ぶ——あるいは、たくさん選ぶ。",
2422
+ onb_v2_key_body: "key はこの端末にのみ保存され、サーバへ送られることはありません。",
2423
+ onb_v2_key_recommend_badge: "// おすすめ",
2424
+ onb_v2_key_recommend_name: "OpenRouter · 一つの鍵で、すべてのモデル",
2425
+ onb_v2_key_recommend_body: "各 director がそれぞれ違うモデルで動けます——Claude は懐疑家、GPT はパターン捜索、Gemini は長期戦略家。議長が毎ターン、最適な脳に発言を振り分けます。",
2426
+ onb_v2_key_or: "あるいは、直接プロバイダ",
2427
+ onb_v2_key_or_body: "全 director が同じモデルを共有します。ペルソナは別々ですが、土台は一つの脳です。",
2428
+ onb_v2_voice_kicker: "03 — 声を与える · オプション",
2429
+ onb_v2_voice_title: "実際に喋らせてみますか?",
2430
+ onb_v2_voice_body: "TTS の key を追加すると、ボードルームが円卓に変わります——director たちは席に着き、発言時に顔を上げ、聞き役のときは静かに座ります。",
2431
+ onb_v2_voice_pitch: "ゆっくり進むストラテジー・ゲームのように楽しめます。自分のチームが思考し、対立し、互いに挑戦するのを声で見守る。各 director には初回キー設定時に固有の声が割り当てられます。スキップしてもテキストのみで使えます。Settings からいつでも有効化できます。",
2432
+ onb_v2_voice_skip: "[ あとで ]",
2433
+ onb_v2_voice_skip_cta: "[ スキップ → ]",
2434
+ onb_v2_cast_kicker: "04 — あなたの取締役会",
2435
+ onb_v2_cast_title: "Chair が議事を進行、director たちが異論を交わし、brief で締めくくる。",
2436
+ onb_v2_cast_body: "既定では議長が 3 人の director を選びます。自分で指名することもできます。それらの選択——そしてあなたの問い——は次に composer で行います。",
2437
+ onb_v2_cast_lineup: "// プレビューのみ · あとで composer で選びます",
2438
+ onb_v2_cast_next_kicker: "// 次 · composer で",
2439
+ onb_v2_cast_next_step_1: "問いを書く",
2440
+ onb_v2_cast_next_step_2: "Chair が 3 人選ぶ",
2441
+ onb_v2_cast_next_step_3: "Convene を押す",
2442
+ onb_v2_hint_kicker: "// あなたの席",
2443
+ onb_v2_hint_body: "ずっと頭から離れない問いをここに書いて——Convene を押す。",
2444
+ onb_v2_hint_dismiss: "了解",
2445
+
2446
+ rt_speaking: "発言中",
2447
+ rt_thinking: "考え中",
2448
+ rt_user_title: "議長",
2449
+ rt_toggle_transcript: "字幕",
2450
+ rt_toggle_roundtable: "円卓",
2451
+ rt_toggle_enable_voice: "音声モード",
2452
+ rt_aria_stage: "発言者円卓",
2453
+ rt_aria_speaking: "現在の発言者: {name}",
2454
+ rt_aria_queue: "次は: {names}",
2455
+ rt_aria_idle: "発言者なし",
2456
+
2457
+ conv_stage_analyzing_title: "テーマを解析",
2458
+ conv_stage_analyzing_deck: "あなたのテーマに合う視点を選定中",
2459
+ conv_stage_seating_title: "ディレクター着席",
2460
+ conv_stage_seating_deck: "この質問に合う視点を選択中",
2461
+ conv_stage_preparing_title: "チェアが発言準備中",
2462
+ conv_stage_preparing_deck: "開会の挨拶を起草中",
2463
+ conv_seated_label: "着席",
2464
+ conv_banner_convening: "▸ 開催中",
2465
+
2466
+ chair_pend_banner: "▸ チェア",
2467
+ chair_pend_clarify: "{name} があなたの質問を読み込み中…",
2468
+ chair_pend_chair_direct: "{name} が応答を準備中…",
2469
+ chair_pend_round_end: "{name} がこのラウンドをまとめ中…",
2470
+ chair_pend_convening: "{name} が会議室を開催中…",
2471
+ chair_pend_next_speaker: "{name} が会議室を読み解き中…",
2472
+ chair_pend_default: "{name} が準備中…",
2473
+
2474
+ brief_regen_timeout: "再生成タイムアウト",
2475
+ brief_regen_interrupted: "再生成が中断されました",
2476
+ brief_regen_failed: "再生成に失敗",
2477
+ brief_retry: "再試行",
2478
+ brief_dismiss: "閉じる",
2479
+
2480
+ brief_tab_initial: "初期",
2481
+ brief_tab_tooltip_initial: "初期ブリーフ · セッションから生成",
2482
+ brief_tab_supplement_prefix: "補足: ",
2483
+ brief_tab_delete_title: "このレポートを削除",
2484
+
2485
+ brief_err_stamp_timeout: "タイムアウト",
2486
+ brief_err_kicker_timeout: "// 生成タイムアウト",
2487
+ brief_err_detail_timeout: "8 分経っても完了信号がありません — モデルが遅い、接続が切れた、またはパイプラインが停止しています。下のボタンで新しい実行を開始。",
2488
+ brief_err_stamp_interrupted: "中断",
2489
+ brief_err_kicker_interrupted: "// 生成が中断されました",
2490
+ brief_err_detail_interrupted: "前回の生成は途中で打ち切られました — ブラウザのリロードやサーバー再起動が原因かも。下のボタンで新しいレポートを開始。",
2491
+ brief_err_cta_regenerate: "レポートを再生成",
2492
+ brief_err_stamp_failed: "失敗",
2493
+ brief_err_kicker_failed: "// ブリーフ生成失敗",
2494
+ brief_err_hint_failed_html: "ブリーフライターには LLM キー (OpenRouter または Anthropic / OpenAI / Google / xAI の直キー) が必要です。<strong>Preference → API Key</strong> で追加して再試行。",
2495
+ brief_err_hint_scaffold_html: 'チェアモデルは最終本文の前に内部 <strong>scaffold</strong> ステップで有効な JSON を出力する必要があります。よくある原因: スレッド内の有用な信号が少ない、出力の切断や不正、上流のレート制限や請求の問題 — Preference のキーが設定済みなら必ずしも欠如ではありません。<strong>再生成</strong>、議事録を短縮、別の到達可能モデルへ切替、または stderr で <code>[brief.stage2]</code> を確認してください。',
2496
+ brief_err_hint_generic_html: '上の赤い英語行を主な手がかりに。キー / 請求 / <code>401</code>/<code>403</code> に触れる場合は <strong>Preference → API Key</strong> とクォータを確認。それ以外はサーバーログを確認してください。',
2497
+
2498
+ brief_output_head: "▼ セッション出力 ▼",
2499
+ brief_report_tag: "// レポート",
2500
+ brief_filed_generating: "生成中…",
2501
+ brief_filed_stamp: "提出済み · {when}",
2502
+ brief_filed_by: "// {name} 提出",
2503
+ brief_untitled: "(無題)",
2504
+ brief_meta_authors: "{n} 著者",
2505
+ brief_open_report: "レポートを開く",
2506
+ brief_chair_fallback: "チェア",
2507
+
2508
+ brief_hard_timeout_msg: "ブリーフ生成がタイムアウトしました (8 分経過後も完了せず)。",
2509
+ brief_stage_kicker: "// {chair} が議事録準備中 · {total}",
2510
+ brief_stage_extract_label: "各ディレクターの発言を読み込み中",
2511
+ brief_stage_extract_pip: "読込",
2512
+ brief_stage_compose_label: "レポートの形を選択中",
2513
+ brief_stage_compose_pip: "選択",
2514
+ brief_stage_scaffold_anchor_label: "アンカーを設定中",
2515
+ brief_stage_scaffold_anchor_pip: "anchor",
2516
+ brief_stage_scaffold_findings_label: "発見を整理中",
2517
+ brief_stage_scaffold_findings_pip: "find",
2518
+ brief_stage_scaffold_cluster_label: "合意と相違をマッピング中",
2519
+ brief_stage_scaffold_cluster_pip: "split",
2520
+ brief_stage_scaffold_actions_label: "アクションとリスクを起草中",
2521
+ brief_stage_scaffold_actions_pip: "act",
2522
+ brief_stage_write_label: "レポートを執筆中",
2523
+ brief_stage_write_pip: "write",
2524
+
2525
+ brief_prog_directors_one: "{cur}/{tot} ディレクター",
2526
+ brief_prog_directors: "{cur}/{tot} ディレクター",
2527
+ brief_prog_words_one: "1 ワード",
2528
+ brief_prog_words: "{n} ワード",
2529
+ brief_timing_inband: "{e}s · ~{lo}–{hi}s",
2530
+ brief_timing_eta: "~{lo}–{hi}s",
2531
+ brief_timing_over: "{n}s 経過",
2532
+ brief_range_sec: "~{lo}–{hi}s",
2533
+ brief_range_min: "~{lo}-{hi}m",
2534
+ brief_total_line: "{elapsed} 経過 · 残り {range}",
2535
+ brief_fmt_sec: "{n}s",
2536
+ brief_fmt_min: "{n}m",
2537
+ brief_fmt_min_sec: "{m}m {r}s",
2538
+ brief_stat_writing: "{n} ワード · 執筆中",
2539
+ brief_supplement_btn: "視点を追加 · 再生成",
2540
+ brief_delete_label: "レポートを削除",
2541
+ ending_session_foot: "// セッション終了",
2542
+ brief_llm_hide_stream: "モデルストリームを隠す",
2543
+ brief_llm_view_stream: "モデルストリームを表示",
2544
+ brief_llm_waiting_first: "最初の呼び出しを待機中",
2545
+ brief_llm_waiting_output: "出力を待機中…",
2546
+ delivery_text_hint: "最速のテキスト会議",
2547
+ delivery_voice_hint: "音声 · 順番に再生",
2548
+ share_distilled_by: "{author} から抽出",
2549
+ brief_wc_approx_chars: "~{n} 字",
2550
+ brief_wc_one_word: "1 ワード",
2551
+ brief_wc_words: "{n} ワード",
2552
+
2553
+ greet_0: "// 夜更かしですね、{name}",
2554
+ greet_1: "// おはようございます、{name}",
2555
+ greet_2: "// こんにちは、{name}",
2556
+ greet_3: "// こんばんは、{name}",
2557
+ greet_en_0: "// Up late, {name}",
2558
+ greet_en_1: "// Good morning, {name}",
2559
+ greet_en_2: "// Good afternoon, {name}",
2560
+ greet_en_3: "// Good evening, {name}",
2561
+ greet_zh_0: "// 深夜です、{name}",
2562
+ greet_zh_1: "// おはようございます、{name}",
2563
+ greet_zh_2: "// お昼ですね、{name}",
2564
+ greet_zh_3: "// こんにちは、{name}",
2565
+ greet_zh_4: "// こんばんは、{name}",
2566
+ greet_zh_5: "// 夜更かしですね、{name}",
2567
+
2568
+ brief_generating_title: "生成中…",
2569
+
2570
+ q_idle: "キュー待機中",
2571
+ q_speaking: "●●● 発言中",
2572
+ q_pending_vote: "保留 · 投票待ち",
2573
+ q_pending_chair: "保留 · チェア待ち",
2574
+ q_queued: "キュー済み",
2575
+ q_more_queued: "+{n} キュー済み",
2576
+ q_user_queued: 'キュー済み · "{preview}"',
2577
+ q_cancel: "キャンセル",
2578
+ q_state_speaking: "発言中 · {n} ターン読込",
2579
+ q_pending_your_vote: "保留 · あなたの投票待ち",
2580
+ q_pending_waits_chair: "保留 · チェア待ち",
2581
+
2582
+ sidebar_live: "進行中",
2583
+ sidebar_paused: "一時停止",
2584
+ sidebar_section_live: "進行中",
2585
+ sidebar_section_paused: "一時停止",
2586
+ sidebar_section_adjourned: "終了済み",
2587
+ sidebar_no_adjourned_title: "終了済みの会議室なし",
2588
+ sidebar_no_adjourned_deck: "議論を終了してここに保存しましょう。",
2589
+ sidebar_delete_room: "会議室を削除",
2590
+ sidebar_pin: "ピン留め",
2591
+ sidebar_unpin: "ピン解除",
2592
+ sidebar_role_director: "ディレクター",
2593
+ sidebar_status_active: "アクティブ",
2594
+ sidebar_chair_badge: "チェア",
2595
+ sidebar_chair_badge_title: "モデレーター · 構造的エージェント、ユーザー管理外",
2596
+ sidebar_chair_role_fallback: "モデレーター",
2597
+ sidebar_chair_note: "すべての会議室で",
2598
+ sidebar_sec_chair: "チェア",
2599
+ sidebar_sec_pinned: "ピン留め",
2600
+ sidebar_sec_custom: "カスタム",
2601
+ sidebar_sec_core: "コア",
2602
+
2603
+ note_saved: "ノートに保存しました",
2604
+
2605
+ col_resize: "ドラッグでリサイズ",
2606
+ settings_title: "設定",
2607
+
2608
+ us_nav_user: "ユーザー",
2609
+ us_nav_theme: "テーマ",
2610
+ us_nav_usage: "利用状況",
2611
+ us_nav_keys: "API キー",
2612
+ us_nav_default: "デフォルトモデル",
2613
+ us_user_tag: "▸ ユーザー",
2614
+ us_user_deck: "ボードルームでの呼称と、文脈として保持される情報。",
2615
+ us_avatar: "アバター",
2616
+ us_regen_avatar: "8 ビットアバターを生成",
2617
+ us_name: "名前",
2618
+ us_about: "あなたについて",
2619
+ us_intro_ph: "あなたの役割、考えていること、取り組んでいることを一文か二文。ディレクターはこれを会議室全体で意識します。",
2620
+ us_intro_meta: "{n} / 320 字",
2621
+ us_intro_meta_rest: "/ 320 字",
2622
+ us_theme_tag: "▸ テーマ",
2623
+ us_theme_deck: "全体 · zsh 風のパレット。すべての会議室に即座に適用。",
2624
+ us_usage_tag: "▸ 利用状況",
2625
+ us_usage_deck: "ボードルーム開始以降のすべてのディレクター / チェアターンを跨いだ LLM 呼び出しの累積請求。",
2626
+ us_usage_loading: "計測中…",
2627
+ us_usage_empty: "まだ LLM 呼び出しはありません · 会議室を開いてディレクターに発言させてください。",
2628
+ us_usage_agents: "{n} エージェント",
2629
+ us_usage_silent: "+ {n} エージェント未請求",
2630
+ us_keys_tag: "▸ API キー",
2631
+ us_keys_add_label: "+ プロバイダ追加:",
2632
+ us_keys_group_skill: "スキルサービス",
2633
+ us_keys_skill_deck: "外部サービスを必要とするシステムスキルを有効化。各エージェントはプロフィール単位で参加可否を選べます。",
2634
+ us_ws_backend_tag: "ウェブ検索バックエンド",
2635
+ us_ws_backend_deck: "Brave Search と Tavily の両方のキーが設定されています。ウェブ検索システムスキルでどちらを使うか選択。",
2636
+ us_ws_backend_brave: "Brave Search",
2637
+ us_ws_backend_tavily: "Tavily Search",
2638
+ us_pref_title: "設定",
2639
+ us_modal_kicker_left: "ユーザー · 設定",
2640
+ us_modal_kicker_right: "// ローカル",
2641
+ us_close: "閉じる",
2642
+ us_nav_api_key: "API キー",
2643
+ us_nav_other_settings: "その他の設定",
2644
+ us_locale_label: "インターフェース言語",
2645
+ us_locale_deck: "サイドバー、ダイアログ、アプリ全体のクロームがこの言語に従います。会議室のメッセージとブリーフはあなたが書いた言語のままです。",
2646
+ us_replay_onb_label: "オンボーディングを再生",
2647
+ us_replay_onb_btn: "もう一度案内する",
2648
+ us_replay_onb_deck: "4 ステップのウェルカム ストーリーを再実行します。名前・テーマ・API キーはそのまま保持されます。",
2649
+ us_default_model_title: "デフォルトモデル",
2650
+ us_default_deck_long: "新しいエージェントはこれを継承。エージェントの保存モデルが到達不可になった場合 (キー削除 / モデル廃止) もここにフォールバック。フラッグシップ層ではこれを深層書き込みモデルとして使用。",
2651
+ us_keys_deck: "キーは一度貼り付けるだけ — ボードルームはローカルに保存し、決して送信しません。キーはディレクターのターンに使用され、テレメトリには使われません。",
2652
+ us_default_tag: "▸ デフォルトモデル",
2653
+ us_default_deck: "エージェント単位のオーバーライドがない場合のフォールバック。到達可能なモデルのみ。",
2654
+ us_foot_saved: "変更は自動保存",
2655
+ us_foot_website: "ウェブサイト ↗",
2656
+ us_done: "[ 完了 ]",
2657
+ us_usage_chair: "チェア",
2658
+ us_usage_director: "ディレクター",
2659
+
2660
+ onb_next: "[ 次へ ▸ ]",
2661
+ onb_skip: "[ 自分で探索する ]",
2662
+ onb_name_ph: "例: Kay",
2663
+ onb_key_field: "{label} API キー",
2664
+ onb_generate_at: "{host} で取得 →",
2665
+ onb_show: "表示",
2666
+ onb_hide: "非表示",
2667
+ },
2668
+ /* ─── es · Español · best-effort translations ───
2669
+ Voz: neutral, formal-ligero (tuteo). Missing strings
2670
+ fall back to en. */
2671
+ es: {
2672
+ locale_en: "EN",
2673
+ locale_zh: "中文",
2674
+ locale_ja: "日本語",
2675
+ locale_es: "Español",
2676
+ aria_language: "Idioma",
2677
+
2678
+ brand_privateboard: "PRIVATEBOARD",
2679
+ brand_control: "CONTROL",
2680
+ classification: "ACCESO PRIVADO",
2681
+ topbar_sync: "SINC:",
2682
+ topbar_uid: "UID:",
2683
+ topbar_room: "SALA:",
2684
+
2685
+ sidebar_head: "// CONTROL",
2686
+ sidebar_tab_rooms: "Salas",
2687
+ sidebar_tab_agents: "Agentes",
2688
+ sidebar_new_room: "Nueva sala",
2689
+ sidebar_all_reports: "Todos los informes",
2690
+ sidebar_all_notes: "Todas las notas",
2691
+ sidebar_new_agent: "Nuevo agente",
2692
+ sidebar_host: "// anfitrión",
2693
+ sidebar_collapse: "Plegar barra lateral",
2694
+ sidebar_expand: "Expandir barra lateral",
2695
+ sidebar_summary: "{live} EN VIVO / {agents} AGENTES",
2696
+
2697
+ queue_speaking_queue: "cola de palabra",
2698
+ queue_mode: "modo:",
2699
+ queue_toggle: "plegar / expandir",
2700
+ send_placeholder: "interrumpe cuando quieras · @first_p para dirigir un director…",
2701
+ ib_paused_placeholder: "deja una nota · los directores la verán al reanudar",
2702
+ ib_followup_placeholder: "continúa el hilo · envíar abre una sala de seguimiento con esta pregunta",
2703
+ adj_export_label: "Exportar esta sala",
2704
+ adj_export_tip: "Exportar · descarga la transcripción y el informe",
2705
+ adj_replay_label: "Replay de voz",
2706
+ adj_replay_tip: "Replay de voz · vuelve a escuchar la discusión",
2707
+ adj_followup_label: "Convocar seguimiento",
2708
+ adj_followup_tip: "Convoca una sala de seguimiento a partir de esta",
2709
+ paused_strip_kicker: "// pausada",
2710
+ paused_strip_resume: "▸ Reanudar discusión",
2711
+ adjourned_strip_kicker: "// archivada",
2712
+ adjourned_strip_meta: "archivada hace {time}",
2713
+ adjourned_strip_replay: "▸ Replay de voz",
2714
+ send_button: "[ Enviar ]",
2715
+ ib_pause_label: "Pausar la discusión",
2716
+ ib_pause_tip: "Pausa · podrás reanudar después",
2717
+ ib_adjourn_label: "Terminar la sala",
2718
+ ib_adjourn_tip: "Terminar · presenta el informe y cierra",
2719
+ ib_adjourn_text: "Terminar",
2720
+ ib_vote_label: "Abrir fase de votación",
2721
+ ib_vote_tip: "Convocar el voto · cierra la ronda y suma a los directores",
2722
+ ib_vote_label_queued: "Voto en cola",
2723
+ ib_vote_tip_queued: "Voto en cola · abrirá cuando termine el orador actual",
2724
+ ib_jump_top_label: "Ir a la pregunta original",
2725
+ ib_jump_top_tip: "Desplazarse a la pregunta original que abrió esta sala",
2726
+
2727
+ vt_kicker: "disparador de voto",
2728
+ vt_title: "¿Abrir la fase de votación?",
2729
+ vt_intro_idle: "Ningún director en curso. El presidente resumirá la ronda, registrará los puntos clave y abrirá el voto.",
2730
+ vt_intro_speaking: "{who} está en curso. Elige cuándo abrir la fase de votación.",
2731
+ vt_intro_speaking_fallback: "Un director",
2732
+ vt_now_label: "Interrumpir ahora",
2733
+ vt_now_desc_speaking: "Cancela al orador actual y abre el voto de inmediato.",
2734
+ vt_now_desc_idle: "Salta a cualquier director en cola y abre el voto de inmediato.",
2735
+ vt_after_label: "Tras el orador actual",
2736
+ vt_after_desc_speaking: "Deja que el orador actual termine, luego abre el voto.",
2737
+ vt_after_desc_idle: "Nadie habla — elige Interrumpir ahora.",
2738
+ vt_cancel: "Cancelar",
2739
+ vt_cancel_desc: "Mantén la sala activa · no abras el voto.",
2740
+
2741
+ paused_bar_template: "// discusión pausada.",
2742
+ adjourned_strong: "// sala terminada.",
2743
+ adjourned_deck: "el informe está archivado arriba.",
2744
+
2745
+ adj_title_file: "¿Presentar el informe?",
2746
+ adj_title_generate: "Generar el informe",
2747
+ adj_classify_adjourn: "sala · terminar",
2748
+ adj_classify_generate: "sala · generar informe",
2749
+ adj_classify_right_terminal: "// final",
2750
+ adj_classify_right_posthoc: "// posterior",
2751
+ adj_confirm_file: "[ Terminar y presentar ]",
2752
+ adj_confirm_generate: "[ Generar ]",
2753
+ adj_meta_room_kicker: "// sala #",
2754
+ adj_meta_sep: " · ",
2755
+ adj_meta_status_live: "en vivo",
2756
+ adj_meta_status_paused: "pausada",
2757
+ adj_meta_status_adjourned: "terminada",
2758
+ adj_meta_turns: "{n} turnos",
2759
+ adj_key_subject: "// tema",
2760
+ adj_key_authors: "// autores",
2761
+ adj_key_turns: "// turnos",
2762
+ adj_agents_count: "{n} agentes",
2763
+ adj_note_adjourn: "El presidente compila un informe estándar de la transcripción — situación, hallazgos clave e implicaciones. La sala se marca como terminada y el informe se archiva en el chat.",
2764
+ adj_note_generate: "El presidente compila un informe estándar de la transcripción — situación, hallazgos clave e implicaciones. El informe se archiva en el chat.",
2765
+ adj_skip: "Terminar sin informe",
2766
+ adj_cancel: "[ Cancelar ]",
2767
+ adj_close_aria: "Cerrar",
2768
+ adj_busy_generate: "[ Generando… ]",
2769
+ adj_busy_adjourn: "[ Terminando… ]",
2770
+ adj_err_generate: "Generación falló: ",
2771
+ adj_err_adjourn: "Terminación falló: ",
2772
+
2773
+ export_btn: "[↓] Exportar",
2774
+ followup_btn: "[→] Convocar seguimiento",
2775
+ followup_classify: "follow-up · sala de continuación",
2776
+ followup_classify_right: "// continuing",
2777
+ followup_title: "Convocar un seguimiento",
2778
+ followup_meta_prefix: "// following up",
2779
+ followup_placeholder: "¿Cuál es la siguiente pregunta a perseguir, dado lo que dejó la sesión anterior?",
2780
+ followup_context_note: "El tema previo, el informe presentado (juicio asentado de la sala) y las observaciones clave de cada director se empaquetan como contexto de este seguimiento — el nuevo elenco continúa donde quedó la sesión anterior, no desde cero.",
2781
+ followup_cast_label: "Directores",
2782
+ followup_cast_hint: "2–4 recomendado",
2783
+ followup_cast_same: "Mismo elenco que la sesión anterior",
2784
+ followup_picker_label: "Elegir directores",
2785
+ followup_auto_label: "directores",
2786
+ followup_auto_val: "selección automática",
2787
+ followup_directors_one: "{n} director",
2788
+ followup_directors_many: "{n} directores",
2789
+ followup_cancel: "[ Cancelar ]",
2790
+ followup_confirm: "[ Convocar → ]",
2791
+ followup_confirm_busy: "[ Convocando… ]",
2792
+ followup_adjourned_at_prefix: "terminada",
2793
+ followup_briefs_one: "{n} informe presentado",
2794
+ followup_briefs_many: "{n} informes presentados",
2795
+ followup_no_brief: "ningún informe presentado",
2796
+
2797
+ sys_notice_dismiss: "Descartar",
2798
+
2799
+ rep_title: "Todos los informes",
2800
+ rep_kicker: "// archivo",
2801
+ rep_meta: "{n} informes",
2802
+ rep_meta_room: " · {n} salas",
2803
+ rep_filter_all: "Todos",
2804
+ rep_filter_today: "Hoy",
2805
+ rep_filter_week: "Esta semana",
2806
+ rep_filter_earlier: "Antes",
2807
+ rep_filter_archive_label: "el archivo",
2808
+ rep_group_today: "Hoy",
2809
+ rep_group_yesterday: "Ayer",
2810
+ rep_group_week: "Esta semana",
2811
+ rep_group_earlier: "Antes",
2812
+ rep_empty_kicker_archive: "// archivo vacío",
2813
+ rep_empty_kicker_window: "// ventana vacía",
2814
+ rep_empty_title_none: "Aún no hay informes presentados",
2815
+ rep_empty_title_window: "No hay informes en {window}",
2816
+ rep_empty_deck_all: "Abre una sesión y termínala — cuando el presidente presente, todas las salas aparecerán aquí.",
2817
+ rep_empty_deck_window: "Abre una sesión y termínala — cuando el presidente presente, los informes de esta ventana aparecerán aquí. O vuelve al archivo completo.",
2818
+ rep_empty_deck_filter: "Elige otro filtro o vuelve al archivo completo.",
2819
+ rep_cta_convene: "Convocar nueva sala",
2820
+ rep_cta_show_all: "Ver todos los informes",
2821
+ rep_aria_filters: "Filtrar informes por recencia",
2822
+ rep_sentinel_more: "+ {n} más · desplaza o haz clic para cargar",
2823
+ rep_total_one: "1 informe",
2824
+ rep_total_n: "{n} informes",
2825
+ rep_meta_room_one: " · 1 sala",
2826
+ rep_meta_room_n: " · {n} salas",
2827
+ rep_showing: " · mostrando {n}",
2828
+ rep_load_more: "Cargar {load} más · {remaining} restantes",
2829
+
2830
+ notes_title: "Todas las notas",
2831
+ notes_kicker: "// presidente · extractos guardados",
2832
+ notes_meta: "{n} notas",
2833
+ notes_meta_room: " · {n} salas",
2834
+ notes_one: "1 nota",
2835
+ notes_many: "{n} notas",
2836
+ rooms_one: "1 sala",
2837
+ rooms_many: "{n} salas",
2838
+
2839
+ picker_no_directors: "sin directores",
2840
+ notes_filter_all: "Todas",
2841
+ notes_empty_title: "aún no hay notas guardadas",
2842
+ notes_empty_deck: 'Mientras lees la respuesta de un director, selecciona un pasaje interesante y pulsa <span class="kbd">S</span> o haz clic en <span class="kbd">⌖ Guardar</span> en la barra flotante para guardarlo aquí.',
2843
+ notes_empty_window: "No hay notas en {window}",
2844
+ notes_empty_filter_deck: "Elige otro filtro o vuelve al archivo completo.",
2845
+ notes_cta_show_all: "Ver todas las notas",
2846
+ notes_aria_filters: "Filtrar notas por recencia",
2847
+ notes_director_fallback: "Director",
2848
+ notes_item_room: "SALA",
2849
+ share_card_distilled: "Destilado · {name}",
2850
+
2851
+ room_meeting_room: "Sala de reuniones",
2852
+ room_meta_tone: "tono",
2853
+ room_meta_intensity: "intensidad",
2854
+ room_meta_report: "informe",
2855
+ room_stamp_paused: "pausada hace {ago}",
2856
+ room_stamp_adjourned: "terminada hace {ago}",
2857
+ room_stamp_opened: "abierta hace {ago}",
2858
+ room_cast_title_1: "1 director",
2859
+ room_cast_n: "{n} directores",
2860
+ room_settings: "Ajustes de sala",
2861
+ room_pause_verb: "Pausar",
2862
+ room_resume_verb: "Reanudar",
2863
+ room_view_report: "[ Ver informe ]",
2864
+ room_view_report_multi: "[ Ver informe · {n} ▾ ]",
2865
+ room_view_report_title_multi: "{n} informes · haz clic para elegir",
2866
+ room_view_report_generating: "Generando informe…",
2867
+ room_view_report_generating_title: "El informe se está generando · el enlace se activará al terminar",
2868
+ room_generate_report: "Generar informe",
2869
+ room_generate_report_title: "Presentar un informe de esta sesión",
2870
+ room_chair_pick_title: "El presidente eligió a {name} para este turno",
2871
+ msg_chair_pick: "▸ presidente · {body}",
2872
+
2873
+ chat_banner: "sala abierta · {when} · {n} directores · {mode}",
2874
+
2875
+ round_end_vote_above: "Ronda cerrada · voto arriba",
2876
+ round_clarifying: "Aclarando — espera al presidente",
2877
+ round_end_open_vote: "Fin de ronda · abrir voto de puntos clave",
2878
+
2879
+ rp_spent_round: "ronda #{n}",
2880
+ rp_spent_label: "cerrada · la sala continuó",
2881
+ rp_chair_recommends: "el presidente recomienda",
2882
+ rp_continue_next: "Continuar · siguiente ronda",
2883
+ rp_adjourn_room_file: "⊘ Terminar la sala y presentar informe",
2884
+
2885
+ kp_eyebrow_drafting: "▸ puntos clave · redactando",
2886
+ kp_pending_drafting: "El presidente está redactando los puntos clave…",
2887
+ kp_eyebrow_degraded: "▸ puntos clave · no se pudieron extraer de esta ronda",
2888
+ kp_eyebrow_vote: "▸ puntos clave · vota lo que quieres seguir",
2889
+ kp_ctas_spent: "// continuado",
2890
+ kp_btn_continue_next: "[ ▶ Continuar · siguiente ronda ]",
2891
+ kp_btn_adjourn_brief: "[ ⊘ Terminar y presentar informe ]",
2892
+ kp_btn_adjourn: "[ ⊘ terminar ]",
2893
+ kp_shift_eyebrow_prefix: "▸ el presidente sugiere · cambiar tono a ",
2894
+ kp_switch_to: "[ ↻ cambiar a {mode} ]",
2895
+ kp_keep_mode: "[ mantener {mode} ]",
2896
+ kp_mode_current_fallback: "actual",
2897
+ kp_vote_more: "más",
2898
+ kp_vote_drop: "descartar",
2899
+ kp_vote_aria_up: "Me interesa",
2900
+ kp_vote_aria_down: "No me interesa",
2901
+
2902
+ agent_role_tag_moderator: "Moderador",
2903
+
2904
+ ap_track_record: "Trayectoria",
2905
+ ap_track_tag_model_usage: "modelo · uso",
2906
+ ap_voice_section: "Configuración de voz",
2907
+ ap_voice_section_tag: "tts · proveedor · voz",
2908
+ ap_skills: "Habilidades",
2909
+ ap_skills_installed: "{current} / {cap} instaladas",
2910
+ ap_skills_cap_reached: "límite alcanzado ({current}/{cap}) · desinstala para liberar",
2911
+ ap_skills_drop_hint: "instalar habilidad · suelta un archivo <code>.md</code> o haz clic",
2912
+ ap_skills_load_fail: "no se pudieron cargar las habilidades · {detail}",
2913
+ ap_stat_rooms: "salas",
2914
+ ap_stat_rounds: "rondas",
2915
+ ap_stat_tokens: "tokens",
2916
+ ap_intel: "Perfil",
2917
+ ap_instruction: "Instrucción",
2918
+ ap_rules: "Reglas",
2919
+ ap_memory: "Memoria",
2920
+ ap_edit: "editar",
2921
+ ap_cancel: "cancelar",
2922
+ ap_save: "guardar",
2923
+
2924
+ ap_build_log: "Bitácora de creación",
2925
+ ap_build_log_kicker: "— CÓMO SE CONSTRUYÓ",
2926
+ ap_build_log_open: "¿Cómo se construyó este agente?",
2927
+ ap_build_log_open_cta: "▸ ABRIR BITÁCORA",
2928
+ ap_build_log_teaser_fallback: "Este agente se montó en siete fases — incluyendo un barrido de la web desde varios ángulos para fundamentar la persona.",
2929
+ ap_build_log_no_narrative: "Esta vez no escribimos un resumen, pero aquí tienes la línea de tiempo.",
2930
+ ap_build_phase_1: "Primer boceto",
2931
+ ap_build_phase_2: "Investigar el terreno",
2932
+ ap_build_phase_3: "Borrador afinado",
2933
+ ap_build_phase_4: "Reglas de conducta",
2934
+ ap_build_phase_5: "Ejemplos trabajados",
2935
+ ap_build_phase_6: "Preguntas de autocomprobación",
2936
+ ap_build_phase_7: "Pruebas y singularidad",
2937
+ ap_build_phase_1_blurb: "Primero esbozamos en frío el linaje, las ideas distintivas y los puntos débiles de esta persona, sin haber leído nada todavía.",
2938
+ ap_build_phase_2_blurb: "Elegimos varios ángulos y rastreamos la web abierta para cada uno; luego rellenamos los huecos con búsquedas extra.",
2939
+ ap_build_phase_3_blurb: "Con la investigación en la mano reescribimos la persona desde cero — misma forma, más detalle.",
2940
+ ap_build_phase_4_blurb: "Destilamos las reglas: lo que este director siempre hace, lo que nunca hace y lo que hace condicionalmente.",
2941
+ ap_build_phase_5_blurb: "Escribimos varios ejemplos trabajados que muestran cómo responde realmente esta persona.",
2942
+ ap_build_phase_6_blurb: "Redactamos la lista silenciosa de comprobaciones que el director hace antes de hablar.",
2943
+ ap_build_phase_7_blurb: "Pasamos preguntas de prueba en paralelo contra una IA genérica para medir cuán distinta suena esta voz.",
2944
+ ap_build_dimensions_label: "Ángulos investigados",
2945
+ ap_build_topup_label: "Búsquedas extra",
2946
+ ap_build_divergence_label: "Singularidad de la voz",
2947
+ ap_build_tokens_label: "Tokens usados",
2948
+ ap_build_duration_label: "Tiempo invertido",
2949
+ ap_build_sources_short: "{n} fuentes leídas",
2950
+ ap_build_searches_short: "{n} búsquedas",
2951
+ ap_build_close: "Cerrar bitácora",
2952
+ ap_rules_add: "+ agregar regla",
2953
+ ap_rules_max: "máx {n}",
2954
+ ap_rules_empty_list: "aún no hay reglas · usa el botón + agregar regla de arriba",
2955
+ ap_memory_add: "+ agregar nota",
2956
+ ap_dream_consolidate_btn: "☾ ejecutar consolidación",
2957
+ ap_dream_consolidate_title: "Consolidar · descarta notas obsoletas, mantiene patrones estables",
2958
+ ap_show_more: "ver más",
2959
+ ap_show_less: "ver menos",
2960
+ ap_intel_empty: "aún no hay descripción · pulsa editar para añadir una",
2961
+ ap_instr_empty: "aún no hay instrucción · pulsa editar para escribir en markdown",
2962
+ ap_instr_placeholder_editor: "Usa markdown · ### encabezados · **negrita** · *cursiva* · - listas · `code`",
2963
+ ap_instr_edit_hint: "markdown soportado · esc para cancelar",
2964
+ ap_intel_placeholder: "Una frase sobre cómo piensa este director · {min}–{max} caracteres",
2965
+ ap_intel_hint: "{min}–{max} caracteres · esc para cancelar",
2966
+ ap_status_intern: "INTERINO · PRUEBA",
2967
+ ap_status_active: "ACTIVO",
2968
+ ap_role_director_upper: "DIRECTOR",
2969
+ ap_aria_id_menu: "más",
2970
+ ap_live_agent_director: "Director",
2971
+
2972
+ ap_voice_browser_default: "Predeterminado del navegador",
2973
+ ap_voice_engine_browser: "TTS del navegador",
2974
+ ap_voice_speed: "Velocidad",
2975
+ ap_voice_pitch: "Tono",
2976
+ ap_voice_emotion_label: "Emoción",
2977
+ ap_voice_emotion_hint: "Define el tono emocional de la voz sintetizada — auto deja que el modelo elija.",
2978
+ ap_voice_advanced: "ajuste avanzado",
2979
+ ap_voice_locked_tag: "// bloqueado",
2980
+ ap_voice_locked_title: "Configura un proveedor de voz para que este director hable con su propio registro.",
2981
+ ap_voice_locked_body: "Configura un proveedor de voz para desbloquear TTS — tu director podrá hablar en su propio registro, con tono, velocidad y emoción ajustables.",
2982
+ ap_voice_locked_cta: "Desbloquear voz",
2983
+ ap_voice_locked_providers: "soporta <b>MiniMax</b> · <b>ElevenLabs</b>",
2984
+ ap_voice_modify_pitch: "ajuste de tono",
2985
+ ap_voice_modify_intensity: "ajuste de intensidad",
2986
+ ap_voice_modify_timbre: "ajuste de timbre",
2987
+ ap_voice_preview_btn_title: "Vista previa",
2988
+ ap_voice_no_provider: "No hay proveedor de voz configurado.",
2989
+ ap_voice_loading: "cargando voces…",
2990
+ ap_voice_fallback_voice: "voz",
2991
+ ap_voice_save_err: "No se pudo guardar la voz: {msg}",
2992
+ ap_voice_preview_need_voice: "Selecciona primero una voz.",
2993
+ ap_voice_preview_failed: "Vista previa falló: {msg}",
2994
+ ap_voice_preview_playback_blocked: "Reproducción bloqueada: {msg}",
2995
+ ap_voice_preview_err: "Error en vista previa: {msg}",
2996
+ ap_voice_emotion_auto: "Auto",
2997
+ ap_voice_emotion_happy: "feliz",
2998
+ ap_voice_emotion_sad: "triste",
2999
+ ap_voice_emotion_angry: "enojado",
3000
+ ap_voice_emotion_fearful: "temeroso",
3001
+ ap_voice_emotion_disgusted: "asqueado",
3002
+ ap_voice_emotion_surprised: "sorprendido",
3003
+ ap_voice_emotion_calm: "calmado",
3004
+ ap_voice_emotion_fluent: "fluido",
3005
+
3006
+ ap_model_stale_title: "Este modelo no es alcanzable con tus claves API actuales. Las llamadas en tiempo de ejecución vuelven al predeterminado global.",
3007
+ ap_model_stale_text: "no alcanzable · vuelve al predeterminado",
3008
+
3009
+ ao_personnel_kicker: "agente · ficha de personal",
3010
+ ao_classified_mark: "// clasificado",
3011
+ ao_lens: "Lente",
3012
+ ao_model: "Modelo",
3013
+ ao_style: "Estilo",
3014
+ ao_memory_room: "Memoria en sala",
3015
+ ao_badge_this_room: "esta sala",
3016
+ ao_badge_classified: "⊘ clasificado",
3017
+ ao_lock_blurb_html: 'las notas en sala son privadas para cada pensador. <a href="/" class="lock-link">inicia sesión →</a> para ver lo que dijeron y dónde cambió su postura.',
3018
+ ao_tenure_meta: "antigüedad ·",
3019
+ ao_first_room_meta: "primera sala ·",
3020
+ ao_free: "libre",
3021
+ ao_convene_cta: "[ ◆ Convocar con ellos ]",
3022
+ ao_signin_cta: "[ → Inicia sesión para convocar ]",
3023
+ ao_room_notes_empty: "ninguna sala en vivo. abre una sala para ver las notas de este director.",
3024
+ ao_room_notes_waiting: "aún no hay turnos — cuando hablen, las afirmaciones y los cambios de postura aparecerán aquí.",
3025
+
3026
+ convene_show_more: "Ver más ↓",
3027
+ convene_show_less: "Ver menos ↑",
3028
+ convene_eyebrow: "▸ Convocar · Pregunta inicial",
3029
+ convene_meta_to: "para",
3030
+
3031
+ msg_model_title: "modelo · {label}",
3032
+ msg_skills_used: "habilidades usadas: {list}",
3033
+ msg_ws_title: "búsqueda web: {query} · {n} fuentes",
3034
+ msg_ws_btn: "búsqueda web · {n} fuentes",
3035
+ msg_ws_btn_one: "búsqueda web · 1 fuente",
3036
+ msg_ws_searching: "buscando…",
3037
+ msg_ws_done: "{n} fuentes{tail}",
3038
+ msg_ws_done_one: "1 fuente{tail}",
3039
+ msg_ws_failed: "falló",
3040
+ msg_ws_failed_elapsed: "falló · {elapsed}",
3041
+ msg_ws_banner: "// búsqueda web",
3042
+ msg_ws_toggle: "Mostrar/ocultar fuentes",
3043
+ msg_ws_expand_show: "Mostrar las {n} fuentes",
3044
+ msg_ws_query_label: "consulta",
3045
+ msg_ws_expand_hide: "Plegar",
3046
+ msg_ws_secs: "{n}s",
3047
+ msg_chair_direct_kicker: "▸ presidente · respondiéndote",
3048
+ msg_chair_intervention_kicker: "▸ nota del presidente",
3049
+ msg_chair_billing_kicker: "▸ facturación · atención requerida",
3050
+ msg_chair_display_fallback: "Presidente",
3051
+ msg_ctx_title: "{n} turnos previos enviados como contexto a {name}",
3052
+ msg_ctx_inline: "· {n} ctx",
3053
+ msg_tag_you: "// tú",
3054
+ msg_tag_chair: "// presidente",
3055
+
3056
+ sa_head: "// analítica de sesión",
3057
+ sa_stamp: "cerrada",
3058
+ session_end_marker: "sesión finalizada",
3059
+ sa_tokens: "tokens",
3060
+ sa_messages: "msgs",
3061
+ sa_rounds: "rondas",
3062
+ sa_minutes: "min",
3063
+ sa_model_head: "Uso de modelos",
3064
+ sa_value_head: "Lo que valoraste",
3065
+ sa_value_empty: "Sin ▲ votos de puntos clave, sondeos o respaldos en esta sesión.",
3066
+ sa_voted: "▲ votado",
3067
+ sa_seconded: "★ respaldado",
3068
+ sa_probed: "✎ sondeado",
3069
+ sa_seg_title: "{model} · {tokens} tokens",
3070
+
3071
+ nk_title: "Configura una clave API de modelo",
3072
+ nk_deck: "El presidente y los directores funcionan con un modelo de lenguaje grande. Configura al menos una clave de proveedor (Anthropic / OpenAI / Google / xAI / DeepSeek / OpenRouter) antes de usar funciones de IA.",
3073
+ nk_primary: "[ Abrir ajustes ▸ ]",
3074
+ nk_dismiss: "[ Descartar ]",
3075
+ nk_classification: "ia · sin clave de modelo",
3076
+ nk_tag: "▸ Configurar clave API",
3077
+ nk_primary_deck: "Ve a Preferencias → API Key. Pega cualquier clave de proveedor para desbloquear la sala.",
3078
+ nk_frontend_gate: "// puerta frontend",
3079
+
3080
+ sc_send_class: "enviar · elige",
3081
+ sc_send_right: "// {name} está hablando",
3082
+ sc_send_tag: "▸ Enviar durante el turno",
3083
+ sc_send_title: "{name} está a mitad de su turno.",
3084
+ sc_send_deck: "¿Interrumpir ahora o poner en cola hasta que termine?",
3085
+ sc_interrupt_mark: "▸ Interrumpir y enviar ya",
3086
+ sc_interrupt_deck: "Entra de inmediato. {name} sigue por encima de tu mensaje.",
3087
+ sc_queue_mark: "→ Esperar a que termine {name}",
3088
+ sc_queue_deck: "Tu mensaje se pone tras el turno actual y se publica cuando termine.",
3089
+ sc_cancel_mark: "✕ Cancelar",
3090
+ sc_cancel_deck: "Sigue escribiendo y decide luego.",
3091
+ sc_speaker_fallback: "un director",
3092
+
3093
+ pause_class: "pausar · elige",
3094
+ pause_right: "// la sala está a mitad de turno",
3095
+ pause_tag: "▸ Pausar la discusión",
3096
+ pause_title: "{name} está hablando ahora.",
3097
+ pause_deck: "¿Cómo prefieres pausar?",
3098
+ pause_hard_mark: "▍ Detener inmediatamente",
3099
+ pause_hard_deck: "Corta su respuesta a mitad de frase. La respuesta parcial se descarta.",
3100
+ pause_soft_mark: "⌛ Cuando termine",
3101
+ pause_soft_deck: "Deja que {name} complete este turno, luego pausa la cola.",
3102
+ pause_cancel_mark: "↩ Cancelar",
3103
+ pause_cancel_deck: "Mantén la discusión en curso.",
3104
+ reload_class: "recargar · elige",
3105
+ reload_right: "// la sala está a mitad de turno",
3106
+ reload_tag: "▸ Recargar la página",
3107
+ reload_title: "{name} está hablando ahora.",
3108
+ reload_deck: "¿Cómo prefieres manejar al orador actual antes de recargar?",
3109
+ reload_hard_mark: "▍ Interrumpir y recargar",
3110
+ reload_hard_deck: "Corta su respuesta a mitad de frase y luego recarga. La respuesta parcial se descarta.",
3111
+ reload_soft_mark: "⌛ Recargar cuando termine",
3112
+ reload_soft_deck: "Deja que {name} complete este turno, luego recarga la página automáticamente.",
3113
+ reload_cancel_mark: "↩ Cancelar",
3114
+ reload_cancel_deck: "Mantente en la página · la discusión continúa.",
3115
+ resume_class: "reanudar · elige",
3116
+ resume_right: "// falta clave de voz",
3117
+ resume_tag: "▸ El modo voz requiere una clave",
3118
+ resume_deck: "Esta sala está en modo voz pero no hay clave de proveedor de voz configurada. Elige cómo reanudar:",
3119
+ resume_configure_mark: "⚙ Configurar clave de voz",
3120
+ resume_configure_deck: "Abre Ajustes → API Keys. Reanuda cuando la clave esté lista.",
3121
+ resume_text_mark: "▸ Continuar como sala de texto",
3122
+ resume_text_deck: "Cambia esta sala a modo texto y reanuda ahora. Los directores hablan en burbujas de texto, sin audio.",
3123
+ resume_cancel_mark: "↩ Cancelar",
3124
+ resume_cancel_deck: "Sigue en pausa. Decide después.",
3125
+ room_delivery_switch_err: "No se pudo cambiar el modo: {msg}",
3126
+
3127
+
3128
+ cmp_tone_label: "Tono",
3129
+ cmp_intensity_label: "Intensidad",
3130
+ cmp_voice_tooltip: "Activar reunión por voz",
3131
+ cmp_voice_label: "Voice Mode",
3132
+ cmp_recs_trigger_label: "Encuentra temas que te puedan interesar",
3133
+ cmp_recs_trigger_tag: "discover",
3134
+ cmp_recs_trigger_starting: "iniciando…",
3135
+
3136
+ vonb_tag: "▸ MODO VOZ",
3137
+ vonb_classification_left: "modo voz · onboarding",
3138
+ vonb_classification_right: "// vista previa",
3139
+ vonb_meta_label: "// promo",
3140
+ vonb_meta_live: "vista previa en vivo",
3141
+ vonb_title: "Escucha a tu consejo.",
3142
+ vonb_deck: "Los directores hablan en voz alta alrededor de la mesa. Configura una clave de API de modelo de voz y convoca una sesión en vivo.",
3143
+ vonb_cta: "Configurar claves de voz",
3144
+ vonb_theme_eastwood_name: "BRAINSTORM",
3145
+ vonb_theme_eastwood_deck: "tierra + hierba · abierto",
3146
+ vonb_theme_regent_name: "CONSTRUCTIVO",
3147
+ vonb_theme_regent_deck: "mármol grafito · ejecutivo",
3148
+ vonb_theme_atrium_name: "INVESTIGACIÓN",
3149
+ vonb_theme_atrium_deck: "mármol claro · académico",
3150
+ vonb_theme_nintendo_name: "CRÍTICA",
3151
+ vonb_theme_nintendo_deck: "alfombra burdeos · formal",
3152
+
3153
+ onb_v2_classification_left: "primera vez · bienvenida",
3154
+ onb_v2_classification_right: "// local · ~60 segundos",
3155
+ onb_v2_back: "[ ◂ Atrás ]",
3156
+ onb_v2_next: "[ Siguiente ▸ ]",
3157
+ onb_v2_continue: "[ Continuar ▸ ]",
3158
+ onb_v2_ready: "[ Estoy listo ▸ ]",
3159
+ onb_v2_enter: "[ Entrar ▸ ]",
3160
+ onb_v2_name_kicker: "00 — Toma asiento",
3161
+ onb_v2_name_title: "¿Cómo debería llamarte la sala?",
3162
+ onb_v2_name_sub: "A partir de ahora, esta es tu sala.",
3163
+ onb_v2_name_placeholder: "p. ej. Kay",
3164
+ onb_v2_what_kicker: "01 — Una reunión, no un chatbot",
3165
+ onb_v2_what_title: "Convocas a un grupo de asesores tercos y los dejas discutir, ante ti, una pregunta que importa.",
3166
+ onb_v2_what_body: "Tres actos · convene · sharpen · adjourn. Tú presides; los directores toman posición; al cerrar, te llevas un brief.",
3167
+ onb_v2_what_note: "No es un chatbot. Los directores no te darán la razón: presionarán la pregunta hasta afinarla.",
3168
+ onb_v2_key_kicker: "02 — Entrega una llave",
3169
+ onb_v2_key_title: "Elige un cerebro — o elige varios.",
3170
+ onb_v2_key_body: "Tu key se queda en esta máquina. Nunca la subimos.",
3171
+ onb_v2_key_recommend_badge: "// recomendado",
3172
+ onb_v2_key_recommend_name: "OpenRouter · una key, todos los modelos",
3173
+ onb_v2_key_recommend_body: "Cada director puede correr en un modelo distinto — Claude como escéptico, GPT como cazador de patrones, Gemini como estratega de largo plazo. El chair enruta cada turno al cerebro adecuado.",
3174
+ onb_v2_key_or: "o — un proveedor directo",
3175
+ onb_v2_key_or_body: "Mismo modelo para todos los directores. Las personas siguen siendo distintas, pero comparten un solo cerebro.",
3176
+ onb_v2_voice_kicker: "03 — Dales una voz · opcional",
3177
+ onb_v2_voice_title: "¿Quieres que hablen en voz alta?",
3178
+ onb_v2_voice_body: "Añade una key de TTS y la sala se vuelve una mesa redonda: los directores toman asiento, levantan la cabeza al hablar y se acomodan al escuchar.",
3179
+ onb_v2_voice_pitch: "Se siente como un juego de estrategia pausado — observas a tu mesa pensar, debatir y desafiarse en voces reales. Cada director recibe una voz distinta al configurar la primera key. Salta si prefieres texto; lo activas cuando quieras desde Settings.",
3180
+ onb_v2_voice_skip: "[ Saltar por ahora ]",
3181
+ onb_v2_voice_skip_cta: "[ Saltar → ]",
3182
+ onb_v2_cast_kicker: "04 — Tu directorio",
3183
+ onb_v2_cast_title: "El chair conduce la sala. Los directores disienten. El brief cierra el ciclo.",
3184
+ onb_v2_cast_body: "Por defecto, el chair elige tres directores; también puedes elegirlos tú. Esa decisión —y tu pregunta— ocurre a continuación en el composer.",
3185
+ onb_v2_cast_lineup: "// solo vista previa · eliges luego en el composer",
3186
+ onb_v2_cast_next_kicker: "// siguiente · en el composer",
3187
+ onb_v2_cast_next_step_1: "Escribe tu pregunta",
3188
+ onb_v2_cast_next_step_2: "El chair elige 3 directores",
3189
+ onb_v2_cast_next_step_3: "Pulsa Convene",
3190
+ onb_v2_hint_kicker: "// tu asiento",
3191
+ onb_v2_hint_body: "Escribe la pregunta que llevas días dándole vueltas — y pulsa Convene.",
3192
+ onb_v2_hint_dismiss: "Entendido",
3193
+
3194
+ rt_speaking: "Hablando",
3195
+ rt_thinking: "Pensando",
3196
+ rt_user_title: "Presidente",
3197
+ rt_toggle_transcript: "Transcripción",
3198
+ rt_toggle_roundtable: "Mesa redonda",
3199
+ rt_toggle_enable_voice: "Modo voz",
3200
+ rt_aria_stage: "Mesa redonda de oradores",
3201
+ rt_aria_speaking: "hablando ahora: {name}",
3202
+ rt_aria_queue: "siguen: {names}",
3203
+ rt_aria_idle: "nadie habla",
3204
+
3205
+ conv_stage_analyzing_title: "Analizando tema",
3206
+ conv_stage_analyzing_deck: "Enrutando tu tema a las perspectivas adecuadas",
3207
+ conv_stage_seating_title: "Sentando directores",
3208
+ conv_stage_seating_deck: "Eligiendo las perspectivas adecuadas para esta pregunta",
3209
+ conv_stage_preparing_title: "Presidente preparando intervención",
3210
+ conv_stage_preparing_deck: "Redactando el discurso de apertura",
3211
+ conv_seated_label: "sentados",
3212
+ conv_banner_convening: "▸ CONVOCANDO",
3213
+
3214
+ chair_pend_banner: "▸ presidente",
3215
+ chair_pend_clarify: "{name} está leyendo tu pregunta…",
3216
+ chair_pend_chair_direct: "{name} está preparando una respuesta…",
3217
+ chair_pend_round_end: "{name} está cerrando esta ronda…",
3218
+ chair_pend_convening: "{name} está convocando la sala…",
3219
+ chair_pend_next_speaker: "{name} está leyendo la sala…",
3220
+ chair_pend_default: "{name} está preparando…",
3221
+
3222
+ brief_regen_timeout: "regeneración agotada",
3223
+ brief_regen_interrupted: "regeneración interrumpida",
3224
+ brief_regen_failed: "regeneración falló",
3225
+ brief_retry: "Reintentar",
3226
+ brief_dismiss: "Descartar",
3227
+
3228
+ brief_tab_initial: "Inicial",
3229
+ brief_tab_tooltip_initial: "Informe inicial · generado de la sesión",
3230
+ brief_tab_supplement_prefix: "Suplemento: ",
3231
+ brief_tab_delete_title: "Eliminar este informe",
3232
+
3233
+ brief_err_stamp_timeout: "tiempo agotado",
3234
+ brief_err_kicker_timeout: "// generación agotada",
3235
+ brief_err_detail_timeout: "Sin señal de finalización tras 8 minutos — el modelo puede estar lento, la conexión cayó o la cadena se estancó. Haz clic abajo para empezar de nuevo.",
3236
+ brief_err_stamp_interrupted: "interrumpida",
3237
+ brief_err_kicker_interrupted: "// generación interrumpida",
3238
+ brief_err_detail_interrupted: "La generación anterior se cortó — probablemente por un refresco del navegador o reinicio del servidor. Haz clic abajo para empezar un nuevo informe.",
3239
+ brief_err_cta_regenerate: "Regenerar informe",
3240
+ brief_err_stamp_failed: "falló",
3241
+ brief_err_kicker_failed: "// generación de informe falló",
3242
+ brief_err_hint_failed_html: "El redactor de informes necesita una clave LLM (OpenRouter, o una directa de Anthropic / OpenAI / Google / xAI). Añade una en <strong>Preferencias → API Key</strong> e inténtalo de nuevo.",
3243
+ brief_err_hint_scaffold_html: 'El modelo del presidente debe emitir JSON válido para el paso interno de <strong>scaffold</strong> antes del cuerpo final. Causas típicas: poca señal útil en el hilo, salida truncada o malformada, límites de tasa upstream, o facturación — <strong>no necesariamente</strong> falta una clave si ya aparecen configuradas. Prueba <strong>Regenerar</strong>, acorta la transcripción, cambia el presidente a otro modelo alcanzable, o busca <code>[brief.stage2]</code> en el stderr del servidor.',
3244
+ brief_err_hint_generic_html: 'Usa la línea roja en inglés de arriba como pista principal. Si menciona claves, facturación o <code>401</code>/<code>403</code>, revisa <strong>Preferencias → API Key</strong> y cuotas; si no, inspecciona los logs del servidor.',
3245
+
3246
+ brief_output_head: "▼ salida de sesión ▼",
3247
+ brief_report_tag: "// informe",
3248
+ brief_filed_generating: "GENERANDO…",
3249
+ brief_filed_stamp: "PRESENTADO · {when}",
3250
+ brief_filed_by: "// presentado por {name}",
3251
+ brief_untitled: "(sin título)",
3252
+ brief_meta_authors: "{n} autores",
3253
+ brief_open_report: "abrir informe",
3254
+ brief_chair_fallback: "el presidente",
3255
+
3256
+ brief_hard_timeout_msg: "Generación de informe agotada (sin completar tras 8 minutos).",
3257
+ brief_stage_kicker: "// {chair} está preparando las actas · {total}",
3258
+ brief_stage_extract_label: "Leyendo lo que dijo cada director",
3259
+ brief_stage_extract_pip: "leer",
3260
+ brief_stage_compose_label: "Eligiendo la forma del informe",
3261
+ brief_stage_compose_pip: "elegir",
3262
+ brief_stage_scaffold_anchor_label: "Fijando el ancla",
3263
+ brief_stage_scaffold_anchor_pip: "ancla",
3264
+ brief_stage_scaffold_findings_label: "Esbozando hallazgos",
3265
+ brief_stage_scaffold_findings_pip: "hallazgo",
3266
+ brief_stage_scaffold_cluster_label: "Mapeando consenso y disenso",
3267
+ brief_stage_scaffold_cluster_pip: "split",
3268
+ brief_stage_scaffold_actions_label: "Redactando acciones y riesgos",
3269
+ brief_stage_scaffold_actions_pip: "act",
3270
+ brief_stage_write_label: "Escribiendo el informe",
3271
+ brief_stage_write_pip: "write",
3272
+
3273
+ brief_prog_directors_one: "{cur}/{tot} director",
3274
+ brief_prog_directors: "{cur}/{tot} directores",
3275
+ brief_prog_words_one: "1 palabra",
3276
+ brief_prog_words: "{n} palabras",
3277
+ brief_timing_inband: "{e}s · ~{lo}–{hi}s",
3278
+ brief_timing_eta: "~{lo}–{hi}s",
3279
+ brief_timing_over: "{n}s transcurridos",
3280
+ brief_range_sec: "~{lo}–{hi}s",
3281
+ brief_range_min: "~{lo}-{hi}m",
3282
+ brief_total_line: "{elapsed} transcurridos · quedan {range}",
3283
+ brief_fmt_sec: "{n}s",
3284
+ brief_fmt_min: "{n}m",
3285
+ brief_fmt_min_sec: "{m}m {r}s",
3286
+ brief_stat_writing: "{n} palabras · todavía escribiendo",
3287
+ brief_supplement_btn: "Añadir perspectiva · regenerar",
3288
+ brief_delete_label: "Eliminar informe",
3289
+ ending_session_foot: "// fin de sesión",
3290
+ brief_llm_hide_stream: "Ocultar flujo del modelo",
3291
+ brief_llm_view_stream: "Ver flujo del modelo",
3292
+ brief_llm_waiting_first: "esperando primera llamada",
3293
+ brief_llm_waiting_output: "esperando salida…",
3294
+ delivery_text_hint: "reunión escrita rápida",
3295
+ delivery_voice_hint: "hablada · turnos pausados",
3296
+ share_distilled_by: "destilado de {author}",
3297
+ brief_wc_approx_chars: "~{n} caracteres",
3298
+ brief_wc_one_word: "1 palabra",
3299
+ brief_wc_words: "{n} palabras",
3300
+
3301
+ greet_0: "// Trasnochando, {name}",
3302
+ greet_1: "// Buenos días, {name}",
3303
+ greet_2: "// Buenas tardes, {name}",
3304
+ greet_3: "// Buenas noches, {name}",
3305
+ greet_en_0: "// Up late, {name}",
3306
+ greet_en_1: "// Good morning, {name}",
3307
+ greet_en_2: "// Good afternoon, {name}",
3308
+ greet_en_3: "// Good evening, {name}",
3309
+ greet_zh_0: "// Trasnochando, {name}",
3310
+ greet_zh_1: "// Buenos días, {name}",
3311
+ greet_zh_2: "// Buen mediodía, {name}",
3312
+ greet_zh_3: "// Buenas tardes, {name}",
3313
+ greet_zh_4: "// Buenas noches, {name}",
3314
+ greet_zh_5: "// Es tarde, {name}",
3315
+
3316
+ brief_generating_title: "Generando…",
3317
+
3318
+ q_idle: "cola en reposo",
3319
+ q_speaking: "●●● hablando",
3320
+ q_pending_vote: "pendiente · espera voto",
3321
+ q_pending_chair: "pendiente · espera presidente",
3322
+ q_queued: "en cola",
3323
+ q_more_queued: "+{n} en cola",
3324
+ q_user_queued: 'en cola · "{preview}"',
3325
+ q_cancel: "Cancelar",
3326
+ q_state_speaking: "hablando · leyendo {n} turno(s)",
3327
+ q_pending_your_vote: "pendiente · espera tu voto",
3328
+ q_pending_waits_chair: "pendiente · espera al presidente",
3329
+
3330
+ sidebar_live: "En vivo",
3331
+ sidebar_paused: "pausada",
3332
+ sidebar_section_live: "En vivo",
3333
+ sidebar_section_paused: "Pausadas",
3334
+ sidebar_section_adjourned: "Terminadas",
3335
+ sidebar_no_adjourned_title: "no hay salas terminadas",
3336
+ sidebar_no_adjourned_deck: "concluye una discusión para archivarla aquí.",
3337
+ sidebar_delete_room: "Eliminar sala",
3338
+ sidebar_pin: "Anclar",
3339
+ sidebar_unpin: "Desanclar",
3340
+ sidebar_role_director: "director",
3341
+ sidebar_status_active: "activo",
3342
+ sidebar_chair_badge: "PRESIDENTE",
3343
+ sidebar_chair_badge_title: "Moderador · agente estructural, no gestionado por el usuario",
3344
+ sidebar_chair_role_fallback: "Moderador",
3345
+ sidebar_chair_note: "en cada sala",
3346
+ sidebar_sec_chair: "Presidente",
3347
+ sidebar_sec_pinned: "Anclados",
3348
+ sidebar_sec_custom: "Personalizados",
3349
+ sidebar_sec_core: "Núcleo",
3350
+
3351
+ note_saved: "Guardado en Notas",
3352
+
3353
+ col_resize: "arrastra para redimensionar",
3354
+ settings_title: "Ajustes",
3355
+
3356
+ us_nav_user: "Usuario",
3357
+ us_nav_theme: "Tema",
3358
+ us_nav_usage: "Uso",
3359
+ us_nav_keys: "Claves API",
3360
+ us_nav_default: "Modelo predeterminado",
3361
+ us_user_tag: "▸ Usuario",
3362
+ us_user_deck: "cómo te llama la sala y qué sabe sobre tu contexto.",
3363
+ us_avatar: "Avatar",
3364
+ us_regen_avatar: "generar avatar 8-bit",
3365
+ us_name: "Nombre",
3366
+ us_about: "Sobre ti",
3367
+ us_intro_ph: "Una línea o dos sobre tu rol, en qué piensas, en qué trabajas. Los directores lo tendrán presente en todas las salas.",
3368
+ us_intro_meta: "{n} / 320 caracteres",
3369
+ us_intro_meta_rest: "/ 320 caracteres",
3370
+ us_theme_tag: "▸ Tema",
3371
+ us_theme_deck: "global · paletas inspiradas en zsh. Se aplica al instante en todas las salas.",
3372
+ us_usage_tag: "▸ Uso",
3373
+ us_usage_deck: "contabilidad acumulada de llamadas LLM · facturado en cada turno de director / presidente desde que abriste esta sala.",
3374
+ us_usage_loading: "midiendo…",
3375
+ us_usage_empty: "aún no hay llamadas LLM facturadas · abre una sala y deja hablar a los directores.",
3376
+ us_usage_agents: "{n} agente(s)",
3377
+ us_usage_silent: "+ {n} agente(s) aún sin facturar",
3378
+ us_keys_tag: "▸ Clave API",
3379
+ us_keys_add_label: "+ añadir proveedor:",
3380
+ us_keys_group_skill: "Servicios de habilidad",
3381
+ us_keys_skill_deck: "habilita habilidades de sistema que necesitan un servicio externo. Cada agente puede optar in/out en su perfil.",
3382
+ us_ws_backend_tag: "MOTOR DE BÚSQUEDA WEB",
3383
+ us_ws_backend_deck: "Las claves de Brave Search y Tavily están configuradas. Elige cuál respalda la habilidad de Búsqueda Web.",
3384
+ us_ws_backend_brave: "Brave Search",
3385
+ us_ws_backend_tavily: "Tavily Search",
3386
+ us_pref_title: "Preferencia",
3387
+ us_modal_kicker_left: "usuario · ajustes",
3388
+ us_modal_kicker_right: "// local",
3389
+ us_close: "Cerrar",
3390
+ us_nav_api_key: "Clave API",
3391
+ us_nav_other_settings: "Otros ajustes",
3392
+ us_locale_label: "Idioma de interfaz",
3393
+ us_locale_deck: "Las etiquetas de la barra lateral, los diálogos y la interfaz siguen este idioma. Los mensajes de sala y los informes mantienen el idioma en que escribes.",
3394
+ us_replay_onb_label: "Repetir onboarding",
3395
+ us_replay_onb_btn: "Acompáñame de nuevo",
3396
+ us_replay_onb_deck: "Vuelve a recorrer los cuatro pasos de bienvenida. Tu nombre, tema y claves API se mantienen.",
3397
+ us_default_model_title: "Modelo predeterminado",
3398
+ us_default_deck_long: "los nuevos agentes lo heredan. cuando el modelo guardado de un agente queda inalcanzable (clave eliminada / modelo retirado), también vuelve aquí. el nivel flagship lo usa como modelo de escritura profunda.",
3399
+ us_keys_deck: "Pega las claves una vez — la sala las guarda localmente y nunca nos las envía. Las claves alimentan los turnos de directores, no la telemetría.",
3400
+ us_default_tag: "▸ Modelo predeterminado",
3401
+ us_default_deck: "Recurso cuando un director no tiene anulación por agente. Solo modelos alcanzables.",
3402
+ us_foot_saved: "los cambios se guardan automáticamente",
3403
+ us_foot_website: "sitio web ↗",
3404
+ us_done: "[ Listo ]",
3405
+ us_usage_chair: "presidente",
3406
+ us_usage_director: "director",
3407
+
3408
+ onb_next: "[ Siguiente ▸ ]",
3409
+ onb_skip: "[ Exploraré por mi cuenta ]",
3410
+ onb_name_ph: "ej. Kay",
3411
+ onb_key_field: "Clave API {label}",
3412
+ onb_generate_at: "Genera en {host} →",
3413
+ onb_show: "mostrar",
3414
+ onb_hide: "ocultar",
3415
+ },
1554
3416
  };
1555
3417
 
1556
3418
  function detectLocale() {
1557
3419
  const nav = (root.navigator && root.navigator.language) || "";
1558
3420
  const l = nav.toLowerCase();
1559
3421
  if (l.startsWith("zh")) return "zh";
3422
+ if (l.startsWith("ja")) return "ja";
3423
+ if (l.startsWith("es")) return "es";
1560
3424
  return "en";
1561
3425
  }
1562
3426
 
1563
3427
  function getLocale() {
1564
3428
  try {
1565
3429
  const s = root.localStorage.getItem(STORAGE_KEY);
1566
- if (s === "en" || s === "zh") return s;
3430
+ if (isLocale(s)) return s;
1567
3431
  } catch (_) { /* */ }
1568
3432
  return detectLocale();
1569
3433
  }
1570
3434
 
3435
+ /** `<html lang>` ISO codes per locale · drives some UA-side
3436
+ * defaults (text rendering, system spell-check, voice
3437
+ * fallbacks). zh → zh-CN since the translations are simplified. */
3438
+ const HTML_LANG = { en: "en", zh: "zh-CN", ja: "ja", es: "es" };
3439
+
1571
3440
  function setLocale(loc) {
1572
- if (loc !== "en" && loc !== "zh") return;
3441
+ if (!isLocale(loc)) return;
1573
3442
  try {
1574
3443
  root.localStorage.setItem(STORAGE_KEY, loc);
1575
3444
  } catch (_) { /* */ }
1576
- document.documentElement.lang = loc === "zh" ? "zh-CN" : "en";
3445
+ document.documentElement.lang = HTML_LANG[loc] || loc;
1577
3446
  applyDom(document);
1578
3447
  syncLocaleControls();
1579
3448
  document.dispatchEvent(new CustomEvent("boardroom:locale", { detail: { locale: loc } }));
@@ -1633,12 +3502,12 @@ When the room ___, raise an objection.`,
1633
3502
  if (!btn) return;
1634
3503
  e.preventDefault();
1635
3504
  const loc = btn.getAttribute("data-locale");
1636
- if (loc === "en" || loc === "zh") setLocale(loc);
3505
+ if (isLocale(loc)) setLocale(loc);
1637
3506
  }
1638
3507
 
1639
3508
  function init() {
1640
3509
  const loc = getLocale();
1641
- document.documentElement.lang = loc === "zh" ? "zh-CN" : "en";
3510
+ document.documentElement.lang = HTML_LANG[loc] || loc;
1642
3511
  document.addEventListener("click", onLocaleClick);
1643
3512
  applyDom(document);
1644
3513
  syncLocaleControls();
@@ -1650,5 +3519,5 @@ When the room ___, raise an objection.`,
1650
3519
  init();
1651
3520
  }
1652
3521
 
1653
- root.I18n = { t, getLocale, setLocale, applyDom, init, syncLocaleControls, STR };
3522
+ root.I18n = { t, getLocale, setLocale, applyDom, init, syncLocaleControls, STR, SUPPORTED_LOCALES };
1654
3523
  })(typeof window !== "undefined" ? window : globalThis);