The original approach is following the stack overflow article manual language selection in an iOS-App (iPhone and iPad) by Hubert Schölnast
Header file LocalizeHelper.h
// macro // Use "LocalizedString(key)" the same way you would use "NSLocalizedString(key,comment)" #define LocalizedString(key) [[LocalizeHelper sharedLocalSystem] localizedStringForKey:(key)] // "language" can be (for american english): "en", "en-US", "english". Analogous for other languages. #define LocalizationSetLanguage(language) [[LocalizeHelper sharedLocalSystem] setLanguage:(language)] #import@interface LocalizeHelper : NSObject // a singleton: + (LocalizeHelper*) sharedLocalSystem; // this gets the string localized: - (NSString*) localizedStringForKey:(NSString*) key; //set a new language: - (void) setLanguage:(NSString*) lang; @end
Implementation file : LocalizeHelper.m
#import "LocalizeHelper.h"
// Singleton
static LocalizeHelper* SingleLocalSystem = nil;
// my Bundle (not the main bundle!)
static NSBundle* myBundle = nil;
@implementation LocalizeHelper
//-------------------------------------------------------------
// allways return the same singleton
//-------------------------------------------------------------
+ (LocalizeHelper*) sharedLocalSystem {
// lazy instantiation
if (SingleLocalSystem == nil) {
SingleLocalSystem = [[LocalizeHelper alloc] init];
}
return SingleLocalSystem;
}
//-------------------------------------------------------------
// initiating
//-------------------------------------------------------------
- (id) init {
self = [super init];
if (self) {
// use systems main bundle as default bundle
myBundle = [NSBundle mainBundle];
}
return self;
}
//-------------------------------------------------------------
// translate a string
//-------------------------------------------------------------
// you can use this macro:
// LocalizedString(@"Text");
- (NSString*) localizedStringForKey:(NSString*) key {
// this is almost exactly what is done when calling the macro NSLocalizedString(@"Text",@"comment")
// the difference is: here we do not use the systems main bundle, but a bundle
// we selected manually before (see "setLanguage")
return [myBundle localizedStringForKey:key value:@"" table:nil];
}
//-------------------------------------------------------------
// set a new language
//-------------------------------------------------------------
// you can use this macro:
// LocalizationSetLanguage(@"German") or LocalizationSetLanguage(@"de");
- (void) setLanguage:(NSString*) lang {
// path to this languages bundle
NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
if (path == nil) {
// there is no bundle for that language
// use main bundle instead
myBundle = [NSBundle mainBundle];
} else {
// use this bundle as my bundle from now on:
myBundle = [NSBundle bundleWithPath:path];
// to be absolutely shure (this is probably unnecessary):
if (myBundle == nil) {
myBundle = [NSBundle mainBundle];
}
}
}
@end
How to use. first, prepare the two localizable.string file
NSString *selectedLanguage = @"zh-Hant";
LocalizationSetLanguage(selectedLanguage);
NSLog(@"%@",LocalizedString(@"TITLE"));
selectedLanguage = @"en";
LocalizationSetLanguage(selectedLanguage);
NSLog(@"%@",LocalizedString(@"TITLE"));


0 意見:
張貼留言