میتوانید از ML Kit برای ترجمه نوشتار بین زبانها استفاده کنید. ML Kit میتواند بین بیشاز ۵۰ زبان ترجمه کند.
امتحان کنید
- با برنامه نمونه بازی کنید تا نمونهای از استفاده از این API را ببینید.
قبلاز شروع
- غلافهای ML Kit زیر را در Podfile خود بگنجانید:
pod 'GoogleMLKit/Translate', '8.0.0'
- پساز نصب یا بهروزرسانی Pods پروژه، پروژه Xcode را بااستفاده از
.xcworkspaceآن باز کنید. «کیت یادگیری ماشین» در Xcode نسخه ۱۲.۴ یا بالاتر پشتیبانی میشود.
ترجمه کردن رشته نوشتار
برای ترجمه کردن رشته بین دو زبان:
یک شیء
Translatorایجاد کنید و آن را با زبانهای مبدأ و مقصد پیکربندی کنید:Swift
// Create an English-German translator: let options = TranslatorOptions(sourceLanguage: .english, targetLanguage: .german) let englishGermanTranslator = Translator.translator(options: options)
آبجکتیو-سی
// Create an English-German translator: MLKTranslatorOptions *options = [[MLKTranslatorOptions alloc] initWithSourceLanguage:MLKTranslateLanguageEnglish targetLanguage:MLKTranslateLanguageGerman]; MLKTranslator *englishGermanTranslator = [MLKTranslator translatorwithOptions:options];
اگر زبان نوشتار ورودی را نمیدانید، میتوانید از Language Identification API استفاده کنید که برچسب زبان را به شما میدهد. سپس برچسب زبان را به یک ML Kit enum تبدیل کنید. کد به زبانی که استفاده میکنید بستگی دارد:
- Swift: با
TranslateLanguage.fromLanguageTag()تماس بگیرید تاTranslateLanguageدریافت کنید - Objective-C: برای دریافت
MLKTranslateLanguage، باMLKTranslateLanguageForLanguageTag()تماس بگیرید
از نگهداری همزمان تعداد زیادی مدل زبانی در دستگاه خودداری کنید.
- Swift: با
مطمئن شوید مدل ترجمه موردنیاز در دستگاه بارگیری شده باشد. تا وقتی مطمئن نشدهاید که مدل دردسترس است، با
translate(_:completion:)تماس نگیرید.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. }
آبجکتیو-سی
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. }];
مدلهای زبانی حدود ۳۰ مگابایت هستند، بنابراین آنها را بیدلیل بارگیری نکنید و فقط بااستفاده از Wi-Fi آنها را بارگیری کنید، مگراینکه کاربر چیز دیگری مشخص کرده باشد. وقتی دیگر به مدلها نیاز ندارید، باید آنها را حذف کنید. مدیریت صریح مدلهای ترجمه را ببینید.
پساز اینکه مطمئن شدید مدل بارگیری شده است، رشتهای از نوشتار را به زبان مبدأ به
translate(_:completion:)ارسال کنید:Swift
englishGermanTranslator.translate(text) { translatedText, error in guard error == nil, let translatedText = translatedText else { return } // Translation succeeded. }
آبجکتیو-سی
[englishGermanTranslator translateText:text completion:^(NSString *_Nullable translatedText, NSError *_Nullable error) { if (error != nil || translatedText == nil) { return; } // Translation succeeded. }];
ML Kit نوشتار را به زبان مقصدی که پیکربندی کردهاید ترجمه میکند و نوشتار ترجمهشده را به گرداننده تکمیل ارسال میکند.
چرخههای عمر مترجم توسط ARC (شمارش مرجع خودکار) کنترل میشود، که قرارداد توصیهشده برای توسعه iOS است. توسعهدهندگان میتوانند انتظار داشته باشند که وقتی همه ارجاعهای قوی برداشته شد، «ترجمهکننده» تخصیصزدایی شود.
وقتی مترجمها در حافظه بار میشوند، میتوانند ۳۰ تا ۱۵۰ مگابایت فضا اشغال کنند. توسعهدهندگان باید هنگام ایجاد نمونههای همزمان مترجم، بودجه حافظه دستگاه/برنامه را درنظر داشته باشند و از نگهداری همزمان تعداد زیادی مدل زبانی در دستگاه خودداری کنند.
مدلهای ترجمه را بهطور صریح مدیریت کنید
وقتی از API ترجمه همانطور که در بالا توضیح داده شد استفاده میکنید، ML Kit بهطور خودکار مدلهای ترجمه مختص زبان را درصورت نیاز در دستگاه بارگیری میکند. همچنین میتوانید بااستفاده از میانای برنامهسازی کاربردی مدیریت مدل ترجمه ML Kit، مدلهای ترجمهای را که میخواهید در دستگاه دردسترس باشد بهطور صریح مدیریت کنید. اگر بخواهید مدلها را ازقبل بارگیری کنید یا مدلهای غیرضروری را از دستگاه حذف کنید، این کار میتواند مفید باشد.
برای دریافت مدلهای ترجمه ذخیرهشده در دستگاه:
Swift
let localModels = ModelManager.modelManager().downloadedTranslateModels
آبجکتیو-سی
NSSet*localModels = [MLKModelManager modelManager].downloadedTranslateModels;
برای حذف کردن مدل:
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. }
آبجکتیو-سی
// 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.
برای بارگیری مدل:
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 ) )
اگر میخواهید وضعیت بارگیری را با NotificationCenter دریافت کنید،
ناظران را برای mlkitModelDownloadDidSucceed و
mlkitModelDownloadDidFail ثبت کنید. حتماً در بلوک ناظر از مرجع ضعیف به self
استفاده کنید، زیرا بارگیریها ممکن است مدتی طول بکشند و
شیء اصلی ممکن است تا زمان تکمیل بارگیری آزاد شود. برای مثال:
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] // ... }
آبجکتیو-سی
// 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];
اگر میخواهید وضعیت بارگیری را با NSNotificationCenter دریافت کنید،
ناظران را برای MLKModelDownloadDidSucceedNotification و
MLKModelDownloadDidFailNotification ثبت کنید. حتماً از ارجاع ضعیف به
self در بلوک ناظر استفاده کنید، زیرا بارگیریها ممکن است مدتی طول بکشد و
شیء مبدأ ممکن است تا زمان پایان بارگیری آزاد شود.
__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]; }];