En flutter string, el texto se establece directamente en el TextField
widget como:
new Text('Hello, How are you?')
¿Es la forma correcta? o podemos mantener todas las cadenas en un archivo y usarlo como:
<string name="name_hint">Hello, How are you?</string>
Es posible?
Solución del problema
Captura de pantalla:
Código completo (seguro nulo):
Para aquellos de ustedes que no quieren usar ningún complemento de terceros, así es como pueden hacerlo.
Crea una carpeta strings
en assets
. Ponga su archivo de idioma en él.
assets
strings
- en.json // for english
- ru.json // for russian
Ahora en en.json
, escribe tu cadena, por ejemplo.
{
"text1": "Hello",
"text2": "World"
}
Del mismo modo, en ru.json
,
{
"text1": "Привет",
"text2": "Мир"
}
Añadir esto al pubspec.yaml
archivo (cuidado con los espacios)
flutter:
uses-material-design: true
assets:
- assets/strings/en.json
- assets/strings/ru.json
flutter_localizations:
sdk: flutter
Ahora ya está todo listo para usar estas cadenas en su aplicación. Aquí está el código de muestra, AppBar
muestra el texto traducido.
void main() {
runApp(
MaterialApp(
locale: Locale("ru"), // switch between en and ru to see effect
localizationsDelegates: [const DemoLocalizationsDelegate()],
supportedLocales: [const Locale('en', ''), const Locale('ru', '')],
home: HomePage(),
),
);
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(DemoLocalizations.of(context).getText("text2")?? "Error")),
);
}
}
// this class is used for localizations
class DemoLocalizations {
static DemoLocalizations? of(BuildContext context) {
return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
}
String getText(String key) => language[key];
}
late Map<String, dynamic> language;
class DemoLocalizationsDelegate extends LocalizationsDelegate<DemoLocalizations> {
const DemoLocalizationsDelegate();
@override
bool isSupported(Locale locale) => ['en', 'ru'].contains(locale.languageCode);
@override
Future<DemoLocalizations> load(Locale locale) async {
String string = await rootBundle.loadString("assets/strings/${locale.languageCode}.json");
language = json.decode(string);
return SynchronousFuture<DemoLocalizations>(DemoLocalizations());
}
@override
bool shouldReload(DemoLocalizationsDelegate old) => false;
}
No hay comentarios.:
Publicar un comentario