Image for post
Image for post

Qual a forma fácil de traduzir seu app Flutter para outros idiomas?

Usando Dart Extension Methods!

Marcelo Glasberg
Mar 16 · 5 min read
Text("Olá, como vai você")
Text("Olá, como vai você".i18n)

print("Tem 1 item".plural(0)); // Escreve: Não tem itens
print("Tem 1 item".plural(1)); // Escreve: Tem 1 item
print("Tem 1 item".plural(2)); // Escreve: Tem 2 itens
print("É uma pessoa".gender(Gender.male)); // É um homem
print("É uma pessoa".gender(Gender.female)); // É uma mulher
print("É uma pessoa".gender(Gender.they)); // É uma pessoa

Veja funcionando

Image for post
Image for post

Preparação

import "package:i18n_extension/i18n_widget.dart";
...
@override
Widget build(BuildContext context) {
return MaterialApp(
home: I18n(child: ...)
);
}
I18n(
initialLocale: Locale("pt", "BR"),
child: ...

Traduzindo um widget

import "package:i18n_extension/i18n_extension.dart";extension Localization on String {String get i18n => localize(this, t);static var t = Translations("pt_br") +
{
"en_us": "Hello, how are you?",
"pt_br": "Olá, como vai você?",
"es": "¿Hola! Cómo estás?",
"fr": "Salut, comment ca va?",
"de": "Hallo, wie geht es dir?",
};
}
import "package:i18n_extension/i18n_extension.dart";extension Localization on String {String get i18n => localize(this, t);static var t = Translations("pt_br") +
{
"en_us": "Hello, how are you?",
"pt_br": "Olá, como vai você?",
} +
{
"en_us": "Hi",
"pt_br": "Olá",
} +
{
"en_us": "Goodbye",
"pt_br": "Adeus",
};
}

As próprias strings são as chaves de tradução

Text("Oi, tudo bem?".i18n)

Gerenciando chaves

Definindo traduções por idioma

static var t = Translations.byLocale("en_us") +
{
"en_us": {
"Hi": "Hi",
"Goodbye": "Goodbye",
}, "es_es": {
"Hi": "Hola",
"Goodbye": "Adiós",
}
};

Modificadores

int numDeItens = 3;
return Text("Você clicou o botão %d vezes".plural(numDeItens));
static var t = Translations("pt_br") +
{
"en_us": "You clicked the button %d times"
.zero("You haven’t clicked the button")
.one("You clicked it once")
.two("You clicked a couple times")
.many("You clicked %d times")
.times(12, "You clicked a dozen times"),
"pt_br": "Você clicou o botão %d vezes"
.zero("Você não clicou no botão")
.one("Você clicou uma única vez")
.two("Você clicou um par de vezes")
.many("Você clicou %d vezes")
.times(12, "Você clicou uma dúzia de vezes"),
};

Modificadores Customizados

enum Gender {they, female, male}
int gnd = Gender.female;
return Text("Uma pessoa".gender(gnd));
static var t = Translations("pt_br") +
{
"pt_br": "Uma pessoa"
.modifier(Gender.male, "Um homem")
.modifier(Gender.female, "Uma mulher")
.modifier(Gender.they, "Uma pessoa"),
"en_us": "A person"
.modifier(Gender.male, "A man")
.modifier(Gender.female, "A woman")
.modifier(Gender.they, "A person"),
};
String gender(Gender gnd) => localizeVersion(gnd, this, t);

Importando e exportando


Flutterando

Flutterando, a maior comunidade de Dart do Brasil!

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store