Files
submanager/lib/l10n/app_localizations.dart
JiWoong Sul 8619e96739 Initial commit: SubManager Flutter App
주요 구현 완료 기능:
- 구독 관리 (추가/편집/삭제/카테고리 분류)
- 이벤트 할인 시스템 (기본값 자동 설정)
- SMS 자동 스캔 및 구독 정보 추출
- 알림 시스템 (타임존 처리 안정화)
- 환율 변환 지원 (KRW/USD)
- 반응형 UI 및 애니메이션
- 다국어 지원 (한국어/영어)

버그 수정:
- NotificationService tz.local 초기화 오류 해결
- MainScreenSummaryCard 레이아웃 오버플로우 수정
- 구독 추가 시 LateInitializationError 완전 해결

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09 14:29:53 +09:00

137 lines
5.4 KiB
Dart

import 'package:flutter/material.dart';
class AppLocalizations {
final Locale locale;
AppLocalizations(this.locale);
static AppLocalizations of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
}
static const _localizedValues = <String, Map<String, String>>{
'en': {
'appTitle': 'SubManager',
'subscriptionManagement': 'Subscription Management',
'addSubscription': 'Add Subscription',
'subscriptionName': 'Service Name',
'monthlyCost': 'Monthly Cost',
'billingCycle': 'Billing Cycle',
'nextBillingDate': 'Next Billing Date',
'save': 'Save',
'cancel': 'Cancel',
'delete': 'Delete',
'edit': 'Edit',
'totalSubscriptions': 'Total Subscriptions',
'totalMonthlyExpense': 'Total Monthly Expense',
'noSubscriptions': 'No subscriptions registered',
'addSubscriptionNow': 'Add Subscription Now',
'paymentReminder': 'Payment Reminder',
'expirationReminder': 'Expiration Reminder',
'daysLeft': 'days left',
'categoryManagement': 'Category Management',
'categoryName': 'Category Name',
'selectColor': 'Select Color',
'selectIcon': 'Select Icon',
'addCategory': 'Add Category',
'settings': 'Settings',
'darkMode': 'Dark Mode',
'language': 'Language',
'notifications': 'Notifications',
'appLock': 'App Lock',
},
'ko': {
'appTitle': '구독 관리',
'subscriptionManagement': '구독 관리',
'addSubscription': '구독 추가',
'subscriptionName': '서비스명',
'monthlyCost': '월 비용',
'billingCycle': '결제 주기',
'nextBillingDate': '다음 결제일',
'save': '저장',
'cancel': '취소',
'delete': '삭제',
'edit': '수정',
'totalSubscriptions': '총 구독',
'totalMonthlyExpense': '이번 달 총 지출',
'noSubscriptions': '등록된 구독 서비스가 없습니다',
'addSubscriptionNow': '구독 추가하기',
'paymentReminder': '결제 예정 알림',
'expirationReminder': '만료 예정 알림',
'daysLeft': '일 남음',
'categoryManagement': '카테고리 관리',
'categoryName': '카테고리 이름',
'selectColor': '색상 선택',
'selectIcon': '아이콘 선택',
'addCategory': '카테고리 추가',
'settings': '설정',
'darkMode': '다크 모드',
'language': '언어',
'notifications': '알림',
'appLock': '앱 잠금',
},
};
String get appTitle => _localizedValues[locale.languageCode]!['appTitle']!;
String get subscriptionManagement =>
_localizedValues[locale.languageCode]!['subscriptionManagement']!;
String get addSubscription =>
_localizedValues[locale.languageCode]!['addSubscription']!;
String get subscriptionName =>
_localizedValues[locale.languageCode]!['subscriptionName']!;
String get monthlyCost =>
_localizedValues[locale.languageCode]!['monthlyCost']!;
String get billingCycle =>
_localizedValues[locale.languageCode]!['billingCycle']!;
String get nextBillingDate =>
_localizedValues[locale.languageCode]!['nextBillingDate']!;
String get save => _localizedValues[locale.languageCode]!['save']!;
String get cancel => _localizedValues[locale.languageCode]!['cancel']!;
String get delete => _localizedValues[locale.languageCode]!['delete']!;
String get edit => _localizedValues[locale.languageCode]!['edit']!;
String get totalSubscriptions =>
_localizedValues[locale.languageCode]!['totalSubscriptions']!;
String get totalMonthlyExpense =>
_localizedValues[locale.languageCode]!['totalMonthlyExpense']!;
String get noSubscriptions =>
_localizedValues[locale.languageCode]!['noSubscriptions']!;
String get addSubscriptionNow =>
_localizedValues[locale.languageCode]!['addSubscriptionNow']!;
String get paymentReminder =>
_localizedValues[locale.languageCode]!['paymentReminder']!;
String get expirationReminder =>
_localizedValues[locale.languageCode]!['expirationReminder']!;
String get daysLeft => _localizedValues[locale.languageCode]!['daysLeft']!;
String get categoryManagement =>
_localizedValues[locale.languageCode]!['categoryManagement']!;
String get categoryName =>
_localizedValues[locale.languageCode]!['categoryName']!;
String get selectColor =>
_localizedValues[locale.languageCode]!['selectColor']!;
String get selectIcon =>
_localizedValues[locale.languageCode]!['selectIcon']!;
String get addCategory =>
_localizedValues[locale.languageCode]!['addCategory']!;
String get settings => _localizedValues[locale.languageCode]!['settings']!;
String get darkMode => _localizedValues[locale.languageCode]!['darkMode']!;
String get language => _localizedValues[locale.languageCode]!['language']!;
String get notifications =>
_localizedValues[locale.languageCode]!['notifications']!;
String get appLock => _localizedValues[locale.languageCode]!['appLock']!;
}
class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
const AppLocalizationsDelegate();
@override
bool isSupported(Locale locale) => ['en', 'ko'].contains(locale.languageCode);
@override
Future<AppLocalizations> load(Locale locale) async {
return AppLocalizations(locale);
}
@override
bool shouldReload(AppLocalizationsDelegate old) => false;
}