【问题标题】:iPhone internationalization: falling back to a default languageiPhone 国际化:回退到默认语言
【发布时间】:2010-04-15 12:37:40
【问题描述】:

考虑以下情况:

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

如果在当前语言环境的 Localizable.string 中找不到关键字,是否有任何方法可以使该宏从特定语言加载字符串?

【问题讨论】:

    标签: iphone objective-c localization internationalization


    【解决方案1】:

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

    【讨论】:

    • 确实可以。唯一的论点是:1)默认值不能是文档所说的 unicode,以及 2)然后我会在 Localizable 文件中很好地分离我的所有“其他”语言环境,并且一个“默认”语言环境在整个代码中疯狂传播.我希望有一个更优雅的解决方案
    • 这并不理想,但仍然可行。我会认为它被接受了。
    【解决方案2】:

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

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

    @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
    

    您可以创建一个单例,并使用类似于 NSLocalizedString 的宏来调用本地化StringForKey,或者如果您愿意的话。

    【讨论】:

    • 这是一个很好的解决方案,正是我即将实施的。感谢您的代码!
    【解决方案3】:

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

    这是你想要的吗?

    【讨论】:

    • 第二个参数是一个注释,它被用作翻译者的提示
    • MihaiD 您正在考虑 LocalizedString 宏之一。 ACTUAL LocalizedString 方法的第二个参数在找不到关键字时显示的默认值developer.apple.com/iphone/library/documentation/Cocoa/…:
    • 我在考虑宏。这就是答案所提到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多