Puedes usar el Kit de AA para traducir texto entre idiomas. El Kit de AA puede traducir entre más de 50 idiomas.
Probarlo
- Juega con la app de muestra para ver un ejemplo de uso de esta API.
Antes de comenzar
- Incluye los siguientes pods de 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 Kit de AA es compatible con Xcode 12.4 o versiones posteriores.
Traduce una string de texto
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 idiomas, que proporciona una etiqueta de idioma. Luego, convierte la etiqueta del idioma en una enumeración del Kit de AA. El código depende del idioma que uses:
- Swift: Llama al
TranslateLanguage.fromLanguageTag()
para obtener unTranslateLanguage
. - Objective-C: Llama al
MLKTranslateLanguageForLanguageTag()
para obtener unMLKTranslateLanguage
.
Evita tener demasiados modelos de idioma 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, así que no los descargues innecesariamente, y solo hazlo a través de Wi-Fi, a menos que el usuario haya especificado lo contrario. Deberías borrar los modelos cuando ya no sean necesarios. Consulta Administra explícitamente los modelos de traducción.
Después de confirmar que el modelo se haya descargado, 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 traductores están controlados por ARC (recuento de referencia automático), que es la convención recomendada para el desarrollo en iOS. Los programadores pueden suponer que se quita la asignación del traductor una vez que se quitan todas las referencias sólidas.
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 creen instancias simultáneas de traductor y evitar mantener demasiados modelos de idioma en el dispositivo a la vez.
Administra explícitamente los modelos de traducción
Cuando usas la API de traducción como se describió anteriormente, el Kit de AA descarga automáticamente modelos de traducción específicos del idioma al dispositivo, 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 Kit de AA. 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, sigue estos pasos:
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 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.
__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]; }];