Identificar un idioma con el paquete google_mlkit_language_id


Avatar de Pedro Cortez

¿Necesitas detectar qué idioma utiliza un usuario para mejorar su experiencia en tu aplicación? En esta guía, te explico cómo configurar el paquete google_mlkit_language_id.


google_mlkit_language_id con Flutter

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

Para ir más rápido, también puedes ejecutar el comando $ flutter pub add google_mlkit_language_id en tu terminal de VS Code, en la raíz de tu proyecto.

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.

¿Necesitas detectar qué idioma utiliza un usuario para mejorar su experiencia en tu aplicación? En esta guía, te explico cómo configurar el paquete google_mlkit_language_id.

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.
Avatar de Pedro Cortez