feat: 다국어 지원 및 다중 통화 환율 변환 기능 확대

- ExchangeRateService에 JPY, CNY 환율 지원 추가
- 구독 서비스별 다국어 표시 이름 지원
- 분석 화면 차트 및 UI/UX 개선
- 설정 화면 전면 리팩토링
- SMS 스캔 기능 사용성 개선
- 전체 앱 다국어 번역 확대

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
JiWoong Sul
2025-07-16 17:34:32 +09:00
parent 4d1c0f5dab
commit 0f0b02bf08
55 changed files with 4100 additions and 1197 deletions

View File

@@ -3,6 +3,7 @@ import '../../controllers/detail_screen_controller.dart';
import '../../theme/app_colors.dart';
import '../common/form_fields/base_text_field.dart';
import '../common/buttons/secondary_button.dart';
import '../../l10n/app_localizations.dart';
/// 웹사이트 URL 섹션
/// 서비스 웹사이트 URL과 해지 관련 정보를 관리하는 섹션입니다.
@@ -69,9 +70,9 @@ class DetailUrlSection extends StatelessWidget {
),
),
const SizedBox(width: 12),
const Text(
'웹사이트 정보',
style: TextStyle(
Text(
AppLocalizations.of(context).websiteInfo,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.w700,
color: AppColors.darkNavy,
@@ -85,8 +86,8 @@ class DetailUrlSection extends StatelessWidget {
BaseTextField(
controller: controller.websiteUrlController,
focusNode: controller.websiteUrlFocus,
label: '웹사이트 URL',
hintText: 'https://example.com',
label: AppLocalizations.of(context).websiteUrl,
hintText: AppLocalizations.of(context).urlExample,
keyboardType: TextInputType.url,
prefixIcon: Icon(
Icons.link_rounded,
@@ -120,7 +121,7 @@ class DetailUrlSection extends StatelessWidget {
),
const SizedBox(width: 8),
Text(
'해지 안내',
AppLocalizations.of(context).cancelGuide,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
@@ -131,7 +132,7 @@ class DetailUrlSection extends StatelessWidget {
),
const SizedBox(height: 8),
Text(
'이 서비스를 해지하려면 아래 링크를 통해 해지 페이지로 이동하세요.',
AppLocalizations.of(context).cancelServiceGuide,
style: TextStyle(
fontSize: 14,
color: AppColors.darkNavy,
@@ -141,7 +142,7 @@ class DetailUrlSection extends StatelessWidget {
),
const SizedBox(height: 12),
TextLinkButton(
text: '해지 페이지로 이동',
text: AppLocalizations.of(context).goToCancelPage,
icon: Icons.open_in_new_rounded,
onPressed: controller.openCancellationPage,
color: AppColors.warningColor,
@@ -174,7 +175,7 @@ class DetailUrlSection extends StatelessWidget {
const SizedBox(width: 8),
Expanded(
child: Text(
'URL이 비어있으면 서비스명을 기반으로 자동 매칭됩니다',
AppLocalizations.of(context).urlAutoMatchInfo,
style: TextStyle(
fontSize: 14,
color: AppColors.darkNavy,