# Localization Extensions - Quick Start Guide ## Using Localization in the Worker App This file demonstrates how to use the localization utilities in the Worker Flutter app. ## Basic Usage ### 1. Import the Extension ```dart import 'package:worker/core/utils/l10n_extensions.dart'; ``` ### 2. Access Translations ```dart // In any widget with BuildContext class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [ Text(context.l10n.home), // "Trang chủ" or "Home" Text(context.l10n.products), // "Sản phẩm" or "Products" Text(context.l10n.loyalty), // "Hội viên" or "Loyalty" ], ); } } ``` ## Helper Functions ### Date and Time ```dart // Format date final dateStr = L10nHelper.formatDate(context, DateTime.now()); // Vietnamese: "17/10/2025" // English: "10/17/2025" // Format date-time final dateTimeStr = L10nHelper.formatDateTime(context, DateTime.now()); // Vietnamese: "17/10/2025 lúc 14:30" // English: "10/17/2025 at 14:30" // Relative time final relativeTime = L10nHelper.formatRelativeTime( context, DateTime.now().subtract(Duration(minutes: 5)), ); // Vietnamese: "5 phút trước" // English: "5 minutes ago" ``` ### Currency ```dart // Format Vietnamese Dong final price = L10nHelper.formatCurrency(context, 1500000); // Vietnamese: "1.500.000 ₫" // English: "1,500,000 ₫" ``` ### Status Helpers ```dart // Get localized order status final status = L10nHelper.getOrderStatus(context, 'pending'); // Vietnamese: "Chờ xử lý" // English: "Pending" // Get localized project status final projectStatus = L10nHelper.getProjectStatus(context, 'in_progress'); // Vietnamese: "Đang thực hiện" // English: "In Progress" // Get localized member tier final tier = L10nHelper.getMemberTier(context, 'diamond'); // Vietnamese: "Kim cương" // English: "Diamond" // Get localized user type final userType = L10nHelper.getUserType(context, 'contractor'); // Vietnamese: "Thầu thợ" // English: "Contractor" ``` ### Counts with Pluralization ```dart // Format points with sign final points = L10nHelper.formatPoints(context, 100); // Vietnamese: "+100 điểm" // English: "+100 points" // Format item count final items = L10nHelper.formatItemCount(context, 5); // Vietnamese: "5 sản phẩm" // English: "5 items" // Format order count final orders = L10nHelper.formatOrderCount(context, 3); // Vietnamese: "3 đơn hàng" // English: "3 orders" // Format project count final projects = L10nHelper.formatProjectCount(context, 2); // Vietnamese: "2 công trình" // English: "2 projects" // Format days remaining final days = L10nHelper.formatDaysRemaining(context, 7); // Vietnamese: "Còn 7 ngày" // English: "7 days left" ``` ## Context Extensions ### Language Checks ```dart // Get current language code final languageCode = context.languageCode; // "vi" or "en" // Check if Vietnamese if (context.isVietnamese) { // Do something specific for Vietnamese } // Check if English if (context.isEnglish) { // Do something specific for English } ``` ## Parameterized Translations ```dart // Simple parameter final welcome = context.l10n.welcomeTo('Worker App'); // Vietnamese: "Chào mừng đến với Worker App" // English: "Welcome to Worker App" // Multiple parameters final message = context.l10n.pointsToNextTier(500, 'Platinum'); // Vietnamese: "Còn 500 điểm để lên hạng Platinum" // English: "500 points to reach Platinum" // Order number final orderNum = context.l10n.orderNumberIs('ORD-2024-001'); // Vietnamese: "Số đơn hàng: ORD-2024-001" // English: "Order Number: ORD-2024-001" // Redeem confirmation final confirm = context.l10n.redeemConfirmMessage(500, 'Gift Voucher'); // Vietnamese: "Bạn có chắc chắn muốn đổi 500 điểm để nhận Gift Voucher?" // English: "Are you sure you want to redeem 500 points for Gift Voucher?" ``` ## Complete Example ```dart import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:worker/core/utils/l10n_extensions.dart'; class OrderDetailPage extends ConsumerWidget { final Order order; const OrderDetailPage({required this.order}); @override Widget build(BuildContext context, WidgetRef ref) { return Scaffold( appBar: AppBar( title: Text(context.l10n.orderDetails), ), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Order number Text( context.l10n.orderNumberIs(order.orderNumber), style: Theme.of(context).textTheme.titleLarge, ), const SizedBox(height: 8), // Order date Text( '${context.l10n.orderDate}: ${L10nHelper.formatDate(context, order.createdAt)}', ), const SizedBox(height: 8), // Order status Row( children: [ Text(context.l10n.orderStatus + ': '), Chip( label: Text( L10nHelper.getOrderStatus(context, order.status), ), ), ], ), const SizedBox(height: 16), // Items count Text( L10nHelper.formatItemCount(context, order.items.length), style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: 16), // Total amount Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( context.l10n.total, style: Theme.of(context).textTheme.titleMedium, ), Text( L10nHelper.formatCurrency(context, order.total), style: Theme.of(context).textTheme.titleLarge?.copyWith( color: Theme.of(context).colorScheme.primary, fontWeight: FontWeight.bold, ), ), ], ), const SizedBox(height: 24), // Relative time Text( '${context.l10n.orderPlacedAt} ${L10nHelper.formatRelativeTime(context, order.createdAt)}', style: Theme.of(context).textTheme.bodySmall, ), ], ), ), ); } } ``` ## Best Practices 1. **Always use `context.l10n` instead of `AppLocalizations.of(context)!`** - Shorter and cleaner - Consistent throughout the codebase 2. **Use helper functions for formatting** - `L10nHelper.formatCurrency()` instead of manual formatting - `L10nHelper.formatDate()` for locale-aware dates - `L10nHelper.getOrderStatus()` for localized status strings 3. **Check language when needed** - Use `context.isVietnamese` and `context.isEnglish` - Useful for conditional rendering or logic 4. **Never hard-code strings** - Always use translation keys - Supports both Vietnamese and English automatically 5. **Test both languages** - Switch device language to test - Verify text fits in UI for both languages ## See Also - Full documentation: `/Users/ssg/project/worker/LOCALIZATION.md` - Vietnamese translations: `/Users/ssg/project/worker/lib/l10n/app_vi.arb` - English translations: `/Users/ssg/project/worker/lib/l10n/app_en.arb` - Helper source code: `/Users/ssg/project/worker/lib/core/utils/l10n_extensions.dart`