Files
ReelShort/lib/l10n/app_localizations_zh.dart
T
Vicky e1b98df509 feat(client): C 端 1-2 账号链路(邮箱登录/注册 + 令牌与 401 + 匿名/登录分叉)
为什么:客户端此前完全没有账号概念(mine 页的"登录"只是本地 demo 开关),
而受限动作(收藏/评论)要对到具体账号。本批把账号链路接上,为后续互动、进度同步、下载打底。

- AuthApi + AuthController + AuthSessionStore:注册/登录/登出/刷新,令牌与设备号存 shared_preferences
  (用 SharedPreferencesAsync,与 engagement 仓库同一套 API)
- ApiClient:统一带 Authorization 与 X-Device-Id;401 自动刷新一次并重试,刷新失败清登录态走 onUnauthorized
- 登录/注册页(pages/auth,沿用 binding/logic/view 与现有视觉):邮箱格式、密码 8-64 位含字母数字本地先校验,
  错误提示走 l10n;登录/注册一键切换
- 匿名/登录分叉:首页、发现、详情保持匿名可看;收藏/点赞等受限动作走 ensureSignedIn() 弹底部提示引导登录
- mine 页展示真实账号(昵称 + uid),拿不到才回落到演示文案
- 测试:新增 auth 控制器(注册落盘/401 刷新重试/刷新失败清会话/登出)与登录页(校验/切换)用例;
  widget_test 改为预置本地会话(账号不再是本地开关);修掉 playback 用例对 host 大小写的环境依赖断言

门禁:flutter analyze 0 问题;flutter test 148 全过。
2026-10-15 17:53:35 +08:00

547 lines
11 KiB
Dart

// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Chinese (`zh`).
class AppLocalizationsZh extends AppLocalizations {
AppLocalizationsZh([String locale = 'zh']) : super(locale);
@override
String get appName => 'Nontonki';
@override
String get demo => '演示';
@override
String get homeHeadline => '即刻观看';
@override
String get homeSubtitle => '免费短剧预览。';
@override
String get mediaNotice => '用户提供的本地演示视频 · 免费观看';
@override
String get featuredDemo => '精选 · 技术演示';
@override
String get demoTitle => '信号';
@override
String get demoSynopsis => '使用本地视频进行播放预览,后续有素材再增加剧集。';
@override
String get homeTab => '首页';
@override
String get openQuickMenu => '打开快捷菜单';
@override
String get quickAccess => '快捷入口';
@override
String get currentSeries => '当前短剧';
@override
String get discoverTab => '找剧';
@override
String get searchDiscover => '搜索短剧、演员、类型…';
@override
String get featured => '精选';
@override
String get suspense => '悬疑';
@override
String get romance => '都市爱情';
@override
String get actionGenre => '动作';
@override
String get filter => '筛选';
@override
String get topCharts => '排行榜';
@override
String get newReleases => '新剧';
@override
String get trendingMicroDramas => '热门短剧';
@override
String get seeAll => '查看全部';
@override
String get artworkOnly => '海报展示';
@override
String get artworkOnlyNotice => '这张海报仅用于目录展示,暂时没有可播放视频。';
@override
String get videoPending => '视频待提供';
@override
String get watchNow => '免费观看';
@override
String get noSearchResults => '没有匹配的短剧。';
@override
String get demoCatalogNotice => '三部演示短剧共用同一条本地视频。';
@override
String get myTab => '我的';
@override
String get localViewer => '本地观众';
@override
String get localDemoProfile => '本地演示档案';
@override
String get continueWatching => '继续观看';
@override
String watchedPercent(int percent) {
return '已观看 $percent%';
}
@override
String get resume => '继续播放';
@override
String get history => '历史';
@override
String get watchlist => '追剧';
@override
String get likedTab => '喜欢';
@override
String get all => '全部';
@override
String get inProgress => '未看完';
@override
String get completed => '已看完';
@override
String get noSavedShows => '这里还没有剧集。';
@override
String get preferences => '偏好设置';
@override
String get appLanguage => '应用语言';
@override
String get followingTab => '关注';
@override
String get animatedTab => '漫剧';
@override
String get recommendedTab => '推荐';
@override
String get noCategoryDramas => '这个分类暂时没有剧集。';
@override
String get trendingTab => '热门';
@override
String get liveActionTab => '真人剧';
@override
String get search => '搜索';
@override
String get free => '免费';
@override
String get mute => '静音';
@override
String get unmute => '取消静音';
@override
String get like => '喜欢';
@override
String get save => '收藏';
@override
String get comments => '评论';
@override
String get share => '分享';
@override
String get localOnlyComments => '仅在本机可见';
@override
String get noComments => '还没有评论。';
@override
String get writeComment => '写评论';
@override
String get postComment => '发布';
@override
String get shareFailed => '无法打开系统分享面板。';
@override
String get nowPlaying => '正在播放';
@override
String get watchFullscreen => '横屏全屏观看';
@override
String get exitFullscreen => '退出全屏';
@override
String get pictureInPicture => '画中画';
@override
String get pipUnavailable => '此设备无法使用画中画';
@override
String get originalTag => '原创';
@override
String get dramaTag => '短剧';
@override
String episodeLabel(int number) {
return '第 $number 集';
}
@override
String get exploreSeries => '查看剧集';
@override
String episodeCount(int count) {
return '$count 集';
}
@override
String technicalDemoCount(int count) {
return '免费试看 · $count 集';
}
@override
String get episodes => '选集';
@override
String get watchEpisodeOne => '观看第 1 集';
@override
String continueEpisode(int number) {
return '续看第 $number 集';
}
@override
String get freeTestMedia => '复用同一演示视频 · 免费';
@override
String get lockedStoreUnavailable => '已锁定 · 商店未配置';
@override
String get freeTestClip => '免费测试片';
@override
String get locked => '已锁定';
@override
String get freeSamplesNotice => '前两集免费 · 商店配置待完成';
@override
String get demoTestMedia => '免费 · 同一演示视频';
@override
String episodeProgress(int number, int total) {
return '第 $number / $total 集';
}
@override
String get testVideoNotice => '自行生成的技术测试视频';
@override
String lockedTitle(int number) {
return '第 $number 集已锁定';
}
@override
String get lockedBody => '完成商店与服务端验单配置后才能解锁。本演示目前不处理付款。';
@override
String get playbackError => '此视频暂时无法播放。';
@override
String get catalogError => '剧目列表加载失败。';
@override
String get detailError => '剧集信息加载失败。';
@override
String get noMediaNotice => '该剧集还没有可播放的片源。';
@override
String get noStories => '暂无剧目。';
@override
String get retry => '重试';
@override
String get backToSeries => '返回剧集详情';
@override
String get nextEpisode => '下一集';
@override
String get pause => '暂停';
@override
String get play => '播放';
@override
String get seekVideo => '拖动播放进度';
@override
String get seekFailed => '无法调整播放进度。';
@override
String get captions => '字幕';
@override
String get captionsOff => '关闭字幕';
@override
String get englishCaptions => '英文字幕';
@override
String get chineseCaptions => '简体中文字幕';
@override
String get language => '界面语言';
@override
String get systemLanguage => '跟随系统';
@override
String get english => 'English';
@override
String get simplifiedChinese => '简体中文';
@override
String get episodeOneTitle => '初见微光';
@override
String get episodeTwoTitle => '新的频率';
@override
String get episodeThreeTitle => '越过边界';
@override
String get episodeFourTitle => '回声之后';
@override
String get dramaSignalTitle => '信号';
@override
String get dramaSignalSynopsis => '一部竖屏连播的演示短剧,每一集都使用同一段本地视频。';
@override
String get dramaCityTitle => '都市灯火与丝绒夜';
@override
String get dramaCitySynopsis => '一部都市爱情演示短剧,用同一段本地视频体验切换和续看。';
@override
String get dramaVengeanceTitle => '复仇崛起';
@override
String get dramaVengeanceSynopsis => '一部动作演示短剧,用同一段本地视频体验切换和续看。';
@override
String get dramaEchoesTitle => '命运回声';
@override
String get genreSuspenseMystery => '悬疑 · 推理';
@override
String get genreUrbanRomance => '都市爱情';
@override
String get genreActionThriller => '动作 · 惊悚';
@override
String get genreDramaMystery => '剧情 · 悬疑';
@override
String get continueWatchingHeading => '继续观看';
@override
String get preferencesHeading => '偏好设置';
@override
String get brandMark => 'NONTONKI · 演示';
@override
String get shareFooter => 'Nontonki 演示';
@override
String get shortsTab => '短剧';
@override
String get myListTab => '片单';
@override
String get watchFull => '看全集';
@override
String get swipeForNext => '上滑看下一部';
@override
String get clearScreen => '清屏';
@override
String get exitClearScreen => '退出清屏';
@override
String get logIn => '登录';
@override
String get logInHint => '登录后保存金币和片单';
@override
String get rewards => '奖励';
@override
String get forYou => '为你推荐';
@override
String get hot => '热门';
@override
String get newest => '最新';
@override
String get favorite => '收藏';
@override
String get myAccount => '我的账户';
@override
String get coins => '金币';
@override
String get topUpWallet => '充值';
@override
String get vipMembership => '会员';
@override
String get notActive => '未开通';
@override
String get joinVip => '开通会员';
@override
String get earnRewards => '赚奖励';
@override
String get freeBonus => '领免费奖励';
@override
String get watchHistory => '观看历史';
@override
String get settings => '设置';
@override
String get signOut => '退出登录';
@override
String get mockUserName => 'Vicky sheng';
@override
String get mockUserId => 'ID: M1CZWVYE';
@override
String get mockNotice => '当前是示例数据。';
@override
String get topBadge => 'TOP 1';
@override
String get signIn => '登录';
@override
String get signUp => '注册';
@override
String get authSignInTitle => '欢迎回来';
@override
String get authSignUpTitle => '创建账号';
@override
String get authSubtitle => '用邮箱和密码登录。';
@override
String get authEmailLabel => '邮箱';
@override
String get authPasswordLabel => '密码';
@override
String get authPasswordHint => '至少 8 位,需包含字母和数字';
@override
String get authEmailRequired => '请输入邮箱';
@override
String get authEmailInvalid => '邮箱格式不正确';
@override
String get authPasswordRequired => '请输入密码';
@override
String get authPasswordLength => '密码长度需在 8-64 位之间';
@override
String get authPasswordWeak => '密码需同时包含字母和数字';
@override
String get authNetworkError => '网络异常,请稍后重试';
@override
String get authSwitchToSignUp => '还没有账号?去注册';
@override
String get authSwitchToSignIn => '已有账号?去登录';
@override
String get authGateTitle => '登录后可继续';
@override
String get authGateMessage => '收藏、评论等操作需要登录。';
@override
String get authGateAction => '去登录';
@override
String get cancel => '暂不';
}