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)