diff --git a/docs/TRANSLATORS.md b/docs/TRANSLATORS.md index ffef75735..0cc99fa2e 100644 --- a/docs/TRANSLATORS.md +++ b/docs/TRANSLATORS.md @@ -46,7 +46,8 @@ Edit `src/i18n/locales/.json` and run `npm run i18n`. To see your change, 2. Import it in `src/i18n/index.js` and add it to `CATALOGS`. 3. Add the code to `LOCALES` and its own-language name to `LOCALE_NAMES` in `src/i18n/locale.js`. Right-to-left languages also go in `RTL_LOCALES`. 4. Add `src/i18n/locales/.json` next to `ru.json` in `scripts/package-boundaries.json`. -5. Run `npm run i18n` and `npm test`, then check the panels in the app at narrow widths. +5. Write `docs/translations/.md`: glossary, plural forms, units and style (copy the structure of `ru.md`). +6. Run `npm run i18n` and `npm test`, then check the panels in the app at narrow widths. ## Rules @@ -54,27 +55,12 @@ Edit `src/i18n/locales/.json` and run `npm run i18n`. To see your change, - UPPERCASE English stays UPPERCASE. Short labels, chips and HUD readouts should stay short; prefer an abbreviation over a wrapped line. - Keep the separators `·`, `—`, `→`, `↗`, `…`. - Leave product, provider and data names in their original form: Google Maps, Cesium ion, OpenAI, ChatGPT, NASA FIRMS, USGS, OpenSky, ADS-B, AIS, CCTV, HUD, TomTom, OpenStreetMap, Mapillary, and keyboard keys (Space, Esc, H, 1–9). -- Units follow the language's convention (Russian: км, м/с, уз, фт). +- Units follow the language's convention; see the language notes. ## Never translated These are contracts, not copy: layer ids and registry keys, status enums and other machine values (translate only the label shown for them), share-link and hash parameters, `?lang=`, storage schemas, API fields, voice tool names and schemas, provider and dataset names, data from feeds (callsigns, vessel, satellite, station and place names, headlines), attribution, console diagnostics, and user-authored content. -## Russian glossary +## Language notes -| English | Русский | -| ------------------------------- | ---------------------------------- | -| layer / data layer | слой / слой данных | -| feed | поток данных (short: поток) | -| source | источник | -| LIVE (status) / live data | ОНЛАЙН / в реальном времени | -| SIMULATED | СИМУЛЯЦИЯ | -| stale / degraded / unavailable | устарел / с перебоями / недоступен | -| key (API key) / POWER UP | ключ / ЗАПУСК | -| aircraft / flight / vessel | самолёт / рейс / судно | -| launch (rocket) / space mission | пуск / космическая миссия | -| contact / tracking | контакт / отслеживание | -| installation | объект | -| scene / shot / recipe | сцена / кадр / рецепт | -| HDG / BRG / CRS / FOV / DEST | КУРС / ПЕЛ. / ПУТЬ / ОБЗОР / НАЗН. | -| PREV / NEXT | ПРЕД. / СЛЕД. | +Each language keeps its glossary, plural forms, units and style in its own file, `docs/translations/.md`: [Russian](./translations/ru.md). Read it before translating, and add a term there when you settle on one. diff --git a/docs/translations/ru.md b/docs/translations/ru.md new file mode 100644 index 000000000..bb6f4bd95 --- /dev/null +++ b/docs/translations/ru.md @@ -0,0 +1,56 @@ +# Russian (`ru`) + +Catalog: `src/i18n/locales/ru.json`. General rules: [TRANSLATORS.md](../TRANSLATORS.md). + +## Style + +- Address the user with polite imperatives: «Нажмите», «Включите», «Попробуйте снова». +- Sentence case, not Title Case: "Live Flights" → «Рейсы в реальном времени». +- Quotes inside Russian text are «ёлочки». Write ё where it belongs: её, ещё, всё. +- In short labels, a standard abbreviation with a period beats a wrapped line: НЕОПРЕД., СЛЕД. +- Units: км, м, км/ч, м/с, уз (knots), фт (feet), ч, мин, с; in UPPERCASE text КМ, М, КМ/С, УЗ, ФТ. MW is МВт in any case. `°` and `%` stay. + +## Plurals + +A `tn()` entry needs four forms. `Intl.PluralRules('ru')` picks: + +| Form | Counts | Example | +| ------- | ------------------------ | ---------- | +| `one` | 1, 21, 31, 101… | 1 камера | +| `few` | 2–4, 22–24, 32–34… | 3 камеры | +| `many` | 0, 5–20, 25–30, 111–114… | 5 камер | +| `other` | fractions: 1.5, 2.25… | 1,5 камеры | + +When a word next to a number cannot agree in every form, move the number after a colon instead: «доступно {bikes}», «ответов: {responses}». + +## Glossary + +| English | Русский | +| ------------------------------------------ | -------------------------------------------------- | +| layer / data layer | слой / слой данных | +| feed | поток данных (short: поток) | +| source / data source | источник / источник данных | +| LIVE (status) / live data | ОНЛАЙН / в реальном времени | +| SIMULATED | СИМУЛЯЦИЯ | +| stale / degraded / unavailable | устарел / с перебоями / недоступен | +| retry | повтор | +| key (API key) / POWER UP | ключ / ЗАПУСК | +| Provider Settings | Настройки провайдеров | +| globe / map / map source | глобус / карта / источник карты | +| aircraft / flight / military flights | самолёт (short HUD: борт) / рейс / военные рейсы | +| vessel, ship / vessels | судно / суда | +| satellite | спутник | +| launch (rocket) / space mission | пуск / космическая миссия | +| contact / tracking | контакт / отслеживание | +| installation, site | объект | +| camera / CCTV camera | камера / камера CCTV | +| earthquake / active fire | землетрясение / активный пожар | +| scene / shot / scene recipe | сцена / кадр / рецепт сцены | +| briefing / panel / dock | брифинг / панель / док | +| preset / visual preset | пресет / визуальный пресет | +| Scope (circular viewport mask) | прицел | +| heading / altitude / ground speed | курс / высота / путевая скорость | +| HDG / BRG / CRS / FOV / DEST / SPD / RANGE | КУРС / ПЕЛ. / ПУТЬ / ОБЗОР / НАЗН. / СКОР / ДАЛЬН. | +| PREV / NEXT | ПРЕД. / СЛЕД. | +| Previous / Next (button text) | Назад / Далее | +| L / R (relative bearing) | Л / П |