2015-07-06 12 views
6

Sono in difficoltà con le risorse localizzate definite nel mio pod.Accesso a Cocoapod resource_bundles

Questo pod utilizza Base Internazionalizzazione con i seguenti file:

Base.lproj 
|- Localizable.strings 
|- MyViewController.xib 

fr.lproj 
|- Localizable.strings 
|- MyViewController.strings 

Questo è il modo in cui sono definiti nel mio podspec:

spec.resources = "MySDK/*.lproj/*" 

In di Podfile mia app, il mio pod è definito come un locale dipendenza:

pod 'MySDK', :path => '../MySDK' 

Dopo aver eseguito pod install, è possibile vedere le cartelle identiche allolproj in Development Pods/MySDK/Resources/MySDK.

MyViewController.xib è perfettamente caricato e localizzato, posso cambiare la lingua sul mio telefono e il testo cambia di conseguenza.

Per poter utilizzare le stringhe localizzate, ho definito una funzione nel mio SDK pod:

public func NSLocalizedIntentString(key: String) -> String { 
    let sdkBundle = NSBundle(forClass: MySDKClass.self) 
    return NSLocalizedString(key, tableName: nil, bundle: sdkBundle, value: key, comment: "") 
} 

Funziona, se non che utilizza solo la stringa definita in Base.lproj, qualunque sia la lingua selezionata sul telefono o simulatore.

ho cambiato la mia podspec per:

spec.resource_bundles = { 
    "MySDK" => ["MySDK/*.lproj"] 
} 

per caricare il pacchetto dal codice, ma ora non funziona, il XIB non può ottenere caricato. È strano perché in Development Pods riesco ancora a vedere la stessa identica struttura di prima, ma con le icone delle cartelle blu invece del giallo.

Ecco come si carica il mio XIB dal mio SDK, non dalla mia app:

MyViewController.swift

public init(...) { 
    ... 
    super.init(nibName: "MyViewController", bundle: NSBundle(forClass: MyViewController.self)) 
} 

ho cambiato per:

public init(...) { 
    ... 
    super.init(nibName: "MyViewController", bundle: NSBundle(path: NSBundle.mainBundle().pathForResource("MySDK", ofType: "bundle")!)) 
} 

ma non riesco a trovare il pacchetto.

Ho letto tonnellate di documentazione e forum da questa mattina senza successo, quindi qualsiasi aiuto sarebbe più che benvenuto! :)

+0

Stai presumibilmente usando i framework? – Tommy

+0

Sì, ho 'use_frameworks!' Nel mio 'Podfile'. – Tijee

risposta

1

Finalmente ho capito.

  1. ho commutata al spec.resources invece di spec.resource_bundles nel mio podspec perché non ho potuto accedere al fascio generato.
  2. Quindi ho dovuto disattivare la localizzazione per XIB, perché mi sono reso conto che le risorse nelle sottodirectory lang non sono compilate. Pertanto, XIB è ora fuori dalle directory lproj.

    Il mio nuovo podspec:

    spec.resources = "MySDK/*.lproj", "MySDK/*.xib" 
    

    Nota che copio le lproj directory stessi (*.lproj), non il contenuti dei lproj directory (*.lproj/*), perché il Localizable.strings sarebbe ignorare l'altro. Ho bisogno di tenerli nelle loro subdirectory lang.

  3. Infine, accedere al pacchetto SDK con:

    NSBundle(forClass: MySDKClass.self) 
    

sono ancora soddisfatto al 100% perché non sono riuscito a utilizzare la nuova spec.resource_bundles proprietà. Ma comunque, funziona.

0

Sono stato in difficoltà con questo a intermittenza per una settimana.

La cosa più CHIARIRE ho trovato finora è stato questo: https://github.com/CocoaPods/CocoaPods/pull/4635

Le richieste di trazione di cui sopra afferma, al fine di utilizzare resource_bundle è necessario utilizzare il modello RESOURCEDIR/**/* glob. Non sembra importare cosa sia RESOURCEDIR. Stavo provando ogni sorta di cose, ma quel risultato di **/* glob in Xcode riconoscendo le directory di localizzazione.

Si può provare a riprodurre i miei risultati

  1. Usa pod lib create per creare un nuovo progetto
  2. Selezionare Sì per includere un'applicazione dimostrativa quando richiesto
  3. Utilizzare Finder per passare alla cartella Assets e aggiungere un Base.lproj directory
  4. Nel file podspec, rimuovere la sezione s.resource_bundles e cambiare *.png a **/*
  5. utilizzare il terminale per eseguire pod install

Ora in Xcode si dovrebbe vedere la cartella Assets con una cartella Base.lproj.

  1. Aggiungere uno xib o uno storyboard a Base.lproj.
  2. Aggiungere un'etichetta che si desidera tradurre.
  3. aggiungere una classe per sostenere l'XI ter o storyboard
  4. Run pod install di nuovo a portare nel nuovo file
  5. Selezionare il progetto Pods nella navigazione di progetto
  6. Eseguire l'Editor> Esporta per la localizzazione.

Questo dovrebbe produrre un file XLIFF che è possibile utilizzare per effettuare traduzioni, quindi utilizzare l'Editor> Importa localizzazioni per inserire le traduzioni.

Nota Potrebbe essere necessario eseguire il comando Crea> Pulisci dopo aver importato le traduzioni.

Nota Sembra che il progetto che include il pod deve supportare anche la localizzazione.