En flutter string, el texto se establece directamente en el TextFieldwidget 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 stringsen 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.yamlarchivo (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, AppBarmuestra 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