fl_mlkit_translate_text 1.1.3 fl_mlkit_translate_text: ^1.1.3 copied to clipboard
Google mlkit translate text for flutter plugin , supports Android and IOS.
import 'package:fl_mlkit_translate_text/fl_mlkit_translate_text.dart';
import 'package:flutter/material.dart';
import 'package:flutter_waya/flutter_waya.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(MaterialApp(
navigatorKey: GlobalWayUI().navigatorKey,
scaffoldMessengerKey: GlobalWayUI().scaffoldMessengerKey,
debugShowCheckedModeBanner: false,
theme: ThemeData.light(useMaterial3: true),
darkTheme: ThemeData.dark(useMaterial3: true),
title: 'FlMlKitTranslate',
home: Scaffold(
appBar: AppBarText('Fl MlKit Translate Text'),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: _App(),
)))));
}
class _App extends StatefulWidget {
@override
State<_App> createState() => _AppState();
}
class _AppState extends State<_App> {
TextEditingController controller = TextEditingController();
List<TranslateRemoteModel> remoteModels = [];
FlMlKitTranslateText translateText = FlMlKitTranslateText();
ValueNotifier<String> text = ValueNotifier<String>('No Translate');
@override
void initState() {
super.initState();
addPostFrameCallback((duration) {
getDownloadedModels();
});
}
Future<void> getDownloadedModels() async {
remoteModels = await translateText.getDownloadedModels();
bool hasZH = false;
for (var element in remoteModels) {
if (element.language == TranslateLanguage.chinese) {
hasZH = true;
break;
}
}
if (!hasZH) {
final state =
await translateText.downloadedModel(TranslateLanguage.chinese);
'DownloadedModel TranslateLanguage.chinese = $state'.log();
}
}
@override
Widget build(BuildContext context) {
return Column(children: [
ElevatedText(
text: 'TranslateRemoteModel Manager',
onPressed: () {
context.requestFocus();
push(const TranslateRemoteModelManagerPage());
}),
const SizedBox(height: 20),
TextField(
controller: controller,
maxLength: 500,
maxLines: 4,
onSubmitted: (value) {
context.requestFocus();
},
decoration: const InputDecoration(
border: OutlineInputBorder(), hintText: 'Please enter text')),
StatefulBuilder(builder: (_, state) {
return Row(mainAxisAlignment: MainAxisAlignment.center, children: [
ElevatedText(
onPressed: () async {
context.requestFocus();
final language = await selectLanguage();
if (language != null &&
language != translateText.sourceLanguage &&
language != translateText.targetLanguage) {
translateText
.switchLanguage(language, translateText.targetLanguage)
.then((value) {
state(() {});
});
}
},
text: translateText.sourceLanguage.name),
IconButton(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
onPressed: () {
translateText
.switchLanguage(translateText.targetLanguage,
translateText.sourceLanguage)
.then((value) {
state(() {});
});
},
icon: const Icon(Icons.swap_horizontal_circle)),
ElevatedText(
onPressed: () async {
context.requestFocus();
final language = await selectLanguage();
if (language != null &&
language != translateText.sourceLanguage &&
language != translateText.targetLanguage) {
translateText
.switchLanguage(translateText.sourceLanguage, language)
.then((value) {
state(() {});
});
}
},
text: translateText.targetLanguage.name),
]);
}),
ElevatedText(text: 'Translation', onPressed: translation),
const SizedBox(height: 20),
ValueListenableBuilder(
valueListenable: text,
builder: (_, String value, __) {
return Universal(
onLongPress: () {
value.toClipboard;
showToast('Has been copied');
},
alignment: Alignment.center,
width: double.infinity,
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10)),
child: BText(value,
color: Colors.black, textAlign: TextAlign.center));
})
]);
}
Future<void> translation() async {
if (controller.text.isEmpty) {
showToast('Please enter the text');
return;
}
context.requestFocus();
final hasSourceModel =
await translateText.isModelDownloaded(translateText.sourceLanguage);
final hasTargetModel =
await translateText.isModelDownloaded(translateText.targetLanguage);
if (hasSourceModel && hasTargetModel) {
final value = await translateText.translate(controller.text);
if (value != null) text.value = value;
} else {
showToast('No download TranslateRemoteModel');
}
}
Future<TranslateLanguage?> selectLanguage() => Container(
padding: const EdgeInsets.all(20),
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.horizontal(
left: Radius.circular(10), right: Radius.circular(10))),
child: CustomFutureBuilder<List<TranslateRemoteModel>>(
future: translateText.getDownloadedModels,
onWaiting: (_) => const CircularProgressIndicator(),
onDone: (_, value, __) {
return ScrollList.builder(
itemBuilder: (_, index) {
return Universal(
onTap: () {
pop(value[index].language);
},
padding: const EdgeInsets.symmetric(vertical: 5),
child: BText(value[index].language.toString(),
color: Colors.black));
},
itemCount: value.length,
separatorBuilder: (BuildContext context, int index) =>
const Divider(thickness: 0.3));
})).popupBottomSheet(
options: const BottomSheetOptions(isScrollControlled: false));
@override
void dispose() {
super.dispose();
text.dispose();
translateText.dispose();
}
}
class TranslateRemoteModelManagerPage extends StatefulWidget {
const TranslateRemoteModelManagerPage({super.key});
@override
State<TranslateRemoteModelManagerPage> createState() =>
_TranslateRemoteModelManagerPageState();
}
class _TranslateRemoteModelManagerPageState
extends State<TranslateRemoteModelManagerPage> {
List<String> listLanguage = [];
@override
void initState() {
super.initState();
addPostFrameCallback((duration) => getDownloadedModels());
}
Future<void> getDownloadedModels() async {
var list = await FlMlKitTranslateText().getDownloadedModels();
listLanguage = list.builder(
(item) => FlMlKitTranslateText().toAbbreviations(item.language));
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBarText('TranslateRemoteModel Manager'),
body: ScrollList.builder(
padding: const EdgeInsets.symmetric(vertical: 10),
itemBuilder: (_, int index) {
var item = TranslateLanguage.values[index];
var abb = FlMlKitTranslateText().toAbbreviations(item);
var isDownload = listLanguage.contains(abb);
return Universal(
direction: Axis.horizontal,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
padding:
const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
children: [
RText(texts: [
'${abb.toUpperCase()} ',
item.toString().split('.')[1]
], styles: const [
TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
TextStyle(),
]),
ValueBuilder<bool>(builder: (_, bool? isLoading, updater) {
isLoading ??= false;
if (isLoading) return const CircularProgressIndicator();
return isDownload
? ElevatedText(
text: 'Delete',
onPressed: () async {
updater(true);
final state = await FlMlKitTranslateText()
.deleteDownloadedModel(item);
updater(false);
if (state) getDownloadedModels();
})
: ElevatedText(
text: 'Download',
onPressed: () async {
updater(true);
final state = await FlMlKitTranslateText()
.downloadedModel(item);
updater(false);
if (state) getDownloadedModels();
});
})
]);
},
itemCount: TranslateLanguage.values.length,
separatorBuilder: (BuildContext context, int index) =>
const Divider(),
));
}
}
class AppBarText extends AppBar {
AppBarText(String text, {super.key})
: super(
elevation: 0,
title: BText(text, fontSize: 18, fontWeight: FontWeight.bold),
centerTitle: true);
}
class ElevatedText extends ElevatedButton {
ElevatedText({super.key, required String text, required super.onPressed})
: super(child: Text(text));
}