Localize your app easily entirely in flutter using dart getters. No need for code generation.
BSD-3-CLAUSE License
Traduza seu app facílmente e puramente em Flutter usando getters. Sem necessidade de geração de código.
English | Português
Adicione o pacote em pubspec.yaml
:
dependencies:
get_localization: 2.0.0
E execute flutter pub get
no terminal
Não esqueça de fazer a classe abstract
(abstrata).
abstract class BaseLocalization extends Localization {
BaseLocalization({
@required String code,
@required String name,
String country,
}) : super(
code: code,
name: name,
country: country,
);
// Adicione seus getters aqui:
String get appName;
}
class EnglishLocalization extends BaseLocalization {
EnglishLocalization() : super(code: 'en', name: 'English');
String get appName => 'Example App';
}
class PortugueseLocalization extends BaseLocalization {
PortugueseLocalization() : super(code: 'pt', name: 'Português');
String get appName => 'App de Exemplo';
}
O Dart-analyzer vai te dizer quando uma implementação estiver faltando. Veja exemplo para um exemplo completo
void main() {
// Inicialize o sistema de traduções. Não é necessario, mas se
// você quiser ser notificado sobre o idioma do sistema logo quando
// ele ser alterado, você precisa chamar esse método.
Localization.init();
// Adicione suas traduções. Você pode adicioná-las em tempo-de-execução,
// mas é recomendado adicioná-las aqui porque aqui será executado somente
// uma vez
Localization.localizations
..add(yourLocalization);
runApp(MyApp());
}
Se você está usando MaterialApp
(ou WidgetsApp
, CupertinoApp
ou relacionado), vocè precisa setar supportedLocales
:
return MaterialApp(
/// Adicione essa linha para a plataforma saber os idiomas suportados
supportedLocales: Localization.localizations.toLocaleList(),
home: Home(),
);
Certifique-se de use a classe Localization
na thread principal (main()
).
// Obtenha a tradução. Certifique-se de especificar o tipo (cast)
// para BaseLocalization ou qualquer que o nome da sua classe seja
BaseLocalization localization = Localization.currentLocalization;
// Defina a tradução
Localization.currentLocalization = /* <localization-class here> */;
Você pode saber quando o idioma é alterado usando Localization.onLocaleChanged
. É geralmente usado para atualizar o aplicativo para salvar as alterações:
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
/// Atenda aos eventos e atualize todo o aplicativo.
/// Você pode usar algo como `SharedPreferences` para salvar o idioma atual
/// e setar ele na inicialização
Localization.onLocaleChanged.listen((event) => setState(() {}));
}
@override
Widget build(BuildContext context) {
BaseLocalization loc = Localization.currentLocalization;
return MaterialApp(
title: loc.appName,
/// Adicione essa linha para a plataforma saber os idiomas suportados
supportedLocales: Localization.localizations.toLocaleList(),
home: Home(),
);
}
}
Você pode ver um aplicativo funcionando totalmente em exemplo
Intl é um pacote que oferece recursos de internacionalização e localização, incluindo tradução de mensagens, plurais e gêneros, formatação e análise de data/número e texto bidirecional.
No seu pubspec.yaml
, adicione intl
às dependências:
dependencies:
get_localization: <latest-version>
intl: <latest-version>
E importe:
import 'package:intl/intl.dart';
class PortugueseLocalization extends BaseLocalization {
PortugueseLocalization() : super(code: 'pt', name: 'Português');
String coins(int amount) {
/// Obtenha o código do idioma atual. Você pode usar-lo em quase todos
/// os métodos no Intl
final f = NumberFormat('###.0#', Localization.fullCode);
return Intl.plural(
amount,
zero: 'Você não tem moedas',
one: 'Você tem uma moeda',
other: 'Você tem ${f.format(amount)} moedas',
);
}
}
LocalizationProviderMixin
Você pode user o LocalizationProviderMixin
nas suas classes para acessar métodos da classe Localizations
diretamente.
class Home extends StatelessWidget with LocalizationProviderMixin {
const Home({Key key}) : super(key: key);
...
}
Incluia todos os métodos comuns:
...
@override
Widget build(BuildContext context) {
BaseLocalization loc = currentLocalization;
return Scaffold(
appBar: AppBar(title: Text(loc.appName)),
body: Column(
children: List.generate(localizations.length, (index) {
final localization = localizations[index];
return CheckboxListTile(
/// Atualize o idioma atual
onChanged: (_) => currentLocalization = localization,
value: loc == localization,
title: Text(localization.name),
subtitle: Text(localization.code),
);
}),
),
);
}
...
Quando sua tradução fica maior, você pode querer dividi-las em arquivos diferentes. Geralmente:
lib (pasta que contém todos os arquivos)
lang (pasta que contém todos os arquivos de idiomas)
lang.dart (onde sua BaseLocalization estará)
langs (pasta que contém todas as traduções)
en.dart (código_PAÍS.dart)
pt.dart
es.dart
...