-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstrings.py
More file actions
268 lines (226 loc) · 9.15 KB
/
Copy pathstrings.py
File metadata and controls
268 lines (226 loc) · 9.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# SPDX-License-Identifier: GPL-2.0-only
# Copyright (C) 2026 Cyber Defense Institute, Inc.
"""
strings.py -- SERINUS OT UI strings (ja / en)
Usage:
import strings
S = strings.get("en") # or "ja"
S["sc_guard_title"] # -> "Monitoring"
"""
_JA = {
# window
"window_title": "SERINUS OT — PC試作",
"frame_device": "■ 装置イメージ",
"frame_sim": "■ 操作シミュレーション・開発用(実機にはこの枠は無い)",
"frame_physical": "物理接続(ケーブルの抜き挿しを模擬)",
"frame_nic": "NIC選択",
# bottom buttons / labels
"lbl_power": "電源:",
"btn_power_on": "● ON (押すとOFF)",
"btn_power_off": "○ OFF (押すとON)",
"lbl_lan": "LAN:",
"btn_lan_on": "接続中 (押すと抜線)",
"btn_lan_off": "切断 (押すと接続)",
"lbl_usb": "保守USB:",
"btn_usb_on": "接続中 (押すと切断)",
"btn_usb_off": "切断 (押すと接続)",
"lbl_nic": "監視NIC:",
"nic_none": "(Npcap未検出: NICなし)",
# guide bar (left, center, right)
"guide_setup": ("──", "──", "学習開始"),
"guide_guard": ("履歴", "──", "メニュー"),
"guide_sleep": ("", "", ""),
"guide_history": ("▲", "▼", "メニュー/長押:切替"),
"guide_menu": ("▲", "▼", "決定"),
"guide_learn_confirm": ("戻る", "──", "長押:開始"),
"guide_learn": ("──", "──", "学習終了"),
"guide_volume": ("▲", "▼", "決定"),
"guide_alarm": ("【消音】", "【消音】", "【消音】"),
# menu items
"menu_items": ["履歴を見る", "一括登録(学習)モード", "音量設定", "戻る(監視)"],
# SC_SETUP
"sc_setup_title": "未セットアップ",
"sc_setup_msg1": "まず一括登録を",
"sc_setup_msg2": "開始してください",
# SC_GUARD
"sc_guard_title": "監視中",
"sc_guard_registered": "登録済み {} 件",
"sc_guard_pending": "要確認 {} 件",
"sc_guard_lan": "接続",
"sc_guard_lan_off": "切断",
"sc_guard_usb": "接続",
"sc_guard_usb_off": "切断",
"sc_guard_status": "LAN: {} USB: {}",
# SC_HISTORY
"sc_hist_title": "履歴一覧 {}/{}",
"sc_hist_empty_h": "履歴一覧",
"sc_hist_empty": "記録なし",
"st_pending": "要確認",
"st_registered": "登録済み",
"st_pending_hint": "長押し→登録済み",
"st_registered_hint": "長押し→要確認",
"lbl_vendor": "推定ベンダ {}",
"lbl_first": "初 {}",
"lbl_last": "終 {}",
"lbl_ip": "IP {}",
"ip_unknown": "不明",
"prev_boot": "前回起動時",
# SC_MENU
"sc_menu_title": "メニュー",
# SC_LEARN_CONFIRM
"sc_lc_title": "学習モード確認",
"sc_lc_msg1": "全データを消去して",
"sc_lc_msg2": "学習モードを開始します。",
"sc_lc_start": "Rボタン長押しで開始",
"sc_lc_back": "Lボタンで戻る",
# SC_LEARN
"sc_learn_title": "学習中...",
"sc_learn_count": "検知中: {} 台を登録",
"sc_learn_remain": "残り {:02d}:{:02d}",
"sc_learn_end": "Rボタン: 学習終了",
# SC_VOLUME
"sc_vol_title": "音量設定",
"volume_labels": ["大", "中", "小", "ミュート"],
# SC_ALARM
"sc_alarm_title": "【警告】未知MAC検知",
"sc_alarm_count": "未知端末 {} 台検知",
"sc_alarm_others": "(他 {} 件も要確認)",
# mute icon
"mute_icon": "×消音",
# dimension caption
"dim_caption": "約 65 mm (DRC7ケース)",
"dim_detail": "上面: RJ45 右側面: USB-C ボタン: 灰×2(左/中)・赤×1(右)",
}
_EN = {
# Window
"window_title": "SERINUS OT — PC Prototype",
"frame_device": "■ Device Image",
"frame_sim": "■ Simulation / Debug Panel (not on real device)",
"frame_physical": "Physical Connections (cable simulation)",
"frame_nic": "NIC Selection",
# Lower panel buttons / labels
"lbl_power": "Power:",
"btn_power_on": "● ON (click: OFF)",
"btn_power_off": "○ OFF (click: ON)",
"lbl_lan": "LAN:",
"btn_lan_on": "Connected (click: unplug)",
"btn_lan_off": "Disconnected (click: plug)",
"lbl_usb": "Maint. USB:",
"btn_usb_on": "Connected (click: unplug)",
"btn_usb_off": "Disconnected (click: plug)",
"lbl_nic": "Monitor NIC:",
"nic_none": "(Npcap not found: no NIC)",
# Guide bar (L, M, R)
"guide_setup": ("──", "──", "Learn"),
"guide_guard": ("History","──", "Menu"),
"guide_sleep": ("", "", ""),
"guide_history": ("▲", "▼", "Menu/Hold:Toggle"),
"guide_menu": ("▲", "▼", "Select"),
"guide_learn_confirm": ("Back", "──", "Hold:Start"),
"guide_learn": ("──", "──", "End Learn"),
"guide_volume": ("▲", "▼", "Save"),
"guide_alarm": ("[Mute]", "[Mute]", "[Mute]"),
# Menu items
"menu_items": ["View History", "Bulk Register (Learn)", "Volume", "Back (Monitor)"],
# SC_SETUP
"sc_setup_title": "Not Configured",
"sc_setup_msg1": "Start bulk registration",
"sc_setup_msg2": "to begin monitoring",
# SC_GUARD
"sc_guard_title": "Monitoring",
"sc_guard_registered": "Registered: {}",
"sc_guard_pending": "Pending: {}",
"sc_guard_lan": "ON",
"sc_guard_lan_off": "OFF",
"sc_guard_usb": "ON",
"sc_guard_usb_off": "OFF",
"sc_guard_status": "LAN: {} USB: {}",
# SC_HISTORY
"sc_hist_title": "History {}/{}",
"sc_hist_empty_h": "History",
"sc_hist_empty": "No records",
"st_pending": "Pending",
"st_registered": "Registered",
"st_pending_hint": "Hold→Registered",
"st_registered_hint": "Hold→Pending",
"lbl_vendor": "Vendor: {}",
"lbl_first": "First: {}",
"lbl_last": "Last: {}",
"lbl_ip": "IP: {}",
"ip_unknown": "Unknown",
"prev_boot": "Prev. boot",
# SC_MENU
"sc_menu_title": "Menu",
# SC_LEARN_CONFIRM
"sc_lc_title": "Confirm Learning",
"sc_lc_msg1": "All data will be cleared",
"sc_lc_msg2": "and learning will start.",
"sc_lc_start": "Hold R to start",
"sc_lc_back": "L to go back",
# SC_LEARN
"sc_learn_title": "Learning...",
"sc_learn_count": "Registered: {} device(s)",
"sc_learn_remain": "Remaining {:02d}:{:02d}",
"sc_learn_end": "R: End learning",
# SC_VOLUME
"sc_vol_title": "Volume",
"volume_labels": ["High", "Mid", "Low", "Mute"],
# SC_ALARM
"sc_alarm_title": "[ALERT] Unknown MAC",
"sc_alarm_count": "{} unknown device(s)",
"sc_alarm_others": "({} more pending)",
# Mute icon
"mute_icon": "×MUTE",
# Dimension caption
"dim_caption": "approx. 65 mm (DRC7 case)",
"dim_detail": "Top: RJ45 Right: USB-C Buttons: gray×2(L/M) · red×1(R)",
}
_LANGS = {"ja": _JA, "en": _EN}
def get(lang="ja"):
return _LANGS.get(lang, _JA)
def fmt_rel(ts, now, session_start, lang="ja"):
"""Locale-aware relative time string (replaces engine.relative_time for display)."""
if session_start > 0 and ts < session_start:
return _LANGS.get(lang, _JA)["prev_boot"]
diff = max(0, int(now - ts))
if lang == "en":
if diff < 60:
return "just now"
m = diff // 60
if m < 60:
return f"~{m} min ago"
return f"~{m // 60} hr ago"
else:
if diff < 60:
return "0分前"
m = diff // 60
if m < 60:
return f"約{m}分前"
return f"約{m // 60}時間前"
def localize_oui(text, lang):
"""Translate Japanese OUI category words embedded in oui.describe() output."""
if lang != "en":
return text
return (text
.replace("OT機器", "OT Device")
.replace("ネットワーク機器", "Network Device")
.replace("自動生成MAC", "Random MAC")
.replace("不明", "Unknown"))
_STATE_EN = {"要確認": "Pending", "登録済み": "Registered"}
_CAT_EN = {
"OT機器": "OT Device",
"PC": "PC",
"ネットワーク機器": "Network Device",
"自動生成MAC": "Random MAC",
"不明": "Unknown",
}
def translate_state(state, lang):
"""Translate internal state string for CSV output."""
if lang != "en":
return state
return _STATE_EN.get(state, state)
def translate_category(cat, lang):
"""Translate OUI category string for CSV output."""
if lang != "en":
return cat
return _CAT_EN.get(cat, cat)