É possível usar o Kit de ML para traduzir texto entre idiomas. Kit de ML podem traduzir entre mais de 50 idiomas.
Faça um teste
- Teste o app de exemplo para um exemplo de uso dessa API.
Antes de começar
- Inclua os seguintes pods do kit de ML no seu Podfile:
pod 'GoogleMLKit/Translate', '3.2.0'
- Depois de instalar ou atualizar os pods do seu projeto, abra o projeto Xcode usando o
.xcworkspace
: O Kit de ML é compatível com a versão 12.4 ou mais recente do Xcode.
Traduzir uma string de texto
Para traduzir uma string entre dois idiomas:
Criar um objeto
Translator
e configurá-lo com a origem e o destino idiomas: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 guia Idioma API Identification que fornece uma tag de idioma. Em seguida, converta a tag de idioma para um tipo enumerado do kit de ML. O código depende da linguagem 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 baixado para o 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 linguagem têm cerca de 30 MB. Por isso, não faça o download deles desnecessariamente e fazer o download por Wi-Fi, a menos que o usuário tenha especificado o contrário. Você precisa excluir modelos quando não forem mais necessários. Consulte Gerenciar explicitamente modelos de tradução.
Depois de confirmar que o modelo foi baixado, transmita uma string de texto o 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 que você configurou e transmite o texto traduzido para o gerenciador de conclusão.
Os ciclos de vida do tradutor são controlados pela contagem automática de referências (ARC, na sigla em inglês). que é a convenção recomendada para o desenvolvimento para iOS. Os desenvolvedores podem esperar o tradutor será desalocado depois que 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 tenha em mente a cota de memória do dispositivo/app ao criar instâncias instâncias de tradutor e evite manter muitos modelos de idioma no dispositivo de uma só vez.
Gerenciar explicitamente modelos de tradução
Quando você usa a API Translation conforme descrito acima, o Kit de ML automaticamente faz o download de modelos de tradução específicos do idioma para o dispositivo, conforme necessário. Você também pode gerenciar explicitamente os modelos de tradução que você quer 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 acessar os modelos de tradução armazenados 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 ) )
Para conferir o status de download com NotificationCenter
, registre-se
observadores para mlkitModelDownloadDidSucceed
e
mlkitModelDownloadDidFail
Use uma referência fraca a self
.
no bloco de observadores, já que os downloads podem demorar um pouco, e a 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];
Para conferir o status de download com NSNotificationCenter
, registre-se
observadores para MLKModelDownloadDidSucceedNotification
e
MLKModelDownloadDidFailNotification
Use uma referência fraca para
self
no bloco de observadores, já que os downloads podem levar algum tempo, e a
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]; }];