diff --git a/app/BUILD.md b/app/BUILD.md index 5752762..842826f 100644 --- a/app/BUILD.md +++ b/app/BUILD.md @@ -69,6 +69,26 @@ fvm flutter build apk --release # build/app/outputs/flutter-apk/app-relea fvm flutter build appbundle --release # build/app/outputs/bundle/release/app-release.aab ``` +### Android Apple 로그인 — 빌드 옵션 두 개를 꼭 넣는다 + +Android 의 Apple 로그인은 iOS 와 달리 Apple 개발자 계정에 등록한 **서비스 ID** 와 **반환 주소**를 +빌드 때 받아야 동작한다(`lib/features/auth/social_providers.dart` `appleWebAuthenticationOptionsFromEnvironment`). +둘 중 하나라도 비었거나 반환 주소가 `https://호스트` 꼴이 아니면 Apple 버튼이 비활성(「준비 중」)으로 남는다. +비밀값이 아니지만 환경별 값이라 저장소에 상수로 두지 않는다. + +```bash +fvm flutter build apk --release \ + --dart-define-from-file=config/kakao.env \ + --dart-define=FANUZU_APPLE_SERVICE_ID=<서비스 ID> \ + --dart-define=FANUZU_APPLE_REDIRECT_URI=<서비스 ID 에 등록한 Return URL> +``` + +- 값은 Apple 개발자 계정 「Identifiers → Services IDs」의 식별자와 그 「Sign in with Apple → Return URLs」 항목이다. +- 반환 주소가 Apple 응답을 앱으로 돌려보내야 한다 — `sign_in_with_apple` 패키지 규약대로 + `intent://callback?<응답>#Intent;package=kr.co.fanuzu.app;scheme=signinwithapple;end` 로 넘기면 + `AndroidManifest.xml` 의 `SignInWithAppleCallback`(scheme `signinwithapple`)이 받는다. +- 확인: 빌드한 APK 의 첫 화면에서 Apple 버튼이 눌리는지(비활성이면 옵션 누락). + ## 서명 `android/key.properties` 가 없으면 **릴리스 빌드가 의도적으로 실패**한다 diff --git a/app/lib/core/data/planet_visual_state.dart b/app/lib/core/data/planet_visual_state.dart index 2631cf0..c4482a8 100644 --- a/app/lib/core/data/planet_visual_state.dart +++ b/app/lib/core/data/planet_visual_state.dart @@ -6,6 +6,8 @@ class PlanetVisualState { this.isEclipsed = false, this.eclipseFailed = false, this.eclipseSuccessId, + this.eclipseWarnAt, + this.eclipseStartAt, this.isHibernating = false, this.isHeroTime = false, this.heroEventIds, @@ -51,6 +53,10 @@ class PlanetVisualState { /// 서버 판정 성공 회차 ID — 바뀌는 순간 Orbit Burst 한 번(v1.5 §5 성공). final String? eclipseSuccessId; + + /// 경보 단계(`scheduled`) 회차의 사전 경고 창 — v1.5 §5 「그림자 접근」. 그 밖에는 null. + final DateTime? eclipseWarnAt; + final DateTime? eclipseStartAt; final bool isHibernating; final bool isHeroTime; diff --git a/app/lib/core/data/repositories.dart b/app/lib/core/data/repositories.dart index 33b3f07..3d01a9c 100644 --- a/app/lib/core/data/repositories.dart +++ b/app/lib/core/data/repositories.dart @@ -158,6 +158,7 @@ class Repositories { var isEclipsed = false; var eclipseFailed = false; String? eclipseSuccessId; + (DateTime, DateTime)? eclipseWarning; var isHeroTime = false; Set? heroEventIds; Timer? heroExpiry; @@ -178,6 +179,8 @@ class Repositories { isEclipsed: isEclipsed, eclipseFailed: eclipseFailed, eclipseSuccessId: eclipseSuccessId, + eclipseWarnAt: eclipseWarning?.$1, + eclipseStartAt: eclipseWarning?.$2, isHeroTime: isHeroTime, heroEventIds: heroEventIds, heroEndsAt: heroEndsAt, @@ -196,8 +199,12 @@ class Repositories { emit(); }, onError: out.addError); // 판정 결과까지 받는다 — 활성 회차만 보면 마감 순간 null 이 되어 성공 · 실패를 가를 수 없다. - final danger = eclipse.watch(fandomId: fandomId, includeResults: true).listen((state) { + // 경보 단계 회차도 받는다 — 사전 경고 「그림자 접근」(v1.5 §5). + final danger = eclipse + .watch(fandomId: fandomId, includeResults: true, includeScheduled: true) + .listen((state) { (isEclipsed, eclipseFailed, eclipseSuccessId) = eclipseLook(state, DateTime.now()); + eclipseWarning = eclipseWarnWindow(state); emit(); }, onError: out.addError); // 기존 선물 이벤트만 읽는다. 구매 시도/로컬 캐시는 축제 확정이 아니다. @@ -272,7 +279,9 @@ class Repositories { /// 최근 이클립스 회차 → 행성 표현 (진행 중 감소 · 실패 감소 · 성공 회차 ID). /// 판정 대기(마감 후 결과 전)는 셋 다 아니다 — 오류를 실패처럼 보이지 않는다(v1.5 §5 집계 오류). (bool, bool, String?) eclipseLook(EclipseState? state, DateTime now) { - if (state == null) return (false, false, null); + // 경보 단계는 아직 이클립스가 아니다(그림자 접근은 [eclipseWarnWindow]). 다음 회차가 열렸으니 + // 이전 회차의 실패 감소도 여기서 풀린다. + if (state == null || state.scheduled) return (false, false, null); final won = state.defended || state.result == EclipseResult.success; return ( state.result == null && !won && !state.isExpired(now), @@ -280,3 +289,9 @@ class Repositories { won ? state.eclipseId : null, ); } + +/// 경보 단계 회차의 (warnAt, startAt). 경보가 아니거나 시각이 없으면 null. +(DateTime, DateTime)? eclipseWarnWindow(EclipseState? state) => switch (state) { + EclipseState(scheduled: true, warnAt: final warn?, startAt: final start?) => (warn, start), + _ => null, +}; diff --git a/app/lib/core/ui/live_planet.dart b/app/lib/core/ui/live_planet.dart index f69ccd3..ce5024e 100644 --- a/app/lib/core/ui/live_planet.dart +++ b/app/lib/core/ui/live_planet.dart @@ -47,6 +47,8 @@ class LivePlanet25D extends StatelessWidget { isEclipsed: state?.isEclipsed ?? false, eclipseFailed: state?.eclipseFailed ?? false, eclipseSuccessId: state?.eclipseSuccessId, + eclipseWarnAt: state?.eclipseWarnAt, + eclipseStartAt: state?.eclipseStartAt, isHibernating: state?.isHibernating ?? false, isHeroTime: state?.isHeroTime ?? false, heroEventIds: state?.heroEventIds, diff --git a/app/lib/core/ui/planet_25d.dart b/app/lib/core/ui/planet_25d.dart index 1724595..e38bffe 100644 --- a/app/lib/core/ui/planet_25d.dart +++ b/app/lib/core/ui/planet_25d.dart @@ -137,6 +137,8 @@ class Planet25D extends StatefulWidget { this.isEclipsed = false, this.eclipseFailed = false, this.eclipseSuccessId, + this.eclipseWarnAt, + this.eclipseStartAt, this.isHibernating = false, this.isHeroTime = false, this.heroEventIds, @@ -170,6 +172,11 @@ class Planet25D extends StatefulWidget { /// 이클립스 성공 회차. 바뀌면 광량 복원 뒤 짧은 Orbit Burst(v1.5 §5 「그림자 이탈 → 복원 → Orbit Burst」). final String? eclipseSuccessId; + + /// 사전 경고 창(서버 회차 `warnAt` → `startAt`, 원장 C-22 발생 3분 전). 이 사이에만 + /// v1.5 §5 「행성 뒤 어두운 그림자 접근, 별빛·Glow 점진 감소」를 그린다([eclipseApproach]). + final DateTime? eclipseWarnAt; + final DateTime? eclipseStartAt; final bool isHibernating; final bool isHeroTime; final Set? heroEventIds; @@ -204,12 +211,12 @@ class _Planet25DState extends State double get _light => widget.isHibernating ? 0.35 : widget.isEclipsed - ? 0.5 + ? eclipseLight : _celebrating ? 1.3 : widget.eclipseFailed // 실패의 감소 폭은 원문에 수치가 없어 이클립스 진행 중과 같은 값을 쓴다(해석 확인 항목). - ? 0.5 + ? eclipseLight : 1; late final AnimationController _c = AnimationController( vsync: this, @@ -376,6 +383,13 @@ class _Planet25DState extends State builder: (context, _) { final t = _motionEnabled ? _c.value : 0.0; // 0~1 final wave = math.sin(t * 2 * math.pi); // -1~1 + // 사전 경고 — 매 프레임 서버 시각 기준으로 다시 잰다. 동작 줄이기면 프레임이 돌지 않아 + // 그린 시점의 위치에 멈춰 있다(움직임 없이 상태만 전달). + final warn = widget.isEclipsed + ? 0.0 + : eclipseApproach(widget.eclipseWarnAt, widget.eclipseStartAt, DateTime.now()) ?? 0.0; + // 별빛(입자) · Glow 를 이클립스 진행 중 광량(0.5)까지 점진적으로 낮춘다. + final dim = 1 - (1 - eclipseLight) * warn; return Stack( clipBehavior: Clip.none, alignment: Alignment.center, @@ -400,9 +414,10 @@ class _Planet25DState extends State ? 0.55 : 0.42) + wave * (stage == 6 ? 0.02 : 0.05)) * - glowStrength, + glowStrength * + dim, ), - glow.withValues(alpha: 0.10 * glowStrength), + glow.withValues(alpha: 0.10 * glowStrength * dim), glow.withValues(alpha: 0), ], stops: const [0.45, 0.72, 1], @@ -423,6 +438,31 @@ class _Planet25DState extends State ), ), ), + // 이클립스 사전 경고 — 행성 뒤로 어두운 그림자가 우상단에서 다가와 Glow 를 가린다. + if (warn > 0) + Positioned.fill( + child: IgnorePointer( + child: Transform.translate( + key: const ValueKey('eclipse-shadow'), + offset: Offset(s, -s * 0.5) * eclipseShadowTravel * (1 - warn), + child: Transform.scale( + scale: 1.15, + child: Opacity( + opacity: 0.85 * warn, + child: const DecoratedBox( + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [Color(0xFF05040D), Color(0xCC05040D), Color(0x0005040D)], + stops: [0, 0.6, 1], + ), + ), + ), + ), + ), + ), + ), + ), // 6. 링 — 뒤쪽 절반. 본체 뒤에 깔린다. if (ring) Positioned.fill( @@ -522,6 +562,7 @@ class _Planet25DState extends State count: (particleCount * light * + dim * (_quality == 2 ? 0.3 : _quality == 1 @@ -883,6 +924,21 @@ class _SustainedAura extends CustomPainter { old.color != color || old.lowEffects != lowEffects; } +/// 이클립스 진행 중 광량. 사전 경고의 Glow 감소 · 실패 감소가 같은 값을 쓴다(해석 확인 Q-A28). +const eclipseLight = 0.5; + +/// 사전 경고 그림자의 출발 거리(행성 한 변 대비). 원문에 수치가 없는 임시값(해석 확인 항목). +const eclipseShadowTravel = 0.9; + +/// 사전 경고 진행 0~1 — [warnAt] 에 0, 발생 시각 [startAt] 에 1. 창이 없거나 경고 전이면 null. +/// 발생 시각이 지나도 서버가 회차를 열기 전(스케줄러 지연 수 초)에는 1 로 둔다 — 그림자가 빠졌다 다시 어두워지지 않게. +double? eclipseApproach(DateTime? warnAt, DateTime? startAt, DateTime now) { + if (warnAt == null || startAt == null || !startAt.isAfter(warnAt)) return null; + if (now.isBefore(warnAt)) return null; + return (now.difference(warnAt).inMilliseconds / startAt.difference(warnAt).inMilliseconds) + .clamp(0.0, 1.0); +} + /// 이클립스 성공 Orbit Burst 길이. 원문은 「짧은」만 적어 Level Up 경량 연출(850ms)과 같게 둔다(해석 확인 항목). const orbitBurstDuration = Duration(milliseconds: 850); diff --git a/app/lib/features/eclipse/eclipse_data.dart b/app/lib/features/eclipse/eclipse_data.dart index 07f37ce..65b7986 100644 --- a/app/lib/features/eclipse/eclipse_data.dart +++ b/app/lib/features/eclipse/eclipse_data.dart @@ -30,6 +30,7 @@ class EclipseState { required this.defended, this.qualifyShakes = 60, this.startAt, + this.warnAt, this.scheduled = false, this.endsAt, this.result, @@ -73,6 +74,9 @@ class EclipseState { /// 없으면 이미 시작한 회차로 본다. final DateTime? startAt; + /// 사전 경고 시각(`warnAt` = 발생 − 사전 알림, 원장 C-22 3분). 행성 그림자 접근의 출발점. + final DateTime? warnAt; + /// 서버 회차가 아직 `scheduled`(경보 단계)인가. 방어 호출은 `active` 에서만 받는다. final bool scheduled; diff --git a/app/lib/features/eclipse/eclipse_defend_screen.dart b/app/lib/features/eclipse/eclipse_defend_screen.dart index fe08114..cbf556d 100644 --- a/app/lib/features/eclipse/eclipse_defend_screen.dart +++ b/app/lib/features/eclipse/eclipse_defend_screen.dart @@ -452,6 +452,7 @@ class _EclipseDefendScreenState extends State remaining: remaining, pending: _pending, pulse: _pulse, + shield: state.progress, image: _imageOf(widget.nebula), ), ), @@ -713,8 +714,12 @@ class _DefendPlanet extends StatelessWidget { required this.pending, required this.image, this.pulse = 0, + this.shield = 0, }); + /// 고유 유효 참여자 / 목표(서버 값 [EclipseState.progress]) — Shield 조각이 이어지는 정도. + final double shield; + /// 흔들기 일련번호. 0 이면 아직 파동이 없다. final int pulse; @@ -767,6 +772,23 @@ class _DefendPlanet extends StatelessWidget { CustomPaint(painter: _RemainingRing(remaining)), ), _at(67.5, 300, 240, 240, Image(image: image)), + // Shield — 끊어진 Ring 이 참여자 비율만큼 이어지고 목표 달성 시 완전한 원(v1.5 §5.1). + // 값이 바뀌면 Shield Pulse 와 같은 길이로 이어 붙인다. 동작 줄이기면 바로 바뀐다. + _at( + 48, + 280, + 280, + 280, + TweenAnimationBuilder( + key: const ValueKey('shield-ring'), + tween: Tween(end: shield.clamp(0.0, 1.0)), + duration: MediaQuery.disableAnimationsOf(context) + ? Duration.zero + : shieldPulseDuration, + builder: (context, p, _) => + CustomPaint(painter: ShieldRingPainter(p)), + ), + ), // Shield Pulse — 흔들기마다 행성 가장자리에서 원형 파동이 한 번 퍼진다. 동작 줄이기면 그리지 않는다. if (pulse > 0 && !MediaQuery.disableAnimationsOf(context)) _at( @@ -978,3 +1000,53 @@ class ShieldPulsePainter extends CustomPainter { @override bool shouldRepaint(ShieldPulsePainter old) => old.t != t; } + +/// Shield Ring 조각 수. 원문(v1.5 §5.1)에 수치가 없는 임시값(해석 확인 항목). +const shieldSegments = 12; + +/// 진행 [p] 0~1 → Ring 조각들의 (시작각, 길이). 처음엔 조각 사이 틈이 절반이고, 참여자가 늘수록 +/// 틈이 좁아져 이어지며, 목표 달성(1)이면 틈 없는 원 하나다. +List<(double, double)> shieldArcs(double p) { + if (p >= 1) return const [(-math.pi / 2, 2 * math.pi)]; + const slot = 2 * math.pi / shieldSegments; + final sweep = slot * (0.5 + 0.5 * p.clamp(0.0, 1.0)); + return [ + for (var i = 0; i < shieldSegments; i++) + (-math.pi / 2 + i * slot + (slot - sweep) / 2, sweep), + ]; +} + +/// 행성(240)과 잔여 시간 원호(280) 사이의 Shield Ring. 완성되면 바깥 번짐을 한 겹 더한다. +class ShieldRingPainter extends CustomPainter { + const ShieldRingPainter(this.progress); + + final double progress; + + @override + void paint(Canvas canvas, Size size) { + final r = size.shortestSide / 2 * (260 / 280); + final rect = Rect.fromCircle(center: size.center(Offset.zero), radius: r); + final full = progress >= 1; + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = full ? 5 : 3 + ..strokeCap = StrokeCap.round + ..color = AppColors.neonEmerald.withValues(alpha: 0.35 + 0.55 * progress.clamp(0.0, 1.0)); + if (full) { + canvas.drawCircle( + rect.center, + r, + Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 12 + ..color = AppColors.neonEmerald.withValues(alpha: 0.25), + ); + } + for (final (start, sweep) in shieldArcs(progress)) { + canvas.drawArc(rect, start, sweep, false, paint); + } + } + + @override + bool shouldRepaint(ShieldRingPainter old) => old.progress != progress; +} diff --git a/app/lib/features/eclipse/eclipse_repository_firestore.dart b/app/lib/features/eclipse/eclipse_repository_firestore.dart index 9eed283..f79dec2 100644 --- a/app/lib/features/eclipse/eclipse_repository_firestore.dart +++ b/app/lib/features/eclipse/eclipse_repository_firestore.dart @@ -199,6 +199,7 @@ class FirestoreEclipseRepository implements EclipseRepository { _ => null, }, startAt: startAt is Timestamp ? startAt.toDate() : null, + warnAt: data['warnAt'] is Timestamp ? (data['warnAt'] as Timestamp).toDate() : null, scheduled: data['status'] == 'scheduled', endsAt: endsAt is Timestamp ? endsAt.toDate() : null, ); diff --git a/app/lib/features/home/widgets/briefing_list.dart b/app/lib/features/home/widgets/briefing_list.dart index dfd9c49..87db830 100644 --- a/app/lib/features/home/widgets/briefing_list.dart +++ b/app/lib/features/home/widgets/briefing_list.dart @@ -12,9 +12,10 @@ import '../../../core/i18n/app_locale.dart'; /// *섹션 숨김, 모두 0 건이면 전체 Briefing 블록을 숨김*. 구획이 없으면 「섹션만 /// 숨김」이라는 판정 자체가 성립하지 않는다. 블록 전체 숨김은 홈 화면이 맡는다. /// -/// **한 줄은 Figma 대로 번호 + 제목만 띄운다.** 정책 원장 B-75(확정) 「각 항목에 출처명 · -/// 게시/발행시각 · 원본 URL · 원문보기 · AI 요약 표시」는 Figma 에 배치가 없어, 줄을 누르면 -/// 여는 상세 시트([showBriefingDetail])에 모두 싣는다. 시트의 「원문 보기」가 원문으로 나간다. +/// **한 줄은 Figma 의 번호 + 제목 아래에 출처명 · 게시시각을 12/500 으로 덧붙인다** — UX·FX v1.5 +/// 「AI Briefing 출처 표시」(B-3 8-4). 정책 원장 B-75(확정)의 나머지(공식/팬덤 구분 · 원본 URL · +/// 원문보기 · AI 요약 표시)는 Figma 에 배치가 없어, 줄을 누르면 여는 상세 시트([showBriefingDetail])에 +/// 싣는다. 시트의 「원문 보기」가 원문으로 나간다. class BriefingList extends StatelessWidget { const BriefingList({super.key, required this.items, this.onOpen}); @@ -132,17 +133,35 @@ class _Row extends StatelessWidget { ), const SizedBox(width: 28), Expanded( - child: Text( - item.headline, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontFamily: AppFonts.body, - fontSize: 16, - fontWeight: FontWeight.w500, - height: 1.5, - color: AppColors.onCosmicVariant, - ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + item.headline, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontFamily: AppFonts.body, + fontSize: 16, + fontWeight: FontWeight.w500, + height: 1.5, + color: AppColors.onCosmicVariant, + ), + ), + const SizedBox(height: AppSpace.s1), + Text( + '${item.sourceName} · ${briefingStamp(item.sourceAt)}', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontFamily: AppFonts.body, + fontSize: 12, + fontWeight: FontWeight.w500, + height: 1.4, + color: AppColors.onCosmicMuted, + ), + ), + ], ), ), ], @@ -151,6 +170,13 @@ class _Row extends StatelessWidget { } } +/// 게시시각 표기 `yyyy.MM.dd HH:mm`(기기 시간대) — 줄과 상세 시트가 같이 쓴다. +String briefingStamp(DateTime sourceAt) { + String two(int v) => v.toString().padLeft(2, '0'); + final at = sourceAt.toLocal(); + return '${at.year}.${two(at.month)}.${two(at.day)} ${two(at.hour)}:${two(at.minute)}'; +} + /// 브리핑 항목 상세 — B-75 5 요소(출처명 · 게시시각 · 원본 URL · 원문보기 · AI 요약 표시)와 /// 공식/팬덤 출처 구분을 한 시트에 싣는다. Future showBriefingDetail( @@ -171,10 +197,7 @@ Future showBriefingDetail( 'fandom' => l10n.briefingSourceFandom, _ => null, }; - String two(int v) => v.toString().padLeft(2, '0'); - final at = item.sourceAt.toLocal(); - final stamp = - '${at.year}.${two(at.month)}.${two(at.day)} ${two(at.hour)}:${two(at.minute)}'; + final stamp = briefingStamp(item.sourceAt); return showModalBottomSheet( context: context, isScrollControlled: true, diff --git a/app/lib/features/planet/planet_data.dart b/app/lib/features/planet/planet_data.dart index 9bb804c..2cef2e5 100644 --- a/app/lib/features/planet/planet_data.dart +++ b/app/lib/features/planet/planet_data.dart @@ -377,7 +377,14 @@ enum PlanetHistoryKind { /// PASSPORT Stamp — Eclipse 성공 참여(FX §5.2) · 진화 기념 Emblem(상세정의 22장) · 최초 100명 Badge(별첨 B). eclipseSuccess, emblemEvolution, - founderBadge, + founderBadge; + + /// UX·FX v1.5 §7.2 「역사적 사건」 — Planet Evolution · Eclipse 성공 참여 · 주요 Badge 획득은 + /// 일반 활동 로그와 구분되는 Stamp 로 보인다. Campaign 성공은 역사 응답에 종류가 없어 아직 빠진다. + bool get isHistoric => switch (this) { + evolution || eclipseSuccess || emblemEvolution || founderBadge => true, + _ => false, + }; } class PlanetHistoryEntry { diff --git a/app/lib/features/planet/planet_history_screen.dart b/app/lib/features/planet/planet_history_screen.dart index bcf57b0..ac613e9 100644 --- a/app/lib/features/planet/planet_history_screen.dart +++ b/app/lib/features/planet/planet_history_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; + import 'planet_data.dart'; import '../../core/i18n/app_locale.dart'; import '../../core/ui/bottom_inset.dart'; @@ -86,47 +87,52 @@ class _PlanetHistoryScreenState extends State { ), const SizedBox(height: 16), for (final item in _items) - ListTile( - contentPadding: EdgeInsets.zero, - leading: Icon(switch (item.kind) { - PlanetHistoryKind.evolution => Icons.auto_awesome, - PlanetHistoryKind.hibernation => Icons.bedtime_outlined, - PlanetHistoryKind.wakeUp => Icons.wb_sunny_outlined, - PlanetHistoryKind.zap => Icons.bolt, - PlanetHistoryKind.questReward => Icons.task_alt, - PlanetHistoryKind.companyAdBonus => Icons.play_circle_outline, - PlanetHistoryKind.funding => Icons.favorite_border, - PlanetHistoryKind.eclipseSuccess => Icons.shield_outlined, - PlanetHistoryKind.emblemEvolution => Icons.military_tech_outlined, - PlanetHistoryKind.founderBadge => Icons.workspace_premium_outlined, - }), - title: Text(switch (item.kind) { - PlanetHistoryKind.evolution => context.l10n.historyEvolution( - '${item.fromStage}', - '${item.toStage}', + _Stamp( + historic: item.kind.isHistoric, + child: ListTile( + contentPadding: EdgeInsets.zero, + leading: Icon(switch (item.kind) { + PlanetHistoryKind.evolution => Icons.auto_awesome, + PlanetHistoryKind.hibernation => Icons.bedtime_outlined, + PlanetHistoryKind.wakeUp => Icons.wb_sunny_outlined, + PlanetHistoryKind.zap => Icons.bolt, + PlanetHistoryKind.questReward => Icons.task_alt, + PlanetHistoryKind.companyAdBonus => Icons.play_circle_outline, + PlanetHistoryKind.funding => Icons.favorite_border, + PlanetHistoryKind.eclipseSuccess => Icons.shield_outlined, + PlanetHistoryKind.emblemEvolution => + Icons.military_tech_outlined, + PlanetHistoryKind.founderBadge => + Icons.workspace_premium_outlined, + }), + title: Text(switch (item.kind) { + PlanetHistoryKind.evolution => context.l10n.historyEvolution( + '${item.fromStage}', + '${item.toStage}', + ), + PlanetHistoryKind.hibernation => + context.l10n.historyHibernation, + PlanetHistoryKind.wakeUp => context.l10n.historyWakeUp, + PlanetHistoryKind.zap => context.l10n.historyZap, + PlanetHistoryKind.questReward => context.l10n.historyQuest, + PlanetHistoryKind.companyAdBonus => context.l10n.historyAdBonus, + PlanetHistoryKind.funding => context.l10n.historyFunding, + PlanetHistoryKind.eclipseSuccess => + context.l10n.historyEclipseSuccess, + PlanetHistoryKind.emblemEvolution => + '${context.l10n.historyEmblemEvolution} · STAGE ${item.toStage ?? ''}', + PlanetHistoryKind.founderBadge => + '${context.l10n.historyFounderBadge} · #${(item.memberNo ?? 0).toString().padLeft(3, '0')}', + }), + subtitle: Text( + [ + MaterialLocalizations.of(context) + .formatMediumDate(item.occurredAt.toLocal()), + if (item.amount != null) + context.l10n.historyGrowthPop('${item.amount}'), + if (item.participationConfirmed) context.l10n.historyJoined, + ].join('\n'), ), - PlanetHistoryKind.hibernation => context.l10n.historyHibernation, - PlanetHistoryKind.wakeUp => context.l10n.historyWakeUp, - PlanetHistoryKind.zap => context.l10n.historyZap, - PlanetHistoryKind.questReward => context.l10n.historyQuest, - PlanetHistoryKind.companyAdBonus => context.l10n.historyAdBonus, - PlanetHistoryKind.funding => context.l10n.historyFunding, - PlanetHistoryKind.eclipseSuccess => - context.l10n.historyEclipseSuccess, - PlanetHistoryKind.emblemEvolution => - '${context.l10n.historyEmblemEvolution} · STAGE ${item.toStage ?? ''}', - PlanetHistoryKind.founderBadge => - '${context.l10n.historyFounderBadge} · #${(item.memberNo ?? 0).toString().padLeft(3, '0')}', - }), - subtitle: Text( - [ - MaterialLocalizations.of( - context, - ).formatMediumDate(item.occurredAt.toLocal()), - if (item.amount != null) - context.l10n.historyGrowthPop('${item.amount}'), - if (item.participationConfirmed) context.l10n.historyJoined, - ].join('\n'), ), ), if (_loading) const Center(child: CircularProgressIndicator()), @@ -145,3 +151,36 @@ class _PlanetHistoryScreenState extends State { ), ); } + +/// 「역사적 사건」(UX·FX v1.5 §7.2)은 테두리 Stamp 와 표지로 일반 활동 줄과 가른다. +/// 앱 Figma 에 PASSPORT 기록 화면이 없어 화면 테마 색만 쓴다. +class _Stamp extends StatelessWidget { + const _Stamp({required this.historic, required this.child}); + final bool historic; + final Widget child; + + @override + Widget build(BuildContext context) { + if (!historic) return child; + final scheme = Theme.of(context).colorScheme; + return Container( + margin: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.fromLTRB(12, 8, 12, 0), + decoration: BoxDecoration( + border: Border.all(color: scheme.primary), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + context.l10n.historyHistoric, + style: Theme.of(context).textTheme.labelSmall + ?.copyWith(color: scheme.primary), + ), + child, + ], + ), + ); + } +} diff --git a/app/lib/l10n/app_en.arb b/app/lib/l10n/app_en.arb index 1d0d3e0..0a3de07 100644 --- a/app/lib/l10n/app_en.arb +++ b/app/lib/l10n/app_en.arb @@ -544,6 +544,7 @@ "historyEclipseSuccess": "Joined a successful eclipse defense", "historyEmblemEvolution": "Evolution emblem", "historyFounderBadge": "First 100 commemorative badge", + "historyHistoric": "Historic moment", "historyGrowthPop": "{amount} POP added to growth", "historyJoined": "You were part of this evolution", "historyLoadFailed": "Couldn't load history.", diff --git a/app/lib/l10n/app_es.arb b/app/lib/l10n/app_es.arb index d188bed..2573fe3 100644 --- a/app/lib/l10n/app_es.arb +++ b/app/lib/l10n/app_es.arb @@ -544,6 +544,7 @@ "historyEclipseSuccess": "Participaste en una defensa exitosa del eclipse", "historyEmblemEvolution": "Emblema de evolución", "historyFounderBadge": "Insignia conmemorativa de los primeros 100", + "historyHistoric": "Momento histórico", "historyGrowthPop": "{amount} POP sumados al crecimiento", "historyJoined": "Participaste en esta evolución", "historyLoadFailed": "No se pudo cargar el historial.", diff --git a/app/lib/l10n/app_ja.arb b/app/lib/l10n/app_ja.arb index 188ca09..5bca77b 100644 --- a/app/lib/l10n/app_ja.arb +++ b/app/lib/l10n/app_ja.arb @@ -544,6 +544,7 @@ "historyEclipseSuccess": "イクリプス防御成功に参加", "historyEmblemEvolution": "進化記念エンブレム", "historyFounderBadge": "最初の100人記念バッジ", + "historyHistoric": "歴史的な出来事", "historyGrowthPop": "成長に{amount} POP反映", "historyJoined": "この進化に参加しました", "historyLoadFailed": "記録を読み込めませんでした。", diff --git a/app/lib/l10n/app_ko.arb b/app/lib/l10n/app_ko.arb index 69a1396..023980b 100644 --- a/app/lib/l10n/app_ko.arb +++ b/app/lib/l10n/app_ko.arb @@ -1065,6 +1065,7 @@ "historyEclipseSuccess": "이클립스 방어 성공 참여", "historyEmblemEvolution": "진화 기념 Emblem", "historyFounderBadge": "최초 100명 기념 Badge", + "historyHistoric": "역사적 사건", "historyGrowthPop": "성장에 {amount} POP 반영", "@historyGrowthPop": { "placeholders": { diff --git a/app/lib/l10n/app_localizations.dart b/app/lib/l10n/app_localizations.dart index b53b6d0..c929194 100644 --- a/app/lib/l10n/app_localizations.dart +++ b/app/lib/l10n/app_localizations.dart @@ -65,8 +65,7 @@ import 'app_localizations_zh.dart'; /// be consistent with the languages listed in the AppLocalizations.supportedLocales /// property. abstract class AppLocalizations { - AppLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; @@ -74,8 +73,7 @@ abstract class AppLocalizations { return Localizations.of(context, AppLocalizations); } - static const LocalizationsDelegate delegate = - _AppLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -87,13 +85,12 @@ abstract class AppLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; + static const List> localizationsDelegates = >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ @@ -101,7 +98,7 @@ abstract class AppLocalizations { Locale('es'), Locale('ja'), Locale('ko'), - Locale('zh'), + Locale('zh') ]; /// No description provided for @commonConfirm. @@ -3368,6 +3365,12 @@ abstract class AppLocalizations { /// **'최초 100명 기념 Badge'** String get historyFounderBadge; + /// No description provided for @historyHistoric. + /// + /// In ko, this message translates to: + /// **'역사적 사건'** + String get historyHistoric; + /// No description provided for @historyGrowthPop. /// /// In ko, this message translates to: @@ -4350,12 +4353,7 @@ abstract class AppLocalizations { /// /// In ko, this message translates to: /// **'{startMonth}월 {startDay}일 ~ {endMonth}월 {endDay}일'** - String campaignPeriodRange( - String startMonth, - String startDay, - String endMonth, - String endDay, - ); + String campaignPeriodRange(String startMonth, String startDay, String endMonth, String endDay); /// No description provided for @campaignPeriodSelect. /// @@ -4817,14 +4815,7 @@ abstract class AppLocalizations { /// /// In ko, this message translates to: /// **'{title}\n보상 {reward} POP × {count}명 = {pool} POP\n수수료 {fee} POP (공개 시 소멸)\n총 {total} POP 이 차감됩니다.'** - String questCreateCost( - String title, - String reward, - String count, - String pool, - String fee, - String total, - ); + String questCreateCost(String title, String reward, String count, String pool, String fee, String total); /// No description provided for @questNoReward. /// @@ -5541,8 +5532,7 @@ abstract class AppLocalizations { String liveHeroTimeBy(String fandom, String name); } -class _AppLocalizationsDelegate - extends LocalizationsDelegate { +class _AppLocalizationsDelegate extends LocalizationsDelegate { const _AppLocalizationsDelegate(); @override @@ -5551,32 +5541,28 @@ class _AppLocalizationsDelegate } @override - bool isSupported(Locale locale) => - ['en', 'es', 'ja', 'ko', 'zh'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'es', 'ja', 'ko', 'zh'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; } AppLocalizations lookupAppLocalizations(Locale locale) { + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return AppLocalizationsEn(); - case 'es': - return AppLocalizationsEs(); - case 'ja': - return AppLocalizationsJa(); - case 'ko': - return AppLocalizationsKo(); - case 'zh': - return AppLocalizationsZh(); + case 'en': return AppLocalizationsEn(); + case 'es': return AppLocalizationsEs(); + case 'ja': return AppLocalizationsJa(); + case 'ko': return AppLocalizationsKo(); + case 'zh': return AppLocalizationsZh(); } throw FlutterError( 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' 'an issue with the localizations generation tool. Please file an issue ' 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.', + 'that was used.' ); } diff --git a/app/lib/l10n/app_localizations_en.dart b/app/lib/l10n/app_localizations_en.dart index 59e8f43..8a64563 100644 --- a/app/lib/l10n/app_localizations_en.dart +++ b/app/lib/l10n/app_localizations_en.dart @@ -63,25 +63,31 @@ class AppLocalizationsEn extends AppLocalizations { @override String authProviderLogin(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': 'Log in with Apple', - 'google': 'Log in with Google', - 'kakao': 'Log in with Kakao', - 'line': 'Log in with LINE', - 'other': 'Log in with email', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': 'Log in with Apple', + 'google': 'Log in with Google', + 'kakao': 'Log in with Kakao', + 'line': 'Log in with LINE', + 'other': 'Log in with email', + }, + ); return '$_temp0'; } @override String authProviderSignup(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': 'Sign up with Apple', - 'google': 'Sign up with Google', - 'kakao': 'Sign up with Kakao', - 'line': 'Sign up with LINE', - 'other': 'Sign up with email', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': 'Sign up with Apple', + 'google': 'Sign up with Google', + 'kakao': 'Sign up with Kakao', + 'line': 'Sign up with LINE', + 'other': 'Sign up with email', + }, + ); return '$_temp0'; } @@ -101,8 +107,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get authResetNeedEmail => - 'Enter the email address for the reset link first.'; + String get authResetNeedEmail => 'Enter the email address for the reset link first.'; @override String get authResetSent => 'We sent reset instructions to that address.'; @@ -123,15 +128,13 @@ class AppLocalizationsEn extends AppLocalizations { String get termsAge => 'I am 14 or older. (required)'; @override - String get termsMarketing => - 'Receive marketing and event notifications (optional)'; + String get termsMarketing => 'Receive marketing and event notifications (optional)'; @override String get signupDoneTitle => 'You\'re all signed up'; @override - String get signupDoneBody => - 'You can start your fandom activities.\nGrow your fandom planet through all kinds of activities.'; + String get signupDoneBody => 'You can start your fandom activities.\nGrow your fandom planet through all kinds of activities.'; @override String get homeItemsTooltip => 'Items'; @@ -255,8 +258,7 @@ class AppLocalizationsEn extends AppLocalizations { String get settingsWithdrawConfirm => 'Do you want to delete your account?'; @override - String get settingsWithdrawBody => - 'Your POP will be lost and this cannot be undone.'; + String get settingsWithdrawBody => 'Your POP will be lost and this cannot be undone.'; @override String get settingsWithdrawLater => 'Account deletion is coming soon.'; @@ -265,15 +267,13 @@ class AppLocalizationsEn extends AppLocalizations { String get settingsUnlinkConfirm => 'Unlink this account?'; @override - String get settingsUnlinkBody => - 'Only this social login method is removed. Your account data is not deleted.'; + String get settingsUnlinkBody => 'Only this social login method is removed. Your account data is not deleted.'; @override String get settingsUnlink => 'Unlink'; @override - String get settingsSameEmailOnly => - 'Only social accounts with the same\nemail as your account can be linked.'; + String get settingsSameEmailOnly => 'Only social accounts with the same\nemail as your account can be linked.'; @override String settingsLinkNotReady(String name) { @@ -290,12 +290,10 @@ class AppLocalizationsEn extends AppLocalizations { String get settingsEmailProvider => 'Email'; @override - String get pushDeviceOff => - 'Push notifications are turned off on this device.'; + String get pushDeviceOff => 'Push notifications are turned off on this device.'; @override - String get pushDeviceOffHint => - 'Allow notifications in system settings to receive them.'; + String get pushDeviceOffHint => 'Allow notifications in system settings to receive them.'; @override String get pushRequesting => 'Requesting…'; @@ -307,8 +305,7 @@ class AppLocalizationsEn extends AppLocalizations { String get pushOpeningDeviceSettings => 'Opening device settings.'; @override - String get pushEnableInDevice => - 'Turn on FANUZU notifications in device settings to receive them.'; + String get pushEnableInDevice => 'Turn on FANUZU notifications in device settings to receive them.'; @override String get pushDeviceSection => 'Device notifications'; @@ -346,8 +343,7 @@ class AppLocalizationsEn extends AppLocalizations { String get linkLinked => 'Linked'; @override - String get linkSameEmailOnly => - 'Only social accounts with the same email as your account can be linked.'; + String get linkSameEmailOnly => 'Only social accounts with the same email as your account can be linked.'; @override String get linkUnlink => 'Unlink'; @@ -388,12 +384,10 @@ class AppLocalizationsEn extends AppLocalizations { String get translationInvalid => 'Invalid'; @override - String get translationSelfMarkBlocked => - 'You can\'t mark your own translation.'; + String get translationSelfMarkBlocked => 'You can\'t mark your own translation.'; @override - String get translationSubmitted => - 'Translation posted. If it passes review, POP is paid after 24 hours.'; + String get translationSubmitted => 'Translation posted. If it passes review, POP is paid after 24 hours.'; @override String get translationMarked => 'Marked.'; @@ -402,16 +396,13 @@ class AppLocalizationsEn extends AppLocalizations { String get translationAlreadyMarked => 'You already marked this translation.'; @override - String get translationDuplicate => - 'You already posted a translation in this language.'; + String get translationDuplicate => 'You already posted a translation in this language.'; @override - String get translationFailed => - 'Something went wrong. Please try again shortly.'; + String get translationFailed => 'Something went wrong. Please try again shortly.'; @override - String get translationNotEligible => - 'Only members of this fandom whose account is at least 24 hours old can mark.'; + String get translationNotEligible => 'Only members of this fandom whose account is at least 24 hours old can mark.'; @override String get translationDailyCap => 'You can\'t post more translations today.'; @@ -426,15 +417,13 @@ class AppLocalizationsEn extends AppLocalizations { String get commonFan => 'Fan'; @override - String get adLoadFailed => - 'Couldn\'t load the ad. You\'ll get the basic reward only.'; + String get adLoadFailed => 'Couldn\'t load the ad. You\'ll get the basic reward only.'; @override String get storeNotReady => 'Store items coming soon'; @override - String get storePending => - 'Waiting for payment approval. It will apply automatically once approved.'; + String get storePending => 'Waiting for payment approval. It will apply automatically once approved.'; @override String get storeFailed => 'Couldn\'t complete the payment.'; @@ -466,8 +455,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get stageNames => - 'Nebula,Start,Growth,Together,Journey,Light,Eternity'; + String get stageNames => 'Nebula,Start,Growth,Together,Journey,Light,Eternity'; @override String get planetStageUnknown => 'Planet · No stage info'; @@ -512,8 +500,7 @@ class AppLocalizationsEn extends AppLocalizations { String get playHeadline => 'Let\'s go meet your fandom!'; @override - String get playBody => - 'Create a planet, connect with fandoms, and enjoy fan activities...'; + String get playBody => 'Create a planet, connect with fandoms, and enjoy fan activities...'; @override String get timeJustNow => 'Just now'; @@ -538,25 +525,31 @@ class AppLocalizationsEn extends AppLocalizations { @override String authProviderStart(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': 'Continue with email', - 'kakao': 'Continue with Kakao', - 'line': 'Continue with LINE', - 'apple': 'Continue with Apple', - 'other': 'Continue with Google', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': 'Continue with email', + 'kakao': 'Continue with Kakao', + 'line': 'Continue with LINE', + 'apple': 'Continue with Apple', + 'other': 'Continue with Google', + }, + ); return '$_temp0'; } @override String authProviderName(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': 'Email', - 'kakao': 'Kakao', - 'line': 'LINE', - 'apple': 'Apple', - 'other': 'Google', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': 'Email', + 'kakao': 'Kakao', + 'line': 'LINE', + 'apple': 'Apple', + 'other': 'Google', + }, + ); return '$_temp0'; } @@ -567,8 +560,7 @@ class AppLocalizationsEn extends AppLocalizations { String get authLoginRequired => 'Please sign in.'; @override - String get authDifferentEmail => - 'This account doesn\'t match your sign-up email.'; + String get authDifferentEmail => 'This account doesn\'t match your sign-up email.'; @override String get authLinkFailed => 'Couldn\'t link the account.'; @@ -586,15 +578,13 @@ class AppLocalizationsEn extends AppLocalizations { String get authSocialFailed => 'Social sign-in failed.'; @override - String get authAppleUnavailable => - 'Sign in with Apple isn\'t available on this device.'; + String get authAppleUnavailable => 'Sign in with Apple isn\'t available on this device.'; @override String get authEmailInUse => 'This email is already registered.'; @override - String get authWeakPassword => - 'Password is too short. Use at least 8 characters.'; + String get authWeakPassword => 'Password is too short. Use at least 8 characters.'; @override String get authInvalidEmail => 'Invalid email format.'; @@ -603,15 +593,13 @@ class AppLocalizationsEn extends AppLocalizations { String get commonTryLater => 'Please try again later.'; @override - String get authCredentialInUse => - 'This social account is already linked to another FANUZU account.'; + String get authCredentialInUse => 'This social account is already linked to another FANUZU account.'; @override String get authAlreadyLinked => 'This account is already linked.'; @override - String get authMethodUnavailable => - 'This sign-in method isn\'t available yet.'; + String get authMethodUnavailable => 'This sign-in method isn\'t available yet.'; @override String get authRecentLogin => 'For security, please sign in again and retry.'; @@ -625,12 +613,10 @@ class AppLocalizationsEn extends AppLocalizations { String get authThisAccount => 'This'; @override - String get eclipseCapped => - 'You reached the participation cap, so some shakes weren\'t counted.'; + String get eclipseCapped => 'You reached the participation cap, so some shakes weren\'t counted.'; @override - String get eclipseResultUnknown => - 'Couldn\'t confirm your participation. Please check again with the same request.'; + String get eclipseResultUnknown => 'Couldn\'t confirm your participation. Please check again with the same request.'; @override String get eclipseChecking => 'Checking participation'; @@ -639,12 +625,10 @@ class AppLocalizationsEn extends AppLocalizations { String get eclipseRetrySame => 'Recheck same participation'; @override - String get eclipseEnded => - 'The eclipse has already ended or was successfully defended.'; + String get eclipseEnded => 'The eclipse has already ended or was successfully defended.'; @override - String get eclipseTooFast => - 'You\'re participating too fast. Please try again shortly.'; + String get eclipseTooFast => 'You\'re participating too fast. Please try again shortly.'; @override String get eclipseNone => 'No eclipse in progress'; @@ -665,15 +649,13 @@ class AppLocalizationsEn extends AppLocalizations { String get eclipseCancelTitle => 'Eclipse cancelled'; @override - String get eclipseCancelBody => - 'Cancelled due to a tally error. No FPI was deducted.'; + String get eclipseCancelBody => 'Cancelled due to a tally error. No FPI was deducted.'; @override String get eclipsePendingTitle => 'Checking defense result'; @override - String get eclipsePendingBody => - 'Participation time is over. Waiting for the server\'s decision.'; + String get eclipsePendingBody => 'Participation time is over. Waiting for the server\'s decision.'; @override String get eclipseShakeTimed => 's — shake your phone\nto stop the eclipse!'; @@ -756,8 +738,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get galaxySetPrimaryConfirm => - 'Set the selected planet as your main planet?'; + String get galaxySetPrimaryConfirm => 'Set the selected planet as your main planet?'; @override String get galaxyLoadFailed => 'Couldn\'t load the galaxy'; @@ -840,12 +821,10 @@ class AppLocalizationsEn extends AppLocalizations { String get zapFailNoPop => 'Not enough POP to contribute.'; @override - String get zapFailLedger => - 'Contribution stopped: balance and earnings history don\'t match.'; + String get zapFailLedger => 'Contribution stopped: balance and earnings history don\'t match.'; @override - String get zapFailRetry => - 'Check your connection and recheck the same contribution.'; + String get zapFailRetry => 'Check your connection and recheck the same contribution.'; @override String get zapDone => 'Contributed'; @@ -864,8 +843,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get growthNebulaGoalPassed => - 'The goal period has passed · Meet the conditions and the planet will be born'; + String get growthNebulaGoalPassed => 'The goal period has passed · Meet the conditions and the planet will be born'; @override String get growthFinalStage => 'Final stage'; @@ -903,8 +881,7 @@ class AppLocalizationsEn extends AppLocalizations { String get nebulaNameTaken => 'This name is already taken.'; @override - String get nebulaNameInvalid => - 'Use 2–20 letters, numbers or spaces (no symbols, emoji, or double/leading/trailing spaces).'; + String get nebulaNameInvalid => 'Use 2–20 letters, numbers or spaces (no symbols, emoji, or double/leading/trailing spaces).'; @override String get nebulaNameHint => 'Fandom name'; @@ -944,8 +921,7 @@ class AppLocalizationsEn extends AppLocalizations { String get commonNext => 'Next'; @override - String get planetCreateFailed => - 'Couldn\'t create the planet. Please try again later.'; + String get planetCreateFailed => 'Couldn\'t create the planet. Please try again later.'; @override String get planetCreateConfirm => 'Create a planet\nwith these options?'; @@ -986,12 +962,10 @@ class AppLocalizationsEn extends AppLocalizations { String get heroOwnerSuffix => '\'s'; @override - String get heroStartPrompt => - 'Create or join a planet\nand start your FANUZU journey!'; + String get heroStartPrompt => 'Create or join a planet\nand start your FANUZU journey!'; @override - String get heroNebulaPrompt => - 'Use the POP you earn from activities\nto contribute to the nebula!'; + String get heroNebulaPrompt => 'Use the POP you earn from activities\nto contribute to the nebula!'; @override String heroRecentContribution(String pop) { @@ -1221,24 +1195,19 @@ class AppLocalizationsEn extends AppLocalizations { String get payStateRefundRejected => 'Refund rejected'; @override - String get pushTopicEssentialDesc => - 'Account, payment, and maintenance notices. These can\'t be turned off.'; + String get pushTopicEssentialDesc => 'Account, payment, and maintenance notices. These can\'t be turned off.'; @override - String get pushTopicFandomEventDesc => - 'Eclipse, campaign, quest, and Artist Hot Time news.'; + String get pushTopicFandomEventDesc => 'Eclipse, campaign, quest, and Artist Hot Time news.'; @override - String get pushTopicBriefingDesc => - 'Daily briefing cards summarizing your planet\'s day.'; + String get pushTopicBriefingDesc => 'Daily briefing cards summarizing your planet\'s day.'; @override - String get pushTopicCommunityDesc => - 'Comments, likes, and answers on your posts.'; + String get pushTopicCommunityDesc => 'Comments, likes, and answers on your posts.'; @override - String get pushTopicMarketingDesc => - 'Get event and benefit info. Only on if you agree.'; + String get pushTopicMarketingDesc => 'Get event and benefit info. Only on if you agree.'; @override String get inquiryPending => 'Received'; @@ -1250,16 +1219,13 @@ class AppLocalizationsEn extends AppLocalizations { String get inquiryAnswered => 'Answered'; @override - String get photoBadType => - 'Only JPG, PNG, WEBP, or GIF images can be uploaded.'; + String get photoBadType => 'Only JPG, PNG, WEBP, or GIF images can be uploaded.'; @override - String get photoTooBig => - 'The photo is over 10MB. Please choose a smaller one.'; + String get photoTooBig => 'The photo is over 10MB. Please choose a smaller one.'; @override - String get photoUnreadable => - 'Couldn\'t read the photo. Please choose again.'; + String get photoUnreadable => 'Couldn\'t read the photo. Please choose again.'; @override String get myListInside => 'My INSIDE'; @@ -1304,12 +1270,10 @@ class AppLocalizationsEn extends AppLocalizations { String get inquiryFallback => 'Inquiry'; @override - String get photoRejectedServer => - 'Couldn\'t upload the photo. Check its format and size.'; + String get photoRejectedServer => 'Couldn\'t upload the photo. Check its format and size.'; @override - String get photoUploadFailed => - 'Photo upload failed. Please try again later.'; + String get photoUploadFailed => 'Photo upload failed. Please try again later.'; @override String focusClaimed(String pop) { @@ -1331,8 +1295,7 @@ class AppLocalizationsEn extends AppLocalizations { String get focusClaimToday => 'Claim today\'s reward'; @override - String get storeConnectFailed => - 'Couldn\'t connect to the store. Please try again later.'; + String get storeConnectFailed => 'Couldn\'t connect to the store. Please try again later.'; @override String get payRestore => 'Restore purchases'; @@ -1341,8 +1304,7 @@ class AppLocalizationsEn extends AppLocalizations { String get payEmpty => 'No payment history.'; @override - String get payRefundGuide => - 'Consumables: refundable within 7 days of purchase if unused. Items that have been partly used are not refundable.\nSubscriptions: refundable within 24 hours of payment if no benefits (e.g., bonus rewards) were used.\nRefunds are completed within 7–14 days after approval.'; + String get payRefundGuide => 'Consumables: refundable within 7 days of purchase if unused. Items that have been partly used are not refundable.\nSubscriptions: refundable within 24 hours of payment if no benefits (e.g., bonus rewards) were used.\nRefunds are completed within 7–14 days after approval.'; @override String get payDetailTitle => 'Payment details'; @@ -1414,8 +1376,7 @@ class AppLocalizationsEn extends AppLocalizations { String get nicknameEdit => 'Edit nickname'; @override - String get nicknameReserved => - 'You can\'t use a name that could be mistaken for staff.'; + String get nicknameReserved => 'You can\'t use a name that could be mistaken for staff.'; @override String get nicknameTaken => 'This nickname is already in use.'; @@ -1487,8 +1448,7 @@ class AppLocalizationsEn extends AppLocalizations { String get inquiryBodyHint => 'Describe your inquiry.'; @override - String get inquiryBodyHelper => - 'Writing 10+ characters helps us assist you faster.'; + String get inquiryBodyHelper => 'Writing 10+ characters helps us assist you faster.'; @override String inquirySubmitFailed(String reason) { @@ -1530,8 +1490,7 @@ class AppLocalizationsEn extends AppLocalizations { String get tierPromptSuffix => '\nby contributing to planets and nebulae'; @override - String get tierPassportNote => - 'Passport Tier is a card appearance grade separate from your level, and it never goes down.'; + String get tierPassportNote => 'Passport Tier is a card appearance grade separate from your level, and it never goes down.'; @override String get tierTotalContribution => 'Total contribution'; @@ -1602,15 +1561,13 @@ class AppLocalizationsEn extends AppLocalizations { String get stationSuggest => 'Suggest a shop'; @override - String get stationEmpty => - 'No links yet.\nJoin a planet to see curated links.'; + String get stationEmpty => 'No links yet.\nJoin a planet to see curated links.'; @override String get stationCategoryEmpty => 'No links in this category yet.'; @override - String get stationSuggestLater => - 'Suggestions open once the server is connected.'; + String get stationSuggestLater => 'Suggestions open once the server is connected.'; @override String get commonSubmit => 'Submit'; @@ -1637,30 +1594,25 @@ class AppLocalizationsEn extends AppLocalizations { String get stationReason => 'Why you recommend it (optional)'; @override - String get stationSuggestNote => - 'Suggested links are added after review. We\'ll notify you of the result.'; + String get stationSuggestNote => 'Suggested links are added after review. We\'ll notify you of the result.'; @override String get heroGiftUnavailable => 'This gift can\'t be claimed right now.'; @override - String get heroGiftAlready => - 'You\'ve already joined this gift. Check your POP history.'; + String get heroGiftAlready => 'You\'ve already joined this gift. Check your POP history.'; @override String get heroGiftRelogin => 'Please sign in again to join.'; @override - String get heroGiftNoPermission => - 'You don\'t have permission to join this gift.'; + String get heroGiftNoPermission => 'You don\'t have permission to join this gift.'; @override - String get heroGiftHowTo => - 'Shake your phone or tap the button below to join the light energy gift.'; + String get heroGiftHowTo => 'Shake your phone or tap the button below to join the light energy gift.'; @override - String get heroGiftPopNote => - 'POP you can receive depends on the remaining gift and the per-person cap.'; + String get heroGiftPopNote => 'POP you can receive depends on the remaining gift and the per-person cap.'; @override String heroGiftReceived(String total) { @@ -1668,8 +1620,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get heroGiftUnknown => - 'Couldn\'t confirm the payout. Please check again.'; + String get heroGiftUnknown => 'Couldn\'t confirm the payout. Please check again.'; @override String get heroGiftNone => 'No gifts to join right now.'; @@ -1756,15 +1707,13 @@ class AppLocalizationsEn extends AppLocalizations { String get reportReasonLabel => 'Reason'; @override - String get reportConfirm => - 'Report this post?\nThis can\'t be undone once submitted.'; + String get reportConfirm => 'Report this post?\nThis can\'t be undone once submitted.'; @override String get blockMemberConfirm => 'Block all posts from this member?'; @override - String get loungeMembersOnly => - 'Only members of this planet\'s fandom can post, comment, or like.'; + String get loungeMembersOnly => 'Only members of this planet\'s fandom can post, comment, or like.'; @override String get loungeFailed => 'Couldn\'t complete that. Please try again later.'; @@ -1869,6 +1818,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get historyFounderBadge => 'First 100 commemorative badge'; + @override + String get historyHistoric => 'Historic moment'; + @override String historyGrowthPop(String amount) { return '$amount POP added to growth'; @@ -1891,31 +1843,34 @@ class AppLocalizationsEn extends AppLocalizations { @override String countryName(String code) { - String _temp0 = intl.Intl.selectLogic(code, { - 'KR': 'South Korea', - 'JP': 'Japan', - 'US': 'United States', - 'CN': 'China', - 'TW': 'Taiwan', - 'HK': 'Hong Kong', - 'TH': 'Thailand', - 'VN': 'Vietnam', - 'ID': 'Indonesia', - 'PH': 'Philippines', - 'MY': 'Malaysia', - 'SG': 'Singapore', - 'IN': 'India', - 'GB': 'United Kingdom', - 'FR': 'France', - 'DE': 'Germany', - 'ES': 'Spain', - 'BR': 'Brazil', - 'MX': 'Mexico', - 'CA': 'Canada', - 'AU': 'Australia', - 'ZZ': 'Unspecified', - 'other': '-', - }); + String _temp0 = intl.Intl.selectLogic( + code, + { + 'KR': 'South Korea', + 'JP': 'Japan', + 'US': 'United States', + 'CN': 'China', + 'TW': 'Taiwan', + 'HK': 'Hong Kong', + 'TH': 'Thailand', + 'VN': 'Vietnam', + 'ID': 'Indonesia', + 'PH': 'Philippines', + 'MY': 'Malaysia', + 'SG': 'Singapore', + 'IN': 'India', + 'GB': 'United Kingdom', + 'FR': 'France', + 'DE': 'Germany', + 'ES': 'Spain', + 'BR': 'Brazil', + 'MX': 'Mexico', + 'CA': 'Canada', + 'AU': 'Australia', + 'ZZ': 'Unspecified', + 'other': '-', + }, + ); return '$_temp0'; } @@ -2046,8 +2001,7 @@ class AppLocalizationsEn extends AppLocalizations { String get questResume => 'Resume'; @override - String get questShakeRestart => - 'The quest settings changed, so you will start from the beginning.'; + String get questShakeRestart => 'The quest settings changed, so you will start from the beginning.'; @override String get questPaused => 'Paused'; @@ -2065,8 +2019,7 @@ class AppLocalizationsEn extends AppLocalizations { String get questTypeStreaming => 'Streaming'; @override - String get questTypeUnverifiable => - 'This quest isn\'t open for participation yet.'; + String get questTypeUnverifiable => 'This quest isn\'t open for participation yet.'; @override String get questTabMine => 'My quests'; @@ -2113,12 +2066,10 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get adWarpBefore => - 'Warping... Finding the right ad so you can contribute more to your fandom and artist.'; + String get adWarpBefore => 'Warping... Finding the right ad so you can contribute more to your fandom and artist.'; @override - String get adWarpAfter => - 'Warping... Preparing the reward for your contribution.'; + String get adWarpAfter => 'Warping... Preparing the reward for your contribution.'; @override String get adSkip => 'Skip'; @@ -2182,12 +2133,10 @@ class AppLocalizationsEn extends AppLocalizations { String get questTabEmpty => 'No quests in this tab yet.'; @override - String get questCreateNotReady => - 'Quest creation opens together with reward funding. Coming soon.'; + String get questCreateNotReady => 'Quest creation opens together with reward funding. Coming soon.'; @override - String get questNoBaseReward => - 'Couldn\'t find the basic reward record, so the ad bonus isn\'t available.'; + String get questNoBaseReward => 'Couldn\'t find the basic reward record, so the ad bonus isn\'t available.'; @override String get questNoSteps => 'No steps recorded yet. Walk a bit and try again.'; @@ -2222,35 +2171,28 @@ class AppLocalizationsEn extends AppLocalizations { String get questStop => 'Stop'; @override - String get adNotFinished => - 'You didn\'t finish the ad, so there\'s no bonus. You still get the basic reward.'; + String get adNotFinished => 'You didn\'t finish the ad, so there\'s no bonus. You still get the basic reward.'; @override - String get adNotVerified => - 'We couldn\'t confirm the ad view, so there\'s no bonus. You still get the basic reward.'; + String get adNotVerified => 'We couldn\'t confirm the ad view, so there\'s no bonus. You still get the basic reward.'; @override String get openSettings => 'Open settings'; @override - String get permStepsDenied => - 'Step permission is off. Allow \"Physical activity\" in Settings.'; + String get permStepsDenied => 'Step permission is off. Allow \"Physical activity\" in Settings.'; @override - String get permStepsNeeded => - 'Physical activity permission is needed to count steps.'; + String get permStepsNeeded => 'Physical activity permission is needed to count steps.'; @override - String get permLocationOff => - 'Location services are off. Turn them on and try again.'; + String get permLocationOff => 'Location services are off. Turn them on and try again.'; @override - String get permLocationNeeded => - 'Location permission is needed to verify your visit.'; + String get permLocationNeeded => 'Location permission is needed to verify your visit.'; @override - String get permLocationDenied => - 'Location permission is off. Allow location access in Settings.'; + String get permLocationDenied => 'Location permission is off. Allow location access in Settings.'; @override String get questRewardReceived => ' received!'; @@ -2271,15 +2213,13 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get nebulaCreateFailed => - 'Couldn\'t create the nebula. Please try again later.'; + String get nebulaCreateFailed => 'Couldn\'t create the nebula. Please try again later.'; @override String get nebulaAlreadyToday => 'You\'ve already created a nebula today.'; @override - String get nebulaCreatedKeepPrimary => - 'Nebula created. Your main planet stays the same because it can only be changed 30 days after the last change.'; + String get nebulaCreatedKeepPrimary => 'Nebula created. Your main planet stays the same because it can only be changed 30 days after the last change.'; @override String get planetLeave => 'Leave'; @@ -2288,8 +2228,7 @@ class AppLocalizationsEn extends AppLocalizations { String get planetLeaveConfirmTitle => 'Leave this planet?'; @override - String get planetLeaveConfirmBody => - 'Contributed POP and activity\ncannot be undone.'; + String get planetLeaveConfirmBody => 'Contributed POP and activity\ncannot be undone.'; @override String get sortPopular => 'Popular'; @@ -2301,16 +2240,13 @@ class AppLocalizationsEn extends AppLocalizations { String get campaignStatusReview => 'This campaign is under review.'; @override - String get campaignStatusRejected => - 'This campaign was rejected in review. Your registration fee has been returned.'; + String get campaignStatusRejected => 'This campaign was rejected in review. Your registration fee has been returned.'; @override - String get campaignStatusWithdrawn => - 'This campaign was withdrawn by its creator.'; + String get campaignStatusWithdrawn => 'This campaign was withdrawn by its creator.'; @override - String get campaignStatusCancelled => - 'This campaign was cancelled for operational reasons. The registration fee and supported POP have been returned.'; + String get campaignStatusCancelled => 'This campaign was cancelled for operational reasons. The registration fee and supported POP have been returned.'; @override String get rankWindowDaily => 'Daily'; @@ -2393,8 +2329,7 @@ class AppLocalizationsEn extends AppLocalizations { String get campaignContributePop => 'Set POP to contribute'; @override - String get campaignEmptyContributing => - 'You haven\'t contributed to any campaigns yet.'; + String get campaignEmptyContributing => 'You haven\'t contributed to any campaigns yet.'; @override String get campaignEmpty => 'No campaigns yet.'; @@ -2450,12 +2385,7 @@ class AppLocalizationsEn extends AppLocalizations { String get campaignWeekdays => 'S,M,T,W,T,F,S'; @override - String campaignPeriodRange( - String startMonth, - String startDay, - String endMonth, - String endDay, - ) { + String campaignPeriodRange(String startMonth, String startDay, String endMonth, String endDay) { return '$startMonth/$startDay ~ $endMonth/$endDay'; } @@ -2481,8 +2411,7 @@ class AppLocalizationsEn extends AppLocalizations { String get campaignBodyHint => 'Describe your campaign.'; @override - String get campaignReviewNote => - 'Once submitted, funding opens after review.'; + String get campaignReviewNote => 'Once submitted, funding opens after review.'; @override String get campaignSupportType => 'Choose support type'; @@ -2500,12 +2429,7 @@ class AppLocalizationsEn extends AppLocalizations { String get campaignSubmitTitle => 'Submit this campaign?'; @override - String campaignSubmitBody( - String title, - String goal, - String days, - String fee, - ) { + String campaignSubmitBody(String title, String goal, String days, String fee) { return '$title · Goal $goal POP · $days days\nThe $fee POP registration fee will be deducted, and funding opens after review.'; } @@ -2524,20 +2448,16 @@ class AppLocalizationsEn extends AppLocalizations { String get campaignPendingTitle => 'Awaiting review'; @override - String get campaignPendingBody => - 'Once review is complete, funding opens and the campaign appears in the list.'; + String get campaignPendingBody => 'Once review is complete, funding opens and the campaign appears in the list.'; @override - String get insideRefundPending => - 'The acceptance deadline has passed. The bounty will be refunded.'; + String get insideRefundPending => 'The acceptance deadline has passed. The bounty will be refunded.'; @override - String get insideRefundDone => - 'The acceptance deadline has passed. The bounty has been refunded.'; + String get insideRefundDone => 'The acceptance deadline has passed. The bounty has been refunded.'; @override - String get insideRefundChecking => - 'The acceptance deadline has passed. We are checking the bounty refund.'; + String get insideRefundChecking => 'The acceptance deadline has passed. We are checking the bounty refund.'; @override String get insideErrPopShort => 'Not enough POP to set the bounty.'; @@ -2546,12 +2466,10 @@ class AppLocalizationsEn extends AppLocalizations { String get insideErrSelfAccept => 'You can\'t accept your own answer.'; @override - String get insideErrAlreadyAccepted => - 'An answer has already been accepted and cannot be changed.'; + String get insideErrAlreadyAccepted => 'An answer has already been accepted and cannot be changed.'; @override - String get insideErrNotOwner => - 'Only the person who asked can accept an answer.'; + String get insideErrNotOwner => 'Only the person who asked can accept an answer.'; @override String get commonCheckConnection => 'Check your connection and try again.'; @@ -2612,8 +2530,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get insideAttachLater => - 'Image attachments open once the server is connected.'; + String get insideAttachLater => 'Image attachments open once the server is connected.'; @override String get insideBountyRequired => 'Please enter a bounty.'; @@ -2682,8 +2599,7 @@ class AppLocalizationsEn extends AppLocalizations { String get questActivity => 'Activity'; @override - String get questNoCreatable => - 'No quest activities are open for creation right now.'; + String get questNoCreatable => 'No quest activities are open for creation right now.'; @override String get questDescriptionOptional => 'Description (optional)'; @@ -2695,12 +2611,10 @@ class AppLocalizationsEn extends AppLocalizations { String get questLinkCheck => 'Check link'; @override - String get questLinkInvalid => - 'This link isn\'t valid. Please check the address.'; + String get questLinkInvalid => 'This link isn\'t valid. Please check the address.'; @override - String get questLinkPreviewFailed => - 'Couldn\'t load the link info. Please enter a title.'; + String get questLinkPreviewFailed => 'Couldn\'t load the link info. Please enter a title.'; @override String get questLinkTitle => 'Link title'; @@ -2722,14 +2636,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String questCreateCost( - String title, - String reward, - String count, - String pool, - String fee, - String total, - ) { + String questCreateCost(String title, String reward, String count, String pool, String fee, String total) { return '$title\nReward $reward POP × $count = $pool POP\nFee $fee POP (burned on publishing)\n$total POP in total will be deducted.'; } @@ -2737,12 +2644,10 @@ class AppLocalizationsEn extends AppLocalizations { String get questNoReward => 'This quest has no reward.'; @override - String get questStreamJoined => - 'Your participation is recorded. This quest has no POP reward.'; + String get questStreamJoined => 'Your participation is recorded. This quest has no POP reward.'; @override - String get questNoShake => - 'No shakes recorded. Tap Start and shake to the beat.'; + String get questNoShake => 'No shakes recorded. Tap Start and shake to the beat.'; @override String get questDeadline => 'Deadline'; @@ -2782,12 +2687,10 @@ class AppLocalizationsEn extends AppLocalizations { String get questSubmitted => 'Submitted. The reward is paid after review.'; @override - String get questReviewPending => - 'Under review. The reward is paid once approved.'; + String get questReviewPending => 'Under review. The reward is paid once approved.'; @override - String get questReviewDelayed => - 'Review is taking longer than usual. Our team is checking.'; + String get questReviewDelayed => 'Review is taking longer than usual. Our team is checking.'; @override String get questApprovedPaying => 'Approved. Paying your reward.'; @@ -2830,8 +2733,7 @@ class AppLocalizationsEn extends AppLocalizations { String get questEdit => 'Edit title and description'; @override - String get questEditNotice => - 'After publishing, only the title and description can be edited, and edits are logged.'; + String get questEditNotice => 'After publishing, only the title and description can be edited, and edits are logged.'; @override String get popReasonQuestUgc => 'Quest reward'; @@ -2940,16 +2842,13 @@ class AppLocalizationsEn extends AppLocalizations { String get questCancel => 'Cancel quest'; @override - String get questCancelInReview => - 'Cancelling while under review returns the deposited reward POP and the fee in full.'; + String get questCancelInReview => 'Cancelling while under review returns the deposited reward POP and the fee in full.'; @override - String get questCancelPublished => - 'Cancelling a published quest closes it now and returns the unused reward POP. The fee is not refunded.'; + String get questCancelPublished => 'Cancelling a published quest closes it now and returns the unused reward POP. The fee is not refunded.'; @override - String get questUnderReview => - 'Under review. It will be published once approved.'; + String get questUnderReview => 'Under review. It will be published once approved.'; @override String questModerationRejected(String reason) { @@ -2957,8 +2856,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get questSubmittedForReview => - 'Submitted. It will be published after review.'; + String get questSubmittedForReview => 'Submitted. It will be published after review.'; @override String get popReasonQuestFeeRefund => 'Quest fee refund'; @@ -2970,8 +2868,7 @@ class AppLocalizationsEn extends AppLocalizations { String get eclipseTapToJoin => 'Can\'t shake? Tap to join'; @override - String get termsPrivacy => - 'Privacy Policy and Personal Data Collection (required)'; + String get termsPrivacy => 'Privacy Policy and Personal Data Collection (required)'; @override String get onbSkip => 'Skip'; @@ -2980,22 +2877,19 @@ class AppLocalizationsEn extends AppLocalizations { String get onbIntro1Title => 'Grow your fandom\'s planet'; @override - String get onbIntro1Body => - 'Collect POP and send it with ZAP\nto grow your fandom planet together.'; + String get onbIntro1Body => 'Collect POP and send it with ZAP\nto grow your fandom planet together.'; @override String get onbIntro2Title => 'Cheer with quests'; @override - String get onbIntro2Body => - 'Complete walking, attendance and streaming quests\nand earn POP rewards.'; + String get onbIntro2Body => 'Complete walking, attendance and streaming quests\nand earn POP rewards.'; @override String get onbIntro3Title => 'Protect it with fellow fans'; @override - String get onbIntro3Body => - 'Stop the Eclipse together and support\nyour artist through campaigns.'; + String get onbIntro3Body => 'Stop the Eclipse together and support\nyour artist through campaigns.'; @override String get onbProfileTitle => 'Set up your profile'; @@ -3022,8 +2916,7 @@ class AppLocalizationsEn extends AppLocalizations { String get onbArtistTitle => 'Choose the artists you follow'; @override - String get onbArtistBody => - 'The first artist you pick becomes your main planet. You can join several fandoms.'; + String get onbArtistBody => 'The first artist you pick becomes your main planet. You can join several fandoms.'; @override String get onbArtistSearch => 'Search artist name'; @@ -3055,8 +2948,7 @@ class AppLocalizationsEn extends AppLocalizations { String get onbPermTitle => 'App permissions'; @override - String get onbPermBody => - 'These permissions are needed only for the related features. You can use the app without them.'; + String get onbPermBody => 'These permissions are needed only for the related features. You can use the app without them.'; @override String get onbPermPush => 'Notifications'; @@ -3068,15 +2960,13 @@ class AppLocalizationsEn extends AppLocalizations { String get onbPermHealth => 'Health data (steps)'; @override - String get onbPermHealthDesc => - 'Counts steps for walking quests. Requested when you first start one.'; + String get onbPermHealthDesc => 'Counts steps for walking quests. Requested when you first start one.'; @override String get onbPermLocation => 'Location'; @override - String get onbPermLocationDesc => - 'Checks arrival for location quests. Requested when you first start one.'; + String get onbPermLocationDesc => 'Checks arrival for location quests. Requested when you first start one.'; @override String get onbPermContinue => 'Continue'; @@ -3088,8 +2978,7 @@ class AppLocalizationsEn extends AppLocalizations { String get coachMy => 'Your records are here'; @override - String get settingsWithdrawLinked => - 'Please unlink your connected accounts before deleting your account.'; + String get settingsWithdrawLinked => 'Please unlink your connected accounts before deleting your account.'; @override String get homeWeeklyTitle => 'Our planet this week'; @@ -3130,8 +3019,7 @@ class AppLocalizationsEn extends AppLocalizations { String get questScanQr => 'Scan the on-site QR'; @override - String get questScanQrDenied => - 'Can\'t open the camera. Allow camera access in Settings.'; + String get questScanQrDenied => 'Can\'t open the camera. Allow camera access in Settings.'; @override String get questQrForPlace => 'Verification QR to post on site'; diff --git a/app/lib/l10n/app_localizations_es.dart b/app/lib/l10n/app_localizations_es.dart index cb83426..8d5ba34 100644 --- a/app/lib/l10n/app_localizations_es.dart +++ b/app/lib/l10n/app_localizations_es.dart @@ -56,33 +56,38 @@ class AppLocalizationsEs extends AppLocalizations { String get authAlreadyMember => '¿Ya tienes una cuenta?'; @override - String get authLoginHeadline => - '¡Inicia sesión en FANUZU\nde la forma más fácil!'; + String get authLoginHeadline => '¡Inicia sesión en FANUZU\nde la forma más fácil!'; @override String get authSignupHeadline => '¡Únete a FANUZU\nde la forma más fácil!'; @override String authProviderLogin(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': 'Iniciar sesión con Apple', - 'google': 'Iniciar sesión con Google', - 'kakao': 'Iniciar sesión con Kakao', - 'line': 'Iniciar sesión con LINE', - 'other': 'Iniciar sesión con correo', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': 'Iniciar sesión con Apple', + 'google': 'Iniciar sesión con Google', + 'kakao': 'Iniciar sesión con Kakao', + 'line': 'Iniciar sesión con LINE', + 'other': 'Iniciar sesión con correo', + }, + ); return '$_temp0'; } @override String authProviderSignup(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': 'Registrarse con Apple', - 'google': 'Registrarse con Google', - 'kakao': 'Registrarse con Kakao', - 'line': 'Registrarse con LINE', - 'other': 'Registrarse con correo', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': 'Registrarse con Apple', + 'google': 'Registrarse con Google', + 'kakao': 'Registrarse con Kakao', + 'line': 'Registrarse con LINE', + 'other': 'Registrarse con correo', + }, + ); return '$_temp0'; } @@ -102,8 +107,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get authResetNeedEmail => - 'Primero introduce el correo para recibir el enlace.'; + String get authResetNeedEmail => 'Primero introduce el correo para recibir el enlace.'; @override String get authResetSent => 'Enviamos las instrucciones a esa dirección.'; @@ -118,22 +122,19 @@ class AppLocalizationsEs extends AppLocalizations { String get termsService => 'Términos del servicio (obligatorio)'; @override - String get termsLocation => - 'Términos de servicios de ubicación (obligatorio)'; + String get termsLocation => 'Términos de servicios de ubicación (obligatorio)'; @override String get termsAge => 'Tengo 14 años o más. (obligatorio)'; @override - String get termsMarketing => - 'Recibir información de marketing y eventos (opcional)'; + String get termsMarketing => 'Recibir información de marketing y eventos (opcional)'; @override String get signupDoneTitle => 'Registro completado'; @override - String get signupDoneBody => - 'Ya puedes empezar tus actividades de fandom.\nHaz crecer tu planeta con muchas actividades.'; + String get signupDoneBody => 'Ya puedes empezar tus actividades de fandom.\nHaz crecer tu planeta con muchas actividades.'; @override String get homeItemsTooltip => 'Objetos'; @@ -260,22 +261,19 @@ class AppLocalizationsEs extends AppLocalizations { String get settingsWithdrawBody => 'Perderás tus POP y no se puede deshacer.'; @override - String get settingsWithdrawLater => - 'La eliminación de cuenta llegará pronto.'; + String get settingsWithdrawLater => 'La eliminación de cuenta llegará pronto.'; @override String get settingsUnlinkConfirm => '¿Desvincular esta cuenta?'; @override - String get settingsUnlinkBody => - 'Solo se quita este método de inicio social; los datos de tu cuenta no se eliminan.'; + String get settingsUnlinkBody => 'Solo se quita este método de inicio social; los datos de tu cuenta no se eliminan.'; @override String get settingsUnlink => 'Desvincular'; @override - String get settingsSameEmailOnly => - 'Solo se pueden vincular cuentas sociales\ncon el mismo correo.'; + String get settingsSameEmailOnly => 'Solo se pueden vincular cuentas sociales\ncon el mismo correo.'; @override String settingsLinkNotReady(String name) { @@ -292,12 +290,10 @@ class AppLocalizationsEs extends AppLocalizations { String get settingsEmailProvider => 'Correo'; @override - String get pushDeviceOff => - 'Las notificaciones push están desactivadas en este dispositivo.'; + String get pushDeviceOff => 'Las notificaciones push están desactivadas en este dispositivo.'; @override - String get pushDeviceOffHint => - 'Permite las notificaciones en los ajustes del sistema.'; + String get pushDeviceOffHint => 'Permite las notificaciones en los ajustes del sistema.'; @override String get pushRequesting => 'Solicitando…'; @@ -306,12 +302,10 @@ class AppLocalizationsEs extends AppLocalizations { String get pushGoToSettings => 'Ir a ajustes'; @override - String get pushOpeningDeviceSettings => - 'Abriendo los ajustes del dispositivo.'; + String get pushOpeningDeviceSettings => 'Abriendo los ajustes del dispositivo.'; @override - String get pushEnableInDevice => - 'Activa las notificaciones de FANUZU en los ajustes del dispositivo.'; + String get pushEnableInDevice => 'Activa las notificaciones de FANUZU en los ajustes del dispositivo.'; @override String get pushDeviceSection => 'Notificaciones del dispositivo'; @@ -349,8 +343,7 @@ class AppLocalizationsEs extends AppLocalizations { String get linkLinked => 'Vinculada'; @override - String get linkSameEmailOnly => - 'Solo se pueden vincular cuentas sociales con el mismo correo.'; + String get linkSameEmailOnly => 'Solo se pueden vincular cuentas sociales con el mismo correo.'; @override String get linkUnlink => 'Desvincular'; @@ -391,12 +384,10 @@ class AppLocalizationsEs extends AppLocalizations { String get translationInvalid => 'No válida'; @override - String get translationSelfMarkBlocked => - 'No puedes marcar tu propia traducción.'; + String get translationSelfMarkBlocked => 'No puedes marcar tu propia traducción.'; @override - String get translationSubmitted => - 'Traducción publicada. Si se valida, recibirás POP en 24 horas.'; + String get translationSubmitted => 'Traducción publicada. Si se valida, recibirás POP en 24 horas.'; @override String get translationMarked => 'Marcada.'; @@ -405,20 +396,16 @@ class AppLocalizationsEs extends AppLocalizations { String get translationAlreadyMarked => 'Ya marcaste esta traducción.'; @override - String get translationDuplicate => - 'Ya publicaste una traducción en este idioma.'; + String get translationDuplicate => 'Ya publicaste una traducción en este idioma.'; @override - String get translationFailed => - 'No se pudo procesar. Inténtalo de nuevo en un momento.'; + String get translationFailed => 'No se pudo procesar. Inténtalo de nuevo en un momento.'; @override - String get translationNotEligible => - 'Solo los miembros de este fandom con más de 24 horas de antigüedad pueden marcar.'; + String get translationNotEligible => 'Solo los miembros de este fandom con más de 24 horas de antigüedad pueden marcar.'; @override - String get translationDailyCap => - 'Hoy ya no puedes publicar más traducciones.'; + String get translationDailyCap => 'Hoy ya no puedes publicar más traducciones.'; @override String get translationInvalidTarget => 'Este contenido no se puede traducir.'; @@ -430,15 +417,13 @@ class AppLocalizationsEs extends AppLocalizations { String get commonFan => 'Fan'; @override - String get adLoadFailed => - 'No se pudo cargar el anuncio. Solo recibirás la recompensa básica.'; + String get adLoadFailed => 'No se pudo cargar el anuncio. Solo recibirás la recompensa básica.'; @override String get storeNotReady => 'Productos de la tienda en preparación'; @override - String get storePending => - 'Esperando la aprobación del pago. Se aplicará automáticamente al aprobarse.'; + String get storePending => 'Esperando la aprobación del pago. Se aplicará automáticamente al aprobarse.'; @override String get storeFailed => 'No se pudo completar el pago.'; @@ -470,8 +455,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get stageNames => - 'Nebulosa,Inicio,Crecimiento,Juntos,Compañía,Luz,Eternidad'; + String get stageNames => 'Nebulosa,Inicio,Crecimiento,Juntos,Compañía,Luz,Eternidad'; @override String get planetStageUnknown => 'Planeta · Sin información de etapa'; @@ -516,8 +500,7 @@ class AppLocalizationsEs extends AppLocalizations { String get playHeadline => '¡Vamos a conocer a tu fandom!'; @override - String get playBody => - 'Crea un planeta, conecta con fandoms y disfruta de la actividad fan...'; + String get playBody => 'Crea un planeta, conecta con fandoms y disfruta de la actividad fan...'; @override String get timeJustNow => 'Ahora'; @@ -542,38 +525,42 @@ class AppLocalizationsEs extends AppLocalizations { @override String authProviderStart(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': 'Continuar con correo', - 'kakao': 'Continuar con Kakao', - 'line': 'Continuar con LINE', - 'apple': 'Continuar con Apple', - 'other': 'Continuar con Google', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': 'Continuar con correo', + 'kakao': 'Continuar con Kakao', + 'line': 'Continuar con LINE', + 'apple': 'Continuar con Apple', + 'other': 'Continuar con Google', + }, + ); return '$_temp0'; } @override String authProviderName(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': 'Correo', - 'kakao': 'Kakao', - 'line': 'LINE', - 'apple': 'Apple', - 'other': 'Google', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': 'Correo', + 'kakao': 'Kakao', + 'line': 'LINE', + 'apple': 'Apple', + 'other': 'Google', + }, + ); return '$_temp0'; } @override - String get authLastProvider => - 'No puedes desvincular tu último método de inicio de sesión.'; + String get authLastProvider => 'No puedes desvincular tu último método de inicio de sesión.'; @override String get authLoginRequired => 'Debes iniciar sesión.'; @override - String get authDifferentEmail => - 'Esta cuenta no coincide con tu correo de registro.'; + String get authDifferentEmail => 'Esta cuenta no coincide con tu correo de registro.'; @override String get authLinkFailed => 'No se pudo vincular la cuenta.'; @@ -582,8 +569,7 @@ class AppLocalizationsEs extends AppLocalizations { String get authNotLinked => 'Esta cuenta no está vinculada.'; @override - String get authEmailUnavailable => - 'El inicio de sesión con correo no está disponible.'; + String get authEmailUnavailable => 'El inicio de sesión con correo no está disponible.'; @override String get authCheckCredentials => 'Revisa tu correo o contraseña.'; @@ -592,15 +578,13 @@ class AppLocalizationsEs extends AppLocalizations { String get authSocialFailed => 'Error al iniciar sesión con la red social.'; @override - String get authAppleUnavailable => - 'Iniciar sesión con Apple no está disponible en este dispositivo.'; + String get authAppleUnavailable => 'Iniciar sesión con Apple no está disponible en este dispositivo.'; @override String get authEmailInUse => 'Este correo ya está registrado.'; @override - String get authWeakPassword => - 'La contraseña es muy corta. Usa al menos 8 caracteres.'; + String get authWeakPassword => 'La contraseña es muy corta. Usa al menos 8 caracteres.'; @override String get authInvalidEmail => 'El formato del correo no es válido.'; @@ -609,19 +593,16 @@ class AppLocalizationsEs extends AppLocalizations { String get commonTryLater => 'Inténtalo de nuevo más tarde.'; @override - String get authCredentialInUse => - 'Esta cuenta social ya está vinculada a otra cuenta de FANUZU.'; + String get authCredentialInUse => 'Esta cuenta social ya está vinculada a otra cuenta de FANUZU.'; @override String get authAlreadyLinked => 'Esta cuenta ya está vinculada.'; @override - String get authMethodUnavailable => - 'Este método de inicio de sesión aún no está disponible.'; + String get authMethodUnavailable => 'Este método de inicio de sesión aún no está disponible.'; @override - String get authRecentLogin => - 'Por seguridad, vuelve a iniciar sesión e inténtalo de nuevo.'; + String get authRecentLogin => 'Por seguridad, vuelve a iniciar sesión e inténtalo de nuevo.'; @override String authOtherProviderGuide(String email) { @@ -632,12 +613,10 @@ class AppLocalizationsEs extends AppLocalizations { String get authThisAccount => 'Esta'; @override - String get eclipseCapped => - 'Alcanzaste el límite de participación; algunas no se contaron.'; + String get eclipseCapped => 'Alcanzaste el límite de participación; algunas no se contaron.'; @override - String get eclipseResultUnknown => - 'No se pudo confirmar tu participación. Vuelve a comprobarlo con la misma solicitud.'; + String get eclipseResultUnknown => 'No se pudo confirmar tu participación. Vuelve a comprobarlo con la misma solicitud.'; @override String get eclipseChecking => 'Comprobando participación'; @@ -649,8 +628,7 @@ class AppLocalizationsEs extends AppLocalizations { String get eclipseEnded => 'El eclipse ya terminó o se defendió con éxito.'; @override - String get eclipseTooFast => - 'Estás participando demasiado rápido. Inténtalo en un momento.'; + String get eclipseTooFast => 'Estás participando demasiado rápido. Inténtalo en un momento.'; @override String get eclipseNone => 'No hay ningún eclipse en curso'; @@ -662,30 +640,25 @@ class AppLocalizationsEs extends AppLocalizations { String get eclipseQualified => 'Participación confirmada'; @override - String get eclipseFailTitle => - 'Lamentablemente,\nla defensa del planeta falló'; + String get eclipseFailTitle => 'Lamentablemente,\nla defensa del planeta falló'; @override - String get eclipseFailBody => - 'No se alcanzó el objetivo de defensa de esta ronda.'; + String get eclipseFailBody => 'No se alcanzó el objetivo de defensa de esta ronda.'; @override String get eclipseCancelTitle => 'Eclipse cancelado'; @override - String get eclipseCancelBody => - 'Se canceló por un error de recuento. No se descontó FPI.'; + String get eclipseCancelBody => 'Se canceló por un error de recuento. No se descontó FPI.'; @override String get eclipsePendingTitle => 'Comprobando resultado de la defensa'; @override - String get eclipsePendingBody => - 'El tiempo de participación terminó. Esperando la decisión del servidor.'; + String get eclipsePendingBody => 'El tiempo de participación terminó. Esperando la decisión del servidor.'; @override - String get eclipseShakeTimed => - 's: ¡agita tu móvil\npara detener el eclipse!'; + String get eclipseShakeTimed => 's: ¡agita tu móvil\npara detener el eclipse!'; @override String get eclipseShake => '¡Agita tu móvil\npara detener el eclipse!'; @@ -709,8 +682,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get eclipseNoSensor => - 'Este dispositivo no admite la defensa con agitación'; + String get eclipseNoSensor => 'Este dispositivo no admite la defensa con agitación'; @override String get eclipseTimeLeft => 'Tiempo restante del eclipse:'; @@ -766,8 +738,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get galaxySetPrimaryConfirm => - '¿Establecer el planeta seleccionado como principal?'; + String get galaxySetPrimaryConfirm => '¿Establecer el planeta seleccionado como principal?'; @override String get galaxyLoadFailed => 'No se pudo cargar la galaxia'; @@ -850,12 +821,10 @@ class AppLocalizationsEs extends AppLocalizations { String get zapFailNoPop => 'No tienes POP suficiente para contribuir.'; @override - String get zapFailLedger => - 'Se detuvo la contribución: el saldo no coincide con el historial.'; + String get zapFailLedger => 'Se detuvo la contribución: el saldo no coincide con el historial.'; @override - String get zapFailRetry => - 'Revisa tu conexión y vuelve a comprobar la contribución.'; + String get zapFailRetry => 'Revisa tu conexión y vuelve a comprobar la contribución.'; @override String get zapDone => 'Contribución completada'; @@ -874,8 +843,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get growthNebulaGoalPassed => - 'El plazo objetivo ha pasado · Cumple las condiciones y nacerá el planeta'; + String get growthNebulaGoalPassed => 'El plazo objetivo ha pasado · Cumple las condiciones y nacerá el planeta'; @override String get growthFinalStage => 'Etapa final'; @@ -913,8 +881,7 @@ class AppLocalizationsEs extends AppLocalizations { String get nebulaNameTaken => 'Este nombre ya está en uso.'; @override - String get nebulaNameInvalid => - 'Usa de 2 a 20 letras, números o espacios (sin símbolos, emojis ni espacios dobles o al inicio/final).'; + String get nebulaNameInvalid => 'Usa de 2 a 20 letras, números o espacios (sin símbolos, emojis ni espacios dobles o al inicio/final).'; @override String get nebulaNameHint => 'Nombre del fandom'; @@ -954,8 +921,7 @@ class AppLocalizationsEs extends AppLocalizations { String get commonNext => 'Siguiente'; @override - String get planetCreateFailed => - 'No se pudo crear el planeta. Inténtalo más tarde.'; + String get planetCreateFailed => 'No se pudo crear el planeta. Inténtalo más tarde.'; @override String get planetCreateConfirm => '¿Crear el planeta\ncon estas opciones?'; @@ -996,12 +962,10 @@ class AppLocalizationsEs extends AppLocalizations { String get heroOwnerSuffix => 'aporta:'; @override - String get heroStartPrompt => - '¡Crea o únete a un planeta\ny empieza en FANUZU!'; + String get heroStartPrompt => '¡Crea o únete a un planeta\ny empieza en FANUZU!'; @override - String get heroNebulaPrompt => - '¡Usa el POP que ganas con actividades\npara contribuir a la nebulosa!'; + String get heroNebulaPrompt => '¡Usa el POP que ganas con actividades\npara contribuir a la nebulosa!'; @override String heroRecentContribution(String pop) { @@ -1035,8 +999,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get itemJoinFirst => - 'Únete a un planeta para enviar un Regalo del Héroe.'; + String get itemJoinFirst => 'Únete a un planeta para enviar un Regalo del Héroe.'; @override String get itemBuyNotReady => 'La compra de objetos llegará pronto.'; @@ -1232,24 +1195,19 @@ class AppLocalizationsEs extends AppLocalizations { String get payStateRefundRejected => 'Reembolso rechazado'; @override - String get pushTopicEssentialDesc => - 'Avisos de cuenta, pagos y mantenimiento. No se pueden desactivar.'; + String get pushTopicEssentialDesc => 'Avisos de cuenta, pagos y mantenimiento. No se pueden desactivar.'; @override - String get pushTopicFandomEventDesc => - 'Novedades de eclipses, campañas, misiones y Artist Hot Time.'; + String get pushTopicFandomEventDesc => 'Novedades de eclipses, campañas, misiones y Artist Hot Time.'; @override - String get pushTopicBriefingDesc => - 'Tarjetas de resumen diario de tu planeta.'; + String get pushTopicBriefingDesc => 'Tarjetas de resumen diario de tu planeta.'; @override - String get pushTopicCommunityDesc => - 'Comentarios, me gusta y respuestas en tus publicaciones.'; + String get pushTopicCommunityDesc => 'Comentarios, me gusta y respuestas en tus publicaciones.'; @override - String get pushTopicMarketingDesc => - 'Recibe eventos y beneficios. Solo se activa si aceptas.'; + String get pushTopicMarketingDesc => 'Recibe eventos y beneficios. Solo se activa si aceptas.'; @override String get inquiryPending => 'Recibida'; @@ -1312,12 +1270,10 @@ class AppLocalizationsEs extends AppLocalizations { String get inquiryFallback => 'Consulta'; @override - String get photoRejectedServer => - 'No se pudo subir la foto. Revisa el formato y el tamaño.'; + String get photoRejectedServer => 'No se pudo subir la foto. Revisa el formato y el tamaño.'; @override - String get photoUploadFailed => - 'Error al subir la foto. Inténtalo más tarde.'; + String get photoUploadFailed => 'Error al subir la foto. Inténtalo más tarde.'; @override String focusClaimed(String pop) { @@ -1339,8 +1295,7 @@ class AppLocalizationsEs extends AppLocalizations { String get focusClaimToday => 'Reclamar hoy'; @override - String get storeConnectFailed => - 'No se pudo conectar con la tienda. Inténtalo más tarde.'; + String get storeConnectFailed => 'No se pudo conectar con la tienda. Inténtalo más tarde.'; @override String get payRestore => 'Restaurar compras'; @@ -1349,8 +1304,7 @@ class AppLocalizationsEs extends AppLocalizations { String get payEmpty => 'No hay historial de pagos.'; @override - String get payRefundGuide => - 'Consumibles: reembolsables en 7 días desde la compra si no se usaron. Los artículos usados parcialmente no son reembolsables.\nSuscripciones: reembolsables en 24 horas desde el pago si no se usaron beneficios (p. ej., recompensas extra).\nEl reembolso se completa en 7–14 días tras la aprobación.'; + String get payRefundGuide => 'Consumibles: reembolsables en 7 días desde la compra si no se usaron. Los artículos usados parcialmente no son reembolsables.\nSuscripciones: reembolsables en 24 horas desde el pago si no se usaron beneficios (p. ej., recompensas extra).\nEl reembolso se completa en 7–14 días tras la aprobación.'; @override String get payDetailTitle => 'Detalle del pago'; @@ -1422,8 +1376,7 @@ class AppLocalizationsEs extends AppLocalizations { String get nicknameEdit => 'Editar apodo'; @override - String get nicknameReserved => - 'No puedes usar un nombre que parezca del equipo.'; + String get nicknameReserved => 'No puedes usar un nombre que parezca del equipo.'; @override String get nicknameTaken => 'Este apodo ya está en uso.'; @@ -1495,8 +1448,7 @@ class AppLocalizationsEs extends AppLocalizations { String get inquiryBodyHint => 'Describe tu consulta.'; @override - String get inquiryBodyHelper => - 'Con 10 caracteres o más podremos ayudarte antes.'; + String get inquiryBodyHelper => 'Con 10 caracteres o más podremos ayudarte antes.'; @override String inquirySubmitFailed(String reason) { @@ -1538,8 +1490,7 @@ class AppLocalizationsEs extends AppLocalizations { String get tierPromptSuffix => '\ncontribuyendo a planetas y nebulosas'; @override - String get tierPassportNote => - 'Passport Tier es un grado de apariencia de tarjeta, independiente del nivel, y nunca baja.'; + String get tierPassportNote => 'Passport Tier es un grado de apariencia de tarjeta, independiente del nivel, y nunca baja.'; @override String get tierTotalContribution => 'Contribución total'; @@ -1610,15 +1561,13 @@ class AppLocalizationsEs extends AppLocalizations { String get stationSuggest => 'Sugerir tienda'; @override - String get stationEmpty => - 'Aún no hay enlaces.\nÚnete a un planeta para ver la selección.'; + String get stationEmpty => 'Aún no hay enlaces.\nÚnete a un planeta para ver la selección.'; @override String get stationCategoryEmpty => 'Aún no hay enlaces en esta categoría.'; @override - String get stationSuggestLater => - 'Las sugerencias se abrirán al conectar el servidor.'; + String get stationSuggestLater => 'Las sugerencias se abrirán al conectar el servidor.'; @override String get commonSubmit => 'Enviar'; @@ -1645,30 +1594,25 @@ class AppLocalizationsEs extends AppLocalizations { String get stationReason => 'Por qué lo recomiendas (opcional)'; @override - String get stationSuggestNote => - 'Los enlaces sugeridos se añaden tras una revisión. Te avisaremos del resultado.'; + String get stationSuggestNote => 'Los enlaces sugeridos se añaden tras una revisión. Te avisaremos del resultado.'; @override String get heroGiftUnavailable => 'Este regalo no se puede recibir ahora.'; @override - String get heroGiftAlready => - 'Ya participaste en este regalo. Revisa tu historial de POP.'; + String get heroGiftAlready => 'Ya participaste en este regalo. Revisa tu historial de POP.'; @override String get heroGiftRelogin => 'Vuelve a iniciar sesión para participar.'; @override - String get heroGiftNoPermission => - 'No tienes permiso para participar en este regalo.'; + String get heroGiftNoPermission => 'No tienes permiso para participar en este regalo.'; @override - String get heroGiftHowTo => - 'Agita el móvil o toca el botón para unirte al regalo de energía de luz.'; + String get heroGiftHowTo => 'Agita el móvil o toca el botón para unirte al regalo de energía de luz.'; @override - String get heroGiftPopNote => - 'El POP que recibes depende del regalo restante y del límite por persona.'; + String get heroGiftPopNote => 'El POP que recibes depende del regalo restante y del límite por persona.'; @override String heroGiftReceived(String total) { @@ -1676,8 +1620,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get heroGiftUnknown => - 'No se pudo confirmar el pago. Vuelve a comprobarlo.'; + String get heroGiftUnknown => 'No se pudo confirmar el pago. Vuelve a comprobarlo.'; @override String get heroGiftNone => 'No hay regalos disponibles ahora.'; @@ -1764,16 +1707,13 @@ class AppLocalizationsEs extends AppLocalizations { String get reportReasonLabel => 'Motivo'; @override - String get reportConfirm => - '¿Denunciar esta publicación?\nNo se puede deshacer.'; + String get reportConfirm => '¿Denunciar esta publicación?\nNo se puede deshacer.'; @override - String get blockMemberConfirm => - '¿Bloquear todas las publicaciones de este miembro?'; + String get blockMemberConfirm => '¿Bloquear todas las publicaciones de este miembro?'; @override - String get loungeMembersOnly => - 'Solo los miembros del fandom de este planeta pueden publicar, comentar o dar me gusta.'; + String get loungeMembersOnly => 'Solo los miembros del fandom de este planeta pueden publicar, comentar o dar me gusta.'; @override String get loungeFailed => 'No se pudo completar. Inténtalo más tarde.'; @@ -1870,15 +1810,16 @@ class AppLocalizationsEs extends AppLocalizations { String get historyFunding => 'Contribución a Campaign'; @override - String get historyEclipseSuccess => - 'Participaste en una defensa exitosa del eclipse'; + String get historyEclipseSuccess => 'Participaste en una defensa exitosa del eclipse'; @override String get historyEmblemEvolution => 'Emblema de evolución'; @override - String get historyFounderBadge => - 'Insignia conmemorativa de los primeros 100'; + String get historyFounderBadge => 'Insignia conmemorativa de los primeros 100'; + + @override + String get historyHistoric => 'Momento histórico'; @override String historyGrowthPop(String amount) { @@ -1902,31 +1843,34 @@ class AppLocalizationsEs extends AppLocalizations { @override String countryName(String code) { - String _temp0 = intl.Intl.selectLogic(code, { - 'KR': 'Corea del Sur', - 'JP': 'Japón', - 'US': 'Estados Unidos', - 'CN': 'China', - 'TW': 'Taiwán', - 'HK': 'Hong Kong', - 'TH': 'Tailandia', - 'VN': 'Vietnam', - 'ID': 'Indonesia', - 'PH': 'Filipinas', - 'MY': 'Malasia', - 'SG': 'Singapur', - 'IN': 'India', - 'GB': 'Reino Unido', - 'FR': 'Francia', - 'DE': 'Alemania', - 'ES': 'España', - 'BR': 'Brasil', - 'MX': 'México', - 'CA': 'Canadá', - 'AU': 'Australia', - 'ZZ': 'Sin especificar', - 'other': '-', - }); + String _temp0 = intl.Intl.selectLogic( + code, + { + 'KR': 'Corea del Sur', + 'JP': 'Japón', + 'US': 'Estados Unidos', + 'CN': 'China', + 'TW': 'Taiwán', + 'HK': 'Hong Kong', + 'TH': 'Tailandia', + 'VN': 'Vietnam', + 'ID': 'Indonesia', + 'PH': 'Filipinas', + 'MY': 'Malasia', + 'SG': 'Singapur', + 'IN': 'India', + 'GB': 'Reino Unido', + 'FR': 'Francia', + 'DE': 'Alemania', + 'ES': 'España', + 'BR': 'Brasil', + 'MX': 'México', + 'CA': 'Canadá', + 'AU': 'Australia', + 'ZZ': 'Sin especificar', + 'other': '-', + }, + ); return '$_temp0'; } @@ -1995,8 +1939,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get planetHideMember => - 'Ocultar todas las publicaciones de este miembro'; + String get planetHideMember => 'Ocultar todas las publicaciones de este miembro'; @override String get reportReasonUnknown => 'No se pudo verificar el motivo.'; @@ -2058,8 +2001,7 @@ class AppLocalizationsEs extends AppLocalizations { String get questResume => 'Reanudar'; @override - String get questShakeRestart => - 'La configuración de la misión cambió, así que empiezas desde el principio.'; + String get questShakeRestart => 'La configuración de la misión cambió, así que empiezas desde el principio.'; @override String get questPaused => 'En pausa'; @@ -2077,8 +2019,7 @@ class AppLocalizationsEs extends AppLocalizations { String get questTypeStreaming => 'Streaming'; @override - String get questTypeUnverifiable => - 'Aún no puedes participar en esta misión.'; + String get questTypeUnverifiable => 'Aún no puedes participar en esta misión.'; @override String get questTabMine => 'Mis misiones'; @@ -2099,8 +2040,7 @@ class AppLocalizationsEs extends AppLocalizations { String get adMoreChance => 'Consigue más oportunidades de contribuir.'; @override - String get adWatchPrompt => - '¡Mira un anuncio para\nconseguir una recompensa extra!'; + String get adWatchPrompt => '¡Mira un anuncio para\nconseguir una recompensa extra!'; @override String get adBonusPlaceholder => '+ POP de contribución'; @@ -2126,12 +2066,10 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get adWarpBefore => - 'Warping... Buscando el anuncio ideal para que aportes más a tu fandom y artista.'; + String get adWarpBefore => 'Warping... Buscando el anuncio ideal para que aportes más a tu fandom y artista.'; @override - String get adWarpAfter => - 'Warping... Preparando la recompensa por tu contribución.'; + String get adWarpAfter => 'Warping... Preparando la recompensa por tu contribución.'; @override String get adSkip => 'Omitir'; @@ -2195,16 +2133,13 @@ class AppLocalizationsEs extends AppLocalizations { String get questTabEmpty => 'Aún no hay misiones en esta pestaña.'; @override - String get questCreateNotReady => - 'La creación de misiones se abrirá junto con los fondos de recompensa. Próximamente.'; + String get questCreateNotReady => 'La creación de misiones se abrirá junto con los fondos de recompensa. Próximamente.'; @override - String get questNoBaseReward => - 'No se encontró la recompensa básica, así que no hay extra por anuncio.'; + String get questNoBaseReward => 'No se encontró la recompensa básica, así que no hay extra por anuncio.'; @override - String get questNoSteps => - 'Aún no hay pasos registrados. Camina un poco y vuelve a intentarlo.'; + String get questNoSteps => 'Aún no hay pasos registrados. Camina un poco y vuelve a intentarlo.'; @override String get questNoPlace => 'Esta misión no tiene una ubicación registrada.'; @@ -2236,35 +2171,28 @@ class AppLocalizationsEs extends AppLocalizations { String get questStop => 'Detener'; @override - String get adNotFinished => - 'No terminaste el anuncio, así que no hay extra. Recibes la recompensa básica.'; + String get adNotFinished => 'No terminaste el anuncio, así que no hay extra. Recibes la recompensa básica.'; @override - String get adNotVerified => - 'No pudimos confirmar el anuncio, así que no hay extra. Recibes la recompensa básica.'; + String get adNotVerified => 'No pudimos confirmar el anuncio, así que no hay extra. Recibes la recompensa básica.'; @override String get openSettings => 'Abrir ajustes'; @override - String get permStepsDenied => - 'El permiso de pasos está desactivado. Permite \"Actividad física\" en Ajustes.'; + String get permStepsDenied => 'El permiso de pasos está desactivado. Permite \"Actividad física\" en Ajustes.'; @override - String get permStepsNeeded => - 'Se necesita el permiso de actividad física para contar pasos.'; + String get permStepsNeeded => 'Se necesita el permiso de actividad física para contar pasos.'; @override - String get permLocationOff => - 'La ubicación del dispositivo está desactivada. Actívala e inténtalo de nuevo.'; + String get permLocationOff => 'La ubicación del dispositivo está desactivada. Actívala e inténtalo de nuevo.'; @override - String get permLocationNeeded => - 'Se necesita el permiso de ubicación para verificar tu visita.'; + String get permLocationNeeded => 'Se necesita el permiso de ubicación para verificar tu visita.'; @override - String get permLocationDenied => - 'El permiso de ubicación está desactivado. Permite el acceso en Ajustes.'; + String get permLocationDenied => 'El permiso de ubicación está desactivado. Permite el acceso en Ajustes.'; @override String get questRewardReceived => ' ¡recibidos!'; @@ -2285,15 +2213,13 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get nebulaCreateFailed => - 'No se pudo crear la nebulosa. Inténtalo más tarde.'; + String get nebulaCreateFailed => 'No se pudo crear la nebulosa. Inténtalo más tarde.'; @override String get nebulaAlreadyToday => 'Ya creaste una nebulosa hoy.'; @override - String get nebulaCreatedKeepPrimary => - 'Nebulosa creada. Tu planeta principal no cambia: solo puede cambiarse 30 días después del último cambio.'; + String get nebulaCreatedKeepPrimary => 'Nebulosa creada. Tu planeta principal no cambia: solo puede cambiarse 30 días después del último cambio.'; @override String get planetLeave => 'Salir'; @@ -2302,8 +2228,7 @@ class AppLocalizationsEs extends AppLocalizations { String get planetLeaveConfirmTitle => '¿Salir de este planeta?'; @override - String get planetLeaveConfirmBody => - 'El POP aportado y la actividad\nno se pueden deshacer.'; + String get planetLeaveConfirmBody => 'El POP aportado y la actividad\nno se pueden deshacer.'; @override String get sortPopular => 'Populares'; @@ -2315,15 +2240,13 @@ class AppLocalizationsEs extends AppLocalizations { String get campaignStatusReview => 'Esta campaña está en revisión.'; @override - String get campaignStatusRejected => - 'Esta campaña fue rechazada en la revisión. Te hemos devuelto la tarifa de registro.'; + String get campaignStatusRejected => 'Esta campaña fue rechazada en la revisión. Te hemos devuelto la tarifa de registro.'; @override String get campaignStatusWithdrawn => 'El creador retiró esta campaña.'; @override - String get campaignStatusCancelled => - 'Se canceló por motivos operativos. Te hemos devuelto la tarifa de registro y los POP aportados.'; + String get campaignStatusCancelled => 'Se canceló por motivos operativos. Te hemos devuelto la tarifa de registro y los POP aportados.'; @override String get rankWindowDaily => 'Diario'; @@ -2406,8 +2329,7 @@ class AppLocalizationsEs extends AppLocalizations { String get campaignContributePop => 'Elige los POP a aportar'; @override - String get campaignEmptyContributing => - 'Aún no has contribuido a ninguna campaña.'; + String get campaignEmptyContributing => 'Aún no has contribuido a ninguna campaña.'; @override String get campaignEmpty => 'No hay campañas.'; @@ -2463,12 +2385,7 @@ class AppLocalizationsEs extends AppLocalizations { String get campaignWeekdays => 'D,L,M,X,J,V,S'; @override - String campaignPeriodRange( - String startMonth, - String startDay, - String endMonth, - String endDay, - ) { + String campaignPeriodRange(String startMonth, String startDay, String endMonth, String endDay) { return '$startDay/$startMonth ~ $endDay/$endMonth'; } @@ -2494,8 +2411,7 @@ class AppLocalizationsEs extends AppLocalizations { String get campaignBodyHint => 'Describe tu campaña.'; @override - String get campaignReviewNote => - 'Tras enviarla, la financiación se abre después de la revisión.'; + String get campaignReviewNote => 'Tras enviarla, la financiación se abre después de la revisión.'; @override String get campaignSupportType => 'Elige el tipo de apoyo'; @@ -2513,12 +2429,7 @@ class AppLocalizationsEs extends AppLocalizations { String get campaignSubmitTitle => '¿Enviar esta campaña?'; @override - String campaignSubmitBody( - String title, - String goal, - String days, - String fee, - ) { + String campaignSubmitBody(String title, String goal, String days, String fee) { return '$title · Objetivo $goal POP · $days días\nSe descontará la tarifa de registro de $fee POP y la financiación se abrirá tras la revisión.'; } @@ -2537,43 +2448,34 @@ class AppLocalizationsEs extends AppLocalizations { String get campaignPendingTitle => 'Pendiente de revisión'; @override - String get campaignPendingBody => - 'Cuando termine la revisión, se abrirá la financiación y aparecerá en la lista.'; + String get campaignPendingBody => 'Cuando termine la revisión, se abrirá la financiación y aparecerá en la lista.'; @override - String get insideRefundPending => - 'El plazo de aceptación venció. Se reembolsará la recompensa.'; + String get insideRefundPending => 'El plazo de aceptación venció. Se reembolsará la recompensa.'; @override - String get insideRefundDone => - 'El plazo de aceptación venció. Se reembolsó la recompensa.'; + String get insideRefundDone => 'El plazo de aceptación venció. Se reembolsó la recompensa.'; @override - String get insideRefundChecking => - 'El plazo de aceptación venció. Estamos revisando el reembolso de la recompensa.'; + String get insideRefundChecking => 'El plazo de aceptación venció. Estamos revisando el reembolso de la recompensa.'; @override - String get insideErrPopShort => - 'No tienes POP suficientes para la recompensa.'; + String get insideErrPopShort => 'No tienes POP suficientes para la recompensa.'; @override String get insideErrSelfAccept => 'No puedes aceptar tu propia respuesta.'; @override - String get insideErrAlreadyAccepted => - 'Ya se aceptó una respuesta y no se puede cambiar.'; + String get insideErrAlreadyAccepted => 'Ya se aceptó una respuesta y no se puede cambiar.'; @override - String get insideErrNotOwner => - 'Solo quien preguntó puede aceptar una respuesta.'; + String get insideErrNotOwner => 'Solo quien preguntó puede aceptar una respuesta.'; @override - String get commonCheckConnection => - 'Revisa tu conexión e inténtalo de nuevo.'; + String get commonCheckConnection => 'Revisa tu conexión e inténtalo de nuevo.'; @override - String get insideAnswerLater => - 'Los comentarios se abrirán cuando se conecte el servidor.'; + String get insideAnswerLater => 'Los comentarios se abrirán cuando se conecte el servidor.'; @override String insideAcceptConfirm(String pop) { @@ -2628,8 +2530,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get insideAttachLater => - 'Los adjuntos de imagen se abrirán cuando se conecte el servidor.'; + String get insideAttachLater => 'Los adjuntos de imagen se abrirán cuando se conecte el servidor.'; @override String get insideBountyRequired => 'Indica una recompensa.'; @@ -2698,8 +2599,7 @@ class AppLocalizationsEs extends AppLocalizations { String get questActivity => 'Actividad'; @override - String get questNoCreatable => - 'Ahora no hay actividades disponibles para crear.'; + String get questNoCreatable => 'Ahora no hay actividades disponibles para crear.'; @override String get questDescriptionOptional => 'Descripción (opcional)'; @@ -2714,8 +2614,7 @@ class AppLocalizationsEs extends AppLocalizations { String get questLinkInvalid => 'El enlace no es válido. Revisa la dirección.'; @override - String get questLinkPreviewFailed => - 'No se pudo cargar el enlace. Escribe un título.'; + String get questLinkPreviewFailed => 'No se pudo cargar el enlace. Escribe un título.'; @override String get questLinkTitle => 'Título del enlace'; @@ -2737,14 +2636,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String questCreateCost( - String title, - String reward, - String count, - String pool, - String fee, - String total, - ) { + String questCreateCost(String title, String reward, String count, String pool, String fee, String total) { return '$title\nRecompensa $reward POP × $count = $pool POP\nComisión $fee POP (se quema al publicar)\nSe descontarán $total POP en total.'; } @@ -2752,12 +2644,10 @@ class AppLocalizationsEs extends AppLocalizations { String get questNoReward => 'Esta misión no tiene recompensa.'; @override - String get questStreamJoined => - 'Tu participación quedó registrada. Esta misión no otorga POP.'; + String get questStreamJoined => 'Tu participación quedó registrada. Esta misión no otorga POP.'; @override - String get questNoShake => - 'No se registraron sacudidas. Pulsa Empezar y agita al ritmo.'; + String get questNoShake => 'No se registraron sacudidas. Pulsa Empezar y agita al ritmo.'; @override String get questDeadline => 'Fecha límite'; @@ -2794,16 +2684,13 @@ class AppLocalizationsEs extends AppLocalizations { String get questEvidenceText => 'Detalles de la prueba'; @override - String get questSubmitted => - 'Enviado. La recompensa se paga tras la revisión.'; + String get questSubmitted => 'Enviado. La recompensa se paga tras la revisión.'; @override - String get questReviewPending => - 'En revisión. La recompensa se paga al aprobarse.'; + String get questReviewPending => 'En revisión. La recompensa se paga al aprobarse.'; @override - String get questReviewDelayed => - 'La revisión se está retrasando. Nuestro equipo lo está revisando.'; + String get questReviewDelayed => 'La revisión se está retrasando. Nuestro equipo lo está revisando.'; @override String get questApprovedPaying => 'Aprobado. Pagando tu recompensa.'; @@ -2846,8 +2733,7 @@ class AppLocalizationsEs extends AppLocalizations { String get questEdit => 'Editar título y descripción'; @override - String get questEditNotice => - 'Tras publicar solo puedes editar el título y la descripción, y se guarda el historial.'; + String get questEditNotice => 'Tras publicar solo puedes editar el título y la descripción, y se guarda el historial.'; @override String get popReasonQuestUgc => 'Recompensa de misión'; @@ -2956,12 +2842,10 @@ class AppLocalizationsEs extends AppLocalizations { String get questCancel => 'Cancelar misión'; @override - String get questCancelInReview => - 'Si cancelas durante la revisión, te devolvemos todo el POP depositado y la comisión.'; + String get questCancelInReview => 'Si cancelas durante la revisión, te devolvemos todo el POP depositado y la comisión.'; @override - String get questCancelPublished => - 'Si cancelas una misión publicada, se cierra al momento y te devolvemos el POP no usado. La comisión no se reembolsa.'; + String get questCancelPublished => 'Si cancelas una misión publicada, se cierra al momento y te devolvemos el POP no usado. La comisión no se reembolsa.'; @override String get questUnderReview => 'En revisión. Se publicará cuando se apruebe.'; @@ -2972,8 +2856,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get questSubmittedForReview => - 'Enviada. Se publicará tras la revisión.'; + String get questSubmittedForReview => 'Enviada. Se publicará tras la revisión.'; @override String get popReasonQuestFeeRefund => 'Reembolso de comisión de misión'; @@ -2985,8 +2868,7 @@ class AppLocalizationsEs extends AppLocalizations { String get eclipseTapToJoin => '¿No puedes agitar? Toca para participar'; @override - String get termsPrivacy => - 'Política de privacidad y recopilación de datos personales (obligatorio)'; + String get termsPrivacy => 'Política de privacidad y recopilación de datos personales (obligatorio)'; @override String get onbSkip => 'Omitir'; @@ -2995,22 +2877,19 @@ class AppLocalizationsEs extends AppLocalizations { String get onbIntro1Title => 'Haz crecer el planeta de tu fandom'; @override - String get onbIntro1Body => - 'Reúne POP y envíalo con ZAP\npara que el planeta de tu fandom crezca.'; + String get onbIntro1Body => 'Reúne POP y envíalo con ZAP\npara que el planeta de tu fandom crezca.'; @override String get onbIntro2Title => 'Apoya con misiones'; @override - String get onbIntro2Body => - 'Completa misiones de caminar, asistencia y streaming\ny gana POP.'; + String get onbIntro2Body => 'Completa misiones de caminar, asistencia y streaming\ny gana POP.'; @override String get onbIntro3Title => 'Protégelo junto a otros fans'; @override - String get onbIntro3Body => - 'Detengan juntos el Eclipse y apoyen\na su artista con campañas.'; + String get onbIntro3Body => 'Detengan juntos el Eclipse y apoyen\na su artista con campañas.'; @override String get onbProfileTitle => 'Configura tu perfil'; @@ -3037,8 +2916,7 @@ class AppLocalizationsEs extends AppLocalizations { String get onbArtistTitle => 'Elige a los artistas que sigues'; @override - String get onbArtistBody => - 'El primer artista que elijas será tu planeta principal. Puedes unirte a varios fandoms.'; + String get onbArtistBody => 'El primer artista que elijas será tu planeta principal. Puedes unirte a varios fandoms.'; @override String get onbArtistSearch => 'Buscar nombre del artista'; @@ -3070,29 +2948,25 @@ class AppLocalizationsEs extends AppLocalizations { String get onbPermTitle => 'Permisos de la app'; @override - String get onbPermBody => - 'Estos permisos solo se necesitan para las funciones relacionadas. Puedes usar la app sin ellos.'; + String get onbPermBody => 'Estos permisos solo se necesitan para las funciones relacionadas. Puedes usar la app sin ellos.'; @override String get onbPermPush => 'Notificaciones'; @override - String get onbPermPushDesc => - 'Recibe avisos de Eclipse, HERO TIME y misiones.'; + String get onbPermPushDesc => 'Recibe avisos de Eclipse, HERO TIME y misiones.'; @override String get onbPermHealth => 'Datos de salud (pasos)'; @override - String get onbPermHealthDesc => - 'Cuenta pasos para misiones de caminar. Se solicita al empezar la primera.'; + String get onbPermHealthDesc => 'Cuenta pasos para misiones de caminar. Se solicita al empezar la primera.'; @override String get onbPermLocation => 'Ubicación'; @override - String get onbPermLocationDesc => - 'Comprueba la llegada en misiones de ubicación. Se solicita al empezar la primera.'; + String get onbPermLocationDesc => 'Comprueba la llegada en misiones de ubicación. Se solicita al empezar la primera.'; @override String get onbPermContinue => 'Continuar'; @@ -3104,8 +2978,7 @@ class AppLocalizationsEs extends AppLocalizations { String get coachMy => 'Aquí puedes ver tus registros'; @override - String get settingsWithdrawLinked => - 'Desvincula tus cuentas conectadas antes de eliminar tu cuenta.'; + String get settingsWithdrawLinked => 'Desvincula tus cuentas conectadas antes de eliminar tu cuenta.'; @override String get homeWeeklyTitle => 'Nuestro planeta esta semana'; @@ -3146,8 +3019,7 @@ class AppLocalizationsEs extends AppLocalizations { String get questScanQr => 'Escanea el QR del lugar'; @override - String get questScanQrDenied => - 'No se puede abrir la cámara. Permite el acceso en Ajustes.'; + String get questScanQrDenied => 'No se puede abrir la cámara. Permite el acceso en Ajustes.'; @override String get questQrForPlace => 'QR de verificación para colocar en el lugar'; diff --git a/app/lib/l10n/app_localizations_ja.dart b/app/lib/l10n/app_localizations_ja.dart index 30e1260..63bbef4 100644 --- a/app/lib/l10n/app_localizations_ja.dart +++ b/app/lib/l10n/app_localizations_ja.dart @@ -63,25 +63,31 @@ class AppLocalizationsJa extends AppLocalizations { @override String authProviderLogin(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': 'Appleでログイン', - 'google': 'Googleでログイン', - 'kakao': 'Kakaoでログイン', - 'line': 'LINEでログイン', - 'other': 'メールでログイン', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': 'Appleでログイン', + 'google': 'Googleでログイン', + 'kakao': 'Kakaoでログイン', + 'line': 'LINEでログイン', + 'other': 'メールでログイン', + }, + ); return '$_temp0'; } @override String authProviderSignup(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': 'Appleで登録', - 'google': 'Googleで登録', - 'kakao': 'Kakaoで登録', - 'line': 'LINEで登録', - 'other': 'メールで登録', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': 'Appleで登録', + 'google': 'Googleで登録', + 'kakao': 'Kakaoで登録', + 'line': 'LINEで登録', + 'other': 'メールで登録', + }, + ); return '$_temp0'; } @@ -519,25 +525,31 @@ class AppLocalizationsJa extends AppLocalizations { @override String authProviderStart(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': 'メールではじめる', - 'kakao': 'Kakaoではじめる', - 'line': 'LINEではじめる', - 'apple': 'Appleではじめる', - 'other': 'Googleではじめる', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': 'メールではじめる', + 'kakao': 'Kakaoではじめる', + 'line': 'LINEではじめる', + 'apple': 'Appleではじめる', + 'other': 'Googleではじめる', + }, + ); return '$_temp0'; } @override String authProviderName(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': 'メール', - 'kakao': 'Kakao', - 'line': 'LINE', - 'apple': 'Apple', - 'other': 'Google', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': 'メール', + 'kakao': 'Kakao', + 'line': 'LINE', + 'apple': 'Apple', + 'other': 'Google', + }, + ); return '$_temp0'; } @@ -869,8 +881,7 @@ class AppLocalizationsJa extends AppLocalizations { String get nebulaNameTaken => 'すでに使用されている名前です。'; @override - String get nebulaNameInvalid => - '2〜20文字のハングル・英字・数字で入力してください(記号・絵文字・連続/前後の空白は不可)。'; + String get nebulaNameInvalid => '2〜20文字のハングル・英字・数字で入力してください(記号・絵文字・連続/前後の空白は不可)。'; @override String get nebulaNameHint => 'ファンダム名'; @@ -1187,8 +1198,7 @@ class AppLocalizationsJa extends AppLocalizations { String get pushTopicEssentialDesc => 'アカウント・決済・メンテナンスのお知らせです。オフにできません。'; @override - String get pushTopicFandomEventDesc => - 'イクリプス・キャンペーン・クエスト・アーティストホットタイムのお知らせです。'; + String get pushTopicFandomEventDesc => 'イクリプス・キャンペーン・クエスト・アーティストホットタイムのお知らせです。'; @override String get pushTopicBriefingDesc => '惑星の一日をまとめたブリーフィングカードをお届けします。'; @@ -1294,8 +1304,7 @@ class AppLocalizationsJa extends AppLocalizations { String get payEmpty => '決済履歴はありません。'; @override - String get payRefundGuide => - '消費型商品:購入後7日以内かつ未使用の商品は返金できます。一部でも使用した商品は返金対象外です。\nサブスク商品:決済後24時間以内に特典(追加報酬など)を未使用の場合、返金できます。\n返金承認後7〜14日以内に返金が完了します。'; + String get payRefundGuide => '消費型商品:購入後7日以内かつ未使用の商品は返金できます。一部でも使用した商品は返金対象外です。\nサブスク商品:決済後24時間以内に特典(追加報酬など)を未使用の場合、返金できます。\n返金承認後7〜14日以内に返金が完了します。'; @override String get payDetailTitle => '決済履歴の詳細'; @@ -1809,6 +1818,9 @@ class AppLocalizationsJa extends AppLocalizations { @override String get historyFounderBadge => '最初の100人記念バッジ'; + @override + String get historyHistoric => '歴史的な出来事'; + @override String historyGrowthPop(String amount) { return '成長に$amount POP反映'; @@ -1831,31 +1843,34 @@ class AppLocalizationsJa extends AppLocalizations { @override String countryName(String code) { - String _temp0 = intl.Intl.selectLogic(code, { - 'KR': '韓国', - 'JP': '日本', - 'US': 'アメリカ', - 'CN': '中国', - 'TW': '台湾', - 'HK': '香港', - 'TH': 'タイ', - 'VN': 'ベトナム', - 'ID': 'インドネシア', - 'PH': 'フィリピン', - 'MY': 'マレーシア', - 'SG': 'シンガポール', - 'IN': 'インド', - 'GB': 'イギリス', - 'FR': 'フランス', - 'DE': 'ドイツ', - 'ES': 'スペイン', - 'BR': 'ブラジル', - 'MX': 'メキシコ', - 'CA': 'カナダ', - 'AU': 'オーストラリア', - 'ZZ': '未指定', - 'other': '-', - }); + String _temp0 = intl.Intl.selectLogic( + code, + { + 'KR': '韓国', + 'JP': '日本', + 'US': 'アメリカ', + 'CN': '中国', + 'TW': '台湾', + 'HK': '香港', + 'TH': 'タイ', + 'VN': 'ベトナム', + 'ID': 'インドネシア', + 'PH': 'フィリピン', + 'MY': 'マレーシア', + 'SG': 'シンガポール', + 'IN': 'インド', + 'GB': 'イギリス', + 'FR': 'フランス', + 'DE': 'ドイツ', + 'ES': 'スペイン', + 'BR': 'ブラジル', + 'MX': 'メキシコ', + 'CA': 'カナダ', + 'AU': 'オーストラリア', + 'ZZ': '未指定', + 'other': '-', + }, + ); return '$_temp0'; } @@ -2051,8 +2066,7 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get adWarpBefore => - 'Warping...ファンダムとアーティストにもっと貢献できるよう、ぴったりの広告を探しています。'; + String get adWarpBefore => 'Warping...ファンダムとアーティストにもっと貢献できるよう、ぴったりの広告を探しています。'; @override String get adWarpAfter => 'Warping...あなたの貢献への報酬を準備しています。'; @@ -2205,8 +2219,7 @@ class AppLocalizationsJa extends AppLocalizations { String get nebulaAlreadyToday => '今日はすでに星雲を作成しました。'; @override - String get nebulaCreatedKeepPrimary => - '星雲を作成しました。メイン惑星は前回の変更から30日経過後に変更できるため、そのままです。'; + String get nebulaCreatedKeepPrimary => '星雲を作成しました。メイン惑星は前回の変更から30日経過後に変更できるため、そのままです。'; @override String get planetLeave => '脱退する'; @@ -2372,12 +2385,7 @@ class AppLocalizationsJa extends AppLocalizations { String get campaignWeekdays => '日,月,火,水,木,金,土'; @override - String campaignPeriodRange( - String startMonth, - String startDay, - String endMonth, - String endDay, - ) { + String campaignPeriodRange(String startMonth, String startDay, String endMonth, String endDay) { return '$startMonth月$startDay日 ~ $endMonth月$endDay日'; } @@ -2421,12 +2429,7 @@ class AppLocalizationsJa extends AppLocalizations { String get campaignSubmitTitle => 'この内容で投稿しますか?'; @override - String campaignSubmitBody( - String title, - String goal, - String days, - String fee, - ) { + String campaignSubmitBody(String title, String goal, String days, String fee) { return '$title · 目標 $goal POP · $days日\n登録料 $fee POP が差し引かれ、運営の審査後に支援が始まります。'; } @@ -2633,14 +2636,7 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String questCreateCost( - String title, - String reward, - String count, - String pool, - String fee, - String total, - ) { + String questCreateCost(String title, String reward, String count, String pool, String fee, String total) { return '$title\n報酬 $reward POP × $count人 = $pool POP\n手数料 $fee POP(公開時に消滅)\n合計 $total POP が差し引かれます。'; } @@ -2849,8 +2845,7 @@ class AppLocalizationsJa extends AppLocalizations { String get questCancelInReview => '審査中に取り消すと、預けた報酬POPと手数料はすべて返還されます。'; @override - String get questCancelPublished => - '公開中のクエストを取り消すと参加はすぐ締め切られ、残りの報酬POPは返還されます。手数料は返還されません。'; + String get questCancelPublished => '公開中のクエストを取り消すと参加はすぐ締め切られ、残りの報酬POPは返還されます。手数料は返還されません。'; @override String get questUnderReview => '運営の審査中です。承認されると公開されます。'; diff --git a/app/lib/l10n/app_localizations_ko.dart b/app/lib/l10n/app_localizations_ko.dart index 09ece4a..ec7bb08 100644 --- a/app/lib/l10n/app_localizations_ko.dart +++ b/app/lib/l10n/app_localizations_ko.dart @@ -63,25 +63,31 @@ class AppLocalizationsKo extends AppLocalizations { @override String authProviderLogin(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': 'Apple로 로그인', - 'google': 'Google로 로그인', - 'kakao': 'Kakao로 로그인', - 'line': 'LINE으로 로그인', - 'other': '이메일로 로그인', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': 'Apple로 로그인', + 'google': 'Google로 로그인', + 'kakao': 'Kakao로 로그인', + 'line': 'LINE으로 로그인', + 'other': '이메일로 로그인', + }, + ); return '$_temp0'; } @override String authProviderSignup(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': 'Apple로 가입하기', - 'google': 'Google로 가입하기', - 'kakao': 'Kakao로 가입하기', - 'line': 'LINE으로 가입하기', - 'other': '이메일로 가입하기', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': 'Apple로 가입하기', + 'google': 'Google로 가입하기', + 'kakao': 'Kakao로 가입하기', + 'line': 'LINE으로 가입하기', + 'other': '이메일로 가입하기', + }, + ); return '$_temp0'; } @@ -519,25 +525,31 @@ class AppLocalizationsKo extends AppLocalizations { @override String authProviderStart(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': '이메일로 시작하기', - 'kakao': '카카오로 시작하기', - 'line': 'LINE으로 시작하기', - 'apple': 'Apple로 시작하기', - 'other': 'Google로 시작하기', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': '이메일로 시작하기', + 'kakao': '카카오로 시작하기', + 'line': 'LINE으로 시작하기', + 'apple': 'Apple로 시작하기', + 'other': 'Google로 시작하기', + }, + ); return '$_temp0'; } @override String authProviderName(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': '이메일', - 'kakao': '카카오', - 'line': 'LINE', - 'apple': 'Apple', - 'other': 'Google', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': '이메일', + 'kakao': '카카오', + 'line': 'LINE', + 'apple': 'Apple', + 'other': 'Google', + }, + ); return '$_temp0'; } @@ -869,8 +881,7 @@ class AppLocalizationsKo extends AppLocalizations { String get nebulaNameTaken => '이미 사용중인 이름입니다.'; @override - String get nebulaNameInvalid => - '2~20자 한글·영문·숫자로 입력해 주세요(특수문자·이모지·연속/앞뒤 공백 불가).'; + String get nebulaNameInvalid => '2~20자 한글·영문·숫자로 입력해 주세요(특수문자·이모지·연속/앞뒤 공백 불가).'; @override String get nebulaNameHint => '팬덤 이름'; @@ -1293,8 +1304,7 @@ class AppLocalizationsKo extends AppLocalizations { String get payEmpty => '결제 내역이 없습니다.'; @override - String get payRefundGuide => - '소비형 상품 : 구매 후 7일 이내이며 사용하지 않은 상품은 환불 가능합니다. 일부라도 사용된 상품은 환불 대상에서 제외됩니다.\n구독형 상품 : 결제 후 24시간 이내 혜택 미사용(추가 보상 등) 시 환불 가능합니다.\n환불 승인 후 7-14 이내 환불 완료 처리가 됩니다.'; + String get payRefundGuide => '소비형 상품 : 구매 후 7일 이내이며 사용하지 않은 상품은 환불 가능합니다. 일부라도 사용된 상품은 환불 대상에서 제외됩니다.\n구독형 상품 : 결제 후 24시간 이내 혜택 미사용(추가 보상 등) 시 환불 가능합니다.\n환불 승인 후 7-14 이내 환불 완료 처리가 됩니다.'; @override String get payDetailTitle => '결제 내역 상세'; @@ -1480,8 +1490,7 @@ class AppLocalizationsKo extends AppLocalizations { String get tierPromptSuffix => '를 올려보세요'; @override - String get tierPassportNote => - 'Passport Tier 는 레벨과 별개인 카드 외형 등급이며 내려가지 않습니다.'; + String get tierPassportNote => 'Passport Tier 는 레벨과 별개인 카드 외형 등급이며 내려가지 않습니다.'; @override String get tierTotalContribution => '누적 기여'; @@ -1585,8 +1594,7 @@ class AppLocalizationsKo extends AppLocalizations { String get stationReason => '추천 이유 (선택)'; @override - String get stationSuggestNote => - '제안하신 링크는 운영 검토를 거쳐 등록됩니다. 검토 결과는 알림으로 알려 드립니다.'; + String get stationSuggestNote => '제안하신 링크는 운영 검토를 거쳐 등록됩니다. 검토 결과는 알림으로 알려 드립니다.'; @override String get heroGiftUnavailable => '이 선물은 현재 수령할 수 없습니다.'; @@ -1810,6 +1818,9 @@ class AppLocalizationsKo extends AppLocalizations { @override String get historyFounderBadge => '최초 100명 기념 Badge'; + @override + String get historyHistoric => '역사적 사건'; + @override String historyGrowthPop(String amount) { return '성장에 $amount POP 반영'; @@ -1832,31 +1843,34 @@ class AppLocalizationsKo extends AppLocalizations { @override String countryName(String code) { - String _temp0 = intl.Intl.selectLogic(code, { - 'KR': '대한민국', - 'JP': '일본', - 'US': '미국', - 'CN': '중국', - 'TW': '대만', - 'HK': '홍콩', - 'TH': '태국', - 'VN': '베트남', - 'ID': '인도네시아', - 'PH': '필리핀', - 'MY': '말레이시아', - 'SG': '싱가포르', - 'IN': '인도', - 'GB': '영국', - 'FR': '프랑스', - 'DE': '독일', - 'ES': '스페인', - 'BR': '브라질', - 'MX': '멕시코', - 'CA': '캐나다', - 'AU': '호주', - 'ZZ': '미지정', - 'other': '-', - }); + String _temp0 = intl.Intl.selectLogic( + code, + { + 'KR': '대한민국', + 'JP': '일본', + 'US': '미국', + 'CN': '중국', + 'TW': '대만', + 'HK': '홍콩', + 'TH': '태국', + 'VN': '베트남', + 'ID': '인도네시아', + 'PH': '필리핀', + 'MY': '말레이시아', + 'SG': '싱가포르', + 'IN': '인도', + 'GB': '영국', + 'FR': '프랑스', + 'DE': '독일', + 'ES': '스페인', + 'BR': '브라질', + 'MX': '멕시코', + 'CA': '캐나다', + 'AU': '호주', + 'ZZ': '미지정', + 'other': '-', + }, + ); return '$_temp0'; } @@ -2052,8 +2066,7 @@ class AppLocalizationsKo extends AppLocalizations { } @override - String get adWarpBefore => - 'Warping...우리 팬덤과 아티스트에 더 많은 기여를 위해 적합한 광고를 열심히 찾고 있어요.'; + String get adWarpBefore => 'Warping...우리 팬덤과 아티스트에 더 많은 기여를 위해 적합한 광고를 열심히 찾고 있어요.'; @override String get adWarpAfter => 'Warping...당신의 기여에 대한 보상을 준비하고 있어요.'; @@ -2206,8 +2219,7 @@ class AppLocalizationsKo extends AppLocalizations { String get nebulaAlreadyToday => '이미 오늘 성운을 생성하셨습니다.'; @override - String get nebulaCreatedKeepPrimary => - '성운을 만들었습니다. 기본 행성은 최근 변경 후 30일이 지나야 바꿀 수 있어 그대로 유지됩니다.'; + String get nebulaCreatedKeepPrimary => '성운을 만들었습니다. 기본 행성은 최근 변경 후 30일이 지나야 바꿀 수 있어 그대로 유지됩니다.'; @override String get planetLeave => '탈퇴하기'; @@ -2234,8 +2246,7 @@ class AppLocalizationsKo extends AppLocalizations { String get campaignStatusWithdrawn => '개설자가 철회한 캠페인입니다.'; @override - String get campaignStatusCancelled => - '운영 사유로 취소되었습니다. 등록비와 후원 POP 을 돌려드렸습니다.'; + String get campaignStatusCancelled => '운영 사유로 취소되었습니다. 등록비와 후원 POP 을 돌려드렸습니다.'; @override String get rankWindowDaily => '일간'; @@ -2374,12 +2385,7 @@ class AppLocalizationsKo extends AppLocalizations { String get campaignWeekdays => '일,월,화,수,목,금,토'; @override - String campaignPeriodRange( - String startMonth, - String startDay, - String endMonth, - String endDay, - ) { + String campaignPeriodRange(String startMonth, String startDay, String endMonth, String endDay) { return '$startMonth월 $startDay일 ~ $endMonth월 $endDay일'; } @@ -2423,12 +2429,7 @@ class AppLocalizationsKo extends AppLocalizations { String get campaignSubmitTitle => '이 내용으로 올릴까요?'; @override - String campaignSubmitBody( - String title, - String goal, - String days, - String fee, - ) { + String campaignSubmitBody(String title, String goal, String days, String fee) { return '$title · 목표 $goal POP · $days일\n등록비 $fee POP 이 빠지고 운영 검수 뒤 모금이 열립니다.'; } @@ -2635,14 +2636,7 @@ class AppLocalizationsKo extends AppLocalizations { } @override - String questCreateCost( - String title, - String reward, - String count, - String pool, - String fee, - String total, - ) { + String questCreateCost(String title, String reward, String count, String pool, String fee, String total) { return '$title\n보상 $reward POP × $count명 = $pool POP\n수수료 $fee POP (공개 시 소멸)\n총 $total POP 이 차감됩니다.'; } @@ -2848,12 +2842,10 @@ class AppLocalizationsKo extends AppLocalizations { String get questCancel => '퀘스트 취소'; @override - String get questCancelInReview => - '검수 중인 퀘스트를 취소하면 예치한 보상 POP 과 수수료를 모두 돌려드려요.'; + String get questCancelInReview => '검수 중인 퀘스트를 취소하면 예치한 보상 POP 과 수수료를 모두 돌려드려요.'; @override - String get questCancelPublished => - '공개된 퀘스트를 취소하면 참여가 바로 마감되고 남은 보상 POP 은 돌려드려요. 수수료는 돌려드리지 않아요.'; + String get questCancelPublished => '공개된 퀘스트를 취소하면 참여가 바로 마감되고 남은 보상 POP 은 돌려드려요. 수수료는 돌려드리지 않아요.'; @override String get questUnderReview => '운영 검수 중이에요. 승인되면 공개됩니다.'; @@ -2974,8 +2966,7 @@ class AppLocalizationsKo extends AppLocalizations { String get onbPermLocation => '위치'; @override - String get onbPermLocationDesc => - '위치 퀘스트의 장소 도착을 확인합니다. 위치 퀘스트를 처음 시작할 때 요청해요.'; + String get onbPermLocationDesc => '위치 퀘스트의 장소 도착을 확인합니다. 위치 퀘스트를 처음 시작할 때 요청해요.'; @override String get onbPermContinue => '계속'; diff --git a/app/lib/l10n/app_localizations_zh.dart b/app/lib/l10n/app_localizations_zh.dart index 7554db2..83aa76e 100644 --- a/app/lib/l10n/app_localizations_zh.dart +++ b/app/lib/l10n/app_localizations_zh.dart @@ -63,25 +63,31 @@ class AppLocalizationsZh extends AppLocalizations { @override String authProviderLogin(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': '通过Apple登录', - 'google': '通过Google登录', - 'kakao': '通过Kakao登录', - 'line': '通过LINE登录', - 'other': '通过邮箱登录', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': '通过Apple登录', + 'google': '通过Google登录', + 'kakao': '通过Kakao登录', + 'line': '通过LINE登录', + 'other': '通过邮箱登录', + }, + ); return '$_temp0'; } @override String authProviderSignup(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'apple': '通过Apple注册', - 'google': '通过Google注册', - 'kakao': '通过Kakao注册', - 'line': '通过LINE注册', - 'other': '通过邮箱注册', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'apple': '通过Apple注册', + 'google': '通过Google注册', + 'kakao': '通过Kakao注册', + 'line': '通过LINE注册', + 'other': '通过邮箱注册', + }, + ); return '$_temp0'; } @@ -519,25 +525,31 @@ class AppLocalizationsZh extends AppLocalizations { @override String authProviderStart(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': '使用邮箱开始', - 'kakao': '使用 Kakao 开始', - 'line': '使用 LINE 开始', - 'apple': '使用 Apple 开始', - 'other': '使用 Google 开始', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': '使用邮箱开始', + 'kakao': '使用 Kakao 开始', + 'line': '使用 LINE 开始', + 'apple': '使用 Apple 开始', + 'other': '使用 Google 开始', + }, + ); return '$_temp0'; } @override String authProviderName(String provider) { - String _temp0 = intl.Intl.selectLogic(provider, { - 'email': '邮箱', - 'kakao': 'Kakao', - 'line': 'LINE', - 'apple': 'Apple', - 'other': 'Google', - }); + String _temp0 = intl.Intl.selectLogic( + provider, + { + 'email': '邮箱', + 'kakao': 'Kakao', + 'line': 'LINE', + 'apple': 'Apple', + 'other': 'Google', + }, + ); return '$_temp0'; } @@ -1292,8 +1304,7 @@ class AppLocalizationsZh extends AppLocalizations { String get payEmpty => '暂无支付记录。'; @override - String get payRefundGuide => - '消耗型商品:购买后 7 天内且未使用可退款,已部分使用的商品不予退款。\n订阅型商品:支付后 24 小时内未使用权益(如额外奖励)可退款。\n退款批准后 7–14 天内完成退款。'; + String get payRefundGuide => '消耗型商品:购买后 7 天内且未使用可退款,已部分使用的商品不予退款。\n订阅型商品:支付后 24 小时内未使用权益(如额外奖励)可退款。\n退款批准后 7–14 天内完成退款。'; @override String get payDetailTitle => '支付详情'; @@ -1807,6 +1818,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get historyFounderBadge => '前100名纪念徽章'; + @override + String get historyHistoric => '历史性事件'; + @override String historyGrowthPop(String amount) { return '$amount POP 计入成长'; @@ -1829,31 +1843,34 @@ class AppLocalizationsZh extends AppLocalizations { @override String countryName(String code) { - String _temp0 = intl.Intl.selectLogic(code, { - 'KR': '韩国', - 'JP': '日本', - 'US': '美国', - 'CN': '中国', - 'TW': '台湾', - 'HK': '香港', - 'TH': '泰国', - 'VN': '越南', - 'ID': '印度尼西亚', - 'PH': '菲律宾', - 'MY': '马来西亚', - 'SG': '新加坡', - 'IN': '印度', - 'GB': '英国', - 'FR': '法国', - 'DE': '德国', - 'ES': '西班牙', - 'BR': '巴西', - 'MX': '墨西哥', - 'CA': '加拿大', - 'AU': '澳大利亚', - 'ZZ': '未指定', - 'other': '-', - }); + String _temp0 = intl.Intl.selectLogic( + code, + { + 'KR': '韩国', + 'JP': '日本', + 'US': '美国', + 'CN': '中国', + 'TW': '台湾', + 'HK': '香港', + 'TH': '泰国', + 'VN': '越南', + 'ID': '印度尼西亚', + 'PH': '菲律宾', + 'MY': '马来西亚', + 'SG': '新加坡', + 'IN': '印度', + 'GB': '英国', + 'FR': '法国', + 'DE': '德国', + 'ES': '西班牙', + 'BR': '巴西', + 'MX': '墨西哥', + 'CA': '加拿大', + 'AU': '澳大利亚', + 'ZZ': '未指定', + 'other': '-', + }, + ); return '$_temp0'; } @@ -2368,12 +2385,7 @@ class AppLocalizationsZh extends AppLocalizations { String get campaignWeekdays => '日,一,二,三,四,五,六'; @override - String campaignPeriodRange( - String startMonth, - String startDay, - String endMonth, - String endDay, - ) { + String campaignPeriodRange(String startMonth, String startDay, String endMonth, String endDay) { return '$startMonth月$startDay日 ~ $endMonth月$endDay日'; } @@ -2417,12 +2429,7 @@ class AppLocalizationsZh extends AppLocalizations { String get campaignSubmitTitle => '按此内容提交吗?'; @override - String campaignSubmitBody( - String title, - String goal, - String days, - String fee, - ) { + String campaignSubmitBody(String title, String goal, String days, String fee) { return '$title · 目标 $goal POP · $days天\n将扣除 $fee POP 登记费,运营审核后开放筹集。'; } @@ -2629,14 +2636,7 @@ class AppLocalizationsZh extends AppLocalizations { } @override - String questCreateCost( - String title, - String reward, - String count, - String pool, - String fee, - String total, - ) { + String questCreateCost(String title, String reward, String count, String pool, String fee, String total) { return '$title\n奖励 $reward POP × $count人 = $pool POP\n手续费 $fee POP(发布时销毁)\n共扣除 $total POP。'; } diff --git a/app/lib/l10n/app_zh.arb b/app/lib/l10n/app_zh.arb index cad4752..1717f10 100644 --- a/app/lib/l10n/app_zh.arb +++ b/app/lib/l10n/app_zh.arb @@ -544,6 +544,7 @@ "historyEclipseSuccess": "参与日食防御成功", "historyEmblemEvolution": "进化纪念徽章", "historyFounderBadge": "前100名纪念徽章", + "historyHistoric": "历史性事件", "historyGrowthPop": "{amount} POP 计入成长", "historyJoined": "你参与了这次进化", "historyLoadFailed": "无法加载记录。", diff --git a/app/lib/l10n/remote_app_localizations.dart b/app/lib/l10n/remote_app_localizations.dart index e7444f8..9cbe7c5 100644 --- a/app/lib/l10n/remote_app_localizations.dart +++ b/app/lib/l10n/remote_app_localizations.dart @@ -934,6 +934,9 @@ class RemoteAppLocalizations extends AppLocalizations { @override String get historyHibernation => _remote['historyHibernation'] ?? _base.historyHibernation; + @override + String get historyHistoric => _remote['historyHistoric'] ?? _base.historyHistoric; + @override String get historyJoined => _remote['historyJoined'] ?? _base.historyJoined; diff --git a/app/test/eclipse_warning_shield_test.dart b/app/test/eclipse_warning_shield_test.dart new file mode 100644 index 0000000..f11bdc0 --- /dev/null +++ b/app/test/eclipse_warning_shield_test.dart @@ -0,0 +1,134 @@ +import 'dart:async'; +import 'dart:math' as math; + +import 'package:fancake/core/data/repositories.dart' + show eclipseLook, eclipseWarnWindow; +import 'package:fancake/core/theme/app_theme.dart'; +import 'package:fancake/core/ui/planet_25d.dart'; +import 'package:fancake/features/eclipse/eclipse_data.dart'; +import 'package:fancake/features/eclipse/eclipse_defend_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'eclipse_stubs.dart'; + +/// UX·FX v1.5 §5 사전 경고 「그림자 접근」 · §5.1 「끊어진 Ring → 완전한 Shield」 +/// (진척현황 부록 B-3 5-1 · 5-4). +void main() { + final warn = DateTime(2026, 10, 8, 7, 47); + final start = DateTime(2026, 10, 8, 7, 50); + + test('그림자 접근 진행 — 경고 시각 0 → 발생 시각 1, 경고 전 · 창 없음은 null', () { + expect(eclipseApproach(null, start, warn), isNull); + expect(eclipseApproach(warn, start, warn.subtract(const Duration(seconds: 1))), isNull); + expect(eclipseApproach(warn, start, warn), 0); + expect(eclipseApproach(warn, start, warn.add(const Duration(seconds: 90))), 0.5); + expect( + eclipseApproach(warn, start, start.add(const Duration(seconds: 3))), + 1, + reason: '서버가 회차를 열기 전 지연 동안 그림자가 빠지지 않는다', + ); + }); + + test('경보 단계 회차 — 이클립스 감소가 아니라 경고 창만', () { + final scheduled = EclipseState( + fandomId: 'bts', + eclipseId: 'ecl-2', + fandomName: 'BTS', + erosionRate: 0, + defense: 0, + targetDefense: 10, + defenseCount: 0, + defended: false, + scheduled: true, + warnAt: warn, + startAt: start, + endsAt: start.add(const Duration(seconds: 60)), + ); + expect(eclipseLook(scheduled, warn), (false, false, null)); + expect(eclipseWarnWindow(scheduled), (warn, start)); + expect(eclipseWarnWindow(eclipseFixture()), isNull, reason: '진행 중 회차'); + expect(eclipseWarnWindow(null), isNull); + }); + + group('행성 그림자', () { + Widget planet({DateTime? warnAt, DateTime? startAt, bool eclipsed = false}) => + MaterialApp( + home: Center( + child: Planet25D( + image: 'assets/figma/planet-home.png', + size: 200, + stage: 3, + isEclipsed: eclipsed, + eclipseWarnAt: warnAt, + eclipseStartAt: startAt, + ), + ), + ); + final now = DateTime.now(); + final w = now.subtract(const Duration(seconds: 90)); + final s = now.add(const Duration(seconds: 90)); + + testWidgets('경고 창 안이면 그림자를 그린다', (tester) async { + await tester.pumpWidget(planet(warnAt: w, startAt: s)); + expect(find.byKey(const ValueKey('eclipse-shadow')), findsOneWidget); + }); + + testWidgets('경고가 없거나 이미 이클립스 진행 중이면 그리지 않는다', (tester) async { + await tester.pumpWidget(planet()); + expect(find.byKey(const ValueKey('eclipse-shadow')), findsNothing); + await tester.pumpWidget(planet(warnAt: w, startAt: s, eclipsed: true)); + expect(find.byKey(const ValueKey('eclipse-shadow')), findsNothing); + }); + }); + + test('Shield Ring — 처음엔 끊어진 조각, 참여자만큼 이어지고 목표 달성이면 원 하나', () { + const slot = 2 * math.pi / shieldSegments; + final broken = shieldArcs(0); + expect(broken, hasLength(shieldSegments)); + expect(broken.first.$2, closeTo(slot * 0.5, 1e-9)); + expect(shieldArcs(0.5).first.$2, closeTo(slot * 0.75, 1e-9)); + expect(shieldArcs(0.99).first.$2, lessThan(slot)); + expect(shieldArcs(1), [(-math.pi / 2, 2 * math.pi)]); + }); + + testWidgets('방어 화면 Shield 는 서버 고유 참여자 / 목표 비율을 따른다', (tester) async { + tester.view.physicalSize = const Size(1080, 2400); + tester.view.devicePixelRatio = 2; + addTearDown(tester.view.reset); + final shakes = StreamController.broadcast(); + addTearDown(shakes.close); + final repo = FakeEclipseRepository( + state: eclipseFixture( + defense: 3, + targetDefense: 4, + startAt: DateTime.now().subtract(const Duration(seconds: 1)), + endsAt: DateTime.now().add(const Duration(seconds: 59)), + ), + ); + addTearDown(repo.dispose); + await tester.pumpWidget( + MaterialApp( + theme: buildAppTheme(), + home: EclipseDefendScreen( + repository: repo, + fandomId: 'bts', + shakes: () => shakes.stream, + ), + ), + ); + for (var i = 0; i < 6; i++) { + await tester.pump(const Duration(milliseconds: 120)); + } + final ring = tester + .widgetList(find.descendant( + of: find.byKey(const ValueKey('shield-ring')), + matching: find.byType(CustomPaint), + )) + .map((p) => p.painter) + .whereType() + .single; + expect(ring.progress, 0.75); + await tester.pumpWidget(const SizedBox()); + }); +} diff --git a/app/test/home_screen_test.dart b/app/test/home_screen_test.dart index b6c88b8..9ff2715 100644 --- a/app/test/home_screen_test.dart +++ b/app/test/home_screen_test.dart @@ -359,6 +359,16 @@ void main() { expect(find.text('NEWS'), findsNothing); }); + testWidgets('B-3 8-4 — 카드 줄에 출처명 · 게시시각이 보인다(상세 시트를 열지 않아도)', (tester) async { + await tester.pumpWidget(MaterialApp( + theme: buildAppTheme(), + home: Scaffold(body: BriefingList(items: [_brief('출처가 보이는 줄')])), + )); + expect(find.text('연합뉴스 · ${briefingStamp(DateTime(2026, 9, 14, 8))}'), findsOneWidget); + expect(briefingStamp(DateTime(2026, 9, 4, 7, 5)), '2026.09.04 07:05'); + expect(find.text('AI 요약'), findsNothing); + }); + testWidgets('줄을 누르면 B-75 5 요소 상세가 뜨고, 원문 보기로 나간다', (tester) async { final opened = []; tester.view.physicalSize = const Size(1080, 2400); diff --git a/app/test/planet_history_test.dart b/app/test/planet_history_test.dart index 255b3f4..a010560 100644 --- a/app/test/planet_history_test.dart +++ b/app/test/planet_history_test.dart @@ -48,20 +48,34 @@ class _Backend extends Backend { class _PersonalHistory extends SamplePlanetRepository { final scopes = []; @override - Future history({String? cursor, bool personal = false}) async { + Future history({ + String? cursor, + bool personal = false, + }) async { scopes.add(personal); - return PlanetHistoryPage(items: [PlanetHistoryEntry( - id: 'one', kind: personal ? PlanetHistoryKind.zap : PlanetHistoryKind.evolution, - occurredAt: DateTime.utc(2026, 9, 22), fromStage: personal ? null : 1, - toStage: personal ? null : 2, amount: personal ? 37 : null, - )], nextCursor: personal ? null : 'older'); + return PlanetHistoryPage( + items: [ + PlanetHistoryEntry( + id: 'one', + kind: personal ? PlanetHistoryKind.zap : PlanetHistoryKind.evolution, + occurredAt: DateTime.utc(2026, 9, 22), + fromStage: personal ? null : 1, + toStage: personal ? null : 2, + amount: personal ? 37 : null, + ), + ], + nextCursor: personal ? null : 'older', + ); } } class _History extends SamplePlanetRepository { final cursors = []; @override - Future history({String? cursor, bool personal = false}) async { + Future history({ + String? cursor, + bool personal = false, + }) async { cursors.add(cursor); if (cursors.length == 2) throw StateError('private details'); return PlanetHistoryPage( @@ -83,9 +97,11 @@ class _History extends SamplePlanetRepository { void main() { testWidgets('내 활동 전환은 이전 목록과 커서를 지우고 실제 성장량을 표시한다', (tester) async { final repository = _PersonalHistory(); - await tester.pumpWidget(MaterialApp(home: PlanetHistoryScreen( - repository: repository, fandomName: '팬덤', - ))); + await tester.pumpWidget( + MaterialApp( + home: PlanetHistoryScreen(repository: repository, fandomName: '팬덤'), + ), + ); await tester.pumpAndSettle(); await tester.tap(find.text('내 활동')); await tester.pumpAndSettle(); @@ -101,10 +117,15 @@ void main() { const repository = SamplePlanetRepository(); final states = StreamController.broadcast(); addTearDown(states.close); - await tester.pumpWidget(MaterialApp(home: PlanetDetailScreen( - repository: repository, eclipse: const NoEclipseRepository(), - watchPlanet: (_) => states.stream, - ))); + await tester.pumpWidget( + MaterialApp( + home: PlanetDetailScreen( + repository: repository, + eclipse: const NoEclipseRepository(), + watchPlanet: (_) => states.stream, + ), + ), + ); await tester.pumpAndSettle(); states.add(const PlanetVisualState(stage: 1)); await tester.pumpAndSettle(); @@ -114,7 +135,12 @@ void main() { await tester.pump(const Duration(seconds: 4)); await tester.tap(find.text('PASSPORT 기록 보기')); await tester.pumpAndSettle(); - expect(tester.widget(find.byType(PlanetHistoryScreen)).repository, same(repository)); + expect( + tester + .widget(find.byType(PlanetHistoryScreen)) + .repository, + same(repository), + ); await tester.pumpWidget(const SizedBox()); }); @@ -131,26 +157,54 @@ void main() { 'nextCursor': null, }; await expectLater(repository.history(), throwsStateError); - backend.response = {'items': [{'id': 'zap', 'kind': 'zap', - 'occurredAt': '2026-09-22T00:00:00Z', 'amount': 37, 'participationConfirmed': true}], 'nextCursor': null}; + backend.response = { + 'items': [ + { + 'id': 'zap', + 'kind': 'zap', + 'occurredAt': '2026-09-22T00:00:00Z', + 'amount': 37, + 'participationConfirmed': true, + }, + ], + 'nextCursor': null, + }; final personal = await repository.history(personal: true); expect(backend.payload, {'fandomId': 'target', 'scope': 'personal'}); expect(personal.items.single.amount, 37); expect(personal.items.single.participationConfirmed, isFalse); // PASSPORT Stamp 는 내 기록에서만 받는다(FX §5.2 · §7.2). - backend.response = {'items': [ - {'id': 'e', 'kind': 'eclipse_success', 'occurredAt': '2026-09-23T00:00:00Z'}, - {'id': 'v', 'kind': 'emblem_evolution', 'occurredAt': '2026-09-22T00:00:00Z', 'toStage': 3}, - {'id': 'f', 'kind': 'badge_founder100', 'occurredAt': '2026-09-21T00:00:00Z', 'memberNo': 7}, - ], 'nextCursor': null}; + backend.response = { + 'items': [ + { + 'id': 'e', + 'kind': 'eclipse_success', + 'occurredAt': '2026-09-23T00:00:00Z', + }, + { + 'id': 'v', + 'kind': 'emblem_evolution', + 'occurredAt': '2026-09-22T00:00:00Z', + 'toStage': 3, + }, + { + 'id': 'f', + 'kind': 'badge_founder100', + 'occurredAt': '2026-09-21T00:00:00Z', + 'memberNo': 7, + }, + ], + 'nextCursor': null, + }; final stamps = await repository.history(personal: true); expect(stamps.items.map((i) => i.kind), [ - PlanetHistoryKind.eclipseSuccess, PlanetHistoryKind.emblemEvolution, PlanetHistoryKind.founderBadge, + PlanetHistoryKind.eclipseSuccess, + PlanetHistoryKind.emblemEvolution, + PlanetHistoryKind.founderBadge, ]); expect(stamps.items[1].toStage, 3); expect(stamps.items[2].memberNo, 7); await expectLater(repository.history(), throwsStateError); - }); testWidgets('행성 상세에서 같은 저장소의 팬덤 역사를 연다', (tester) async { @@ -211,4 +265,31 @@ void main() { expect(find.text('아직 기록된 팬덤 역사가 없습니다.'), findsOneWidget); expect(find.text('다시 시도'), findsNothing); }); + + test('UX·FX §7.2 — 진화 · Eclipse 성공 · 기념 Badge 만 역사적 사건', () { + expect(PlanetHistoryKind.values.where((k) => k.isHistoric).toSet(), { + PlanetHistoryKind.evolution, + PlanetHistoryKind.eclipseSuccess, + PlanetHistoryKind.emblemEvolution, + PlanetHistoryKind.founderBadge, + }); + }); + + testWidgets('역사적 사건 줄에만 「역사적 사건」 표지가 붙는다', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: PlanetHistoryScreen( + repository: _PersonalHistory(), + fandomName: '팬덤', + ), + ), + ); + await tester.pumpAndSettle(); + expect(find.text('Stage 1 → 2 진화'), findsOneWidget); + expect(find.text('역사적 사건'), findsOneWidget); + await tester.tap(find.text('내 활동')); + await tester.pumpAndSettle(); + expect(find.text('ZAP 기여'), findsOneWidget); + expect(find.text('역사적 사건'), findsNothing); + }); }