Подтвердить что ты не робот

Локализация и CocoaPods

У меня есть проект, который использует CocoaPods. В результате у меня есть рабочее пространство, которое содержит два проекта: "Мой и Под".

Pods содержит код, который я бы хотел локализовать, и я создал файлы .strings в Pod. Однако NSLocalizedString не загружает эти строки. Я подозреваю, что это происходит из-за того, что файл .strings отсутствует в главном комплекте, но нет пакета Pod, потому что он скомпилирован в статическую библиотеку.

Есть ли лучший способ локализовать код в проекте CocoaPods, чем в моем основном проекте?

4b9b3361

Ответ 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