Puoi utilizzare ML Kit per tradurre testo da una lingua all'altra. ML Kit può tradurre tra più di 50 lingue.
Prova
- Prova l'app di esempio per vedere un utilizzo di esempio di questa API.
Prima di iniziare
- Includi i seguenti pod ML Kit nel podfile:
pod 'GoogleMLKit/Translate', '3.2.0'
- Dopo aver installato o aggiornato i pod del progetto, apri il progetto Xcode utilizzando il relativo
.xcworkspace
. ML Kit è supportato in Xcode versione 12.4 o successiva.
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: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];
Se non conosci la lingua del testo di input, puoi utilizzare l'API Language Identification, che fornisce un tag lingua. Poi converti il tag della lingua in un'enumerazione ML Kit. Il codice dipende dal linguaggio utilizzato:
- Swift: chiama il numero
TranslateLanguage.fromLanguageTag()
per ricevere unTranslateLanguage
- Objective-C: chiama
MLKTranslateLanguageForLanguageTag()
per ottenere unMLKTranslateLanguage
Evita di tenere troppi modelli linguistici contemporaneamente sul dispositivo.
- Swift: chiama il numero
Assicurati che il modello di traduzione richiesto sia stato scaricato sul dispositivo. Non chiamare
translate(_:completion:)
finché non hai la certezza che il modello è disponibile.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. }];
I modelli linguistici hanno dimensioni di circa 30 MB, quindi non scaricarli inutilmente, ma scaricali solo tramite Wi-Fi, a meno che l'utente non abbia specificato diversamente. Dovresti eliminare i modelli quando non sono più necessari. Consulta Gestire in modo esplicito i modelli di traduzione.
Dopo aver confermato il download del modello, trasmetti una stringa di testo nella lingua di origine 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. }];
ML Kit traduce il testo nella lingua di destinazione configurata e lo trasmette al gestore del completamento.
I cicli di vita del traduttore sono controllati tramite la tecnologia ARC (Conteggio automatico dei riferimenti), che è la convenzione consigliata per lo sviluppo per iOS. Gli sviluppatori possono aspettarsi che venga localizzato il traduttore dopo la rimozione di tutti i riferimenti efficaci.
I traduttori possono occupare da 30 MB a 150 MB se caricati in memoria. Gli sviluppatori dovrebbero tenere a mente il budget per la memoria del dispositivo/dell'app quando creano istanze del traduttore simultanee ed evitare di tenere troppi modelli linguistici contemporaneamente sul dispositivo.
Gestisci in modo esplicito i modelli di traduzione
Quando utilizzi l'API di traduzione come descritto sopra, ML Kit scarica automaticamente sul dispositivo i modelli di traduzione specifici per la lingua, come richiesto. Puoi anche gestire esplicitamente i modelli di traduzione che vuoi rendere disponibili sul dispositivo utilizzando l'API di gestione dei modelli di traduzione di ML Kit. Questo può essere utile se vuoi scaricare i modelli in anticipo o eliminare quelli non necessari dal dispositivo.
Per memorizzare i modelli di traduzione sul dispositivo:
Swift
let localModels = ModelManager.modelManager().downloadedTranslateModels
Objective-C
NSSet*localModels = [MLKModelManager modelManager].downloadedTranslateModels;
Per eliminare un modello:
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.
Per scaricare un modello:
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 ) )
Se vuoi ottenere lo stato del download con NotificationCenter
, registra gli osservatori per mlkitModelDownloadDidSucceed
e mlkitModelDownloadDidFail
. 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. Ad esempio:
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];
Se vuoi ottenere lo stato del download con NSNotificationCenter
, registra gli osservatori per MLKModelDownloadDidSucceedNotification
e MLKModelDownloadDidFailNotification
. Assicurati di utilizzare un riferimento debole a self
nel blocco osservatore, poiché i download possono richiedere tempo e l'oggetto di origine può essere liberato al termine del download.
__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]; }];