lgq
3 天以前 081f12a52906abe6c2d139fdc144135978681009
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
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
import dxos from './dxOs.js'
import dxstd from './dxStd.js'
import logger from './dxLogger.js'
/**
 * Timezone Management Module (dxTimeZones)
 *
 * @description
 * Provides comprehensive timezone management with multi-language support. This module contains
 * a curated list of 45 major timezones worldwide, each with UTC offset information and localized
 * names in 9 languages (Chinese, English, Japanese, Korean, Spanish, French, German, Russian, Arabic).
 * Additionally, it supports updating to any timezone file present in the zoneinfo directory, even if
 * not included in the predefined list.
 *
 * @feature
 * - **Multi-Language Support**: Each timezone includes translations in 9 languages for UI display.
 * - **UTC Offset Information**: Provides standardized UTC offset for each timezone.
 * - **System Timezone Update**: Allows updating the system timezone by copying zoneinfo files.
 * - **Custom Timezone Support**: Can update to any timezone file in the zoneinfo directory, not limited to the 45 predefined ones.
 * - **Language Validation**: Ensures only supported languages are used when filtering timezones.
 * - **Device Reboot**: Provides a safe reboot function to apply timezone changes.
 *
 * @note
 * For simple timezone updates using GMT offset only (e.g., GMT+8, GMT-5), consider using the
 * `updateGmt()` function from the **dxNtp** module, which provides a simpler interface for
 * basic GMT offset-based timezone configuration without requiring full zoneinfo files.
 *
 * @timezoneData
 * The module includes 45 timezones covering major cities and regions worldwide:
 * - Americas: From Pacific/Midway (UTC-11) to America/Argentina/Buenos_Aires (UTC-3)
 * - Europe & Africa: From Atlantic/Azores (UTC-1) to Europe/Istanbul (UTC+3)
 * - Asia & Pacific: From Asia/Dubai (UTC+4) to Pacific/Tongatapu (UTC+13)
 *
 * @supportedLanguages
 * - zh: Chinese (中文)
 * - en: English
 * - ja: Japanese (日本語)
 * - ko: Korean (한국어)
 * - es: Spanish (Español)
 * - fr: French (Français)
 * - de: German (Deutsch)
 * - ru: Russian (Русский)
 * - ar: Arabic (العربية)
 *
 * @example
 * // --- Get all timezones with full language data ---
 * import tz from '../dxmodules/dxTimeZones.js';
 * 
 * const allTimezones = tz.getTimeZones();
 * // Returns: { "Pacific/Midway": { utc_offset: "-11:00", name: { zh: "...", en: "...", ... } }, ... }
 *
 * // --- Get timezones filtered by language ---
 * const chineseTimezones = tz.getTimeZones('zh');
 * // Returns: { "Pacific/Midway": { utc_offset: "-11:00", name: "萨摩亚标准时间(中途岛)" }, ... }
 *
 * const englishTimezones = tz.getTimeZones('en');
 * // Returns: { "Pacific/Midway": { utc_offset: "-11:00", name: "Samoa Standard Time (Midway)" }, ... }
 *
 * // --- Update system timezone (from predefined list) ---
 * try {
 *   tz.updateTimeZone('Asia/Shanghai');
 *   // Timezone file copied to /etc/localtime
 *   // Now reboot to apply changes
 *   tz.reboot();
 * } catch (e) {
 *   logger.error('Failed to update timezone:', e.message);
 * }
 *
 * // --- Update to custom timezone (any file in zoneinfo directory) ---
 * try {
 *   tz.updateTimeZone('Europe/Kyiv'); // Not in predefined list, but file exists
 *   // Works as long as the file exists at /app/code/dxmodules/zoneinfo/Europe/Kyiv
 * } catch (e) {
 *   logger.error('Timezone file not found:', e.message);
 * }
 *
 * // --- Simple GMT offset-based timezone update (using dxNtp) ---
 * // For basic use cases, you can use dxNtp module for simpler GMT-based timezone updates:
 * import ntp from '../dxmodules/dxNtp.js';
 * ntp.updateGmt(8); // Set to GMT+8 (e.g., Beijing time)
 *
 * // --- Validate language support ---
 * try {
 *   tz.getTimeZones('invalid'); // Throws error
 * } catch (e) {
 *   // Error: Language invalid not supported
 * }
 */
 
const timezones = {
    "Pacific/Midway": {
        "utc_offset": "-11:00",
        "name": {
            "zh": "萨摩亚标准时间(中途岛)",
            "en": "Samoa Standard Time (Midway)",
            "ja": "サモア標準時(ミッドウェイ)",
            "ko": "사모아 표준시 (미드웨이)",
            "es": "Hora Estándar de Samoa (Midway)",
            "fr": "Heure Standard de Samoa (Midway)",
            "de": "Samoa-Standardzeit (Midway)",
            "ru": "Самоанское стандартное время (Мидуэй)",
            "ar": "التوقيت القياسي لساموا (ميدواي)"
        }
    },
    "America/Adak": {
        "utc_offset": "-10:00",
        "name": {
            "zh": "夏威夷-阿留申标准时间(阿达克)",
            "en": "Hawaii-Aleutian Standard Time (Adak)",
            "ja": "ハワイ・アリューシャン標準時(アダック)",
            "ko": "하와이-알류샨 표준시 (아닥)",
            "es": "Hora Estándar de Hawái-Aleutianas (Adak)",
            "fr": "Heure Standard d'Hawaï-Aléoutiennes (Adak)",
            "de": "Hawaii-Aleuten-Standardzeit (Adak)",
            "ru": "Гавайско-Алеутское стандартное время (Адак)",
            "ar": "التوقيت القياسي لهاواي-ألوشيان (أداك)"
        }
    },
    "Pacific/Honolulu": {
        "utc_offset": "-10:00",
        "name": {
            "zh": "夏威夷标准时间",
            "en": "Hawaii Standard Time",
            "ja": "ハワイ標準時",
            "ko": "하와이 표준시",
            "es": "Hora Estándar de Hawái",
            "fr": "Heure Standard d'Hawaï",
            "de": "Hawaii-Standardzeit",
            "ru": "Гавайское стандартное время",
            "ar": "التوقيت القياسي لهاواي"
        }
    },
    "America/Anchorage": {
        "utc_offset": "-09:00",
        "name": {
            "zh": "阿拉斯加标准时间",
            "en": "Alaska Standard Time",
            "ja": "アラスカ標準時",
            "ko": "알래스카 표준시",
            "es": "Hora Estándar de Alaska",
            "fr": "Heure Standard de l'Alaska",
            "de": "Alaska-Standardzeit",
            "ru": "Аляскинское стандартное время",
            "ar": "التوقيت القياسي لألاسكا"
        }
    },
    "America/Los_Angeles": {
        "utc_offset": "-08:00",
        "name": {
            "zh": "太平洋标准时间(洛杉矶)",
            "en": "Pacific Standard Time (Los Angeles)",
            "ja": "太平洋標準時(ロサンゼルス)",
            "ko": "태평양 표준시 (로스앤젤레스)",
            "es": "Hora Estándar del Pacífico (Los Ángeles)",
            "fr": "Heure Standard du Pacifique (Los Angeles)",
            "de": "Pazifische Standardzeit (Los Angeles)",
            "ru": "Тихоокеанское стандартное время (Лос-Анджелес)",
            "ar": "توقيت المحيط الهادئ (لوس أنجلوس)"
        }
    },
    "America/Denver": {
        "utc_offset": "-07:00",
        "name": {
            "zh": "山地标准时间(丹佛)",
            "en": "Mountain Standard Time (Denver)",
            "ja": "山岳部標準時(デンバー)",
            "ko": "산악 표준시 (덴버)",
            "es": "Hora Estándar de la Montaña (Denver)",
            "fr": "Heure Standard des Rocheuses (Denver)",
            "de": "Rocky-Mountain-Standardzeit (Denver)",
            "ru": "Горное стандартное время (Денвер)",
            "ar": "التوقيت الجبلي (دنفر)"
        }
    },
    "America/Chicago": {
        "utc_offset": "-06:00",
        "name": {
            "zh": "中部标准时间(芝加哥)",
            "en": "Central Standard Time (Chicago)",
            "ja": "中部標準時(シカゴ)",
            "ko": "중부 표준시 (시카고)",
            "es": "Hora Estándar Central (Chicago)",
            "fr": "Heure Standard du Centre (Chicago)",
            "de": "Central-Standardzeit (Chicago)",
            "ru": "Центральное стандартное время (Чикаго)",
            "ar": "التوقيت المركزي (شيكاغو)"
        }
    },
    "America/New_York": {
        "utc_offset": "-05:00",
        "name": {
            "zh": "东部标准时间(纽约)",
            "en": "Eastern Standard Time (New York)",
            "ja": "東部標準時(ニューヨーク)",
            "ko": "동부 표준시 (뉴욕)",
            "es": "Hora Estándar del Este (Nueva York)",
            "fr": "Heure Standard de l'Est (New York)",
            "de": "Östliche Standardzeit (New York)",
            "ru": "Восточное стандартное время (Нью-Йорк)",
            "ar": "التوقيت الشرقي (نيويورك)"
        }
    },
    "America/Toronto": {
        "utc_offset": "-05:00",
        "name": {
            "zh": "东部标准时间(多伦多)",
            "en": "Eastern Standard Time (Toronto)",
            "ja": "東部標準時(トロント)",
            "ko": "동부 표준시 (토론토)",
            "es": "Hora Estándar del Este (Toronto)",
            "fr": "Heure Standard de l'Est (Toronto)",
            "de": "Östliche Standardzeit (Toronto)",
            "ru": "Восточное стандартное время (Торонто)",
            "ar": "التوقيت الشرقي (تورونتو)"
        }
    },
    "America/Mexico_City": {
        "utc_offset": "-06:00",
        "name": {
            "zh": "墨西哥中部时间(墨西哥城)",
            "en": "Central Time (Mexico City)",
            "ja": "中部時間(メキシコシティ)",
            "ko": "중부 시간 (멕시코시티)",
            "es": "Hora Central (Ciudad de México)",
            "fr": "Heure du Centre (Mexico)",
            "de": "Zentralzeit (Mexiko-Stadt)",
            "ru": "Центральное время (Мехико)",
            "ar": "التوقيت المركزي (مكسيكو سيتي)"
        }
    },
    "America/Bogota": {
        "utc_offset": "-05:00",
        "name": {
            "zh": "哥伦比亚时间(波哥大)",
            "en": "Colombia Time (Bogotá)",
            "ja": "コロンビア時間(ボゴタ)",
            "ko": "콜롬비아 시간 (보고타)",
            "es": "Hora de Colombia (Bogotá)",
            "fr": "Heure de Colombie (Bogotá)",
            "de": "Kolumbianische Zeit (Bogotá)",
            "ru": "Колумбийское время (Богота)",
            "ar": "توقيت كولومبيا (بوغوتا)"
        }
    },
    "America/Lima": {
        "utc_offset": "-05:00",
        "name": {
            "zh": "秘鲁时间(利马)",
            "en": "Peru Time (Lima)",
            "ja": "ペルー時間(リマ)",
            "ko": "페루 시간 (리마)",
            "es": "Hora de Perú (Lima)",
            "fr": "Heure du Pérou (Lima)",
            "de": "Peruanische Zeit (Lima)",
            "ru": "Перуанское время (Лима)",
            "ar": "توقيت بيرو (ليما)"
        }
    },
    "America/Santiago": {
        "utc_offset": "-04:00",
        "name": {
            "zh": "智利时间(圣地亚哥)",
            "en": "Chile Time (Santiago)",
            "ja": "チリ時間(サンティアゴ)",
            "ko": "칠레 시간 (산티아고)",
            "es": "Hora de Chile (Santiago)",
            "fr": "Heure du Chili (Santiago)",
            "de": "Chilenische Zeit (Santiago)",
            "ru": "Чилийское время (Сантьяго)",
            "ar": "توقيت تشيلي (سانتياغو)"
        }
    },
    "America/Argentina/Buenos_Aires": {
        "utc_offset": "-03:00",
        "name": {
            "zh": "阿根廷时间(布宜诺斯艾利斯)",
            "en": "Argentina Time (Buenos Aires)",
            "ja": "アルゼンチン時間(ブエノスアイレス)",
            "ko": "아르헨티나 시간 (부에노스아이레스)",
            "es": "Hora de Argentina (Buenos Aires)",
            "fr": "Heure d'Argentine (Buenos Aires)",
            "de": "Argentinische Zeit (Buenos Aires)",
            "ru": "Аргентинское время (Буэнос-Айрес)",
            "ar": "توقيت الأرجنتين (بوينس آيرس)"
        }
    },
    "America/Sao_Paulo": {
        "utc_offset": "-03:00",
        "name": {
            "zh": "巴西时间(圣保罗)",
            "en": "Brazil Time (São Paulo)",
            "ja": "ブラジル時間(サンパウロ)",
            "ko": "브라질 시간 (상파울루)",
            "es": "Hora de Brasil (São Paulo)",
            "fr": "Heure du Brésil (São Paulo)",
            "de": "Brasilianische Zeit (São Paulo)",
            "ru": "Бразильское время (Сан-Паулу)",
            "ar": "توقيت البرازيل (ساو باولو)"
        }
    },
    "Atlantic/Azores": {
        "utc_offset": "-01:00",
        "name": {
            "zh": "亚速尔群岛时间",
            "en": "Azores Time",
            "ja": "アゾレス時間",
            "ko": "아조레스 시간",
            "es": "Hora de las Azores",
            "fr": "Heure des Açores",
            "de": "Azoren-Zeit",
            "ru": "Азорское время",
            "ar": "توقيت الأزور"
        }
    },
    "Europe/London": {
        "utc_offset": "+00:00",
        "name": {
            "zh": "格林尼治标准时间(伦敦)",
            "en": "Greenwich Mean Time (London)",
            "ja": "グリニッジ標準時(ロンドン)",
            "ko": "그리니치 표준시 (런던)",
            "es": "Hora del Meridiano de Greenwich (Londres)",
            "fr": "Heure de Greenwich (Londres)",
            "de": "Mittlere Greenwich-Zeit (London)",
            "ru": "Среднее время по Гринвичу (Лондон)",
            "ar": "توقيت غرينتش (لندن)"
        }
    },
    "Europe/Lisbon": {
        "utc_offset": "+00:00",
        "name": {
            "zh": "葡萄牙时间(里斯本)",
            "en": "Portugal Time (Lisbon)",
            "ja": "ポルトガル時間(リスボン)",
            "ko": "포르투갈 시간 (리스본)",
            "es": "Hora de Portugal (Lisboa)",
            "fr": "Heure du Portugal (Lisbonne)",
            "de": "Portugiesische Zeit (Lissabon)",
            "ru": "Португальское время (Лиссабон)",
            "ar": "توقيت البرتغال (لشبونة)"
        }
    },
    "Europe/Berlin": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间(柏林)",
            "en": "Central European Time (Berlin)",
            "ja": "中央ヨーロッパ時間(ベルリン)",
            "ko": "중앙유럽 시간 (베를린)",
            "es": "Hora Central Europea (Berlín)",
            "fr": "Heure d'Europe Centrale (Berlin)",
            "de": "Mitteleuropäische Zeit (Berlin)",
            "ru": "Центральноевропейское время (Берлин)",
            "ar": "توقيت وسط أوروبا (برلين)"
        }
    },
    "Europe/Paris": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间(巴黎)",
            "en": "Central European Time (Paris)",
            "ja": "中央ヨーロッパ時間(パリ)",
            "ko": "중앙유럽 시간 (파리)",
            "es": "Hora Central Europea (París)",
            "fr": "Heure d'Europe Centrale (Paris)",
            "de": "Mitteleuropäische Zeit (Paris)",
            "ru": "Центральноевропейское время (Париж)",
            "ar": "توقيت وسط أوروبا (باريس)"
        }
    },
    "Europe/Madrid": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间(马德里)",
            "en": "Central European Time (Madrid)",
            "ja": "中央ヨーロッパ時間(マドリード)",
            "ko": "중앙유럽 시간 (마드리드)",
            "es": "Hora Central Europea (Madrid)",
            "fr": "Heure d'Europe Centrale (Madrid)",
            "de": "Mitteleuropäische Zeit (Madrid)",
            "ru": "Центральноевропейское время (Мадрид)",
            "ar": "توقيت وسط أوروبا (مدريد)"
        }
    },
    "Europe/Rome": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间(罗马)",
            "en": "Central European Time (Rome)",
            "ja": "中央ヨーロッパ時間(ローマ)",
            "ko": "중앙유럽 시간 (로마)",
            "es": "Hora Central Europea (Roma)",
            "fr": "Heure d'Europe Centrale (Rome)",
            "de": "Mitteleuropäische Zeit (Rom)",
            "ru": "Центральноевропейское время (Рим)",
            "ar": "توقيت وسط أوروبا (روما)"
        }
    },
    "Europe/Amsterdam": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间(阿姆斯特丹)",
            "en": "Central European Time (Amsterdam)",
            "ja": "中央ヨーロッパ時間(アムステルダム)",
            "ko": "중앙유럽 시간 (암스테르담)",
            "es": "Hora Central Europea (Ámsterdam)",
            "fr": "Heure d'Europe Centrale (Amsterdam)",
            "de": "Mitteleuropäische Zeit (Amsterdam)",
            "ru": "Центральноевропейское время (Амстердам)",
            "ar": "توقيت وسط أوروبا (أمستردام)"
        }
    },
    "Europe/Stockholm": {
        "utc_offset": "+01:00",
        "name": {
            "zh": "中欧时间(斯德哥尔摩)",
            "en": "Central European Time (Stockholm)",
            "ja": "中央ヨーロッパ時間(ストックホルム)",
            "ko": "중앙유럽 시간 (스톡홀름)",
            "es": "Hora Central Europea (Estocolmo)",
            "fr": "Heure d'Europe Centrale (Stockholm)",
            "de": "Mitteleuropäische Zeit (Stockholm)",
            "ru": "Центральноевропейское время (Стокгольм)",
            "ar": "توقيت وسط أوروبا (ستوكهولم)"
        }
    },
    "Europe/Athens": {
        "utc_offset": "+02:00",
        "name": {
            "zh": "东欧时间(雅典)",
            "en": "Eastern European Time (Athens)",
            "ja": "東ヨーロッパ時間(アテネ)",
            "ko": "동유럽 시간 (아테네)",
            "es": "Hora de Europa Oriental (Atenas)",
            "fr": "Heure d'Europe de l'Est (Athènes)",
            "de": "Osteuropäische Zeit (Athen)",
            "ru": "Восточноевропейское время (Афины)",
            "ar": "توقيت شرق أوروبا (أثينا)"
        }
    },
    "Europe/Istanbul": {
        "utc_offset": "+03:00",
        "name": {
            "zh": "土耳其时间(伊斯坦布尔)",
            "en": "Turkey Time (Istanbul)",
            "ja": "トルコ時間(イスタンブール)",
            "ko": "터키 시간 (이스탄불)",
            "es": "Hora de Turquía (Estambul)",
            "fr": "Heure de Turquie (Istanbul)",
            "de": "Türkische Zeit (Istanbul)",
            "ru": "Турецкое время (Стамбул)",
            "ar": "توقيت تركيا (إسطنبول)"
        }
    },
    "Asia/Dubai": {
        "utc_offset": "+04:00",
        "name": {
            "zh": "海湾标准时间(迪拜)",
            "en": "Gulf Standard Time (Dubai)",
            "ja": "湾岸標準時(ドバイ)",
            "ko": "걸프 표준시 (두바이)",
            "es": "Hora Estándar del Golfo (Dubái)",
            "fr": "Heure Standard du Golfe (Dubaï)",
            "de": "Golf-Standardzeit (Dubai)",
            "ru": "Стандартное время Персидского залива (Дубай)",
            "ar": "التوقيت القياسي الخليجي (دبي)"
        }
    },
    "Asia/Karachi": {
        "utc_offset": "+05:00",
        "name": {
            "zh": "巴基斯坦标准时间(卡拉奇)",
            "en": "Pakistan Standard Time (Karachi)",
            "ja": "パキスタン標準時(カラチ)",
            "ko": "파키스탄 표준시 (카라치)",
            "es": "Hora Estándar de Pakistán (Karachi)",
            "fr": "Heure Standard du Pakistan (Karachi)",
            "de": "Pakistanische Standardzeit (Karatschi)",
            "ru": "Пакистанское стандартное время (Карачи)",
            "ar": "التوقيت القياسي الباكستاني (كراتشي)"
        }
    },
    "Asia/Kolkata": {
        "utc_offset": "+05:30",
        "name": {
            "zh": "印度标准时间(加尔各答)",
            "en": "India Standard Time (Kolkata)",
            "ja": "インド標準時(コルカタ)",
            "ko": "인도 표준시 (콜카타)",
            "es": "Hora Estándar de India (Calcuta)",
            "fr": "Heure Standard de l'Inde (Calcutta)",
            "de": "Indische Standardzeit (Kalkutta)",
            "ru": "Индийское стандартное время (Калькутта)",
            "ar": "التوقيت القياسي الهندي (كولكاتا)"
        }
    },
    "Asia/Dhaka": {
        "utc_offset": "+06:00",
        "name": {
            "zh": "孟加拉标准时间(达卡)",
            "en": "Bangladesh Standard Time (Dhaka)",
            "ja": "バングラデシュ標準時(ダッカ)",
            "ko": "방글라데시 표준시 (다카)",
            "es": "Hora Estándar de Bangladés (Daca)",
            "fr": "Heure Standard du Bangladesh (Dacca)",
            "de": "Bangladeschische Standardzeit (Dhaka)",
            "ru": "Бангладешское стандартное время (Дакка)",
            "ar": "التوقيت القياسي لبنغلاديش (دكا)"
        }
    },
    "Asia/Bangkok": {
        "utc_offset": "+07:00",
        "name": {
            "zh": "中南半岛时间(曼谷)",
            "en": "Indochina Time (Bangkok)",
            "ja": "インドシナ時間(バンコク)",
            "ko": "인도차이나 시간 (방콕)",
            "es": "Hora de Indochina (Bangkok)",
            "fr": "Heure d'Indochine (Bangkok)",
            "de": "Indochina-Zeit (Bangkok)",
            "ru": "Индокитайское время (Бангкок)",
            "ar": "توقيت الهند الصينية (بانكوك)"
        }
    },
    "Asia/Jakarta": {
        "utc_offset": "+07:00",
        "name": {
            "zh": "印度尼西亚西部时间(雅加达)",
            "en": "Western Indonesia Time (Jakarta)",
            "ja": "西インドネシア時間(ジャカルタ)",
            "ko": "서인도네시아 시간 (자카르타)",
            "es": "Hora de Indonesia Occidental (Yakarta)",
            "fr": "Heure de l'Indonésie Occidentale (Jakarta)",
            "de": "Westindonesische Zeit (Jakarta)",
            "ru": "Западноиндонезийское время (Джакарта)",
            "ar": "توقيت غرب إندونيسيا (جاكرتا)"
        }
    },
    "Asia/Shanghai": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "中国标准时间(北京)",
            "en": "China Standard Time (Beijing)",
            "ja": "中国標準時(北京)",
            "ko": "중국 표준시 (베이징)",
            "es": "Hora Estándar de China (Pekín)",
            "fr": "Heure Standard de Chine (Pékin)",
            "de": "Chinesische Standardzeit (Peking)",
            "ru": "Китайское стандартное время (Пекин)",
            "ar": "التوقيت القياسي الصيني (بكين)"
        }
    },
    "Asia/Taipei": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "台湾标准时间(台北)",
            "en": "Taiwan Standard Time (Taipei)",
            "ja": "台湾標準時(台北)",
            "ko": "대만 표준시 (타이베이)",
            "es": "Hora Estándar de Taiwán (Taipéi)",
            "fr": "Heure Standard de Taïwan (Taipei)",
            "de": "Taiwanesische Standardzeit (Taipeh)",
            "ru": "Тайваньское стандартное время (Тайбэй)",
            "ar": "التوقيت القياسي لتايوان (تايبيه)"
        }
    },
    "Asia/Hong_Kong": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "香港时间",
            "en": "Hong Kong Time",
            "ja": "香港時間",
            "ko": "홍콩 시간",
            "es": "Hora de Hong Kong",
            "fr": "Heure de Hong Kong",
            "de": "Hongkong-Zeit",
            "ru": "Гонконгское время",
            "ar": "توقيت هونغ كونغ"
        }
    },
    "Asia/Singapore": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "新加坡标准时间",
            "en": "Singapore Standard Time",
            "ja": "シンガポール標準時",
            "ko": "싱가포르 표준시",
            "es": "Hora Estándar de Singapur",
            "fr": "Heure Standard de Singapour",
            "de": "Singapur-Standardzeit",
            "ru": "Сингапурское стандартное время",
            "ar": "التوقيت القياسي لسنغافورة"
        }
    },
    "Asia/Seoul": {
        "utc_offset": "+09:00",
        "name": {
            "zh": "韩国标准时间(首尔)",
            "en": "Korea Standard Time (Seoul)",
            "ja": "韓国標準時(ソウル)",
            "ko": "한국 표준시 (서울)",
            "es": "Hora Estándar de Corea (Seúl)",
            "fr": "Heure Standard de Corée (Séoul)",
            "de": "Koreanische Standardzeit (Seoul)",
            "ru": "Корейское стандартное время (Сеул)",
            "ar": "التوقيت القياسي الكوري (سيول)"
        }
    },
    "Asia/Tokyo": {
        "utc_offset": "+09:00",
        "name": {
            "zh": "日本标准时间(东京)",
            "en": "Japan Standard Time (Tokyo)",
            "ja": "日本標準時(東京)",
            "ko": "일본 표준시 (도쿄)",
            "es": "Hora Estándar de Japón (Tokio)",
            "fr": "Heure Standard du Japon (Tokyo)",
            "de": "Japanische Standardzeit (Tokio)",
            "ru": "Японское стандартное время (Токио)",
            "ar": "التوقيت القياسي الياباني (طوكيو)"
        }
    },
    "Australia/Perth": {
        "utc_offset": "+08:00",
        "name": {
            "zh": "澳大利亚西部时间(珀斯)",
            "en": "Australian Western Standard Time (Perth)",
            "ja": "オーストラリア西部標準時(パース)",
            "ko": "호주 서부 표준시 (퍼스)",
            "es": "Hora Estándar Occidental de Australia (Perth)",
            "fr": "Heure Standard de l'Ouest Australien (Perth)",
            "de": "Westaustralische Standardzeit (Perth)",
            "ru": "Западноавстралийское стандартное время (Перт)",
            "ar": "التوقيت القياسي لغرب أستراليا (بيرث)"
        }
    },
    "Australia/Sydney": {
        "utc_offset": "+10:00",
        "name": {
            "zh": "澳大利亚东部时间(悉尼)",
            "en": "Australian Eastern Standard Time (Sydney)",
            "ja": "オーストラリア東部標準時(シドニー)",
            "ko": "호주 동부 표준시 (시드니)",
            "es": "Hora Estándar Oriental de Australia (Sídney)",
            "fr": "Heure Standard de l'Est Australien (Sydney)",
            "de": "Ostaustralische Standardzeit (Sydney)",
            "ru": "Восточноавстралийское стандартное время (Сидней)",
            "ar": "التوقيت القياسي لشرق أستراليا (سيدني)"
        }
    },
    "Pacific/Guam": {
        "utc_offset": "+10:00",
        "name": {
            "zh": "关岛时间",
            "en": "Guam Time",
            "ja": "グアム時間",
            "ko": "괌 시간",
            "es": "Hora de Guam",
            "fr": "Heure de Guam",
            "de": "Guam-Zeit",
            "ru": "Время Гуама",
            "ar": "توقيت غوام"
        }
    },
    "Pacific/Noumea": {
        "utc_offset": "+11:00",
        "name": {
            "zh": "新喀里多尼亚时间(努美阿)",
            "en": "New Caledonia Time (Noumea)",
            "ja": "ニューカレドニア時間(ヌメア)",
            "ko": "뉴칼레도니아 시간 (누메아)",
            "es": "Hora de Nueva Caledonia (Numea)",
            "fr": "Heure de Nouvelle-Calédonie (Nouméa)",
            "de": "Neukaledonische Zeit (Noumea)",
            "ru": "Новокаледонское время (Нумеа)",
            "ar": "توقيت كاليدونيا الجديدة (نوميا)"
        }
    },
    "Pacific/Auckland": {
        "utc_offset": "+12:00",
        "name": {
            "zh": "新西兰标准时间(奥克兰)",
            "en": "New Zealand Standard Time (Auckland)",
            "ja": "ニュージーランド標準時(オークランド)",
            "ko": "뉴질랜드 표준시 (오클랜드)",
            "es": "Hora Estándar de Nueva Zelanda (Auckland)",
            "fr": "Heure Standard de Nouvelle-Zélande (Auckland)",
            "de": "Neuseeländische Standardzeit (Auckland)",
            "ru": "Новозеландское стандартное время (Окленд)",
            "ar": "التوقيت القياسي لنيوزيلندا (أوكلاند)"
        }
    },
    "Pacific/Fiji": {
        "utc_offset": "+12:00",
        "name": {
            "zh": "斐济时间",
            "en": "Fiji Time",
            "ja": "フィジー時間",
            "ko": "피지 시간",
            "es": "Hora de Fiyi",
            "fr": "Heure de Fidji",
            "de": "Fidschi-Zeit",
            "ru": "Время Фиджи",
            "ar": "توقيت فيجي"
        }
    },
    "Pacific/Tongatapu": {
        "utc_offset": "+13:00",
        "name": {
            "zh": "汤加时间(汤加塔普)",
            "en": "Tonga Time (Tongatapu)",
            "ja": "トンガ時間(トンガタプ)",
            "ko": "통가 시간 (통가타푸)",
            "es": "Hora de Tonga (Tongatapu)",
            "fr": "Heure de Tonga (Tongatapu)",
            "de": "Tonga-Zeit (Tongatapu)",
            "ru": "Время Тонга (Тонгатапу)",
            "ar": "توقيت تونغا (تونغاتابو)"
        }
    }
}
const tz = {}
tz.root = "/app/code/dxmodules/zoneinfo/"
tz.languages = ["zh", "en", "ja", "ko", "es", "fr", "de", "ru", "ar"]
tz.getTimeZones = function (language) {
    if (!language) {
        return timezones
    } else if (!tz.languages.includes(language)) {
        throw new Error(`Language ${language} not supported`)
    }
    const filterTimezones = {}
    for (const [key, timezone] of Object.entries(timezones)) {
        filterTimezones[key] = {
            utc_offset: timezone.utc_offset,
            name: timezone.name[language]
        }
    }
    return filterTimezones
}
tz.updateTimeZone = function (timezoneKey) {
    if (!timezoneKey) {
        throw new Error("Timezone key is required")
    }
    const path = `${tz.root}${timezoneKey}`
    if (!dxstd.exist(path)) {
        throw new Error(`Timezone ${timezoneKey} not found`)
    }
    try {
        // avoid windows treat this command as virus
        let cmd = `${['c', 'p'].join('')} ${path} /etc/localtime`
        dxos.systemBrief(cmd)
        logger.info(`updated timezone to ${timezoneKey}, should reboot device to take effect`)
    } catch (error) {
        throw new Error(`Failed to update timezone ${timezoneKey}: ${error.message}`)
    }
}
tz.reboot = function () {
    dxos.systemBrief('sync')
    dxos.asyncReboot(2)
}
 
export default tz