Você pode usar o ML Kit para traduzir texto entre idiomas. Atualmente, o ML Kit oferece suporte à tradução entre 59 idiomas .
Antes de você começar
- Se você ainda não adicionou o Firebase ao seu aplicativo, faça isso seguindo as etapas do guia de primeiros passos .
- Inclua as bibliotecas do ML Kit em seu Podfile:
pod 'Firebase/MLNLTranslate', '6.25.0'
Depois de instalar ou atualizar os pods do seu projeto, certifique-se de abrir seu projeto Xcode usando seu.xcworkspace
. - No seu aplicativo, importe o Firebase:
Rápido
import Firebase
Objetivo-C
@import Firebase;
Traduzir uma sequência de texto
Para traduzir uma string entre dois idiomas:
Crie um objeto
Translator
, configurando-o com os idiomas de origem e de destino:Rápido
// Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .en, targetLanguage: .de) let englishGermanTranslator = NaturalLanguage.naturalLanguage().translator(options: options)
Objetivo-C
// Create an English-German translator: FIRTranslatorOptions *options = [[FIRTranslatorOptions alloc] initWithSourceLanguage:FIRTranslateLanguageEN targetLanguage:FIRTranslateLanguageDE]; FIRTranslator *englishGermanTranslator = [[FIRNaturalLanguage naturalLanguage] translatorWithOptions:options];
Se você não souber o idioma do texto de entrada, poderá usar primeiro a API de identificação de idioma . (Mas certifique-se de não manter muitos modelos de idiomas no dispositivo ao mesmo tempo.)
Certifique-se de que 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.Rápido
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. }
Objetivo-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. }];
Os modelos de idioma têm cerca de 30 MB, portanto, não os baixe desnecessariamente e faça o download apenas usando WiFi, a menos que o usuário especifique o contrário. Você também deve excluir modelos desnecessários. Consulte Gerenciar explicitamente modelos de tradução .
Depois de confirmar que o modelo foi baixado, passe uma string de texto no idioma de origem para
translate(_:completion:)
:Rápido
englishGermanTranslator.translate(text) { translatedText, error in guard error == nil, let translatedText = translatedText else { return } // Translation succeeded. }
Objetivo-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 passa o texto traduzido para o manipulador de conclusão.
Gerencie explicitamente modelos de tradução
Quando você usa a API de tradução conforme descrito acima, o Kit de ML baixa automaticamente 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 deseja disponibilizar no dispositivo usando a API de gerenciamento de modelos de tradução do Kit de ML. Isso pode ser útil se você quiser baixar modelos antecipadamente ou excluir modelos desnecessários do dispositivo.
Para obter os modelos de tradução armazenados no dispositivo:
Rápido
let localModels = ModelManager.modelManager().downloadedTranslateModels
Objetivo-C
NSSet<FIRTranslateRemoteModel *> *localModels =
[FIRModelManager modelManager].downloadedTranslateModels;
Para excluir um modelo:
Rápido
// 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.
}
Objetivo-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 baixar um modelo:
Rápido
// 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 você deseja obter o status do download com NotificationCenter
, registre observadores para firebaseMLModelDownloadDidSucceed
e firebaseMLModelDownloadDidFail
. Certifique-se de usar uma referência fraca a self
no bloco observador, pois os downloads podem levar algum tempo e o objeto de origem pode ser liberado quando o download terminar. Por exemplo:
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]
// ...
}
Objetivo-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 você deseja obter o status do download com NSNotificationCenter
, registre observadores para FIRModelDownloadDidSucceedNotification
e FIRModelDownloadDidFailNotification
. Certifique-se de usar uma referência fraca a self
no bloco observador, pois os downloads podem levar algum tempo e o objeto de origem pode ser liberado quando o download terminar.
__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];
}];