Posts / December 8, 2012

Redefining NSLocalizedString for iOS Framework Bundles

In the upcoming version of the Ushahidi iOS SDK, I ran into a snag getting translations to work inside my custom iOS framework.

The trick is to ensure that you include the Localizable.strings in the Copy Files section in the Build Phases of your framework bundle.

You can double check whether your Localizable.strings were included correctly by expanding the bundle in the project using the framework.

The problem however is that the NSLocalizedString macro is defined to use [NSBundle mainBundle], which means it won’t find your Localizable.strings since they live inside your separate framework bundle.

#define NSLocalizedString(key, comment) \
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

The solution is to instead use NSLocalizedStringFromTableInBundle, which allows you to provide your own NSBundle for the string lookup.

#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]

However I didn’t what to replace all my existing NSLocalizedString statements with NSLocalizedStringFromTableInBundle, so instead I re-defined the macro in my SDK-Prefix.pch:

#undef NSLocalizedString
#define NSLocalizedString(key, comment) \
[[NSBundle bundleWithName:@"Ushahidi.bundle"] localizedStringForKey:(key) value:@"" table:nil]

To help with the bundle lookup, I added NSBundle+USH.h category to provide an easy way to obtain a bundle by name.

+ (NSBundle*) bundleWithName:(NSString*)name {
  NSString *mainBundlePath = [[NSBundle mainBundle] resourcePath];
  NSString *frameworkBundlePath = [mainBundlePath stringByAppendingPathComponent:name];
  if ([[NSFileManager defaultManager] fileExistsAtPath:frameworkBundlePath]){
    return [NSBundle bundleWithPath:frameworkBundlePath];
  return nil;

Voila! All my existing NSLocalizedString statements now return the correct translated phrases from the framework bundle, without any additional changes in the framework code.

Can Amoxicillin Be Taken Before Bed [url=]cialis[/url] Foro Priligy 30 Mg Buy Cialis Whats Does Keflex Do
Achat De Viagra En Ligne [url=]cialis vs viagra[/url] Weight Loss Orlistat Medical Fl Cialis Viagra Generico Pagamento Postepay
[url=]buy doxycycline medication online[/url]
ivermectin purchase - ivermectin side effects stromectol ebay