本地化和CocoaPods

我有一个使用CocoaPods的项目。 因此,我有一个包含两个项目的工作区:mine和Pods。

豆荚包含我想本地化的代码,并且我在豆荚中创build了.strings文件。 但是, NSLocalizedString无法加载这些string。 我怀疑会发生这种情况,因为.strings文件不在主包中,但没有Pod包,因为它被编译到静态库中。

有没有比在我的主要项目中更好地本地化CocoaPods项目中的代码?

NSLocalizedString只是调用NSBundle的localizedStringForKey:value:table:所以我写了一个NSBundle类别来查看几个包(在iOS中只是文件夹):

 NSString * const kLocalizedStringNotFound = @"kLocalizedStringNotFound"; + (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName backupBundle:(NSBundle *)bundle { // First try main bundle NSString * string = [[NSBundle mainBundle] localizedStringForKey:key value:kLocalizedStringNotFound table:tableName]; // Then try the backup bundle if ([string isEqualToString:kLocalizedStringNotFound]) { string = [bundle localizedStringForKey:key value:kLocalizedStringNotFound table:tableName]; } // Still not found? if ([string isEqualToString:kLocalizedStringNotFound]) { NSLog(@"No localized string for '%@' in '%@'", key, tableName); string = value.length > 0 ? value : key; } return string; } 

然后在我的前缀文件中重新定义了NSLocalizedStringmacros:

 #undef NSLocalizedString #define NSLocalizedString(key, comment) \ [NSBundle localizedStringForKey:key value:nil table:@"MyStringsFile" backupBundle:AlternativeBundleInsideMain] 

如果需要,其他macros也是一样的(例如NSLocalizedStringWithDefaultValue

@Rivera Swift 2.0版本:

 static let kLocalizedStringNotFound = "kLocalizedStringNotFound" static func localizedStringForKey(key:String, value:String?, table:String?, bundle:NSBundle?) -> String { // First try main bundle var string:String = NSBundle.mainBundle().localizedStringForKey(key, value: kLocalizedStringNotFound, table: table) // Then try the backup bundle if string == kLocalizedStringNotFound { string = bundle!.localizedStringForKey(key, value: kLocalizedStringNotFound, table: table) } // Still not found? if string == kLocalizedStringNotFound { print("No localized string for '\(key)' in '\(table)'") if let value = value { string = value.characters.count > 0 ? value : key } else { string = key } } return string; } 
  1. 您不应该在Pods项目中放置任何文件,因为pod命令将一次又一次地重新创build项目。

    所以把string文件放在你自己的项目中。

  2. 如果您想将本地化的string文件发布到您自己的Pod中 ,则应将其包含在一个包中,并确保该包将安装在您的Podspec文件中。

例如:

 def s.post_install(target) puts "\nGenerating YOURPOD resources bundle\n".yellow if config.verbose? Dir.chdir File.join(config.project_pods_root, 'YOURPOD') do command = "xcodebuild -project YOURPOD.xcodeproj -target YOURPODResources CONFIGURATION_BUILD_DIR=../Resources" command << " 2>&1 > /dev/null" unless config.verbose? unless system(command) raise ::Pod::Informative, "Failed to generate YOURPOD resources bundle" end File.open(File.join(config.project_pods_root, target.target_definition.copy_resources_script_name), 'a') do |file| file.puts "install_resource 'Resources/YOURPODResources.bundle'" end end end