double_feel_app.dart 2.41 KB
import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'routes/app_pages.dart';

class DoubleFeelApp extends StatelessWidget {
  const DoubleFeelApp({super.key});

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: context.l10n.appName,
      theme: AppTheme.lightTheme,
      darkTheme: AppTheme.darkTheme,
      themeMode: ThemeMode.light,
      initialRoute: AppPages.initialRoute,
      getPages: AppPages.routes,
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      localeResolutionCallback: (deviceLocale, supportedLocales) {
        if (deviceLocale == null) return const Locale('en');

        // 1. 完全精确匹配 (Language + Country + Script)
        for (final locale in supportedLocales) {
          if (locale == deviceLocale) {
            return locale;
          }
        }

        // 2. 繁简中文专门推导 (区分 zh_Hans 与 zh_Hant)
        if (deviceLocale.languageCode == 'zh') {
          final script = deviceLocale.scriptCode?.toLowerCase();
          final country = deviceLocale.countryCode?.toUpperCase();
          final isHant = script == 'hant' ||
              country == 'TW' ||
              country == 'HK' ||
              country == 'MO';

          return supportedLocales.firstWhere(
            (l) =>
                l.languageCode == 'zh' &&
                l.scriptCode == (isHant ? 'Hant' : 'Hans'),
            orElse: () => Locale.fromSubtags(
              languageCode: 'zh',
              scriptCode: isHant ? 'Hant' : 'Hans',
            ),
          );
        }

        // 3. 国家/地区匹配 (如 pt_PT、pt_BR)
        if (deviceLocale.countryCode != null) {
          for (final locale in supportedLocales) {
            if (locale.languageCode == deviceLocale.languageCode &&
                locale.countryCode == deviceLocale.countryCode) {
              return locale;
            }
          }
        }

        // 4. 仅语言代码匹配 (如 es_MX 匹配 es)
        for (final locale in supportedLocales) {
          if (locale.languageCode == deviceLocale.languageCode) {
            return locale;
          }
        }

        // 5. 兜底语言返回英文
        return const Locale('en');
      },
    );
  }
}