Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

genstrings chokes when using the value parameter in Swift

I have a basic Swift file Test.swift which contains

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

When I run genstrings on this file I receive an unexpected warning

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

and the generated Localizable.strings file is missing the entry for "key 1"

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

However, when I do the equivalent in Objective-C using the below code in a 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

the genstrings command works as expected and I get the entry for "key 1".

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

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

What am I doing wrong?

like image 453
hennes Avatar asked Aug 14 '15 19:08

hennes


2 Answers

Apparently Apple has stepped away from supporting genstrings. Instead use:

xcrun extractLocStrings

as your command. For example, to create Localizable.strings for your project:

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

and for Swift:

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

Note that if you are going to export to a .xliff file there is no longer any need to run genstrings at all as the xCode

Editor > Export for localization

command will process your strings 'behind the scenes'.

Update: I’m on xCode 7.3.1 and on my system xtractLocStrings is a binary.

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

Here is my test:

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

and here are the results:

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

Localized.strings:
/* 2nd string */
"Second" = "2nd”;
like image 162
Spiff Avatar answered Oct 18 '22 16:10

Spiff


This is a bug of genstrings in both Xcode 6.4 and Xcode 7 beta, as reported in https://openradar.appspot.com/22133811:

In Swift files, genstrings Chokes On NSLocalizedString calls with more than two parameters

Summary: When running genstrings against a Swift file, if there are any NSLocalizedString calls that use more than the trivial case of "value" and "comment" parameters, genstrings errors out. ...

like image 34
Martin R Avatar answered Oct 18 '22 16:10

Martin R