É possível usar o Kit de ML para traduzir textos entre idiomas. O Kit de ML pode traduzir mais de 50 idiomas.
Faça um teste
- Teste o app de exemplo para ver um exemplo de uso dessa API.
Antes de começar
- Inclua os seguintes pods de Kit de ML no seu Podfile:
pod 'GoogleMLKit/Translate', '3.2.0'
- Depois de instalar ou atualizar os pods do projeto, abra o projeto do Xcode usando o
.xcworkspace
. O Kit de ML é compatível com a versão 12.4 ou superior do Xcode.
Traduzir uma string de texto
Para traduzir uma string entre dois idiomas:
Crie um objeto
Translator
, configurando-o com os idiomas de origem e 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];
Se você não souber o idioma do texto de entrada, use a API de identificação de idioma, que fornece uma tag de idioma. Em seguida, converta a tag de idioma em uma enumeração do Kit de ML. O código depende do idioma que você está usando:
- Swift: chame
TranslateLanguage.fromLanguageTag()
para receber umTranslateLanguage
- Objective-C: chame
MLKTranslateLanguageForLanguageTag()
para receber umMLKTranslateLanguage
Evite manter muitos modelos de idioma no dispositivo ao mesmo tempo.
- Swift: chame
Verifique se o modelo de tradução necessário foi salvo no dispositivo. Não chame
translate(_:completion:)
até saber que o modelo está disponível.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. }];
Os modelos de idioma têm cerca de 30 MB, portanto, não é necessário fazer o download desnecessariamente deles, apenas com Wi-Fi, a menos que o usuário tenha especificado outro. Exclua os modelos quando eles não forem mais necessários. Consulte Gerenciar explicitamente modelos de tradução.
Depois de confirmar o download do modelo, transmita uma string de texto no idioma de origem para
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. }];
O Kit de ML traduz o texto para o idioma de destino configurado e transmite o texto traduzido para o gerenciador de conclusão.
Os ciclos de vida do tradutor são controlados pela contagem de referências automáticas (ARC), que é a convenção recomendada para o desenvolvimento em iOS. Os desenvolvedores podem esperar que o tradutor seja desalocado quando todas as referências fortes forem removidas.
Os tradutores podem ocupar de 30 MB a 150 MB quando carregados na memória. Os desenvolvedores precisam lembrar o orçamento de memória do dispositivo/app ao criar instâncias de tradutores simultâneas e evitar manter muitos modelos de idioma no dispositivo de uma só vez.
Gerenciar explicitamente os modelos de tradução
Quando você usa a API Translation, conforme descrito acima, o Kit de ML faz o download automático de modelos de tradução específicos do idioma para o dispositivo, conforme necessário. Também é possível gerenciar explicitamente os modelos de tradução que você quer disponibilizar no dispositivo usando a API de gerenciamento de modelos de tradução do Kit de ML. Isso pode ser útil se você quiser fazer o download de modelos antecipadamente ou excluir modelos desnecessários do dispositivo.
Para armazenar os modelos de tradução no dispositivo:
Swift
let localModels = ModelManager.modelManager().downloadedTranslateModels
Objective-C
NSSet*localModels = [MLKModelManager modelManager].downloadedTranslateModels;
Para excluir um modelo:
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 fazer o download de um modelo:
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 você quiser saber o status do download com NotificationCenter
, registre observadores para mlkitModelDownloadDidSucceed
e mlkitModelDownloadDidFail
. Certifique-se de usar uma referência fraca para self
no bloco de observadores, já que os downloads podem demorar algum tempo e o objeto de origem
pode ser liberado quando o download for concluído. Exemplo:
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 você quiser saber o status do download com NSNotificationCenter
, registre observadores para MLKModelDownloadDidSucceedNotification
e MLKModelDownloadDidFailNotification
. Certifique-se de usar uma referência fraca para
self
no bloco de observadores, já que os downloads podem demorar algum tempo e o
objeto de origem pode ser liberado quando o download for concluído.
__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]; }];