Files
pangolin/client/lib/l10n/strings_ru.dart
T
wangjia d5fc9c1c07 fix(client): 补 es/ja/ko/ru 支付文案 + 去掉 pubspec 重复依赖键
HEAD 上客户端编译不过,两处:

1. pay-v2 给 AppText 加了 28 个支付相关 getter,只补了 zh/en,
   es/ja/ko/ru 四个 Strings* 实现类没跟上 → non_abstract_class_
   inherits_abstract_member,flutter analyze/test/build 全挂。
   本次按 zh/en 原文补齐四语(购买/支付方式/USDT 收款/支付宝跳转/
   订单态等 28 条),用词沿用生命周期中文词的对应译法。

2. pubspec.yaml 里 url_launcher 声明了两次(line 23 与 line 30),
   yaml Duplicate mapping key 直接让 flutter 工具链抛异常。删掉
   后加的那条重复声明,保留带原注释的首条。

验证:flutter analyze 仅剩 3 条既有 info;flutter build ios --release
成功并已装到 iPad Pro 真机。(test/golden 34 个失败是既有 UI 漂移,
与本次改动无关——goldens 不涉及 es/ja/ko/ru。)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-22 10:38:27 +08:00

432 lines
17 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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 => 'Сквозное шифрование. Мы не храним журналы просмотров.';
// ── 支付 / 购买(pay-v2)──
@override
String get purchaseTitle => 'Купить тариф';
@override
String get paymentTitle => 'Оплата';
@override
String get buyNow => 'Купить';
@override
String get payMethodAlipay => 'Alipay';
@override
String get payMethodCrypto => 'USDT (TRC20)';
@override
String get choosePayMethod => 'Выберите способ оплаты';
@override
String get proMonthly => 'Pro · Помесячно';
@override
String get proQuarterly => 'Pro · Ежеквартально';
@override
String get proYearly => 'Pro · Ежегодно';
@override
String get perQuarter => '/квартал';
@override
String get perYear => '/год';
@override
String get payAmountLabel => 'Сумма';
@override
String get payAddressLabel => 'Адрес';
@override
String get payNetworkLabel => 'Сеть';
@override
String get payExactAmountHint => 'Отправьте точную сумму — доступ откроется автоматически';
@override
String get copied => 'Скопировано';
@override
String get openAlipay => 'Оплатить через Alipay';
@override
String get openAlipayHint => 'Вернитесь после оплаты — страница обновится сама';
@override
String get openAlipayFailed => 'Не удалось открыть Alipay. Проверьте, установлен ли он, или повторите позже';
@override
String get awaitingPayment => 'Ожидание оплаты';
@override
String get paySucceeded => 'Активировано';
@override
String get payExpiresAt => 'Действует до';
@override
String get payDone => 'Готово';
@override
String get payFailed => 'Оплата не прошла';
@override
String get payRetry => 'Повторить';
@override
String get switchPayMethod => 'Сменить способ оплаты';
@override
String get cancelOrder => 'Отменить заказ';
@override
String get qrNotSupported => 'Скопируйте данные и откройте в Alipay';
}