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>
This commit is contained in:
136
lib/l10n/app_localizations.dart
Normal file
136
lib/l10n/app_localizations.dart
Normal file
@@ -0,0 +1,136 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user