Puoi utilizzare ML Kit per tradurre testo tra lingue. ML Kit attualmente supporta la traduzione tra 59 lingue .
Prima di iniziare
- Se non hai già aggiunto Firebase alla tua app, fallo seguendo i passaggi nella guida introduttiva .
- Includi le librerie ML Kit nel tuo Podfile:
pod 'Firebase/MLNLTranslate', '6.25.0'
Dopo aver installato o aggiornato i Pod del tuo progetto, assicurati di aprire il tuo progetto Xcode utilizzando il relativo.xcworkspace
. - Nella tua app, importa Firebase:
Veloce
import Firebase
Obiettivo-C
@import Firebase;
Tradurre una stringa di testo
Per tradurre una stringa tra due lingue:
Crea un oggetto
Translator
, configurandolo con le lingue di origine e di destinazione:Veloce
// Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de) let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
Obiettivo-C
// Create an English-German translator: FIRTranslatorOptions *options = [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN targetLanguage:FIRTranslateLanguageDE]; FIRTranslator *englishGermanTranslator = [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];
Se non conosci la lingua del testo di input, puoi prima utilizzare l' API di identificazione della lingua . (Ma assicurati di non mantenere troppi modelli linguistici sul dispositivo contemporaneamente.)
Assicurati che il modello di traduzione richiesto sia stato scaricato sul dispositivo. Non chiamare
translate(_:completion:)
finché non sei sicuro che il modello sia disponibile.Veloce
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. }
Obiettivo-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. }];
I modelli linguistici pesano circa 30 MB, quindi non scaricarli inutilmente e scaricarli solo tramite WiFi, a meno che l'utente non abbia specificato diversamente. Dovresti anche eliminare i modelli non necessari. Consulta Gestire esplicitamente i modelli di traduzione .
Dopo aver confermato che il modello è stato scaricato, passa una stringa di testo nella lingua di origine a
translate(_:completion:)
:Veloce
englishGermanTranslator.translate(text) { translatedText, error in guard error == nil, let translatedText = translatedText else { return } // Translation succeeded. }
Obiettivo-C
[englishGermanTranslator translateText:text completion:^(NSString *_Nullable translatedText, NSError *_Nullable error) { if (error != nil || translatedText == nil) { return; } // Translation succeeded. }];
ML Kit traduce il testo nella lingua di destinazione configurata e passa il testo tradotto al gestore di completamento.
Gestisci esplicitamente i modelli di traduzione
Quando utilizzi l'API di traduzione come descritto sopra, ML Kit scarica automaticamente sul dispositivo i modelli di traduzione specifici della lingua come richiesto. Puoi anche gestire in modo esplicito i modelli di traduzione che desideri siano disponibili nel dispositivo utilizzando l'API di gestione dei modelli di traduzione di ML Kit. Ciò può essere utile se desideri scaricare modelli in anticipo o eliminare modelli non necessari dal dispositivo.
Per ottenere i modelli di traduzione memorizzati sul dispositivo:
Veloce
let localModels = ModelManager.modelManager().downloadedTranslateModels
Obiettivo-C
NSSet<FIRTranslateRemoteModel *> *localModels =
[FIRModelManager modelManager].downloadedTranslateModels;
Per eliminare un modello:
Veloce
// 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.
}
Obiettivo-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.
}];
Per scaricare un modello:
Veloce
// 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
)
)
Se desideri ottenere lo stato del download con NotificationCenter
, registra gli osservatori per firebaseMLModelDownloadDidSucceed
e firebaseMLModelDownloadDidFail
. Assicurati di utilizzare un riferimento debole a self
nel blocco dell'osservatore, poiché i download possono richiedere del tempo e l'oggetto di origine può essere liberato al termine del download. Per esempio:
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]
// ...
}
Obiettivo-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];
Se desideri ottenere lo stato del download con NSNotificationCenter
, registra gli osservatori per FIRModelDownloadDidSucceedNotification
e FIRModelDownloadDidFailNotification
. Assicurati di utilizzare un riferimento debole a self
nel blocco dell'osservatore, poiché i download possono richiedere del tempo e l'oggetto di origine può essere liberato al termine del download.
__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];
}];