i18n: add Swedish (sv)

Adds a complete Swedish catalog (2,961 messages) and registers sv in the
locale list, catalogs, language picker and package boundaries. Browsers set
to Swedish get it at once; ?lang=sv or the language picker choose it
elsewhere. Numbers and dates come out Swedish from Intl.

- docs/translations/sv.md: style (imperative without a pronoun, closed
  compounds, decimal comma, space before units and %) and the glossary.
- Entries that stay identical to English on purpose (codes such as HDG and
  FOV, product, place and source names) are listed under sv in
  same-as-english.json.
- The picker-order test places Svenska after Português.
- docs/CURRENT-STATE.md and docs/TRANSLATORS.md list the new language.

The translation comes from God's Eye View Sverige, a Swedish fork, and was
brought up to date with main (wildlife sightings, event age filter, traffic
styles and the rest).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Kaj ObstandClaude Opus 5.5 committed 2026-11-08 13:31:12 +01:00
1 parent 52187c91d1
commit fbd74bb80a
9 files changed
+3492 -3

No files matched your search

+1 -1
View File
@@ -4285,7 +4285,7 @@ test:track` 43 tracking invariants · headless QA harnesses under
### Interface localization (October 2026) ### Interface localization (October 2026)
Shipped locales: **en** (source and fallback), **ar**, **de**, **es**, **fr**, **it**, **ja**, **pt** (Brazilian Portuguese), **ru**, **uk**, **zh-CN** and **zh-Hant**. The code lives in Shipped locales: **en** (source and fallback), **ar**, **de**, **es**, **fr**, **it**, **ja**, **pt** (Brazilian Portuguese), **ru**, **sv**, **uk**, **zh-CN** and **zh-Hant**. The code lives in
`src/i18n/`. How to mark UI text: [`docs/I18N.md`](./I18N.md); translator workflow: `src/i18n/`. How to mark UI text: [`docs/I18N.md`](./I18N.md); translator workflow:
[`docs/TRANSLATORS.md`](./TRANSLATORS.md). [`docs/TRANSLATORS.md`](./TRANSLATORS.md).
+2 -2
View File
@@ -1,6 +1,6 @@
# Translating God's Eye View # Translating God's Eye View
Shipped languages: **English** (source and fallback), **Arabic** (`ar`), **German** (`de`), **Spanish** (`es`), **French** (`fr`), **Italian** (`it`), **Japanese** (`ja`), **Brazilian Portuguese** (`pt`), **Russian** (`ru`), **Ukrainian** (`uk`), **Simplified Chinese** (`zh-CN`) and **Traditional Chinese** (`zh-Hant`). Shipped languages: **English** (source and fallback), **Arabic** (`ar`), **German** (`de`), **Spanish** (`es`), **French** (`fr`), **Italian** (`it`), **Japanese** (`ja`), **Brazilian Portuguese** (`pt`), **Russian** (`ru`), **Ukrainian** (`uk`), **Simplified Chinese** (`zh-CN`), **Traditional Chinese** (`zh-Hant`) and **Swedish** (`sv`).
## How it works ## How it works
@@ -63,4 +63,4 @@ These are contracts, not copy: layer ids and registry keys, status enums and oth
## Language notes ## Language notes
Each language keeps its glossary, plural forms, units and style in its own file, `docs/translations/<code>.md`: [Arabic](./translations/ar.md), [German](./translations/de.md), [Spanish](./translations/es.md), [French](./translations/fr.md), [Italian](./translations/it.md), [Japanese](./translations/ja.md), [Brazilian Portuguese](./translations/pt.md), [Russian](./translations/ru.md), [Ukrainian](./translations/uk.md), [Simplified Chinese](./translations/zh-CN.md), [Traditional Chinese](./translations/zh-Hant.md). Read it before translating, and add a term there when you settle on one. Each language keeps its glossary, plural forms, units and style in its own file, `docs/translations/<code>.md`: [Arabic](./translations/ar.md), [German](./translations/de.md), [Spanish](./translations/es.md), [French](./translations/fr.md), [Italian](./translations/it.md), [Japanese](./translations/ja.md), [Brazilian Portuguese](./translations/pt.md), [Russian](./translations/ru.md), [Ukrainian](./translations/uk.md), [Simplified Chinese](./translations/zh-CN.md), [Traditional Chinese](./translations/zh-Hant.md), [Swedish](./translations/sv.md). Read it before translating, and add a term there when you settle on one.
+84
View File
@@ -0,0 +1,84 @@
# Swedish (`sv`)
Catalog: `src/i18n/locales/sv.json`. General rules: [TRANSLATORS.md](../TRANSLATORS.md).
Translation source: [God's Eye View Sverige](https://github.com/Kajjan7610/Gods-view-sweden) by Kaj Obst, November 2026.
## Style
- Standard Swedish as in Swedish software and on Swedish authority sites (SMHI, Trafikverket, Polisen).
- Actions and hints use the imperative without a pronoun: «Försök igen», «Klicka på en kamera för att aktivera den», «Välj en tagning först», «Tillåt mikrofonen och försök igen». Avoid «du»/«ni»; "your" becomes «egen» or is left out: «Egen RTL-SDR-mottagare», «Stationen ser din IP-adress» only where a person must be addressed.
- Sentence case, not Title Case: "Live Flights" → «Liveflyg», "Provider Settings" → «Leverantörsinställningar». UPPERCASE English stays UPPERCASE: «LIVEDATA AV», NOT AN ALL-CLEAR → «INTE FARA ÖVER».
- Compounds are written as one word, with a hyphen after a name, code or abbreviation: «datalager», «väderrutor», «TomTom-nyckel», «AIS-fartyg», «Street View-reserv». Never split a compound with a space.
- Short labels, chips and HUD readouts stay short; use a standard abbreviation with a period over a wrapped line: RÄCKV., HAST., NEDERB., ÖVR., MEDD., FÖRST., JMF., KAL.
- The avionics codes HDG, BRG, CRS, DEST, SPD, ALT, GS, TRK, V/S, FOV and SQUAWK stay in English, as in the cockpit. Words in a sentence are translated: heading → «kurs», bearing → «bäring», range → «räckvidd».
- A dash between clauses is a spaced en dash « – ». Quotes are ”…” (Swedish closing quotes on both sides).
- Status and waiting messages: «Väntar på uppdatering», «Laddar …». Reasons after a dash stay lower case: «Scenen sparades inte – projektet är större än 5 MiB».
- A layer named in a sentence takes its panel name in quotes: «Lagret ”Liveflyg” är inte aktiverat».
- Rolling windows say their length: LAST YEAR → «SENASTE 12 MÅN.», LAST MONTH → «SENASTE 30 DAGARNA».
- Keyboard keys: Mellanslag, Backsteg, Skift; Esc, Enter, Tab and letter keys stay.
- Decimal comma in fixed text: «M4,4», «28,2710° N». Thousands separator is a space: «1 000 km». Formatted numbers come from `Intl` and are already Swedish.
- Units: km, m, km/h, m/s, kn (knop), ft (fot), hPa, MW, h, min, s, d (dygn, in short readouts); in UPPERCASE text KM, KM/H, KN, FT, MIN, H, D. A space between number and unit, also before %: «{value} m», «{count} min», «50 %». `°` sticks to the number.
- "ago": «för {count} min sedan», short «{count} min sedan». When a placeholder already holds a localized "ago" text (`{age}`, `{ago}`), do not add «sedan» again.
- Compass points use O for öst and V for väst, as SMHI does: N, NNO, NO, ONO, O, OSO, SO, SSO, S, SSV, SV, VSV, V, VNV, NV, NNV; hemisphere letters N, S, O, V.
- Routing: «Sväng {direction} in på {road}», «Fortsätt {direction}», «Ta {exit} avfarten» with ordinals «2:a», «3:e».
## Plurals
A `tn()` entry needs two forms. `Intl.PluralRules('sv')` picks:
| Form | Counts | Example |
| ------- | --------------------------- | ----------- |
| `one` | 1 | 1 kamera |
| `other` | everything else: 0, 2, 1,5… | 3 kameror |
Abbreviated units and codes do not change: «{count} MEDD.», «{count} HÖRDA».
## Glossary
| English | Svenska |
| ---------------------------------------------- | --------------------------------------------------------------- |
| layer / data layer | lager / datalager |
| feed / source / data source | flöde / källa / datakälla |
| LIVE (status) / live data | LIVE / livedata |
| SIMULATED | SIMULERAT |
| stale / degraded / unavailable | inaktuell / begränsad / otillgänglig |
| retry / retrying / retrying slowly | nytt försök / försöker igen / försöker igen med längre intervall |
| fallback | reserv |
| key (API key) / POWER UP / POWERED UP | nyckel / KOPPLA PÅ / PÅKOPPLAD |
| Provider Settings | Leverantörsinställningar |
| ON / OFF (state chips) | PÅ / AV |
| enable / disable | aktivera / inaktivera |
| globe / map / map source / basemap | glob / karta / kartkälla / bakgrundskarta |
| aircraft / flight / military flights | luftfartyg (short labels: flygplan) / flygning / militärflyg |
| vessel, ship | fartyg |
| satellite / shell (Starlink) | satellit / skal |
| launch (rocket) / launch site / space mission | uppskjutning / uppskjutningsplats / rymduppdrag |
| contact / tracking | kontakt / följning |
| installation / site | anläggning / plats |
| camera / CCTV camera | kamera / CCTV-kamera |
| earthquake / active fire / fire perimeter | jordbävning / aktiv brand / brandgräns |
| cyclone / advisory (NHC) / cone | cyklon / bulletin / kon |
| radio station / broadcast FM | radiostation / FM-radio |
| road / traffic flow | väg / trafikflöde |
| transit / bike share | kollektivtrafik / hyrcyklar |
| scene / shot / capture shot / camera move | scen / tagning / spara tagning / kameraåkning |
| anchor / data pack / bundle | ankare / datapaket / paket |
| briefing / panel / dock | genomgång / panel / docka |
| preset / visual preset | förval / visuellt förval |
| Scope (circular viewport mask) / keyhole | Scope / nyckelhål |
| overlay / detection overlay | överlägg / detekteringsöverlägg |
| Clean UI | Rent gränssnitt |
| Night vision / Thermal / Snow (styles) | Mörkerseende / Värmekamera / Snö |
| heading / altitude / ground speed | kurs / höjd / markfart |
| RANGE / PITCH / HGT (CCTV calibration chips) | RÄCKV. / LUTN. / HÖJD |
| PREV / NEXT / RESUME | FÖRRA / NÄSTA / FORTSÄTT |
| nearest (spatial) | närmaste |
| expand / collapse | fäll ut / fäll ihop |
| Street Level / Street View (Google) | Gatunivå / Street View |
| Recent Imagery | Senaste bilder |
| voice (control) / voice session | röststyrning / röstsession |
| click / tap / press a key | klicka / tryck / tryck på tangenten |
| card / label (on the map) / clear (layers) | kort / etikett / stäng av |
| frame (weather, video) / image | bildruta / bild |
| road condition / incident / roadwork | väglag / händelse / vägarbete |
+46
View File
@@ -73,6 +73,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -640,6 +641,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -688,6 +690,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -729,6 +732,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -772,6 +776,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -799,6 +804,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -829,6 +835,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -866,6 +873,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -915,6 +923,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -942,6 +951,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -1122,6 +1132,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -1311,6 +1322,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -1396,6 +1408,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -1454,6 +1467,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -1526,6 +1540,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -1563,6 +1578,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -1604,6 +1620,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -1642,6 +1659,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -1683,6 +1701,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -1733,6 +1752,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -1780,6 +1800,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -1842,6 +1863,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -1879,6 +1901,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -1936,6 +1959,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -2007,6 +2031,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -2045,6 +2070,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -2094,6 +2120,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -2124,6 +2151,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -2188,6 +2216,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -2266,6 +2295,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -3197,6 +3227,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -3922,6 +3953,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -4098,6 +4130,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -4130,6 +4163,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -4175,6 +4209,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -4213,6 +4248,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -4319,6 +4355,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -4392,6 +4429,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -4672,6 +4710,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -4726,6 +4765,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -4788,6 +4828,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -4812,6 +4853,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -4880,6 +4922,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -4929,6 +4972,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json" "src/i18n/locales/zh-Hant.json"
@@ -5127,6 +5171,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
@@ -5173,6 +5218,7 @@
"src/i18n/locales/ja.json", "src/i18n/locales/ja.json",
"src/i18n/locales/pt.json", "src/i18n/locales/pt.json",
"src/i18n/locales/ru.json", "src/i18n/locales/ru.json",
"src/i18n/locales/sv.json",
"src/i18n/locales/uk.json", "src/i18n/locales/uk.json",
"src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-CN.json",
"src/i18n/locales/zh-Hant.json", "src/i18n/locales/zh-Hant.json",
+2
View File
@@ -26,6 +26,7 @@ import it from './locales/it.json' with { type: 'json' };
import ja from './locales/ja.json' with { type: 'json' }; import ja from './locales/ja.json' with { type: 'json' };
import pt from './locales/pt.json' with { type: 'json' }; import pt from './locales/pt.json' with { type: 'json' };
import ru from './locales/ru.json' with { type: 'json' }; import ru from './locales/ru.json' with { type: 'json' };
import sv from './locales/sv.json' with { type: 'json' };
import uk from './locales/uk.json' with { type: 'json' }; import uk from './locales/uk.json' with { type: 'json' };
import zhCN from './locales/zh-CN.json' with { type: 'json' }; import zhCN from './locales/zh-CN.json' with { type: 'json' };
import zhHant from './locales/zh-Hant.json' with { type: 'json' }; import zhHant from './locales/zh-Hant.json' with { type: 'json' };
@@ -39,6 +40,7 @@ const CATALOGS = Object.freeze({
ja, ja,
pt, pt,
ru, ru,
sv,
uk, uk,
'zh-CN': zhCN, 'zh-CN': zhCN,
'zh-Hant': zhHant, 'zh-Hant': zhHant,
+2
View File
@@ -18,6 +18,7 @@ export const LOCALES = Object.freeze([
'ja', 'ja',
'pt', 'pt',
'ru', 'ru',
'sv',
'uk', 'uk',
'zh-CN', 'zh-CN',
'zh-Hant', 'zh-Hant',
@@ -34,6 +35,7 @@ export const LOCALE_NAMES = Object.freeze({
ja: '日本語', ja: '日本語',
pt: 'Português (Brasil)', pt: 'Português (Brasil)',
ru: 'Русский', ru: 'Русский',
sv: 'Svenska',
uk: 'Українська', uk: 'Українська',
'zh-CN': '中文(简体)', 'zh-CN': '中文(简体)',
'zh-Hant': '中文(繁體)', 'zh-Hant': '中文(繁體)',
File diff suppressed because it is too large. Load diff
+163
View File
@@ -944,6 +944,169 @@
"iNaturalist", "iNaturalist",
"iNaturalist ↗" "iNaturalist ↗"
], ],
"sv": [
"STATION",
"NAV",
"GEO",
"SAR",
"CRT",
"NVG",
"FLIR",
"REC",
"AIS: --",
"HDG {value}°",
"BRG {value}°",
"BRG —",
"CRS {value}°",
"Station {id}",
"Station",
"FOV {value}°",
"▲ {frp} MW",
"T−{time} · {mission}",
"{value} KM",
"{value} KM/S",
"STATUS · ",
"DESTINATION",
"STATUS",
"T minus {seconds}",
"Ambient",
"Blues",
"Country",
"Dance",
"Folk",
"Funk",
"House",
"Indie",
"Jazz",
"Latin",
"Metal",
"Oldies",
"Pop",
"Punk",
"R&B",
"Reggae",
"Rock",
"Soul",
"Techno",
"Trance",
"AIS: {name}",
"{type} SPD: {speed} HDG: {heading}",
"POS: LIVE",
"POS: {time}Z",
"Bloom",
"{domain} · {age}",
"{cohort} · {contact}",
"{side} {angle}",
"DEST {bearing}",
"Normal",
"Anime",
"Noir",
"{aircraftClass} · {distance}",
"CCTV",
"Radio",
"{state} · {source}",
"{state} · {source} · {detail}",
"{source} · {loadingLabel}",
"{state} · {source} · {detail} · {ago}",
"{state} · {source} · {ago}",
"{source} · {ago}",
"{name}: {state}",
"DEST ---°",
"TEMP",
"RADIO",
"COCKPIT",
"Layout",
"Minimal",
"Scope",
"{speed} kn",
"NORMAL",
"ANIME",
"NOIR",
"view band|GLOBAL",
"{distance} · {duration} · {mode}",
"S2 · {name}",
"1090 MHz",
"978 MHz UAT",
"V/S {rate}",
"POSITION {age}",
"fire behavior|Minimal",
"{county} County",
"Sentinel-2",
"Sentinel-2 via HLS",
"Landsat 8/9",
"Landsat 8/9 via HLS",
"Google Street View",
"GOOGLE STREET VIEW",
"Hybrid",
"{state} · {time} · {lag}",
"{state}: {time}",
"RADAR · {units}",
"REGION",
"FILTER",
"{source} HTTP {status}",
"N",
"S",
"WHOT/BHOT",
"Ironbow",
"HDG",
"FOV",
"ΔN",
"LIVE",
"OK",
"{value} KM/H",
"SQUAWK {code} · {status}",
"{aircraftClass} · {emergency} · {feedState}",
"S2 GhostMaps",
"NASA FIRMS · LIVE",
"feed status|live",
"DSP {count} blocks",
"Austin",
"San Francisco",
"New York",
"Tokyo",
"London",
"Paris",
"Dubai",
"Washington DC",
"Tallinn",
"Los Angeles",
"{category} ({count})",
"A / B",
"km/h",
"m/s",
"mph",
"hPa",
"ft",
"km",
"m",
"h",
"min",
"s",
"dB",
"STD",
"Plan",
"MINI",
"standard",
"mini",
"STANDARD",
"{items} {scope}",
"FT",
"MIL",
"MM",
"SIG",
"AUTO",
"FM MHZ",
"Cyber",
"Sonar",
"Cyan",
"≥ {value} MW",
"{count} {kind}",
"Be Whale Wise",
"Salish Sea",
"Acartia",
"CC BY 4.0",
"iNaturalist"
],
"uk": [ "uk": [
"AIS: --", "AIS: --",
"AIS: {name}", "AIS: {name}",
+4
View File
@@ -52,6 +52,7 @@ test('the current language comes first, the rest by their own names', () => {
'fr', 'fr',
'it', 'it',
'pt', 'pt',
'sv',
'ar', 'ar',
'zh-CN', 'zh-CN',
'zh-Hant', 'zh-Hant',
@@ -73,6 +74,7 @@ test('the current language comes first, the rest by their own names', () => {
'fr', 'fr',
'it', 'it',
'pt', 'pt',
'sv',
'ru', 'ru',
'uk', 'uk',
'ar', 'ar',
@@ -96,6 +98,7 @@ test('the current language comes first, the rest by their own names', () => {
'fr', 'fr',
'it', 'it',
'pt', 'pt',
'sv',
'ru', 'ru',
'uk', 'uk',
'ar', 'ar',
@@ -120,6 +123,7 @@ test('the current language comes first, the rest by their own names', () => {
'fr', 'fr',
'it', 'it',
'pt', 'pt',
'sv',
'ru', 'ru',
'uk', 'uk',
'zh-CN', 'zh-CN',