diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index c55031a6a..b4f62379a 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -3733,7 +3733,7 @@ test:track` 43 tracking invariants · headless QA harnesses under ### Interface localization (October 2026) -Shipped locales: **en** (source and fallback), **es**, **ru**, **zh-CN** and **zh-Hant**. The code lives in +Shipped locales: **en** (source and fallback), **es**, **pt** (Brazilian Portuguese), **ru**, **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). @@ -3744,7 +3744,7 @@ Shipped locales: **en** (source and fallback), **es**, **ru**, **zh-CN** and **z value). English has no catalog; every other locale is `src/i18n/locales/.json`, and a missing entry falls back to English. - **Locale choice.** `?lang=` → stored choice (`gev:locale:v1`) → - `navigator.languages` → English. Chinese tags default to `zh-CN`; Traditional Chinese tags + `navigator.languages` → English. Any `pt` tag (`pt-BR`, `pt-PT`) selects `pt`. Chinese tags default to `zh-CN`; Traditional Chinese tags select `zh-Hant`. Explicit `Hans` selects `zh-CN` regardless of region. `?lang=` is not stored, and share links drop it, so a recipient keeps their own language. The globe picker in the bottom-right corner (`src/ui/localePicker.js`) stores the choice, drops diff --git a/docs/TRANSLATORS.md b/docs/TRANSLATORS.md index 830ca155e..afdbe350d 100644 --- a/docs/TRANSLATORS.md +++ b/docs/TRANSLATORS.md @@ -1,6 +1,6 @@ # Translating God's Eye View -Shipped languages: **English** (source and fallback), **Spanish** (`es`), **Russian** (`ru`), **Simplified Chinese** (`zh-CN`) and **Traditional Chinese** (`zh-Hant`). +Shipped languages: **English** (source and fallback), **Spanish** (`es`), **Brazilian Portuguese** (`pt`), **Russian** (`ru`), **Simplified Chinese** (`zh-CN`) and **Traditional Chinese** (`zh-Hant`). ## How it works @@ -63,4 +63,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/.md`: [Spanish](./translations/es.md), [Russian](./translations/ru.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/.md`: [Spanish](./translations/es.md), [Brazilian Portuguese](./translations/pt.md), [Russian](./translations/ru.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. diff --git a/docs/translations/pt.md b/docs/translations/pt.md new file mode 100644 index 000000000..7417fd64f --- /dev/null +++ b/docs/translations/pt.md @@ -0,0 +1,81 @@ +# Brazilian Portuguese (`pt`) + +Catalog: `src/i18n/locales/pt.json`. General rules: [TRANSLATORS.md](../TRANSLATORS.md). + +Translation source: abiyeenzo (#909). + +## Style + +- Brazilian Portuguese (pt-BR): câmera, tela, compartilhar, arquivo, baixar, ônibus, metrô. Every `pt` tag, `pt-PT` included, gets this catalog, so avoid slang and regionalisms. +- Address the user with «você» imperatives: «Clique no mapa», «Ative o CCTV», «Tente novamente». Tooltips that name an action use the infinitive: «Expandir painel», «Redefinir a câmera». +- Sentence case, not Title Case: "Live Flights" → «Voos ao vivo». UPPERCASE English stays UPPERCASE: «AO VIVO», «SEM DADOS». +- Quotes inside Portuguese text are straight double quotes: «Excluir o plano "{shot}"?». +- Short labels, chips and HUD readouts stay short. A standard abbreviation with a period beats a wrapped line: ANT., PRÓX., DESLIG., EXCL., INCL., ALT., VEL., câm. +- The HUD codes HDG, BRG, CRS, FOV, DEST, SPD, RANGE, ALT, GS and TRK stay in English, as in cockpit avionics. Words used in a sentence are translated: heading → «rumo», range → «alcance». +- Keyboard keys stay in English: Space, Esc, Enter, Tab, Shift, Backspace, H, 1–9 («Segure Space para falar»). +- Common English tech words used in Brazil stay: feed, stream, snapshot, briefing, dock, layout, bloom, status, app, link, token. +- Units: km, m, km/h, m/s, kt (knots), ft (feet), h, min, s; in UPPERCASE text KM, KM/S, KT, FT, MIN, H. "m" is always metres, so minutes are «min» («há 5 min»). MW stays MW. `°` and `%` stay. Decimal comma in written numbers («M4,4»). +- "ago" goes before the time: «há {count} min». When a placeholder already holds a localized "ago" text (`{age}`, `{ago}`), do not add «há» again. +- Money: «US$ {amount} mil / mi / bi» for thousands, millions and billions. +- Compass points use Leste/Oeste: N, NNE, NE, ENE, L, ESE, SE, SSE, S, SSO, SO, OSO, O, ONO, NO, NNO; hemisphere letters N, S, L, O. + +## Plurals + +A `tn()` entry needs three forms. `Intl.PluralRules('pt')` follows Brazilian usage: + +| Form | Counts | Example | +| ------- | -------------------------------------- | ------------------ | +| `one` | 0, 1 and anything below 2: 0, 1, 1.5 | 0 câmera, 1 câmera | +| `many` | 1 000 000, 2 000 000… (exact millions) | 1000000 de câmeras | +| `other` | everything else: 2–999 999, 2.5… | 3 câmeras | + +The `many` form is the `other` text with «de» after the number: «{count} de câmeras carregadas», «{count} DE CHAVES PENDENTES». A `one` form is also read for 0, so keep it natural with zero («0 arquivo selecionado» is standard Brazilian usage). + +## Glossary + +| English | Português | +| --------------------------------------------- | ------------------------------------------------------------ | +| layer / data layer | camada / camada de dados | +| feed / source / data source | feed / fonte / fonte de dados | +| LIVE (status) / live data | AO VIVO / dados ao vivo | +| SIMULATED | SIMULADO | +| stale / degraded / unavailable | desatualizado / degradado / indisponível | +| retry / retrying | nova tentativa / tentando de novo | +| key (API key) / POWER UP / POWERED UP | chave / ATIVAR / ATIVADO | +| Provider Settings | Configurações de provedores | +| ON / OFF (state chips) | ATIVO / INATIVO | +| enable / disable | ativar / desativar | +| globe / map / map source / map stack | globo / mapa / fonte do mapa / pilha de mapas | +| basemap / tile | mapa base / bloco | +| aircraft, plane / flight / military flights | aeronave, avião / voo / voos militares | +| vessel, ship | embarcação | +| satellite / shell (Starlink) / DENSE | satélite / camada orbital / DENSO | +| launch (rocket) / launch site / space mission | lançamento / local de lançamento / missão espacial | +| ascent / replay / payload / stage | subida / reprise / carga útil / estágio | +| contact / tracking / track | contato / rastreamento / rastro | +| installation / site | instalação / local | +| mapped / observed | mapeado / observado | +| camera / CCTV camera | câmera / câmera de CCTV | +| earthquake / active fire | terremoto / incêndio ativo | +| advisory (NHC/CPHC cyclone) | boletim | +| radio station / broadcaster | estação de rádio / emissora | +| road / flow (traffic) | via / fluxo | +| Street Level (layer) | Nível da rua | +| scene / shot / scene recipe | cena / plano / receita de cena | +| briefing / panel / dock | briefing / painel / dock | +| cockpit | cabine | +| preset / visual preset | predefinição / predefinição visual | +| Scope (circular viewport mask) / keyhole | mira / visor | +| feather / fade | suavização / esmaecimento | +| detection overlay | sobreposição de detecção | +| pin (Draw tool) / box (Recent Imagery) | marcador / área | +| Cyber (HUD layout, effect) | Ciber | +| heading / course / altitude / ground speed | rumo / curso / altitude / velocidade solo (VELOC. SOLO) | +| HDG / BRG / CRS / FOV / DEST / SPD / RANGE | HDG / BRG / CRS / FOV / DEST / SPD / RANGE (unchanged) | +| PREV / NEXT | ANT. / PRÓX. | +| Previous / Next (button text) | Anterior / Próximo (Próxima) | +| L / R (relative bearing) | E / D | +| SIG / NEWS / LOCAL (briefing tabs) | SIG / NOTÍCIAS / LOCAL | +| PITCH / HGT (CCTV calibration chips) | INCL. / ALT. | +| NOT AN ALL-CLEAR | NÃO GARANTE SEGURANÇA | +| turn-by-turn: turn left / keep left / lane | vire à esquerda / mantenha-se à esquerda / faixa da esquerda | diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 9f06f73f6..602895c76 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -440,6 +440,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -480,6 +481,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -510,6 +512,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -532,6 +535,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -549,6 +553,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -569,6 +574,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -596,6 +602,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -631,6 +638,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -648,6 +656,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -807,6 +816,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -929,6 +939,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -997,6 +1008,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -1046,6 +1058,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1109,6 +1122,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1139,6 +1153,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -1170,6 +1185,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1201,6 +1217,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -1235,6 +1252,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1278,6 +1296,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -1315,6 +1334,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -1366,6 +1386,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1396,6 +1417,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1445,6 +1467,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1509,6 +1532,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -1539,6 +1563,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1580,6 +1605,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1603,6 +1629,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1660,6 +1687,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -1723,6 +1751,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -2606,6 +2635,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -3191,6 +3221,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -3302,6 +3333,7 @@ "src/data/cameraArrival.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -3326,6 +3358,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -3363,6 +3396,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -3390,6 +3424,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -3482,6 +3517,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -3538,6 +3574,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -3793,6 +3830,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -3837,6 +3875,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -3891,6 +3930,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json" @@ -3908,6 +3948,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -3968,6 +4009,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", @@ -4165,6 +4207,7 @@ "src/i18n/index.js", "src/i18n/locale.js", "src/i18n/locales/es.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", diff --git a/src/i18n/i18n.test.mjs b/src/i18n/i18n.test.mjs index 1b421f2ff..df6b4d000 100644 --- a/src/i18n/i18n.test.mjs +++ b/src/i18n/i18n.test.mjs @@ -34,6 +34,8 @@ test('normalizeLocale folds regional variants and rejects unshipped tags', () => assert.equal(normalizeLocale('ru-RU'), 'ru'); assert.equal(normalizeLocale(' RU '), 'ru'); assert.equal(normalizeLocale('en_GB'), 'en'); + assert.equal(normalizeLocale('pt-BR'), 'pt'); + assert.equal(normalizeLocale('pt_PT'), 'pt'); assert.equal(normalizeLocale('xx'), null); // Explicit script tags take precedence over regional defaults. assert.equal(normalizeLocale('zh'), 'zh-CN'); @@ -142,6 +144,20 @@ test('tn() picks English and Russian plural forms', () => { assert.match(label(21), / 21 КЛЮЧ(?![А-ЯЁ])/); }); +test('tn() picks the Portuguese one, many and other forms', () => { + const label = (count) => + tn( + count, + 'POWER UP · {count} KEY WAITING', + 'POWER UP · {count} KEYS WAITING', + ); + setLocale('pt'); + assert.equal(label(0), 'ATIVAR · 0 CHAVE PENDENTE'); + assert.equal(label(1), 'ATIVAR · 1 CHAVE PENDENTE'); + assert.equal(label(3), 'ATIVAR · 3 CHAVES PENDENTES'); + assert.equal(label(1_000_000), 'ATIVAR · 1000000 DE CHAVES PENDENTES'); +}); + test('t() context separates identical English with different meanings', () => { assert.equal(t('CLEAR', { context: 'action' }), 'CLEAR'); setLocale('ru'); diff --git a/src/i18n/index.js b/src/i18n/index.js index 6fc4becc9..a6076bbd5 100644 --- a/src/i18n/index.js +++ b/src/i18n/index.js @@ -17,11 +17,18 @@ import { writeStoredLocale, } from './locale.js'; import es from './locales/es.json' with { type: 'json' }; +import pt from './locales/pt.json' with { type: 'json' }; import ru from './locales/ru.json' with { type: 'json' }; import zhCN from './locales/zh-CN.json' with { type: 'json' }; import zhHant from './locales/zh-Hant.json' with { type: 'json' }; -const CATALOGS = Object.freeze({ es, ru, 'zh-CN': zhCN, 'zh-Hant': zhHant }); +const CATALOGS = Object.freeze({ + es, + pt, + ru, + 'zh-CN': zhCN, + 'zh-Hant': zhHant, +}); let currentLocale = DEFAULT_LOCALE; diff --git a/src/i18n/locale.js b/src/i18n/locale.js index 55ed71163..db072d179 100644 --- a/src/i18n/locale.js +++ b/src/i18n/locale.js @@ -8,12 +8,20 @@ export const LOCALE_STORAGE_KEY = 'gev:locale:v1'; export const DEFAULT_LOCALE = 'en'; /** Shipped locales; order does not matter. Adding one: docs/TRANSLATORS.md. */ -export const LOCALES = Object.freeze(['en', 'es', 'ru', 'zh-CN', 'zh-Hant']); +export const LOCALES = Object.freeze([ + 'en', + 'es', + 'pt', + 'ru', + 'zh-CN', + 'zh-Hant', +]); /** Each locale named in its own language, for the selector. */ export const LOCALE_NAMES = Object.freeze({ en: 'English', es: 'Español', + pt: 'Português (Brasil)', ru: 'Русский', 'zh-CN': '中文(简体)', 'zh-Hant': '中文(繁體)', @@ -24,6 +32,7 @@ const RTL_LOCALES = Object.freeze([]); /** * Map any language tag to a shipped locale: 'ru-RU' and 'RU' → 'ru', + * 'pt-BR' and 'pt-PT' → 'pt' (Brazilian Portuguese), * 'zh', 'zh-CN' and 'zh-Hans-SG' → 'zh-CN'; * 'zh-Hant', 'zh-TW', 'zh-HK' and 'zh-MO' → 'zh-Hant'. * @returns {string|null} diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index 0afe119ed..c64e4b4bd 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -1,4 +1,24 @@ { + "Pick a shape, then click the map.": "Escolha uma forma e clique no mapa.", + "Enter to place the pin, Esc to cancel.": "Enter para colocar o marcador, Esc para cancelar.", + "Click where the pin goes.": "Clique onde o marcador deve ficar.", + "Click {count} more points.": { + "one": "Clique em mais {count} ponto.", + "many": "Clique em mais {count} de pontos.", + "other": "Clique em mais {count} pontos." + }, + "Those points are in a line — move one off it to enclose an area.": "Esses pontos estão em linha — tire um deles da linha para fechar uma área.", + "That line has no length — click somewhere further away.": "Essa linha não tem comprimento — clique em um ponto mais distante.", + " · {max}-point limit reached": " · limite de {max} pontos atingido", + "{measure} · double-click or Enter to finish, Backspace undoes, Esc cancels.{full}": "{measure} · clique duplo ou Enter para concluir, Backspace desfaz, Esc cancela.{full}", + "drawings on the map": "os desenhos no mapa", + "That shape already has {count} points — finish it or press Backspace.": "Essa forma já tem {count} pontos — conclua-a ou pressione Backspace.", + "That point is off the globe — click on the world.": "Esse ponto está fora do globo — clique sobre o mundo.", + "That shape could not be placed.": "Não foi possível colocar essa forma.", + "Could not place the shape: {error}": "Não foi possível colocar a forma: {error}", + "Board cleared.": "Quadro limpo.", + "{owner} is using the pointer — close it first.": "Ponteiro em uso: {owner}. Feche-o primeiro.", + "{label} · Detailed outline unavailable": "{label} · Contorno detalhado indisponível", "Flying to Austin, TX...": "Voando para Austin, TX...", "Restoring shared view...": "Restaurando a vista compartilhada...", "Configuring viewer...": "Configurando o visualizador...", @@ -6,14 +26,223 @@ "Loading the keyless globe...": "Carregando o globo sem chave...", "Google 3D Tiles unavailable ({detail}). Loading the keyless globe...": "Google 3D Tiles indisponível ({detail}). Carregando o globo sem chave...", "Initializing systems...": "Inicializando sistemas...", + "Space Missions isolates replay data. Exit the mode to enable {layer}.": "O modo Missões espaciais isola os dados da reprise. Saia do modo para ativar {layer}.", + "Data attribution": "Atribuição de dados", + "Data provided by:": "Dados fornecidos por:", "Close data attribution": "Fechar atribuição de dados", + "Light aircraft": "Aeronave leve", + "Glider": "Planador", + "Turboprop": "Turboélice", + "Airliner": "Avião comercial", + "Widebody": "Avião de fuselagem larga", + "Four-engine jet": "Jato quadrimotor", + "Helicopter": "Helicóptero", + "Fast jet": "Jato de alto desempenho", + "Business jet": "Jato executivo", + "Drone": "Drone", + "General emergency": "Emergência geral", + "Unlawful interference": "Interferência ilícita", + "Radio failure": "Falha de rádio", + "Downed aircraft": "Aeronave acidentada", + "Minimum fuel": "Combustível mínimo", + "Lifeguard (medical priority)": "Lifeguard (prioridade médica)", + "Rasuwagadhi witness video": "Vídeo de testemunha em Rasuwagadhi", + "Bhote Koshi valley footage": "Imagens do vale do Bhote Koshi", + "Flood footage": "Imagens da inundação", + "Compilation and casualty claims": "Compilação e relatos de vítimas", + "SOURCE GEOCONFIRMED · WORLD-PINNED": "FONTE GEOCONFIRMADA · FIXADA NO MAPA", + "SOURCE CREDITED · LOCATION UNRESOLVED": "FONTE CREDITADA · LOCAL NÃO DETERMINADO", + "REFERENCE ONLY · CLAIMS UNVERIFIED": "SÓ REFERÊNCIA · RELATOS NÃO VERIFICADOS", + "SOURCE GEOCONFIRMED": "FONTE GEOCONFIRMADA", + "2021 historical reference versus 2026 post-event imagery; changes are cumulative and include the July 2025 Rasuwagadhi flood. Schematic downstream progression, not modeled arrival time; not an official hazard model.": "Referência histórica de 2021 comparada a imagens posteriores ao evento de 2026; as mudanças são cumulativas e incluem a inundação de Rasuwagadhi de julho de 2025. Avanço esquemático rio abaixo, não um tempo de chegada modelado; não é um modelo oficial de risco.", + "Immediate collapse viewpoint": "Ponto de vista junto ao colapso", + "Collapse viewpoint": "Vista do colapso", + "Debris-dammed lake": "Lago represado por detritos", + "Dammed lake": "Lago represado", + "Second landslide": "Segundo deslizamento", + "Gyirong border gate": "Posto de fronteira de Gyirong", + "Border gate": "Posto de fronteira", + "Timure evidence cluster": "Grupo de evidências de Timure", + "Mailung / Upper Trishuli bridge": "Mailung / ponte de Upper Trishuli", + "Dandagaun viewpoint restaurant": "Restaurante mirante de Dandagaun", + "Dandagaun viewpoint": "Mirante de Dandagaun", + "Bidur - Trishuli bridge": "Ponte Bidur - Trishuli", + "Bidur bridge": "Ponte de Bidur", + "Devighat / Taadi Khola Bridge": "Devighat / ponte de Taadi Khola", + "Devighat bridge": "Ponte de Devighat", + "Facebook player API did not initialize.": "A API do player do Facebook não foi inicializada.", + "Facebook player API could not load.": "Não foi possível carregar a API do player do Facebook.", + "Facebook player API timed out.": "A API do player do Facebook excedeu o tempo limite.", + "X embed API did not initialize.": "A API de incorporação do X não foi inicializada.", + "X embed could not load.": "Não foi possível carregar a incorporação do X.", + "X embed timed out.": "A incorporação do X excedeu o tempo limite.", "UNAVAILABLE": "INDISPONÍVEL", + "TIMEOUT": "TEMPO ESGOTADO", + "BLOCKED": "BLOQUEADO", "SOURCE": "FONTE", + "Facebook embed unavailable. The post may be private, removed, region-restricted, or blocked.": "Incorporação do Facebook indisponível. A publicação pode ser privada, ter sido removida, ter restrição regional ou estar bloqueada.", + "Preloading {provider} media": "Pré-carregando mídia do {provider}", + "LOADING X POST…": "CARREGANDO PUBLICAÇÃO DO X…", + "The X post is unavailable or cannot be embedded.": "A publicação do X está indisponível ou não pode ser incorporada.", + "X POST · PROVIDER CONTROLS": "PUBLICAÇÃO DO X · CONTROLES DO PROVEDOR", + "{reason} OPEN ORIGINAL.": "{reason} ABRA O ORIGINAL.", + "X embed unavailable": "Incorporação do X indisponível", + "FACEBOOK · PROVIDER CONTROLS": "FACEBOOK · CONTROLES DO PROVEDOR", + "Facebook embed unavailable": "Incorporação do Facebook indisponível", + "AUTOPLAY BLOCKED · USE PROVIDER CONTROLS": "REPRODUÇÃO AUTOMÁTICA BLOQUEADA · USE OS CONTROLES DO PROVEDOR", + "Embedded {provider} media for {source}": "Mídia do {provider} incorporada para {source}", + "witness source": "fonte de testemunha", + "Witness source": "Fonte de testemunha", + "{provider} · EMBEDDED SOURCE": "{provider} · FONTE INCORPORADA", + "OPEN ORIGINAL ↗": "ABRIR ORIGINAL ↗", + "{provider} media: {source}": "Mídia do {provider}: {source}", + "{provider} · PROVIDER CONTROLS": "{provider} · CONTROLES DO PROVEDOR", + "YOUTUBE {state} · OPEN ORIGINAL": "YOUTUBE {state} · ABRIR ORIGINAL", + "INITIATION": "INÍCIO", + "DAMMING": "REPRESAMENTO", + "SECONDARY FAILURE": "RUPTURA SECUNDÁRIA", + "BORDER ARRIVAL": "CHEGADA À FRONTEIRA", + "PROPAGATION": "PROPAGAÇÃO", + "DOWNSTREAM PASSAGE": "PASSAGEM RIO ABAIXO", + "CONSEQUENCE": "CONSEQUÊNCIAS", + "DOWNSTREAM CONSEQUENCE": "CONSEQUÊNCIAS RIO ABAIXO", + "EVIDENCE": "EVIDÊNCIA", + "{year} HISTORICAL REFERENCE": "REFERÊNCIA HISTÓRICA {year}", + "{year} POST-EVENT": "PÓS-EVENTO {year}", + "{count} GEOLOCATED SOURCE-MAP PLACEMENTS": { + "one": "{count} POSIÇÃO GEOLOCALIZADA NO MAPA DE FONTES", + "many": "{count} DE POSIÇÕES GEOLOCALIZADAS NO MAPA DE FONTES", + "other": "{count} POSIÇÕES GEOLOCALIZADAS NO MAPA DE FONTES" + }, + "NO PREVIEW": "SEM PRÉVIA", + "YouTube source": "Fonte do YouTube", + "Facebook source": "Fonte do Facebook", + "SOURCE LINK": "LINK DA FONTE", + "{publisher} / OPEN": "{publisher} / ABRIR", + "Bhote Koshi flood reconstruction controls": "Controles da reconstrução da inundação do Bhote Koshi", + "EVENT RECONSTRUCTION · 26 AUG 2026": "RECONSTRUÇÃO DO EVENTO · 26 AGO 2026", + "BHOTE KOSHI OUTBURST FLOOD": "INUNDAÇÃO POR ROMPIMENTO NO BHOTE KOSHI", + "Close event layer": "Fechar a camada do evento", + "OBSERVED IMAGERY": "IMAGENS OBSERVADAS", + "SCHEMATIC CORRIDOR": "CORREDOR ESQUEMÁTICO", + "2021 HISTORICAL REFERENCE / 2026 POST-EVENT": "REF. HISTÓRICA 2021 / PÓS-EVENTO 2026", + "Historical reference and post-event image split": "Divisão entre a imagem de referência histórica e a pós-evento", + "RECONSTRUCTION CLOCK": "RELÓGIO DA RECONSTRUÇÃO", + "Schematic downstream progression": "Avanço esquemático rio abaixo", + "Story beat navigation": "Navegação pelos momentos da história", + "Previous story beat": "Momento anterior da história", + "CAUSE": "CAUSA", + "CAPTURE TIME UNVERIFIED": "HORA DE CAPTURA NÃO VERIFICADA", + "Next story beat": "Próximo momento da história", + "▶ PLAY": "▶ REPRODUZIR", + "Play the next shot and continue through this scene": "Reproduzir o próximo plano e seguir por esta cena", + "▶ PLAY SCENE": "▶ REPRODUZIR CENA", + "◉ CINEMATIC": "◉ CINEMATOGRÁFICO", + "↺ FULL STORY": "↺ HISTÓRIA COMPLETA", + "↗ OPEN ORIGINAL": "↗ ABRIR ORIGINAL", + "⌖ LOWER GORGE": "⌖ GARGANTA INFERIOR", + "FIELD REPORTS · {count}": "RELATOS DE CAMPO · {count}", + "GEOLOCATIONS · {credit}": "GEOLOCALIZAÇÕES · {credit}", + "↗ OPEN PUBLIC MAP": "↗ ABRIR MAPA PÚBLICO", + " Clouds are preserved from the source imagery.": " As nuvens vêm das imagens de origem.", + "Rasuwagadhi witness": "Testemunha em Rasuwagadhi", + "Open original source for {source}; capture time unverified": "Abrir a fonte original de {source}; hora de captura não verificada", + "Historical reference and post-event image divider": "Divisor entre a imagem de referência histórica e a pós-evento", + "A historical reference {before} percent, B post-event {after} percent": "A, referência histórica, {before} por cento; B, pós-evento, {after} por cento", + "■ RELEASE CAMERA": "■ LIBERAR CÂMERA", + "Seek Nepal scene clock": "Navegar pelo relógio da cena do Nepal", + "NEPAL SCENE CLOCK": "RELÓGIO DA CENA DO NEPAL", + "… PLAYING SHOT": "… REPRODUZINDO PLANO", + "▶ PLAY SHOT": "▶ REPRODUZIR PLANO", + "Ⅱ PAUSE": "Ⅱ PAUSAR", + "↺ REPLAY CINEMATIC": "↺ REPETIR CINEMATOGRÁFICO", + "↺ REPLAY": "↺ REPETIR", + "… PLAYING SCENE": "… REPRODUZINDO CENA", + "Continue {scene} from next shot": "Continuar {scene} a partir do próximo plano", + "current scene": "a cena atual", + "Replay the full reconstruction": "Repetir a reconstrução completa", + "SCENE SHOT": "PLANO DA CENA", + "TIME UNVERIFIED": "HORA NÃO VERIFICADA", + "{count} SOURCES": { + "one": "{count} FONTE", + "many": "{count} DE FONTES", + "other": "{count} FONTES" + }, + "OUTSIDE IMAGERY SWIPE": "FORA DA COMPARAÇÃO DE IMAGENS", + "{scene} / AUTHORED SHOT": "{scene} / PLANO AUTORAL", + "NEPAL FLOOD INCIDENT": "INCIDENTE DE INUNDAÇÃO NO NEPAL", + "Play {shot}": "Reproduzir {shot}", + "current scene shot": "o plano atual da cena", + "Play reconstruction": "Reproduzir a reconstrução", + "Load previous scene shot": "Carregar o plano anterior da cena", + "Load next scene shot": "Carregar o próximo plano da cena", + "SCHEMATIC CORRIDOR, NOT MODELED ARRIVAL TIME.": "CORREDOR ESQUEMÁTICO, NÃO UM TEMPO DE CHEGADA MODELADO.", + "Rasuwa · 26 Aug 2026": "Rasuwa · 26 ago 2026", + "Event reconstruction": "Reconstrução do evento", + "BHOTE KOSHI FLOOD INCIDENT": "INCIDENTE DE INUNDAÇÃO NO BHOTE KOSHI", + "NEPAL · 26 AUG 2026": "NEPAL · 26 AGO 2026", + "USGS INITIAL REPORT": "RELATÓRIO INICIAL DO USGS", + "26 AUG 2026 · 08:37 NPT": "26 AGO 2026 · 08:37 NPT", + "28.2710° N · 85.5150° E": "28,2710° N · 85,5150° L", + "INITIAL M4.4 · RECLASSIFIED M5.2 LANDSLIDE": "INICIAL M4,4 · RECLASSIFICADO COMO DESLIZAMENTO M5,2", + "USGS EVENT us7000tbwb · OPEN SOURCE": "EVENTO USGS us7000tbwb · ABRIR FONTE", + "Open the USGS initial report for the 26 August 2026 Nepal landslide": "Abrir o relatório inicial do USGS sobre o deslizamento de 26 de agosto de 2026 no Nepal", + "Show the Nepal context callout without a border or country fill": "Mostra o destaque de contexto do Nepal sem fronteira nem preenchimento do país", + "Introduce Nepal, draw its border, then reveal the Bhote Koshi incident": "Apresenta o Nepal, desenha sua fronteira e depois revela o incidente do Bhote Koshi", + "CITIES": "CIDADES", + "Keep the regional incident context and introduce nearby city labels": "Mantém o contexto regional do incidente e apresenta os rótulos das cidades próximas", + "PLACES": "LUGARES", + "Introduce the reconstruction scene key places from trigger to downstream": "Apresenta os lugares-chave da cena de reconstrução, do gatilho até rio abaixo", + "PATH": "PERCURSO", + "Animate the sourced cyan river-centerline route to Trishuli Bazaar": "Anima a rota ciano documentada pelo eixo do rio até Trishuli Bazaar", + "OVERVIEW": "VISÃO GERAL", + "Keep the completed flood path and location labels visible": "Mantém visíveis o percurso completo da inundação e os rótulos dos locais", + "RECORD": "REGISTRO", + "Reveal the trigger record while making a slow camera approach": "Revela o registro do gatilho com uma aproximação lenta da câmera", + "{speed} kn": "{speed} kt", + "That file is not valid JSON.": "Esse arquivo não é um JSON válido.", + "That JSON file is not GeoJSON.": "Esse arquivo JSON não é GeoJSON.", + "That FeatureCollection has no features list.": "Essa FeatureCollection não tem lista de features.", + "Every GeoJSON feature must have type Feature.": "Todo elemento GeoJSON deve ter o tipo Feature.", + "That GeoJSON has invalid geometries.": "Esse GeoJSON tem geometrias inválidas.", + "That GeoJSON contains an unsupported geometry.": "Esse GeoJSON contém uma geometria não suportada.", + "That GeoJSON has invalid coordinates.": "Esse GeoJSON tem coordenadas inválidas.", + "That file creates more than {limit} map objects (the limit).": "Esse arquivo cria mais de {limit} objetos no mapa (o limite).", + "That file has more than {limit} style definitions and image links after cleanup (the limit).": "Após a limpeza, esse arquivo tem mais de {limit} definições de estilo e links de imagem (o limite).", + "That file has more than {limit} features (the limit).": "Esse arquivo tem mais de {limit} elementos (o limite).", + "That file has more than {limit} points (the limit) across {features} features.": "Esse arquivo tem mais de {limit} pontos (o limite) em {features} elementos.", + "That file has more than {limit} points (the limit).": "Esse arquivo tem mais de {limit} pontos (o limite).", + "That KMZ unpacks to more than the import limit.": "Descompactado, esse KMZ ultrapassa o limite de importação.", + "That KMZ is damaged and could not be unpacked.": "Esse KMZ está danificado e não pôde ser descompactado.", + "That KMZ is not a readable zip archive.": "Esse KMZ não é um arquivo zip legível.", + "That KMZ uses a zip format this import does not read.": "Esse KMZ usa um formato zip que esta importação não lê.", + "That KMZ is encrypted.": "Esse KMZ está criptografado.", + "That KMZ uses a compression method this import does not read.": "Esse KMZ usa um método de compressão que esta importação não lê.", + "That KML has invalid geometry bounds.": "Esse KML tem limites de geometria inválidos.", + "That KML has invalid coordinates.": "Esse KML tem coordenadas inválidas.", + "That GPX file has no document.": "Esse arquivo GPX não tem documento .", + "That {format} file is not valid XML.": "Esse arquivo {format} não é um XML válido.", + "That file has an unreadable image or exceeds the 16-megapixel image limit.": "Esse arquivo tem uma imagem ilegível ou ultrapassa o limite de imagem de 16 megapixels.", + "That KML could not be read.": "Não foi possível ler esse KML.", + "That file has invalid point coordinates.": "Esse arquivo tem coordenadas de pontos inválidas.", + "Ground heights are not available for that file. Try again when the map has loaded.": "As altitudes do terreno não estão disponíveis para esse arquivo. Tente de novo quando o mapa tiver carregado.", + "That file took too long to read.": "A leitura desse arquivo demorou demais.", + "Nothing to import.": "Nada para importar.", + "That file is larger than {size} MiB.": "Esse arquivo tem mais de {size} MiB.", + "Only GeoJSON, KML, KMZ and GPX files can be imported.": "Só é possível importar arquivos GeoJSON, KML, KMZ e GPX.", + "That file has nothing to draw.": "Esse arquivo não tem nada para desenhar.", + "That KMZ holds no KML document.": "Esse KMZ não contém nenhum documento KML.", + "That {format} file could not be read.": "Não foi possível ler esse arquivo {format}.", + "That file has {count} map objects; the limit is {limit}.": "Esse arquivo tem {count} objetos no mapa; o limite é {limit}.", + "Ground heights could not be read. Try that file again.": "Não foi possível ler as altitudes do terreno. Tente esse arquivo de novo.", + "That file has invalid point graphics.": "Esse arquivo tem gráficos de pontos inválidos.", "Overpass rate-limited": "Overpass com limite de requisições", "Overpass timed out": "Tempo esgotado no Overpass", "Overpass could not complete the query": "Overpass não conseguiu concluir a consulta", + "Map tiles temporarily unavailable": "Blocos do mapa temporariamente indisponíveis", + "Mapped names temporarily unavailable": "Nomes mapeados temporariamente indisponíveis", "Overpass temporarily unavailable": "Overpass temporariamente indisponível", - "Retrying mapped sites…": "Repetindo busca de locais mapeados…", + "Retrying mapped sites…": "Tentando de novo os locais mapeados…", "Fetching mapped sites…": "Buscando locais mapeados…", "{reason} — retrying in {seconds}s": "{reason} — nova tentativa em {seconds}s", "{reason} — retry pending": "{reason} — nova tentativa pendente", @@ -21,10 +250,22 @@ "Showing cached mapped sites": "Mostrando locais mapeados em cache", "Mapped sites not loaded": "Locais mapeados não carregados", "Mapped sites loaded": "Locais mapeados carregados", + "Military airfield": "Aeródromo militar", + "Naval base": "Base naval", + "Firing range": "Campo de tiro", + "Military land": "Terreno militar", + "Mapped installation": "Instalação mapeada", + "Military area": "Área militar", + "flight": "voo", + "military flight": "voo militar", + "satellite": "satélite", "feed unavailable": "feed indisponível", "feed stale": "feed desatualizado", "observed or mapped nearby context": "contexto observado ou mapeado nas proximidades", "no observed or mapped objects in current feeds": "nenhum objeto observado ou mapeado nos feeds atuais", + "Draw": "Desenho", + "Directions": "Rotas", + "Recent imagery": "Imagens recentes", "STATION": "ESTAÇÃO", "Crewed stations and their visiting vehicles": "Estações tripuladas e seus veículos visitantes", "NAV": "NAV", @@ -33,8 +274,8 @@ "Geostationary belt — comms and weather, fixed over the equator": "Cinturão geoestacionário — comunicações e clima, fixo sobre o equador", "VISUAL": "VISUAL", "Brightest naked-eye objects — CelesTrak visual group": "Objetos mais brilhantes a olho nu — grupo visual do CelesTrak", - "COMMS": "COMS", - "Broadband constellation shell — shown only in DENSE mode": "Malha de constelação de banda larga — exibida só no modo DENSO", + "COMMS": "TELECOM", + "Broadband constellation shell — shown only in DENSE mode": "Camada orbital da constelação de banda larga — exibida só no modo DENSO", "FISHING": "PESCA", "TOWING": "REBOQUE", "DREDGER": "DRAGA", @@ -54,6 +295,10 @@ "CARGO": "CARGUEIRO", "TANKER": "PETROLEIRO", "OTHER": "OUTROS", + "Included in bundle": "Incluído no pacote", + "Missing bundle file — reimport its bundle": "Arquivo ausente no pacote — importe o pacote de novo", + "Source configured; file checked when loaded": "Fonte configurada; o arquivo será verificado ao carregar", + "Source unavailable": "Fonte indisponível", "ENVIRONMENTAL": "AMBIENTAL", "EARTH WATCH": "VIGIA DA TERRA", "ACTIVE EVENTS": "EVENTOS ATIVOS", @@ -65,42 +310,182 @@ "Working…": "Processando…", "Could not open that mission{detail}. Retry or explore manually.": "Não foi possível abrir essa missão{detail}. Tente novamente ou explore manualmente.", "This browser is blocking storage, so that could not be saved.": "Este navegador está bloqueando o armazenamento, então não foi possível salvar.", + "NORMAL": "NORMAL", "CRT": "CRT", "NVG": "NVG", "FLIR": "FLIR", + "ANIME": "ANIME", + "NOIR": "NOIR", "SNOW": "NEVE", + "ARCTIC": "ÁRTICO", + "ANTARCTIC": "ANTÁRTICO", + "NORTH AMERICA": "AMÉRICA DO NORTE", + "SOUTH AMERICA": "AMÉRICA DO SUL", + "EUROPE": "EUROPA", + "AFRICA": "ÁFRICA", + "ASIA": "ÁSIA", + "OCEANIA": "OCEANIA", + "NORTHERN OCEANIC GRID": "GRADE OCEÂNICA NORTE", + "SOUTHERN OCEANIC GRID": "GRADE OCEÂNICA SUL", "LOADING": "CARREGANDO", "DEGRADED": "DEGRADADO", "STALE": "DESATUALIZADO", "PARTIAL": "PARCIAL", "FALLBACK": "ALTERNATIVO", + "{state} {layers}": "{state}: {layers}", + "view band|STREET": "RUA", + "view band|CITY": "CIDADE", + "view band|METRO": "METRÓPOLE", + "view band|REGIONAL": "REGIÃO", + "view band|GLOBAL": "GLOBAL", "SUMMARY": "RESUMO", "Awaiting telemetry...": "Aguardando telemetria...", "REC": "GRAV", "AIS: --": "AIS: --", + "N/A": "N/D", + "{mode} {band} {locality} | {region} | ALT {alt} | WINDOW {window} | SUN {sun}° | ONA {ona}° | {zone}": "{mode} · {band} · {locality} | {region} | ALT {alt} | JANELA {window} | SOL {sun}° | ONA {ona}° | {zone}", + "NEAR {poi} ({city}) {distance}": "PERTO DE {poi} ({city}) {distance}", + "SECTOR {lat} {lon}": "SETOR {lat} {lon}", + "hemisphere|N": "N", + "hemisphere|S": "S", + "hemisphere|E": "L", + "hemisphere|W": "O", "POWER UP · {count} KEYS WAITING": { "one": "ATIVAR · {count} CHAVE PENDENTE", - "many": "ATIVAR · {count} CHAVES PENDENTES", + "many": "ATIVAR · {count} DE CHAVES PENDENTES", "other": "ATIVAR · {count} CHAVES PENDENTES" }, "POWERED UP": "ATIVADO", + "Provider Settings does not answer proxied requests": "Configurações de provedores não responde a requisições via proxy", + "Provider Settings is disabled while sharing is enabled": "O painel \"Configurações de provedores\" fica desativado enquanto o compartilhamento estiver ativo", + "Provider Settings answers only the machine running the server": "Configurações de provedores só responde à máquina que executa o servidor", + "Provider Settings answers only local hostnames": "Configurações de provedores só responde a nomes de host locais", + "Provider Settings requires an exact local Origin": "Configurações de provedores exige um Origin local exato", + "Unrecognized Origin refused": "Origin não reconhecido: requisição recusada", + "Cross-origin requests are refused": "Requisições de outra origem são recusadas", + "Content-Type must be application/json": "Content-Type deve ser application/json", + "Method not allowed": "Método não permitido", + "Request too large": "Requisição grande demais", + "Invalid JSON": "JSON inválido", + "Body must be a JSON object of {ENV_VAR: value}": "O corpo deve ser um objeto JSON de {ENV_VAR: value}", + "No keys provided": "Nenhuma chave enviada", + "At most {limit} keys per save": "No máximo {limit} chaves por salvamento", + "Unknown key: {name}": "Chave desconhecida: {name}", + "{name} must be a string": "{name}: o valor deve ser uma string", + "{name} is empty": "{name}: o valor está vazio", + "{name} is longer than any real key ({limit} max)": "{name}: o valor é mais longo que qualquer chave real (máximo {limit})", + "{name} may only contain printable characters with no spaces": "{name}: só são aceitos caracteres imprimíveis, sem espaços", + "{name} contains a character that is not valid in a key (#, quotes, $, \\, or backtick)": "{name}: há um caractere inválido para uma chave (#, aspas, $, \\ ou crase)", + "{name} is configured outside Provider Settings and can only be changed where it was set": "{name} foi configurada fora de Configurações de provedores e só pode ser alterada onde foi definida", + "The key was not saved: could not restrict the credential file to your account; nothing was saved": "A chave não foi salva: não foi possível restringir o arquivo de credenciais à sua conta; nada foi salvo", + "The key was not saved: the existing configuration could not be read, so nothing was changed": "A chave não foi salva: não foi possível ler a configuração existente, então nada foi alterado", + "Could not write the {store} store": "Não foi possível gravar no armazenamento {store}", "Save failed ({status}).": "Falha ao salvar ({status}).", + "OAuth check failed: {detail}": "Falha ao verificar o OAuth: {detail}", + "Could not check ChatGPT sign-in. Try again.": "Não foi possível verificar o login do ChatGPT. Tente novamente.", + "VOICE AUTH · CHATGPT OAUTH": "AUTENTICAÇÃO DE VOZ · OAUTH DO CHATGPT", + "VOICE AUTH · API KEY": "AUTENTICAÇÃO DE VOZ · CHAVE DE API", + "USE API KEY": "USAR CHAVE DE API", + "USE CHATGPT OAUTH": "USAR OAUTH DO CHATGPT", + "Use OPENAI_API_KEY for the next cloud voice session": "Usar OPENAI_API_KEY na próxima sessão de voz na nuvem", + "Use the signed-in local ChatGPT/Codex OAuth session for the next cloud voice session": "Usar a sessão OAuth local do ChatGPT/Codex já conectada na próxima sessão de voz na nuvem", + "Metered — a billing-enabled account": "Cobrança por uso — uma conta com faturamento ativado", + "Optional paid token — public access works without one": "Token pago opcional — o acesso público funciona sem ele", + "Free key — register, paste, done": "Chave gratuita — cadastre-se, cole e pronto", + "browser-side": "no navegador", + "This key runs in the browser by design — restrict it at the provider (see SECURITY.md)": "Esta chave roda no navegador por design — restrinja-a no provedor (veja SECURITY.md)", + "configured externally": "configurada externamente", + "Supplied by your environment, Keychain, or launcher — change it where it was set": "Fornecida pelo seu ambiente, Keychain ou inicializador — altere-a onde foi definida", + "MANAGE ↗": "GERENCIAR ↗", + "GET KEY ↗": "OBTER CHAVE ↗", + "{envVar} saved — paste to replace": "{envVar} salva — cole outra para substituir", + "paste {envVar}": "cole {envVar}", "REMOVE": "REMOVER", "Remove {title} from this app's saved keys": "Remover {title} das chaves salvas deste app", + "unsaved provider keys": "chaves de provedores não salvas", + "Project keys: {status}": "Chaves do projeto: {status}", "your app configuration": "sua configuração do app", "your local .env": "seu .env local", "Saving…": "Salvando…", "Save failed: {detail}": "Falha ao salvar: {detail}", "Paste at least one key first.": "Cole pelo menos uma chave primeiro.", "Saved to {store}. Restarting — this page reloads itself.": "Salvo em {store}. Reiniciando — esta página recarrega sozinha.", + "Cloud voice will use OPENAI_API_KEY on the next session.": "A voz na nuvem usará OPENAI_API_KEY na próxima sessão.", + "Checking local ChatGPT OAuth sign-in…": "Verificando o login OAuth local do ChatGPT…", + "Could not check ChatGPT sign-in.": "Não foi possível verificar o login do ChatGPT.", + "ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "OAuth do ChatGPT selecionado para a voz na nuvem. Sua chave de API continua salva e disponível.", + "ChatGPT sign-in expired. Opening sign-in again…": "O login do ChatGPT expirou. Abrindo o login de novo…", + "Opening ChatGPT sign-in in your browser…": "Abrindo o login do ChatGPT no seu navegador…", + "Could not start ChatGPT sign-in on this machine.": "Não foi possível iniciar o login do ChatGPT nesta máquina.", + "Finish ChatGPT sign-in in the browser. Waiting for it to complete…": "Conclua o login do ChatGPT no navegador. Aguardando a conclusão…", + "ChatGPT sign-in timed out. Click {button} to try again.": "O tempo do login do ChatGPT esgotou. Clique em \"{button}\" para tentar novamente.", + "ChatGPT sign-in complete. OAuth will be used for the next cloud voice session.": "Login do ChatGPT concluído. O OAuth será usado na próxima sessão de voz na nuvem.", "Remove this key from your saved configuration?": "Remover esta chave da sua configuração salva?", "Removed from {store}. Restarting — this page reloads itself.": "Removido de {store}. Reiniciando — esta página recarrega sozinha.", - "Places context + Street View fallback; optional separate key": "Contexto de lugares + alternativa do Street View; chave separada opcional", + "The photorealistic 3D planet, place search + Street View": "O planeta 3D fotorrealista, busca de lugares + Street View", + "Places context + Street View fallback; optional separate key": "Contexto de lugares + Street View como alternativa; chave separada opcional", + "Voice control — API key or ChatGPT OAuth": "Controle por voz — chave de API ou OAuth do ChatGPT", + "Gemini Live voice control": "Controle por voz com Gemini Live", "Live ships, worldwide": "Navios ao vivo, no mundo todo", "Live active-fire detections": "Detecções de incêndios ativos ao vivo", - "Real live traffic (keyless runs a simulation)": "Trânsito real ao vivo (sem chave roda uma simulação)", - "Bing imagery map stacks + world terrain": "Pilhas de mapa com imagens Bing + relevo mundial", - "More flight-polling credits (anonymous works without)": "Mais créditos de consulta de voos (funciona sem, de forma anônima)", + "Real live traffic (keyless runs a simulation)": "Trânsito real ao vivo (sem chave, roda uma simulação)", + "Bing imagery map stacks + world terrain": "Pilhas de mapas com imagens do Bing + relevo mundial", + "More flight-polling credits (anonymous works without)": "Mais créditos de consulta de voos (o acesso anônimo funciona sem)", + "Street-level imagery and coverage in the Street Level layer. Free: register an app in the Mapillary developer dashboard and paste its Client Token": "Imagens e cobertura no nível da rua na camada \"Nível da rua\". Grátis: registre um app no painel de desenvolvedores do Mapillary e cole o token de cliente (Client Token)", + "Public space-missions access needs no key. Leave blank for standard use; paid tokens only raise request limits.": "O acesso público às missões espaciais não precisa de chave. Deixe em branco para o uso padrão; tokens pagos só aumentam os limites de requisições.", + "Air quality request failed": "Falha na requisição de qualidade do ar", + "No readings available": "Nenhuma leitura disponível", + "No current readings": "Sem leituras atuais", + "{count} stations reporting": { + "one": "{count} estação com dados", + "many": "{count} de estações com dados", + "other": "{count} estações com dados" + }, + "Highest air-quality readings in view": "Leituras de qualidade do ar mais altas na vista", + "Low": "Baixa", + "Low health risk": "Risco baixo para a saúde", + "Moderate": "Moderada", + "Moderate health risk": "Risco moderado para a saúde", + "High": "Alta", + "High health risk": "Risco alto para a saúde", + "Very High": "Muito alta", + "Very High health risk": "Risco muito alto para a saúde", + "Air quality": "Qualidade do ar", + "Canada only · ECCC AQHI network": "Só Canadá · rede AQHI do ECCC", + "ECCC request timed out": "A requisição ao ECCC excedeu o tempo limite", + "Malformed AQHI station response": "Resposta de estações AQHI malformada", + "No AQHI stations available": "Nenhuma estação AQHI disponível", + "Malformed AQHI observation response": "Resposta de observações AQHI malformada", + "Camera source temporarily unavailable": "Fonte de câmeras temporariamente indisponível", + "Mapped camera locations": "Locais de câmeras mapeadas", + "SHOW NEAREST": "MOSTRAR A MAIS PRÓXIMA", + "Stop following the current object before navigating to a camera": "Pare de seguir o objeto atual antes de ir até uma câmera", + "Move to the nearest loaded camera and show its details": "Ir até a câmera carregada mais próxima e mostrar seus detalhes", + "Camera badges": "Ícones de câmeras", + "Cyan cameras turn coral when selected. Wedges illustrate mapped direction, not measured coverage. Nearby cameras may be outside the screen.": "As câmeras ciano ficam coral quando selecionadas. As cunhas ilustram a direção mapeada, não a cobertura medida. Câmeras próximas podem estar fora da tela.", + "{count} nearby · {onScreen} on screen": { + "one": "{count} próxima · {onScreen} na tela", + "many": "{count} de câmeras próximas · {onScreen} na tela", + "other": "{count} próximas · {onScreen} na tela" + }, + "{count} nearby": { + "one": "{count} próxima", + "many": "{count} de câmeras próximas", + "other": "{count} próximas" + }, + "retrying mapped ALPR cameras": "tentando de novo as câmeras ALPR mapeadas", + "loading mapped ALPR cameras": "carregando câmeras ALPR mapeadas", + "No ALPR data for this area — US and Canada only": "Sem dados ALPR para esta área — só EUA e Canadá", + "Zoom in to load mapped cameras": "Aproxime o zoom para carregar as câmeras mapeadas", + "Showing cached locations": "Mostrando locais em cache", + "Coverage limited — zoom in": "Cobertura limitada — aproxime o zoom", + "No ALPR data for this area": "Sem dados ALPR para esta área", + "None on screen — nearby cameras are outside the view": "Nenhuma na tela — as câmeras próximas estão fora da vista", + "ALPR camera": "Câmera ALPR", + "Camera coverage unavailable": "Cobertura de câmeras indisponível", + "OpenStreetMap · community mapped": "OpenStreetMap · mapeado pela comunidade", + "Overpass returned an incomplete camera response": "O Overpass retornou uma resposta de câmeras incompleta", + "At least {count}": "Pelo menos {count}", "CONTEXT READY": "CONTEXTO PRONTO", "GLOBAL CONTEXT OFF": "CONTEXTO GLOBAL DESLIGADO", "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "SELECIONE UM VOO, EMBARCAÇÃO OU INSTALAÇÃO MAPEADA", @@ -112,11 +497,17 @@ "PREVIOUS": "ANTERIOR", "FOCUS": "FOCAR", "Next — nearest unvisited contact in the 250 km window": "Próximo — contato não visitado mais próximo na janela de 250 km", - "NEXT": "PRÓX", + "NEXT": "PRÓX.", + "Named areas ({n})": "Áreas com nome ({n})", + "{distance} FLIGHT / VESSEL WINDOW": "JANELA DE VOOS / EMBARCAÇÕES DE {distance}", "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "Contexto mapeado/observado de fontes abertas. Transmissões ausentes, áreas de mapa não carregadas ou locais não mapeados não são prova de ausência.", + "mapped matches within {km} km of the subject": "correspondências mapeadas a até {km} km do alvo", + "none mapped within {km} km; not a complete 250 km survey": "nenhuma mapeada a até {km} km; não é uma varredura completa de 250 km", + "mapped matches from the loaded viewport": "correspondências mapeadas na vista carregada", + "viewport feed is not a complete 250 km survey": "os dados da vista não são uma varredura completa de 250 km", "HDG {value}°": "HDG {value}°", - "BRG {value}°": "RMO {value}°", - "BRG —": "RMO —", + "BRG {value}°": "BRG {value}°", + "BRG —": "BRG —", "CRS {value}°": "CRS {value}°", "CURRENT VIEWPORT ONLY": "SÓ A VISTA ATUAL", "WITHIN {km} KM": "EM ATÉ {km} KM", @@ -126,6 +517,7 @@ "Mapped installations": "Instalações mapeadas", "syncing {count} city feeds...": "sincronizando {count} feeds de cidades...", "scanning nearby systems...": "buscando sistemas próximos...", + "GBFS fetch error": "erro ao obter dados GBFS", "Station {id}": "Estação {id}", "Station": "Estação", "🚲 {bikes} avail · {docks} docks · {capacity} cap": "🚲 {bikes} disp · {docks} docas · {capacity} cap", @@ -136,18 +528,186 @@ "{count} CAMERAS STANDING BY · NO CAMERA SELECTED · CLICK A CAMERA TO ACTIVATE": "{count} CÂMERAS EM ESPERA · NENHUMA CÂMERA SELECIONADA · CLIQUE EM UMA CÂMERA PARA ATIVAR", "No cameras available in catalog.": "Nenhuma câmera disponível no catálogo.", "{city} CCTV": "CCTV {city}", + "FOV {value}° (DATASHEET)": "FOV {value}° (FICHA TÉCNICA)", "FOV {value}°": "FOV {value}°", - "COVERAGE {value}km²": "COBERTURA {value}km²", - "OVERLAP {count} cams": "SOBREPOSIÇÃO {count} câm", + "SPEC FOV {span}° (CAPABILITY)": "FOV DA FICHA {span}° (CAPACIDADE)", + "COVERAGE {value}km²": "COBERTURA {value} km²", + "OVERLAP {count} cams": "SOBREPOSIÇÃO {count} câm.", "ISOLATED VIEW": "VISTA ISOLADA", - "PROJ MONITOR": "PROJ MONITOR", - "PROJ OFF": "PROJ DESLIG.", - "VIEWSHED": "VIEWSHED", + "PROJ MONITOR": "PROJ. MONITOR", + "PROJ OFF": "PROJ. DESLIG.", + "VIEWSHED": "ÁREA VISÍVEL", "CAL {value}": "CAL {value}", "SRC {value}": "FONTE {value}", "{value} CONTEXT": "CONTEXTO {value}", + "{spec} · SPECS: CCTV-DATABASE.COM": "{spec} · ESPECIFICAÇÕES: CCTV-DATABASE.COM", + "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "Atlântico e Pacífico Norte oriental/central; não é uma cobertura mundial de ciclones.", + "Cyclone advisories unavailable": "Boletins de ciclones indisponíveis", + "Cyclone data unavailable": "Dados de ciclones indisponíveis", + "Potential tropical cyclone": "Potencial ciclone tropical", + "Post-tropical cyclone": "Ciclone pós-tropical", + "Hurricane": "Furacão", + "Tropical storm": "Tempestade tropical", + "Tropical depression": "Depressão tropical", + "Subtropical storm": "Tempestade subtropical", + "Subtropical depression": "Depressão subtropical", + "Track and cone match this advisory": "A trajetória e o cone correspondem a este boletim", + "Track/cone awaiting advisory {number}": "Trajetória/cone aguardando o boletim {number}", + "Track/cone unavailable": "Trajetória/cone indisponível", + "Cached advisory · stale source": "Boletim em cache · fonte desatualizada", + "Loading advisories…": "Carregando boletins…", + "{count} active storms": { + "one": "{count} ciclone ativo", + "many": "{count} de ciclones ativos", + "other": "{count} ciclones ativos" + }, + "Position as of {time}": "Posição às {time}", + "Maximum sustained wind: {wind} · Pressure: {pressure}": "Vento máximo sustentado: {wind} · Pressão: {pressure}", + "{name} · {classification} · Advisory {number} · issued {time}": "{name} · {classification} · Boletim {number} · emitido {time}", + "No active NHC/CPHC systems": "Nenhum sistema ativo do NHC/CPHC", + "Advisories unavailable": "Boletins indisponíveis", + "Cyclones · NHC / CPHC": "Ciclones · NHC / CPHC", + "Atlantic · E/C Pacific": "Atlântico · Pacífico L/C", + "{storms} · {name} selected": "{storms} · {name} selecionado", + "Official advisory ↗": "Boletim oficial ↗", + "Active NHC and CPHC cyclone advisories": "Boletins de ciclones ativos do NHC e do CPHC", + "Wind unavailable": "Vento indisponível", + "Advisory center / forecast track": "Centro do ciclone no boletim / trajetória prevista", + "Center-track uncertainty cone": "Cone de incerteza da trajetória do centro", + "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "Selecione um ciclone no mapa ou escolha um na lista para selecioná-lo e mover a câmera. Clique em um espaço vazio do mapa para limpar a seleção. Contexto dos boletins NOAA NHC/CPHC. O cone descreve a incerteza da trajetória prevista do centro, não o tamanho do ciclone nem toda a área de risco. Os rótulos dos pontos de previsão são horas de antecedência da fonte, não horários calculados a partir da emissão do boletim. A geometria acompanha a superfície; a altura não é altitude meteorológica. Consulte o boletim oficial.", + "DRIVE": "CARRO", + "Drive": "De carro", + "WALK": "A PÉ", + "Walk": "A pé", + "BIKE": "BIKE", + "Bike": "De bicicleta", + "rate limited": "limite de requisições atingido", + "routing service is rate limited": "o serviço de rotas atingiu o limite de requisições", + "route leg too long": "trecho da rota longo demais", + "route too long": "rota longa demais", + "{error} — try again in a moment": "{error} — tente novamente em instantes", + "Routing is rate limited — try again in a moment": "O limite de requisições de rotas foi atingido — tente novamente em instantes", + "Routing unavailable (HTTP {status})": "Rotas indisponíveis (HTTP {status})", + "Routing unavailable": "Rotas indisponíveis", + "direction|left": "à esquerda", + "direction|right": "à direita", + "direction|slightly left": "levemente à esquerda", + "direction|slightly right": "levemente à direita", + "direction|sharply left": "acentuadamente à esquerda", + "direction|sharply right": "acentuadamente à direita", + "direction|straight": "em frente", + "direction|around": "no sentido contrário", + "fork direction|left": "à esquerda", + "fork direction|right": "à direita", + "fork direction|slightly left": "levemente à esquerda", + "fork direction|slightly right": "levemente à direita", + "fork direction|sharply left": "bem à esquerda", + "fork direction|sharply right": "bem à direita", + "fork direction|straight": "em frente", + "lane direction|left": "da esquerda", + "lane direction|right": "da direita", + "lane direction|slightly left": "da esquerda", + "lane direction|slightly right": "da direita", + "lane direction|sharply left": "da extrema esquerda", + "lane direction|sharply right": "da extrema direita", + "lane direction|straight": "central", + "ordinal|{number}st": "{number}ª", + "ordinal|{number}nd": "{number}ª", + "ordinal|{number}rd": "{number}ª", + "ordinal|{number}th": "{number}ª", + "Head out on {road}": "Siga por {road}", + "Head out": "Inicie o trajeto", + "Arrive at your destination, on the left": "Seu destino está à esquerda", + "Arrive at your destination, on the right": "Seu destino está à direita", + "Arrive at your destination": "Você chegou ao seu destino", + "Make a U-turn onto {road}": "Faça o retorno para {road}", + "Make a U-turn": "Faça o retorno", + "Continue straight onto {road}": "Siga em frente por {road}", + "Continue straight": "Siga em frente", + "Turn {direction} onto {road}": "Vire {direction} em {road}", + "Turn {direction}": "Vire {direction}", + "Turn onto {road}": "Vire em {road}", + "maneuver|Turn": "Vire", + "Continue {direction} onto {road}": "Siga {direction} por {road}", + "Continue {direction}": "Siga {direction}", + "At the end of the road, turn {direction} onto {road}": "No fim da via, vire {direction} em {road}", + "At the end of the road, turn {direction}": "No fim da via, vire {direction}", + "At the end of the road, continue onto {road}": "No fim da via, siga por {road}", + "At the end of the road, continue": "No fim da via, siga", + "Keep {direction} at the fork onto {road}": "Na bifurcação, mantenha-se {direction} em direção a {road}", + "Keep {direction} at the fork": "Na bifurcação, mantenha-se {direction}", + "Continue at the fork onto {road}": "Na bifurcação, siga por {road}", + "Continue at the fork": "Na bifurcação, siga", + "Merge {direction} onto {road}": "Entre {direction} em {road}", + "Merge {direction}": "Entre na via {direction}", + "Merge onto {road}": "Entre em {road}", + "maneuver|Merge": "Entre na via", + "Take the ramp on the {direction} onto {road}": "Pegue a rampa {direction} para {road}", + "Take the ramp on the {direction}": "Pegue a rampa {direction}", + "Take the ramp {direction} onto {road}": "Pegue a rampa {direction} para {road}", + "Take the ramp {direction}": "Pegue a rampa {direction}", + "Take the ramp onto {road}": "Pegue a rampa para {road}", + "Take the ramp": "Pegue a rampa", + "Take the exit on the {direction} onto {road}": "Pegue a saída {direction} para {road}", + "Take the exit on the {direction}": "Pegue a saída {direction}", + "Take the exit {direction} onto {road}": "Pegue a saída {direction} para {road}", + "Take the exit {direction}": "Pegue a saída {direction}", + "Take the exit onto {road}": "Pegue a saída para {road}", + "Take the exit": "Pegue a saída", + "At the roundabout, take the {exit} exit onto {road}": "Na rotatória, pegue a {exit} saída para {road}", + "At the roundabout, take the {exit} exit": "Na rotatória, pegue a {exit} saída", + "Enter the roundabout onto {road}": "Entre na rotatória para {road}", + "Enter the roundabout": "Entre na rotatória", + "At the roundabout, turn {direction} onto {road}": "Na rotatória, vire {direction} em {road}", + "At the roundabout, turn {direction}": "Na rotatória, vire {direction}", + "At the roundabout, continue onto {road}": "Na rotatória, siga por {road}", + "At the roundabout, continue": "Na rotatória, siga", + "Exit the roundabout onto {road}": "Saia da rotatória para {road}", + "Exit the roundabout": "Saia da rotatória", + "Use the {direction} lane onto {road}": "Use a faixa {direction} para {road}", + "Use the {direction} lane": "Use a faixa {direction}", + "Continue onto {road}": "Siga por {road}", + "maneuver|Continue": "Siga", + "{mode} — reroute for {modeLower}": "{mode} — recalcular a rota {modeLower}", + "CLICK MAP": "CLIQUE NO MAPA", + "SET A": "DEFINIR A", + "Click a spot on the globe to place A (click again to cancel)": "Clique em um ponto do globo para colocar A (clique de novo para cancelar)", + "Then click the globe to place the start": "Depois clique no globo para colocar a partida", + "SET B": "DEFINIR B", + "Click a spot on the globe to place B (click again to cancel)": "Clique em um ponto do globo para colocar B (clique de novo para cancelar)", + "Then click the globe to place the destination": "Depois clique no globo para colocar o destino", + "Swap A and B": "Trocar A e B", + "FLY ···": "VOAR ···", + "FLYING": "VOANDO", + "FLY": "VOAR", + "Fly the camera along the route": "Voar com a câmera ao longo da rota", + "Place A and B first": "Coloque A e B primeiro", + "action|CLEAR": "LIMPAR", + "Remove the route and both markers": "Remover a rota e os dois marcadores", + "press Escape twice to leave Draw": "pressione Esc duas vezes para sair de Desenho", + "{name} is active — turn {name} off, then set {endpoint}": "{name} está ativo — desative {name} e depois defina {endpoint}", + "{name} is active — {leave}, then set {endpoint}": "{name} está ativo — {leave} e depois defina {endpoint}", + "Only the first {count} turns of this route are shown": "Só as primeiras {count} conversões desta rota são mostradas", + "Turn-by-turn directions": "Instruções passo a passo", + "Another map tool is using clicks — close it, then SET A again": "Outra ferramenta do mapa está usando os cliques — feche-a e pressione DEFINIR A de novo", + "Routing…": "Calculando a rota…", + "No route found": "Nenhuma rota encontrada", + "{distance} · {duration} · {mode} · first {count} turns": "{distance} · {duration} · {mode} · primeiras {count} conversões", + "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", + "Click the globe to place {endpoint}": "Clique no globo para colocar {endpoint}", + "SET B, then click the globe": "Pressione DEFINIR B e depois clique no globo", + "SET A, then click the globe": "Pressione DEFINIR A e depois clique no globo", + "Step {step} of {total} · then {leg}": "Passo {step} de {total} · depois {leg}", + "Step {step} of {total}": "Passo {step} de {total}", + "Then: {instruction}": "Depois: {instruction}", + "No route found between A and B": "Nenhuma rota encontrada entre A e B", + "Routing failed: {error}": "Falha ao calcular a rota: {error}", + "Routing timed out": "O cálculo da rota excedeu o tempo limite", + "Routing unavailable — no response from the routing service": "Rotas indisponíveis — sem resposta do serviço de rotas", + "Earthquake source unavailable": "Fonte de terremotos indisponível", "Focus fire detection {title}, {details}": "Focar detecção de incêndio {title}, {details}", - "{value} conf": "{value} conf", + "live feed unavailable": "feed ao vivo indisponível", + "{value} conf": "confiança {value}", "{value} ago": "há {value}", "sensor n/a": "sensor n/d", "FIRE · {frp} MW": "INCÊNDIO · {frp} MW", @@ -157,17 +717,93 @@ "FIRES": "INCÊNDIOS", "max {value} MW": "máx {value} MW", "new {value}": "novo {value}", + "{value}°N": "{value}°N", + "{value}°S": "{value}°S", + "{value}°E": "{value}°L", + "{value}°W": "{value}°O", "just now": "agora mesmo", - "<1m ago": "há <1min", - "{count}m ago": "há {count}min", + "<1m ago": "há <1 min", + "{count}m ago": "há {count} min", "{count}h ago": "há {count}h", + "fire confidence|high": "alta", + "fire confidence|nominal": "nominal", + "fire confidence|low": "baixa", + "age|<1h": "<1 h", + "age|{count}h": "{count} h", + "age|{count}d": "{count} d", "STALE · cached {age}": "DESATUALIZADO · em cache {age}", "refreshing...": "atualizando...", "loading...": "carregando...", "KEY REQUIRED": "CHAVE NECESSÁRIA", "LIVE · updated {age}": "AO VIVO · atualizado {age}", + "Source snapshot time unavailable": "Horário do snapshot da fonte indisponível", + "Live data unavailable": "Dados ao vivo indisponíveis", + "Intel Picture": "Panorama de inteligência", + "Kinetic 30d": "Cinético 30 d", + "Border Crisis": "Crise na fronteira", + "Iran Picture": "Panorama do Irã", + "Iran Kinetic": "Irã cinético", + "Yemen FLOT": "FLOT do Iêmen", + "Latest Drop": "Última publicação", + "GhostMaps file could not be read": "Não foi possível ler o arquivo do GhostMaps", + "{count} source links ↗ · click card to open the first": { + "one": "{count} link da fonte ↗ · clique no cartão para abrir", + "many": "{count} de links das fontes ↗ · clique no cartão para abrir o primeiro", + "other": "{count} links das fontes ↗ · clique no cartão para abrir o primeiro" + }, + "S2 · {name}": "S2 · {name}", + "Report": "Relatório", + "Open the source for {title}": "Abrir a fonte de {title}", + "GhostMaps catalog unavailable": "Catálogo do GhostMaps indisponível", + "LIVE · GitHub {commit} · {message} · checked every {seconds}s": "AO VIVO · GitHub {commit} · {message} · verificado a cada {seconds} s", + "GitHub {commit} · {message} · reconnecting for live updates": "GitHub {commit} · {message} · reconectando para receber atualizações ao vivo", + "Connecting to the S2 GhostMaps repository…": "Conectando ao repositório S2 GhostMaps…", + "{count} placemarks": { + "one": "{count} marcador", + "many": "{count} de marcadores", + "other": "{count} marcadores" + }, + "S2 Underground publishes these KMZ products to GitHub. New uploads are detected within seconds and replace the previous edition automatically. Click a marker for its report.": "O S2 Underground publica estes produtos KMZ no GitHub. Novos envios são detectados em segundos e substituem a edição anterior automaticamente. Clique em um marcador para ver o relatório.", + "Malformed GhostMaps catalog": "Catálogo do GhostMaps malformado", + "Low-accuracy score < 2%": "Índice de baixa precisão < 2%", + "Low-accuracy score 2–10%": "Índice de baixa precisão 2–10%", + "Low-accuracy score > 10%": "Índice de baixa precisão > 10%", + "GNSS integrity source unavailable": "Fonte de integridade GNSS indisponível", + "Regional sample · 250 nm radius · cells from visited views over 30 min": "Amostra regional · raio de 250 NM · células das vistas visitadas em 30 min", + "Retrying automatically at {time} UTC": "Nova tentativa automática às {time} UTC", + "Retrying automatically after provider cooldown": "Nova tentativa automática após a pausa do provedor", + "Updates automatically after pan or zoom and once a minute. The public feed covers a 250-nautical-mile circle around the view centre; zooming out does not make it a worldwide snapshot. Blank cells are outside sampled coverage or have insufficient observations.": "Atualiza automaticamente após mover ou dar zoom e uma vez por minuto. O feed público cobre um círculo de 250 milhas náuticas ao redor do centro da vista; afastar o zoom não o transforma em um snapshot mundial. Células vazias estão fora da cobertura amostrada ou não têm observações suficientes.", + "Low-accuracy score = 100 × max(0, bad − 1) / total: one aircraft is discounted, so this is not the raw share. Cells need {aircraft} aircraft over {minutes} minutes. Navigation-integrity anomalies are not a detection of jamming or spoofing.": "Índice de baixa precisão = 100 × max(0, ruins − 1) / total: uma aeronave é descontada, então não é a proporção bruta. Cada célula precisa de {aircraft} aeronaves em {minutes} minutos. Anomalias de integridade de navegação não são detecção de interferência (jamming) nem de falsificação (spoofing).", + "GNSS snapshot needs a view anchor": "O snapshot GNSS precisa de um ponto de referência da vista", + "GNSS feed rate limited (HTTP 429)": "Feed GNSS: limite de requisições atingido (HTTP 429)", + "Malformed GNSS integrity snapshot": "Snapshot de integridade GNSS malformado", + "GNSS integrity snapshot has no observation time": "O snapshot de integridade GNSS não tem horário de observação", + "installation class|AIRFIELD": "AERÓDROMO", + "installation class|NAVAL BASE": "BASE NAVAL", + "installation class|RANGE": "CAMPO DE TIRO", + "installation class|MILITARY LAND": "TERRENO MILITAR", + "installation class|BASE": "BASE", + "installation class|BARRACKS": "QUARTEL", + "installation class|TRAINING AREA": "ÁREA DE TREINAMENTO", + "installation class|PLACES CANDIDATE": "DO GOOGLE PLACES", + "installation class|INSTALLATION": "INSTALAÇÃO", + "No mapped sites within {km} km of the contact": "Nenhum local mapeado a até {km} km do contato", + "{count} mapped sites within {km} km of the contact": { + "one": "{count} local mapeado a até {km} km do contato", + "many": "{count} de locais mapeados a até {km} km do contato", + "other": "{count} locais mapeados a até {km} km do contato" + }, + "No mapped sites in view": "Nenhum local mapeado na vista", + "{count} mapped sites in view": { + "one": "{count} local mapeado na vista", + "many": "{count} de locais mapeados na vista", + "other": "{count} locais mapeados na vista" + }, "loading mapped installation context": "carregando contexto da instalação mapeada", + "Too many mapped sites in view to list them all": "Há locais mapeados demais na vista para listar todos", + "Installation context unavailable": "Contexto de instalações indisponível", "MAPPED INSTALLATION": "INSTALAÇÃO MAPEADA", + "Unknown": "Desconhecido", "LAUNCH SITE · {site}": "LOCAL DE LANÇAMENTO · {site}", "LAUNCH SITE": "LOCAL DE LANÇAMENTO", "T−{time} · {mission}": "T−{time} · {mission}", @@ -181,7 +817,7 @@ "UNSPECIFIED": "NÃO ESPECIFICADO", "+{count} additional payload records": "+{count} registros de carga útil adicionais", "PAYLOAD DATA UNAVAILABLE": "DADOS DA CARGA ÚTIL INDISPONÍVEIS", - "{value} KM DOWNRANGE": "{value} KM DOWNRANGE", + "{value} KM DOWNRANGE": "{value} KM DE PERCURSO", "POSITION UNAVAILABLE": "POSIÇÃO INDISPONÍVEL", "FLIGHT {count}": "VOO {count}", "REUSED": "REUTILIZADO", @@ -193,6 +829,7 @@ "Select {mission}": "Selecionar {mission}", "{value} KM": "{value} KM", "{value} KM/S": "{value} KM/S", + "Selected Space Mission": "Missão espacial selecionada", "SELECTED SPACE MISSION": "MISSÃO ESPACIAL SELECIONADA", "Show all missions": "Mostrar todas as missões", "Deselect mission": "Desmarcar missão", @@ -216,12 +853,12 @@ "Replay speed multiplier": "Multiplicador de velocidade da reprise", "REPLAY ASCENT": "REPRISE DA SUBIDA", "Previous mission": "Missão anterior", - "PREV": "ANT", + "PREV": "ANT.", "Next mission": "Próxima missão", "SHOW ALL / DESELECT": "MOSTRAR TODAS / DESMARCAR", "Pause replay": "Pausar reprise", "Cancel replay": "Cancelar reprise", - "EST. DOWNRANGE": "DOWNRANGE EST.", + "EST. DOWNRANGE": "DIST. ESTIMADA", "PLANNED · ": "PLANEJADO · ", "SUPPLIED TRAJECTORY POINTS": "PONTOS DE TRAJETÓRIA FORNECIDOS", "RECONSTRUCTED ESTIMATE": "ESTIMATIVA RECONSTRUÍDA", @@ -233,23 +870,105 @@ "Ascent replay": "Reprise da subida", "Orbit replay": "Reprise da órbita", ", paused": ", pausado", + "Malformed launch snapshot": "Snapshot de lançamentos malformado", + "Heard by your receiver": "Captado pelo seu receptor", + "1090 MHz": "1090 MHz", + "978 MHz UAT": "978 MHz UAT", + "browser SDR": "SDR do navegador", + "decoder feed": "feed do decodificador", + "Your RTL-SDR receiver and decoder feed": "Seu receptor RTL-SDR e o feed do decodificador", + "Your decoder feed": "Seu feed do decodificador", + "Your RTL-SDR receiver": "Seu receptor RTL-SDR", + "NO CALLSIGN": "SEM INDICATIVO", + "ALT {altitude} FT · GS {speed} KT · TRK {track}": "ALT {altitude} FT · VEL. SOLO {speed} KT · TRK {track}", + "V/S {rate}": "VEL. VERT. {rate}", + "V/S {rate} FPM": "VEL. VERT. {rate} FT/MIN", + "POSITION {age}": "POSIÇÃO {age}", + "POSITION {seconds} S AGO": "POSIÇÃO HÁ {seconds} S", + "{count} MSGS": { + "one": "{count} MENSAGEM", + "many": "{count} DE MENSAGENS", + "other": "{count} MENSAGENS" + }, + "Decoder feeds": "Feeds do decodificador", + "WebUSB + decoder feeds": "WebUSB + feeds do decodificador", + "opening receiver": "abrindo o receptor", + "checking decoder feeds": "verificando os feeds do decodificador", + "WebUSB needs desktop Chrome or Edge": "O WebUSB requer Chrome ou Edge para desktop", + "connect a receiver in Radio": "conecte um receptor em Rádio", + "receiver is in FM mode": "o receptor está no modo FM", + "listening": "escutando", + "USB error": "erro de USB", "Alt unknown": "Alt. desconhecida", "Type unknown": "Tipo desconhecido", "Reg unknown": "Matrícula desconhecida", "Operator unknown": "Operador desconhecido", + "${amount}K": "US$ {amount} mil", + "${amount}M": "US$ {amount} mi", + "${amount}B": "US$ {amount} bi", + "fire cause|Human": "humana", + "fire cause|Natural": "natural", + "fire cause|Undetermined": "indeterminada", + "fire cause|Unknown": "desconhecida", + "fire behavior|Minimal": "atividade mínima", + "fire behavior|Moderate": "atividade moderada", + "fire behavior|Active": "atividade alta", + "fire behavior|Extreme": "atividade extrema", + "Type {level} Incident": "incidente tipo {level}", + "age|{count}m": "{count} min", + "{acres} ac": { + "one": "{acres} acre", + "many": "{acres} de acres", + "other": "{acres} acres" + }, + "{percent}% contained": "{percent}% contido", + "containment unknown": "contenção desconhecida", + "{cause} cause": "causa: {cause}", + "{personnel} personnel": { + "one": "{personnel} pessoa na equipe", + "many": "{personnel} de pessoas na equipe", + "other": "{personnel} pessoas na equipe" + }, + "{county} County": "condado de {county}", + "{cost} to date": "{cost} até agora", + "discovered {age} ago": "detectado há {age}", + "updated {age} ago": "atualizado há {age}", + "part of {complex}": "parte de {complex}", + "InciWeb ↗ · click card to open": "InciWeb ↗ · clique no cartão para abrir", + "FIRE · {name}": "INCÊNDIO · {name}", + "Unnamed incident": "Sem nome", + "Open {title} on InciWeb": "Abrir {title} no InciWeb", + "Perimeter source unavailable": "Fonte de perímetros indisponível", + "Not contained or unknown": "Não contido ou desconhecido", + "Under 50% contained": "Menos de 50% contido", + "50–99% contained": "50–99% contido", + "Fully contained": "Totalmente contido", + "Colour shows reported containment. Perimeters are simplified to about 100 m.": "A cor indica a contenção informada. Os perímetros são simplificados para cerca de 100 m.", + "Malformed perimeter snapshot": "Snapshot de perímetros malformado", + "radio tag|All": "Todas", "News": "Notícias", "Talk": "Conversa", "Weather / Emergency": "Clima / Emergência", - "Public Safety": "Segurança Pública", + "Public Safety": "Segurança pública", "Aviation / Marine": "Aviação / Marítimo", "Traffic / Transit": "Trânsito / Transporte", "Music": "Música", "Other": "Outras", + "Directory refresh degraded; showing the previous station catalog.": "A atualização do diretório foi parcial; mostrando o catálogo de estações anterior.", + "Radio directory coverage is degraded.": "O diretório de rádio está funcionando com falhas.", + "Directory refresh failed; showing the previous station catalog.": "A atualização do diretório falhou; mostrando o catálogo de estações anterior.", + "Radio directory is temporarily unavailable.": "O diretório de rádio está temporariamente indisponível.", + "radio|NEWS": "NOTÍCIAS", "radio|TALK": "CONVERSA", + "radio|WEATHER": "CLIMA", "radio|SAFETY": "SEGURANÇA", "radio|AIR / SEA": "AR / MAR", "radio|TRANSIT": "TRANSPORTE", "radio|MUSIC": "MÚSICA", + "radio|OTHER": "OUTRAS", + "Broadcaster stream is unavailable or blocked by the browser.": "O stream da emissora está indisponível ou foi bloqueado pelo navegador.", + "Playback requires a direct click or tap.": "A reprodução exige um clique ou toque direto.", + "Broadcaster stream could not be started.": "Não foi possível iniciar o stream da emissora.", "Alternative": "Alternativo", "Ambient": "Ambiente", "Blues": "Blues", @@ -275,14 +994,122 @@ "Techno": "Techno", "Trance": "Trance", "World": "Mundial", - "Add the full Starlink broadband shell (thousands of extra points)": "Adicionar toda a malha de banda larga Starlink (milhares de pontos extras)", - "Loading the Starlink shell…": "Carregando a malha Starlink…", + "overview": "visão geral", + "cloud unknown": "nebulosidade desconhecida", + "{percent}% scene cloud": "{percent}% de nuvens na cena", + "{min}–{max}% scene cloud": "{min}–{max}% de nuvens na cena", + "Comparison in use by another scene": "A comparação está em uso por outra cena", + "Esri map unavailable · no swipe": "Mapa Esri indisponível · sem comparação", + "Swipe needs a globe map": "A comparação precisa de um mapa de globo", + "Imagery stays on Esri · CLEAR to use Google 3D": "As imagens continuam no Esri · LIMPAR para usar o Google 3D", + "Imagery catalog unavailable": "Catálogo de imagens indisponível", + "Catalog truncated · a newer clear day may exist": "Catálogo truncado · pode haver um dia limpo mais recente", + "{label} catalog unavailable · {detail}": "Catálogo de {label} indisponível · {detail}", + "Daily overview for today may still be empty until the pass": "A visão geral diária de hoje pode continuar vazia até a passagem do satélite", + "Box and images cleared": "Área e imagens limpas", + "MORE DETAIL · 30 m": "MAIS DETALHE · 30 m", + "Sentinel-2 and Landsat via HLS, 30 m, every 2–6 days": "Sentinel-2 e Landsat via HLS, 30 m, a cada 2–6 dias", + "DAILY OVERVIEW · 250 m": "VISÃO GERAL DIÁRIA · 250 m", + "VIIRS daily mosaic, 250 m, follows broad changes; little detail under 25 km": "Mosaico diário do VIIRS, 250 m, acompanha mudanças amplas; pouco detalhe abaixo de 25 km", + "Sentinel-2": "Sentinel-2", + "Sentinel-2 via HLS": "Sentinel-2 via HLS", + "Landsat 8/9": "Landsat 8/9", + "Landsat 8/9 via HLS": "Landsat 8/9 via HLS", + "Daily overview": "Visão geral diária", + "Box edges must be finite": "Coordenadas da área inválidas", + "Longitudes must be within ±180°": "As longitudes devem estar dentro de ±180°", + "Select one side of the dateline": "Não cruze a linha internacional de data", + "Box must enclose an area": "A área deve delimitar uma superfície", + "Add the full Starlink broadband shell (thousands of extra points)": "Adicionar toda a camada orbital de banda larga da Starlink (milhares de pontos extras)", + "Loading the Starlink shell…": "Carregando a camada orbital da Starlink…", "Starlink {detail} — click to retry": "Starlink {detail} — clique para tentar novamente", "load failed": "falha ao carregar", - "Showing the full Starlink shell — click for the core catalog only": "Mostrando toda a malha Starlink — clique para ver só o catálogo principal", + "Showing the full Starlink shell — click for the core catalog only": "Mostrando toda a camada orbital da Starlink — clique para ver só o catálogo principal", "DENSE ···": "DENSO ···", "DENSE ✕": "DENSO ✕", "DENSE": "DENSO", + "CelesTrak unreachable": "CelesTrak inacessível", + "DOCKED · {name} · +{extra}": "ACOPLADO · {name} · +{extra}", + "DOCKED · {name}": "ACOPLADO · {name}", + "{name} needs the Google 3D map: choose it under MAP SOURCE": "{name} requer o mapa Google 3D: escolha-o em FONTE DO MAPA", + "zoom in to a street to open {name}": "aproxime o zoom de uma rua para abrir {name}", + "loading coverage...": "carregando cobertura...", + "No street-level imagery within {radius} m of that point": "Nenhuma imagem no nível da rua a até {radius} m desse ponto", + "No street-level imagery within {radius} m of the view centre": "Nenhuma imagem no nível da rua a até {radius} m do centro da vista", + "Zoom in to see street-level coverage": "Aproxime o zoom para ver a cobertura no nível da rua", + "Point the camera at the ground for street-level coverage": "Aponte a câmera para o chão para ver a cobertura no nível da rua", + "Coverage tile failed": "Falha ao carregar o bloco de cobertura", + "The photo could not be loaded": "Não foi possível carregar a foto", + "{name} photo. ← and → step along the sequence. On a 360° photo, drag or use Shift+← →, ↑ ↓ to look around, and + − to zoom": "Foto do {name}. ← e → avançam pela sequência. Em uma foto 360°, arraste ou use Shift+← →, ↑ ↓ para olhar ao redor, e + − para dar zoom", + "{name} street-level photo": "Foto no nível da rua do {name}", + "Previous photo in this sequence (←)": "Foto anterior da sequência (←)", + "Next photo in this sequence (→)": "Próxima foto da sequência (→)", + "Aim the middle of the view at a street to look for imagery there": "Aponte o centro da vista para uma rua para buscar imagens ali", + "KEY REJECTED": "CHAVE RECUSADA", + "GOOGLE_MAPS_API_KEY is not set": "GOOGLE_MAPS_API_KEY não está configurada", + "The Google Maps JavaScript API could not load": "Não foi possível carregar a API Maps JavaScript do Google", + "Google Street View": "Google Street View", + "GOOGLE STREET VIEW": "GOOGLE STREET VIEW", + "Google refused GOOGLE_MAPS_API_KEY for Street View — check that the Maps JavaScript API is enabled for it and this site is an allowed referrer": "O Google recusou a GOOGLE_MAPS_API_KEY para o Street View — verifique se a API Maps JavaScript está ativada para a chave e se este site é um referenciador permitido", + "Street View did not answer — check the network, and that the Maps JavaScript API is enabled for GOOGLE_MAPS_API_KEY": "O Street View não respondeu — verifique a rede e se a API Maps JavaScript está ativada para a GOOGLE_MAPS_API_KEY", + "click a street to open Street View": "clique em uma rua para abrir o Street View", + "Street View has no imagery for this place": "O Street View não tem imagens deste lugar", + "KartaView has no position for this photo": "O KartaView não tem a posição desta foto", + "The KartaView photo could not be loaded": "Não foi possível carregar a foto do KartaView", + "zoom in to see KartaView coverage": "aproxime o zoom para ver a cobertura do KartaView", + "no KartaView photos in view": "nenhuma foto do KartaView na vista", + "KartaView is rate-limiting requests — they resume on their own": "O KartaView está limitando as requisições — elas são retomadas sozinhas", + "KartaView’s photos here are archived and cannot be shown": "As fotos do KartaView aqui estão arquivadas e não podem ser exibidas", + "KartaView did not filter this area in time — move the map to ask again": "O KartaView não filtrou esta área a tempo — mova o mapa para pedir de novo", + "None of KartaView’s photos here pass the imagery filter": "Nenhuma foto do KartaView aqui passa no filtro de imagens", + "KartaView did not answer in time — try again": "O KartaView não respondeu a tempo — tente novamente", + "KartaView could not be reached — check the network": "Não foi possível acessar o KartaView — verifique a rede", + "KartaView sent an answer that could not be read": "O KartaView enviou uma resposta que não pôde ser lida", + "KartaView is rate-limiting requests": "O KartaView está limitando as requisições", + "KartaView sent too much data": "O KartaView enviou dados demais", + "KartaView is rate-limiting requests — try again in a moment": "O KartaView está limitando as requisições — tente novamente em instantes", + "KartaView has no such photo": "O KartaView não tem essa foto", + "Mapillary rejected MAPILLARY_CLIENT_TOKEN — replace it in Provider Settings": "O Mapillary recusou o MAPILLARY_CLIENT_TOKEN — substitua-o em Configurações de provedores", + "Coverage requests are being rate-limited — they resume on their own": "As requisições de cobertura estão sendo limitadas — elas são retomadas sozinhas", + "The Panoramax photo could not be loaded": "Não foi possível carregar a foto do Panoramax", + "Panoramax is busy — coverage resumes on its own": "O Panoramax está sobrecarregado — a cobertura volta sozinha", + "no Panoramax photos in view": "nenhuma foto do Panoramax na vista", + "no Panoramax photos here match the filters": "nenhuma foto do Panoramax aqui atende aos filtros", + "Panoramax sent a map tile that could not be read": "O Panoramax enviou um bloco do mapa que não pôde ser lido", + "This Panoramax photo is no longer available": "Esta foto do Panoramax não está mais disponível", + "zoom in to see Panoramax coverage": "aproxime o zoom para ver a cobertura do Panoramax", + "Panoramax did not answer in time — try again": "O Panoramax não respondeu a tempo — tente novamente", + "Panoramax could not be reached — check the connection": "Não foi possível acessar o Panoramax — verifique a conexão", + "Panoramax sent too much data": "O Panoramax enviou dados demais", + "Panoramax is busy": "O Panoramax está sobrecarregado", + "Panoramax sent an unreadable answer": "O Panoramax enviou uma resposta ilegível", + "Sequence images unavailable": "Imagens da sequência indisponíveis", + "No street-level imagery providers configured": "Nenhum provedor de imagens no nível da rua configurado", + "(by upload date)": "(por data de envio)", + "Open the Street Level panel to view imagery": "Abra o painel \"Nível da rua\" para ver as imagens", + "Image could not be opened": "Não foi possível abrir a imagem", + "TeleGeography load failed": "Falha ao carregar o TeleGeography", + "UNAVAILABLE · {source} · Roads unavailable": "INDISPONÍVEL · {source} · Vias indisponíveis", + "Roads: {source}": "Vias: {source}", + "TomTom roads unavailable while the traffic service is unreachable": "Vias do TomTom indisponíveis enquanto o serviço de trânsito estiver inacessível", + "Hybrid unavailable while the traffic service is unreachable": "Modo híbrido indisponível enquanto o serviço de trânsito estiver inacessível", + "TomTom roads need a TomTom key": "As vias do TomTom precisam de uma chave do TomTom", + "Hybrid needs a TomTom key": "O modo híbrido precisa de uma chave do TomTom", + "Local surface still loading": "A superfície sob as vias ainda está carregando", + "Partial coverage": "Cobertura parcial", + "Detailed roads unavailable": "Vias detalhadas indisponíveis", + "Reduced detail coverage": "Cobertura com menos detalhe", + "TomTom roads only, each with its live flow": "Só vias do TomTom, cada uma com seu fluxo ao vivo", + "TomTom roads only, each with its live flow (needs a TomTom key)": "Só vias do TomTom, cada uma com seu fluxo ao vivo (precisa de uma chave do TomTom)", + "OpenStreetMap roads, with TomTom flow matched when available": "Vias do OpenStreetMap, com o fluxo do TomTom associado quando disponível", + "TomTom roads first; OpenStreetMap fills the rest, simulated": "Primeiro as vias do TomTom; o OpenStreetMap completa o resto com fluxo simulado", + "TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "Primeiro as vias do TomTom; o OpenStreetMap completa o resto com fluxo simulado (precisa de uma chave do TomTom)", + "Hybrid": "Híbrido", + "TomTom key unavailable": "Chave do TomTom indisponível", + "TomTom daily budget reached": "Limite diário do TomTom atingido", + "TomTom upstream unreachable": "Servidor do TomTom inacessível", + "TomTom flow unavailable": "Fluxo do TomTom indisponível", + "SIMULATED — {reason}": "SIMULADO — {reason}", "Syncing flow · Roads: {source}": "Sincronizando fluxo · Vias: {source}", "LIVE · Roads: {source} · Roads without flow hidden": "AO VIVO · Vias: {source} · Vias sem fluxo ocultas", "LIVE · Roads: {source} · No flow roads in view": "AO VIVO · Vias: {source} · Nenhuma via com fluxo na vista", @@ -294,57 +1121,477 @@ "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "SIMULADO · Vias: OpenStreetMap · Fluxo: TomTom (sem correspondências)", "SIMULATED — traffic service unreachable": "SIMULADO — serviço de trânsito inacessível", "SIMULATED — add TomTom key for live": "SIMULADO — adicione a chave TomTom para dados ao vivo", + "OpenFreeMap tiles rate-limited": "Blocos do OpenFreeMap com limite de requisições", + "OpenFreeMap tiles timed out": "Os blocos do OpenFreeMap excederam o tempo limite", + "OpenFreeMap tiles unavailable": "Blocos do OpenFreeMap indisponíveis", + "occupancy|empty": "vazio", + "occupancy|many seats available": "muitos assentos livres", + "occupancy|few seats available": "poucos assentos livres", + "occupancy|standing room only": "só em pé", + "occupancy|crushed standing room only": "lotado, só em pé", + "occupancy|full": "cheio", + "occupancy|not accepting passengers": "não aceita passageiros", + "occupancy|not boardable": "embarque indisponível", + "Route {route}": "Linha {route}", + "Vehicle {vehicle}": "Veículo {vehicle}", + "vehicle motion|Stopped": "Parado", + "No recent fix": "Sem posição recente", + "Waiting for update": "Aguardando atualização", + "Moving": "Em movimento", + "reported {speed} km/h": "velocidade informada: {speed} km/h", + "reported hdg {heading}°": "rumo informado: {heading}°", + "Last report: stopped at stop {stop}": "Último relato: parado no ponto {stop}", + "Last report: arriving at stop {stop}": "Último relato: chegando ao ponto {stop}", + "Last report: next stop {stop}": "Último relato: próximo ponto {stop}", + "Shown at street level · depth not in the feed": "Exibido no nível da rua · o feed não informa a profundidade", + "Reported {seconds} s ago": "Informado há {seconds} s", + "Reported {minutes} min ago": "Informado há {minutes} min", + "shown {seconds} s behind": "exibido com {seconds} s de atraso", + "{reported} (feed time)": "{reported} (horário do feed)", + "Available trail: {minutes} min (limited)": "Rastro disponível: {minutes} min (limitado)", + "Available trail: {minutes} min": "Rastro disponível: {minutes} min", + "Bus": "Ônibus", + "Tram": "Bonde", + "Subway": "Metrô", + "Train": "Trem", + "Ferry": "Balsa", + "Transit vehicle": "Veículo de transporte público", "AIS: {name}": "AIS: {name}", - "{type} SPD: {speed} HDG: {heading}": "{type} VEL: {speed} HDG: {heading}", + "{type} SPD: {speed} HDG: {heading}": "{type} SPD: {speed} HDG: {heading}", "VESSEL": "EMBARCAÇÃO", + "{speed}KT": "{speed} KT", + "{heading}DEG": "{heading}°", "POS: LIVE": "POS: AO VIVO", "POS: {time}Z": "POS: {time}Z", + "AIS live load failed": "Falha ao carregar o AIS ao vivo", "awaiting first AIS position…": "aguardando primeira posição AIS…", "awaiting usable AIS positions…": "aguardando posições AIS utilizáveis…", "awaiting first AIS message…": "aguardando primeira mensagem AIS…", + "AISSTREAM_API_KEY not set": "AISSTREAM_API_KEY não configurada", + "live feed unsupported": "feed ao vivo não suportado", + "connecting to feed…": "conectando ao feed…", + "feed disconnected": "feed desconectado", + "feed down": "feed fora do ar", + "feed idle": "feed inativo", + "API key rejected — check AISSTREAM_API_KEY": "Chave de API recusada — verifique a AISSTREAM_API_KEY", + "feed silent {seconds}s — no AIS data": "feed em silêncio há {seconds} s — sem dados AIS", + "feed silent — no AIS data": "feed em silêncio — sem dados AIS", + "feed down — retrying slowly (attempt {attempt})": "feed fora do ar — tentando de novo devagar (tentativa {attempt})", + "reconnecting to feed… (attempt {attempt})": "reconectando ao feed… (tentativa {attempt})", + "feed down — retrying slowly": "feed fora do ar — tentando de novo devagar", + "reconnecting to feed…": "reconectando ao feed…", + "Focus vessel {name}, MMSI {mmsi}": "Focar a embarcação {name}, MMSI {mmsi}", + "Hidden by this map source · choose a globe map": "Oculto com esta fonte do mapa · escolha um mapa de globo", + "Weather image HTTP {status}": "Imagem do clima: HTTP {status}", + "Weather HTTP {status}": "Clima: HTTP {status}", + "Frame unavailable; previous observation retained": "Quadro indisponível; a observação anterior foi mantida", + "Weather imagery unavailable": "Imagens meteorológicas indisponíveis", + "Weather source unavailable; previous observation retained": "Fonte meteorológica indisponível; a observação anterior foi mantida", + "Weather unavailable": "Clima indisponível", + "No frame within {gap} min of {time}": "Nenhum quadro a ±{gap} min de {time}", + "No frame within {gap} h of {time}": "Nenhum quadro a ±{gap} h de {time}", + "{hours}h {minutes}m ago": "há {hours} h {minutes} min", + "{minutes}m ago": "há {minutes} min", + "{state} · {time} · {lag}": "{state} · {time} · {lag}", + "Observed": "Observado", + "History": "Histórico", + "Observation unavailable": "Observação indisponível", + "Waiting for observation": "Aguardando observação", + "{detail} · synced": "{detail} · sinc.", + "{detail} · nearest": "{detail} · mais próximo", + "RADAR REFLECTIVITY · dBZ": "REFLETIVIDADE DE RADAR · dBZ", + "LIGHTNING DENSITY · 15 min accumulation": "DENSIDADE DE RAIOS · acumulado de 15 min", + "GLOBAL INFRARED · hourly": "INFRAVERMELHO GLOBAL · a cada hora", + "GOES INFRARED · ~5 min": "INFRAVERMELHO GOES · ~5 min", + "{state}: {time}": "{state}: {time}", + "Latest observation": "Última observação", + "frame {index}/{total}": "quadro {index}/{total}", + "loading": "carregando", + "Observation: unavailable": "Observação: indisponível", + "Contiguous US · gaps ≠ no rain": "EUA contíguos · lacunas ≠ sem chuva", + "Americas + Pacific · not individual strikes": "Américas + Pacífico · não são raios individuais", + "Color: strikes/km²/min ×10³": "Cor: raios/km²/min ×10³", + "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · normalmente com 2–3 h de atraso", + "North America · infrared imagery": "América do Norte · imagens infravermelhas", + "Reduced motion · history playback unavailable": "Movimento reduzido · reprodução do histórico indisponível", + "Reduced motion · manual history available": "Movimento reduzido · é possível percorrer o histórico manualmente", + "Rain radar · US": "Radar de chuva · EUA", + "Lightning density · 15 min": "Densidade de raios · 15 min", + "Satellite clouds": "Nuvens por satélite", + "Americas + Pacific": "Américas + Pacífico", + "Global · 60°S–60°N": "Global · 60°S–60°N", + "North America": "América do Norte", + "Source observations delayed": "Observações da fonte com atraso", + "Stale source": "Fonte desatualizada", + "Loading next frame…": "Carregando o próximo quadro…", + "Map center outside coverage": "Centro do mapa fora da cobertura", + "strikes/km²/min ×10³": "raios/km²/min ×10³", + "N. America": "Am. do Norte", + "Global": "Global", + "Hourly global mosaic; usually 2–3 hours delayed": "Mosaico global por hora; normalmente com 2–3 horas de atraso", + "GOES regional clouds; approximately 5-minute updates": "Nuvens regionais do GOES; atualizações a cada 5 minutos aproximadamente", + "Clouds only": "Só nuvens", + "Apply the full cloud brightness key; 100% filter strength": "Aplica o filtro completo de brilho das nuvens; intensidade do filtro 100%", + "Full": "Completa", + "Show the complete infrared image; 0% filter strength": "Mostra a imagem infravermelha completa; intensidade do filtro 0%", + "Soft": "Suave", + "Vivid": "Intensa", + "Image opacity; does not alter the observed values": "Opacidade da imagem; não altera os valores observados", + "View US radar": "Ver radar dos EUA", + "View Americas & Pacific": "Ver Américas e Pacífico", + "View coverage": "Ver cobertura", + "{value} strikes/km²/min ×10³ (15-minute density)": "{value} raios/km²/min ×10³ (densidade de 15 minutos)", + "{value} dBZ radar reflectivity": "{value} dBZ de refletividade de radar", + "STALE · cached source metadata": "DESATUALIZADO · metadados da fonte em cache", + "Map center is outside source coverage": "O centro do mapa está fora da cobertura da fonte", + "NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "Densidade de raios de 15 minutos da NOAA/NWS derivada do Vaisala NLDN/GLD360. Cobertura de 110°L, passando pelo Pacífico/Américas, até 0°, 25°S–80°N. Não é uma contagem de raios ao vivo, nem cobertura global, nem um alerta de segurança.", + "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "Os ecos de radar NOAA MRMS indicam padrões de precipitação, não a intensidade da chuva, nem um alerta de tempestade, nem uma previsão futura. Fonte nativa de aproximadamente 1 km; a exibição é limitada ao nível 6. Os quadros usam os horários de observação exatos informados.", + "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "Infravermelho de onda longa GOES-19/18, banda 14, regional; mosaico global de onda longa da NESDIS. Só nuvens escurece tudo, exceto os topos de nuvens brilhantes e frios; é um filtro de brilho, não uma máscara de nuvens. A cobertura e a atualização variam por região.", + "REGION": "REGIÃO", + "IMAGE": "IMAGEM", + "FILTER": "FILTRO", + "Cloud filter strength": "Intensidade do filtro de nuvens", + "OPACITY": "OPACIDADE", + "Infrared decode failed": "Falha ao decodificar o infravermelho", + "Weather prefetch unavailable": "Pré-carregamento do clima indisponível", + "Weather tiles unavailable · previous frame retained": "Blocos meteorológicos indisponíveis · o quadro anterior foi mantido", + "Some weather tiles unavailable": "Alguns blocos meteorológicos indisponíveis", + "Malformed weather manifest": "Manifesto do clima malformado", + "Weather request timed out": "A requisição do clima excedeu o tempo limite", + "Temperature field unavailable": "Campo de temperatura indisponível", + "Mean sea level pressure field unavailable": "Campo de pressão ao nível do mar indisponível", + "Wind upstream unavailable": "Origem dos dados de vento indisponível", + "{source} HTTP {status}": "{source}: HTTP {status}", + "Wind": "Vento", + "Wind source unavailable": "Fonte de vento indisponível", + "Forecast · does not follow history": "Previsão · não acompanha o histórico", + "Wind motion": "Movimento do vento", + "Wind speed": "Velocidade do vento", + "Sea-level pressure": "Pressão ao nível do mar", + "Air temperature · 2 m": "Temperatura do ar · 2 m", + "Global · 1° grid": "Global · grade de 1°", + "{model} forecast · {time}": "Previsão {model} · {time}", + "Loading forecast": "Carregando previsão", + "Preparing flow": "Preparando fluxo", + "Selected field unavailable": "Campo selecionado indisponível", + "Cached forecast · stale": "Previsão em cache · desatualizada", + "ECMWF IFS surface forecast": "Previsão de superfície ECMWF IFS", + "NOAA GFS surface forecast": "Previsão de superfície NOAA GFS", + "Reduced motion": "Movimento reduzido", "Resume": "Retomar", "Pause": "Pausar", + "Pause visual flow; forecast time does not advance with animation": "Pausa o fluxo visual; o horário da previsão não avança com a animação", + "None": "Nenhum", + "Speed": "Velocidade", + "Pressure": "Pressão", + "Temperature": "Temperatura", + "Wind trails with no field shading": "Rastros de vento sem sombreamento do campo", + "How hard the surface wind is blowing": "Com que força o vento sopra na superfície", + "Sea-level air pressure: broad highs and lows": "Pressão do ar ao nível do mar: altas e baixas amplas", + "Air temperature two meters above the surface": "Temperatura do ar a dois metros acima da superfície", + "Wind speed units": "Unidades de velocidade do vento", + "Read wind at map center": "Ler o vento no centro do mapa", + "Read the forecast at the center of the map without changing selection": "Ler a previsão no centro do mapa sem mudar a seleção", + "{model} forecast · {field} ({unit})": "Previsão {model} · {field} ({unit})", + "Valid: {time}": "Válida: {time}", + "preparing": "preparando", + "Issued: {time}": "Emitida: {time}", + "Selected field unavailable · wind remains visible": "Campo selecionado indisponível · o vento continua visível", + "{error} · wind remains visible": "{error} · o vento continua visível", + "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "Vento de superfície a 10 m. Grade global de aproximadamente 1°. As curvas seguem o campo de vento a 10 m, elevadas 12 km para ficarem visíveis; a altura exibida não é altitude meteorológica. A iluminação da vista serve para facilitar a leitura. A animação mostra o fluxo de uma única previsão fixa; ela não avança o tempo. Os campos de cor cobrem o mapa base do globo ou os 3D Tiles fotorrealistas ativos.", + "MODEL": "MODELO", + "FIELD": "CAMPO", + "UNITS": "UNIDADES", + "MOTION": "MOVIMENTO", + "Forecast": "Previsão", + "N": "N", + "NNE": "NNE", + "NE": "NE", + "ENE": "ENE", + "E": "L", + "ESE": "ESE", + "SE": "SE", + "SSE": "SSE", + "S": "S", + "SSW": "SSO", + "SW": "SO", + "WSW": "OSO", + "W": "O", + "WNW": "ONO", + "NW": "NO", + "NNW": "NNO", + "No surface reading": "Sem leitura na superfície", + "Aim the map center at Earth": "Aponte o centro do mapa para a Terra", + "A location reading needs a loaded forecast and the Earth at the center of the view.": "A leitura de um ponto precisa de uma previsão carregada e da Terra no centro da vista.", + "Interpolated model forecast on an approximately 1° grid. Broad weather patterns, not a street-level measurement.": "Previsão de modelo interpolada em uma grade de aproximadamente 1°. Padrões meteorológicos gerais, não uma medição no nível da rua.", + " · calm": " · calmo", + " from {direction}": " de {direction}", + "WIND AT {coordinates}": "VENTO EM {coordinates}", + "{model} · valid {time}": "{model} · válida {time}", + "Wind speed field unavailable": "Campo de velocidade do vento indisponível", + "Globe imagery unavailable": "Imagens do globo indisponíveis", + "Globe field image unavailable": "Imagem do campo no globo indisponível", + "Unknown wind model": "Modelo de vento desconhecido", + "Unknown weather overlay": "Camada de clima desconhecida", + "Wind request timed out": "A requisição de vento excedeu o tempo limite", + "Malformed wind manifest": "Manifesto de vento malformado", + "Malformed wind grid": "Grade de vento malformada", "Error: {message}": "Erro: {message}", - "Needs {envVars} — add it in Provider Settings": "Requer {envVars} — adicione em Configurações de Provedores", + "Needs {envVars} — add it in Provider Settings": "Requer {envVars} — adicione em Configurações de provedores", "{label} is unavailable": "{label} indisponível", "This map stack": "Esta pilha de mapa", "{label} unavailable: {hint}": "{label} indisponível: {hint}", + "Google 3D tiles unavailable — check the key's API restrictions, quota, or network": "Google 3D Tiles indisponível — verifique as restrições de API da chave, a cota ou a rede", + "Needs {envVars} — add it in Provider Settings — or a Cesium ion token for the ion-hosted route": "Requer {envVars} — adicione em Configurações de provedores — ou um token do Cesium ion para a rota hospedada no ion", + "Exit cockpit to fly to a camera": "Saia da cabine para voar até uma câmera", + "Exit cockpit to fly to a location": "Saia da cabine para voar até um local", + "Exit cockpit to fly to a photo": "Saia da cabine para voar até uma foto", + "Exit cockpit to fly to a shared view": "Saia da cabine para voar até uma vista compartilhada", + "Exit cockpit to fly to a target": "Saia da cabine para voar até um alvo", + "Exit cockpit to fly to a vessel": "Saia da cabine para voar até uma embarcação", + "Exit cockpit to fly to a fire": "Saia da cabine para voar até um incêndio", + "Exit cockpit to fly to a route": "Saia da cabine para voar até uma rota", + "Exit cockpit to fly to a file": "Saia da cabine para voar até um arquivo", + "Exit cockpit to fly to a scene": "Saia da cabine para voar até uma cena", + "Exit cockpit to view weather coverage": "Saia da cabine para ver a cobertura da camada de clima", + "Exit cockpit to fly to a cyclone": "Saia da cabine para voar até um ciclone", + "Exit cockpit to fly to an aircraft": "Saia da cabine para voar até uma aeronave", + "Exit cockpit to fly to a satellite": "Saia da cabine para voar até um satélite", + "Exit cockpit to frame contacts": "Saia da cabine para enquadrar contatos", "Visible map targets": "Alvos visíveis no mapa", + "Focusing {label}": "Focando {label}", + "Source": "Fonte", + "Camera ownership changed": "O controle da câmera mudou", + "Saved project could not be read; storage preserved. Import a valid file to resume saving.": "Não foi possível ler o projeto salvo; o armazenamento foi preservado. Importe um arquivo válido para voltar a salvar.", "Ready": "Pronto", + "Scene layer turned off": "Camada da cena desativada", + "Stopped": "Parado", + "Scene not saved — existing saved project could not be read. Export edits or import a valid file.": "Cena não salva — não foi possível ler o projeto salvo. Exporte as alterações ou importe um arquivo válido.", + "Scene not saved — {reason}": "Cena não salva — {reason}", + "Scene not saved — browser storage unavailable": "Cena não salva — armazenamento do navegador indisponível", "Loaded: {scene} / {shot}": "Carregado: {scene} / {shot}", + "Cannot update {scene}: shot inventory changed": "Não é possível atualizar {scene}: o inventário de planos mudou", + "Cannot update {scene}: evidence beats changed": "Não é possível atualizar {scene}: os momentos de evidência mudaram", + "Cannot update {scene}: shot bindings are incomplete": "Não é possível atualizar {scene}: os vínculos dos planos estão incompletos", + "Updated {count} shots: {scene}": { + "one": "{count} plano atualizado: {scene}", + "many": "{count} de planos atualizados: {scene}", + "other": "{count} planos atualizados: {scene}" + }, + "Appended {count} shots: {scene}": { + "one": "{count} plano adicionado: {scene}", + "many": "{count} de planos adicionados: {scene}", + "other": "{count} planos adicionados: {scene}" + }, "Cannot capture shot: camera not ready": "Não foi possível capturar o plano: câmera não está pronta", "Captured: {scene} / {shot}": "Capturado: {scene} / {shot}", "Select a shot first": "Selecione um plano primeiro", "Updated: {scene} / {shot}": "Atualizado: {scene} / {shot}", + "Could not leave scene: {scene}": "Não foi possível sair da cena: {scene}", + "Seeked: {scene} / {shot}": "Posicionado em: {scene} / {shot}", + "Seeking scene clock": "Movendo o relógio da cena", "Camera unavailable — exit cockpit first": "Câmera indisponível — saia da cabine primeiro", "No shots to run": "Nenhum plano para executar", + "Scene transition limit reached — load a shot to reset": "Limite de transições de cena atingido — carregue um plano para redefinir", + "Export failed: {error}": "Falha na exportação: {error}", "Project exported": "Projeto exportado", + "Importing project": "Importando projeto", + "Imported {file}": "Importado: {file}", + "Import failed: {error}": "Falha na importação: {error}", + "Import failed (could not read JSON file)": "Falha na importação (não foi possível ler o arquivo JSON)", + "Layers refused: {layers}": "Camadas recusadas: {layers}", "Could not exit {mode} — scene layers may be refused": "Não foi possível sair de {mode} — as camadas da cena podem ser recusadas", + "Camera move interrupted": "Movimento de câmera interrompido", + "Scene media timed out": "A mídia da cena excedeu o tempo limite", + "Action complete": "Ação concluída", + "Action unavailable or cancelled": "Ação indisponível ou cancelada", + "Scene actions": "Ações da cena", + "Select a feature or use Tab and Enter to choose an action.": "Selecione um elemento ou use Tab e Enter para escolher uma ação.", + "Selected feature: {feature}. Choose an action.": "Elemento selecionado: {feature}. Escolha uma ação.", "Running {index}/{total}: {scene} / {shot}": "Executando {index}/{total}: {scene} / {shot}", "Scene run complete": "Execução da cena concluída", - "Global Flights Radar": "Radar Global de Voos", - "Orbital Watch": "Vigilância Orbital", - "Thermal Threat Board": "Painel de Ameaças Térmicas", - "City Overload": "Sobrecarga Urbana", - "Omniscience Pullback": "Recuo da Onisciência", + "Bhote Koshi Evidence Sequence": "Sequência de evidências do Bhote Koshi", + "Nepal Flood Incident": "Incidente de inundação no Nepal", + "Global Flights Radar": "Radar global de voos", + "Orbital Watch": "Vigilância orbital", + "Thermal Threat Board": "Painel de ameaças térmicas", + "City Overload": "Sobrecarga urbana", + "Omniscience Pullback": "Recuo da onisciência", + "Global Incident Context": "Contexto global do incidente", + "Nepal-Focused Globe Rotation": "Rotação do globo até o Nepal", + "Bhote Koshi Regional Approach": "Aproximação regional ao Bhote Koshi", + "Bhote Koshi Nearby Cities": "Cidades próximas ao Bhote Koshi", + "Bhote Koshi Incident Corridor": "Corredor do incidente do Bhote Koshi", + "Bhote Koshi Flood Path": "Percurso da inundação do Bhote Koshi", + "Bhote Koshi Corridor Overview": "Visão geral do corredor do Bhote Koshi", + "Bhote Koshi Upper Valley": "Vale superior do Bhote Koshi", + "Upper Valley Collapse": "Colapso no vale superior", + "Debris-Dammed Lake": "Lago represado por detritos", + "Nepal-China Border Gate": "Posto de fronteira Nepal-China", + "Timure Evidence Cluster": "Grupo de evidências de Timure", + "Syabru Besi Passage": "Passagem por Syabru Besi", + "Bidur / Trishuli Consequence": "Consequências em Bidur / Trishuli", + "Final view": "Vista final", + "Scene {n}": "Cena {n}", "Shot {n}": "Plano {n}", + "the title of scene {scene} is empty or longer than {max} characters": "o título da cena {scene} está vazio ou passa de {max} caracteres", + "the title of shot {shot} in scene {scene} is empty or longer than {max} characters": "o título do plano {shot} da cena {scene} está vazio ou passa de {max} caracteres", + "the project is larger than 5 MiB": "o projeto tem mais de 5 MiB", + "the project has too many shots": "o projeto tem planos demais", + "the scene data failed validation": "os dados da cena não passaram na validação", + "Could not complete this action. Check the file, references and selected assets.": "Não foi possível concluir esta ação. Verifique o arquivo, as referências e os recursos selecionados.", + "{count} scenes": { + "one": "{count} cena", + "many": "{count} de cenas", + "other": "{count} cenas" + }, + "{count} shots": { + "one": "{count} plano", + "many": "{count} de planos", + "other": "{count} planos" + }, + "{count} data packs": { + "one": "{count} pacote de dados", + "many": "{count} de pacotes de dados", + "other": "{count} pacotes de dados" + }, + "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}": "{scene} / {pack}: {status}. Arquivo: {path}. {attribution} · {license}", + "Unavailable layers: {layers}": "Camadas indisponíveis: {layers}", + "Uses registered content or linked media. Those external files are not included in a scene bundle. Their original notices still apply.": "Usa conteúdo registrado ou mídia vinculada. Esses arquivos externos não são incluídos no pacote da cena. Os avisos originais deles continuam valendo.", + "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "{bytes} bytes do pacote verificados. Os arquivos ficam na memória durante esta sessão. Importe o pacote de novo depois de recarregar o app.", + "Review scene import": "Revisar a importação da cena", + "Nothing is loaded or changed until you apply this file.": "Nada é carregado nem alterado até você aplicar este arquivo.", + "Ready to import": "Pronto para importar", + "Apply replaces the current project. Export your current project first if you want to keep both.": "Aplicar substitui o projeto atual. Exporte o projeto atual primeiro se quiser manter os dois.", + "Apply import": "Aplicar importação", + "Import was not applied. The current project may have changed.": "A importação não foi aplicada. O projeto atual pode ter mudado.", + "Select a scene and shot first": "Selecione uma cena e um plano primeiro", + "Edit scene details": "Editar os detalhes da cena", + "Camera positions use degrees and meters above the ellipsoid. Drafts are validated before they replace your saved scene.": "As posições da câmera usam graus e metros acima do elipsoide. Os rascunhos são validados antes de substituir a cena salva.", + "Anchors and data packs": "Âncoras e pacotes de dados", + "Shot camera, timing, packs and actions": "Câmera, tempos, pacotes e ações do plano", + "New anchor ID": "ID da nova âncora", + "Capture camera as anchor": "Capturar a câmera como âncora", + "Anchor added to draft": "Âncora adicionada ao rascunho", + "Set move start to current camera": "Definir o início do movimento na câmera atual", + "Move added to draft; destination remains the shot camera": "Movimento adicionado ao rascunho; o destino continua sendo a câmera do plano", + "Use ordinary flight": "Usar voo comum", + "Invalid shot JSON": "JSON de plano inválido", + "Apply details": "Aplicar detalhes", + "Select a scene first": "Selecione uma cena primeiro", + "Share selected scene": "Compartilhar a cena selecionada", + "Scene JSON preserves authored settings and attribution. It does not include asset files. Bundles include only pack files you choose here or previously imported bundle files.": "O JSON da cena preserva as configurações do autor e a atribuição. Ele não inclui arquivos de recursos. Os pacotes incluem só os arquivos de pacotes de dados que você escolher aqui ou os arquivos de pacotes importados antes.", + "Download scene JSON": "Baixar JSON da cena", + "Choose data-pack files": "Escolher arquivos do pacote de dados", + "Or choose a data-pack folder": "Ou escolha uma pasta de pacote de dados", + "Download asset bundle": "Baixar pacote de recursos", + "Asset bundle downloaded": "Pacote de recursos baixado", + "No RTL-SDR device selected": "Nenhum dispositivo RTL-SDR selecionado", + "WebUSB requires desktop Chrome or Edge on localhost/HTTPS": "O WebUSB requer Chrome ou Edge para desktop em localhost/HTTPS", + "RTL-SDR access failed; close other SDR apps and check USB permissions": "Falha ao acessar o RTL-SDR; feche outros apps de SDR e verifique as permissões USB", + "RTL-SDR connection failed": "Falha na conexão com o RTL-SDR", + "Receiving 1090 MHz ADS-B": "Recebendo ADS-B em 1090 MHz", + "Receiving broadcast FM": "Recebendo rádio FM", + "Connect an RTL-SDR to begin.": "Conecte um RTL-SDR para começar.", + "WebUSB is unavailable in this browser": "O WebUSB não está disponível neste navegador", + "USB work abandoned after a stalled transfer": "Operação USB abandonada após uma transferência travada", + "SDR decoder worker failed": "Falha no processo do decodificador SDR", + "SDR decoder did not start; receiver stopped": "O decodificador SDR não iniciou; receptor parado", + "SDR decoder stopped responding; receiver stopped": "O decodificador SDR parou de responder; receptor parado", + "SDR decoder fell behind; receiver stopped": "O decodificador SDR ficou para trás; receptor parado", + "WebUSB requires desktop Chrome or Edge": "O WebUSB requer Chrome ou Edge para desktop", + "Waiting for an RTL-SDR device…": "Aguardando um dispositivo RTL-SDR…", + "Browser audio is suspended; press Connect again to resume it": "O áudio do navegador está suspenso; pressione Conectar de novo para retomá-lo", + "RTL-SDR sample stream stopped": "Fluxo de amostras do RTL-SDR parado", + "Switching to {mode}…": "Mudando para {mode}…", + "Browser audio is suspended; select FM again to resume it": "O áudio do navegador está suspenso; selecione FM de novo para retomá-lo", + "RTL-SDR gain change failed": "Não foi possível mudar o ganho do RTL-SDR", + "Tuned to {mhz} MHz FM": "Sintonizado em {mhz} MHz FM", + "Seeking up…": "Buscando para cima…", + "Seeking down…": "Buscando para baixo…", + "Seek stopped": "Busca parada", + "Scanning {mhz} MHz…": "Varrendo {mhz} MHz…", + "Found {mhz} MHz · {snr} dB": "Encontrado {mhz} MHz · {snr} dB", + "FM signal found at {mhz} MHz": "Sinal FM encontrado em {mhz} MHz", + "No FM signal found": "Nenhum sinal FM encontrado", + "Browser location is unavailable": "A localização do navegador não está disponível", + "Receiver location was not granted": "A permissão de localização do receptor não foi concedida", + "RTL-SDR disconnected": "RTL-SDR desconectado", + "Upstream response too large": "Resposta da origem grande demais", + "Vector tile request timed out": "A requisição de blocos vetoriais excedeu o tempo limite", + "Vector tiles unavailable": "Blocos vetoriais indisponíveis", + "Vector tile metadata unavailable": "Metadados dos blocos vetoriais indisponíveis", + "Zoom in for vector tile coverage": "Aproxime o zoom para carregar os blocos vetoriais", + "Saturation": "Saturação", + "Edge Thickness": "Espessura das bordas", + "Contrast": "Contraste", + "Grain": "Granulação", + "Vignette": "Vinheta", + "Pixelation": "Pixelização", + "Distortion": "Distorção", + "Instability": "Instabilidade", "Density": "Densidade", + "Gain": "Ganho", "Bloom": "Bloom", + "Scanlines": "Linhas de varredura", + "Sensitivity": "Sensibilidade", + "WHOT/BHOT": "WHOT/BHOT", + "Ironbow": "Ironbow", + "unsaved CCTV calibration": "a calibração de CCTV não salva", + "the open cockpit": "a cabine aberta", + "Switching language reloads the page. This will be lost: {items}. Switch anyway?": "Mudar de idioma recarrega a página. Isto será perdido: {items}. Mudar mesmo assim?", "VISUAL PRESETS": "PREDEFINIÇÕES VISUAIS", "LOCATION": "LOCAL", "CONTACTS — nearest planes · vessels · sites": "CONTATOS — aviões · embarcações · locais mais próximos", "SPACE MISSIONS — launches & orbital assets": "MISSÕES ESPACIAIS — lançamentos e ativos orbitais", "LIVE SIGNALS": "SINAIS AO VIVO", - "Contacts could not complete the requested transition; try again": "Contatos não conseguiram concluir a transição solicitada; tente novamente", + "Contacts could not complete the requested transition; try again": "Contatos: não foi possível concluir a transição solicitada; tente novamente", "CCTV layer unavailable": "Camada de CCTV indisponível", + "Link shared": "Link compartilhado", "Link copied!": "Link copiado!", "Copy failed": "Falha ao copiar", + "Return map to straight-down view": "Voltar o mapa à vista de cima", + "Tilt map to oblique view": "Inclinar o mapa para uma vista oblíqua", + "Reset map to north up. Current heading {heading} degrees": "Orientar o mapa com o norte para cima. Rumo atual: {heading} graus", + "Tilted view": "Vista inclinada", + "Straight-down view": "Vista de cima", + "North up": "Norte para cima", "CCTV calibration saved": "Calibração do CCTV salva", + "HDG": "HDG", + "PITCH": "INCL.", + "FOV": "FOV", + "RANGE": "RANGE", + "HGT": "ALT.", + "ΔN": "ΔN", + "ΔE": "ΔL", + "{value}m": "{value} m", "CCTV calibration reset": "Calibração do CCTV redefinida", "ADJUST ON": "AJUSTE LIGADO", "ADJUST": "AJUSTAR", + "SNAPSHOT": "SNAPSHOT", + "LIVE": "AO VIVO", + "UPSTREAM": "ORIGEM", + "SYNTHETIC": "SINTÉTICO", + "CONFIGURED": "CONFIGURADO", + "SEED": "CATÁLOGO", "UNKNOWN": "DESCONHECIDO", + "OK": "OK", "ERROR": "ERRO", + "Live HLS connected": "HLS ao vivo conectado", + "Live HLS unavailable": "HLS ao vivo indisponível", + "No stream URL configured": "Nenhuma URL de stream configurada", + "Live stream connected": "Stream ao vivo conectado", + "Snapshot feed connected": "Feed de snapshots conectado", + "Media fetch failed": "Falha ao obter a mídia", + "Upstream snapshot active": "Snapshot da origem ativo", + "Fallback Street View frame": "Quadro alternativo do Street View", + "Upstream unavailable": "Origem indisponível", + "No source configured": "Nenhuma fonte configurada", + "Configured source": "Fonte configurada", + "Configured Source": "Fonte configurada", + "Synthetic fallback": "Alternativa sintética", + "Upstream HTTP {status}": "Origem: HTTP {status}", + "Unexpected media type {type}": "Tipo de mídia inesperado: {type}", "SOURCE · UNKNOWN": "FONTE · DESCONHECIDA", "FRAME · LOADING": "QUADRO · CARREGANDO", "FRAME · UNAVAILABLE": "QUADRO · INDISPONÍVEL", @@ -353,7 +1600,7 @@ "RAW PRIOR": "ESTIMATIVA BRUTA", "CCTV ON": "CCTV LIGADO", "CCTV OFF": "CCTV DESLIG.", - "VIEWSHED ON": "VIEWSHED LIGADO", + "VIEWSHED ON": "ÁREA VISÍVEL LIGADA", "COVERAGE ON": "COBERTURA LIGADA", "COVERAGE OFF": "COBERTURA DESLIG.", "AUTO HOP ON": "AUTO SALTO LIGADO", @@ -363,16 +1610,16 @@ "CAL · EDITED (UNSAVED)": "CAL · EDITADA (NÃO SALVA)", "CAL · {badge}": "CAL · {badge}", "MONITOR": "MONITOR", - "OFF": "DESLIGADO", - "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · ALCANCE {range}m · {projection}{calBadge} · {provider}{status}", + "OFF": "INATIVO", + "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · RANGE {range} m · {projection}{calBadge} · {provider}{status}", "{count} cameras loaded · click a camera to activate": { "one": "{count} câmera carregada · clique em uma câmera para ativar", - "many": "{count} câmeras carregadas · clique em uma câmera para ativar", + "many": "{count} de câmeras carregadas · clique em uma câmera para ativar", "other": "{count} câmeras carregadas · clique em uma câmera para ativar" }, "{count} cameras loaded · enable CCTV to activate": { "one": "{count} câmera carregada · ative o CCTV para usar", - "many": "{count} câmeras carregadas · ative o CCTV para usar", + "many": "{count} de câmeras carregadas · ative o CCTV para usar", "other": "{count} câmeras carregadas · ative o CCTV para usar" }, "Enable CCTV to load camera intersections": "Ative o CCTV para carregar interseções de câmeras", @@ -403,15 +1650,18 @@ "REGION UNAVAILABLE": "REGIÃO INDISPONÍVEL", "NO RECENT LOCATION MATCHES": "NENHUMA CORRESPONDÊNCIA RECENTE COM O LOCAL", "{domain} · {age}": "{domain} · {age}", + "{value} KM/H": "{value} KM/H", "CLOUD {pct}%": "NUVENS {pct}%", "CLOUD UNKNOWN": "NUVENS DESCONHECIDAS", "{source} · LOCATION QUERY": "{source} · CONSULTA POR LOCAL", "REGIONAL NEWS": "NOTÍCIAS REGIONAIS", + "{label} · {radius} AIR/SEA WINDOW": "{label} · JANELA AR/MAR {radius}", + "{scope} · INSTALLATIONS {coverage}": "{scope} · INSTALAÇÕES: {coverage}", "CONTEXT STANDBY": "CONTEXTO EM ESPERA", "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "ATIVE O CONTEXTO GLOBAL PARA PINGS DE PROXIMIDADE", "CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "CONTATO PERDIDO · ÚLTIMA LEITURA CONHECIDA · NÃO GARANTE SEGURANÇA", "CONTACT LOST · {subject}": "CONTATO PERDIDO · {subject}", - "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "ALVO SAIU DO SEU FEED · LEITURA MANTIDA NA ÚLTIMA POSIÇÃO CONHECIDA", + "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "ALVO SAIU DO FEED · LEITURA MANTIDA NO ÚLTIMO VALOR CONHECIDO", "{cohort} · {contact}": "{cohort} · {contact}", "NO AVAILABLE EXAMPLE": "NENHUM EXEMPLO DISPONÍVEL", "{cohort}, Unavailable": "{cohort}, indisponível", @@ -421,23 +1671,27 @@ "R": "D", "{count} INPUTS UNKNOWN · NOT AN ALL-CLEAR": { "one": "{count} ENTRADA DESCONHECIDA · NÃO GARANTE SEGURANÇA", - "many": "{count} ENTRADAS DESCONHECIDAS · NÃO GARANTE SEGURANÇA", + "many": "{count} DE ENTRADAS DESCONHECIDAS · NÃO GARANTE SEGURANÇA", "other": "{count} ENTRADAS DESCONHECIDAS · NÃO GARANTE SEGURANÇA" }, "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "ENTRADAS DISPONÍVEIS ATUAIS · NÃO GARANTE SEGURANÇA", + "SQUAWK {code} · {status}": "SQUAWK {code} · {status}", + "ADS-B PRIORITY · {status}": "ADS-B PRIORIDADE · {status}", + "ADS-B EMERGENCY · {status}": "ADS-B EMERGÊNCIA · {status}", "AIRCRAFT": "AERONAVE", "ACQUIRING SURFACE": "ADQUIRINDO SUPERFÍCIE", "SURFACE FALLBACK": "SUPERFÍCIE ALTERNATIVA", "STALE FEED": "FEED DESATUALIZADO", "LIVE TRACK": "RASTRO AO VIVO", "COMMERCIAL": "COMERCIAL", + "{aircraftClass} · {emergency} · {feedState}": "{aircraftClass} · {emergency} · {feedState}", "{aircraftClass} · {feedState} · COURSE ALIGNED": "{aircraftClass} · {feedState} · CURSO ALINHADO", "ARROW · ESTIMATED DIRECTION": "SETA · DIREÇÃO ESTIMADA", "ROUTE DATA UNAVAILABLE": "DADOS DE ROTA INDISPONÍVEIS", "DEST {bearing}": "DEST {bearing}", "Disable cockpit weather effects": "Desativar efeitos de clima na cabine", "Enable cockpit weather effects": "Ativar efeitos de clima na cabine", - "ON": "LIGADO", + "ON": "ATIVO", "Normal": "Normal", "Night vision": "Visão noturna", "Thermal": "Térmico", @@ -457,10 +1711,11 @@ "OBSERVED / MAPPED PINGS": "PINGS OBSERVADOS / MAPEADOS", "SOURCE-BACKED EVENTS · NO SYNTHETIC NEWS": "EVENTOS COM FONTE · SEM NOTÍCIAS SINTÉTICAS", "LATEST LOCATION-MATCHED REPORTING": "ÚLTIMAS REPORTAGENS DA LOCALIZAÇÃO", + "{source} · LOCATION QUERY · RECENT": "{source} · CONSULTA POR LOCAL · RECENTE", "LOCAL INFO": "INFO LOCAL", "PLACE / CONDITIONS / POSITION": "LUGAR / CONDIÇÕES / POSIÇÃO", "TIME UNKNOWN": "HORA DESCONHECIDA", - "{count}M AGO": "HÁ {count}MIN", + "{count}M AGO": "HÁ {count} MIN", "{count}H AGO": "HÁ {count}H", "{count}D AGO": "HÁ {count}D", "DIR UNKNOWN": "DIR DESCONHECIDA", @@ -472,7 +1727,7 @@ "DISTANCE UNKNOWN": "DISTÂNCIA DESCONHECIDA", "{count} INPUTS UNKNOWN": { "one": "{count} ENTRADA DESCONHECIDA", - "many": "{count} ENTRADAS DESCONHECIDAS", + "many": "{count} DE ENTRADAS DESCONHECIDAS", "other": "{count} ENTRADAS DESCONHECIDAS" }, "SOURCE STATUS UNAVAILABLE": "STATUS DA FONTE INDISPONÍVEL", @@ -483,20 +1738,20 @@ "Context could not restore every layer; try again": "O contexto não conseguiu restaurar todas as camadas; tente novamente", "No selected data layers": "Nenhuma camada de dados selecionada", "{count} data layers could not be cleared": { - "one": "{count} camada de dados não pôde ser limpa", - "many": "{count} camadas de dados não puderam ser limpas", - "other": "{count} camadas de dados não puderam ser limpas" + "one": "Não foi possível limpar {count} camada de dados", + "many": "Não foi possível limpar {count} de camadas de dados", + "other": "Não foi possível limpar {count} camadas de dados" }, "Cleared {count} data layers": { "one": "{count} camada de dados limpa", - "many": "{count} camadas de dados limpas", + "many": "{count} de camadas de dados limpas", "other": "{count} camadas de dados limpas" }, "Selected data layers could not be cleared": "Não foi possível limpar as camadas de dados selecionadas", - "Space Missions could not complete the requested transition; try again": "Missões espaciais não conseguiram concluir a transição solicitada; tente novamente", + "Space Missions could not complete the requested transition; try again": "Missões espaciais: não foi possível concluir a transição solicitada; tente novamente", "Nearby installations refreshed": "Instalações próximas atualizadas", "Nearby installations could not be refreshed; try again": "Não foi possível atualizar as instalações próximas; tente novamente", - "Space Missions cancellation could not restore the previous layer state": "O cancelamento de Missões espaciais não conseguiram restaurar o estado anterior das camadas", + "Space Missions cancellation could not restore the previous layer state": "O cancelamento de Missões espaciais não conseguiu restaurar o estado anterior das camadas", "That layer is unavailable in the current Context mode": "Essa camada não está disponível no modo de contexto atual", "{layerId} could not {action} cleanly": "Não foi possível {action} {layerId} corretamente", "start": "iniciar", @@ -504,24 +1759,89 @@ "{mode} could not start because another layer did not stop cleanly": "Não foi possível iniciar {mode} porque outra camada não parou corretamente", "Space Missions": "Missões espaciais", "Context": "Contexto", - "Live Flights": "Voos ao Vivo", - "Military Flights": "Voos Militares", + "Rendered globe frames per second · toggle with `": "Quadros por segundo renderizados do globo · alterne com `", + "imported map files": "os arquivos importados no mapa", + "Ground heights could not be refreshed. Try the file again when the map has loaded.": "Não foi possível atualizar as altitudes do terreno. Tente o arquivo de novo quando o mapa tiver carregado.", + "{count} map objects": { + "one": "{count} objeto no mapa", + "many": "{count} de objetos no mapa", + "other": "{count} objetos no mapa" + }, + ", drawn with its own styles": ", desenhado com os próprios estilos", + "Hide {name}": "Ocultar {name}", + "Show {name}": "Mostrar {name}", + "Fly to {name}": "Voar até {name}", + "Remove {name}": "Remover {name}", + "At most {count} files at once — remove one first.": "No máximo {count} arquivos de cada vez — remova um primeiro.", + "Reading {name}…": "Lendo {name}…", + "That file could not be read.": "Não foi possível ler esse arquivo.", + "Added {count} files.": { + "one": "{count} arquivo adicionado.", + "many": "{count} de arquivos adicionados.", + "other": "{count} arquivos adicionados." + }, + "{count} files could not be added ({name}: {error})": { + "one": "Não foi possível adicionar {count} arquivo ({name}: {error})", + "many": "Não foi possível adicionar {count} de arquivos ({name}: {error})", + "other": "Não foi possível adicionar {count} arquivos ({name}: {error})" + }, + "Some KML content was left out.": "Parte do conteúdo KML foi deixada de fora.", + "Press on the ground, not the sky": "Pressione no chão, não no céu", + "Drag to size the box": "Arraste para definir o tamanho da área", + "light {source} to use your {name} key": "ative {source} para usar sua chave do {name}", + "light {source}": "ative {source}", + ", or ": ", ou ", + "{requirement}, or {offer}": "{requirement}, ou {offer}", + "Live Flights": "Voos ao vivo", + "Military Flights": "Voos militares", "Earthquakes (24h)": "Terremotos (24h)", "Satellites": "Satélites", - "Space Missions (30d)": "Missões Espaciais (30d)", - "Street Traffic": "Trânsito Urbano", + "Space Missions (30d)": "Missões espaciais (30 d)", + "Street Traffic": "Trânsito urbano", "CCTV": "CCTV", "Radio": "Rádio", - "Bikeshare": "Bicicletas Compartilhadas", - "Live AIS Vessels": "Embarcações AIS ao Vivo", - "Mapped Installations": "Instalações Mapeadas", - "Global Context": "Contexto Global", - "Datacenters": "Data Centers", + "Bikeshare": "Bicicletas compartilhadas", + "Live AIS Vessels": "Embarcações AIS ao vivo", + "Mapped Installations": "Instalações mapeadas", + "Global Context": "Contexto global", + "Datacenters": "Data centers", "Dams": "Barragens", - "Submarine Cables": "Cabos Submarinos", - "FIRMS Active Fires": "Incêndios Ativos FIRMS", + "Submarine Cables": "Cabos submarinos", + "FIRMS Active Fires": "Incêndios ativos FIRMS", + "Local ADS-B": "ADS-B local", + "Transit": "Transporte público", + "Recent Imagery": "Imagens recentes", + "Fire Perimeters": "Perímetros de incêndios", + "GNSS Integrity": "Integridade GNSS", + "S2 GhostMaps": "S2 GhostMaps", + "Rain radar": "Radar de chuva", + "Lightning density": "Densidade de raios", + "Cyclone advisories": "Boletins de ciclones", + "ALPR Cameras": "Câmeras ALPR", + "Live Vessels": "Embarcações ao vivo", + "Bike Share": "Bicicletas compartilhadas", + "Cameras": "Câmeras", + "Street Level": "Nível da rua", + "Mapped ALPR Cameras": "Câmeras ALPR mapeadas", + "Data Centers": "Data centers", + "Active Fires": "Incêndios ativos", + "Military aircraft": "Aeronaves militares", + "Vessels": "Embarcações", + "CCTV + Street View fallback": "CCTV + Street View como alternativa", + "OpenStreetMap + optional Google Maps Places": "OpenStreetMap + Google Maps Places opcional", + "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · PREVISÃO", + "NOAA nowCOAST · OBSERVED": "NOAA nowCOAST · OBSERVADO", + "NASA FIRMS · LIVE": "NASA FIRMS · AO VIVO", + "OSM routing": "Rotas do OSM", + "data source|Local": "Dados locais", "ENABLING": "ATIVANDO", "DISABLING": "DESATIVANDO", + "Movement": "Movimento", + "Infrastructure": "Infraestrutura", + "Events": "Eventos", + "Weather": "Clima", + "Utilities": "Utilitários", + "Other layers": "Outras camadas", "{state} · {source}": "{state} · {source}", "UNCERTAIN · {source} · lifecycle state requires reconciliation": "INCERTO · {source} · estado do ciclo de vida requer reconciliação", "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · nova tentativa em {seconds}s", @@ -535,21 +1855,75 @@ "{state} · {source} · {ago}": "{state} · {source} · {ago}", "{source} · {ago}": "{source} · {ago}", "UNCERTAIN": "INCERTO", + "status chip|UNAVAILABLE": "INDISP.", + "Data source unavailable": "Fonte de dados indisponível", "{name}: {state}": "{name}: {state}", "{count}s ago": "há {count}s", + "Local FM stopped: internet radio started": "FM local parada: a rádio pela internet começou", + "IDLE": "EM ESPERA", "CONNECTING": "CONECTANDO", + "TUNING": "SINTONIZANDO", + "STREAMING": "RECEBENDO", + "UNSUPPORTED": "NÃO SUPORTADO", + "idle": "em espera", + "running": "ativo", + "suspended": "suspenso", + "closed": "fechado", + "feed status|live": "ao vivo", + "feed status|stale": "desatualizado", + "feed status|unreachable": "inacessível", + "feed status|invalid": "inválido", + "waiting for IQ": "aguardando IQ", + "{count} messages": { + "one": "{count} mensagem", + "many": "{count} de mensagens", + "other": "{count} mensagens" + }, + "DSP {count} blocks": { + "one": "DSP {count} bloco", + "many": "DSP {count} de blocos", + "other": "DSP {count} blocos" + }, + "DSP waiting": "DSP em espera", + "{level} dBFS audio": "áudio {level} dBFS", + "audio signal --": "sinal de áudio --", + "audio {state}": "áudio {state}", + "{count} HEARD": { + "one": "CAPTADAS: {count}", + "many": "CAPTADAS: {count}", + "other": "CAPTADAS: {count}" + }, + "DISCONNECT": "DESCONECTAR", + "CONNECT": "CONECTAR", + "LOCATING…": "LOCALIZANDO…", + "LOCATED": "LOCALIZADO", + "LOCATE": "LOCALIZAR", + " · read while Local ADS-B is on": " · lidos enquanto o ADS-B local está ativo", + "Decoder feeds: {feeds}": "Feeds do decodificador: {feeds}", + "Language: {language}": "Idioma: {language}", + "Change the interface language": "Mudar o idioma da interface", + "Interface language": "Idioma da interface", + "Search languages": "Buscar idioma", + "No matching languages": "Nenhum idioma corresponde", "📍 Location: --": "📍 Local: --", "Landmark: --": "Ponto de referência: --", "Searched location": "Local pesquisado", "ORBIT": "ÓRBITA", "Location not found": "Local não encontrado", + "Check the spelling and press Enter to search again.": "Verifique a grafia e pressione Enter para buscar de novo.", "Search failed": "Falha na busca", + "Press Enter to try again.": "Pressione Enter para tentar novamente.", + "Detailed outline unavailable": "Contorno detalhado indisponível", "Fly to a POI first": "Voe até um ponto de interesse primeiro", "Reset to full globe view": "Voltar à vista do globo completo", "Reset cockpit to full globe view": "Redefinir a cabine para a vista do globo completo", "Resetting to full globe view": "Voltando à vista do globo completo", "Resetting cockpit to full globe view": "Redefinindo a cabine para a vista do globo completo", "MAP": "MAPA", + "Layers": "Camadas", + "Search": "Buscar", + "More": "Mais", + "Panels": "Painéis", "panel": "painel", "Expand {name}": "Expandir {name}", "Collapse {name}": "Recolher {name}", @@ -558,17 +1932,31 @@ "Expand Radio section": "Expandir seção de rádio", "Collapse Radio section": "Recolher seção de rádio", "Panel layout updated — positions reset to new defaults": "Layout dos painéis atualizado — posições redefinidas para os novos padrões", + "Austin": "Austin", + "San Francisco": "São Francisco", + "New York": "Nova York", + "Tokyo": "Tóquio", + "London": "Londres", + "Paris": "Paris", + "Dubai": "Dubai", + "Washington DC": "Washington, D.C.", + "Tallinn": "Tallinn", + "Los Angeles": "Los Angeles", "Collapse Cockpit display options": "Recolher opções de exibição da cabine", "Expand Cockpit display options": "Expandir opções de exibição da cabine", "Collapse Cockpit Radio controls": "Recolher controles de rádio da cabine", "Expand Cockpit Radio controls": "Expandir controles de rádio da cabine", + "CH {index} / {total}": "CANAL {index} / {total}", "NO STATIONS": "SEM ESTAÇÕES", "NO STATION AVAILABLE": "NENHUMA ESTAÇÃO DISPONÍVEL", "{name}, station {index} of {total}": "{name}, estação {index} de {total}", "No station available": "Nenhuma estação disponível", "OFF AIR": "FORA DO AR", "STATION UNAVAILABLE": "ESTAÇÃO INDISPONÍVEL", + "Station unavailable after directory refresh": "Estação indisponível após atualizar o diretório", "Radio could not {action} cleanly": "Não foi possível {action} o rádio corretamente", + "Go to expanded Radio section": "Ir para a seção de rádio expandida", + "Expand Radio section in Context": "Expandir a seção de rádio em Contexto", "Close compact Radio controls": "Fechar controles compactos do rádio", "Open compact Radio controls": "Abrir controles compactos do rádio", "SYNC": "SINC", @@ -578,15 +1966,18 @@ "Reconcile Radio — lifecycle uncertain": "Reconciliar rádio — ciclo de vida incerto", "Disable Radio": "Desativar rádio", "Enable Radio": "Ativar rádio", + "{category} ({count})": "{category} ({count})", "DIRECTORY BAND": "BANDA DO DIRETÓRIO", "{category} BAND": "BANDA {category}", "NO STATION SELECTED": "NENHUMA ESTAÇÃO SELECIONADA", "Directory metadata only": "Somente metadados do diretório", "Loading station directory…": "Carregando diretório de estações…", - "Choose a globe marker or use next.": "Escolha um marcador no globo ou use próxima.", + "Choose a globe marker or use next.": "Escolha um marcador no globo ou use Próxima.", "TAGS · {tags}": "TAGS · {tags}", "Play": "Reproduzir", - "PLAY": "PLAY", + "PAUSE": "PAUSAR", + "RESUME": "RETOMAR", + "PLAY": "OUVIR", "selected": "selecionada", "nearest": "mais próxima", "{action} {target} radio station": "{action} estação de rádio {target}", @@ -603,7 +1994,7 @@ "Ready — playback starts only from your action": "Pronto — a reprodução só começa por ação sua", "Radio off": "Rádio desligado", "Connecting directly to broadcaster…": "Conectando direto à emissora…", - "Buffering broadcaster stream…": "Armazenando em buffer o stream da emissora…", + "Buffering broadcaster stream…": "Carregando o stream da emissora…", "Playing {station}": "Reproduzindo {station}", "Paused {station}": "Pausado: {station}", "Broadcaster stream unavailable": "Stream da emissora indisponível", @@ -615,63 +2006,692 @@ "Radio is enabling…": "O rádio está sendo ativado…", "Radio is disabling…": "O rádio está sendo desativado…", "Radio lifecycle is uncertain — use Enable or Disable to reconcile": "O ciclo de vida do rádio é incerto — use Ativar ou Desativar para reconciliar", + "Clear reading": "Limpar leitura", + "Earlier observation": "Observação anterior", + "Observed history": "Histórico observado", + "Later observation": "Observação posterior", + "Latest": "Mais recente", + "Newest frame per product": "Quadro mais recente por produto", + "Replay observed history": "Reproduzir o histórico observado", + "Imagery on Esri · Google 3D returns when cleared": "Imagens sobre o Esri · LIMPAR restaura o Google 3D", + "Point the camera at the ground to use the view": "Aponte a câmera para o chão para usar a vista", + "That point cannot anchor a box": "Esse ponto não pode ancorar uma área", + "Imagery stops at ±{limit}° latitude": "As imagens vão até ±{limit}° de latitude", + "{owner} is using the pointer — close it first": "Ponteiro em uso: {owner}. Feche-o primeiro", + "Box is {size} wide · limit {limit}": "A área tem {size} de largura · limite {limit}", + "View is {size} wide · limit {limit}": "A vista tem {size} de largura · limite {limit}", + "VS BASEMAP": "VS MAPA BASE", + "A / B": "A / B", + "Newest low-cloud day for this box · scene cloud, not box cloud": "Dia mais recente com poucas nuvens para esta área · nuvens da cena, não da área", + "Newest day covering this box · cloudier than 20%": "Dia mais recente que cobre esta área · mais de 20% de nuvens", + "Newest day with imagery for this box · partial coverage": "Dia mais recente com imagens para esta área · cobertura parcial", + "Newest daily overview for this box": "Visão geral diária mais recente para esta área", + "newest clear day": "dia limpo mais recente", + "newest day (cloudy)": "dia mais recente (nublado)", + "newest day (partial coverage)": "dia mais recente (cobertura parcial)", + "newest overview": "visão geral mais recente", + "No imagery": "Sem imagens", + "Loading": "Carregando", + "coverage|full": "completa", + "coverage|partial": "parcial", + "unknown": "desconhecida", + "no imagery": "sem imagens", + "{percent}% cloud": "{percent}% de nuvens", + "{min}–{max}% cloud": "{min}–{max}% de nuvens", + "NO BOX": "SEM ÁREA", + "SEARCHING": "BUSCANDO", + "{count} DAYS": { + "one": "{count} DIA", + "many": "{count} DE DIAS", + "other": "{count} DIAS" + }, + "Zoom in or draw a smaller box": "Aproxime o zoom ou desenhe uma área menor", + "Select a box or use the view": "Selecione uma área ou use a vista", + "Searching the last 30 days": "Buscando nos últimos 30 dias", + "No days to show for this box": "Nenhum dia para mostrar nesta área", + "Drag the divider · SWAP trades sides": "Arraste o divisor · INVERTER troca os lados", + "← → preview · A or B pins the focused day": "← → prévia · A ou B fixa o dia em foco", + "← → preview the other side · A or B pins it": "← → prévia do outro lado · A ou B o fixa", + "S on another day replaces it · × unpins": "S em outro dia o substitui · × desafixa", + "← → preview · S shows the focused day": "← → prévia · S mostra o dia em foco", + "ZOOM IN": "APROXIMAR", + "Fly in until the view fits the 1,000 km limit": "Aproxime até a vista caber no limite de 1.000 km", + "Imagery days, newest first · arrows move, S or A and B pin": "Dias com imagens, do mais recente · as setas movem, S ou A e B fixam", + "On the map": "No mapa", + "Mode": "Modo", + "Imagery opacity": "Opacidade das imagens", + "SWAP": "INVERTER", + "Trade the two sides of the divider": "Trocar os dois lados do divisor", + "SELECT BOX": "SELECIONAR", + "Drag a box on the map (Esc cancels)": "Arraste uma área no mapa (Esc cancela)", + "USE VIEW": "USAR VISTA", + "Use the current view as the box": "Usar a vista atual como área", + "Forget the box and its images": "Esquecer a área e suas imagens", + "START HERE": "COMECE AQUI", + "Checking": "Verificando", + "PREVIEW": "PRÉVIA", + "Newest day with imagery for this box": "Dia mais recente com imagens para esta área", + "SHOW": "MOSTRAR", + "Pin {day} as {slot}": "Fixar {day} como {slot}", + "Show {day}": "Mostrar {day}", + "pinned {slot}": "fixado em {slot}", + "shown": "exibido", + "preview": "prévia", + "start here": "comece aqui", + "No box": "Sem área", + "Searching": "Buscando", + "Every day is empty here": "Todos os dias estão vazios aqui", + "Sources off": "Fontes desativadas", + "VS": "VS", + "Not set": "Não definido", + "Basemap": "Mapa base", + "Source off": "Fonte desativada", + "Unpin {slot}": "Desafixar {slot}", + "Unpin the image": "Desafixar a imagem", + "EXPORT {slot}": "EXP. {slot}", + "EXPORT": "EXPORTAR", + "Download {slot} as a PNG": "Baixar {slot} como PNG", + "Download the image as a PNG": "Baixar a imagem como PNG", + "Box {width} × {height} km": "Área de {width} × {height} km", + "Acquired {time}": "Adquirida {time}", + "Coverage {coverage}": "Cobertura {coverage}", + "START HERE · {reason}": "COMECE AQUI · {reason}", + "Daily overview shows little detail in a box this small": "A visão geral diária mostra pouco detalhe em uma área tão pequena", + "Imagery: NASA GIBS and Worldview · HLS (Sentinel-2, Landsat 8/9) and VIIRS": "Imagens: NASA GIBS e Worldview · HLS (Sentinel-2, Landsat 8/9) e VIIRS", + "Details": "Detalhes", + "Times, coverage, sources": "Horários, cobertura, fontes", + "HIDE EMPTY DAYS": "OCULTAR DIAS VAZIOS", + "SHOW EMPTY DAYS · {count}": "MOSTRAR DIAS VAZIOS · {count}", + "Days the probe found empty in this box": "Dias que a sondagem encontrou vazios nesta área", + "image": "imagem", + "BASEMAP": "MAPA BASE", + "The basemap": "O mapa base", + "basemap": "mapa base", + "Recent imagery against the basemap divider": "Divisor entre imagens recentes e o mapa base", + "Recent imagery A and B divider": "Divisor A e B de imagens recentes", + "{before} {left} percent, {after} {right} percent": "{before} {left} por cento, {after} {right} por cento", + "Export failed · {error}": "Falha na exportação · {error}", "Scene action failed": "A ação da cena falhou", + "New scene name": "Nome da nova cena", + "Delete scene \"{scene}\" and all shots?": "Excluir a cena \"{scene}\" e todos os planos?", "Delete shot \"{shot}\"?": "Excluir o plano \"{shot}\"?", + "Stopped (Esc)": "Parado (Esc)", "SPARSE": "ESPARSA", "BALANCED": "EQUILIBRADA", - "DEL": "EXCL", + "No shots yet. Use CAPTURE SHOT to save current look.": "Ainda não há planos. Use CAPTURAR PLANO para salvar o visual atual.", + "Double-click to rename": "Clique duplo para renomear", + "Shot name": "Nome do plano", + "LOAD": "CARREGAR", + "DEL": "EXCL.", + "{duration}s + {hold}s": "{duration} s + {hold} s", + "Choose files": "Escolher arquivos", + "{count} files selected": { + "one": "{count} arquivo selecionado", + "many": "{count} de arquivos selecionados", + "other": "{count} arquivos selecionados" + }, + "No file chosen": "Nenhum arquivo escolhido", + "Cancel": "Cancelar", + "EDIT DETAILS": "EDITAR DETALHES", + "SHARE SCENE": "COMPARTILHAR CENA", + "Shared flight follow expired": "O acompanhamento do voo compartilhado expirou", + "Shared military flight follow expired": "O acompanhamento do voo militar compartilhado expirou", + "Shared satellite follow expired": "O acompanhamento do satélite compartilhado expirou", + "Shared flight could not be restored — feed unavailable": "Não foi possível restaurar o voo compartilhado — feed indisponível", + "Shared military flight could not be restored — feed unavailable": "Não foi possível restaurar o voo militar compartilhado — feed indisponível", + "Shared satellite could not be restored — feed unavailable": "Não foi possível restaurar o satélite compartilhado — feed indisponível", + "Shared flight is unavailable": "O voo compartilhado está indisponível", + "Shared military flight is unavailable": "O voo militar compartilhado está indisponível", + "Shared satellite is unavailable": "O satélite compartilhado está indisponível", "entity": "entidade", "Shared {subject} follow expired": "O acompanhamento compartilhado de {subject} expirou", "Shared {subject} could not be restored — feed unavailable": "Não foi possível restaurar o compartilhamento de {subject} — feed indisponível", "Shared {subject} is unavailable": "O compartilhamento de {subject} está indisponível", + "{id} isn't reporting now — showing where it was last seen": "{id} não está transmitindo agora — mostrando onde foi visto pela última vez", + "{id} isn't reporting now — showing where it was at {time}": "{id} não está transmitindo agora — mostrando onde estava às {time}", + "This share link can't be opened": "Não é possível abrir este link de compartilhamento", + "Shared vessel is unavailable": "A embarcação compartilhada está indisponível", "ACQUIRING": "ADQUIRINDO", "SHARED {subject}": "COMPARTILHADO: {subject}", + "subject": "alvo", "LOADING LIVE DATA": "CARREGANDO DADOS AO VIVO", "LOAD COMPLETE": "CARGA CONCLUÍDA", "LOAD CANCELLED": "CARGA CANCELADA", "LOAD FAILED": "FALHA NA CARGA", "LIVE DATA OFF": "DADOS AO VIVO DESLIGADOS", "MAPPED SITES LOADED": "LOCAIS MAPEADOS CARREGADOS", - "RETRYING MAPPED SITES": "REPETINDO BUSCA DE LOCAIS MAPEADOS", + "RETRYING MAPPED SITES": "TENTANDO DE NOVO OS LOCAIS MAPEADOS", "FETCHING MAPPED SITES": "BUSCANDO LOCAIS MAPEADOS", + "RETRYING ALPR CAMERAS": "TENTANDO DE NOVO AS CÂMERAS ALPR", + "FETCHING ALPR CAMERAS": "BUSCANDO CÂMERAS ALPR", + "OVERPASS TEMPORARILY UNAVAILABLE": "OVERPASS TEMPORARIAMENTE INDISPONÍVEL", + "OVERPASS RATE-LIMITED": "OVERPASS COM LIMITE DE REQUISIÇÕES", + "OVERPASS TIMED OUT": "TEMPO ESGOTADO NO OVERPASS", + "OVERPASS COULD NOT COMPLETE THE QUERY": "OVERPASS NÃO CONSEGUIU CONCLUIR A CONSULTA", + "MAP TILES TEMPORARILY UNAVAILABLE": "BLOCOS DO MAPA TEMPORARIAMENTE INDISPONÍVEIS", + "MAPPED NAMES TEMPORARILY UNAVAILABLE": "NOMES MAPEADOS TEMPORARIAMENTE INDISPONÍVEIS", "TURNING OFF LIVE DATA": "DESLIGANDO DADOS AO VIVO", "REFRESHING LIVE DATA": "ATUALIZANDO DADOS AO VIVO", "syncing road network": "sincronizando malha viária", "retry pending": "nova tentativa pendente", "retrying in {seconds}s": "nova tentativa em {seconds}s", + "ALPR cameras": "câmeras ALPR", + "OpenSky OAuth client missing/invalid": "Cliente OAuth do OpenSky ausente ou inválido", + "OpenSky OAuth rejected credentials": "O OAuth do OpenSky recusou as credenciais", + "OpenSky username/password rejected": "O OpenSky recusou o usuário ou a senha", + "OpenSky auth missing": "Falta a autenticação do OpenSky", + "OpenSky auth required": "O OpenSky exige autenticação", + "OpenSky auth invalid": "Autenticação do OpenSky inválida", + "OpenSky auth failed": "Falha na autenticação do OpenSky", + "KartaView answered HTTP {status}": "O KartaView respondeu HTTP {status}", + "Panoramax answered HTTP {status}": "O Panoramax respondeu HTTP {status}", + "KartaView refused the request (code {code})": "O KartaView recusou a requisição (código {code})", + "Vector tiles unavailable (HTTP {status})": "Blocos vetoriais indisponíveis (HTTP {status})", + "GNSS feed unavailable (HTTP {status})": "Feed GNSS indisponível (HTTP {status})", + "{count} CelesTrak groups unavailable": { + "one": "{count} grupo do CelesTrak indisponível", + "many": "{count} de grupos do CelesTrak indisponíveis", + "other": "{count} grupos do CelesTrak indisponíveis" + }, + "{feed} feed unavailable": "Feed {feed} indisponível", + "Source snapshot {minutes} min old": "O snapshot da fonte tem {minutes} min", + "{source} rate limited (anonymous)": "{source}: limite de requisições (anônimo)", + "{source} rate limited": "{source}: limite de requisições", + "{source} network error": "{source}: erro de rede", + "Malformed {source} aircraft rows": "{source}: linhas de aeronaves malformadas", + "Malformed {source} response": "{source}: resposta malformada", + "entry {n}": "nº {n}", + "feeds {names} stale": { + "one": "feed {names} desatualizado", + "many": "feeds {names} desatualizados", + "other": "feeds {names} desatualizados" + }, + "feeds {names} unreachable": { + "one": "feed {names} inacessível", + "many": "feeds {names} inacessíveis", + "other": "feeds {names} inacessíveis" + }, + "feeds {names} invalid": { + "one": "feed {names} inválido", + "many": "feeds {names} inválidos", + "other": "feeds {names} inválidos" + }, + "Loading {feeds}": "Carregando {feeds}", + "{count} heard": { + "one": "{count} aeronave captada", + "many": "{count} de aeronaves captadas", + "other": "{count} aeronaves captadas" + }, + "USB {rate} msg/s": "USB {rate} msg/s", + "{rate} msg/s": "{rate} msg/s", + "{count} feeds live": { + "one": "{count} feed ao vivo", + "many": "{count} de feeds ao vivo", + "other": "{count} feeds ao vivo" + }, + "{feed} {count} ({seconds}s old)": "{feed} {count} (há {seconds} s)", + "Street Level toggle failed": "Não foi possível ativar ou desativar a camada Nível da rua", + "Street Level could not start": "Não foi possível iniciar Nível da rua", + "SHRINK": "REDUZIR", + "EXPAND": "AMPLIAR", + "Shrink": "Reduzir", + "Expand": "Ampliar", + "ANY DATE": "QUALQUER DATA", + "LAST 10 YEARS": "ÚLTIMOS 10 ANOS", + "LAST 5 YEARS": "ÚLTIMOS 5 ANOS", + "LAST 3 YEARS": "ÚLTIMOS 3 ANOS", + "LAST 2 YEARS": "ÚLTIMOS 2 ANOS", + "LAST YEAR": "ÚLTIMO ANO", + "LAST 6 MONTHS": "ÚLTIMOS 6 MESES", + "LAST 3 MONTHS": "ÚLTIMOS 3 MESES", + "LAST MONTH": "ÚLTIMO MÊS", + "LAST {count} DAYS": { + "one": "ÚLTIMO {count} DIA", + "many": "ÚLTIMOS {count} DE DIAS", + "other": "ÚLTIMOS {count} DIAS" + }, + "{window} · SINCE {date}": "{window} · DESDE {date}", + "Turn Street Level off": "Desativar Nível da rua", + "Turn Street Level on": "Ativar Nível da rua", + "{name} imagery on": "Imagens do {name} ativadas", + "{name} imagery off": "Imagens do {name} desativadas", + "Image by {creator}": "Imagem de {creator}", + " or ": " ou ", + "OPEN {labels}": "ABRIR {labels}", + "Open {names} at the centre of the view": "Abrir {names} no centro da vista", + "Zoom in to a street to open {names} here": "Aproxime o zoom de uma rua para abrir {names} aqui", + "Switch Street Level on to draw its coverage.": "Ative Nível da rua para desenhar a cobertura.", + "Every provider is switched off: light a chip to draw its coverage.": "Todos os provedores estão desligados: ative um para desenhar a cobertura dele.", + "Loading this sequence…": "Carregando esta sequência…", + "{n} images in this sequence · Esc clears": { + "one": "{n} imagem nesta sequência · Esc limpa a seleção", + "many": "{n} de imagens nesta sequência · Esc limpa a seleção", + "other": "{n} imagens nesta sequência · Esc limpa a seleção" + }, + "No sequences in view match the filter": "Nenhuma sequência na vista corresponde ao filtro", + "No coverage in view": "Sem cobertura na vista", + "{n} streets in view · click a line for its nearest photo": { + "one": "{n} rua na vista · clique em uma linha para ver a foto mais próxima", + "many": "{n} de ruas na vista · clique em uma linha para ver a foto mais próxima", + "other": "{n} ruas na vista · clique em uma linha para ver a foto mais próxima" + }, + "{n} sequences in view · click a line for its nearest photo": { + "one": "{n} sequência na vista · clique em uma linha para ver a foto mais próxima", + "many": "{n} de sequências na vista · clique em uma linha para ver a foto mais próxima", + "other": "{n} sequências na vista · clique em uma linha para ver a foto mais próxima" + }, + "{n} sequences in view · click a line for its photos": { + "one": "{n} sequência na vista · clique em uma linha para ver as fotos", + "many": "{n} de sequências na vista · clique em uma linha para ver as fotos", + "other": "{n} sequências na vista · clique em uma linha para ver as fotos" + }, + "km/h": "km/h", + "m/s": "m/s", + "mph": "mph", + "hPa": "hPa", + "kt": "kt", + "kts": "kt", + "ft": "ft", + "km": "km", + "m": "m", + "h": "h", + "min": "min", + "s": "s", + "dB": "dB", "Celestial ring — reveal the full globe": "Anel celeste — revelar o globo inteiro", "Celestial ring — available in Normal style": "Anel celeste — disponível no estilo Normal", "Detection overlay: {mode}": "Sobreposição de detecção: {mode}", "Detection overlay: off": "Sobreposição de detecção: desligada", "DETECT": "DETECÇÃO", + "{time} · {minutes} min ago": "{time} · há {minutes} min", + "Active weather": "Camadas de clima ativas", + "LATEST · newest per product": "MAIS RECENTE · último por produto", + "Forecast · valid {valid} · issued {issued}": "Previsão · válida {valid} · emitida {issued}", + "{detail} · Does not follow history": "{detail} · Não acompanha o histórico", + "Forecast · valid {valid}": "Previsão · válida {valid}", + "voice|OFF": "DESLIG.", + "voice|CONNECTING": "CONECT…", "voice|LISTENING": "OUVINDO", "voice|EXECUTING": "EXECUTANDO", + "voice|ERROR": "ERRO", + "Voice provider": "Provedor de voz", + "Changing provider reconnects voice if it is on.": "Mudar de provedor reconecta a voz se ela estiver ativa.", + "Voice Settings": "Configurações de voz", "AI AGENT": "AGENTE DE IA", "Voice model tier — applies next session": "Nível do modelo de voz — vale na próxima sessão", + "STD": "PADR.", "Estimated session cost": "Custo estimado da sessão", - "Voice control — activate to toggle voice; hold Space to speak": "Controle por voz — ative para alternar a voz; segure Espaço para falar", + "Voice control — activate to toggle voice; hold Space to speak": "Controle por voz — ative para ligar ou desligar a voz; segure Space para falar", + "ON/OFF": "LIGA/DESL.", "VOICE STANDBY": "VOZ EM ESPERA", "VOICE CONTROL": "CONTROLE POR VOZ", - "Hold Space to speak · tap Space to activate focused controls": "Segure Espaço para falar · toque em Espaço para ativar controles em foco", + "Hold Space to speak · tap Space to activate focused controls": "Segure Space para falar · toque em Space para acionar o controle em foco", + "VOICE": "VOZ", + "Preview": "Prévia", + "Settings": "Configurações", + "Close voice panel": "Fechar o painel de voz", + "Voice replies appear here.": "As respostas de voz aparecem aqui.", + "Voice assistant": "Assistente de voz", + "Dismiss voice card": "Fechar o cartão de voz", + "YOU": "VOCÊ", + "THIS": "ISTO", + "Plan": "Plano", + "Referenced items": "Itens citados", + "NOTES & SOURCES": "NOTAS E FONTES", + "Show Voice Preview": "Mostrar prévia de voz", + "Voice inactivity timeout": "Tempo limite de inatividade da voz", + "Minutes": "Minutos", + "Custom": "Personalizado", + "These preferences stay in this browser.": "Estas preferências ficam neste navegador.", "VOICE SYSTEM ERROR": "ERRO NO SISTEMA DE VOZ", "DISMISS": "DISPENSAR", "Check microphone permission and network access, then try again.": "Verifique a permissão do microfone e o acesso à rede, e tente novamente.", - "Release Space to send": "Solte Espaço para enviar", - "Hold Space to talk": "Segure Espaço para falar", + "Gemini returned an oversized audio chunk": "O Gemini retornou um trecho de áudio grande demais", + "Gemini returned an unsupported audio format": "O Gemini retornou um formato de áudio não suportado", + "Gemini returned an invalid audio sample rate": "O Gemini retornou uma taxa de amostragem de áudio inválida", + "Gemini returned incomplete PCM audio": "O Gemini retornou áudio PCM incompleto", + "This browser does not support Gemini microphone audio": "Este navegador não suporta áudio do microfone para o Gemini", + "Microphone audio processing failed": "Falha no processamento do áudio do microfone", + "Gemini audio playback fell behind. Reconnect to continue.": "A reprodução de áudio do Gemini atrasou. Reconecte para continuar.", + "Gemini token response did not include an ephemeral credential": "A resposta de token do Gemini não incluiu uma credencial temporária", + "Invalid Gemini connection endpoint": "Endpoint de conexão do Gemini inválido", + "Gemini voice could not connect. Try again.": "Não foi possível conectar a voz do Gemini. Tente novamente.", + "Gemini voice requires a same-origin app request": "A voz do Gemini exige uma requisição da mesma origem do app", + "Add a Gemini API key in Provider Settings": "Adicione uma chave de API do Gemini em Configurações de provedores", + "The Gemini Live model configuration is invalid": "A configuração do modelo do Gemini Live é inválida", + "Gemini voice is starting too often. Try again shortly.": "A voz do Gemini está sendo iniciada com frequência demais. Tente novamente em breve.", + "Gemini quota is unavailable. Try again later.": "A cota do Gemini está indisponível. Tente novamente mais tarde.", + "Gemini access was refused. Check the API key and model access.": "O acesso ao Gemini foi recusado. Verifique a chave de API e o acesso ao modelo.", + "Gemini Live is unavailable for the configured model.": "O Gemini Live não está disponível para o modelo configurado.", + "Token request is too large": "A requisição de token é grande demais", + "Use an empty JSON token request": "Use uma requisição de token com um objeto JSON vazio", + "Release Space to send": "Solte Space para enviar", + "Hold Space to talk": "Segure Space para falar", + "Voice command context is too large": "O contexto do comando de voz é grande demais", + "Gemini reliable transport exceeded its queue limit. Start voice again.": "A fila de envio confiável do Gemini excedeu o limite. Inicie a voz de novo.", + "Gemini reliable transport did not drain. Start voice again.": "A fila de envio confiável do Gemini não esvaziou. Inicie a voz de novo.", + "Gemini token request failed (HTTP {status})": "Falha na requisição de token do Gemini (HTTP {status})", + "Gemini token response did not include a valid model": "A resposta de token do Gemini não incluiu um modelo válido", + "Gemini token response did not include session settings": "A resposta de token do Gemini não incluiu as configurações da sessão", + "Gemini session settings do not match the input mode": "As configurações da sessão do Gemini não correspondem ao modo de entrada", "Requesting microphone": "Solicitando microfone", + "Gemini could not submit this input. Start voice again.": "O Gemini não conseguiu enviar esta entrada. Inicie a voz de novo.", + "Connecting to Gemini": "Conectando ao Gemini", "Ask or command": "Pergunte ou comande", + "Gemini returned an oversized message": "O Gemini retornou uma mensagem grande demais", + "Gemini Live connection failed. Check network access, then start voice again.": "Falha na conexão com o Gemini Live. Verifique o acesso à rede e inicie a voz de novo.", + "Gemini Live connection ended. Start voice again for a new conversation.": "A conexão com o Gemini Live terminou. Inicie a voz de novo para uma nova conversa.", + "Gemini Live could not start. Start voice again to request a fresh session.": "O Gemini Live não conseguiu iniciar. Inicie a voz de novo para pedir uma nova sessão.", + "Start voice again for a fresh token and a new conversation.": "Inicie a voz de novo para obter um novo token e começar outra conversa.", + "Start voice again to request a fresh session credential.": "Inicie a voz de novo para pedir uma nova credencial de sessão.", + "Microphone permission was denied. Allow microphone access and try again.": "A permissão do microfone foi negada. Permita o acesso ao microfone e tente novamente.", + "Gemini connection timed out. Try again.": "A conexão com o Gemini excedeu o tempo limite. Tente novamente.", + "Gemini voice could not start": "Não foi possível iniciar a voz do Gemini", + "Gemini did not finish the interrupted reply. Start voice again.": "O Gemini não concluiu a resposta interrompida. Inicie a voz de novo.", + "Gemini session expiring; finishing the current reply": "A sessão do Gemini vai expirar; concluindo a resposta atual", + "Gemini rejected the voice session. Start voice again to request a fresh session.": "O Gemini recusou a sessão de voz. Inicie a voz de novo para pedir uma nova sessão.", + "Start voice again for a fresh session credential. If it repeats, check Gemini model and API access.": "Inicie a voz de novo para obter uma nova credencial de sessão. Se isso se repetir, verifique o modelo do Gemini e o acesso à API.", + "Gemini action history is full. Start voice again for a fresh session.": "O histórico de ações do Gemini está cheio. Inicie a voz de novo para uma nova sessão.", + "Gemini requested too many simultaneous actions": "O Gemini pediu ações simultâneas demais", "Running command": "Executando comando", + "Voice text command is too long": "O comando de voz digitado é longo demais", + "Gemini voice is not connected": "A voz do Gemini não está conectada", + "Gemini interrupted input exceeded its buffer or wait limit. Start voice again.": "A entrada interrompida do Gemini excedeu o limite de buffer ou de espera. Inicie a voz de novo.", + "Gemini Live connection is expiring. Start voice again for a new conversation.": "A conexão com o Gemini Live vai expirar. Inicie a voz de novo para uma nova conversa.", "Voice off": "Voz desligada", + "Gemini voice sessions have a time limit. When a session expires, start voice again for a new conversation.": "As sessões de voz do Gemini têm limite de tempo. Quando uma sessão expirar, inicie a voz de novo para uma nova conversa.", + "Stopped by voice": "Parado por voz", + "Automatic stop is unavailable for this voice connection.": "A parada automática não está disponível para esta conexão de voz.", + "Preview is off.": "A prévia está desativada.", + "Your choice applies now, but could not be saved.": "Sua escolha vale agora, mas não pôde ser salva.", "WebRTC microphone support unavailable": "Suporte a microfone WebRTC indisponível", "VOICE UNAVAILABLE": "VOZ INDISPONÍVEL", "VOICE ACTIVE": "VOZ ATIVA", "Voice session could not be started.": "Não foi possível iniciar a sessão de voz.", + "MINI": "MINI", "Next session: {pendingId} — this session stays on {modelId}": "Próxima sessão: {pendingId} — esta sessão continua em {modelId}", "Voice model: {pendingId} — click to switch to {target}; applies next session": "Modelo de voz: {pendingId} — clique para mudar para {target}; vale na próxima sessão", + "standard": "padrão", + "mini": "mini", + "COST UNKNOWN": "CUSTO DESCONHECIDO", + "ChatGPT OAuth session: {responses} response(s), {input} input and {output} output tokens, {captions} caption transcription(s) reported.": "Sessão OAuth do ChatGPT (dados informados): {responses} resposta(s), {input} tokens de entrada e {output} de saída, {captions} transcrição(ões) de legendas.", + "USD cost and the API spend cap are unavailable for this auth mode.": "O custo em USD e o limite de gastos da API não estão disponíveis neste modo de autenticação.", + "Usage is incomplete because a response was still in flight when the session ended.": "O uso está incompleto porque uma resposta ainda estava em andamento quando a sessão terminou.", "Estimated session cost on {modelId} — {responses} response(s). Warns at {warn}, ends the session at {cap}.": "Custo estimado da sessão em {modelId} — {responses} resposta(s). Alerta em {warn}, encerra a sessão em {cap}.", + "Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "A estimativa está incompleta — uma resposta ainda estava em andamento quando a sessão terminou, então o uso dela nunca foi informado.", + "STANDARD": "PADRÃO", "{tier} applies next session": "{tier} vale na próxima sessão", "Session ended — cost cap {cost}": "Sessão encerrada — limite de custo {cost}", + "MIC": "MIC", "Radio did not start": "O rádio não iniciou", + "{n} aircraft": { + "one": "{n} aeronave", + "many": "{n} de aeronaves", + "other": "{n} aeronaves" + }, + "{n} military aircraft": { + "one": "{n} aeronave militar", + "many": "{n} de aeronaves militares", + "other": "{n} aeronaves militares" + }, + "{n} ships": { + "one": "{n} embarcação", + "many": "{n} de embarcações", + "other": "{n} embarcações" + }, + "{n} satellites": { + "one": "{n} satélite", + "many": "{n} de satélites", + "other": "{n} satélites" + }, + "{n} launches": { + "one": "{n} lançamento", + "many": "{n} de lançamentos", + "other": "{n} lançamentos" + }, + "{n} earthquakes": { + "one": "{n} terremoto", + "many": "{n} de terremotos", + "other": "{n} terremotos" + }, + "{n} fires": { + "one": "{n} incêndio", + "many": "{n} de incêndios", + "other": "{n} incêndios" + }, + "{n} fire perimeters": { + "one": "{n} perímetro de incêndio", + "many": "{n} de perímetros de incêndio", + "other": "{n} perímetros de incêndio" + }, + "{n} cyclones": { + "one": "{n} ciclone", + "many": "{n} de ciclones", + "other": "{n} ciclones" + }, + "{n} buses": { + "one": "{n} ônibus", + "many": "{n} de ônibus", + "other": "{n} ônibus" + }, + "{n} bike share": { + "one": "{n} estação de bicicletas compartilhadas", + "many": "{n} de estações de bicicletas compartilhadas", + "other": "{n} estações de bicicletas compartilhadas" + }, + "{n} flock cameras": { + "one": "{n} câmera ALPR", + "many": "{n} de câmeras ALPR", + "other": "{n} câmeras ALPR" + }, + "{n} military bases": { + "one": "{n} base militar", + "many": "{n} de bases militares", + "other": "{n} bases militares" + }, + "{n} datacenters": { + "one": "{n} data center", + "many": "{n} de data centers", + "other": "{n} data centers" + }, + "{n} dams": { + "one": "{n} barragem", + "many": "{n} de barragens", + "other": "{n} barragens" + }, + "{n} air quality": { + "one": "{n} estação de qualidade do ar", + "many": "{n} de estações de qualidade do ar", + "other": "{n} estações de qualidade do ar" + }, + "{n} results": { + "one": "{n} resultado", + "many": "{n} de resultados", + "other": "{n} resultados" + }, + "anywhere in the loaded data": "em todos os dados carregados", + "in view": "na vista", + "within {radius} of the view centre": "em um raio de {radius} do centro da vista", + "within {radius} of {place} (Contacts window)": "em um raio de {radius} de {place} (janela de Contatos)", + "within {radius} of {place}": "em um raio de {radius} de {place}", + "within {radius}": "em um raio de {radius}", + "over {region}": "sobre {region}", + "At least {items}": "Pelo menos {items}", + "{items} {scope}": "{items} {scope}", + "last 24 h": "últimas 24 h", + "past 30 d and upcoming": "últimos 30 d e próximos", + "the flights layer loads by viewport": "a camada de voos carrega conforme a vista", + "distance is ground distance, not overhead": "a distância é medida no solo até o ponto subsatélite, não até o satélite", + "the count is a lower bound because at least one layer reached its retained limit.": "a contagem é um mínimo porque pelo menos uma camada atingiu o limite de retenção.", + "{label} off": "{label}: desativado", + "{label} loading": "{label}: carregando", + "{label} error": "{label}: erro", + "counted the first {returned} loaded records": "foram contados os primeiros {returned} registros carregados", + "counted {returned} of {total} loaded records": "foram contados {returned} de {total} registros carregados", + "{layers} just turned on — still loading, counts will rise": "{layers}: acabou de ser ativado — ainda carregando, as contagens vão subir", + "Contacts panel snapshot at {time} — the same retained cohort supplies the card, speech, and follow-up memory": "Snapshot do painel Contatos ({time}) — o mesmo grupo retido alimenta o cartão, a fala e a memória de acompanhamento", + "Contacts panel snapshot — the same retained cohort supplies the card, speech, and follow-up memory": "Snapshot do painel Contatos — o mesmo grupo retido alimenta o cartão, a fala e a memória de acompanhamento", + "Fly below {km} km to a covered region": "Desça abaixo de {km} km sobre uma região com cobertura", + "No feed here yet · {n} regions available": { + "one": "Ainda não há feed aqui · {n} região disponível", + "many": "Ainda não há feed aqui · {n} de regiões disponíveis", + "other": "Ainda não há feed aqui · {n} regiões disponíveis" + }, + "degraded": "degradado", + "stale": "desatualizado", + "partial": "parcial", + "fallback": "alternativo", + "unavailable": "indisponível", + "Not answered: {layers}": "Sem resposta: {layers}", + "Toggle voice control": "Alternar o controle por voz", + "Activate to toggle voice": "Ative para ligar ou desligar a voz", + "Voice active": "Voz ativa", + "Voice could not be started.": "Não foi possível iniciar a voz.", + "the active voice session": "a sessão de voz ativa", + "{value} feet": "{value} pés", + "Fire · FRP {frp} MW": "Incêndio · FRP {frp} MW", + "The flights layer is not enabled": "A camada de voos não está ativada", + "The military layer is not enabled": "A camada de voos militares não está ativada", + "The satellites layer is not enabled": "A camada de satélites não está ativada", + "The ais-live-vessels layer is not enabled": "A camada de embarcações AIS não está ativada", + "Could not enable the requested layer": "Não foi possível ativar a camada solicitada", + "Could not disable the requested layer": "Não foi possível desativar a camada solicitada", + "Radio layer unavailable": "A camada de rádio está indisponível", + "Camera navigation is unavailable in the current view": "A navegação da câmera não está disponível na vista atual", + "Camera navigation policy unavailable": "A política de navegação da câmera está indisponível", + "Nearest-aircraft selection supports Flights or Military Flights only": "A seleção da aeronave mais próxima só funciona com voos ou voos militares", + "Nearest-aircraft selection needs a preset, place name, or latitude and longitude": "Para selecionar a aeronave mais próxima é preciso uma predefinição, um nome de lugar ou a latitude e a longitude", + "Could not arrive at the requested place": "Não foi possível chegar ao lugar solicitado", + "The nearest airborne aircraft could not be selected": "Não foi possível selecionar a aeronave em voo mais próxima", + "No flights within {radius} of the current view": "Nenhum voo em um raio de {radius} da vista atual", + "No military within {radius} of the current view": "Nenhum voo militar em um raio de {radius} da vista atual", + "No satellites within {radius} of the current view": "Nenhum satélite em um raio de {radius} da vista atual", + "No vessels within {radius} of the current view": "Nenhuma embarcação em um raio de {radius} da vista atual", + "{layer} is enabled on the {source} feed, but no airborne aircraft is loaded in the {place} view yet": "A camada {layer} está ativada com o feed {source}, mas ainda não há aeronaves em voo carregadas na vista de {place}", + "{layer} is enabled, but no airborne aircraft is loaded in the {place} view yet": "A camada {layer} está ativada, mas ainda não há aeronaves em voo carregadas na vista de {place}", + "{layer} is enabled, but its aircraft feed is unavailable": "A camada {layer} está ativada, mas o feed de aeronaves dela está indisponível", + "{layer} is enabled, but its destination refresh did not complete": "A camada {layer} está ativada, mas a atualização no destino não foi concluída", + "{layer} is enabled, but {source} is unavailable": "A camada {layer} está ativada, mas {source} está indisponível", + "Could not arrive at {place}": "Não foi possível chegar a {place}", + "{name} is no longer loaded": "{name} não está mais carregado", + "Unknown target layer: {target}": "Camada de destino desconhecida: {target}", + "nominal": "nominal", + "{label} on": "{label}: ativado", + "Frame aircraft": "Enquadrar aeronaves", + "Frame military aircraft": "Enquadrar aeronaves militares", + "Frame ships": "Enquadrar embarcações", + "Frame satellites": "Enquadrar satélites", + "Frame contacts": "Enquadrar contatos", + "{count} aircraft in frame": { + "one": "{count} aeronave no enquadramento", + "many": "{count} de aeronaves no enquadramento", + "other": "{count} aeronaves no enquadramento" + }, + "{count} military aircraft in frame": { + "one": "{count} aeronave militar no enquadramento", + "many": "{count} de aeronaves militares no enquadramento", + "other": "{count} aeronaves militares no enquadramento" + }, + "{count} ships in frame": { + "one": "{count} embarcação no enquadramento", + "many": "{count} de embarcações no enquadramento", + "other": "{count} embarcações no enquadramento" + }, + "{count} satellites in frame": { + "one": "{count} satélite no enquadramento", + "many": "{count} de satélites no enquadramento", + "other": "{count} satélites no enquadramento" + }, + "{count} contacts in frame": { + "one": "{count} contato no enquadramento", + "many": "{count} de contatos no enquadramento", + "other": "{count} contatos no enquadramento" + }, + "Nearest military aircraft": "Aeronaves militares mais próximas", + "Nearest ships": "Embarcações mais próximas", + "Nearest satellites": "Satélites mais próximos", + "Nearest aircraft": "Aeronaves mais próximas", + "{first} and {second}": "{first} e {second}", + "Layer": "Camada", + "there": "lá", + "Camera range {range}": "Distância da câmera {range}", + "Within {radius} of the view": "Em um raio de {radius} da vista", + "Labels on": "Rótulos ativados", + "Framing uses the nearest 80 loaded contacts": "O enquadramento usa os 80 contatos carregados mais próximos", + "{distance} from {location}": "A {distance} de {location}", + "Altitude {altitude}": "Altitude {altitude}", + "{origin} to {destination}": "De {origin} para {destination}", + "from {origin}": "de {origin}", + "to {destination}": "para {destination}", + "Registration {registration}": "Matrícula {registration}", + "View state": "Estado da vista", + "Marked {count} places": { + "one": "{count} lugar marcado", + "many": "{count} de lugares marcados", + "other": "{count} lugares marcados" + }, + "Nothing marked": "Nada marcado", + "Not found: {places}": "Não encontrado: {places}", + "Tracing outlines": "Traçando contornos", + "Frame flights": "Enquadrar voos", + "Frame military": "Enquadrar voos militares", + "Frame vessels": "Enquadrar embarcações", + "Frame {target}": "Enquadrar {target}", + "Zoom out to globe": "Afastar até o globo", + "Open data layers": "Abrir as camadas de dados", + "Open or close a panel": "Abrir ou fechar um painel", + "Change context mode": "Mudar o modo de contexto", + "Control cockpit": "Controlar a cabine", + "Change visual style": "Mudar o estilo visual", + "Adjust HUD": "Ajustar o HUD", + "Adjust cyber sonar": "Ajustar o sonar Ciber", + "Adjust detection overlay": "Ajustar a sobreposição de detecção", + "Change map stack": "Mudar a pilha de mapas", + "Adjust post-processing": "Ajustar o pós-processamento", + "Control scene": "Controlar a cena", + "Control CCTV": "Controlar as câmeras CCTV", + "Control radio": "Controlar o rádio", + "Track contact": "Rastrear o contato", + "Stop tracking": "Parar o rastreamento", + "Clear marks": "Limpar as marcações", + "Move camera": "Mover a câmera", + "Fly route": "Percorrer a rota", + "Analyst query": "Consulta analítica", + "Next ISS pass": "Próxima passagem da ISS", + "Next satellite pass": "Próxima passagem do satélite", + "Mark the map": "Marcar o mapa", + "Mark {targets} +{more}": "Marcar {targets} +{more}", + "Mark {targets}": "Marcar: {targets}", + "Fly to {place}": "Voar até {place}", + "Fly to Location": "Voar até o local", + "Nearest aircraft to {place}": "Aeronave mais próxima de {place}", + "Nearest aircraft to Here": "Aeronave mais próxima daqui", + "Layer on": "Camada: ativada", + "Layer off": "Camada: desativada", + "Zoom out": "Afastar", + "Zoom in": "Aproximar", + "Read the view": "Consultar a vista", + "Check view state": "Verificar o estado da vista", + "Action": "Ação", + "Finding places": "Buscando lugares", + "Tracing outline": "Traçando contorno", + "Looking up place": "Buscando lugar", + "Flying": "Voando", + "Turning on layer": "Ativando camada", + "Loading aircraft": "Carregando aeronaves", + "Picking nearest": "Escolhendo a mais próxima", + "Working": "Processando", + "in progress": "em andamento", + "done": "concluído", + "failed": "falhou", + "cancelled": "cancelado", + "Outline traced": "Contorno traçado", + "Outline unavailable": "Contorno indisponível", + "Source: {label}": "Fonte: {label}", + "WORKING": "EM ANDAMENTO", + "DONE": "CONCLUÍDO", + "Recent speech": "Fala recente", + "HERE": "AQUI", "Aircraft cockpit view": "Vista da cabine da aeronave", "LEVEL": "NÍVEL", "Estimated destination direction": "Direção estimada do destino", @@ -692,15 +2712,21 @@ "Next vision style": "Próximo estilo de visão", "Current aircraft heading": "Rumo atual da aeronave", "GROUND SPEED": "VELOC. SOLO", + "KTS": "KT", "ALTITUDE": "ALTITUDE", + "FT": "FT", "Contact cockpit summary": "Resumo do contato na cabine", "CONTACT": "CONTATO", "CONTACTS · 250 KM": "CONTATOS · 250 KM", "Contact navigation": "Navegação de contatos", "CONTEXT ONLY": "SÓ CONTEXTO", "Nearby cohort counts": "Contagem de grupos próximos", + "FLT": "FLT", + "MIL": "MIL", + "SITE": "LOCAIS", "NEAREST OBSERVED / MAPPED": "MAIS PRÓXIMO OBSERVADO / MAPEADO", "AVAILABLE INPUTS ONLY · NOT AN ALL-CLEAR": "SÓ ENTRADAS DISPONÍVEIS · NÃO GARANTE SEGURANÇA", + "WX": "WX", "Cockpit briefing carousel": "Carrossel de briefing da cabine", "Estimated flight plan": "Plano de voo estimado", "ESTIMATED FLIGHT PLAN": "PLANO DE VOO ESTIMADO", @@ -716,9 +2742,14 @@ "WIND": "VENTO", "SKY": "CÉU", "PRECIP": "PRECIP", + "MM": "MM", + "Weather data by Open-Meteo.com": "Dados meteorológicos do Open-Meteo.com", + "Cockpit briefing pages": "Páginas do briefing da cabine", + "SIG": "SIG", "Show Live Signals": "Mostrar sinais ao vivo", "NEWS": "NOTÍCIAS", "Show Regional News": "Mostrar notícias regionais", + "LOCAL": "LOCAL", "Show Local Info": "Mostrar informações locais", "Cockpit display and Radio controls": "Controles de exibição e rádio da cabine", "DISPLAY": "EXIBIÇÃO", @@ -730,6 +2761,8 @@ "Next filtered radio station": "Próxima estação de rádio filtrada", "VOLUME": "VOLUME", "Cockpit Radio volume": "Volume do rádio da cabine", + "ESC EXIT": "ESC SAIR", + "C TOGGLE": "C ALTERNAR", "View switcher": "Alternador de vista", "Exit cockpit and return to full globe view": "Sair da cabine e voltar à vista do globo completo", "RESET": "REDEFINIR", @@ -757,6 +2790,9 @@ "Search location by name or coordinates": "Buscar local por nome ou coordenadas", "Search any location...": "Buscar qualquer local...", "WEATHER": "CLIMA", + "Active weather products": "Produtos meteorológicos ativos", + "RECENT IMAGERY": "IMAGENS RECENTES", + "Imagery days in the box": "Dias com imagens na área", "CONTEXT": "CONTEXTO", "Compact Radio controls": "Controles compactos do rádio", "Open detailed Radio controls": "Abrir controles detalhados do rádio", @@ -779,13 +2815,14 @@ "AVAILABLE MISSIONS": "MISSÕES DISPONÍVEIS", "SELECT A MISSION TO INSPECT": "SELECIONE UMA MISSÃO PARA INSPECIONAR", "LOADING 30-DAY MISSION INDEX": "CARREGANDO ÍNDICE DE MISSÕES DE 30 DIAS", - "TAB PREVIEWS · ENTER / SPACE SELECTS": "TAB PRÉVIA · ENTER / ESPAÇO SELECIONA", + "TAB PREVIEWS · ENTER / SPACE SELECTS": "TAB MOSTRA PRÉVIA · ENTER / SPACE SELECIONA", "Internet radio and local SDR": "Rádio pela internet e SDR local", "STATION TAG": "TAG DA ESTAÇÃO", "Filter stations by station tag": "Filtrar estações por tag", "All": "Todas", - "Enable Radio, then choose a globe marker or use next.": "Ative o rádio e escolha um marcador no globo ou use próxima.", + "Enable Radio, then choose a globe marker or use next.": "Ative o rádio e escolha um marcador no globo ou use Próxima.", "DRAG TO TUNE": "ARRASTE PARA SINTONIZAR", + "Tune available internet radio stations": "Sintonizar as estações de rádio pela internet disponíveis", "ALL · DRAG THE NEEDLE": "TODAS · ARRASTE A AGULHA", "SNAPS TO AVAILABLE STATIONS": "AJUSTA ÀS ESTAÇÕES DISPONÍVEIS", "Radio playback": "Reprodução do rádio", @@ -796,13 +2833,48 @@ "Stop radio playback": "Parar a reprodução do rádio", "Radio volume": "Volume do rádio", "STATION SITE": "SITE DA ESTAÇÃO", + "DIRECTORY: RADIO BROWSER": "DIRETÓRIO: RADIO BROWSER", "Audio connects directly to the broadcaster after you press play. Your IP is visible to that broadcaster.": "O áudio conecta direto à emissora depois que você aperta play. Seu IP fica visível para essa emissora.", + "Local RTL-SDR receiver": "Receptor RTL-SDR local", + "LOCAL RTL-SDR": "RTL-SDR LOCAL", + "Chrome/Edge · WebUSB · one local tuner shared by FM and the Local ADS-B layer.": "Chrome/Edge · WebUSB · um sintonizador local compartilhado entre o FM e a camada ADS-B local.", + "Use your location for faster ADS-B position decoding": "Use sua localização para decodificar as posições ADS-B mais rápido", + "CHANGE DEVICE": "TROCAR", + "Choose a different RTL-SDR or receiver channel": "Escolha outro RTL-SDR ou outro canal do receptor", + "RTL-SDR receiver mode": "Modo do receptor RTL-SDR", + "GAIN": "GANHO", + "RTL-SDR tuner gain for the current mode": "Ganho do sintonizador RTL-SDR para o modo atual", + "AUTO": "AUTO", + "MSG/S": "MSG/S", + "HEARD": "CAPTADAS", + "POSITIONED": "POSICIONADAS", + "FM MHZ": "FM MHZ", + "TUNE": "SINTONIZAR", + "Seek broadcast FM stations": "Buscar estações de rádio FM", + "◀ SEEK": "◀ BUSCAR", + "SEEK ▶": "BUSCAR ▶", + "SDR VOL": "VOL. SDR", + "Local SDR volume": "Volume do SDR local", "Intelligence HUD (H)": "HUD de inteligência (H)", "Layout": "Layout", "HUD layout": "Layout do HUD", "Tactical": "Tático", "Operator": "Operador", "Minimal": "Mínimo", + "Cyber": "Ciber", + "Sonar": "Sonar", + "Cyber sonar contact scanner": "Scanner de contatos do sonar Ciber", + "Rings": "Anéis", + "Sonar ring count": "Número de anéis do sonar", + "Range": "Alcance", + "Sonar ring range": "Alcance dos anéis do sonar", + "Power": "Potência", + "Sonar intensity": "Intensidade do sonar", + "Opacity": "Opacidade", + "Cyber contact and label opacity": "Opacidade de contatos e rótulos Ciber", + "Minimum opacity for map dots, icons, models, brackets, and labels between sonar passes": "Opacidade mínima de pontos, ícones, modelos, colchetes e rótulos do mapa entre as passagens do sonar", + "Sector": "Setor", + "Sonar sector width": "Largura do setor do sonar", "Detection Overlay (D)": "Sobreposição de detecção (D)", "Detection overlay": "Sobreposição de detecção", "Detection label density": "Densidade dos rótulos de detecção", @@ -810,9 +2882,9 @@ "Detection label allocation": "Alocação dos rótulos de detecção", "Elastic": "Elástica", "Weighted": "Ponderada", - "Fade": "Esmaecer", + "Fade": "Esmaecimento", "Detection fade distance": "Distância de esmaecimento da detecção", - "World-overlay fade distance outside the keyhole as a percentage of its radius": "Distância de esmaecimento da sobreposição no mundo fora do visor, como porcentagem do seu raio", + "World-overlay fade distance outside the keyhole as a percentage of its radius": "Distância de esmaecimento da sobreposição fora do visor, em porcentagem do raio dele", "Outside": "Fora", "Detection opacity outside the keyhole": "Opacidade da detecção fora do visor", "World-overlay label and card opacity beyond the fade distance": "Opacidade de rótulos e cartões da sobreposição além da distância de esmaecimento", @@ -821,11 +2893,31 @@ "Models": "Modelos", "3D model coverage": "Cobertura de modelos 3D", "Proximity": "Proximidade", - "Scope — the circular viewport mask": "Mira — a máscara circular da janela de visualização", + "Scope — the circular viewport mask": "Mira — a máscara circular da vista", "Scope": "Mira", - "Feather": "Suavizar", + "Feather": "Suavização", "Scope edge feather": "Suavização da borda da mira", - "Scope edge feather as a percentage of the keyhole radius": "Suavização da borda da mira, como porcentagem do raio do visor", + "Scope edge feather as a percentage of the keyhole radius": "Suavização da borda da mira, em porcentagem do raio do visor", + "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "Desenhe sobre o mundo — clique nos vértices, clique duplo ou Enter para concluir, Esc para cancelar", + "Shape": "Forma", + "Shape to draw": "Forma a desenhar", + "Area": "Área", + "Line": "Linha", + "Pin": "Marcador", + "Label (optional)": "Rótulo (opcional)", + "Label for the drawn shape": "Rótulo da forma desenhada", + "Colour of the drawn shape": "Cor da forma desenhada", + "Primary": "Principal", + "Amber": "Âmbar", + "Cyan": "Ciano", + "Green": "Verde", + "Red": "Vermelho", + "Clear": "Limpar", + "Remove every mark from the board": "Remover todas as marcações do quadro", + "Show your own GeoJSON, KML, KMZ or GPX files on the globe (or drop them onto it). File bytes stay on this device; overlays can appear in map screenshots shared with voice.": "Mostre no globo seus próprios arquivos GeoJSON, KML, KMZ ou GPX (ou solte-os sobre ele). Os arquivos não saem deste dispositivo; as sobreposições podem aparecer em capturas do mapa compartilhadas com a voz.", + "Import": "Importar", + "Choose GeoJSON, KML, KMZ or GPX files": "Escolha arquivos GeoJSON, KML, KMZ ou GPX", + "Imported files": "Arquivos importados", "Celestial": "Celeste", "Hide UI chrome": "Ocultar a interface", "Clean UI": "Interface limpa", @@ -838,6 +2930,7 @@ "Return UI controls": "Restaurar controles da interface", "Initializing photorealistic world...": "Inicializando o mundo fotorrealista...", "DATA LAYERS": "CAMADAS DE DADOS", + "ACQUIRING FRAME": "OBTENDO QUADRO", "NEAREST": "MAIS PRÓX.", "CCTV camera": "Câmera de CCTV", "CALIBRATION": "CALIBRAÇÃO", @@ -853,6 +2946,26 @@ "SAVE CAL": "SALVAR CAL", "RESET CAL": "REDEFINIR CAL", "SCENE SUMMARY": "RESUMO DA CENA", + "STREET LEVEL": "NÍVEL DA RUA", + "Turn Street Level on or off": "Ativar ou desativar Nível da rua", + "Show the street-level view full screen (Esc shrinks it)": "Mostrar a vista no nível da rua em tela cheia (Esc reduz)", + "Image fit": "Ajuste da imagem", + "FIT": "AJUSTAR", + "Fit: show the whole photo, with dark bars where its shape differs from the frame": "Ajustar: mostra a foto inteira, com barras escuras onde o formato dela difere do quadro", + "FILL": "PREENCHER", + "Fill: fill the frame edge to edge, cropping the photo": "Preencher: preenche o quadro de ponta a ponta, cortando a foto", + "Close the image and deselect it on the map": "Fechar a imagem e desmarcá-la no mapa", + "Close the street-level image": "Fechar a imagem no nível da rua", + "Street-level viewer": "Visualizador no nível da rua", + "Open this image on the provider's site": "Abrir esta imagem no site do provedor", + "Imagery providers": "Provedores de imagens", + "PROVIDERS": "PROVEDORES", + "Imagery filters": "Filtros de imagens", + "IMAGERY": "IMAGENS", + "Panorama filter": "Filtro de panoramas", + "ALL": "TODAS", + "FLAT": "PLANAS", + "SINCE": "DESDE", "SCENES": "CENAS", "Scene recipe": "Receita de cena", "NEW": "NOVA", @@ -875,6 +2988,9 @@ "Globe actions": "Ações do globo", "Turn off all selected data layers": "Desativar todas as camadas de dados selecionadas", "Copy share link": "Copiar link de compartilhamento", + "Toggle straight-down and tilted map views": "Alternar entre a vista de cima e a vista inclinada do mapa", + "Reset map to north up": "Orientar o mapa com o norte para cima", + "Reset map bearing to north": "Redefinir a orientação do mapa para o norte", "Reset camera and return to full globe view": "Redefinir a câmera e voltar à vista do globo completo", "MISSION CONTROL · FIRST LAUNCH": "CENTRO DE CONTROLE · PRIMEIRO ACESSO", "Choose your first view": "Escolha sua primeira vista", diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index 83c8897d8..920016262 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -124,6 +124,131 @@ "ΔN", "▲ {frp} MW" ], + "pt": [ + "1090 MHz", + "978 MHz UAT", + "AIS: --", + "AIS: {name}", + "ALTITUDE", + "ALTITUDE · FT", + "ANIME", + "AUTO", + "Altitude {altitude}", + "Anime", + "Austin", + "BIKE", + "BRG {value}°", + "BRG —", + "Bloom", + "Blues", + "CAL {value}", + "CAL · {badge}", + "CCTV", + "CRS {value}°", + "CRT", + "Country", + "DEST ---°", + "DEST {bearing}", + "Dance", + "Drone", + "Dubai", + "ENE", + "ESE", + "FLIR", + "FLT", + "FM MHZ", + "FOV", + "FOV {value}°", + "FT", + "Folk", + "Funk", + "GEO", + "GOOGLE STREET VIEW", + "Global", + "Global · 60°S–60°N", + "Google Street View", + "HDG", + "HDG {value}°", + "Hip-Hop", + "House", + "Indie", + "Ironbow", + "Jazz", + "LOCAL", + "Landsat 8/9", + "Landsat 8/9 via HLS", + "Layout", + "Los Angeles", + "MIC", + "MIL", + "MINI", + "MM", + "MONITOR", + "MSG/S", + "Metal", + "NAV", + "NE", + "NNE", + "NOIR", + "NORMAL", + "NVG", + "Noir", + "Normal", + "OCEANIA", + "OK", + "POS: {time}Z", + "PRECIP", + "Paris", + "Pop", + "Punk", + "RANGE", + "Reggae", + "Rock", + "S2 GhostMaps", + "SAR", + "SE", + "SIG", + "SNAPSHOT", + "SQUAWK {code} · {status}", + "SSE", + "STATUS", + "STATUS · ", + "Sentinel-2", + "Sentinel-2 via HLS", + "Sonar", + "Soul", + "TAGS · {tags}", + "TEMP", + "Tallinn", + "Techno", + "Trance", + "USB {rate} msg/s", + "VISUAL", + "VOLUME", + "VS", + "WHOT/BHOT", + "WX", + "dB", + "fire confidence|nominal", + "ft", + "hPa", + "installation class|BASE", + "km", + "km/h", + "kt", + "min", + "mini", + "mph", + "nominal", + "view band|GLOBAL", + "{rate} msg/s", + "{type} SPD: {speed} HDG: {heading}", + "{value} KM", + "{value} KM/H", + "{value} KM/S", + "ΔN", + "▲ {frp} MW" + ], "ru": [ "AIS: --", "AIS: {name}", diff --git a/src/ui/localePicker.test.mjs b/src/ui/localePicker.test.mjs index 057642827..660eacaf1 100644 --- a/src/ui/localePicker.test.mjs +++ b/src/ui/localePicker.test.mjs @@ -40,7 +40,7 @@ test('the current language comes first, the rest by their own names', () => { nativeNames: LOCALE_NAMES, }), ), - ['ru', 'en', 'es', 'zh-CN', 'zh-Hant'], + ['ru', 'en', 'es', 'pt', 'zh-CN', 'zh-Hant'], ); assert.deepEqual( codes( @@ -50,7 +50,7 @@ test('the current language comes first, the rest by their own names', () => { nativeNames: LOCALE_NAMES, }), ), - ['es', 'en', 'ru', 'zh-CN', 'zh-Hant'], + ['es', 'en', 'pt', 'ru', 'zh-CN', 'zh-Hant'], ); assert.deepEqual( codes( @@ -60,7 +60,7 @@ test('the current language comes first, the rest by their own names', () => { nativeNames: LOCALE_NAMES, }), ), - ['en', 'es', 'ru', 'zh-CN', 'zh-Hant'], + ['en', 'es', 'pt', 'ru', 'zh-CN', 'zh-Hant'], ); const rows = buildLocaleOptions({ locales: MANY,