2015-08-14 11 views
5

Ho un file Swift base Test.swift che contienegenstrings soffoca quando si utilizza il parametro di valore a Swift

import Foundation 
import UIKit 

class Test: NSObject { 
    let a: String 
    let b: String 

    override init() { 
     a = NSLocalizedString("key 1", tableName: nil, 
      bundle: NSBundle.mainBundle(), value: "value 1", comment: "comment 1") 
     b = NSLocalizedString("key 2", comment: "comment 2") 
    } 
} 

Quando eseguo genstrings su questo file che ricevo un avviso di inaspettato

$ genstrings -u Test.swift 
Bad entry in file Test.swift (line = 9): Argument is not a literal string. 

e generata Localizable.strings manca la voce per "key 1"

$ cat Localizable.strings 
??/* comment 2 */ 
"key 2" = "key 2"; 

Tuttavia, quando faccio l'equivalente in Objective-C usando il codice seguente in un file Test.m

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@interface Test: NSObject 

@property (nonatomic, strong) NSString *a; 
@property (nonatomic, strong) NSString *b; 

@end 

@implementation Test 

- (id)init { 
    self = [super init]; 
    if (self) { 
     self.a = NSLocalizedStringWithDefaultValue(@"key 1", nil, [NSBundle mainBundle], @"value 1", @"comment 1"); 
     self.b = NSLocalizedString(@"key 2", @"comment 2"); 
    } 
    return self; 
} 

@end 

le genstrings comando funziona come previsto e ho la voce per "key 1".

$ genstrings -u Test.m 
$ cat Localizable.strings 
??/* comment 1 */ 
"key 1" = "value 1"; 

/* comment 2 */ 
"key 2" = "key 2"; 

Cosa sto sbagliando?

+0

Per un 'sostituzione genstrings' che in realtà funziona e non è morto lento, controlla https : //github.com/kayak/SwiftGenStrings. – hennes

risposta

9

Questo è un bug di genstrings sia in Xcode 6.4 e Xcode 7 beta, come presentate nel https://openradar.appspot.com/22133811:

Nei file Swift, genstrings strozzatori su NSLocalizedString chiama con più di due parametri

Sommario: Quando si esegue genstrings su un file Swift, se ci sono chiamate NSLocalizedString che utilizzano più del caso banale dei parametri "valore" e "commento", errori di genstring. ...

+0

Ho trascorso anni a cercare questo problema sul web ma non ho trovato nulla di utile e poi si scopre che c'è un radar che usa quasi la stessa dicitura. Forse ho usato il motore di ricerca sbagliato. : D Grazie! – hennes

+0

Ho appena creato un radar anche per questo ... Spero che questo sia corretto ma in questo momento devo trovare qualche brutta soluzione (caricare le stringhe localizzate da un file ObjC): -/ – MeXx

+1

questo è un bug di Xcode 6 , Xcode 7, Xcode 8 e non saranno mai risolti da Apple. Hanno avuto abbastanza tempo per farlo e non gli importa. – SpaceDog

13

A quanto pare Apple si è allontanata dal sostenere genstrings. Utilizzare invece:

xcrun extractLocStrings 

come comando. Ad esempio, per creare Localizable.strings per il vostro progetto:

find ./ -name "*.m" -print0 | xargs -0 xcrun extractLocStrings -o en.lproj 

e per Swift:

find ./ -name "*.swift" -print0 | xargs -0 xcrun extractLocStrings -o en.lproj 

Nota che se avete intenzione di esportare in un file .xliff non v'è più alcuna necessità di eseguire genstrings a tutti come il xCode

Editor> Esporta per la localizzazione

comando elaborerà le corde 'dietro le quinte'.

Aggiornamento: Sono su xCode 7.3.1 e sul mio sistema xtractLocStrings è un binario.

$ file /Applications/Xcode.app//Contents/Developer/usr/bin/extractLocStrings 
    /Applications/Xcode.app//Contents/Developer/usr/bin/extractLocStrings: Mach-O 64-bit executable x86_64 

Ecco la mia prova:

let _ = NSLocalizedString("1st", comment: "1st string") 
let _ = NSLocalizedString("Second", tableName: "Localized", bundle: NSBundle.mainBundle(), value: "2nd", comment: "2nd string”) 

e qui sono i risultati:

Localizable.strings: 
/* 1st string */ 
"1st" = "1st”; 

Localized.strings: 
/* 2nd string */ 
"Second" = "2nd”; 
+1

Questo non sembra risolvere il problema. Ottengo lo stesso identico messaggio di errore. L'output della guida di 'extractLocStrings' indica anche che non è altro che un wrapper attorno a' genstrings'. – hennes

+0

@hennes si prega di consultare il mio aggiornamento sopra. – Cliff

+0

Quando lo eseguo sul codice di prova che hai fornito, ottengo qui un'eccezione index-out-of-bounds in extractLocStrings. Quando lo eseguo nell'esempio di codice nella mia domanda, ottengo lo stesso errore riportato da genstrings e il file delle stringhe contiene solo una stringa. C'è un modo per verificare quale versione di extractLocStrings/genstrings stiamo entrambi lavorando? Sono sorpreso di vedere una differenza per essere onesti. – hennes

Problemi correlati