Identificar un idioma con el paquete google_mlkit_language_id
El paquete google_mlkit_language_id es un puente entre Flutter y la API nativa de Google ML Kit para la identificación de idiomas. Permite determinar el idioma de una cadena de texto ingresada por un usuario o generada por tu aplicación. Este paquete es particularmente útil para analizar texto y determinar su idioma, como en mensajes, comentarios o búsquedas.
¿Cómo funciona?
El paquete utiliza canales de plataforma (Platform Channels) para comunicarse con las APIs nativas de Google ML Kit en iOS y Android. Cuando se envía un texto, la API analiza la cadena y devuelve:
- El código de un idioma principal identificado (por ejemplo, fr para francés).
- Una lista de idiomas posibles con puntajes de confianza (por ejemplo, fr: 0.48, es: 0.52).
La API soporta más de 100 idiomas, incluyendo escrituras no latinas como árabe, chino o japonés, así como sus versiones romanizadas. Si no se detecta ningún idioma, devuelve und (indeterminado).
Ejemplos concretos de uso
Aquí hay algunos casos en los que este paquete puede ser útil:
- Aplicaciones de mensajería: Identificar el idioma de un mensaje para sugerir una traducción o un teclado adecuado.
- Redes sociales: Analizar comentarios para detectar el idioma predominante y ofrecer filtros o anuncios personalizados.
- Herramientas educativas: Verificar si un texto ingresado corresponde al idioma estudiado (por ejemplo, un ejercicio de francés).
- Motores de búsqueda: Afinar los resultados según el idioma detectado en la consulta.
Configurar google_mlkit_language_id en Flutter
En esta guía, te mostraré cómo implementar este paquete en tu aplicación Flutter y cómo usarlo.
Implementación
Para empezar, instala el paquete google_mlkit_language_id en tu aplicación Flutter agregando su dependencia en el archivo pubspec.yaml:
dependencies:
google_mlkit_language_id: ^0.13.0 # Reemplaza con la última versión disponible
Luego, importa el paquete en los archivos donde lo necesites, añadiendo esta línea al principio:
import 'package:google_mlkit_language_id/google_mlkit_language_id.dart';
Configuración para Android
Para que el paquete funcione, asegúrate de que tu proyecto cumpla con los requisitos mínimos:
- minimunSdkVersion: 21
- targetSdkVersion: 35
- compileSdkVersion: 35
Personalmente, así es como modifiqué mi archivo android/app/build.gradle:
android {
namespace //
compileSdkVersion flutter.compileSdkVersion
ndkVersion "26.1.10909125"
defaultConfig {
applicationId //
minSdkVersion 23
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
multiDexEnabled true
}
}
Por lo general, no se necesita ninguna configuración adicional para Android, ya que el paquete utiliza las APIs nativas de Google.
Configuración para iOS
Para iOS, debes ajustar los parámetros para excluir las arquitecturas de 32 bits no compatibles (armv7) y definir una versión mínima de implementación.
Abre tu proyecto en Xcode y ve a Project > Runner > Build Settings > Excluded Architectures. Agrega armv7 para «Any SDK». Asegúrate de incluirlo para los tres modos: Debug, Profile y Release.

Luego, modifica tu archivo ios/Podfile para incluir la versión mínima de iOS (15.5 o superior) y las configuraciones necesarias:
platform :ios, '15.5'
# Agrega esta línea
$iOSVersion = '15.5'
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=*]"] = "armv7"
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
end
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'])
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
end
end
end
end
A partir de aquí, el paquete google_mlkit_language_id debería funcionar correctamente en ambas plataformas, Android e iOS.
Usar el paquete
A continuación, te muestro un ejemplo simple de una aplicación Flutter que utiliza google_mlkit_language_id para identificar el idioma de un texto ingresado por el usuario.
import 'package:flutter/material.dart';
import 'package:google_mlkit_language_id/google_mlkit_language_id.dart';
void main() {
runApp(const MaterialApp(home: LanguageIdentifierView()));
}
class LanguageIdentifierView extends StatefulWidget {
const LanguageIdentifierView({super.key});
@override
State<LanguageIdentifierView> createState() => _LanguageIdentifierViewState();
}
class _LanguageIdentifierViewState extends State<LanguageIdentifierView> {
final _controller = TextEditingController();
final _languageIdentifier = LanguageIdentifier(confidenceThreshold: 0.5);
String _identifiedLanguage = '';
List<IdentifiedLanguage> _identifiedLanguages = [];
@override
void dispose() {
_languageIdentifier.close();
_controller.dispose();
super.dispose();
}
Future<void> _identifyLanguage() async {
if (_controller.text.isEmpty) return;
try {
final language = await _languageIdentifier.identifyLanguage(_controller.text);
setState(() {
_identifiedLanguage = language == 'und' ? 'Idioma no identificado' : language;
});
} catch (e) {
setState(() {
_identifiedLanguage = 'Error: $e';
});
}
}
Future<void> _identifyPossibleLanguages() async {
if (_controller.text.isEmpty) return;
try {
final possibleLanguages = await _languageIdentifier.identifyPossibleLanguages(_controller.text);
setState(() {
_identifiedLanguages = possibleLanguages;
});
} catch (e) {
setState(() {
_identifiedLanguages = [];
_identifiedLanguage = 'Error: $e';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Identificación de idioma')),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _controller,
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Ingresa un texto',
),
),
const SizedBox(height: 20),
if (_identifiedLanguage.isNotEmpty)
Text(
'Idioma identificado: $_identifiedLanguage',
style: const TextStyle(fontSize: 18),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _identifyLanguage,
child: const Text('Identificar idioma'),
),
ElevatedButton(
onPressed: _identifyPossibleLanguages,
child: const Text('Identificar todos los idiomas posibles'),
),
const SizedBox(height: 20),
if (_identifiedLanguages.isNotEmpty)
Expanded(
child: ListView.builder(
itemCount: _identifiedLanguages.length,
itemBuilder: (context, index) {
final lang = _identifiedLanguages[index];
return ListTile(
title: Text('Idioma: ${lang.languageTag}'),
subtitle: Text('Confianza: ${(lang.confidence * 100).toStringAsFixed(2)}%'),
);
},
),
),
],
),
),
);
}
}
Cómo funciona el código
- Inicialización: Se crea una instancia de LanguageIdentifier con un umbral de confianza de 0.5 para filtrar resultados menos probables.
- Interfaz de usuario: Un TextField permite al usuario ingresar un texto. Dos botones activan la identificación: uno para el idioma principal (identifyLanguage) y otro para todos los idiomas posibles (identifyPossibleLanguages).
- Visualización de resultados: El idioma principal se muestra inmediatamente, y una lista desplegable muestra los idiomas posibles con sus puntajes de confianza.
- Gestión de errores: Las excepciones se capturan para evitar fallos, con mensajes como «Idioma no identificado» para und.