All skills
flutter avatar

/flutter-setup-localization

@0fbfdaf official
by flutterflutter/skills3k stars
182

Add `flutter_localizations` and `intl` dependencies, enable "generate true" in `pubspec.yaml`, and create an `l10n.yaml` configuration file. Use when initializing localization support for a new Flutter project.

Use this Skill: https://skilld.dev/gh/flutter/skills/flutter-setup-localization

This session only. Nothing lands on disk.

SKILL.md

≈60 tokens always: the name and description. ≈1.4k when used: this file.

Internationalizing Flutter Applications

Contents

Core Concepts

Flutter handles internationalization (i18n) and localization (l10n) via the flutter_localizations and intl packages. The standard approach uses App Resource Bundle (.arb) files to define localized strings, which are then compiled into a generated AppLocalizations class for type-safe access within the widget tree.

Setup Workflow

Copy and track this checklist when initializing internationalization in a Flutter project:

  • Task Progress
    • 1. Add dependencies to pubspec.yaml.
    • 2. Enable the generate flag.
    • 3. Create the l10n.yaml configuration file.
    • 4. Configure MaterialApp or CupertinoApp.

1. Add Dependencies

Add the required localization packages to the project. Execute the following commands in the terminal:

flutter pub add flutter_localizations --sdk=flutter
flutter pub add intl:any

Verify your pubspec.yaml includes the following under dependencies:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl: any

2. Enable Code Generation

Open pubspec.yaml and enable the generate flag within the flutter section to automate localization tasks:

flutter:
  generate: true

3. Create Configuration File

Create a new file named l10n.yaml in the root directory of the Flutter project. Define the input directory, template file, and output file:

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
synthetic-package: true

4. Configure the App Entry Point

Import the generated localizations and the flutter_localizations library in your main.dart. Inject the delegates and supported locales into your MaterialApp or CupertinoApp.

import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; // Adjust path if synthetic-package is false

// ... inside build method
return MaterialApp(
  localizationsDelegates: const [
    AppLocalizations.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
  ],
  supportedLocales: const [
    Locale('en'), // English
    Locale('es'), // Spanish
  ],
  home: const MyHomePage(),
);

Implementation Workflow

Follow this workflow when adding or modifying localized content.

1. Define ARB Files

  • If creating NEW content: Add the base string to the template file (lib/l10n/app_en.arb). Include a description for context.
  • If EDITING existing content: Locate the key in all supported .arb files and update the values.
{
  "helloWorld": "Hello World!",
  "@helloWorld": {
    "description": "The conventional newborn programmer greeting"
  }
}

Create corresponding files for other locales (e.g., app_es.arb):

{
  "helloWorld": "¡Hola Mundo!"
}

2. Generate Localization Classes

Run the following command to trigger code generation:

flutter pub get

Feedback Loop: Run validator -> review terminal output for ARB syntax errors -> fix missing commas or mismatched placeholders -> re-run flutter pub get.

3. Consume Localized Strings

Access the localized strings in your widget tree using AppLocalizations.of(context). Ensure the widget calling this is a descendant of MaterialApp.

Text(AppLocalizations.of(context)!.helloWorld)

Advanced Formatting

Use placeholders for dynamic data, plurals, and conditional selects.

Placeholders

Define parameters within curly braces and specify their type in the metadata object.

"hello": "Hello {userName}",
"@hello": {
  "description": "A message with a single parameter",
  "placeholders": {
    "userName": {
      "type": "String",
      "example": "Bob"
    }
  }
}

Plurals

Use the plural syntax to handle quantity-based string variations. The other case is mandatory.

"nWombats": "{count, plural, =0{no wombats} =1{1 wombat} other{{count} wombats}}",
"@nWombats": {
  "description": "A plural message",
  "placeholders": {
    "count": {
      "type": "num",
      "format": "compact"
    }
  }
}

Selects

Use the select syntax for conditional strings, such as gendered text.

"pronoun": "{gender, select, male{he} female{she} other{they}}",
"@pronoun": {
  "description": "A gendered message",
  "placeholders": {
    "gender": {
      "type": "String"
    }
  }
}

Examples

Complete l10n.yaml

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
synthetic-package: true
use-escaping: true

Complete Widget Implementation

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

class GreetingWidget extends StatelessWidget {
  final String userName;
  final int notificationCount;

  const GreetingWidget({
    super.key, 
    required this.userName, 
    required this.notificationCount,
  });

  @override
  Widget build(BuildContext context) {
    final l10n = AppLocalizations.of(context)!;

    return Column(
      children: [
        Text(l10n.hello(userName)),
        Text(l10n.nWombats(notificationCount)),
      ],
    );
  }
}

Source: SKILL.md on GitHub

No alerts2mo3 checks · Risk SAFE
  • Gen Agent Trust Hub2mo

    The skill provides standard instructions and commands to initialize localization in a Flutter project using official SDK tools and packages. It follows standard development workflows without any detected malicious patterns.

  • Socket2mo

    No alerts

  • Snyk2mo

    Risk: LOW · No issues

Signed by skilld at 0fbfdaf. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub yesterday.

Activeupdated 5 months ago
Other metadata
metadata
{
  "model": "models/gemini-3.1-pro-preview",
  "last_modified": "Tue, 21 Apr 2026 21:27:35 GMT"
}
  • flutter
  • localization
  • i18n
  • intl
  • arb
  • pubspec
  • code-generation

README badge

README badge for flutter/skills/flutter-setup-localization

Configures Flutter localization by adding flutter_localizations and intl dependencies, enabling code generation in pubspec.yaml, and creating an l10n.yaml configuration file. Handles ARB file workflows, plural and placeholder syntax, and MaterialApp delegate setup for multi-language support.

Generated from the current SKILL.md.

What packages does this skill install?
The skill adds `flutter_localizations` (from the Flutter SDK) and `intl` to your `pubspec.yaml` dependencies.
Does this skill handle pluralization and gender-based strings?
Yes. The skill documents plural syntax using the ICU message format (e.g., `{count, plural, =0{no items} other{{count} items}}`) and select syntax for conditional strings like gendered pronouns.
What file formats does this use for translations?
The skill uses `.arb` (Application Resource Bundle) files, one per locale (e.g., `app_en.arb`, `app_es.arb`), stored in the `lib/l10n` directory by default.
How do I access translated strings in widgets?
Call `AppLocalizations.of(context)!` followed by the string key (e.g., `AppLocalizations.of(context)!.helloWorld`). The widget must be a descendant of `MaterialApp` or `CupertinoApp`.
What triggers code generation for localizations?
Running `flutter pub get` triggers the code generator, which reads your `.arb` files and produces the `AppLocalizations` class. The `generate: true` flag in `pubspec.yaml` must be enabled first.

Generated from the current SKILL.md. These answers refresh after source changes.