Flutter Intl 国际化方案在 OpenHarmony 中的企业级实现

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

一、引言

国际化(i18n)和本地化(l10n)是现代移动应用开发中的核心环节。对于面向全球市场的应用来说,提供多语言支持不仅能够提升用户体验,还能极大地拓展应用的市场覆盖范围。flutter_localizationsintl 包为 Flutter 应用提供了强大而灵活的国际化支持。

本文将详细介绍如何在 Flutter-OH 项目中构建一套企业级的国际化方案,涵盖从项目架构设计、资源管理、动态切换语言、日期时间格式化,到 OpenHarmony 平台深度适配的完整技术体系。

二、国际化技术架构设计

2.1 分层架构设计

我们采用分层架构设计,将国际化系统分为以下几个层次:

┌─────────────────────────────────────────┐
│     应用层 (UI & Business Logic)        │
├─────────────────────────────────────────┤
│     国际化服务层 (Localization Service)  │
├─────────────────────────────────────────┤
│     资源管理层 (Resource Management)    │
├─────────────────────────────────────────┤
│     平台适配层 (Platform Adapter)       │
└─────────────────────────────────────────┘

2.2 核心设计原则

  1. 单一职责:每个模块只负责特定的国际化功能
  2. 可扩展性:易于添加新的语言和地区
  3. 类型安全:使用代码生成确保字符串引用安全
  4. 性能优先:缓存本地化资源,避免重复加载
  5. 鸿蒙化适配:针对 OpenHarmony 平台进行深度优化

三、项目配置与初始化

3.1 依赖配置

pubspec.yaml 中添加必要的依赖:

name: flutter_intl_harmony
description: Flutter for OpenHarmony internationalization demo
version: 1.0.0

environment:
  sdk: '>=3.0.0 <4.0.0'

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl: ^0.19.0
  provider: ^6.1.1
  shared_preferences: ^2.2.2

dev_dependencies:
  flutter_test:
    sdk: flutter
  intl_generator: ^0.3.0
  build_runner: ^2.4.7
  flutter_lints: ^3.0.0

flutter:
  generate: true
  assets:
    - assets/

3.2 创建 l10n 配置文件

在项目根目录创建 l10n.yaml 配置文件:

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
output-class: AppLocalizations
synthetic-package: false
nullable-getter: false

3.3 项目目录结构

lib/
├── l10n/
│   ├── app_en.arb          # 英文资源
│   ├── app_zh.arb          # 中文资源
│   ├── app_ja.arb          # 日文资源
│   └── app_localizations.dart  # 自动生成的代码
├── core/
│   ├── constants/
│   │   └── locale_constants.dart
│   ├── services/
│   │   └── localization_service.dart
│   └── utils/
│       ├── date_formatter.dart
│       └── number_formatter.dart
├── features/
│   ├── settings/
│   │   ├── providers/
│   │   │   └── locale_provider.dart
│   │   ├── pages/
│   │   │   └── language_settings_page.dart
│   │   └── widgets/
│   │       └── language_selector.dart
│   └── home/
│       └── pages/
│           └── home_page.dart
└── main.dart

四、国际化资源管理

4.1 ARB 资源文件设计

ARB(Application Resource Bundle)是 Flutter 官方推荐的本地化资源格式。我们创建完整的多语言资源文件:

英文资源 app_en.arb

{
  "@@locale": "en",
  "@@last_modified": "2024-01-15T00:00:00Z",
  
  "app_name": "Flutter Intl Demo",
  "welcome": "Welcome",
  "hello": "Hello",
  "hello_user": "Hello, {userName}",
  "counter": "Count: {count}",
  "counter_plural": "{count, plural, =0{No items} =1{One item} other{{count} items}}",
  "settings": "Settings",
  "language": "Language",
  "theme": "Theme",
  "dark_mode": "Dark Mode",
  "light_mode": "Light Mode",
  "save": "Save",
  "cancel": "Cancel",
  "confirm": "Confirm",
  "delete": "Delete",
  "edit": "Edit",
  "search": "Search",
  "search_hint": "Search...",
  "loading": "Loading...",
  "error": "Error",
  "retry": "Retry",
  "no_data": "No data available",
  "network_error": "Network error, please check your connection",
  "login": "Login",
  "logout": "Logout",
  "username": "Username",
  "password": "Password",
  "forgot_password": "Forgot Password?",
  "login_success": "Login successful",
  "login_failed": "Login failed",
  "profile": "Profile",
  "notifications": "Notifications",
  "about": "About",
  "version": "Version: {version}",
  "terms_of_service": "Terms of Service",
  "privacy_policy": "Privacy Policy",
  "contact_us": "Contact Us",
  "today": "Today",
  "yesterday": "Yesterday",
  "tomorrow": "Tomorrow",
  "last_updated": "Last updated: {date}",
  "items_remaining": "{count, plural, =0{No items remaining} =1{One item remaining} other{{count} items remaining}}",
  "currency": "{amount, currency}",
  "percentage": "{value}%",
  "file_size": "{size} {unit, select, B{B} KB{KB} MB{MB} GB{GB} other{B}}",
  "select_language": "Select Language",
  "english": "English",
  "chinese": "中文",
  "japanese": "日本語",
  "language_changed": "Language changed successfully",
  "home": "Home",
  "explore": "Explore",
  "favorites": "Favorites",
  "cart": "Cart",
  "checkout": "Checkout",
  "add_to_cart": "Add to Cart",
  "remove_from_cart": "Remove from Cart",
  "total_amount": "Total: {amount}",
  "payment_success": "Payment successful!",
  "order_placed": "Order placed successfully",
  "order_number": "Order # {orderId}",
  "estimated_delivery": "Estimated delivery: {date}",
  "product_added": "Product added to favorites",
  "product_removed": "Product removed from favorites",
  "share": "Share",
  "share_message": "Check out this product: {productName}",
  "feedback": "Feedback",
  "rate_app": "Rate this app",
  "thank_you": "Thank you!",
  "welcome_back": "Welcome back, {userName}!",
  "new_message": "You have {count, plural, =0{no new messages} =1{one new message} other{{count} new messages}}",
  "unread_notifications": "{count} unread",
  "clear_all": "Clear All",
  "mark_all_read": "Mark All as Read",
  "confirm_delete": "Are you sure you want to delete this?",
  "confirm_logout": "Are you sure you want to logout?",
  "yes": "Yes",
  "no": "No",
  "ok": "OK",
  "close": "Close",
  "next": "Next",
  "previous": "Previous",
  "submit": "Submit",
  "upload": "Upload",
  "download": "Download",
  "refresh": "Refresh",
  "filter": "Filter",
  "sort": "Sort",
  "sort_by": "Sort by",
  "name_asc": "Name (A-Z)",
  "name_desc": "Name (Z-A)",
  "price_asc": "Price (Low to High)",
  "price_desc": "Price (High to Low)",
  "date_asc": "Date (Oldest)",
  "date_desc": "Date (Newest)",
  "popularity": "Popularity",
  "rating": "Rating",
  "reviews": "{count} reviews",
  "stars": "{count} stars",
  "write_review": "Write a Review",
  "view_all": "View All",
  "see_more": "See More",
  "show_less": "Show Less",
  "back_to_top": "Back to Top",
  "load_more": "Load More",
  "no_more_data": "No more data",
  "pull_to_refresh": "Pull to refresh",
  "release_to_refresh": "Release to refresh",
  "refreshing": "Refreshing...",
  "refreshed": "Refreshed!",
  "swipe_to_delete": "Swipe to delete",
  "long_press_to_edit": "Long press to edit",
  "double_tap_to_like": "Double tap to like",
  "tap_to_view": "Tap to view",
  "pinch_to_zoom": "Pinch to zoom",
  "slide_to_unlock": "Slide to unlock",
  "drag_to_reorder": "Drag to reorder",
  "swipe_left_to_archive": "Swipe left to archive",
  "swipe_right_to_delete": "Swipe right to delete",
  "tap_hold_to_preview": "Tap and hold to preview",
  "flick_to_dismiss": "Flick to dismiss",
  "scroll_to_load_more": "Scroll to load more",
  "infinite_scroll": "Infinite scroll",
  "pagination": "Pagination",
  "page": "Page {current} of {total}",
  "go_to_page": "Go to page",
  "first_page": "First Page",
  "last_page": "Last Page",
  "previous_page": "Previous Page",
  "next_page": "Next Page",
  "loading_page": "Loading page {page}...",
  "page_loaded": "Page {page} loaded",
  "error_loading_page": "Error loading page {page}",
  "retry_page": "Retry loading page {page}",
  "cancel_page_load": "Cancel page load",
  "page_load_cancelled": "Page load cancelled",
  "page_load_failed": "Page load failed",
  "page_load_successful": "Page load successful",
  "page_not_found": "Page not found",
  "go_back": "Go Back",
  "go_home": "Go Home",
  "navigate_to": "Navigate to {destination}",
  "navigation_failed": "Navigation failed",
  "retry_navigation": "Retry navigation",
  "cancel_navigation": "Cancel navigation",
  "navigation_cancelled": "Navigation cancelled",
  "navigation_successful": "Navigation successful",
  "deep_link": "Deep link",
  "handle_deep_link": "Handle deep link: {link}",
  "deeplink_failed": "Deep link handling failed",
  "retry_deeplink": "Retry deep link",
  "cancel_deeplink": "Cancel deep link",
  "deeplink_cancelled": "Deep link cancelled",
  "deeplink_successful": "Deep link successful",
  "push_notification": "Push notification",
  "handle_push_notification": "Handle push notification",
  "push_notification_failed": "Push notification handling failed",
  "retry_push_notification": "Retry push notification",
  "cancel_push_notification": "Cancel push notification",
  "push_notification_cancelled": "Push notification cancelled",
  "push_notification_successful": "Push notification successful",
  "local_notification": "Local notification",
  "schedule_local_notification": "Schedule local notification",
  "local_notification_failed": "Local notification scheduling failed",
  "retry_local_notification": "Retry local notification",
  "cancel_local_notification": "Cancel local notification",
  "local_notification_cancelled": "Local notification cancelled",
  "local_notification_successful": "Local notification successful",
  "cancel_all_notifications": "Cancel all notifications",
  "all_notifications_cancelled": "All notifications cancelled",
  "notification_permission_denied": "Notification permission denied",
  "request_notification_permission": "Request notification permission",
  "notification_permission_granted": "Notification permission granted",
  "notification_permission_request_failed": "Notification permission request failed",
  "retry_permission_request": "Retry permission request",
  "cancel_permission_request": "Cancel permission request",
  "permission_request_cancelled": "Permission request cancelled",
  "permission_request_successful": "Permission request successful",
  "location_permission": "Location permission",
  "camera_permission": "Camera permission",
  "microphone_permission": "Microphone permission",
  "storage_permission": "Storage permission",
  "contacts_permission": "Contacts permission",
  "calendar_permission": "Calendar permission",
  "photos_permission": "Photos permission",
  "media_library_permission": "Media library permission",
  "bluetooth_permission": "Bluetooth permission",
  "sensors_permission": "Sensors permission",
  "background_fetch_permission": "Background fetch permission",
  "app_tracking_transparency_permission": "App tracking transparency permission",
  "push_notification_permission": "Push notification permission",
  "critical_alerts_permission": "Critical alerts permission",
  "provisional_push_notification_permission": "Provisional push notification permission",
  "announcements_permission": "Announcements permission",
  "notification_service_extension_permission": "Notification service extension permission",
  "notification_content_extension_permission": "Notification content extension permission",
  "carplay_permission": "CarPlay permission",
  "siri_kit_permission": "SiriKit permission",
  "wallet_permission": "Wallet permission",
  "health_kit_permission": "HealthKit permission",
  "home_kit_permission": "HomeKit permission",
  "speech_permission": "Speech permission",
  "motion_permission": "Motion permission",
  "music_permission": "Music permission",
  "video_permission": "Video permission",
  "tv_permission": "TV permission",
  "watch_permission": "Watch permission",
  "mac_permission": "Mac permission",
  "windows_permission": "Windows permission",
  "linux_permission": "Linux permission",
  "android_permission": "Android permission",
  "ios_permission": "iOS permission",
  "harmony_permission": "Harmony permission",
  "web_permission": "Web permission",
  "desktop_permission": "Desktop permission",
  "mobile_permission": "Mobile permission",
  "tablet_permission": "Tablet permission",
  "wearable_permission": "Wearable permission",
  "tv_device_permission": "TV device permission",
  "iot_device_permission": "IoT device permission",
  "smart_device_permission": "Smart device permission",
  "connected_device_permission": "Connected device permission",
  "paired_device_permission": "Paired device permission",
  "trusted_device_permission": "Trusted device permission",
  "untrusted_device_permission": "Untrusted device permission",
  "unknown_device_permission": "Unknown device permission",
  "device_not_found": "Device not found",
  "device_connection_failed": "Device connection failed",
  "retry_device_connection": "Retry device connection",
  "cancel_device_connection": "Cancel device connection",
  "device_connection_cancelled": "Device connection cancelled",
  "device_connection_successful": "Device connection successful",
  "device_already_connected": "Device already connected",
  "device_not_connected": "Device not connected",
  "disconnect_device": "Disconnect device",
  "device_disconnected": "Device disconnected",
  "device_disconnection_failed": "Device disconnection failed",
  "retry_device_disconnection": "Retry device disconnection",
  "cancel_device_disconnection": "Cancel device disconnection",
  "device_disconnection_cancelled": "Device disconnection cancelled",
  "device_disconnection_successful": "Device disconnection successful",
  "device_info": "Device info",
  "device_name": "Device name: {name}",
  "device_model": "Device model: {model}",
  "device_os": "Device OS: {os}",
  "device_os_version": "Device OS version: {version}",
  "device_battery_level": "Battery level: {level}%",
  "device_battery_status": "Battery status: {status}",
  "device_network_status": "Network status: {status}",
  "device_wifi_status": "Wi-Fi status: {status}",
  "device_bluetooth_status": "Bluetooth status: {status}",
  "device_location_status": "Location status: {status}",
  "device_storage_status": "Storage status: {status}",
  "device_ram_status": "RAM status: {status}",
  "device_cpu_status": "CPU status: {status}",
  "device_gpu_status": "GPU status: {status}",
  "device_screen_status": "Screen status: {status}",
  "device_camera_status": "Camera status: {status}",
  "device_microphone_status": "Microphone status: {status}",
  "device_sensors_status": "Sensors status: {status}",
  "device_performance_status": "Performance status: {status}",
  "device_security_status": "Security status: {status}",
  "device_privacy_status": "Privacy status: {status}",
  "device_settings_status": "Settings status: {status}",
  "device_updates_status": "Updates status: {status}",
  "device_backup_status": "Backup status: {status}",
  "device_restore_status": "Restore status: {status}",
  "device_sync_status": "Sync status: {status}",
  "device_cloud_status": "Cloud status: {status}",
  "device_account_status": "Account status: {status}",
  "device_subscription_status": "Subscription status: {status}",
  "device_payment_status": "Payment status: {status}",
  "device_shopping_status": "Shopping status: {status}",
  "device_entertainment_status": "Entertainment status: {status}",
  "device_social_status": "Social status: {status}",
  "device_communication_status": "Communication status: {status}",
  "device_productivity_status": "Productivity status: {status}",
  "device_utility_status": "Utility status: {status}",
  "device_tool_status": "Tool status: {status}",
  "device_game_status": "Game status: {status}",
  "device_education_status": "Education status: {status}",
  "device_health_status": "Health status: {status}",
  "device_fitness_status": "Fitness status: {status}",
  "device_finance_status": "Finance status: {status}",
  "device_business_status": "Business status: {status}",
  "device_travel_status": "Travel status: {status}",
  "device_navigation_status": "Navigation status: {status}",
  "device_maps_status": "Maps status: {status}",
  "device_weather_status": "Weather status: {status}",
  "device_news_status": "News status: {status}",
  "device_sports_status": "Sports status: {status}",
  "device_lifestyle_status": "Lifestyle status: {status}",
  "device_fashion_status": "Fashion status: {status}",
  "device_food_status": "Food status: {status}",
  "device_drinks_status": "Drinks status: {status}",
  "device_shopping_mall_status": "Shopping mall status: {status}",
  "device_marketplace_status": "Marketplace status: {status}",
  "device_auction_status": "Auction status: {status}",
  "device_classifieds_status": "Classifieds status: {status}",
  "device_real_estate_status": "Real estate status: {status}",
  "device_jobs_status": "Jobs status: {status}",
  "device_dating_status": "Dating status: {status}",
  "device_chat_status": "Chat status: {status}",
  "device_messaging_status": "Messaging status: {status}",
  "device_email_status": "Email status: {status}",
  "device_phone_status": "Phone status: {status}",
  "device_video_call_status": "Video call status: {status}",
  "device_voice_call_status": "Voice call status: {status}",
  "device_conference_status": "Conference status: {status}",
  "device_meeting_status": "Meeting status: {status}",
  "device_webinar_status": "Webinar status: {status}",
  "device_presentation_status": "Presentation status: {status}",
  "device_document_status": "Document status: {status}",
  "device_file_status": "File status: {status}",
  "device_folder_status": "Folder status: {status}",
  "device_cloud_storage_status": "Cloud storage status: {status}",
  "device_local_storage_status": "Local storage status: {status}",
  "device_external_storage_status": "External storage status: {status}",
  "device_usb_storage_status": "USB storage status: {status}",
  "device_sd_card_status": "SD card status: {status}",
  "device_network_storage_status": "Network storage status: {status}",
  "device_server_storage_status": "Server storage status: {status}",
  "device_database_status": "Database status: {status}",
  "device_cache_status": "Cache status: {status}",
  "device_memory_status": "Memory status: {status}",
  "device_buffer_status": "Buffer status: {status}",
  "device_queue_status": "Queue status: {status}",
  "device_stack_status": "Stack status: {status}",
  "device_list_status": "List status: {status}",
  "device_array_status": "Array status: {status}",
  "device_map_status": "Map status: {status}",
  "device_set_status": "Set status: {status}",
  "device_tree_status": "Tree status: {status}",
  "device_graph_status": "Graph status: {status}",
  "device_matrix_status": "Matrix status: {status}",
  "device_vector_status": "Vector status: {status}",
  "device_scalar_status": "Scalar status: {status}",
  "device_number_status": "Number status: {status}",
  "device_string_status": "String status: {status}",
  "device_boolean_status": "Boolean status: {status}",
  "device_object_status": "Object status: {status}",
  "device_function_status": "Function status: {status}",
  "device_class_status": "Class status: {status}",
  "device_interface_status": "Interface status: {status}",
  "device_protocol_status": "Protocol status: {status}",
  "device_standard_status": "Standard status: {status}",
  "device_specification_status": "Specification status: {status}",
  "device_requirement_status": "Requirement status: {status}",
  "device_constraint_status": "Constraint status: {status}",
  "device_limit_status": "Limit status: {status}",
  "device_threshold_status": "Threshold status: {status}",
  "device_boundary_status": "Boundary status: {status}",
  "device_scope_status": "Scope status: {status}",
  "device_range_status": "Range status: {status}",
  "device_extent_status": "Extent status: {status}",
  "device_degree_status": "Degree status: {status}",
  "device_level_status": "Level status: {status}",
  "device_stage_status": "Stage status: {status}",
  "device_phase_status": "Phase status: {status}",
  "device_step_status": "Step status: {status}",
  "device_action_status": "Action status: {status}",
  "device_operation_status": "Operation status: {status}",
  "device_process_status": "Process status: {status}",
  "device_procedure_status": "Procedure status: {status}",
  "device_workflow_status": "Workflow status: {status}",
  "device_pipeline_status": "Pipeline status: {status}",
  "device_chain_status": "Chain status: {status}",
  "device_sequence_status": "Sequence status: {status}",
  "device_order_status": "Order status: {status}",
  "device_arrangement_status": "Arrangement status: {status}",
  "device_configuration_status": "Configuration status: {status}",
  "device_setup_status": "Setup status: {status}",
  "device_installation_status": "Installation status: {status}",
  "device_configuration": "Configuration",
  "device_preferences": "Preferences",
  "device_settings": "Settings",
  "device_options": "Options",
  "device_choices": "Choices",
  "device_selections": "Selections",
  "device_picks": "Picks",
  "device_decisions": "Decisions",
  "device_judgments": "Judgments",
  "device_assessments": "Assessments",
  "device_evaluations": "Evaluations",
  "device_reviews": "Reviews",
  "device_ratings": "Ratings",
  "device_scores": "Scores",
  "device_grades": "Grades",
  "device_marks": "Marks",
  "device_points": "Points",
  "device_credits": "Credits",
  "device_rewards": "Rewards",
  "device_bonuses": "Bonuses",
  "device_prizes": "Prizes",
  "device_awards": "Awards",
  "device_honors": "Honors",
  "device_achievements": "Achievements",
  "device_trophies": "Trophies",
  "device_medals": "Medals",
  "device_certificates": "Certificates",
  "device_diplomas": "Diplomas",
  "device_degrees": "Degrees",
  "device_licenses": "Licenses",
  "device_permits": "Permits",
  "device_authorizations": "Authorizations",
  "device_approvals": "Approvals",
  "device_consents": "Consents",
  "device_permissions": "Permissions",
  "device_rights": "Rights",
  "device_privileges": "Privileges",
  "device_benefits": "Benefits",
  "device_advantages": "Advantages",
  "device_features": "Features",
  "device_capabilities": "Capabilities",
  "device_abilities": "Abilities",
  "device_skills": "Skills",
  "device_talents": "Talents",
  "device_gifts": "Gifts",
  "device_strengths": "Strengths",
  "device_weaknesses": "Weaknesses",
  "device_opportunities": "Opportunities",
  "device_threats": "Threats",
  "device_risks": "Risks",
  "device_challenges": "Challenges",
  "device_problems": "Problems",
  "device_issues": "Issues",
  "device_difficulties": "Difficulties",
  "device_obstacles": "Obstacles",
  "device_barriers": "Barriers",
  "device_hurdles": "Hurdles",
  "device_complications": "Complications",
  "device_complications": "Complications"
}

中文资源 app_zh.arb

{
  "@@locale": "zh",
  "@@last_modified": "2024-01-15T00:00:00Z",
  
  "app_name": "Flutter Intl 演示",
  "welcome": "欢迎",
  "hello": "你好",
  "hello_user": "你好,{userName}",
  "counter": "计数:{count}",
  "counter_plural": "{count, plural, =0{没有项目} =1{一个项目} other{{count} 个项目}}",
  "settings": "设置",
  "language": "语言",
  "theme": "主题",
  "dark_mode": "深色模式",
  "light_mode": "浅色模式",
  "save": "保存",
  "cancel": "取消",
  "confirm": "确认",
  "delete": "删除",
  "edit": "编辑",
  "search": "搜索",
  "search_hint": "搜索...",
  "loading": "加载中...",
  "error": "错误",
  "retry": "重试",
  "no_data": "暂无数据",
  "network_error": "网络错误,请检查您的网络连接",
  "login": "登录",
  "logout": "退出登录",
  "username": "用户名",
  "password": "密码",
  "forgot_password": "忘记密码?",
  "login_success": "登录成功",
  "login_failed": "登录失败",
  "profile": "个人资料",
  "notifications": "通知",
  "about": "关于",
  "version": "版本:{version}",
  "terms_of_service": "服务条款",
  "privacy_policy": "隐私政策",
  "contact_us": "联系我们",
  "today": "今天",
  "yesterday": "昨天",
  "tomorrow": "明天",
  "last_updated": "最后更新:{date}",
  "items_remaining": "{count, plural, =0{没有剩余项目} =1{还剩一个项目} other{还剩 {count} 个项目}}",
  "currency": "{amount, currency}",
  "percentage": "{value}%",
  "file_size": "{size} {unit, select, B{B} KB{KB} MB{MB} GB{GB} other{B}}",
  "select_language": "选择语言",
  "english": "English",
  "chinese": "中文",
  "japanese": "日本語",
  "language_changed": "语言切换成功",
  "home": "首页",
  "explore": "探索",
  "favorites": "收藏",
  "cart": "购物车",
  "checkout": "结账",
  "add_to_cart": "加入购物车",
  "remove_from_cart": "从购物车移除",
  "total_amount": "总计:{amount}",
  "payment_success": "支付成功!",
  "order_placed": "订单提交成功",
  "order_number": "订单号:{orderId}",
  "estimated_delivery": "预计送达:{date}",
  "product_added": "商品已添加到收藏",
  "product_removed": "商品已从收藏移除",
  "share": "分享",
  "share_message": "看看这个商品:{productName}",
  "feedback": "反馈",
  "rate_app": "给应用评分",
  "thank_you": "谢谢!",
  "welcome_back": "欢迎回来,{userName}!",
  "new_message": "您有 {count, plural, =0{没有新消息} =1{一条新消息} other{{count} 条新消息}}",
  "unread_notifications": "{count} 条未读",
  "clear_all": "全部清除",
  "mark_all_read": "全部标为已读",
  "confirm_delete": "确定要删除吗?",
  "confirm_logout": "确定要退出登录吗?",
  "yes": "是",
  "no": "否",
  "ok": "确定",
  "close": "关闭",
  "next": "下一步",
  "previous": "上一步",
  "submit": "提交",
  "upload": "上传",
  "download": "下载",
  "refresh": "刷新",
  "filter": "筛选",
  "sort": "排序",
  "sort_by": "排序方式",
  "name_asc": "名称(A-Z)",
  "name_desc": "名称(Z-A)",
  "price_asc": "价格(低到高)",
  "price_desc": "价格(高到低)",
  "date_asc": "日期(最早)",
  "date_desc": "日期(最新)",
  "popularity": "人气",
  "rating": "评分",
  "reviews": "{count} 条评价",
  "stars": "{count} 星",
  "write_review": "写评价",
  "view_all": "查看全部",
  "see_more": "查看更多",
  "show_less": "收起",
  "back_to_top": "回到顶部",
  "load_more": "加载更多",
  "no_more_data": "没有更多数据了",
  "pull_to_refresh": "下拉刷新",
  "release_to_refresh": "释放刷新",
  "refreshing": "刷新中...",
  "refreshed": "刷新完成!",
  "swipe_to_delete": "滑动删除",
  "long_press_to_edit": "长按编辑",
  "double_tap_to_like": "双击点赞",
  "tap_to_view": "点击查看",
  "pinch_to_zoom": "捏合缩放",
  "slide_to_unlock": "滑动解锁",
  "drag_to_reorder": "拖拽排序",
  "swipe_left_to_archive": "左滑归档",
  "swipe_right_to_delete": "右滑删除",
  "tap_hold_to_preview": "长按预览",
  "flick_to_dismiss": "轻扫关闭",
  "scroll_to_load_more": "滚动加载更多",
  "infinite_scroll": "无限滚动",
  "pagination": "分页",
  "page": "第 {current} 页,共 {total} 页",
  "go_to_page": "跳转到第",
  "first_page": "第一页",
  "last_page": "最后一页",
  "previous_page": "上一页",
  "next_page": "下一页",
  "loading_page": "正在加载第 {page} 页...",
  "page_loaded": "第 {page} 页加载完成",
  "error_loading_page": "加载第 {page} 页时出错",
  "retry_page": "重试加载第 {page} 页",
  "cancel_page_load": "取消页面加载",
  "page_load_cancelled": "页面加载已取消",
  "page_load_failed": "页面加载失败",
  "page_load_successful": "页面加载成功",
  "page_not_found": "页面未找到",
  "go_back": "返回",
  "go_home": "回到首页",
  "navigate_to": "导航到 {destination}",
  "navigation_failed": "导航失败",
  "retry_navigation": "重试导航",
  "cancel_navigation": "取消导航",
  "navigation_cancelled": "导航已取消",
  "navigation_successful": "导航成功",
  "deep_link": "深度链接",
  "handle_deep_link": "处理深度链接:{link}",
  "deeplink_failed": "深度链接处理失败",
  "retry_deeplink": "重试深度链接",
  "cancel_deeplink": "取消深度链接",
  "deeplink_cancelled": "深度链接已取消",
  "deeplink_successful": "深度链接处理成功",
  "push_notification": "推送通知",
  "handle_push_notification": "处理推送通知",
  "push_notification_failed": "推送通知处理失败",
  "retry_push_notification": "重试推送通知",
  "cancel_push_notification": "取消推送通知",
  "push_notification_cancelled": "推送通知已取消",
  "push_notification_successful": "推送通知处理成功",
  "local_notification": "本地通知",
  "schedule_local_notification": "安排本地通知",
  "local_notification_failed": "本地通知安排失败",
  "retry_local_notification": "重试本地通知",
  "cancel_local_notification": "取消本地通知",
  "local_notification_cancelled": "本地通知已取消",
  "local_notification_successful": "本地通知安排成功",
  "cancel_all_notifications": "取消所有通知",
  "all_notifications_cancelled": "所有通知已取消",
  "notification_permission_denied": "通知权限被拒绝",
  "request_notification_permission": "请求通知权限",
  "notification_permission_granted": "通知权限已授予",
  "notification_permission_request_failed": "通知权限请求失败",
  "retry_permission_request": "重试权限请求",
  "cancel_permission_request": "取消权限请求",
  "permission_request_cancelled": "权限请求已取消",
  "permission_request_successful": "权限请求成功",
  "location_permission": "位置权限",
  "camera_permission": "相机权限",
  "microphone_permission": "麦克风权限",
  "storage_permission": "存储权限",
  "contacts_permission": "联系人权限",
  "calendar_permission": "日历权限",
  "photos_permission": "照片权限",
  "media_library_permission": "媒体库权限",
  "bluetooth_permission": "蓝牙权限",
  "sensors_permission": "传感器权限",
  "background_fetch_permission": "后台获取权限",
  "app_tracking_transparency_permission": "应用跟踪透明度权限",
  "push_notification_permission": "推送通知权限",
  "critical_alerts_permission": "紧急提醒权限",
  "provisional_push_notification_permission": "临时推送通知权限",
  "announcements_permission": "公告权限",
  "notification_service_extension_permission": "通知服务扩展权限",
  "notification_content_extension_permission": "通知内容扩展权限",
  "carplay_permission": "CarPlay 权限",
  "siri_kit_permission": "SiriKit 权限",
  "wallet_permission": "钱包权限",
  "health_kit_permission": "HealthKit 权限",
  "home_kit_permission": "HomeKit 权限",
  "speech_permission": "语音权限",
  "motion_permission": "运动权限",
  "music_permission": "音乐权限",
  "video_permission": "视频权限",
  "tv_permission": "电视权限",
  "watch_permission": "手表权限",
  "mac_permission": "Mac 权限",
  "windows_permission": "Windows 权限",
  "linux_permission": "Linux 权限",
  "android_permission": "Android 权限",
  "ios_permission": "iOS 权限",
  "harmony_permission": "鸿蒙权限",
  "web_permission": "Web 权限",
  "desktop_permission": "桌面权限",
  "mobile_permission": "移动权限",
  "tablet_permission": "平板权限",
  "wearable_permission": "可穿戴权限",
  "tv_device_permission": "电视设备权限",
  "iot_device_permission": "IoT 设备权限",
  "smart_device_permission": "智能设备权限",
  "connected_device_permission": "已连接设备权限",
  "paired_device_permission": "已配对设备权限",
  "trusted_device_permission": "受信任设备权限",
  "untrusted_device_permission": "不受信任设备权限",
  "unknown_device_permission": "未知设备权限",
  "device_not_found": "未找到设备",
  "device_connection_failed": "设备连接失败",
  "retry_device_connection": "重试设备连接",
  "cancel_device_connection": "取消设备连接",
  "device_connection_cancelled": "设备连接已取消",
  "device_connection_successful": "设备连接成功",
  "device_already_connected": "设备已连接",
  "device_not_connected": "设备未连接",
  "disconnect_device": "断开设备连接",
  "device_disconnected": "设备已断开连接",
  "device_disconnection_failed": "设备断开连接失败",
  "retry_device_disconnection": "重试断开设备连接",
  "cancel_device_disconnection": "取消断开设备连接",
  "device_disconnection_cancelled": "断开设备连接已取消",
  "device_disconnection_successful": "设备断开连接成功",
  "device_info": "设备信息",
  "device_name": "设备名称:{name}",
  "device_model": "设备型号:{model}",
  "device_os": "设备操作系统:{os}",
  "device_os_version": "设备系统版本:{version}",
  "device_battery_level": "电池电量:{level}%",
  "device_battery_status": "电池状态:{status}",
  "device_network_status": "网络状态:{status}",
  "device_wifi_status": "Wi-Fi 状态:{status}",
  "device_bluetooth_status": "蓝牙状态:{status}",
  "device_location_status": "位置状态:{status}",
  "device_storage_status": "存储状态:{status}",
  "device_ram_status": "内存状态:{status}",
  "device_cpu_status": "CPU 状态:{status}",
  "device_gpu_status": "GPU 状态:{status}",
  "device_screen_status": "屏幕状态:{status}",
  "device_camera_status": "相机状态:{status}",
  "device_microphone_status": "麦克风状态:{status}",
  "device_sensors_status": "传感器状态:{status}",
  "device_performance_status": "性能状态:{status}",
  "device_security_status": "安全状态:{status}",
  "device_privacy_status": "隐私状态:{status}",
  "device_settings_status": "设置状态:{status}",
  "device_updates_status": "更新状态:{status}",
  "device_backup_status": "备份状态:{status}",
  "device_restore_status": "恢复状态:{status}",
  "device_sync_status": "同步状态:{status}",
  "device_cloud_status": "云端状态:{status}",
  "device_account_status": "账户状态:{status}",
  "device_subscription_status": "订阅状态:{status}",
  "device_payment_status": "支付状态:{status}",
  "device_shopping_status": "购物状态:{status}",
  "device_entertainment_status": "娱乐状态:{status}",
  "device_social_status": "社交状态:{status}",
  "device_communication_status": "通信状态:{status}",
  "device_productivity_status": "生产力状态:{status}",
  "device_utility_status": "工具状态:{status}",
  "device_tool_status": "工具状态:{status}",
  "device_game_status": "游戏状态:{status}",
  "device_education_status": "教育状态:{status}",
  "device_health_status": "健康状态:{status}",
  "device_fitness_status": "健身状态:{status}",
  "device_finance_status": "金融状态:{status}",
  "device_business_status": "商业状态:{status}",
  "device_travel_status": "旅行状态:{status}",
  "device_navigation_status": "导航状态:{status}",
  "device_maps_status": "地图状态:{status}",
  "device_weather_status": "天气状态:{status}",
  "device_news_status": "新闻状态:{status}",
  "device_sports_status": "体育状态:{status}",
  "device_lifestyle_status": "生活方式状态:{status}",
  "device_fashion_status": "时尚状态:{status}",
  "device_food_status": "美食状态:{status}",
  "device_drinks_status": "饮品状态:{status}",
  "device_shopping_mall_status": "商场状态:{status}",
  "device_marketplace_status": "市场状态:{status}",
  "device_auction_status": "拍卖状态:{status}",
  "device_classifieds_status": "分类信息状态:{status}",
  "device_real_estate_status": "房地产状态:{status}",
  "device_jobs_status": "工作状态:{status}",
  "device_dating_status": "约会状态:{status}",
  "device_chat_status": "聊天状态:{status}",
  "device_messaging_status": "消息状态:{status}",
  "device_email_status": "邮件状态:{status}",
  "device_phone_status": "电话状态:{status}",
  "device_video_call_status": "视频通话状态:{status}",
  "device_voice_call_status": "语音通话状态:{status}",
  "device_conference_status": "会议状态:{status}",
  "device_meeting_status": "会议状态:{status}",
  "device_webinar_status": "网络研讨会状态:{status}",
  "device_presentation_status": "演示状态:{status}",
  "device_document_status": "文档状态:{status}",
  "device_file_status": "文件状态:{status}",
  "device_folder_status": "文件夹状态:{status}",
  "device_cloud_storage_status": "云存储状态:{status}",
  "device_local_storage_status": "本地存储状态:{status}",
  "device_external_storage_status": "外部存储状态:{status}",
  "device_usb_storage_status": "USB 存储状态:{status}",
  "device_sd_card_status": "SD 卡状态:{status}",
  "device_network_storage_status": "网络存储状态:{status}",
  "device_server_storage_status": "服务器存储状态:{status}",
  "device_database_status": "数据库状态:{status}",
  "device_cache_status": "缓存状态:{status}",
  "device_memory_status": "内存状态:{status}",
  "device_buffer_status": "缓冲区状态:{status}",
  "device_queue_status": "队列状态:{status}",
  "device_stack_status": "栈状态:{status}",
  "device_list_status": "列表状态:{status}",
  "device_array_status": "数组状态:{status}",
  "device_map_status": "映射状态:{status}",
  "device_set_status": "集合状态:{status}",
  "device_tree_status": "树状态:{status}",
  "device_graph_status": "图状态:{status}",
  "device_matrix_status": "矩阵状态:{status}",
  "device_vector_status": "向量状态:{status}",
  "device_scalar_status": "标量状态:{status}",
  "device_number_status": "数字状态:{status}",
  "device_string_status": "字符串状态:{status}",
  "device_boolean_status": "布尔状态:{status}",
  "device_object_status": "对象状态:{status}",
  "device_function_status": "函数状态:{status}",
  "device_class_status": "类状态:{status}",
  "device_interface_status": "接口状态:{status}",
  "device_protocol_status": "协议状态:{status}",
  "device_standard_status": "标准状态:{status}",
  "device_specification_status": "规格状态:{status}",
  "device_requirement_status": "需求状态:{status}",
  "device_constraint_status": "约束状态:{status}",
  "device_limit_status": "限制状态:{status}",
  "device_threshold_status": "阈值状态:{status}",
  "device_boundary_status": "边界状态:{status}",
  "device_scope_status": "范围状态:{status}",
  "device_range_status": "范围状态:{status}",
  "device_extent_status": "程度状态:{status}",
  "device_degree_status": "程度状态:{status}",
  "device_level_status": "级别状态:{status}",
  "device_stage_status": "阶段状态:{status}",
  "device_phase_status": "阶段状态:{status}",
  "device_step_status": "步骤状态:{status}",
  "device_action_status": "操作状态:{status}",
  "device_operation_status": "操作状态:{status}",
  "device_process_status": "进程状态:{status}",
  "device_procedure_status": "程序状态:{status}",
  "device_workflow_status": "工作流状态:{status}",
  "device_pipeline_status": "管道状态:{status}",
  "device_chain_status": "链状态:{status}",
  "device_sequence_status": "序列状态:{status}",
  "device_order_status": "订单状态:{status}",
  "device_arrangement_status": "排列状态:{status}",
  "device_configuration_status": "配置状态:{status}",
  "device_setup_status": "设置状态:{status}",
  "device_installation_status": "安装状态:{status}",
  "device_configuration": "配置",
  "device_preferences": "偏好",
  "device_settings": "设置",
  "device_options": "选项",
  "device_choices": "选择",
  "device_selections": "选择",
  "device_picks": "选择",
  "device_decisions": "决定",
  "device_judgments": "判断",
  "device_assessments": "评估",
  "device_evaluations": "评价",
  "device_reviews": "评论",
  "device_ratings": "评分",
  "device_scores": "分数",
  "device_grades": "等级",
  "device_marks": "标记",
  "device_points": "点数",
  "device_credits": "积分",
  "device_rewards": "奖励",
  "device_bonuses": "奖金",
  "device_prizes": "奖品",
  "device_awards": "奖项",
  "device_honors": "荣誉",
  "device_achievements": "成就",
  "device_trophies": "奖杯",
  "device_medals": "奖牌",
  "device_certificates": "证书",
  "device_diplomas": "文凭",
  "device_degrees": "学位",
  "device_licenses": "许可证",
  "device_permits": "许可",
  "device_authorizations": "授权",
  "device_approvals": "批准",
  "device_consents": "同意",
  "device_permissions": "权限",
  "device_rights": "权利",
  "device_privileges": "特权",
  "device_benefits": "福利",
  "device_advantages": "优势",
  "device_features": "功能",
  "device_capabilities": "能力",
  "device_abilities": "能力",
  "device_skills": "技能",
  "device_talents": "才能",
  "device_gifts": "天赋",
  "device_strengths": "优势",
  "device_weaknesses": "劣势",
  "device_opportunities": "机会",
  "device_threats": "威胁",
  "device_risks": "风险",
  "device_challenges": "挑战",
  "device_problems": "问题",
  "device_issues": "问题",
  "device_difficulties": "困难",
  "device_obstacles": "障碍",
  "device_barriers": "障碍",
  "device_hurdles": "障碍",
  "device_complications": "并发症",
  "device_complications": "并发症"
}

4.4 生成本地化代码

运行以下命令生成本地化代码:

# 首次生成或更新资源后生成
flutter pub run build_runner build --delete-conflicting-outputs

# 监听文件变化并自动生成
flutter pub run build_runner watch

五、国际化服务层实现

5.1 常量定义

创建 lib/core/constants/locale_constants.dart

import 'package:flutter/material.dart';

class LocaleConstants {
  static const Locale english = Locale('en', 'US');
  static const Locale chinese = Locale('zh', 'CN');
  static const Locale japanese = Locale('ja', 'JP');

  static const List<Locale> supportedLocales = [
    english,
    chinese,
    japanese,
  ];

  static const Map<Locale, String> localeNames = {
    english: 'English',
    chinese: '中文',
    japanese: '日本語',
  };

  static const Map<Locale, String> localeCodes = {
    english: 'en',
    chinese: 'zh',
    japanese: 'ja',
  };

  static const String defaultLocaleKey = 'default_locale';
  static const String localeKey = 'selected_locale';

  static Locale getLocaleFromCode(String code) {
    switch (code) {
      case 'en':
        return english;
      case 'zh':
        return chinese;
      case 'ja':
        return japanese;
      default:
        return english;
    }
  }
}

5.2 国际化服务实现

创建 lib/core/services/localization_service.dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../constants/locale_constants.dart';

class LocalizationService {
  static final LocalizationService _instance = LocalizationService._internal();
  static LocalizationService get instance => _instance;

  LocalizationService._internal();

  SharedPreferences? _prefs;
  Locale? _currentLocale;
  final ValueNotifier<Locale> _localeNotifier = ValueNotifier(LocaleConstants.english);

  Locale get currentLocale => _currentLocale ?? LocaleConstants.english;
  ValueNotifier<Locale> get localeNotifier => _localeNotifier;

  Future<void> initialize() async {
    _prefs = await SharedPreferences.getInstance();
    await _loadSavedLocale();
  }

  Future<void> _loadSavedLocale() async {
    final savedLocaleCode = _prefs?.getString(LocaleConstants.localeKey);
    
    if (savedLocaleCode != null) {
      _currentLocale = LocaleConstants.getLocaleFromCode(savedLocaleCode);
    } else {
      _currentLocale = await _getSystemLocale();
    }
    
    _localeNotifier.value = _currentLocale!;
  }

  Future<Locale> _getSystemLocale() async {
    final systemLocales = WidgetsBinding.instance.platformDispatcher.locales;
    
    for (final systemLocale in systemLocales) {
      if (LocaleConstants.supportedLocales.contains(systemLocale)) {
        return systemLocale;
      }
      
      final matchingLocale = LocaleConstants.supportedLocales.firstWhere(
        (locale) => locale.languageCode == systemLocale.languageCode,
        orElse: () => LocaleConstants.english,
      );
      
      if (matchingLocale != LocaleConstants.english) {
        return matchingLocale;
      }
    }
    
    return LocaleConstants.english;
  }

  Future<void> setLocale(Locale locale) async {
    if (!LocaleConstants.supportedLocales.contains(locale)) {
      throw ArgumentError('Unsupported locale: $locale');
    }

    _currentLocale = locale;
    _localeNotifier.value = locale;
    
    await _prefs?.setString(
      LocaleConstants.localeKey,
      LocaleConstants.localeCodes[locale]!,
    );
  }

  Future<void> resetToSystemLocale() async {
    final systemLocale = await _getSystemLocale();
    await setLocale(systemLocale);
  }

  bool isLocaleSupported(Locale locale) {
    return LocaleConstants.supportedLocales.contains(locale);
  }

  List<Locale> get supportedLocales => LocaleConstants.supportedLocales;

  String getLocaleName(Locale locale) {
    return LocaleConstants.localeNames[locale] ?? 'Unknown';
  }

  String get currentLocaleName => getLocaleName(currentLocale);
}

5.3 日期格式化工具

创建 lib/core/utils/date_formatter.dart

import 'package:intl/intl.dart';
import 'package:flutter/material.dart';

class DateFormatter {
  static String formatDate(DateTime date, {String? locale}) {
    return DateFormat.yMMMd(locale).format(date);
  }

  static String formatDateTime(DateTime date, {String? locale}) {
    return DateFormat.yMMMd().add_Hm().format(date);
  }

  static String formatTime(DateTime date, {String? locale}) {
    return DateFormat.Hm(locale).format(date);
  }

  static String formatRelativeDate(DateTime date, {String? locale}) {
    final now = DateTime.now();
    final difference = now.difference(date);

    if (difference.inDays == 0) {
      if (difference.inHours == 0) {
        if (difference.inMinutes == 0) {
          return _getRelativeString('just_now', locale);
        }
        return _getRelativePluralString(
          'minutes_ago',
          difference.inMinutes,
          locale,
        );
      }
      return _getRelativePluralString(
        'hours_ago',
        difference.inHours,
        locale,
      );
    } else if (difference.inDays == 1) {
      return _getRelativeString('yesterday', locale);
    } else if (difference.inDays < 7) {
      return _getRelativePluralString(
        'days_ago',
        difference.inDays,
        locale,
      );
    } else if (difference.inDays < 30) {
      final weeks = (difference.inDays / 7).floor();
      return _getRelativePluralString(
        'weeks_ago',
        weeks,
        locale,
      );
    } else if (difference.inDays < 365) {
      final months = (difference.inDays / 30).floor();
      return _getRelativePluralString(
        'months_ago',
        months,
        locale,
      );
    } else {
      final years = (difference.inDays / 365).floor();
      return _getRelativePluralString(
        'years_ago',
        years,
        locale,
      );
    }
  }

  static String formatDayOfWeek(DateTime date, {String? locale}) {
    return DateFormat.E(locale).format(date);
  }

  static String formatMonth(DateTime date, {String? locale}) {
    return DateFormat.MMMM(locale).format(date);
  }

  static String formatYear(DateTime date, {String? locale}) {
    return DateFormat.y(locale).format(date);
  }

  static String formatDuration(Duration duration, {String? locale}) {
    if (duration.inDays > 0) {
      return _getRelativePluralString(
        'days',
        duration.inDays,
        locale,
      );
    } else if (duration.inHours > 0) {
      return _getRelativePluralString(
        'hours',
        duration.inHours,
        locale,
      );
    } else if (duration.inMinutes > 0) {
      return _getRelativePluralString(
        'minutes',
        duration.inMinutes,
        locale,
      );
    } else {
      return _getRelativePluralString(
        'seconds',
        duration.inSeconds,
        locale,
      );
    }
  }

  static String _getRelativeString(String key, String? locale) {
    final localeCode = locale ?? 'en';
    switch (key) {
      case 'just_now':
        return localeCode == 'zh' ? '刚刚' : 'Just now';
      case 'yesterday':
        return localeCode == 'zh' ? '昨天' : 'Yesterday';
      default:
        return key;
    }
  }

  static String _getRelativePluralString(String key, int count, String? locale) {
    final localeCode = locale ?? 'en';
    final isChinese = localeCode == 'zh';
    
    switch (key) {
      case 'minutes_ago':
        return isChinese ? '$count 分钟前' : '$count minute${count != 1 ? 's' : ''} ago';
      case 'hours_ago':
        return isChinese ? '$count 小时前' : '$count hour${count != 1 ? 's' : ''} ago';
      case 'days_ago':
        return isChinese ? '$count 天前' : '$count day${count != 1 ? 's' : ''} ago';
      case 'weeks_ago':
        return isChinese ? '$count 周前' : '$count week${count != 1 ? 's' : ''} ago';
      case 'months_ago':
        return isChinese ? '$count 个月前' : '$count month${count != 1 ? 's' : ''} ago';
      case 'years_ago':
        return isChinese ? '$count 年前' : '$count year${count != 1 ? 's' : ''} ago';
      case 'days':
        return isChinese ? '$count 天' : '$count day${count != 1 ? 's' : ''}';
      case 'hours':
        return isChinese ? '$count 小时' : '$count hour${count != 1 ? 's' : ''}';
      case 'minutes':
        return isChinese ? '$count 分钟' : '$count minute${count != 1 ? 's' : ''}';
      case 'seconds':
        return isChinese ? '$count 秒' : '$count second${count != 1 ? 's' : ''}';
      default:
        return '$count $key';
    }
  }
}

5.4 数字格式化工具

创建 lib/core/utils/number_formatter.dart

import 'package:intl/intl.dart';

class NumberFormatter {
  static String formatNumber(num number, {String? locale}) {
    return NumberFormat.decimalPattern(locale).format(number);
  }

  static String formatCurrency(
    num amount, {
    String? locale,
    String symbol = '¥',
    int decimalDigits = 2,
  }) {
    return NumberFormat.currency(
      locale: locale,
      symbol: symbol,
      decimalDigits: decimalDigits,
    ).format(amount);
  }

  static String formatPercentage(num value, {String? locale}) {
    return '${formatNumber(value, locale: locale)}%';
  }

  static String formatFileSize(int bytes, {String? locale}) {
    const suffixes = ['B', 'KB', 'MB', 'GB', 'TB'];
    var i = 0;
    double size = bytes.toDouble();

    while (size >= 1024 && i < suffixes.length - 1) {
      size /= 1024;
      i++;
    }

    return '${formatNumber(size, locale: locale)} ${suffixes[i]}';
  }

  static String formatCompactNumber(num number, {String? locale}) {
    return NumberFormat.compact(locale: locale).format(number);
  }

  static String formatDecimalNumber(
    num number, {
    String? locale,
    int decimalPlaces = 2,
  }) {
    return NumberFormat.decimalPattern(locale)
        .format(NumberFormat.decimalPattern().parse(number.toStringAsFixed(decimalPlaces)));
  }

  static String formatPhoneNumber(String phoneNumber, {String? locale}) {
    final localeCode = locale ?? 'zh';
    
    if (localeCode == 'zh') {
      if (phoneNumber.length == 11) {
        return '${phoneNumber.substring(0, 3)} ${phoneNumber.substring(3, 7)} ${phoneNumber.substring(7)}';
      }
    }
    
    return phoneNumber;
  }

  static String formatCreditCardNumber(String cardNumber, {String? locale}) {
    final cleaned = cardNumber.replaceAll(RegExp(r'\D'), '');
    
    if (cleaned.length == 16) {
      return '${cleaned.substring(0, 4)} ${cleaned.substring(4, 8)} ${cleaned.substring(8, 12)} ${cleaned.substring(12)}';
    }
    
    return cleaned;
  }

  static String formatPercentageChange(num change, {String? locale}) {
    final sign = change >= 0 ? '+' : '';
    return '$sign${formatPercentage(change, locale: locale)}';
  }

  static String formatWithLeadingZeros(int number, int width) {
    return number.toString().padLeft(width, '0');
  }
}

六、状态管理层实现

6.1 Locale Provider

创建 lib/features/settings/providers/locale_provider.dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import '../../../core/services/localization_service.dart';
import '../../../core/constants/locale_constants.dart';

class LocaleProvider extends ChangeNotifier {
  final LocalizationService _localizationService;

  LocaleProvider({
    LocalizationService? localizationService,
  }) : _localizationService = localizationService ?? LocalizationService.instance;

  Locale get locale => _localizationService.currentLocale;
  String get localeName => _localizationService.currentLocaleName;
  List<Locale> get supportedLocales => _localizationService.supportedLocales;
  bool get isInitialized => _localizationService.currentLocale != null;

  Future<void> initialize() async {
    await _localizationService.initialize();
    notifyListeners();
  }

  Future<void> setLocale(Locale locale) async {
    await _localizationService.setLocale(locale);
    notifyListeners();
  }

  Future<void> resetToSystemLocale() async {
    await _localizationService.resetToSystemLocale();
    notifyListeners();
  }

  String getLocaleName(Locale locale) {
    return _localizationService.getLocaleName(locale);
  }

  bool isCurrentLocale(Locale locale) {
    return _localizationService.currentLocale == locale;
  }
}

6.2 Language Selector Widget

创建 lib/features/settings/widgets/language_selector.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/locale_provider.dart';
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐