BRLocalize provides a way to store localized strings in a hierarchical JSON file and then have placeholder strings in NIB files automatically replaced by their localized value.
Here's an example JSON strings file, strings.json
:
{
"login" : {
"title" : "Sign in"
}
}
Now you can localize that just like any other file (i.e. move to a XX.lproj
directory and include the localized varients of the JSON in your application.
You can localize stuff via code if you like. For example you might want to set a login view controller's title to login.title
, like this:
- (void)viewDidLoad {
[super viewDidLoad];
[self localizeWithAppStrings:[NSBundle appStrings]];
}
- (void)localizeWithAppStrings:(NSDictionary *)strings {
self.navigationItem.title = [strings stringForKeyPath:@"login.title"];
}
The appStrings
method is provided as an extension on NSBundle
, and stringForKeyPath:
is provided as an extension on NSDictionary
.
BRLocalize provides some hooks into UI-related code to make the process of applying localized strings a bit easier for you. The hooks rely on the BRLocalizable
protocol:
@protocol BRLocalizable <NSObject>
/**
Localize the receiver with a given dictionary of strings.
@param strings The strings data, typically loaded via the application's standard JSON strings file.
*/
- (void)localizeWithAppStrings:(NSDictionary *)strings;
@end
There are two main hooks provided:
awakeFromNib
- any object that conforms toBRLocalizable
will havelocalizeWithAppStrings:
called whenawakeFromNib
is invoked.willMoveToWindow:
- anyUIView
class that conforms toBRLocalizable
will havelocalizeWithAppStrings:
called whenwillMoveToWindow:
is invoked.
Building on those hooks, BRLocalize provides category-based implementations of the following classes so they conform to BRLocalizable
:
- UIBarButtonItem
- UIButton
- UILabel
- UINavigationItem
- UISegmentedControl
- UITextField
All of these make use of a localizedStringWithAppStrings:
method provided on NSString
, which looks for strings in the form {some.key.path}
and replaces that with a the value found at some.key.path
in the JSON strings file.