2009 02 18Localization with functions
Localization is very tricky as different languages have very different rules. NSLocalizedString and plural form shows how we need a special case for Russian :
// To get this result ...
- 1 fail skopirovalsya.
- 2 faila skopirovalis'.
- 5 failov skopirovalos'.
// ... we need this code.
if (x == 1) str = NSLocalizedString("KEY_1",...);
else if (x == 2) str = NSLocalizedString("KEY_2",...);
else str = NSLocalizedString("KEY_3",...);
Going this way injects grammar specific code for each language into ObjC code that just needs to display information. If we need to support a new language, we may need to change our ObjC code ! That's BAD.
Let's try it in JSCocoa. We'll define strings and functions on the Javascript side …
// Javascript side : register localizations.
// Register raw strings
localizedStrings['Hello World'] = 'Hallo Welt'
// Register javascript functions that will be called back with arguments
localizedStrings['BookCount'] = function (count)
{
if (count == 0) return 'Keine Bücher gefunden !'
if (count == 1) return 'Ein Buch'
return count + ' Bücher'
}
… and use them on the ObjC side :
// Call JSLocalizedString with an identifier and optional parameters id string = JSLocalizedString(@"BookCount", [NSNumber numberWithInt:bookCount], nil); [label setStringValue:string];There ! However many languages we support, we'll always have the same ObjC code : the language-specific logic will be where it belongs, in a localized file. Try out JSLocalizedString in the latest JSCocoa. (Get it from GitHub)