Puedes usar el Kit de AA para traducir texto entre idiomas. Actualmente, el kit admite la traducción entre 59 idiomas.
Antes de comenzar
- Si aún no agregaste Firebase a tu app, sigue los pasos en la guía de introducción para hacerlo.
- Incluye las bibliotecas del ML Kit en tu Podfile:
pod 'Firebase/MLNLTranslate', '6.25.0'
Después de instalar o actualizar los Pods de tu proyecto, asegúrate de abrir el proyecto de Xcode con su.xcworkspace
. - En tu app, importa Firebase:
Swift
import Firebase
Objective-C
@import Firebase;
Traduce una string de texto
Sigue estos pasos para traducir una string entre dos idiomas:
Crea un objeto de
Translator
y configúralo con los idiomas de origen y de destino:Swift
// Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de) let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
Objective-C
// Create an English-German translator: FIRTranslatorOptions *options = [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN targetLanguage:FIRTranslateLanguageDE]; FIRTranslator *englishGermanTranslator = [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];
Si no sabes el idioma del texto de entrada, puedes usar la API de identificación de idiomas en primer lugar. Confirma que no tienes en el dispositivo demasiados modelos de idioma a la vez.
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
FIRModelDownloadConditions *conditions = [[FIRModelDownloadConditions 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 rondan los 30 MB, así que no los descargues innecesariamente, y solo hazlo usando Wi-Fi, a menos que el usuario haya especificado lo contrario. También debes borrar los modelos innecesarios. 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.
Administra explícitamente los modelos de traducción
Cuando utilizas la API de traducción como se describe anteriormente, el Kit de AA descarga automáticamente los 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, sigue estos pasos:
Swift
let localModels = ModelManager.modelManager().downloadedTranslateModels
Objective-C
NSSet<FIRTranslateRemoteModel *> *localModels =
[FIRModelManager modelManager].downloadedTranslateModels;
Para borrar un modelo, sigue estos pasos:
Swift
// Delete the German model if it's on the device.
let deModel = TranslateRemoteModel.translateRemoteModel(language: .de)
ModelManager.modelManager().deleteDownloadedModel(deModel) { error in
guard error == nil else { return }
// Model deleted.
}
Objective-C
// Delete the German model if it's on the device.
FIRTranslateRemoteModel *deModel =
[FIRTranslateRemoteModel translateRemoteModelWithLanguage:FIRTranslateLanguageDE];
[[FIRModelManager modelManager] deleteDownloadedModel:deModel
completion:^(NSError * _Nullable error) {
if (error != nil) {
return;
}
// Model deleted.
}];
Para descargar un modelo, sigue estos pasos:
Swift
// Download the French model.
let frModel = TranslateRemoteModel.translateRemoteModel(language: .fr)
// Keep a reference to the download progress so you can check that the model
// is available before you use it.
progress = ModelManager.modelManager().download(
frModel,
conditions: ModelDownloadConditions(
allowsCellularAccess: false,
allowsBackgroundDownloading: true
)
)
Si deseas obtener el estado de descarga con NotificationCenter
, registra observadores para firebaseMLModelDownloadDidSucceed
y firebaseMLModelDownloadDidFail
. 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: .firebaseMLModelDownloadDidSucceed,
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 == frModel
else { return }
// The model was downloaded and is available on the device
}
NotificationCenter.default.addObserver(
forName: .firebaseMLModelDownloadDidFail,
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.
FIRModelDownloadConditions *conditions =
[[FIRModelDownloadConditions alloc] initWithAllowsCellularAccess:NO
allowsBackgroundDownloading:YES];
FIRTranslateRemoteModel *frModel =
[FIRTranslateRemoteModel translateRemoteModelWithLanguage:FIRTranslateLanguageFR];
// Keep a reference to the download progress so you can check that the model
// is available before you use it.
self.downloadProgress = [[FIRModelManager modelManager] downloadModel:frModel
conditions:conditions];
Si deseas obtener el estado de descarga con NSNotificationCenter
, registra observadores para FIRModelDownloadDidSucceedNotification
y FIRModelDownloadDidFailNotification
. 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:FIRModelDownloadDidSucceedNotification
object:nil
queue:nil
usingBlock:^(NSNotification * _Nonnull note) {
if (weakSelf == nil | note.userInfo == nil) {
return;
}
FIRTranslateRemoteModel *model = note.userInfo[FIRModelDownloadUserInfoKeyRemoteModel];
if ([model isKindOfClass:[FIRTranslateRemoteModel class]]
&& model == frModel) {
// The model was downloaded and is available on the device
}
}];
[NSNotificationCenter.defaultCenter
addObserverForName:FIRModelDownloadDidFailNotification
object:nil
queue:nil
usingBlock:^(NSNotification * _Nonnull note) {
if (weakSelf == nil | note.userInfo == nil) {
return;
}
NSError *error = note.userInfo[FIRModelDownloadUserInfoKeyError];
}];