NSLocalString mit NSPreferencePane

Unter MacOS gibt es die Systemsteuerung. Applets hierzu werden PreferencePane genannt. Wer ein solches PreferencePane programmiert, sollte auch an die Interationalisierung des Applets denken. Mit der Methode NSLocalizedStringFromTableInBundle ist das auch recht einfach im Code zu realisieren. Da eine PreferencePane nun aber sowohl für einen User als auch global für das System installiert sein kann, sollte man das Bundle-Verzeichnis zuvor bestimmen.

Genau hierbei hatte ich etwas Probleme. Folgender Code hat mir aber geholfen, das zu realisieren:


NSBundle *mybundle = nil;

- (void)getMyBundle
{
if (nil == mybundle ) {
int k = 0;
NSArray *allbundls;
allbundls = [
NSBundle allBundles];

for ( k=0; k < [allbundls count]; k++) {
NSBundle *bundle;
NSString *strT;
bundle = [allbundls
objectAtIndex:k];
if ( nil != bundle ) {
strT = [bundle
resourcePath];
if ( nil != strT ) {
const char *szPP = [strT UTF8String];
NSRange r = [strT rangeOfString:@"MyPreferencePaneName.prefPane/Contents/Resources"];
if ( r.length != 0 ) {
mybundle = [allbundls
objectAtIndex:k];
break;
}
}
}
}
}
}



Hat man das Bundle-Directory, so kann man dann einen String innterhalb des Programmes recht einfach Übersetzen mittels:

strLoc = NSLocalizedStringFromTableInBundle(@"week", nil, mybundle, @"combo label");


Das Bundle der PreferencePane sollte dazu noch die Resource Localizable.strings (als UTF-8 oder UTF-16 encoded) enthalten.