20

CocoaPods を使用するプロジェクトがあります。その結果、mine と Pods の 2 つのプロジェクトを含むワークスペースがあります。

Pods にはローカライズしたいコードが含まれており.strings、Pod にファイルを作成しました。ただし、NSLocalizedStringこれらの文字列の読み込みに失敗します。これは、ファイルがメイン バンドルに含まれていないために発生すると思わ.stringsれますが、静的ライブラリにコンパイルされているため、Pod バンドルはありません。

メイン プロジェクトよりも CocoaPods プロジェクトのコードをローカライズする良い方法はありますか?

4

5 に答える 5

5

@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;
}
于 2015-07-29T08:21:02.523 に答える
2
  1. podコマンドによってプロジェクトが何度も再作成されるため、Pods プロジェクトにファイルを配置しないでください。

    したがって、文字列ファイルを独自のプロジェクトに配置します。

  2. 独自の 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
于 2013-02-27T14:51:42.067 に答える
-1

迅速な場合は、Loc 列挙型を使用できます。

enum Loc : String{
case ok = "OK"
case cancel = "Cancel"

var localized: String {
    let s = self.rawValue
    let bundle = Bundle(for: <classname inside the bundle>.self)
    let result = NSLocalizedString(s, tableName: nil, bundle: bundle, value: "", comment: "")
    return result;
}

}

そしてそれを次のように使用します:

let s = Loc.ok.localized
print(s)
于 2020-09-09T13:14:38.267 に答える