Flutter Intl 国际化方案在 OpenHarmony 中的企业级实现
本文介绍了Flutter Intl国际化方案在OpenHarmony平台的企业级实现。通过分层架构设计(应用层、国际化服务层、资源管理层和平台适配层),采用ARB资源文件格式管理多语言内容,支持动态语言切换和类型安全的字符串引用。方案包含完整的项目配置流程,从依赖配置、l10n文件创建到目录结构规划,并针对OpenHarmony平台进行了深度优化,实现了高性能、可扩展的国际化解决方案。
Flutter Intl 国际化方案在 OpenHarmony 中的企业级实现
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
一、引言
国际化(i18n)和本地化(l10n)是现代移动应用开发中的核心环节。对于面向全球市场的应用来说,提供多语言支持不仅能够提升用户体验,还能极大地拓展应用的市场覆盖范围。flutter_localizations 和 intl 包为 Flutter 应用提供了强大而灵活的国际化支持。
本文将详细介绍如何在 Flutter-OH 项目中构建一套企业级的国际化方案,涵盖从项目架构设计、资源管理、动态切换语言、日期时间格式化,到 OpenHarmony 平台深度适配的完整技术体系。
二、国际化技术架构设计
2.1 分层架构设计
我们采用分层架构设计,将国际化系统分为以下几个层次:
┌─────────────────────────────────────────┐
│ 应用层 (UI & Business Logic) │
├─────────────────────────────────────────┤
│ 国际化服务层 (Localization Service) │
├─────────────────────────────────────────┤
│ 资源管理层 (Resource Management) │
├─────────────────────────────────────────┤
│ 平台适配层 (Platform Adapter) │
└─────────────────────────────────────────┘
2.2 核心设计原则
- 单一职责:每个模块只负责特定的国际化功能
- 可扩展性:易于添加新的语言和地区
- 类型安全:使用代码生成确保字符串引用安全
- 性能优先:缓存本地化资源,避免重复加载
- 鸿蒙化适配:针对 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';
更多推荐
所有评论(0)