2015-08-14 3 views
5

ich eine grundlegende Swift Datei Test.swift haben diegenstrings Drosseln, wenn der Wert Parameter in Swift mit

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") 
    } 
} 

enthält Wenn ich genstrings auf diese Datei ausgeführt erhalte ich eine unerwartete Warnung

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

und die erzeugte Localizable.strings Datei fehlt der Eintrag für "key 1"

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

Allerdings, wenn ich das äquivalent in Objective-C tun, um den folgenden Code in einer Datei mit 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 

der genstrings Befehl funktioniert wie erwartet und ich bekomme den Eintrag für "key 1".

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

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

Was mache ich falsch?

+0

Für eine 'genstrings' Ersatz, das tatsächlich funktioniert und ist langsam, Check-out nicht tot https : //github.com/kayak/SwiftGenStrings. – hennes

Antwort

9

Dies ist ein Fehler von genstrings sowohl in Xcode 6.4 und Xcode 7 Beta, wie in https://openradar.appspot.com/22133811 berichtet:

In Swift-Dateien, Chokes genstrings Auf NSLocalizedString mit mehr als zwei Parameter ruft

Zusammenfassung: Beim Ausführen von genstrings gegen eine Swift-Datei, wenn es irgendwelche NSLocalizedString-Aufrufe gibt, die mehr als den trivialen Fall von "Wert" und "Kommentar" -Parameter verwenden, Genstrings Fehler. ...

+0

Ich habe ewig im Web nach diesem Thema gesucht, konnte aber nichts Nützliches finden und dann stellt sich heraus, dass es ein Radar gibt, das fast den gleichen Wortlaut verwendet. Vielleicht habe ich die falsche Suchmaschine benutzt. : D Danke! – hennes

+0

Ich habe gerade auch ein Radar dafür erstellt ... Hoffe, das wird behoben, aber jetzt muss ich eine hässliche Problemumgehung finden (Laden der lokalisierten Strings aus einer ObjC Datei): -/ – MeXx

+1

Dies ist ein Fehler von Xcode 6 , Xcode 7, Xcode 8 und wird nie von Apple gelöst werden. Sie hatten genug Zeit, das zu tun, und das ist mir egal. – SpaceDog

13

Anscheinend hat sich Apple von der Unterstützung von Genstrings entfernt. Verwenden Sie stattdessen:

xcrun extractLocStrings 

als Ihr Befehl. Zum Beispiel Localizable.strings für Ihr Projekt zu erstellen:

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

und für Swift:

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

Beachten Sie, wenn Sie auf eine .xliff-Datei exportieren werden dort nicht mehr die Notwendigkeit, laufen genstrings überhaupt als xCode

Editor> Export für die Lokalisierung

Befehl Saiten ‚hinter den Kulissen‘ verarbeiten.

Update: Ich bin auf xCode 7.3.1 und auf meinem System XtractLocStrings ist eine binäre.

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

Hier ist mein Test:

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

und hier sind die Ergebnisse:

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

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

Das scheint das Problem nicht zu lösen. Ich bekomme genau die gleiche Fehlermeldung. Die Hilfe-Ausgabe von 'extractLocStrings' zeigt auch, dass es nichts als ein Wrapper um 'genstrings' ist. – hennes

+0

@hennes siehe mein Update oben. – Cliff

+0

Wenn ich es auf den Testcode, den Sie zur Verfügung gestellt haben, laufen lasse, bekomme ich hier eine extendLocStrings-Ausnahme für den Index-out-of-bounds. Wenn ich es auf das Codebeispiel in meiner Frage ausführe, erhalte ich den gleichen Fehler, den genstrings meldet, und die Zeichenkettendatei enthält nur eine Zeichenkette. Gibt es eine Möglichkeit zu überprüfen, welche Version von extractLocStrings/genstrings wir beide ausführen? Ich bin überrascht, einen Unterschied zu sehen, um ehrlich zu sein. – hennes