3aeb2a8680
- AppLang enum 扩为 zh/en/ja/ko/ru/es;新增 strings_{ja,ko,ru,es}.dart
(各 161 条,照 strings_en.dart 结构逐条翻译,无红线词,scan-redline 过)
- app_providers: localeProvider 默认 AppLang.en(国际化默认);appTextProvider
三元改 switch 全覆盖 6 语
- AppLang.nativeLabel 扩展(各语言本地名);settings/account 两处 _LangSwitch
段控改下拉(6 语横排会挤)
- flutter analyze lib 仅剩 2 个既有 withOpacity deprecation info
注:节点/套餐名、错误消息等 ~11 处数据驱动的 zh/en 三元暂回退 en(非崩溃,
后续可扩多语字段)。localeProvider 暂无持久化(沿用原设计,后续可加)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
374 lines
15 KiB
Dart
374 lines
15 KiB
Dart
// strings_ru.dart — русские текстовые ресурсы (отображение на одном языке)
|
||
//
|
||
// Запрещённые слова: VPN /翻墙 / 科学上网 / 突破封锁 / 自由穿越 / Go anywhere / ВПН.
|
||
// Позиционирование: ускорение сети / оптимизация опыта + приватность.
|
||
// Номера тарифов соответствуют design/CLAUDE.md §7.
|
||
import 'app_text.dart';
|
||
|
||
class StringsRu extends AppText {
|
||
const StringsRu();
|
||
|
||
@override
|
||
AppLang get lang => AppLang.ru;
|
||
|
||
@override
|
||
String get brand => 'Pangolin';
|
||
@override
|
||
String get online => '● В сети';
|
||
@override
|
||
String get offline => '○ Не в сети';
|
||
@override
|
||
String get capOff => 'Нажмите для подключения';
|
||
@override
|
||
String get capConnecting => 'Подключение…';
|
||
@override
|
||
String get capOn => 'Подключено · Шифрование';
|
||
@override
|
||
String get connectNow => 'ПОДКЛЮЧИТЬ';
|
||
@override
|
||
String get secure => 'ЗАЩИЩЕНО';
|
||
|
||
@override
|
||
String get tabConnect => 'Подключение';
|
||
@override
|
||
String get tabServers => 'Серверы';
|
||
@override
|
||
String get tabStats => 'Статистика';
|
||
@override
|
||
String get tabMe => 'Аккаунт';
|
||
|
||
@override
|
||
String get currentNode => 'Текущий узел';
|
||
@override
|
||
String get download => 'Приём';
|
||
@override
|
||
String get upload => 'Отдача';
|
||
@override
|
||
String get latency => 'Пинг';
|
||
|
||
@override
|
||
String get quotaToday => 'Осталось сегодня';
|
||
@override
|
||
String get minutes => 'мин';
|
||
@override
|
||
String get quotaFree => 'Бесплатно · 10 мин/день';
|
||
@override
|
||
String get planFreeTag => 'Бесплатно';
|
||
@override
|
||
String get watchAd => 'Смотрите рекламу, чтобы начать';
|
||
@override
|
||
String get adUnlocked => 'Открыто на сегодня';
|
||
@override
|
||
String get quotaLeftLabel => 'Осталось';
|
||
@override
|
||
String get quotaUsedUp => 'Дневной бесплатный лимит исчерпан';
|
||
@override
|
||
String get watchAdMore => 'Смотрите рекламу, чтобы добавить время';
|
||
@override
|
||
String get quotaExhaustedNotice => 'Дневной бесплатный лимит исчерпан. Посмотрите рекламу, чтобы добавить время, или оформите подписку.';
|
||
@override
|
||
String get adPlaying => 'Реклама воспроизводится…';
|
||
@override
|
||
String adRewarded(int minutes) => '+$minutes мин добавлено';
|
||
@override
|
||
String get adFailed => 'Не удалось добавить время, попробуйте ещё раз';
|
||
@override
|
||
String get quotaDesktopTitle => 'Дневной бесплатный лимит исчерпан';
|
||
@override
|
||
String get quotaDesktopBody => 'Смотрите рекламу в мобильном приложении, чтобы добавить время, или оформите подписку для безлимитного доступа.';
|
||
@override
|
||
String get gotIt => 'Понятно';
|
||
|
||
@override
|
||
String get chooseNode => 'Выбор сервера';
|
||
@override
|
||
String get searchPh => 'Поиск страны / города';
|
||
@override
|
||
String get smartSelect => 'Умный выбор';
|
||
@override
|
||
String nodeSwitchTitle(String name) => 'Переключиться на $name?';
|
||
@override
|
||
String get nodeSwitchBody => 'Текущее соединение будет разорвано и восстановлено через этот узел.';
|
||
@override
|
||
String get nodeSwitchConfirm => 'Переключить';
|
||
@override
|
||
String get nodeUnhealthySwitched => 'Текущий узел недоступен — переключение выполнено автоматически';
|
||
@override
|
||
String get nodeUnhealthyError => 'Текущий узел недоступен — переподключитесь или смените узел';
|
||
@override
|
||
String get nodeReconnecting => 'Сеть нестабильна, переподключение…';
|
||
@override
|
||
String get smartSub => 'Подбирает лучший узел для вашей сети';
|
||
@override
|
||
String get recommended => 'Рекомендуется';
|
||
|
||
@override
|
||
String get statsTitle => 'Статистика';
|
||
@override
|
||
String get trafficMonth => 'Трафик';
|
||
@override
|
||
String get avgPing => 'Средний пинг';
|
||
@override
|
||
String get durMonth => 'Время';
|
||
@override
|
||
String get weekTraffic => 'На этой неделе (ГБ)';
|
||
@override
|
||
List<String> get days7 => const ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];
|
||
@override
|
||
String get byDevice => 'По устройствам';
|
||
@override
|
||
String get noDeviceUsage => 'Пока нет данных по устройствам';
|
||
@override
|
||
String get periodMonth => 'Этот месяц';
|
||
@override
|
||
String get periodWeek => 'Эта неделя';
|
||
@override
|
||
String get periodToday => 'Сегодня';
|
||
@override
|
||
String get statDown => 'Приём';
|
||
@override
|
||
String get statUp => 'Отдача';
|
||
@override
|
||
String get statDuration => 'Длительность';
|
||
@override
|
||
String get chartTwoWeeks => 'Последние 2 недели';
|
||
@override
|
||
String get allDevices => 'Все устройства';
|
||
|
||
@override
|
||
String get meTitle => 'Аккаунт';
|
||
@override
|
||
String get proMember => 'PRO-подписка';
|
||
@override
|
||
String get freePlanName => 'Бесплатный';
|
||
@override
|
||
String get expires => 'Действует до';
|
||
@override
|
||
String get upgradeBtn => 'Продлить / Улучшить';
|
||
@override
|
||
String get accInfoTitle => 'Данные аккаунта';
|
||
@override
|
||
String get accEmail => 'Эл. почта';
|
||
@override
|
||
String get accPassword => 'Пароль';
|
||
@override
|
||
String get accChange => 'Изменить';
|
||
@override
|
||
String get deviceLimitTitle => 'Достигнут лимит устройств';
|
||
@override
|
||
String get deviceLimitDesc => 'Ваш тариф допускает до %s устройств. Удалите одно, чтобы продолжить.';
|
||
@override
|
||
String get deviceLimitRemoveOldest => 'Удалить давно неиспользуемое';
|
||
@override
|
||
String get myDevices => 'Мои устройства';
|
||
@override
|
||
String get devicesSub => 'До 3 устройств на PRO';
|
||
@override
|
||
String get thisDevice => 'Это устройство';
|
||
@override
|
||
String get remove => 'Удалить';
|
||
@override
|
||
String get devOnline => 'В сети';
|
||
@override
|
||
String get devOffline => 'Не в сети';
|
||
@override
|
||
String get devLastOnline => 'Был(а) в сети';
|
||
@override
|
||
String get devNeverLogin => 'Ни разу не входил(а)';
|
||
@override
|
||
String get devForceLogout => 'Принудительный выход';
|
||
@override
|
||
String get devClearLogin => 'Очистить данные входа';
|
||
@override
|
||
String get devRename => 'Переименовать';
|
||
@override
|
||
String get devRenameHint => 'Имя устройства';
|
||
@override
|
||
String get devSave => 'Сохранить';
|
||
@override
|
||
String get devForceLogoutConfirm => 'Это завершит сеанс входа устройства — оно будет отключено и потребует повторного входа. Устройство останется в списке.';
|
||
@override
|
||
String get devClearLoginConfirm => 'Это полностью удалит устройство из списка и отзовёт его сеанс входа и учётные данные передачи данных. Чтобы снова использовать устройство, нужно войти заново.';
|
||
@override
|
||
String get devCancel => 'Отмена';
|
||
@override
|
||
String get sessionRevokedTitle => 'Это устройство было отключено';
|
||
@override
|
||
String get sessionRevokedBody => 'Вход с этого устройства завершён с другого устройства вашего аккаунта. Пожалуйста, войдите снова.';
|
||
@override
|
||
String get sessionRevokedOk => 'Войти снова';
|
||
@override
|
||
String get redeemEntry => 'Активация и покупка';
|
||
@override
|
||
String get contactEntry => 'Связаться с нами';
|
||
@override
|
||
String get signOut => 'Выйти';
|
||
@override
|
||
String get language => 'Язык';
|
||
@override
|
||
String get darkAppearance => 'Тёмная тема';
|
||
@override
|
||
String get stateOn => 'Вкл.';
|
||
@override
|
||
String get followLight => 'Выкл.';
|
||
@override
|
||
String get protocol => 'Протокол';
|
||
@override
|
||
String get settingsTitle => 'Настройки';
|
||
@override
|
||
String get autostart => 'Запуск при старте системы';
|
||
@override
|
||
String get autostartSub => 'Запускать автоматически при включении системы';
|
||
@override
|
||
String get autoConnect => 'Автоподключение';
|
||
@override
|
||
String get autoConnectSub => 'Подключаться автоматически при запуске';
|
||
@override
|
||
String autoConnectingTo(String name) => 'Автоподключение к $name…';
|
||
@override
|
||
String get smartRoute => 'Умная маршрутизация';
|
||
@override
|
||
String get smartRouteSub => 'Ускорение для зарубежных ресурсов, прямой доступ для локальных';
|
||
@override
|
||
String get killSwitch => 'Kill Switch';
|
||
@override
|
||
String get killSwitchSub => 'Блокировать трафик при разрыве соединения';
|
||
@override
|
||
String get checkUpdate => 'Проверить обновления';
|
||
@override
|
||
String get webUserCenter => 'Личный кабинет (веб)';
|
||
@override
|
||
String updateAvailableTitle(String version) => 'Доступна новая версия v$version';
|
||
@override
|
||
String get updateNotesFallback => 'Это обновление включает исправления и улучшения стабильности.';
|
||
@override
|
||
String get updateLater => 'Позже';
|
||
@override
|
||
String get updateDownload => 'Скачать обновление';
|
||
@override
|
||
String get updateUpToDate => 'У вас установлена последняя версия';
|
||
@override
|
||
String get updateCheckFailed => 'Не удалось проверить обновления, попробуйте позже';
|
||
|
||
@override
|
||
String get choosePlan => 'Выбор тарифа';
|
||
@override
|
||
String get freePlan => 'Бесплатный';
|
||
@override
|
||
String get proPlan => 'Pro';
|
||
@override
|
||
String get teamPlan => 'Команда';
|
||
@override
|
||
String get perMonth => '/мес';
|
||
@override
|
||
String get current => 'Текущий';
|
||
@override
|
||
String get upgrade => 'Улучшить';
|
||
@override
|
||
String get choose => 'Выбрать';
|
||
@override
|
||
String get mostPopular => 'Популярный';
|
||
@override
|
||
List<String> get featsFree => const [
|
||
'Только 1 базовый узел',
|
||
'10 минут в день',
|
||
'Смотрите рекламу, чтобы начать',
|
||
'7 дней бесплатно при регистрации',
|
||
];
|
||
@override
|
||
List<String> get featsPro =>
|
||
const ['80+ локаций', 'Безлимитно · быстро', '5 устройств', 'Оптимизация для стриминга'];
|
||
@override
|
||
List<String> get featsTeam =>
|
||
const ['Всё из Pro', '10 мест', 'Единый счёт', 'Приоритетная поддержка'];
|
||
|
||
@override
|
||
String get redeemTitle => 'Активация и покупка';
|
||
@override
|
||
String get redeemCodeTitle => 'Активировать код';
|
||
@override
|
||
String get redeemPh => 'Введите код активации';
|
||
@override
|
||
String get redeemBtn => 'Активировать';
|
||
@override
|
||
String get redeemOk => 'Активировано · PRO открыт';
|
||
@override
|
||
String get buyTitle => 'Где купить';
|
||
@override
|
||
String get buySub => 'Оплата внутри приложения недоступна. Получить код можно через:';
|
||
@override
|
||
String get chStore => 'Магазин самообслуживания';
|
||
@override
|
||
String get chEmail => 'Поддержка по эл. почте';
|
||
|
||
@override
|
||
String get contactTitle => 'Связаться с нами';
|
||
@override
|
||
String get contactIntro =>
|
||
'Нужна помощь? Свяжитесь с нами любым способом ниже — обычно отвечаем за считанные минуты.';
|
||
@override
|
||
String get contactEmail => 'Поддержка по эл. почте';
|
||
@override
|
||
String get contactStore => 'Магазин самообслуживания';
|
||
@override
|
||
String get contactHoursTitle => 'Часы поддержки';
|
||
@override
|
||
String get contactHours => 'Ежедневно 9:00 – 24:00 (GMT+8)';
|
||
|
||
@override
|
||
String get authTagline => 'Быстро · Стабильно · Без усилий';
|
||
@override
|
||
String get tabLogin => 'Вход';
|
||
@override
|
||
String get tabRegister => 'Регистрация';
|
||
@override
|
||
String get emailLabel => 'Эл. почта';
|
||
@override
|
||
String get emailPh => 'your@email.com';
|
||
@override
|
||
String get pwLabel => 'Пароль';
|
||
@override
|
||
String get pwPh => 'Введите пароль';
|
||
@override
|
||
String get setPwPh => 'Задайте пароль (для входа с нескольких устройств)';
|
||
@override
|
||
String get codeLabel => 'Код подтверждения';
|
||
@override
|
||
String codeSentTo(String email) => 'Код отправлен на $email';
|
||
@override
|
||
String get sendCode => 'Отправить код';
|
||
@override
|
||
String get resend => 'Отправить снова';
|
||
@override
|
||
String get doLogin => 'Войти';
|
||
@override
|
||
String get doNext => 'Далее';
|
||
@override
|
||
String get doCreate => 'Создать аккаунт';
|
||
@override
|
||
String get forgotPw => 'Забыли пароль?';
|
||
@override
|
||
String get tos => 'Продолжая, вы принимаете наши Условия и Политику конфиденциальности';
|
||
|
||
@override
|
||
String get obSkip => 'Пропустить';
|
||
@override
|
||
String get obNext => 'Далее';
|
||
@override
|
||
String get obAllow => 'Разрешить и продолжить';
|
||
@override
|
||
String get obStart => 'Начать';
|
||
@override
|
||
String get ob1Title => 'Подключение по всему миру';
|
||
@override
|
||
String get ob1Sub => '80+ локаций, автоматический выбор самого быстрого маршрута, надёжная стабильность.';
|
||
@override
|
||
String get ob2Title => 'Разрешите настройку сети';
|
||
@override
|
||
String get ob2Sub => 'Система запросит добавление сетевого профиля для создания зашифрованного туннеля.';
|
||
@override
|
||
String get ob3Title => 'Приватность по умолчанию';
|
||
@override
|
||
String get ob3Sub => 'Сквозное шифрование. Мы не храним журналы просмотров.';
|
||
}
|