Pull requests welcome, but I'm no longer updating this library to keep up with Google and Microsoft Azure API changes.
A simple iOS library for Google & Bing translation APIs.
FGTranslator *translator = [[FGTranslator alloc] initWithGoogleAPIKey:@"your_google_key"];
[translator translateText:@"Bonjour!"
completion:^(NSError *error, NSString *translated, NSString *sourceLanguage)
{
if (error)
NSLog(@"translation failed with error: %@", error);
else
NSLog(@"translated from %@: %@", sourceLanguage, translated);
}];
FGTranslator *translator =
[[FGTranslator alloc] initWithBingAzureClientId:@"your_azure_client_id"
secret:@"your_azure_client_secret"];
[translator translateText:@"Bonjour!"
completion:^(NSError *error, NSString *translated, NSString *sourceLanguage)
{
if (error)
NSLog(@"translation failed with error: %@", error);
else
NSLog(@"translated from %@: %@", sourceLanguage, translated);
}];
- Go to the FGTranslatorDemo directory.
- Open the
.xcworkspace
(not the.xcodeproj
!) file. - Run the app.
CocoaPods is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like FGTranslator in your projects. See the "Getting Started" guide for more information.
platform :ios, '6.0'
pod "FGTranslator"
Alternatively you can directly add the FGTranslator folder to your project. FGTranslator uses AFNetworking - your project needs this for it to work if you include it this way. CocoaPods install manages this dependency for you.
To use this library you need a valid Google or Bing (Azure) developer account.
Google and Bing Translate are both paid services, but Bing offers a free tier. Google's translation quality and language selection is generally better. Pick what works best for you.
- Bing
- Subscribe to the Microsoft Translator API on Azure Marketplace. Basic subscriptions, up to 2 million characters a month, are free.
- To register your application with Azure DataMarket, visit https://datamarket.azure.com/developer/applications/ using the LiveID credentials from step 1, and click on “Register”. In the “Register your application” dialog box, you can define your own Client ID and Name. The redirect URI is not used for the Microsoft Translator API. However, the redirect URI field is a mandatory field, and you must provide a URI to obtain the access code (just use http://example.com to make it happy). Take a note of the client ID and the client secret value.
- Make sure you have an Active Subscription data plan. The first tier (2M characters) is free.
FGTranslator *translator =
[[FGTranslator alloc] initWithGoogleAPIKey:@"your_google_key"];
FGTranslator *translator =
[[FGTranslator alloc] initWithBingAzureClientId:@"your_azure_client_id"
secret:@"your_azure_client_secret"];
[translator translateText:@"Bonjour!" completion:^(NSError *error, NSString *translated, NSString *sourceLanguage)
{
if (error)
{
NSLog(@"failed with error: %@", error);
}
else
{
NSString *fromLanguage = [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:sourceLanguage];
NSLog(@"translated from %@: %@", fromLanguage, translated);
}
}];
Note that translations are one-shot operations. You need to instantiate a new
FGTranslator
object for each translation.
Detects the language and returns its ISO language code as the detectedSource
parameter.
If initialized with Google, the completion handler also returns a float between 0 and 1 indicating the confidence of the match, with 1 being the highest confidence. This is not supported with Bing translate and will always returns FGTranslatorUnknownConfidence
.
[translator detectLanguage:@"Bonjour"
completion:^(NSError *error, NSString *detectedSource, float confidence)
{
if (error)
{
NSLog(@"failed with error: %@", error);
}
else
{
NSString *language = [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:detectedSource];
NSString *confidenceMessage = confidence == FGTranslatorUnknownConfidence
? @"unknown"
: [NSString stringWithFormat:@"%.1f%%", confidence * 100];
NSLog(@"detected %@ with %@ confidence", language, confidenceMessage);
}
}];
Google and Bing Translate support different languages. You can get a list of supported ISO language codes with the following function:
[translator supportedLanguages:^(NSError *error, NSArray *languageCodes)
{
if (error)
NSLog(@"failed with error: %@", error);
else
NSLog(@"supported languages:%@", languageCodes);
}];
The basic translation function makes a guess at the source language and specifies the target language based on the user's phone settings:
- (void)translateText:(NSString *)text
completion:(NSError *error, NSString *translated, NSString *sourceLanguage)completion;
You can specify the source and/or the target languages if desired:
- (void)translateText:(NSString *)text
withSource:(NSString *)source
target:(NSString *)target
completion:(NSError *error, NSString *translated, NSString *sourceLanguage)completion;
Usually you don't know the source language to translate from. Going by user's iPhone locale or keyboard language settings seems like the obvious answer, but it is unreliable: there's nothing stopping you from typing Hola amigo! with an English keyboard. This is common, especially with international users.
For this reason FGTranslator will ignore the passed-in source
parameter in the above function, if it determines a good guess can be made. Typically this means that the text
parameter is complex and long enough for the engine to reliably determine the language. Short string snippets will typically respect the passed-in source
parameter, if any.
To force FGTranslator to always respect the source
parameter, use the following property:
translator.preferSourceGuess = NO;
Note: Unless you definitely know the source language, I recommend leaving smart guessing on AND passing the source parameter if available as a hint to the language detector.
For Google Translate, you can throttle usage on a per-user/device basis by setting a specific user identifier property in the FGTranslator
instance. See the specific Google documentation for more information.
@property (nonatomic) NSString *quotaUser;
- (void)cancel;
Translations are cached to prevent unnecessary network calls (and Google/Bing API charges). You can flush the cache if needed:
+ (void)flushCache;
Bing Translate uses token-based authentication. The first call you make retrieves a token based on the passed-in client ID and secret and caches it for future use. The lifetime of the token is 15 minutes, after which it expires and a new one will be fetched. To force the token expiry, call the following function:
+ (void)flushCredentials;
FGTranslator uses the following projects:
- XMLDictionary
- AFNetworking
- I also cribbed some parts of the README. Great job explaining CocoaPods usage guys!
FGTranslator is available under the MIT license. See the LICENSE file for more info.
FGTranslator comes from my Fargate app.