2017-08-17 3 views
0

Mon application est supposée prendre en charge le changement de langue lors de l'exécution. J'utilise SwiftGen 5.0. ViewControllers s'abonner à la notification de changement de langue et j'ai vérifié que la fonction de localisation se déclenche correctement. Ma fonction overriden tr ressemble à ceci:Modification de la langue lors de l'exécution à l'aide de SwiftGen

fileprivate static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String { 
    guard let bundle = LanguageManager.shared.bundle else { 
     fatalError("Cannot find bundle!") 
    } 
    let format = NSLocalizedString(key, tableName: table, bundle: bundle, comment: "") 
    let locale = Locale(identifier: LanguageManager.shared.currentLanguageKey!) 
    return String(format: format, locale: locale, arguments: args) 
} 

Le bundle est défini comme ceci:

if let path = Bundle.main.path(forResource: currentLanguageKey, ofType: "lproj") { 
    bundle = Bundle(path: path) 
} 

Cependant, la fonction retourne tr la plupart des chaînes de langue précédentes. Une seule de toutes les étiquettes actuellement en mémoire est actualisée. Définition d'un point d'arrêt dans la fonction et l'impression bundle retours

NSBundle </var/containers/Bundle/Application/ED5A6C7D-1807-4319-8817-45E693BC45E2/MyApp.app/en_US.lproj> (not yet loaded) 

qui est la nouvelle langue correcte. Une fois l'application redémarrée, la langue est correctement définie. Est-ce que je fais quelque chose de mal?

Répondre

0

D'accord, j'ai trouvé le problème. Le pochoir générait des variables statiques:

static let label = L10n.tr("Localizable", "registration_verify.pin_code.label") 

Modification de stencil pour générer des propriétés calculées fixe le comportement:

static var label: String { 
    return L10n.tr("Localizable", "registration_verify.pin_code.label") 
}