Локализация и CocoaPods
У меня есть проект, который использует CocoaPods. В результате у меня есть рабочее пространство, которое содержит два проекта: "Мой и Под".
Pods содержит код, который я бы хотел локализовать, и я создал файлы .strings
в Pod. Однако NSLocalizedString
не загружает эти строки. Я подозреваю, что это происходит из-за того, что файл .strings
отсутствует в главном комплекте, но нет пакета Pod, потому что он скомпилирован в статическую библиотеку.
Есть ли лучший способ локализовать код в проекте CocoaPods, чем в моем основном проекте?
Ответы
Ответ 1
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;
}
Затем переопределил макрос NSLocalizedString
в моем префиксном файле:
#undef NSLocalizedString
#define NSLocalizedString(key, comment) \
[NSBundle localizedStringForKey:key value:nil table:@"MyStringsFile" backupBundle:AlternativeBundleInsideMain]
То же самое для других макросов, если необходимо (т.е. NSLocalizedStringWithDefaultValue
)
Ответ 2
@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;
}
Ответ 3
-
Вы не должны помещать файл в проект Pods, потому что команда pod
снова и снова воссоздает проект.
Итак, поместите строковые файлы в ваш собственный проект.
-
Если вы хотите отправить локализованные строковые файлы в свой собственный 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