i18n_multilanguage_with_flags 0.1.0
i18n_multilanguage_with_flags: ^0.1.0 copied to clipboard
Generic Flutter i18n toolkit with language metadata, flag dropdowns, and language selection persistence.
import 'package:flutter/material.dart';
import 'package:i18n_multilanguage_with_flags/i18n_multilanguage_with_flags.dart';
void main() {
runApp(const ExampleApp());
}
class ExampleApp extends StatefulWidget {
const ExampleApp({super.key});
@override
State<ExampleApp> createState() => _ExampleAppState();
}
class _ExampleAppState extends State<ExampleApp> {
late final I18nMultilanguageController _controller;
final _storage = LanguageSelectionStorage();
final _defaultCatalogMap = buildDefaultLanguageCatalogMap();
@override
void initState() {
super.initState();
_controller = I18nMultilanguageController(
languages: buildConfigurableLanguageCatalog(
includeIds: const ['en_us', 'pt_br'],
),
initialUiLanguageId: 'en_us',
translations: const {
'en_us': {
'title': 'Language Setup',
'native_label': 'Native language',
'target_label': 'Language to practice',
'username_label': 'First name',
'username_hint': 'Type your name',
'continue': 'Continue',
'summary': 'Current selection',
},
'pt_br': {
'title': 'Configuração de Idioma',
'native_label': 'Idioma nativo',
'target_label': 'Idioma para praticar',
'username_label': 'Primeiro nome',
'username_hint': 'Digite seu nome',
'continue': 'Continuar',
'summary': 'Seleção atual',
},
},
);
_hydrate();
}
Future<void> _hydrate() async {
await _controller.loadFromStorage(_storage);
if (mounted) {
setState(() {});
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text(_controller.tr('title')),
),
body: AnimatedBuilder(
animation: _controller,
builder: (context, _) {
return Column(
children: [
I18nLanguageSelectionForm(
languages: _controller.languages,
initialUiLanguageId: _controller.uiLanguageId,
initialTargetLanguageId: _controller.targetLanguageId,
initialUsername: _controller.username,
uiLanguageLabel: _controller.tr('native_label'),
targetLanguageLabel: _controller.tr('target_label'),
usernameLabel: _controller.tr('username_label'),
usernameHint: _controller.tr('username_hint'),
submitLabel: _controller.tr('continue'),
onSubmit: (snapshot) async {
_controller.applySnapshot(snapshot);
await _controller.saveToStorage(_storage);
},
),
const Divider(height: 1),
Padding(
padding: const EdgeInsets.all(16),
child: Align(
alignment: Alignment.centerLeft,
child: Text(
'${_controller.tr('summary')}: '
'${_controller.uiLanguageId} / '
'${_controller.targetLanguageId ?? '-'} / '
'${_controller.username} / '
'langs=${_controller.languages.length}',
),
),
),
const SizedBox(height: 8),
Wrap(
spacing: 8,
runSpacing: 8,
children: [
OutlinedButton(
onPressed: () {
final spanish = _defaultCatalogMap['es_es'];
if (spanish == null) return;
_controller.upsertLanguage(spanish);
},
child: const Text('Add Spanish'),
),
OutlinedButton(
onPressed: () {
_controller.removeLanguage('pt_br');
},
child: const Text('Remove Portuguese'),
),
],
),
const SizedBox(height: 12),
],
);
},
),
),
);
}
}