en.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <?php
  2. // WeCom Center - English (base language). Copy this file to <lang>.php to add a language.
  3. return [
  4. 'menu.title' => 'ROMAN Custom Center',
  5. 'page.title' => 'ROMAN Custom Center',
  6. 'tab.alert' => 'Alert',
  7. 'tab.opt' => 'Optimization',
  8. 'tab.maint' => 'Maintenance',
  9. 'tab.l2' => 'L2 Topology',
  10. // section headings
  11. 'sec.robot' => 'WeCom group robot',
  12. 'sec.strategy' => 'Alert strategy (pick one, then Apply)',
  13. 'sec.threshold' => 'Manual threshold (overrides the strategy)',
  14. 'sec.tuning' => 'Server tuning generator',
  15. 'sec.template' => 'Template import',
  16. 'sec.map' => 'Map marker',
  17. 'sec.triggers' => 'Per-trigger alerting switch',
  18. 'sec.class_sev' => 'Bulk severity by class',
  19. // media type
  20. 'lbl.mediatype' => 'Alert media type',
  21. 'lbl.alerting_on' => 'Alerting enabled',
  22. 'lbl.severity' => 'Severities that will notify',
  23. 'lbl.key' => 'Robot key (global macro {$WECOM_KEY})',
  24. 'lbl.strategy_hint' => 'Every strategy pins the "must alert" classes to the highest severity (Disaster) so they always fire, and sets a threshold for the rest. Apply is safe and repeatable.',
  25. 'lbl.threshold_hint' => 'The strategy sets this automatically. Change it here only for a one-off adjustment.',
  26. 'lbl.tuning_hint' => 'This only GENERATES the settings and command — nothing is changed. Copy them onto the Zabbix host and recreate the server container yourself.',
  27. // buttons
  28. 'btn.save' => 'Save',
  29. 'btn.test' => 'Send test',
  30. 'btn.import' => 'Import template',
  31. 'btn.preview' => 'Preview',
  32. 'btn.apply' => 'Apply',
  33. 'btn.generate' => 'Generate',
  34. 'btn.search' => 'Search',
  35. // severities
  36. 'sev.1' => 'Not classified',
  37. 'sev.2' => 'Information',
  38. 'sev.3' => 'Warning',
  39. 'sev.4' => 'Average',
  40. 'sev.5' => 'High',
  41. 'sev.6' => 'Disaster',
  42. // trigger classes
  43. 'cls.device_down' => 'Device down / unreachable',
  44. 'cls.hw_fault' => 'Hardware fault (fan/power/temperature)',
  45. 'cls.restarted' => 'Device restarted',
  46. 'cls.core_link' => 'Core/uplink link down',
  47. 'cls.interface_down' => 'Access interface down',
  48. 'cls.perf' => 'Performance (bandwidth/error/CPU)',
  49. 'cls.other' => 'Other (unchanged)',
  50. 'cls.col.class' => 'Class',
  51. 'cls.col.target' => 'Severity',
  52. 'cls.col.count' => 'Triggers',
  53. 'cls.col.changes' => 'Will change',
  54. 'cls.total' => 'Total',
  55. // strategy presets
  56. 'preset.current' => '(current)',
  57. 'preset.col.name' => 'Strategy',
  58. 'preset.col.desc' => 'Description',
  59. 'preset.col.action' => 'Actions',
  60. 'preset.steady' => 'Steady operations',
  61. 'preset.steady.desc' => 'Must-alert always fires; rest only High+. Balanced for daily production.',
  62. 'preset.core' => 'Core essentials only',
  63. 'preset.core.desc' => 'Only must-alert classes fire (Disaster). Everything else muted — max noise reduction.',
  64. 'preset.observe' => 'Full observation',
  65. 'preset.observe.desc' => 'Notify from Warning up. For onboarding / troubleshooting periods.',
  66. 'preset.night' => 'Night quiet',
  67. 'preset.night.desc' => 'Disaster only. For night shifts / on-call quiet hours.',
  68. 'preset.balanced' => 'Core strict / access loose',
  69. 'preset.balanced.desc'=> 'Must-alert + Average up. Slightly broader than steady.',
  70. // preview
  71. 'preview.title' => 'Preview — dry run for "{1}" (nothing written)',
  72. 'preview.hint' => 'These are the hosted triggers that would change. Apply to actually write them.',
  73. // templates
  74. 'tpl.choose' => 'Bundled template',
  75. 'tpl.none' => 'No bundled template found',
  76. // map
  77. 'map.choose_host' => '-- select host --',
  78. 'map.host' => 'Marker host',
  79. 'map.lat' => 'Latitude',
  80. 'map.lon' => 'Longitude',
  81. 'map.hint' => 'The map uses one representative point (the Zabbix server). Note: the Geomap widget needs the browser to reach the internet for base-map tiles.',
  82. // tuning
  83. 'tuning.choose' => 'Hardware profile',
  84. 'tuning.small' => 'Small (< 200 hosts)',
  85. 'tuning.medium' => 'Medium (~ 500 hosts)',
  86. 'tuning.large' => 'Large (1000+ hosts)',
  87. 'tuning.env' => 'Settings (paste into .env / compose environment):',
  88. 'tuning.cmd' => 'Then apply:',
  89. // triggers / maintenance
  90. 'lbl.trig_search' => 'Search triggers by description (e.g. CPU, disk)',
  91. 'lbl.trig_list' => 'Triggers (checked = alerting enabled)',
  92. 'lbl.trig_hint' => 'There are {1} triggers. Type a keyword above to search (max 200 shown).',
  93. 'lbl.trig_edit_hint' => 'Adjust severity or toggle alerting per row, then Save. Changes apply immediately and the list refreshes.',
  94. 'lbl.class_sev_hint' => 'Pick a class of triggers and a target severity. Apply sets every trigger in that class — template, prototypes and already-discovered triggers — then refreshes the list.',
  95. 'lbl.class_pick' => 'Trigger class',
  96. 'lbl.set_severity' => 'Set severity to',
  97. // messages
  98. 'msg.saved' => 'Alert settings saved.',
  99. 'msg.robot_saved' => 'Robot key saved.',
  100. 'msg.tested' => 'Test message sent successfully (errcode 0).',
  101. 'msg.test_failed' => 'Test failed (HTTP {1}): {2}',
  102. 'msg.imported' => 'Template imported. Templates: {1}',
  103. 'msg.map_saved' => 'Map coordinates saved.',
  104. 'msg.no_mediatype'=> 'No webhook media type found.',
  105. 'msg.no_url' => 'Robot key is empty (set {$WECOM_KEY}).',
  106. 'msg.no_template' => 'Please choose a template.',
  107. 'msg.no_host' => 'Please choose a host.',
  108. 'msg.no_template_host' => 'Huawei walk template not found on this server.',
  109. 'msg.no_server_host' => 'Host "Zabbix server" not found.',
  110. 'msg.bad_scheme' => 'Unknown strategy.',
  111. 'msg.unknown_op' => 'Unknown operation.',
  112. 'msg.no_triggers' => 'No trigger selected.',
  113. 'msg.triggers_saved' => 'Trigger alerting updated: {1} trigger(s).',
  114. 'msg.no_trig_search' => 'No triggers matched your search.',
  115. 'msg.bad_class_sev' => 'Choose a class and a severity (0-5).',
  116. 'msg.class_sev_saved' => 'Class severity updated: template triggers {1}, discovered triggers {2}. List refreshed.',
  117. 'msg.strategy_applied' => 'Strategy "{1}" applied — template triggers: {2}, prototypes: {3}, discovered triggers: {4}.',
  118. // hero + template switch
  119. 'hero.sub' => 'WeCom group alerts, one-click alert strategy, server tuning, template migration and per-trigger control — all in one place.',
  120. 'lbl.template_hint' => 'Bundled templates ship with the module. Importing an existing template updates it in place; importing a new one creates it. Use the switch card below to move devices from an old template to the new one.',
  121. 'sec.switch' => 'Template switch (migrate devices)',
  122. 'lbl.switch_hint' => 'Pick the OLD template and the NEW template. Preview lists the affected devices; confirm replaces the template link on every one of them. This is the "import, then switch?" step.',
  123. 'switch.pick' => '-- select template --',
  124. 'switch.src' => 'From template (old)',
  125. 'switch.dst' => 'To template (new)',
  126. 'switch.none' => 'No device currently uses "{1}". Nothing to switch.',
  127. 'switch.result' => '{1} device(s) on "{2}" will be moved to "{3}".',
  128. 'btn.confirm' => 'Confirm switch',
  129. 'msg.need_both' => 'Please choose both source and target template.',
  130. 'msg.same_tpl' => 'Source and target template must differ.',
  131. 'msg.switch_applied' => 'Switched {1} device(s) to the new template.',
  132. // one-click environment initialisation
  133. 'sec.init' => 'Environment initialisation',
  134. 'lbl.init_hint' => 'On a brand-new Zabbix click this once — it creates the WeCom webhook media type, the robot user with its media, the trigger action and the {$WECOM_KEY} macro. Existing objects are reused (safe to re-run as a self-check).',
  135. 'lbl.init_key' => 'Group-robot key (Webhook key)',
  136. 'btn.init' => 'Initialise / self-check',
  137. 'init.title' => 'First-time setup',
  138. 'init.sub' => 'This Zabbix has no WeCom media type yet. Paste your group-robot key and initialise — the media type, robot user, trigger action and macro will all be created automatically, then alerts start flowing to the group.',
  139. 'msg.init_done' => 'Initialisation complete: {1}.',
  140. 'msg.init_mediatype_new' => 'media type created',
  141. 'msg.init_mediatype_ok' => 'media type reused',
  142. 'msg.init_user_new' => 'robot user created',
  143. 'msg.init_user_ok' => 'robot user reused',
  144. 'msg.init_action_new' => 'trigger action created',
  145. 'msg.init_action_ok' => 'trigger action exists',
  146. 'msg.init_key_set' => 'key saved',
  147. 'msg.init_l2_new' => 'L2 topology storage/config initialised',
  148. 'msg.init_l2_ok' => 'L2 topology storage ready',
  149. 'msg.l2_init_done' => 'L2 topology initialisation complete: {1}, {2} historical snapshots.',
  150. 'msg.l2_init_config_new' => 'config created',
  151. 'msg.l2_init_config_ok' => 'config already exists',
  152. 'sec.l2_init' => 'L2 initialisation / self-check',
  153. 'lbl.l2_init_hint' => 'Run once after a manual install or upgrade: idempotently creates l2_topology_history / l2_topology_config and writes the default config only when the row is missing; an existing config is never overwritten. The collector cron still has to be installed on the host.',
  154. 'btn.l2_init' => 'Initialise / self-check L2 storage',
  155. // ============================ L2 topology ============================
  156. 'menu.l2' => 'L2 Topology',
  157. 'sec.l2_collect' => 'L2 collection',
  158. 'sec.l2_display' => 'L2 display',
  159. 'sec.l2_colors' => 'Link speed colours',
  160. 'sec.l2_latency' => 'Latency thresholds',
  161. 'sec.l2_group' => 'Grouping rules',
  162. 'sec.l2_networks' => 'Physical networks',
  163. 'sec.l2_cores' => 'Core hierarchy',
  164. 'lbl.l2_cores_hint' => 'Upstream order: firewall → behavior management → total core. Leave a field empty when the device is not connected yet; the topology will not reserve space for it.',
  165. 'lbl.l2_subcores_hint' => 'Sub-cores: monitoring core, office core, and the future production core. Each row takes a network, match mode and name/IP pattern; empty rows are hidden.',
  166. 'lbl.core_net' => 'Network',
  167. 'lbl.core_any' => 'All networks',
  168. 'lbl.core_pattern' => 'Name or IP pattern',
  169. 'btn.add_core' => 'Add core switch',
  170. 'lbl.l2_templates' => 'Collect hosts using these template(s)',
  171. 'lbl.l2_templates_hint' => 'Only hosts linked to the selected templates are collected. Recommended/default: Huawei VRP by SNMP (walk).',
  172. 'lbl.l2_networks' => 'Physical networks (one per line: KEY | label | name/IP keywords | colour)',
  173. 'lbl.l2_networks_hint' => 'A switch belongs to the first network whose keyword appears in its name or IP. Example: SURVE | SURVE monitoring | SURVE,10.169. | #2E75B6.',
  174. 'lbl.l2_refresh' => 'Display auto-refresh (seconds)',
  175. 'lbl.l2_full' => 'Collection / snapshot interval (minutes)',
  176. 'lbl.l2_alarm' => 'Alarm-only refresh (minutes)',
  177. 'lbl.l2_history_interval' => 'History snapshot interval (legacy)',
  178. 'lbl.l2_history_days' => 'History retention (days)',
  179. 'lbl.l2_history_hint' => 'One snapshot is saved immediately after each successful collection; there is no separate snapshot interval. Minimum 5 minutes, hard-pruned after the retention window. Default 5 min / 7 days is about 70-100 MB compressed (measured ~33 KB per snapshot).',
  180. 'lbl.l2_root' => 'Outermost frame label',
  181. 'lbl.l2_other' => 'Fallback group label',
  182. 'lbl.color_100' => '100M',
  183. 'lbl.color_1000' => '1G',
  184. 'lbl.color_2500' => '2.5G',
  185. 'lbl.color_10000' => '10G',
  186. 'lbl.color_20000' => '20G+',
  187. 'lbl.color_unknown' => 'Unknown',
  188. 'lbl.color_down' => 'Down',
  189. 'lbl.lat_warn' => 'Orange above (ms)',
  190. 'lbl.lat_bad' => 'Red above (ms)',
  191. 'lbl.rule_match' => 'Match',
  192. 'lbl.rule_pattern' => 'Pattern',
  193. 'lbl.rule_label' => 'Frame label',
  194. 'lbl.rule_big' => 'Big',
  195. 'lbl.rule_hint' => 'First matching rule wins; unmatched devices go to the fallback group. For regex rules the label may use $1..$9 back-references.',
  196. 'btn.add_rule' => 'Add rule',
  197. 'msg.l2_saved' => 'L2 topology settings saved.',
  198. // L2 display page
  199. 'l2.title' => 'L2 Physical Topology',
  200. 'l2.unit_sw' => 'switches',
  201. 'l2.tile_hint' => 'Click to open this workshop',
  202. 'l2.not_in_topo' => 'not in topology',
  203. 'l2.click_hint' => 'Hover a switch to highlight its full upstream path',
  204. 'l2.net_surve' => 'SURVE surveillance',
  205. 'l2.net_office' => 'OFFICE office',
  206. 'l2.net_other' => 'Other network',
  207. 'l2.floor_na' => 'Other',
  208. 'l2.search_ph' => 'Search IP / MAC / name…',
  209. 'l2.show_term' => 'Show terminals',
  210. 'l2.only_off' => 'Only offline switches',
  211. 'l2.auto_refresh' => 'Auto refresh',
  212. 'l2.min' => 'min',
  213. 'l2.refresh_now' => 'Refresh now',
  214. 'l2.export_img' => 'Export image',
  215. 'l2.exporting' => 'Exporting…',
  216. 'l2.export_fail' => 'Export failed, please retry.',
  217. 'l2.fit' => 'Fit to window',
  218. 'l2.alarms' => 'Alarms',
  219. 'l2.offline' => 'Offline switches',
  220. 'l2.time_live' => 'Live',
  221. 'l2.time_btn' => 'Go',
  222. 'l2.time_label' => 'Snapshot time',
  223. 'l2.time_date' => 'Date',
  224. 'l2.time_time' => 'Time',
  225. 'l2.time_date_title' => 'Only dates with saved snapshots are listed',
  226. 'l2.time_time_title' => 'Only times saved on the selected date are listed',
  227. 'l2.time_pick_title' => 'Snapshot time',
  228. 'l2.time_choose' => 'Choose a time',
  229. 'l2.time_live_full' => 'Live (latest)',
  230. 'l2.time_live_hint' => 'Showing the latest collected data',
  231. 'l2.firewall' => 'Firewall',
  232. 'l2.behavior' => 'Behavior management',
  233. 'l2.total_core' => 'Total core',
  234. 'l2.upstream' => 'Upstream hierarchy',
  235. 'l2.time_pick' => 'Pick date/time',
  236. 'l2.view' => 'View',
  237. 'l2.no_data' => 'No snapshot yet — the collector has not run.',
  238. 'l2.offline_empty' => 'No offline switches.',
  239. 'l2.alarm_empty' => 'No active alarms.',
  240. 'l2.updated' => 'Updated',
  241. 'l2.pause' => 'Pause auto-refresh',
  242. 'l2.resume' => 'Resume auto-refresh',
  243. 'l2.legend_speed' => 'Link speed',
  244. 'l2.legend_tier' => 'Tier',
  245. 'l2.legend_lat' => 'Latency',
  246. 'l2.core' => 'Core',
  247. 'l2.main' => 'Main switch',
  248. 'l2.dist' => 'Distribution',
  249. 'l2.access' => 'Access',
  250. 'l2.lat_norm' => 'Normal',
  251. 'l2.term_on' => 'Online',
  252. 'l2.term_off' => 'Offline',
  253. 'l2.term_title' => 'Terminal',
  254. 'l2.term_mac' => 'MAC address',
  255. 'l2.term_rate' => 'Link rate',
  256. 'l2.term_switch' => 'Switch',
  257. 'l2.term_port' => 'Port',
  258. 'l2.term_ip' => 'IP address',
  259. 'l2.zoom_in' => 'Zoom in',
  260. 'l2.zoom_out' => 'Zoom out',
  261. 'l2.snapshot' => 'Snapshot',
  262. 'l2.showing' => 'Showing',
  263. 'l2.live_tag' => 'LIVE',
  264. 'l2.terminals' => 'Terminals',
  265. 'l2.offline_short' => 'offline SW',
  266. 'l2.last_online' => 'last online',
  267. 'l2.history' => 'History',
  268. 'l2.history_live' => 'Live / latest',
  269. 'l2.history_live_hint' => 'Newest snapshot, auto refresh',
  270. 'l2.history_empty' => 'No history snapshots yet.',
  271. ];