Commit Graph
2631 Commits
Author SHA1 Message Date
German KhokhlovandClaude Opus 5.5 d33f914a1c i18n(ar): reset letter-spacing on every Arabic container
A container that only holds a translate="no" span (a provider name in the
Global Context lines) kept its tracking and tore its own Arabic text into
separate glyphs. Only the Latin span itself keeps its letter-spacing now.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 15:23:06 +04:00
German KhokhlovandClaude Opus 5.5 0d28150e22 i18n(de): fixes from the screenshot review
- Labels that ran out of their buttons: EXPORT / EXPORT A stay English
  (EXPORTIEREN was cut to EXPORTI…), the imagery mode reads VGL. KARTE,
  the scene run log PROTOKOLL (it broke as LAUFPROTOKOL/L), the dock voice
  status SPRACHE N. V., and the Esri imagery note fits its line.
- The cyclone layer is Sturmwarnungen (no hyphenated break in the layer
  list); Erdbeben (24 h) matches the other hour readouts; retry countdowns
  get a space before s; the Mapillary hint names the Straßenebene layer.
- The cyclone source's timeout and malformed-snapshot errors were plain
  English in every language: mark them like the wind source does and
  translate them in de, es, ru, zh-CN and zh-Hant.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 15:18:49 +04:00
German KhokhlovandClaude Opus 5.5 d6ecaca957 i18n(ja): fit labels found in the screenshot review
- Shorter layer and segment labels that wrapped or broke mid-word in the
  narrow panels: ALPRカメラ, 宇宙ミッション 30日, 地図と比較, 対象.
- Window readouts put the value after the label (空/海ウィンドウ 250 km),
  so a unit never runs into Japanese text.
- 情勢図 for the GhostMaps intel picture; Googleストリートビュー joined like
  any Latin product name in the guide.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 15:13:52 +04:00
German KhokhlovandClaude Opus 5.5 e305447713 style(ja): CJK label rules for Japanese
cjk.css now covers Japanese as well as Chinese: tight tracking, the 9px
floor on dock voice labels and layer buttons, whole travel-mode and preset
labels, catalog-case units in the HUD and the taller Recent Imagery cards.
Japanese also gets strict line breaking (no line starts with ー or a small
kana) and unbroken segment labels (すべて, 平面). Chinese rendering is
unchanged: :is(:lang(zh), :lang(ja)) keeps the :lang(zh) specificity.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 15:13:52 +04:00
German KhokhlovandClaude Opus 5.5 56a36df006 i18n(pt): fit cockpit labels found in the screenshot review
- The cockpit news kicker no longer cuts off: regional news reads «notícias
  locais», the cycle button «CICLO DESLIG.», the subtitle «ÚLTIMAS NOTÍCIAS
  DO LOCAL».
- Contact header fits in two lines («AR/MAR 250 KM · INSTALAÇÕES: ATÉ
  100 KM»); ground speed reads KT like the rest of the HUD.
- A space between a number and s/h/d («nova tentativa em 30 s», «há 5 h»),
  and «aproxime-se de uma rua» for zoom-to-street hints.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 15:10:32 +04:00
German KhokhlovandClaude Opus 5.5 d95bffb5fd i18n(fr): fit French labels found in the screenshot review
Shorter wording where the French text ran out of its button, chip or
collapsed card at 1600×1100: the DATA LAYERS launcher (COUCHES), Recent
Imagery buttons and hints (CETTE VUE, VS CARTE, EXP. A), the ENABLING /
DISABLING layer chip, the voice detail line and the location search
placeholder. Also the CCTV range readout gets a space before m, the radio
privacy note reads naturally, and the cockpit air/sea window is shorter.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 15:09:45 +04:00
Aditya 420d64cecc docs(changelog): add #1451 fragment 2026-10-28 16:37:01 +05:30
German KhokhlovandClaude Opus 5.5 9de9106883 i18n(it): shorten labels that wrapped or clipped on screen
From the screenshot review: the Recent Imagery buttons (SELEZIONA, USA
VISTA, VS MAPPA BASE) no longer clip or wrap, the layer state chip reads
AVVIO / ARRESTO so a layer name keeps two lines, the cockpit contact header
fits two lines (ARIA/MARE, SITI), and the Bhote Koshi play buttons fit on one
line (AVVIA). The post-event year follows the label, as the reference one does.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 15:03:34 +04:00
Aditya 50e06181c6 docs(changelog): add #1450 fragment 2026-10-28 16:25:12 +05:30
Aditya 0e0b82f511 docs(changelog): add #1449 fragment 2026-10-28 16:25:05 +05:30
Aditya 58e9f5ab2e docs(changelog): add #1448 fragment 2026-10-28 16:24:57 +05:30
Aditya 76a3d47e56 docs(changelog): add #1446 fragment 2026-10-28 16:24:42 +05:30
Aditya 81cf79157c docs(changelog): add #1445 fragment 2026-10-28 16:24:34 +05:30
Aditya 5d2f6a3ce5 docs(changelog): add #1444 fragment 2026-10-28 16:24:25 +05:30
Aditya df71c37d27 docs(changelog): add #1443 fragment 2026-10-28 16:24:17 +05:30
Aditya 22b4169a89 docs(changelog): add #1442 fragment 2026-10-28 16:24:09 +05:30
Aditya fdcbcdaaef docs(changelog): add #1441 fragment 2026-10-28 16:24:02 +05:30
German KhokhlovandClaude Opus 5.5 4c3e366211 i18n(ar): keep values whole in right-to-left text
Fixes from the Arabic screenshot review:

- t() isolates every interpolated value in RTL locales (U+2068…U+2069), so
  a time (10/28 09:00 UTC), a code or an English name keeps its order inside
  an Arabic sentence; coordinates (30.326° ش) are isolated too. No-op in
  left-to-right languages.
- The cockpit position readout reads right to left again now that its
  coordinates are isolated; gauges, tapes and roll counters stay LTR.
- The start window's arrows point along the reading direction; FM seek and
  the glyph-only mini transport stay left to right, the worded PREV / PLAY /
  NEXT row follows the page; the Bhote Koshi clock stays a number.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 14:27:03 +04:00
Aditya c6f437ed52 fix(traffic): stop a few matched roads reading as "no matches"
The live flow status derived its wording from the rounded coverage
percent, so 1 matched dot among 300 rounded to 0% and read
"SIMULATED ... (no matches)", and 1 simulated dot among 300 rounded to
100% and dropped "Unmatched: simulated". Coverage now stays within 1-99%
whenever both matched and simulated dots are shown.
2026-10-28 15:34:51 +05:30
Aditya e4a964375a fix(annotations): label a 996 m line or route as 1.0 km, not 1000 m
Placed route, arrow and drawn-line labels picked metres before rounding
to ten metres, so anything from 995 m to 1 km read "1000 m", even where
the draw hint for the same line read "1.0 km". The label now rounds
first, then picks the unit, and does the same at the 10 km cut, where
9,960 m read "10.0 km".
2026-10-28 15:34:28 +05:30
Aditya d1bbfdbca5 fix(draw): show a 9,999.6 m² area as 1.0 ha, not 10000 m²
The draw hint picked m², ha or km² from the raw area and then rounded,
so 9,999.5 m² up to a hectare read "10000 m²" and about 999,500 m² up
to a square kilometre read "100.0 ha". It now rounds first, as the line
measure already does.
2026-10-28 15:25:08 +05:30
Aditya c7377362a5 fix(local-adsb): show a decoder feed's GNSS-sourced vertical rate
dump1090-fa and readsb file an aircraft's vertical rate under geom_rate
instead of baro_rate when its source is GNSS. The decoder-feed adapter
read only baro_rate, so those aircraft showed "V/S —" on the Local ADS-B
card. It now falls back to geom_rate; a sent baro_rate still wins.
2026-10-28 15:18:37 +05:30
Aditya a2c813280e fix(missions): keep the replay countdown real-time when the speed changes
Moving the replay-speed slider during the pre-launch hold or countdown
rescaled the time left to liftoff, so 0.25x turned T-8 into T-32 and 4x
into T-2. The speed change now skips a replay that has not lifted off;
mission time already flown is still preserved as before.
2026-10-28 15:16:54 +05:30
Aditya 6364817b5b fix(directions): show a 9.96 km route as 10 km, not 10.0 km
routeDistanceText picked one decimal while the raw kilometres were under
10, then rounded them for display, so 9.95 km or more read "10.0 km".
It now picks the unit from the rounded tenth, as it already does at the
metre/kilometre boundary.
2026-10-28 15:16:45 +05:30
Aditya 065d7f4f8b fix(alpr): show a 359.6° camera bearing as 0°, not 360°
The selected ALPR card rounded a mapped camera:direction without
wrapping, so a camera facing 359.5° or more read "DIRECTION 360°". The
rounded bearing now wraps to 0°.
2026-10-28 15:15:16 +05:30
Aditya 182e6ceddd fix(tools): list a split submarine cable once in find_submarine_cables
TeleGeography stores 17 cables (2Africa, Echo, Hawaiki...) as several
features under one id, and the tool made a row per feature, so "Echo"
read "3 submarine cables" and area counts ran high. Rows are now unique
by cable id, and a cable still matches when any of its parts does.
2026-10-28 15:13:15 +05:30
Aditya f73cd5935b fix(missions): run the full T-10 replay countdown after the tile hold
Replay Ascent schedules liftoff 15 s out: a 5 s tile-preparation hold,
then a 10 s countdown. The hold ended 5 s before liftoff instead of 10,
so the replay sat on the pad for 10 s and the countdown began at T-5.
The hold now ends at T-10, and the countdown runs T-10 to T-1.
2026-10-28 15:13:13 +05:30
Aditya 812cdf6be7 fix(transit): show a reported 359.6° bearing as hdg 0°, not hdg 360°
The selected-vehicle card rounded the operator's reported bearing without
wrapping, so a GTFS-Realtime vehicle heading 359.5° or more read
"reported hdg 360°". The card now wraps after rounding: 359.6° reads
"reported hdg 0°", 359.4° still reads "reported hdg 359°".
2026-10-28 15:09:27 +05:30
Aditya 940050d4e5 fix(cctv): show a camera facing 359.6° as HDG 0°, not HDG 360°
The CCTV HUD heading token and the camera panel's meta line rounded the
bearing without wrapping, so a camera facing 359.5° or more (a feed
bearing, or a heading calibrated just west of north) read "HDG 360°".
Both now wrap after rounding: 359.6° reads "HDG 0°", 359.4° "HDG 359°".
2026-10-28 15:06:07 +05:30
Aditya 3321affaa6 test(voice): check a sea-level altitude is still spoken 2026-10-28 15:02:55 +05:30
German KhokhlovandClaude Opus 5.5 33985138ef docs(i18n): Arabic language notes and right-to-left guidance
- docs/translations/ar.md: style, Western digits and direction, units,
  the six plural forms and the glossary.
- TRANSLATORS.md and CURRENT-STATE.md list Arabic and say how a
  right-to-left language mirrors the chrome.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 13:28:52 +04:00
German KhokhlovandClaude Opus 5.5 06370d8676 i18n(ar): mirror the layout right to left
- The title, style indicator and both rails swap sides in RTL through logical
  properties (inset-inline-*, margin-inline-*, border-inline-start); LTR
  computes the same values. The Display/Context rail keeps its physical
  `right` for the credit-clearance model and swaps in rtl.css above 720px.
- rtl.css: no letter-spacing on Arabic (it tears joined letters apart);
  Noto Sans Arabic leads the Arabic font stacks so words are not set in a
  fixed-pitch fallback; the intel HUD and cockpit instruments stay a
  left-to-right instrument overlay; media transport and the radio dial stay
  left to right; feed headlines and station names take their own direction;
  the moved rail's arrows flip.
- isolate(): a quantity in RTL text (2.7 كم, -18.0°) is wrapped in
  first-strong isolates so its digits do not join a neighbouring Latin run.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 13:28:23 +04:00
German KhokhlovandClaude Opus 5.5 9f71a62d12 i18n(fr): ship French in the language picker
- Register fr: catalog in CATALOGS, LOCALES and LOCALE_NAMES (Français);
  any fr-* browser tag (fr-CA, fr-BE, fr-CH) maps to it.
- package-boundaries.json lists fr.json next to the other catalogs.
- Picker and locale tests cover the new row and its local names.
- docs/translations/fr.md: style, typography, plurals and glossary;
  TRANSLATORS.md and CURRENT-STATE.md list French as shipped.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 13:00:14 +04:00
German KhokhlovandClaude Opus 5.5 402f56958f i18n(fr): translate the rest of the French catalog
- Translate the remaining 1,865 strings: aviation, maritime (AIS), weather
  and remote-sensing terms, radio, routing, scenes, voice and setup.
- Review the 862 entries from #907: LIVE becomes DIRECT / en direct, stale
  becomes obsolète, FIRMS detections are feux actifs, replay is rejeu, the
  AIS ship types use the French terms (PILOTINE, SERVITUDE, POLICE), keys
  stay Space / Esc / Enter as docs/TRANSLATORS.md asks, and NEXT/PREVIOUS
  chips match PREV (SUIV. / PRÉC.).
- French typography: narrow no-break space before : ; ? ! and %, inside
  « », and … for ellipsis; plural entries get the many form (exact
  millions, "de").
- same-as-english.json: codes, units, genre and product names that French
  spells the same as English.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 13:00:07 +04:00
German KhokhlovandClaude Opus 5.5 ed40201481 i18n(ja): ship Japanese
- Register ja: CATALOGS, LOCALES, LOCALE_NAMES (日本語) and the package
  boundaries; ja and ja-JP tags select it.
- Japanese unit words follow the number directly, as in the catalog:
  formatQuantity writes 5分 and 1時間5分 (km and kt keep the space), and
  formatRelativeTime drops the space CLDR puts in 5 分前.
- Tests: locale tags, picker order, Intl output, durations and the
  ramp/exit/lane wording in Japanese.
- docs/translations/ja.md: style, units, plurals and glossary; ja added to
  TRANSLATORS.md and CURRENT-STATE.md.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:59:32 +04:00
German KhokhlovandClaude Opus 5.5 7ad073aa9c i18n(ja): translate the remaining strings and review #913
- Translate the 1,875 strings #913 did not cover (2,727 in all), for a
  tactical HUD: aviation, maritime, weather and imagery terms, counters
  next to numbers (機, 隻, 基, 件), year-first dates.
- Review the contributor entries: full-width punctuation ():? and …,
  no space between Japanese and Latin, one katakana form per term
  (ブラウザー, ビューアー), and fixes where the meaning was off:
  NO PLACE LEFT BEHIND, LEVEL (horizon), CURATED / RAW PRIOR (CCTV
  calibration), STALE (更新遅延, not 古い), rocket stage (段), SAR vessels,
  T minus, POWER UP.
- List the codes, units and product names that stay as in English.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:59:23 +04:00
German KhokhlovandClaude Opus 5.5 1146946207 i18n(uk): complete and ship Ukrainian
- Translate the remaining 1,895 strings for the current UI (Bhote Koshi
  event, weather, imagery, street level, directions, SDR, voice, scenes,
  import) and review meirm's 832 entries from #312: 134 edited for
  Ukrainian HUD terms (КУРС/ПЕЛ./ШЛЯХ/ПРИЗН., Л/П, ОНЛАЙН for LIVE,
  Cyrillic units КМ, ВУЗ, ФТ, МВт), vessel types, number agreement and
  the ʼ apostrophe throughout.
- Register uk: catalog, LOCALES, LOCALE_NAMES (Українська), package
  boundaries, same-as-English codes; picker and plural tests cover the
  four Ukrainian forms.
- docs/translations/uk.md: style, plurals, units and glossary.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:57:54 +04:00
German KhokhlovandClaude Opus 5.5 0b928b6810 i18n(ar): register Arabic as the first right-to-left language
- Add ar to LOCALES (picker name العربية) and RTL_LOCALES, so <html dir>
  turns rtl; any ar-* tag maps to it.
- Intl formatters get ar-u-nu-latn: numbers and dates keep Western digits
  like the catalog, whatever the browser's ICU picks for Arabic regions.
- HUD quantities keep a space before an Arabic unit (2069.0 كم), as in
  Chinese, instead of running digits into the word.
- Codes and product names that stay Latin go to same-as-english.json.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:55:20 +04:00
German KhokhlovandClaude Opus 5.5 94dc2736e1 i18n(ar): translate the remaining Arabic strings
- Translate the 1,875 strings #915 did not cover (2,727 in all), with all
  six CLDR plural forms where tn() asks for them.
- Review pass on the #915 entries: LIVE reads مباشر (not حي, "alive"),
  STALE reads متقادم, ON/OFF pair as مفعّل/متوقف; distances and speeds use
  Arabic units (كم، م، قدم، عقدة) instead of Latin KM/FT/KTS; HUD stays HUD;
  quotes are «» and a few clumsy count phrasings are rebuilt.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:55:12 +04:00
German KhokhlovandClaude Opus 5.5 dfa7ac98a7 i18n(de): complete and ship German
- Translate the remaining 1,868 strings in a neutral infinitive style (no
  Sie/du), with German compounds, decimal commas and CLDR one/other plurals.
- Review the #908 entries: knots are kn everywhere, the avionics codes BRG,
  CRS and DEST stay English like HDG and SPD, expand/collapse is
  ausklappen/einklappen, the radio toggle reads EIN/AUS, density SPARSE is
  DÜNN, the Thermal style is Wärmebild, German quotes in the shot prompt.
- Register de: catalog, LOCALES, LOCALE_NAMES (Deutsch), package boundaries,
  same-as-english (codes, product names, music genres, units).
- Tests: picker order and keyboard model with Deutsch, de/de-AT/de_CH
  normalization, browser de-DE resolves to German.
- docs/translations/de.md: style, plurals, units and glossary; TRANSLATORS.md
  and CURRENT-STATE.md list German.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:53:49 +04:00
German KhokhlovandClaude Opus 5.5 8269f0e4e6 i18n(pt): complete and ship Brazilian Portuguese
- Translate the remaining 1,868 strings (pt-BR, as in #909) and review the
  contributor entries: HUD codes BRG/SPD/RANGE stay as in the other
  languages, sentence-case layer and scene names, Space key named as on the
  keyboard, short PREV/NEXT/ON/OFF chips, and the CLDR many form (exact
  millions take «de») on every plural.
- Register pt: any pt tag (pt-BR, pt-PT) maps to it; the picker shows
  «Português (Brasil)».
- Codes, units and product names identical to English go to
  same-as-english.json.
- docs/translations/pt.md: style, plurals, units and glossary.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:52:01 +04:00
German KhokhlovandClaude Opus 5.5 c4dfee6e5c i18n(it): ship Italian
- Register it: catalog in index.js, LOCALES and LOCALE_NAMES (Italiano);
  it-IT, it-CH and other it tags select it.
- List it.json with the other catalogs in package-boundaries.json.
- docs/translations/it.md: style, plurals and glossary; Italian in the
  shipped lists of TRANSLATORS.md and CURRENT-STATE.md.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:51:02 +04:00
German KhokhlovandClaude Opus 5.5 2172183dc7 i18n(it): translate the remaining strings and review #912
- Translate the 1,868 strings #912 does not cover: directions, weather and
  wind, cyclones, Recent Imagery, Street Level, GNSS, the Bhote Koshi
  reconstruction, scenes and sharing, local SDR, voice and key setup.
- Add the Italian `many` plural form (exact millions) to every plural entry.
- Review the #912 entries: fix RIMORCHIATORE, POWER UP (ACCENDI), DENSO,
  minutes as "min", sentence case for layer and scene names, keyboard keys
  kept in English (Space, Enter), and the SIG/NOTIZIE/LOCALE tab names.
- List codes, product names and words Italian spells as English in
  same-as-english.json.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:51:02 +04:00
Enzo Abyie 7d7c535dc7 i18n(de): German strings from #908
The German locale by abiyeenzo (#908), converted from its namespaced JS
catalogs to the English-keyed de.json: 859 entries whose English still
matches the current UI.
2026-10-28 12:37:52 +04:00
Enzo Abyie 6167aae6e4 i18n(fr): French strings from #907
The French locale by abiyeenzo (#907), converted from its namespaced JS
catalogs to the English-keyed fr.json: 862 entries whose English still
matches the current UI.
2026-10-28 12:37:35 +04:00
Enzo Abyie ce17d0cade i18n(pt): Portuguese strings from #909
The Brazilian Portuguese locale by abiyeenzo (#909), converted from its
namespaced JS catalogs to the English-keyed pt.json: 859 entries whose
English still matches the current UI.
2026-10-28 12:37:19 +04:00
Enzo Abyie 8785f4c886 i18n(ar): Arabic strings from #915
The Arabic locale by abiyeenzo (#915), converted from its namespaced JS
catalogs to the English-keyed ar.json: 852 entries whose English still
matches the current UI.
2026-10-28 12:37:14 +04:00
Meir Michanie e2acee4b0a i18n(uk): Ukrainian strings from #312
The Ukrainian locale by meirm (#312), converted from its namespaced JS
catalogs to the English-keyed uk.json: 832 entries whose English still
matches the current UI.
2026-10-28 12:37:13 +04:00
Enzo Abyie bdd24798db i18n(ja): Japanese strings from #913
The Japanese locale by abiyeenzo (#913), converted from its namespaced JS
catalogs to the English-keyed ja.json: 852 entries whose English still
matches the current UI.
2026-10-28 12:37:08 +04:00
Enzo Abyie 978cd72ac2 i18n(it): Italian strings from #912
The Italian locale by abiyeenzo (#912), converted from its namespaced JS
catalogs to the English-keyed it.json: 859 entries whose English still
matches the current UI.
2026-10-28 12:36:27 +04:00