Puedes usar ML Kit para traducir texto entre idiomas. El ML Kit puede traducir entre más de 50 idiomas.
Probar
- Prueba la app de ejemplo para ver un ejemplo de uso de esta API.
Antes de comenzar
- Incluye los siguientes pods del ML Kit en tu Podfile:
pod 'GoogleMLKit/Translate', '3.2.0'
- Después de instalar o actualizar los Pods de tu proyecto, abre el proyecto de Xcode con su
.xcworkspace
. El ML Kit es compatible con Xcode 12.4 o versiones posteriores.
Traduce una string de texto
Sigue estos pasos para traducir una string entre dos idiomas:
Crea un objeto
Translator
y configúralo con los idiomas de origen y de destino:Swift
// Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .english, targetLanguage: .german) let englishGermanTranslator = Translator.translator(options: options)
Objective‑C
// Create an English-German translator: MLKTranslatorOptions *options = [[MLKTranslatorOptions alloc] initWithSourceLanguage:MLKTranslateLanguageEnglish targetLanguage:MLKTranslateLanguageGerman]; MLKTranslator *englishGermanTranslator = [MLKTranslator translatorwithOptions:options];
Si no sabes el idioma del texto de entrada, puedes usar la API de Identificación de idioma, que te proporciona una etiqueta de idioma. Luego, convierte la etiqueta de idioma en una enumeración del ML Kit. El código depende del lenguaje que uses:
- Swift: Llama al
TranslateLanguage.fromLanguageTag()
para obtener unTranslateLanguage
- Objective-C: Llama a
MLKTranslateLanguageForLanguageTag()
para obtener unaMLKTranslateLanguage
Evita mantener demasiados modelos de lenguaje en el dispositivo a la vez.
- Swift: Llama al
Asegúrate de que el modelo de traducción requerido se haya descargado en el dispositivo. No llames a
translate(_:completion:)
hasta que sepas que el modelo está disponible.Swift
let conditions = ModelDownloadConditions( allowsCellularAccess: false, allowsBackgroundDownloading: true ) englishGermanTranslator.downloadModelIfNeeded(with: conditions) { error in guard error == nil else { return } // Model downloaded successfully. Okay to start translating. }
Objective‑C
MLKModelDownloadConditions *conditions = [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:NO allowsBackgroundDownloading:YES]; [englishGermanTranslator downloadModelIfNeededWithConditions:conditions completion:^(NSError *_Nullable error) { if (error != nil) { return; } // Model downloaded successfully. Okay to start translating. }];
Los modelos de idioma tienen un tamaño aproximado de 30 MB, por lo que no debes descargarlos innecesariamente y solo puedes hacerlo mediante Wi-Fi, a menos que el usuario haya especificado lo contrario. Deberías borrar los modelos cuando ya no los necesites. Consulta Administra explícitamente los modelos de traducción.
Después de confirmar que el modelo se descargó, pasa una string de texto en el idioma de origen a
translate(_:completion:)
:Swift
englishGermanTranslator.translate(text) { translatedText, error in guard error == nil, let translatedText = translatedText else { return } // Translation succeeded. }
Objective‑C
[englishGermanTranslator translateText:text completion:^(NSString *_Nullable translatedText, NSError *_Nullable error) { if (error != nil || translatedText == nil) { return; } // Translation succeeded. }];
El Kit de AA traduce el texto al idioma de destino que configuraste y pasa el texto traducido al controlador de finalización.
Los ciclos de vida de los traductores se controlan mediante ARC (recuento automático de referencias), que es la convención recomendada para el desarrollo de iOS. Los desarrolladores pueden esperar que se desasigne el Traductor una vez que se hayan quitado todas las referencias importantes.
Los traductores pueden ocupar entre 30 MB y 150 MB cuando se cargan en la memoria. Los desarrolladores deben tener en cuenta el presupuesto de memoria del dispositivo o la app cuando crean instancias simultáneas del traductor y evitar tener demasiados modelos de idiomas en el dispositivo a la vez.
Administra explícitamente los modelos de traducción
Cuando usas la API de Translation como se describió anteriormente, el Kit de AA descarga automáticamente al dispositivo los modelos de traducción específicos de un idioma, según sea necesario. También puedes administrar de forma explícita los modelos de traducción que deseas que estén disponibles en el dispositivo con la API de administración de modelos de traducción del ML Kit. Esto puede ser útil si deseas descargar modelos con anticipación o borrar modelos innecesarios del dispositivo.
Para obtener los modelos de traducción almacenados en el dispositivo, haz lo siguiente:
Swift
let localModels = ModelManager.modelManager().downloadedTranslateModels
Objective‑C
NSSet*localModels = [MLKModelManager modelManager].downloadedTranslateModels;
Para borrar un modelo, haz lo siguiente:
Swift
// Delete the German model if it's on the device. let germanModel = TranslateRemoteModel.translateRemoteModel(language: .german) ModelManager.modelManager().deleteDownloadedModel(germanModel) { error in guard error == nil else { return } // Model deleted. }
Objective‑C
// Delete the German model if it's on the device. MLKTranslateRemoteModel *germanModel = [MLKTranslateRemoteModel translateRemoteModelWithLanguage:MLKTranslateLanguageGerman]; [[MLKModelManager modelManager] deleteDownloadedModel:germanModel completion:^(NSError * _Nullable error) { if (error != nil) { return; } // Model deleted.
Para descargar un modelo, haz lo siguiente:
Swift
// Download the French model. let frenchModel = TranslateRemoteModel.translateRemoteModel(language: .french) // Keep a reference to the download progress so you can check that the model // is available before you use it. progress = ModelManager.modelManager().download( frenchModel, conditions: ModelDownloadConditions( allowsCellularAccess: false, allowsBackgroundDownloading: true ) )
Si deseas obtener el estado de descarga con NotificationCenter
, registra observadores para mlkitModelDownloadDidSucceed
y mlkitModelDownloadDidFail
. Asegúrate de utilizar una referencia débil para self
en el bloque de observador, ya que las descargas pueden demorar un tiempo y el objeto de origen se puede liberar antes de que finalice la descarga. Por ejemplo:
NotificationCenter.default.addObserver( forName: .mlkitModelDownloadDidSucceed, object: nil, queue: nil ) { [weak self] notification in guard let strongSelf = self, let userInfo = notification.userInfo, let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue] as? TranslateRemoteModel, model == frenchModel else { return } // The model was downloaded and is available on the device } NotificationCenter.default.addObserver( forName: .mlkitModelDownloadDidFail, object: nil, queue: nil ) { [weak self] notification in guard let strongSelf = self, let userInfo = notification.userInfo, let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue] as? TranslateRemoteModel else { return } let error = userInfo[ModelDownloadUserInfoKey.error.rawValue] // ... }
Objective‑C
// Download the French model. MLKModelDownloadConditions *conditions = [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:NO allowsBackgroundDownloading:YES]; MLKTranslateRemoteModel *frenchModel = [MLKTranslateRemoteModel translateRemoteModelWithLanguage:MLKTranslateLanguageFrench]; // Keep a reference to the download progress so you can check that the model // is available before you use it. self.downloadProgress = [[MLKModelManager modelManager] downloadModel:frenchModel conditions:conditions];
Si deseas obtener el estado de descarga con NSNotificationCenter
, registra observadores para MLKModelDownloadDidSucceedNotification
y MLKModelDownloadDidFailNotification
. Asegúrate de utilizar una referencia débil a self
en el bloque de observador, ya que las descargas pueden demorar un tiempo y el objeto de origen se puede liberar antes de que finalice la descarga.
__block MyViewController *weakSelf = self; [NSNotificationCenter.defaultCenter addObserverForName:MLKModelDownloadDidSucceedNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { if (weakSelf == nil | note.userInfo == nil) { return; } MLKTranslateRemoteModel *model = note.userInfo[MLKModelDownloadUserInfoKeyRemoteModel]; if ([model isKindOfClass:[MLKTranslateRemoteModel class]] && model == frenchModel) { // The model was downloaded and is available on the device } }]; [NSNotificationCenter.defaultCenter addObserverForName:MLKModelDownloadDidFailNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { if (weakSelf == nil | note.userInfo == nil) { return; } NSError *error = note.userInfo[MLKModelDownloadUserInfoKeyError]; }];