mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-11 13:52:19 +00:00
Merge origin/main into german/navara
Brings in the Swedish locale. Swedish gains the 14 messages this branch adds and drops the 7 it no longer uses.
This commit is contained in:
commit
a757beba77
10 files changed
+3734
-3
No files matched your search
@@ -0,0 +1,3 @@
|
||||
- Add Swedish (sv) to the language picker: the whole interface in Swedish,
|
||||
with Swedish number and date formats and a style guide and glossary in
|
||||
docs/translations/sv.md (Kaj Obst, @Kajjan7610, #1630).
|
||||
@@ -5135,7 +5135,7 @@ test:track` 43 tracking invariants · headless QA harnesses under
|
||||
### Interface localization (October 2026)
|
||||
|
||||
Shipped locales: **en** (source and fallback), **ar**, **de**, **es**, **fr**, **he**,
|
||||
**it**, **ja**, **pt** (Brazilian Portuguese), **ru**, **uk**, **zh-CN** and
|
||||
**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:
|
||||
[`docs/TRANSLATORS.md`](./TRANSLATORS.md).
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
# Translating God's Eye View
|
||||
|
||||
Shipped languages: **English** (source and fallback), **Arabic** (`ar`), **German** (`de`), **Spanish** (`es`), **French** (`fr`), **Hebrew** (`he`), **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`), **Hebrew** (`he`), **Italian** (`it`), **Japanese** (`ja`), **Brazilian Portuguese** (`pt`), **Russian** (`ru`), **Swedish** (`sv`), **Ukrainian** (`uk`), **Simplified Chinese** (`zh-CN`) and **Traditional Chinese** (`zh-Hant`).
|
||||
|
||||
## How it works
|
||||
|
||||
@@ -64,4 +64,4 @@ These are contracts, not copy: layer ids and registry keys, status enums and oth
|
||||
|
||||
## 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), [Hebrew](./translations/he.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), [Hebrew](./translations/he.md), [Italian](./translations/it.md), [Japanese](./translations/ja.md), [Brazilian Portuguese](./translations/pt.md), [Russian](./translations/ru.md), [Swedish](./translations/sv.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.
|
||||
@@ -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., KAL. «Jämför» is JFR, without a period.
|
||||
- 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.».
|
||||
|
||||
## 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 |
|
||||
| incident | händelse |
|
||||
@@ -1485,6 +1485,7 @@
|
||||
"src/i18n/locales/ja.json",
|
||||
"src/i18n/locales/pt.json",
|
||||
"src/i18n/locales/ru.json",
|
||||
"src/i18n/locales/sv.json",
|
||||
"src/i18n/locales/uk.json",
|
||||
"src/i18n/locales/zh-CN.json",
|
||||
"src/i18n/locales/zh-Hant.json",
|
||||
|
||||
@@ -27,6 +27,7 @@ import it from './locales/it.json' with { type: 'json' };
|
||||
import ja from './locales/ja.json' with { type: 'json' };
|
||||
import pt from './locales/pt.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 zhCN from './locales/zh-CN.json' with { type: 'json' };
|
||||
import zhHant from './locales/zh-Hant.json' with { type: 'json' };
|
||||
@@ -41,6 +42,7 @@ const CATALOGS = Object.freeze({
|
||||
ja,
|
||||
pt,
|
||||
ru,
|
||||
sv,
|
||||
uk,
|
||||
'zh-CN': zhCN,
|
||||
'zh-Hant': zhHant,
|
||||
|
||||
@@ -19,6 +19,7 @@ export const LOCALES = Object.freeze([
|
||||
'ja',
|
||||
'pt',
|
||||
'ru',
|
||||
'sv',
|
||||
'uk',
|
||||
'zh-CN',
|
||||
'zh-Hant',
|
||||
@@ -36,6 +37,7 @@ export const LOCALE_NAMES = Object.freeze({
|
||||
ja: '日本語',
|
||||
pt: 'Português (Brasil)',
|
||||
ru: 'Русский',
|
||||
sv: 'Svenska',
|
||||
uk: 'Українська',
|
||||
'zh-CN': '中文(简体)',
|
||||
'zh-Hant': '中文(繁體)',
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1087,6 +1087,166 @@
|
||||
"MMSI: {id}",
|
||||
"NORAD: {id}"
|
||||
],
|
||||
"sv": [
|
||||
"STATION",
|
||||
"NAV",
|
||||
"GEO",
|
||||
"SAR",
|
||||
"CRT",
|
||||
"NVG",
|
||||
"FLIR",
|
||||
"REC",
|
||||
"AIS: --",
|
||||
"HDG {value}°",
|
||||
"BRG {value}°",
|
||||
"BRG —",
|
||||
"CRS {value}°",
|
||||
"Station {id}",
|
||||
"Station",
|
||||
"FOV {value}°",
|
||||
"▲ {frp} MW",
|
||||
"{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",
|
||||
"Reggae",
|
||||
"Rock",
|
||||
"Soul",
|
||||
"Techno",
|
||||
"Trance",
|
||||
"AIS: {name}",
|
||||
"{type} SPD: {speed} HDG: {heading}",
|
||||
"POS: LIVE",
|
||||
"POS: {time}Z",
|
||||
"Bloom",
|
||||
"DEST {bearing}",
|
||||
"Normal",
|
||||
"Anime",
|
||||
"Noir",
|
||||
"CCTV",
|
||||
"Radio",
|
||||
"DEST ---°",
|
||||
"TEMP",
|
||||
"RADIO",
|
||||
"COCKPIT",
|
||||
"Layout",
|
||||
"Minimal",
|
||||
"Scope",
|
||||
"{speed} kn",
|
||||
"NORMAL",
|
||||
"ANIME",
|
||||
"NOIR",
|
||||
"view band|GLOBAL",
|
||||
"1090 MHz",
|
||||
"978 MHz UAT",
|
||||
"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",
|
||||
"RADAR · {units}",
|
||||
"REGION",
|
||||
"FILTER",
|
||||
"{source} HTTP {status}",
|
||||
"WHOT/BHOT",
|
||||
"Ironbow",
|
||||
"HDG",
|
||||
"FOV",
|
||||
"ΔN",
|
||||
"LIVE",
|
||||
"OK",
|
||||
"{value} KM/H",
|
||||
"SQUAWK {code} · {status}",
|
||||
"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",
|
||||
"km/h",
|
||||
"mph",
|
||||
"hPa",
|
||||
"ft",
|
||||
"km",
|
||||
"min",
|
||||
"dB",
|
||||
"STD",
|
||||
"Plan",
|
||||
"MINI",
|
||||
"standard",
|
||||
"mini",
|
||||
"STANDARD",
|
||||
"FT",
|
||||
"MIL",
|
||||
"MM",
|
||||
"SIG",
|
||||
"AUTO",
|
||||
"FM MHZ",
|
||||
"Cyber",
|
||||
"Sonar",
|
||||
"Cyan",
|
||||
"≥ {value} MW",
|
||||
"Be Whale Wise",
|
||||
"Salish Sea",
|
||||
"Acartia",
|
||||
"CC BY 4.0",
|
||||
"iNaturalist",
|
||||
"STARLINK",
|
||||
"STARLINK ···",
|
||||
"STARLINK ✕",
|
||||
"{range} NM",
|
||||
"OFF-NADIR {angle}°",
|
||||
"OFF-NADIR {angle}° · {offset}",
|
||||
"HOME NADIR",
|
||||
"ZOOM {zoom}×",
|
||||
"NORAD {id}",
|
||||
"TLE",
|
||||
"NADIR",
|
||||
"SENSOR",
|
||||
"1 min/s",
|
||||
"Live",
|
||||
"EXPORT",
|
||||
"via {source}",
|
||||
"Video",
|
||||
"Iran–Hormuz",
|
||||
"Sudan",
|
||||
"Sahel",
|
||||
"Protest",
|
||||
"{minutes} min",
|
||||
"Period",
|
||||
"ICAO: {id}",
|
||||
"NORAD: {id}",
|
||||
"MMSI: {id}"
|
||||
],
|
||||
"uk": [
|
||||
"1900–1945",
|
||||
"AIS: --",
|
||||
|
||||
@@ -52,6 +52,7 @@ test('the current language comes first, the rest by their own names', () => {
|
||||
'fr',
|
||||
'it',
|
||||
'pt',
|
||||
'sv',
|
||||
'he',
|
||||
'ar',
|
||||
'zh-CN',
|
||||
@@ -74,6 +75,7 @@ test('the current language comes first, the rest by their own names', () => {
|
||||
'fr',
|
||||
'it',
|
||||
'pt',
|
||||
'sv',
|
||||
'ru',
|
||||
'uk',
|
||||
'he',
|
||||
@@ -98,6 +100,7 @@ test('the current language comes first, the rest by their own names', () => {
|
||||
'fr',
|
||||
'it',
|
||||
'pt',
|
||||
'sv',
|
||||
'ru',
|
||||
'uk',
|
||||
'he',
|
||||
@@ -123,6 +126,7 @@ test('the current language comes first, the rest by their own names', () => {
|
||||
'fr',
|
||||
'it',
|
||||
'pt',
|
||||
'sv',
|
||||
'ru',
|
||||
'uk',
|
||||
'he',
|
||||
|
||||
Reference in new issue
Block a user