Update Russian localization for improved pluralization and add new chat link handling messages

- Enhanced pluralization rules for "hops" in various contexts to better reflect Russian grammar.
- Added new localization strings for chat link handling, including error messages and confirmation prompts.
- Ensured consistency in the use of plural forms across the application.
This commit is contained in:
zjs81
2026-01-24 00:27:45 -07:00
parent daa0c3f9c3
commit f0d34f7503
3 changed files with 1039 additions and 961 deletions
+5
View File
@@ -14,6 +14,7 @@ import 'app_localizations_it.dart';
import 'app_localizations_nl.dart';
import 'app_localizations_pl.dart';
import 'app_localizations_pt.dart';
import 'app_localizations_ru.dart';
import 'app_localizations_sk.dart';
import 'app_localizations_sl.dart';
import 'app_localizations_sv.dart';
@@ -114,6 +115,7 @@ abstract class AppLocalizations {
Locale('nl'),
Locale('pl'),
Locale('pt'),
Locale('ru'),
Locale('sk'),
Locale('sl'),
Locale('sv'),
@@ -4705,6 +4707,7 @@ class _AppLocalizationsDelegate
'nl',
'pl',
'pt',
'ru',
'sk',
'sl',
'sv',
@@ -4736,6 +4739,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
return AppLocalizationsPl();
case 'pt':
return AppLocalizationsPt();
case 'ru':
return AppLocalizationsRu();
case 'sk':
return AppLocalizationsSk();
case 'sl':
+114 -58
View File
@@ -1,9 +1,11 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Russian (`ru`).
class AppLocalizationsEn extends AppLocalizations {
class AppLocalizationsRu extends AppLocalizations {
AppLocalizationsRu([String locale = 'ru']) : super(locale);
@override
@@ -194,8 +196,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get settings_locationUpdated => 'Позиция и настройки GPS обновлены';
@override
String get settings_locationBothRequired =>
'Введите широту и долготу.';
String get settings_locationBothRequired => 'Введите широту и долготу.';
@override
String get settings_locationInvalid => 'Неверная широта или долгота.';
@@ -208,7 +209,8 @@ class AppLocalizationsEn extends AppLocalizations {
'Включение GPS для автоматического обновления позиции.';
@override
String get settings_locationIntervalSec => 'Интервал для позиционирования GPS (секунды)';
String get settings_locationIntervalSec =>
'Интервал для позиционирования GPS (секунды)';
@override
String get settings_locationIntervalInvalid =>
@@ -235,7 +237,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get settings_privacyModeEnabled => 'Режим конфиденциальности включен';
@override
String get settings_privacyModeDisabled => 'Режим конфиденциальности выключен';
String get settings_privacyModeDisabled =>
'Режим конфиденциальности выключен';
@override
String get settings_actions => 'Действия';
@@ -244,7 +247,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get settings_sendAdvertisement => 'Отправить анонсирование';
@override
String get settings_sendAdvertisementSubtitle => 'Отправить анонсирование о присутствии сейчас';
String get settings_sendAdvertisementSubtitle =>
'Отправить анонсирование о присутствии сейчас';
@override
String get settings_advertisementSent => 'Анонсирование отправлено';
@@ -269,7 +273,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get settings_rebootDevice => 'Перезагрузить устройство';
@override
String get settings_rebootDeviceSubtitle => 'Перезапустить устройство MeshCore';
String get settings_rebootDeviceSubtitle =>
'Перезапустить устройство MeshCore';
@override
String get settings_rebootDeviceConfirm =>
@@ -364,7 +369,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get settings_txPowerHelper => '0 22';
@override
String get settings_txPowerInvalid => 'Недопустимая мощность передачи (0–22 дБм)';
String get settings_txPowerInvalid =>
'Недопустимая мощность передачи (0–22 дБм)';
@override
String get settings_longRange => 'Дальний радиус';
@@ -440,9 +446,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get appSettings_languageBg => 'Болгарский';
@override
String get appSettings_languageRu => 'Русский';
@override
String get appSettings_notifications => 'Уведомления';
@@ -490,7 +493,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get appSettings_messaging => 'Обмен сообщениями';
@override
String get appSettings_clearPathOnMaxRetry => 'Сбросить маршрут после максимального числа попыток';
String get appSettings_clearPathOnMaxRetry =>
'Сбросить маршрут после максимального числа попыток';
@override
String get appSettings_clearPathOnMaxRetrySubtitle =>
@@ -505,7 +509,8 @@ class AppLocalizationsEn extends AppLocalizations {
'Маршруты не будут автоматически сбрасываться';
@override
String get appSettings_autoRouteRotation => 'Автоматическое переключение маршрутов';
String get appSettings_autoRouteRotation =>
'Автоматическое переключение маршрутов';
@override
String get appSettings_autoRouteRotationSubtitle =>
@@ -622,7 +627,8 @@ class AppLocalizationsEn extends AppLocalizations {
'Записывать отладочные сообщения приложения для диагностики';
@override
String get appSettings_appDebugLoggingEnabled => 'Журнал отладки приложения включён';
String get appSettings_appDebugLoggingEnabled =>
'Журнал отладки приложения включён';
@override
String get appSettings_appDebugLoggingDisabled =>
@@ -696,7 +702,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get contacts_filterContacts => 'Фильтр контактов...';
@override
String get contacts_noContactsMatchFilter => 'Нет контактов, соответствующих фильтру';
String get contacts_noContactsMatchFilter =>
'Нет контактов, соответствующих фильтру';
@override
String get contacts_noMembers => 'Нет участников';
@@ -801,7 +808,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get channels_enterChannelName => 'Введите имя канала';
@override
String get channels_pskMustBe32Hex => 'PSK должен содержать 32 шестнадцатеричных символа';
String get channels_pskMustBe32Hex =>
'PSK должен содержать 32 шестнадцатеричных символа';
@override
String channels_channelAdded(String name) {
@@ -846,16 +854,19 @@ class AppLocalizationsEn extends AppLocalizations {
String get channels_createPrivateChannelDesc => 'Защищён секретным ключом.';
@override
String get channels_joinPrivateChannel => 'Присоединиться к приватному каналу';
String get channels_joinPrivateChannel =>
'Присоединиться к приватному каналу';
@override
String get channels_joinPrivateChannelDesc => 'Введите секретный ключ вручную.';
String get channels_joinPrivateChannelDesc =>
'Введите секретный ключ вручную.';
@override
String get channels_joinPublicChannel => 'Присоединиться к публичному каналу';
@override
String get channels_joinPublicChannelDesc => 'К этому каналу может присоединиться любой.';
String get channels_joinPublicChannelDesc =>
'К этому каналу может присоединиться любой.';
@override
String get channels_joinHashtagChannel => 'Присоединиться к хэштег-каналу';
@@ -1064,7 +1075,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get chat_forceFloodMode => 'Принудительный режим рассылки';
@override
String get chat_recentAckPaths => 'Недавние подтверждённые маршруты (нажмите, чтобы использовать):';
String get chat_recentAckPaths =>
'Недавние подтверждённые маршруты (нажмите, чтобы использовать):';
@override
String get chat_pathHistoryFull =>
@@ -1082,6 +1094,8 @@ class AppLocalizationsEn extends AppLocalizations {
count,
locale: localeName,
other: 'хопов',
many: 'хопов',
few: 'хопа',
one: 'хоп',
);
return '$count $_temp0';
@@ -1095,8 +1109,7 @@ one: 'хоп',
@override
String get chat_noPathHistoryYet =>
'История маршрутов пока пуста.
Отправьте сообщение, чтобы обнаружить маршруты.';
'История маршрутов пока пуста.\nОтправьте сообщение, чтобы обнаружить маршруты.';
@override
String get chat_pathActions => 'Действия с маршрутом:';
@@ -1111,14 +1124,16 @@ one: 'хоп',
String get chat_clearPath => 'Очистить маршрут';
@override
String get chat_clearPathSubtitle => 'Принудительно обновить маршрут при следующей отправке';
String get chat_clearPathSubtitle =>
'Принудительно обновить маршрут при следующей отправке';
@override
String get chat_pathCleared =>
'Маршрут очищен. Следующее сообщение обновит маршрут.';
@override
String get chat_floodModeSubtitle => 'Используйте переключатель маршрутизации в панели приложения';
String get chat_floodModeSubtitle =>
'Используйте переключатель маршрутизации в панели приложения';
@override
String get chat_floodModeEnabled =>
@@ -1137,13 +1152,16 @@ one: 'хоп',
hopCount,
locale: localeName,
other: 'хопов',
many: 'хопов',
few: 'хопа',
one: 'хоп',
);
return 'Маршрут установлен: $hopCount $_temp0$status';
}
@override
String get chat_pathSavedLocally => 'Сохранено локально. Подключитесь для синхронизации.';
String get chat_pathSavedLocally =>
'Сохранено локально. Подключитесь для синхронизации.';
@override
String get chat_pathDeviceConfirmed => 'Подтверждено устройством.';
@@ -1188,6 +1206,24 @@ one: 'хоп',
return 'Непрочитанных: $count';
}
@override
String get chat_openLink => 'Открыть ссылку?';
@override
String get chat_openLinkConfirmation =>
'Хотите открыть эту ссылку в вашем браузере?';
@override
String get chat_open => 'Открыть';
@override
String chat_couldNotOpenLink(String url) {
return 'Не удалось открыть ссылку: $url';
}
@override
String get chat_invalidLink => 'Неправильный формат ссылки';
@override
String get map_title => 'Карта нод';
@@ -1324,10 +1360,12 @@ one: 'хоп',
String get mapCache_title => 'Кэш офлайн-карты';
@override
String get mapCache_selectAreaFirst => 'Сначала выберите область для кэширования';
String get mapCache_selectAreaFirst =>
'Сначала выберите область для кэширования';
@override
String get mapCache_noTilesToDownload => 'Нет плиток для загрузки в этой области';
String get mapCache_noTilesToDownload =>
'Нет плиток для загрузки в этой области';
@override
String get mapCache_downloadTilesTitle => 'Загрузить плитки';
@@ -1354,7 +1392,8 @@ one: 'хоп',
String get mapCache_clearOfflineCacheTitle => 'Очистить офлайн-кэш';
@override
String get mapCache_clearOfflineCachePrompt => 'Удалить все закэшированные плитки карты?';
String get mapCache_clearOfflineCachePrompt =>
'Удалить все закэшированные плитки карты?';
@override
String get mapCache_offlineCacheCleared => 'Офлайн-кэш очищен';
@@ -1407,17 +1446,17 @@ one: 'хоп',
@override
String time_minutesAgo(int minutes) {
return '${minutes} мин назад';
return '$minutes мин назад';
}
@override
String time_hoursAgo(int hours) {
return '${hours} ч назад';
return '$hours ч назад';
}
@override
String time_daysAgo(int days) {
return '${days} дн. назад';
return '$days дн. назад';
}
@override
@@ -1491,7 +1530,8 @@ one: 'хоп',
String get login_routingMode => 'Режим маршрутизации';
@override
String get login_autoUseSavedPath => 'Авто (использовать сохранённый маршрут)';
String get login_autoUseSavedPath =>
'Авто (использовать сохранённый маршрут)';
@override
String get login_forceFloodMode => 'Принудительный режим рассылки';
@@ -1533,6 +1573,8 @@ one: 'хоп',
count,
locale: localeName,
other: 'хопов',
many: 'хопов',
few: 'хопа',
one: 'хоп',
);
return 'Используется маршрут из $count $_temp0';
@@ -1628,7 +1670,8 @@ one: 'хоп',
String get repeater_routingMode => 'Режим маршрутизации';
@override
String get repeater_autoUseSavedPath => 'Авто (использовать сохранённый маршрут)';
String get repeater_autoUseSavedPath =>
'Авто (использовать сохранённый маршрут)';
@override
String get repeater_forceFloodMode => 'Принудительный режим рассылки';
@@ -1702,7 +1745,7 @@ int hours,
int minutes,
int seconds,
) {
return '$days дн. ${hours}ч ${minutes}м ${seconds}с';
return '$days дн. $hoursч $minutesм $secondsс';
}
@override
@@ -1747,7 +1790,8 @@ int seconds,
String get repeater_guestPassword => 'Гостевой пароль';
@override
String get repeater_guestPasswordHelper => 'Пароль для доступа только для чтения';
String get repeater_guestPasswordHelper =>
'Пароль для доступа только для чтения';
@override
String get repeater_radioSettings => 'Настройки радио';
@@ -1780,13 +1824,15 @@ int seconds,
String get repeater_latitude => 'Широта';
@override
String get repeater_latitudeHelper => 'В десятичных градусах (напр., 37.7749)';
String get repeater_latitudeHelper =>
'В десятичных градусах (напр., 37.7749)';
@override
String get repeater_longitude => 'Долгота';
@override
String get repeater_longitudeHelper => 'В десятичных градусах (напр., -122.4194)';
String get repeater_longitudeHelper =>
'В десятичных градусах (напр., -122.4194)';
@override
String get repeater_features => 'Функции';
@@ -1802,7 +1848,8 @@ int seconds,
String get repeater_guestAccess => 'Гостевой доступ';
@override
String get repeater_guestAccessSubtitle => 'Разрешить гостевой доступ только для чтения';
String get repeater_guestAccessSubtitle =>
'Разрешить гостевой доступ только для чтения';
@override
String get repeater_privacyMode => 'Режим конфиденциальности';
@@ -1823,7 +1870,8 @@ int seconds,
}
@override
String get repeater_floodAdvertInterval => 'Интервал анонсирований рассылкой (flood)';
String get repeater_floodAdvertInterval =>
'Интервал анонсирований рассылкой (flood)';
@override
String repeater_floodAdvertIntervalHours(int hours) {
@@ -1841,7 +1889,8 @@ int seconds,
String get repeater_rebootRepeater => 'Перезагрузить репитер';
@override
String get repeater_rebootRepeaterSubtitle => 'Перезапустить устройство репитера';
String get repeater_rebootRepeaterSubtitle =>
'Перезапустить устройство репитера';
@override
String get repeater_rebootRepeaterConfirm =>
@@ -1904,7 +1953,8 @@ int seconds,
String get repeater_refreshTxPower => 'Обновить мощность передачи';
@override
String get repeater_refreshLocationSettings => 'Обновить настройки местоположения';
String get repeater_refreshLocationSettings =>
'Обновить настройки местоположения';
@override
String get repeater_refreshPacketForwarding => 'Обновить пересылку пакетов';
@@ -2013,7 +2063,8 @@ int seconds,
'Сбрасывает различные счётчики статистики в ноль.';
@override
String get repeater_cliHelpSetAf => 'Устанавливает коэффициент времени в эфире.';
String get repeater_cliHelpSetAf =>
'Устанавливает коэффициент времени в эфире.';
@override
String get repeater_cliHelpSetTx =>
@@ -2122,7 +2173,8 @@ int seconds,
'Начинает запись пакетов в файловую систему.';
@override
String get repeater_cliHelpLogStop => 'Останавливает запись пакетов в файловую систему.';
String get repeater_cliHelpLogStop =>
'Останавливает запись пакетов в файловую систему.';
@override
String get repeater_cliHelpLogErase =>
@@ -2169,7 +2221,8 @@ int seconds,
'Показывает текущий «домашний» регион. (Пока не используется, зарезервировано на будущее)';
@override
String get repeater_cliHelpRegionHomeSet => 'Устанавливает «домашний» регион.';
String get repeater_cliHelpRegionHomeSet =>
'Устанавливает «домашний» регион.';
@override
String get repeater_cliHelpRegionSave =>
@@ -2183,7 +2236,8 @@ int seconds,
String get repeater_cliHelpGpsOnOff => 'Переключает состояние питания GPS.';
@override
String get repeater_cliHelpGpsSync => 'Синхронизирует время ноды с часами GPS.';
String get repeater_cliHelpGpsSync =>
'Синхронизирует время ноды с часами GPS.';
@override
String get repeater_cliHelpGpsSetLoc =>
@@ -2191,10 +2245,7 @@ int seconds,
@override
String get repeater_cliHelpGpsAdvert =>
'Показывает конфигурацию передачи местоположения в анонсированиях:
- none: не включать местоположение
- share: передавать GPS-координаты (из SensorManager)
- prefs: передавать координаты из настроек';
'Показывает конфигурацию передачи местоположения в анонсированиях:\n- none: не включать местоположение\n- share: передавать GPS-координаты (из SensorManager)\n- prefs: передавать координаты из настроек';
@override
String get repeater_cliHelpGpsAdvertSet =>
@@ -2273,17 +2324,17 @@ int seconds,
@override
String telemetry_batteryValue(int percent, String volts) {
return '$percent% / ${volts}В';
return '$percent% / $voltsВ';
}
@override
String telemetry_voltageValue(String volts) {
return '${volts}В';
return '$voltsВ';
}
@override
String telemetry_currentValue(String amps) {
return '${amps}А';
return '$ampsА';
}
@override
@@ -2295,7 +2346,8 @@ int seconds,
String get neighbors_receivedData => 'Полученные данные о соседях';
@override
String get neighbors_requestTimedOut => 'Время ожидания данных о соседях истекло.';
String get neighbors_requestTimedOut =>
'Время ожидания данных о соседях истекло.';
@override
String neighbors_errorLoading(String error) {
@@ -2315,7 +2367,7 @@ int seconds,
@override
String neighbors_heardAgo(String time) {
return 'Слышали: $time назад';
return 'Слушал(а): $time назад';
}
@override
@@ -2498,14 +2550,16 @@ int seconds,
}
@override
String get community_addPublicChannel => 'Добавить публичный канал сообщества';
String get community_addPublicChannel =>
'Добавить публичный канал сообщества';
@override
String get community_addPublicChannelHint =>
'Автоматически добавить публичный канал для этого сообщества';
@override
String get community_noCommunities => 'Вы ещё не присоединились ни к одному сообществу';
String get community_noCommunities =>
'Вы ещё не присоединились ни к одному сообществу';
@override
String get community_scanOrCreate =>
@@ -2575,13 +2629,15 @@ int seconds,
String get community_regularHashtag => 'Обычный хэштег';
@override
String get community_regularHashtagDesc => 'Публичный хэштег (любой может присоединиться)';
String get community_regularHashtagDesc =>
'Публичный хэштег (любой может присоединиться)';
@override
String get community_communityHashtag => 'Хэштег сообщества';
@override
String get community_communityHashtagDesc => 'Доступен только участникам сообщества';
String get community_communityHashtagDesc =>
'Доступен только участникам сообщества';
@override
String community_forCommunity(String name) {
+24 -7
View File
@@ -1,12 +1,9 @@
{
"@@locale": "ru",
"appTitle": "MeshCore Open",
"nav_contacts": "Контакты",
"nav_channels": "Каналы",
"nav_map": "Карта",
"common_cancel": "Отмена",
"common_ok": "OK",
"common_connect": "Коннект",
@@ -326,7 +323,7 @@
"chat_pathHistoryFull": "История маршрутов заполнена. Удалите записи, чтобы добавить новые.",
"chat_hopSingular": "хоп",
"chat_hopPlural": "хопов",
"chat_hopsCount": "{count} {plural, select, one {хоп} other {хопов}}",
"chat_hopsCount": "{count} {count, plural, one{хоп} few{хопа} many{хопов} other{хопов}}",
"chat_successes": "успешно",
"chat_removePath": "Удалить маршрут",
"chat_noPathHistoryYet": "История маршрутов пока пуста.\nОтправьте сообщение, чтобы обнаружить маршруты.",
@@ -340,7 +337,7 @@
"chat_floodModeEnabled": "Режим рассылки включён. Отключите через значок маршрутизации в панели приложения.",
"chat_fullPath": "Полный маршрут",
"chat_pathDetailsNotAvailable": "Детали маршрута ещё недоступны. Попробуйте отправить сообщение для обновления.",
"chat_pathSetHops": "Маршрут установлен: {hopCount} {plural, select, one {хоп} other {хопов}} — {status}",
"chat_pathSetHops": "Маршрут установлен: {hopCount} {hopCount, plural, one{хоп} few{хопа} many{хопов} other{хопов}} — {status}",
"chat_pathSavedLocally": "Сохранено локально. Подключитесь для синхронизации.",
"chat_pathDeviceConfirmed": "Подтверждено устройством.",
"chat_pathDeviceNotConfirmed": "Ещё не подтверждено устройством.",
@@ -453,7 +450,7 @@
"common_reload": "Обновить",
"common_clear": "Очистить",
"path_currentPath": "Текущий маршрут: {path}",
"path_usingHopsPath": "Используется маршрут из {count} {plural, select, one {хоп} other {хопов}}",
"path_usingHopsPath": "Используется маршрут из {count} {count, plural, one{хоп} few{хопа} many{хопов} other{хопов}}",
"path_enterCustomPath": "Введите маршрут вручную",
"path_currentPathLabel": "Текущий маршрут",
"path_hexPrefixInstructions": "Введите 2-символьные шестнадцатеричные префиксы для каждого хопа, разделённые запятыми.",
@@ -757,5 +754,25 @@
"listFilter_repeaters": "Репитеры",
"listFilter_roomServers": "Серверы комнат",
"listFilter_unreadOnly": "Только непрочитанные",
"listFilter_newGroup": "Новая группа"
"listFilter_newGroup": "Новая группа",
"@chat_couldNotOpenLink": {
"placeholders": {
"url": {
"type": "String"
}
}
},
"@neighbors_heardAgo": {
"placeholders": {
"time": {
"type": "String"
}
}
},
"chat_open": "Открыть",
"chat_couldNotOpenLink": "Не удалось открыть ссылку: {url}",
"chat_openLink": "Открыть ссылку?",
"chat_openLinkConfirmation": "Хотите открыть эту ссылку в вашем браузере?",
"neighbors_heardAgo": "Слушал(а): {time} назад",
"chat_invalidLink": "Неправильный формат ссылки"
}