【问题标题】:How to change CupertinoDatePicker display language?如何更改 CupertinoDatePicker 显示语言?
【发布时间】:2018-12-07 03:43:48
【问题描述】:

我正在关注 Flutter 文档来展示 CupertinoDatePicker。但语言始终是英语。请告诉我如何改变它。

这是我的代码:

void _showDatePicker(BuildContext context, bool isYou) {
    showModalBottomSheet(
        context: context,
        builder: (context) {
          return CupertinoDatePicker(
            onDateTimeChanged: (DateTime value) {
              setState(() {
                if (isYou) {
                  _dateOfBirth = value;
                } else {
                  _dateOfBirthAnother = value;
                }
              });
            },

            initialDateTime: DateTime.now(),
            mode: CupertinoDatePickerMode.date,
            maximumYear: 2018,
            minimumYear: 1950,
          );
        });
  }

【问题讨论】:

标签: flutter


【解决方案1】:

将您所需的语言添加到您的 MaterialApp(或 CupertinoApp)配置中。 像这样:

return MaterialApp(
    localizationsDelegates: [
      // ... app-specific localization delegate[s] here
      GlobalMaterialLocalizations.delegate,
      GlobalWidgetsLocalizations.delegate,
      DefaultCupertinoLocalizations.delegate,
    ],
    supportedLocales: [
      const Locale('en', 'US'), // English
      const Locale('de', 'DE'), // German
      // ... other locales the app supports
    ],  <the rest of your configuration> );

应该这样做。

不要忘记导入:

import 'package:toothscout/GermanCupertinoLocalizations.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

此外,Cupertino 小部件还没有完全本地化(目前)。 但是您可以编写自己的本地化配置类并将它们添加到我的代码中的“DefaultCupertinoLocalizations.delegate”行下方。

例如,我必须创建以在德语中使用 CupertinoDatePicker 的自定义德语本地化如下所示:

import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';


class _CupertinoLocalizationsDelegate extends LocalizationsDelegate<CupertinoLocalizations> {
  const _CupertinoLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) => locale.languageCode == 'de';

  @override
  Future<CupertinoLocalizations> load(Locale locale) => GermanCupertinoLocalizations.load(locale);

  @override
  bool shouldReload(_CupertinoLocalizationsDelegate old) => false;

  @override
  String toString() => 'DefaultCupertinoLocalizations.delegate(de_DE)';
}

/// US English strings for the cupertino widgets.
class GermanCupertinoLocalizations implements CupertinoLocalizations {
  /// Constructs an object that defines the cupertino widgets' localized strings
  /// for US English (only).
  ///
  /// [LocalizationsDelegate] implementations typically call the static [load]
  /// function, rather than constructing this class directly.
  const GermanCupertinoLocalizations();

  static const List<String> _shortWeekdays = <String>[
    'Mo',
    'Di',
    'Mi',
    'Do',
    'Fr',
    'Sa',
    'So',
  ];

  static const List<String> _shortMonths = <String>[
    'Jan',
    'Feb',
    'Mär',
    'Apr',
    'Mai',
    'Jun',
    'Jul',
    'Aug',
    'Sep',
    'Okt',
    'Nov',
    'Dez',
  ];

  static const List<String> _months = <String>[
    'Januar',
    'Februar',
    'März',
    'April',
    'Mai',
    'Juni',
    'Juli',
    'August',
    'September',
    'Oktober',
    'November',
    'Dezember',
  ];



  @override
  String datePickerYear(int yearIndex) => yearIndex.toString();

  @override
  String datePickerMonth(int monthIndex) => _months[monthIndex - 1];

  @override
  String datePickerDayOfMonth(int dayIndex) => dayIndex.toString();

  @override
  String datePickerHour(int hour) => hour.toString();

  @override
  String datePickerHourSemanticsLabel(int hour) => hour.toString() + " Uhr";

  @override
  String datePickerMinute(int minute) => minute.toString().padLeft(2, '0');

  @override
  String datePickerMinuteSemanticsLabel(int minute) {
    if (minute == 1)
      return '1 Minute';
    return minute.toString() + ' Minuten';
  }

  @override
  String datePickerMediumDate(DateTime date) {
    return '${_shortWeekdays[date.weekday - DateTime.monday]} '
        '${_shortMonths[date.month - DateTime.january]} '
        '${date.day.toString().padRight(2)}';
  }

  @override
  DatePickerDateOrder get datePickerDateOrder => DatePickerDateOrder.mdy;

  @override
  DatePickerDateTimeOrder get datePickerDateTimeOrder => DatePickerDateTimeOrder.date_time_dayPeriod;

  @override
  String get anteMeridiemAbbreviation => 'AM';

  @override
  String get postMeridiemAbbreviation => 'PM';

  @override
  String get alertDialogLabel => 'Info';

  @override
  String timerPickerHour(int hour) => hour.toString();

  @override
  String timerPickerMinute(int minute) => minute.toString();

  @override
  String timerPickerSecond(int second) => second.toString();

  @override
  String timerPickerHourLabel(int hour) => hour == 1 ? 'Stunde' : 'Stunden';

  @override
  String timerPickerMinuteLabel(int minute) => 'Min';

  @override
  String timerPickerSecondLabel(int second) => 'Sek';

  @override
  String get cutButtonLabel => 'Ausschneiden';

  @override
  String get copyButtonLabel => 'Kopieren';

  @override
  String get pasteButtonLabel => 'Einfügen';

  @override
  String get selectAllButtonLabel => 'Alles auswählen';

  /// Creates an object that provides US English resource values for the
  /// cupertino library widgets.
  ///
  /// The [locale] parameter is ignored.
  ///
  /// This method is typically used to create a [LocalizationsDelegate].
  static Future<CupertinoLocalizations> load(Locale locale) {
    return SynchronousFuture<CupertinoLocalizations>(const GermanCupertinoLocalizations());
  }

  /// A [LocalizationsDelegate] that uses [DefaultCupertinoLocalizations.load]
  /// to create an instance of this class.
  static const LocalizationsDelegate<CupertinoLocalizations> delegate = _CupertinoLocalizationsDelegate();
}

【讨论】:

  • 不,你不需要所有这些工作。只需添加您的特定本地化,日期选择器将始终与您的区域设置一样
  • flutter_cupertino_localizations 是正确的解决方案,查看@malibayram91 答案
【解决方案2】:

首先你应该把它添加到 pubspec.yaml

flutter_cupertino_localizations: ^1.0.1

flutter_localizations: 
  sdk: flutter

【讨论】:

    【解决方案3】:

    我已经找到了解决问题的办法,只好给localizationsDelegates添加回退,如下:

    localizationsDelegates: [ ..... const FallbackCupertinoLocalisationsDelegate(), ]
    

    还有代表:

    class FallbackCupertinoLocalisationsDelegate extends LocalizationsDelegate {
        const FallbackCupertinoLocalisationsDelegate();
    
        @override
        bool isSupported(Locale locale) => true;
    
        @override
        Future load(Locale locale) =>
        DefaultCupertinoLocalizations.load(locale);
    
        @override
        bool shouldReload(FallbackCupertinoLocalisationsDelegate old) => false;
        }
    

    【讨论】:

      【解决方案4】:

      这样就解决了问题。

      MaterialApp(
          ...
          localizationsDelegates: [
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
            GlobalCupertinoLocalizations.delegate,,l
          ])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 2021-07-13
        • 2020-06-18
        • 2020-03-16
        • 2021-03-01
        • 1970-01-01
        • 2013-09-28
        相关资源
        最近更新 更多