iPhone国际化:回归到默认语​​言

时间:2010-04-15 12:37:40

标签: iphone objective-c localization internationalization

考虑以下情况:

  • 我们有两个Localizable.string文件,一个在en.lproj中,一个在it.lproj
  • 当用户切换到英语或意大利语时,使用NSLocalizedString(@“keyword”,nil)加载正确的本地化字符串
  • 如果其中一个文件缺少关键字,则不会检索该字符串

如果在当前语言环境的Localizable.string中找不到关键字,有没有办法让这个宏加载特定语言的字符串?

3 个答案:

答案 0 :(得分:1)

NSLocalizedStringWithDefaultValue函数可能就是您所需要的 - 使用它可以指定案例的默认值,如果找不到给定键的本地化。

答案 1 :(得分:1)

我遇到了同样的问题。我虽然它会使用开发语言字符串文件中的字符串,如果它找不到用户语言的本地化字符串,但显然不是。

我最终创建了自己的函数来获取本地化的字符串。

@interface Localization : NSObject {
    NSBundle* fallbackBundle;
}

- (NSString*) localizedStringForKey:(NSString*)key;

@end


@implementation Localization

- (id)init {
    if (self = [super init]) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
        fallbackBundle = [[NSBundle bundleWithPath:path] retain];
    }
    return self;
}

- (void)dealloc {
    [fallbackBundle release];
    [super dealloc];
}

- (NSString*) localizedStringForKey:(NSString*)key {
    NSString* result = [[NSBundle mainBundle] localizedStringForKey:key value:@"!#€NOTFOUND%&/" table:nil];
    if (result == nil || [result isEqualToString:@"!#€NOTFOUND%&/"]) {
        result = [fallbackBundle localizedStringForKey:key value:nil table:nil];
    }
    if (result == nil) {
        result = key;
    }
    return result;
}

@end

你可以创建一个这样的单例,并且具有类似于调用localizedStringForKey的NSLocalizedString的宏,或者如果你愿意,可以使用类似于这些行的东西。

答案 2 :(得分:0)

通过提供NSLocalizedString函数的第二个参数,如果在Localizable.string中找不到关键字,则可以指定将使用的字符串。

这就是你想要的吗?