1+ // i18n.js - поддержка двух языков (русский/английский)
2+ const i18n = {
3+ // Текущий язык (определяем из браузера)
4+ currentLang : ( navigator . language || navigator . userLanguage || 'en' ) . startsWith ( 'ru' ) ? 'ru' : 'en' ,
5+
6+ // Словарь переводов
7+ translations : {
8+ en : {
9+ // Интерфейс
10+ beacons : 'Beacons' ,
11+ log : 'Log' ,
12+ noBeacons : 'No beacons detected' ,
13+ noLogs : 'No logs' ,
14+ connected : 'CONNECTED' ,
15+ disconnected : 'DISCONNECTED' ,
16+ station : 'STATION' ,
17+ antenna : 'ANTENNA' ,
18+
19+ // Разделы
20+ position : '📍 POSITION' ,
21+ orientation : '🧭 ORIENTATION' ,
22+ environment : '🌊 ENVIRONMENT' ,
23+ status : '📊 STATUS' ,
24+
25+ // Параметры
26+ x : 'X' ,
27+ y : 'Y' ,
28+ z : 'Z' ,
29+ lat : 'Lat' ,
30+ lon : 'Lon' ,
31+ heading : 'Heading' ,
32+ course : 'Course' ,
33+ speed : 'Speed' ,
34+ pitch : 'Pitch' ,
35+ roll : 'Roll' ,
36+ depth : 'Depth' ,
37+ temperature : 'Temp' ,
38+ pressure : 'Pressure' ,
39+ rError : 'R Error' ,
40+ dataAge : 'Age' ,
41+ distance : 'Dist' ,
42+ azimuth : 'Az' ,
43+ signal : 'Signal' ,
44+ battery : 'Battery' ,
45+
46+ // Единицы измерения
47+ meter : 'm' ,
48+ meterPerSec : 'm/s' ,
49+ degree : '°' ,
50+ celsius : '°C' ,
51+ mbar : 'mBar' ,
52+ second : 's' ,
53+
54+ // Статусы маяков
55+ active : 'ACTIVE' ,
56+ warning : 'WARNING' ,
57+ timeout : 'TIMEOUT' ,
58+
59+ // Кнопки
60+ zoomIn : 'Zoom In' ,
61+ zoomOut : 'Zoom Out' ,
62+ reset : 'Reset' ,
63+ autoScale : 'Auto Scale' ,
64+
65+ // Статусы
66+ mode : 'Mode' ,
67+ interrogation : 'Interrogation' ,
68+ } ,
69+ ru : {
70+ // Интерфейс
71+ beacons : 'Маяки' ,
72+ log : 'Журнал' ,
73+ noBeacons : 'Нет маяков' ,
74+ noLogs : 'Нет записей' ,
75+ connected : 'ПОДКЛЮЧЕНО' ,
76+ disconnected : 'ОТКЛЮЧЕНО' ,
77+ station : 'СТАНЦИЯ' ,
78+ antenna : 'АНТЕННА' ,
79+
80+ // Разделы
81+ position : '📍 ПОЗИЦИЯ' ,
82+ orientation : '🧭 ОРИЕНТАЦИЯ' ,
83+ environment : '🌊 СРЕДА' ,
84+ status : '📊 СТАТУС' ,
85+
86+ // Параметры
87+ x : 'X' ,
88+ y : 'Y' ,
89+ z : 'Z' ,
90+ lat : 'Широта' ,
91+ lon : 'Долгота' ,
92+ heading : 'Курс' ,
93+ course : 'Направление' ,
94+ speed : 'Скорость' ,
95+ pitch : 'Дифферент' ,
96+ roll : 'Крен' ,
97+ depth : 'Глубина' ,
98+ temperature : 'Темп' ,
99+ pressure : 'Давление' ,
100+ rError : 'Ошибка' ,
101+ dataAge : 'Возраст' ,
102+ distance : 'Дист' ,
103+ azimuth : 'Азимут' ,
104+ signal : 'Сигнал' ,
105+ battery : 'Батарея' ,
106+
107+ // Единицы измерения
108+ meter : 'м' ,
109+ meterPerSec : 'м/с' ,
110+ degree : '°' ,
111+ celsius : '°C' ,
112+ mbar : 'мБар' ,
113+ second : 'с' ,
114+
115+ // Статусы маяков
116+ active : 'АКТИВНО' ,
117+ warning : 'ВНИМАНИЕ' ,
118+ timeout : 'ТАЙМАУТ' ,
119+
120+ // Кнопки
121+ zoomIn : 'Приблизить' ,
122+ zoomOut : 'Отдалить' ,
123+ reset : 'Сброс' ,
124+ autoScale : 'Автомасштаб' ,
125+
126+ // Статусы
127+ mode : 'Режим' ,
128+ interrogation : 'Опрос' ,
129+ }
130+ } ,
131+
132+ // Получить перевод
133+ t : function ( key ) {
134+ return this . translations [ this . currentLang ] [ key ] || key ;
135+ } ,
136+
137+ // Обновить статические элементы интерфейса
138+ updateStaticUI : function ( ) {
139+ // Заголовки панелей
140+ const beaconsHeader = document . querySelector ( '#beacons-panel h3' ) ;
141+ if ( beaconsHeader ) beaconsHeader . innerHTML = `📡 ${ this . t ( 'beacons' ) } ` ;
142+
143+ const logsHeader = document . querySelector ( '#logs-panel h4' ) ;
144+ if ( logsHeader ) logsHeader . innerHTML = `📋 ${ this . t ( 'log' ) } ` ;
145+
146+ // Кнопки (text и title атрибуты)
147+ const zoomIn = document . getElementById ( 'zoom-in' ) ;
148+ if ( zoomIn ) {
149+ zoomIn . title = this . t ( 'zoomIn' ) ;
150+ // Текст кнопки оставляем "+"
151+ }
152+
153+ const zoomOut = document . getElementById ( 'zoom-out' ) ;
154+ if ( zoomOut ) {
155+ zoomOut . title = this . t ( 'zoomOut' ) ;
156+ // Текст кнопки оставляем "−"
157+ }
158+
159+ const resetView = document . getElementById ( 'reset-view' ) ;
160+ if ( resetView ) {
161+ resetView . textContent = this . t ( 'reset' ) ;
162+ resetView . title = this . t ( 'reset' ) ;
163+ }
164+
165+ const autoScaleBtn = document . getElementById ( 'auto-scale-btn' ) ;
166+ if ( autoScaleBtn ) {
167+ autoScaleBtn . title = this . t ( 'autoScale' ) ;
168+ // Текст кнопки оставляем "A"
169+ }
170+ }
171+ } ;
172+
173+ // Инициализация при загрузке
174+ document . addEventListener ( 'DOMContentLoaded' , function ( ) {
175+ i18n . updateStaticUI ( ) ;
176+ } ) ;
0 commit comments