Skip to content

Arabic ('ar') dates lost Arabic-Indic digits: ZERODIGIT removed from DateSymbols in 3.44 date localization update #187767

Description

@ziyad-aljohani

Steps to reproduce

  1. Create a Flutter app using flutter_localizations with Arabic (ar) in supportedLocales (e.g. via GlobalMaterialLocalizations.delegate).
  2. Run the app with the locale set to ar (or any Arabic regional locale such as ar_SA, which falls back to ar since only ar is registered).
  3. Format any date/time with intl, e.g. DateFormat.jm('ar').format(DateTime.now()).

Expected results

Digits are rendered using Arabic-Indic (Eastern Arabic) numerals, as they were up to and including Flutter 3.38:

٨:٣٠ م

Per CLDR, the default numbering system for the generic ar locale is arab (Arabic-Indic digits); only specific regional variants like ar_DZ, ar_MA, ar_TN default to latn.

Actual results

Since Flutter 3.44 (first appeared in 3.43.0-0.1.pre), digits are rendered as ASCII/Latin while day and month names remain Arabic:

8:30 م

Root cause

#181685 (reverted, then relanded in #182189, commit 3ea16190995) regenerated packages/flutter_localizations/lib/src/l10n/generated_date_localizations.dart and removed ZERODIGIT: '٠' from the 'ar' DateSymbols entry — it is the only ZERODIGIT removal in that diff:

git diff 1c1ba3a8390^ 1c1ba3a8390 -- packages/flutter_localizations/lib/src/l10n/generated_date_localizations.dart | grep "ZERODIGIT"
-    ZERODIGIT: '٠',

When ZERODIGIT is absent, intl's DateFormat silently falls back to ASCII '0' (localeZero => dateSymbols.ZERODIGIT ?? '0'), so every date formatted under the ar locale switches to Latin digits.

Because GlobalMaterialLocalizations.delegate injects the Flutter-bundled DateSymbols into intl via initializeDateFormattingCustom (overriding intl's own locale data), every app using flutter_localizations with Arabic is affected — including all DateFormat usages outside Flutter widgets, and packages like easy_localization.

Note the same ZERODIGIT loss is present in package:intl data between 0.19.0 and 0.20.x (lib/src/data/dates/symbols/ar.json), which suggests the shared data-generation pipeline dropped the arab numbering system for generic ar — only ar_EG retains ZERODIGIT: '٠'. This looks unintentional, since CLDR still specifies arab as the default numbering system for ar.

Code sample

Code sample
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart';

void main() => runApp(const MyApp());

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: const Locale('ar'),
      supportedLocales: const [Locale('ar'), Locale('en')],
      localizationsDelegates: const [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      home: Scaffold(
        body: Center(
          child: Builder(
            builder: (context) => Text(
              // Flutter <= 3.38: "٨:٣٠ م"  —  Flutter 3.44: "8:30 م"
              DateFormat.jm('ar').format(DateTime(2026, 1, 1, 20, 30)),
            ),
          ),
        ),
      ),
    );
  }
}

Logs

No exceptions are thrown; this is a silent data regression.

Flutter Doctor output

Doctor output
Flutter 3.44.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 924134a44c (11 days ago) • 2026-05-29 12:13:22 -0400
Engine • hash 39b1f7043775b9578bbb26a1676e79c4e31c8b5e (revision c416acfeb8) (13 days ago) • 2026-05-27 20:19:31.000Z
Tools • Dart 3.12.1 • DevTools 2.57.0

[✓] Flutter (Channel stable, 3.44.1, on macOS 26.1 25B78 darwin-arm64, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 36.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 26.3)
[✓] Chrome - develop for the web
[✓] Connected device (3 available)
[✓] Network resources

• No issues found!

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High-priority issues at the top of the work lista: internationalizationSupporting other languages or locales. (aka i18n)c: regressionIt was better in the past than it is nowfound in release: 3.44Found to occur in 3.44has reproducible stepsThe issue has been confirmed reproducible and is ready to work onteam-frameworkOwned by Framework teamtriaged-frameworkTriaged by Framework team

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions