Skip to content

Commit 1f2c05a

Browse files
Add files via upload
1 parent 5a4b9f6 commit 1f2c05a

2 files changed

Lines changed: 1335 additions & 0 deletions

File tree

src/wwwroot/i18n.js

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
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

Comments
 (0)